OmniAICreator/Qiita-1.07M huggingface dataset:
非エンジニア（クリエイター）が挫折しないためのコーディング初学者向け無料学習サービスを使ってみた感想。

## 自己紹介

経営学部卒の非エンジニア（クリエイター）が、これまでディレクションを中心に活動をしてきていましたが、ご縁あってエンジニアの方と近い距離でお仕事をすることになりました。元々コーディングの基礎知識は習得したいと考えていたのですが、自分の成長度を測るため、Qiitaでアウトプットすることにしました。

ゆるく・少しずつ、でも確実に成長していく姿を身守って頂けると嬉しいです。

## HTML・CSSの基本的な内容を勉強するためのサイト

非エンジニア（クリエイター）がゼロからコーディングを学習したい！だけど、初めからお金をかけて学習するには覚悟が必要・・・そんな動機から無償で学べるサイトやサービスを**個人的に使ってみて良かった**サイトやサービスをご紹介します。

[**CreatorQuest**](https://creatorquest.jp/lessons/html/)

こんな人におすすめ。

- 書籍よりやテキストベースよりも視覚で覚えたい方。
- 1回の講座が1時間以内で終えたい方。
- HTMLの基礎（概念）を学習したい方。

YouTubeとサイトの教材が連動しており、動画を見ながら学習をしたい人におすすめです。
動画内には登場人物が2人登場しており、掛け合いが面白いです。
教材にはサンプルコードもついているので分からないところは比較して学ぶことも可能です。
※4年以上前の情報であることと、YouTubeは#17で更新がストップしています（2023.7.24現在）。

[**weblikrer**](https://webliker.info/)

こんな人におすすめ。

- ピンポイントでHTMLやCSSのことが知りたい方。
- タグの読み方を知りたい方（←読み方は初学者にとって以外とハードル高いと思っている）。
- CSSチートシートの解説も欲しい方。

web兄さんが運営している初学者向けのサイトです。
初学者が以外とつまづく？[タグの読み方](https://webliker.info/yomikata-wakarukun/)も紹介されているので安心です。

[**chot.design**](https://chot.design/)

こんな方におすすめ

- Web制作の仕事に就きたいと考えている方。
- Webデザインの基礎から学びたい方。
- Webディレクションの基本を学びたい方。

学習できる内容

- デザインの基本的な考え方
- Webディレクターの基礎知識
- Abobeアプリケーション（Illustrator、Photoshop等）
- Figma入門
- HTML・CSS入門
- WordPress入門
- STUDIO入門
- UI/UX入門

コーディングだけではなく、webサイトを制作する上で重要なディレクションやデザインについても学習できることが特徴です。
ノーコードサイトSTUDIOの基本が学べるのも筆者的には魅力的です。

[**Progate**](https://prog-8.com/)

こんな方におすすめ

- 移動中でも学びたい方
- 実践形式で学びたい方
- 中級・上級レベルを学びたい方。

一部無料公開されているサービスです。
穴埋めに回答するゲーム感覚で学べるスマホアプリも魅力的です。

## 一人で簡易なLPを作れるまでには習得したい。

コードを見た瞬間、自分で出来るのだろうか？と思う方も沢山いらっしゃると思います。
筆者もそうです・・・。
個人的には英語と同じような感覚で毎日一つでも触れる時間を作ることで自分の身になるものかなと思っています。。
ちょっとずつですが、LPを一人で作れるまでの道のり・役に立ったことなどを記事投稿していきたいと思います。
命名規則の備忘録

# はじめに
実務で関数などの命名の際に悩む機会が多い為、備忘録として記載することにしました。
実務や勉強で新たな情報を発見した場合、随時更新します。

# 命名規則の重要性
一貫した命名規則があるこで、保守・運用時や追加実装の時に、バグの発生を防いだり、追加開発を効率良く行えます。逆に自分勝手にルールを決めることで運用時に苦労します。

# 命名の基本
命名の主な基本は、以下の5つがあるそうです。
|ケース|説明|使用例|
|:---|:---|:---|
|キャメルケース|単語の先頭を小文字にする<br>JSやJavaなどのプログラミング言語の関数で使用されいる|camelCase|
|パスカルケース|単語の先頭を大文字にする<br>クラス命名のときに使用される|PascalCase|
|スネークケース|単語の間をアンダーバーで繋げる<br>PHPやPythonの変数名や関数に使用される|snake_case|
|ケバブケース|単語の間にハイフン(-)で繋げる<br>HTMLやCSSのプロパティ名で使用される|kebab-case|

# プログラミングで良く使われている用語集
記事の内容は膨大ですが、アンチパターン、表現方法、データベースも記載されている為、命名に困った時に最適です。また随時更新されている為、情報が古くなることはありません。
[プログラミングでよく使う英単語のまとめ【随時更新】](https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923)

# 参考文献
https://qiita.com/shota0616/items/4ac7a8696b3f6ccbe2bc
https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923
https://designsupply-web.com/media/development/4052/
https://e-words.jp/w/%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87.html
フローでActionが選択できない場合


+ [Error: We can’t find an Action element named 'Chatter Post to Account Owner'. Make sure its API Name is 'Chatter_Post_to_Account_Owner'.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000079SeYr)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/57ae17dc-d751-e506-2eca-1debae10d825.png)

:::note
Update the Start element to  : Actions and Related Records

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/232b337b-5630-1445-66bc-54d5d888fe28.png)


:::

# The 'Email Lead Routing' element isn’t located immediately after the 'Chatter Post to Account Owner' element.

+ [The 'Email Lead Routing' element isn’t located immediately after the 'Chatter Post to Account Owner' element.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmPRP)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/67adf9f4-a319-36e0-f16f-700819de7320.png)
Powershell(Win11)でもbundle-analyzerを(無理やり)動かす方法

# 動かし方
```posh
npx env-cmd -f .env.analyze next build
```

本当はもっと効率のいいやり方や環境変数を活用する方法などはありますが、個人的にはこれが一番手っ取り早いです。

ボトルネックは早く特定したいですからね。

ちなみにNextJsのサーバーを止めないとPermittion errorになるのでお気を付けて💦

ではー
Python　学習1日目

・ullib.parseモジュール
https://docs.python.org/ja/3/library/urllib.parse.html
上記URLの説明では、urlを解析して構成要素にするとある。

getリクエスト
getリクエストでパラメーターを送信するときは以下の書式になる
"https://example.com?key1=v1&key2=v2&key3=v3.......

len()
len関数は()内に指定したオブジェクトの長さや要素の数を取得する。
例）len(oppai)
>5

sysモジュール
コマンドライン引数を指定したい時に使用する
　コマンドライン引数：コマンドプロンプトの画面で入力する引数

プログラムを中断するときは
処理を終了したい時の関数はexit()もしくはquit()を使用する
AZ-204合格体験記

# はじめに

2023/07/22 AZ-204 試験に合格したので、勉強法や感想を残しておこうと思います。
転職を機にAzureを触る機会も減りそうで、せっかく色々と知っているのに、何も形に残さないのはもったいない、との思いで受験しました。

なお、ここに記す情報は2023/07時点のものです。

## 筆者のAzure理解レベル

- [AZ-900](https://learn.microsoft.com/ja-jp/certifications/exams/az-900/) 取得済み
- Webアプリ開発業務で3年ほど使用
    - App Service などの PaaS 中心

## 勉強期間

約3週間

これらを行ったり来たり

- 練習問題
    - 公式の試験対策用 練習問題
    - Udemyの問題集講座
- Microsoft Learn
    - https://learn.microsoft.com/ja-jp/certifications/azure-developer/
- Azure公式ドキュメント
    - https://learn.microsoft.com/ja-jp/azure/?product=popular

# 試験について下調べ

## 出題形式

試験は会場受験、自宅受験に関わらず、同じユーザーインタフェースを使用することになると思います。下記にて試験の雰囲気を体験することができるサンドボックス環境にアクセスできます。

資料やコードが大量に提示される問題は、本番ぶっつけだと戸惑ってしまうかもしれないので、事前に形式に慣れておくと良いでしょう。

[試験サンドボックスを探索する - 試験の準備 | Microsoft Learn](https://learn.microsoft.com/ja-jp/certifications/prepare-exam#explore-the-exam-sandbox)

## 試験範囲

学習ガイドを参照してください。
学習対象となるAzureリソースに増減があることもありますので、最新情報を把握するようにしましょう。

[試験 AZ-204: Microsoft Azure 向けソリューションの開発の学習ガイド](https://learn.microsoft.com/ja-jp/certifications/resources/study-guides/AZ-204)

# 勉強に使ったもの

## 要点を抑える

**わんこいんで押さえるAzure認定 AZ-204対策要点ノート - Zenn Books**

https://zenn.dev/ohina/books/a094e5e8177aa0e48407

執筆されてから若干時間が経ってしまっていますが、試験概要や試験範囲全体を俯瞰し、要点を抑えるのには超高コスパでした。著者の方に感謝🎉

## 練習問題集

### 公式: 試験対策用の練習問題

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/364b1ab5-d7a4-ff05-f2b6-8c3b092e4226.png" width="630">

※Microsoftアカウントが必要になります。
[AZ-204の概要ページ](https://learn.microsoft.com/ja-jp/certifications/azure-developer/) からリンクをクリックすることで問題を受けることができます。

### AZ-204 Developing Solutions for MS Azure Practice Tests

[AZ-204 Developing Solutions for MS Azure Practice Tests | Udemy](https://www.udemy.com/course/az-204-developing-solns-for-ms-azure-practice-tests/)

Udemy講座です。300問以上が用意されており、かなりボリューミーです。😳 私が受講した時では、ところどころ問題や解説にミスがありましたが、この Practice Tests を繰り返し解き、合格点を安定して出せるようになったら十分準備が整っているのではないかと思います。

ちょくちょくセール期間があるので、そのタイミングで買うと良いでしょう。

---

[AZ-204 Microsoft Azure Developer Practice Tests | Udemy](https://www.udemy.com/course/az204-azure-practice/)

こちらの問題集にも取り組んだのですが、ちょっと簡単すぎる印象を受けました。100％スコアを取ることができましたが、この講座だけでは AZ-204 合格は難しいと思います。
※受講したのは23年7月中旬頃なので、改善されている可能性もあります。

## ドキュメント

Udemy講座の解説部分には、ほぼ全問にドキュメントへのリンクがあったのでそちらを見るようにしていました。

あとは、[Microsoft Learn の AZ-204 ページにラーニングパス](https://learn.microsoft.com/ja-jp/certifications/azure-developer/)が載っていますので、こちらを一通りさらっておくと良いでしょう。ただ読むだけだと全然頭に入ってこないので、下記を意識すると良いと思います。

- 練習問題と組み合わせて読む
- 演習やチュートリアルはなるべく実際に取り組んでみましょう
    - クラス名やメソッド名、設定ファイルの穴埋めなんかも問題としてよく出るので、手を動かして覚えておくと良いです

# 感じたこと

## 難易度について

かなり難しいと思います。
練習問題を解き、公式ドキュメントを読めば読むほど、Azureにはこんな機能があったのか、こんなこともできたのかと驚きました。自分が業務で普段よく使っていたリソースですら知らないことだらけで、よくこんなにも何も知らない状態で、本番運用するアーキテクチャ設計やアプリ開発をしていたなあ…と恥ずかしくなりました。

それと、ARMテンプレートやC#コード、az cli やpower shell の穴埋めや並べ替え問題がよく出題されます。実際に手を動かさないとなかなか覚えられないです。

## どれくらい仕上げていくか？

私が購入したUdemyの問題集ですが、初めて解いた時は半分程度しか分からず、絶望を感じました。ですが、やはり反復あるのみです。
公式の練習問題に関しては、公式から案内がある通り、「複数回受験して、80%を安定して取ることができるようになる」状態を目指すと良いと思います。

# さいごに

資格に挑戦なさる方、がんばってください！

# 参照

https://qiita.com/Yosuke_Sakaue/items/30d2271f178e4fbd74ed

https://qiita.com/11ohina017/items/5ad15772530b4ce5bf6f

https://zenn.dev/ohina/books/a094e5e8177aa0e48407
PostmanでChatGPTを呼んでみた

# この記事で説明すること
- Postmanを使ってopenaiを呼ぶ方法
- openaiのrequestとresponseの紹介

## PostmanでOpenai呼ぶための準備

### authorizationを通す
- https://platform.openai.com/account にアクセスして `USER/API keys`画面で`Create new secret key`を押し、自分のapi_keyを取得する。

### Api呼ぶための各設定の準備
- URL: https://api.openai.com/v1/chat/completions
- 形式：POST
- ヘッダー

|Key  |Value  |
|---|---|
|Content-Type |Content-Type  |
|Authorization  |Bearer 上記取得したapi_key  |
- リクエストパラメータ
  - body/rowの以下を書く。
  
```json
{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "Openai会社の社長は"
        }
    ]
}
```
 - リクエストパラメータの説明
   - モデルによってパラメタが変わる
   - その他パラメタの紹介は割愛 

|model  |使用するopenaiのモデル、モデル一覧：https://platform.openai.com/docs/models   |
|---|---|
|role | system、user、assistant |
|content  |chatGPTに聞きたい話を書く。  |

## APIリクエスト送信
- `Send`で送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/0a10f779-f3e9-39be-3630-fe6737d66bc8.png)

## APIレスポンス返す
- status：200でAPI送信は成功していることをわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/e0550172-1aea-079f-bf50-ce27f5538997.png)

- レスポンスパラメータの説明

|パラメタ|説明|
|---|---|
|model|今回使ったモデル名末尾はバージョン番号| 
|role|会話を回答するときのroleはassistantになる| 
|content|chatGPTからの回答内容| 
|prompt_tokens|送信に使用したToken数| 
|completion_tokens|回答に使用したToken数| 
|total_tokens|総Token数|
農業農村工学オンライン交流会レポート

# 農業農村工学サマーセミナー発表大会2023
## 0. はじめに
プレゼンテーションに関するイベントの内容を報告します。
対象者：農業農村工学を学ぶ学生や若手社会人

農業農村工学サマーセミナーについて、詳細は下記リンクをご覧ください。

https://sites.google.com/view/n-n-summer-seminar
## 1. 概要
日時：2023/01/15 14:00～17:00
形式：Zoom
参加者：プレゼンテーション大会発表者6人、卒論修論発表練習会発表者3人、聴講のみ9人
参加者の所属：社会人3人、大学教員1人、大学生および大学院生14人

当日の進行：
- プレゼンテーション大会（テーマ自由）
- 修論発表練習会（各大学の様式に準ずる）
- 17:30～Gatherにて2次会（希望者のみ）

注意点：
相手の意見は否定せず、発言しやすい環境を作る。
発表の内容だけでなく、伝え方を意識して参加する。
大学の研究内容の発表を聴講するため、機密保持誓約書にサインする（参加者全員）

## 2. （テーマ自由）：好きなもの本気プレゼン大会
### 大会の概要
発表者：6人
発表時間：5分以内
発表内容：自由。ただし、公序良俗に反しないもの。
最大5分間の発表後、今回のプレゼンでどういった所を工夫したのか、自分なりの「プレゼンのこだわり」を述べる。

聴講者は、
- 内容の面白さ
- スライドの分かりやすさ
- 発表の構成
などの基準から1人を選び、優秀発表者として投票する。

賞品：オンライン図書カード(3,000円分)

### 発表題目
「BUMP OF CHICKENの魅力」
「緑茶を楽しむ！」
「プログラミングと電子工作」
「HHKBのススメ」
「エレキベースのすすめ」
「自宅でコーヒーを淹れる」

### 優秀賞
厳正なる投票を行った結果、優秀発表者は
**「自宅でコーヒーを淹れる」を発表した 大学院生のIさん**に決まりました。
賞品として、オンライン図書カードを進呈しました。
おめでとうございます！！

## 3. 修論発表練習会
### 概要
発表者：3人
発表時間：各大学の発表の様式（発表12分、質疑応答5分など）
発表内容：修論研究

## 4. 参加者から得られた意見
### プレゼンテーションのこだわり
- 改行の位置に気を付ける
- まず紙に書きだして、構想を練ってからスライドを作る
- 文字は大きく、1スライドに情報を詰め込みすぎない
- 専門知識がない人にも分かりやすい＆興味を惹きやすい説明を心がける
- 1スライドに情報を詰め込みたい場合、口頭で全て説明する（書きっぱなしにしない）
- まずイメージ図を示す→その後で実際の写真を示す
- 背景＞目的＞方法＞結果＞考察＞今後の課題（基本の流れを意識）
- PowerPointのデフォルトの図形を活用（ピクトグラムなど）
- フォントによって、小さい文字が見えづらいので注意
- スライド内の用語を統一する（例：Andosol、黒ボク土→黒ボク土に統一）
- 研究発表では、背景や概要よりも研究結果＆考察に十分な時間をとる
- 写真だけでなく凡例を同時に示す（例：赤色のマーク＝親機、他の色のマーク＝子機）

### 参加した感想（抜粋）
- 忙しい時期に参加したため大変だったが、皆さんから貴重な意見をいただけて、とても良い経験になった。
- 発表者全員のクオリティが高くて驚いた。楽しかった。
- 発表はせず聞いているだけだったが、様々なプレゼンテーションのこだわりが聞けて面白かった。
- 学生や社会人が意見を言い合っていて良かった。ぜひ第2回も開催してほしい。

## 5. おわりに
### 企画者の感想
12月から企画・立案を進め、1月半ば開催という学生・社会人問わず、誰にとっても忙しいスケジュールとなりました。そのためバタバタとした運営になってしまいましたが、周りの方のサポートのおかげで無事にイベントを執り行うことができました。企画・立案・当日までの準備にご協力いただいた皆様、そして参加していただいた皆様に心より感謝申し上げます。

### 今後の課題（第2回の開催に向けた改善点）
- 今回、参加登録はGoogleフォームに入力し、機密保持誓約は別のGoogleフォームに入力という手順を踏んだ。手続きが一度で済むようにすれば運営側・参加者側ともに手間が減ると思う。
- 発表者を中心に質疑応答が行われた。次回は発表者だけでなく、聴講のみで参加した人にも、意見を言ってもらう機会を増やしたい。

### 今後行いたい企画（詳細未定）
- 第2回プレゼン大会
- ゲーム大会
- ビジネスマナー講習会
- プレゼンテーション講習会
- 農業農村工学分野に特化した就活イベント（合同説明会）





## 参考資料
農業農村工学分野の交流を試みています。興味のある人は下記サイトをご覧ください。

http://nnhiroba.xsrv.jp/home.php

サマーセミナーというイベントを実施しています。NN分野の学生に是非参加してもらいたいです。

https://sites.google.com/view/n-n-summer-seminar

「改行に気をつける」

https://kousei.club/%e6%b3%a3%e3%81%8d%e5%88%a5%e3%82%8c%e3%81%ae%e6%84%8f%e5%91%b3%e6%a0%a1%e6%ad%a3%e3%81%8b%e3%82%89%e3%81%bf%e3%81%9f%e7%94%a8%e8%aa%9e%e8%a7%a3%e8%aa%ac/
初心者でもAtcoder茶色に行きたい。


はじめまして。**こんとらりあん**と申します。
初執筆なので読みにくいところも多々あると思いますが、ご容赦ください。

# 自己紹介
早速なんですが、自己紹介を軽くさせていただきます。
・現在25歳で、大学を卒業し、2年ちょっとがたちました。
・社会人ですが、IT、エンジニアといった職種や業界とは全く別世界にいます。
・しかし、エンジニア、ざっくり言えばIT業界に興味があり、とりあえずプログラミングも勉強しようと思い立ちました。
・今後はITの世界で働きたいと思っています。

# 過去のプログラミング歴
使用言語は**Python**です。
大学生の頃にほんのちょっとだけ独学で学習しましたが、すぐ折れました。
HTML＆CSSについても少し触った経験はあります。
あとは、卒業論文でSPSSという統計ソフトを使いました。これはプログラミング関係ないですが。

半年ほど前から、Pythonを学び直しています。
Udemyを使って学んでいたのですが、ある時Atcoderというものに出会いました。

どうやら競技プログラミングというものらしく、
基礎的なコーディングの知識からアルゴリズムの理解まで求められるらしい（違ったり不足していたらごめんなさい）
アウトプットの機会がなくてモチベーションを保つのが難しかったため、ひとまず始めてみることにしました。

# Atcoderのレーティングについて
というわけで現状こんな感じです。（6月後半くらいからコンテストに参加しました）
![スクリーンショット 2023-07-24 8.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518845/022b9f8f-6d28-6fab-5667-8a98c4ef00de.png)

はい。
バリバリ灰色です。そりゃそうだ。
正直にいうと、最初の３回はARCとかに出ていました。それはAtcoderのシステム上、参加回数が１０回未満だと実力よりも低いレートが出るからです。
だったら回数だけでも重ねといたほうがいいんじゃないか？と思いました。

当時はそんなこと思ってましたが、よくよく考えたら、０完の結果が残ってレート高く出ないんじゃ、、、、
たぶんこちらの仮説が正解なので、新しく始める方はご留意ください。



# こんな私でも茶色コーダーになりたい
ここまでダラダラ書いてきましたが、タイトルにあるように、こんな私が茶色にいくためにすべきことと、現状のギャップをまとめます。

現状：
ABCのAはほぼ間違いなく解ける。ただ、入力を上手く受け取れないとかで時間がかかったこともある。
B問題は半分以上解ける。ただ、だいたい30分以上かかる。早いと10分とか。
C問題以降は触っていない。下記のリンクで少しだけC問題には触れました。


[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-過去問精選-10-問)
これは10個の問題を乗せるだけでなく、類題も提示してくださっているので、非常に勉強しやすいです。
8問目のC問題と少し類題を解きました。


目標：
**ABCのコンテストで、3完を目指している。**
A問題B問題は15分くらいで解けるようになりたい。
その上で、C問題も正解できるようになる。
平たく言えば、**茶色**に上がりたい。

# 自分の強み
しかしながら、茶色に上がることが今の自分にとって簡単でないことも分かります。
とはいえ、自分にも持っているもの、アドバンテージがあります。
それは、**時間**です。
他の社会人の方より時間は多く確保できるはずで、これは間違いなくアドバンテージです。
あと、こんなタイミングで今更競プロをやろうとしていることで、**先人たちの知恵**を借りることもできます。
先ほど載せたリンクについても、最初期であればそんな記事は存在しなかったでしょうし、初心者の僕にはなおさらとっつきにくくかったはずです。

ありがたく、それらの記事やブログを参考にさせていただき、自分の血肉としたいと思います。


# 本アカウントの趣旨について
最後になりますが、自分の記事では、初心者中の初心者がそもそもどうやってプログラミングの基礎を学ぶのか、どうやって競プロで結果を残していくのかというノウハウを共有したいと思います。
ノウハウを共有するなんて偉そうなこと書きましたが、正確には「**自分が成長するとともに、何か初学者の方に参考になる情報を残す**」ということを目標としています。

他の記事を書いている方は、エンジニア歴があるけど競プロ初心者、既に競プロに関する知識があるけどAtcoder始めたばかりという方がほとんどのようです。
そういった記事も参考にはなるのですが、自分は結構０に近いところにいると自負しているので、自分も新たに始めたいよ〜という方にも向けて記事を書けたらいいなと思っています！

ここまで読んでいただきありがとうございました！:relaxed:
レイクハウスフェデレーションを試してみる(Databricks間接続)

先日発表されたレイクハウスフェデレーションを試してみます。

https://qiita.com/taka_yayoi/items/1cae6eca75c1225bf157

まずは、異なるDatabricksアカウントのDatabricks間の連携から。

# 準備

アクセス先のDatabricksを**Databricks A**、レイクハウスフェデレーションを使用する方を**Databricks B**とします。

**Databricks A**で以下をメモしておきます。

- パーソナルアクセストークン
- SQLウェアハウスの接続の詳細から**ホスト名**と**HTTPパス**

![Screenshot 2023-07-24 at 8.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d0903589-3901-a721-e3ed-307af29ddd48.png)

# 接続の作成

**Databricks B**でデータエクスプローラにアクセスします。

**接続タイプ**でDATABRICKSを選択し、以下のように入力します。
![Screenshot 2023-07-24 at 8.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/356c96cd-cd59-8f00-a5d9-7f4853ff9087.png)

接続のテストをクリックします。接続に使用するウェアハウスを選択します。
![Screenshot 2023-07-24 at 8.29.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71a07076-1cbf-d721-d0fe-aff4d6850ec8.png)

接続が確認できました。
![Screenshot 2023-07-24 at 8.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71df6a1b-523c-bdc6-f829-c5e1bd85a0c7.png)

接続を作成します。
![Screenshot 2023-07-24 at 8.41.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3e19b2f1-63ed-6377-f0e0-b850231982d5.png)

# 外部カタログの作成

接続を用いて外部カタログを作成します。
![Screenshot 2023-07-24 at 8.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d193f6c4-1f3c-4acf-0615-6133d0e76807.png)

表示されました！
![Screenshot 2023-07-24 at 8.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5323f321-f64a-60f4-e8da-16ab27690f4a.png)

クエリーを実行するとデータを取得できました！
![Screenshot 2023-07-24 at 8.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2f58b148-9752-2f11-462f-a17c3f357aa3.png)

他のデータベースとの接続も試してみます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
ObjectクラスのFreezeメッソドについて

オブジェクトの凍結について

ObjectクラスのFreezeメッソドについて調査しました。
オブジェクトは１次元配列、２次元配列および連想配列を対象としました。

テスト手順は次の通りです
（１）オブジェクトの宣言
　１次元配列、２次元配列および連想配列を内容を含めて宣言する。
　宣言にはvar、letおよびconst宣言がありますが、どの宣言でも結果は同じでした。
（２）オブジェクトの凍結
　宣言した各オブジェクトをFreezeメッソドにより凍結する。
（３）オブジェクト要素の変更／追加／削除
　凍結された各オブジェクトに対して、要素の変更／追加／削除を行う。

結果は次の通りです。
（１）連想配列の時
　　①要素の変更：既存のキーの値の変更はできません。実行時エラーとはなりません。
　　②要素の追加：新しいキーと値の追加はできません。実行時エラーとはなりません。
　　③要素の削除：deleteメソッドによる削除はできません。実行時エラーとはなりません。
（２）１次元配列の時
　　①要素の変更：インデックス(ary[0])による変更はできません。実行時エラーとはなりません。
　　②要素の追加：pushメソッド(ary.push())による要素の追加はできません。実行時エラーとなります。
　　③要素の削除：popメソッド(ary.pop())による要素の削除はできません。実行時エラーとなります。
（３）２次元配列の時
　　①１次元要素の変更／追加／削除
　　　・要素の変更：インデックス(ary[0])による変更はできません。実行時エラーとはなりません。
　　　・要素の追加：pushメソッドによる要素の追加はできません。実行時エラーとなります。
　　　・要素の削除：popメソッドによる要素の削除はできません。実行時エラーとなります。
　　②２次元要素の変更／追加／削除
　　　・要素の変更：インデックス(ary[0][0])による変更はできます。
　　　・要素の追加：pushメソッド(ary[0].push())による要素の追加はできます。
　　　・要素の削除：popメソッド(ary[0].pop())による要素の削除はできます。

次に私の感想を述べます。
（１）連想配列の時
　要素の変更／追加／削除ができないのは当然なのですが、実行時エラーとはなりません。
　これは連想配列が引数で渡された関数においては、連想配列が凍結されているか／いないかによって
　動きが異なるということです。
　またソースコードを見ただけではどちらになるかが分からないということです。
（２）１次元配列の時
　こちらは連想配列と違って、要素の追加／削除(push/popメソッド)の時は、実行時エラーとなります。
（３）２次元配列の時
　　①１次元要素の変更／追加／削除
　　　こちらは１次元配列の時と同じです。
　　②２次元要素の変更／追加／削除
　　　何と２次元要素に関しては、凍結しているにも関わらず何でもできてしまいます。

最後に質問というか、私の感じた疑問です。
　（１）現状の仕様について
　　歴史的経緯や互換性のため現状の仕様になっていると思います。
　　その経緯や理由を知っている人がいれば、簡単で良いので教えていただきたいです。
　（２）開発現場において
　　上記調査結果に見るといろいろ勘違いが発生しそうです。
　　実際の開発現場では上記結果は当然の事実として、問題にはならないのでしょうか。
AIと言えば簡単だが、AIと言わない私の信念。

はじめての投稿ですので、乱文や間違った表現はご容赦ください。
一部宣伝を含みますが、全体としては私個人的なAIに対しての考え方ですので、あわせてご容赦ください。

<h2>独学でプログラムを覚えて・・・</h2>
去年暮れぐらいから、独学でプログラミングを勉強してきました。
作りたいWEBアプリケーションがあり、制作会社に見積もりを出していただいたところ、200万円という金額だったので、「無理無理、自分でつくろう。」と思い自分で作りました。

結局勉強時間含め、10ヶ月ぐらいの歳月が経ってしまいました。
（見積もりでは3ヶ月だったので、3倍の時間がかかってしまいました。）
が、今回完成しました。

完成したサービスは...
「広告主とメディアをマッチングする広告の直売所」

というコンセプトでサービスを作成しました。
良ければ、御覧いただけると幸いです。
https://frame.adpentas.com/top_page

<h2>検索アシスト</h2>
このサービスの機能に検索アシストというサービスを実装しています。

この検索アシストは質問に答えて行くと「最適なアイテムを自動で紹介する」というサービスです。

　
私は過去、マーケティング部に所属していて、広告の出稿などに携わってきました。
この広告媒体を探す作業が面倒でしかたない。
１、広告代理店に連絡します。
２、大量の資料を持ってきてもらいます。
３、一つ一つ説明を受けます。
４、あーでもないこーでもないと言いながら、文句をつけます。
５、新しい資料をもってきてもらいます。
６、結局、はじめの資料に戻ります。

というのを、1ヶ月ぐらい広告代理店と商談をします。
そして、メディアを決めます。予算配分を決定して広告を出稿します。

これが嫌で嫌で仕方ない。
そして、思ったのが自動でメディアを提案してくれたらどれだけ楽か。
でも、そんなサービスは無く、無いなら作ろう。という思いで作り始めて、今回完成したというお話です。

ここまでが長くなっていますが、背景です。
<h2>検索アシストではなく、AIと言えば二文字で終わるのに</h2>

さて、ここからがタイトル回収になります。
この検索アシストというのは、いくつかの質問パターンを用意しています。

その質問に対して、ユーザーの回答を判断して、次の質問を出して・・・を繰り返して最適なメディアを提案する。
ここには、Googleなどの検索エンジンの仕組みなども参考にしています。
データベースへのアイテムの登録方法も100項目近くの項目を数字化して保存し、ユーザーが臨んでいる数値に近いものを提案する。

間違った表現かもしれませんが、　この流れだとAIと言ってもいいと思っています。
でも、AIとは私は言いたくない。

検索アシスト：６文字
AI　　　　　：２文字

文字数は少ないほうがデザインしやすい時の方が多いです。
そもそも、アルファベットの方がなんかかっこいいですし、デザイン上映えます。
でも言いたくない。

AIって某国民的アニメの青いロボットみたいな、その場その場で機械が判断して答えを自分で考えて・・・。
例えば、この青いロボットは、メガネをかけた主人に対して時に罵詈雑言を浴びせかける事があります。
そして、主人は泣きわめきます。
でも、憎いわけではなく、将来この主人が大人になった時、立派な大人になって欲しいという思いで、心を鬼にして発話しています。

今のAIと呼ばれるもののほとんどは、決まったルールに沿って、検索を行い、検索の結果全体の51%がYESというものを表示しているに限らない。

誇大広告とは言いませんし、そもそもAIの定義が曖昧だからだと思っています。
でも、この「AI」と表現して良いものとダメなものの線引はそろそろ必要ではないのかな？と思います。

「AI」と書いているから、なんか凄そう。
「AI」に計算させているからだから大丈夫。

なんだかな？と私自身も「いや、これはAIじゃない！」って明確に言えるだけの答えがあるわけではないですが、少しでも間違えている可能性があるならば、AIと言わず、わざわざ検索アシストと言った方が、誤解を招かないよね。と私は思います。

たぶん、AIって言ったほうがユーザーは、なんか凄そうって登録するんでしょうけどね・・・。

ここまでお読みいただきありがとうございました。
私の個人的感情や、私見が含まれていますので、嫌悪感を抱かれた方もいらっしゃるかと思いますが、ご容赦いただけますと幸いです。
スナップショットよりバックアップを復元する方法【EC2インスタンス】

# ■概要
今の所あまり使う事はなかったんですが備忘録として。
稼働中インスタンスに対して、バックアップ等で取得していたスナップショットをルートボリュームとして置き換える方法です。

# ■手順
手順はとても簡単で、インスタンスの停止も不要です。

##### 1.バックアップしていたスナップショットのIDを取得しておく。
snap-xxxxxxxxxxxxxxxxxxxxx

![snap1_20230722051507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/72e17672-b8a6-f7f9-e204-8bc4be4f4df8.png)


##### 2.稼働インスタンスを選択する
ストレージ → ルートボリュームを置き換える を選択する

![snap2_20230722051703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/554f9130-568a-2335-5ebb-bc294678c16e.png)

##### 3.「スナップショット」を選択し、1で取得したIDをペーストする
AMIから指定する事も可能です。
この時、「置き換えられたルートボリュームを削除」にチェックをいれると現在のボリュームは削除されます。

![snap3_20230722052008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/ee1001dc-ca53-4742-2e61-8a1cfe10ee61.png)


##### 4.置き換えを実行後、タスクが成功になれば完了です。

![snap4_20230722052410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/20702923-5a4c-a3c5-10f6-25eac914f950.png)

↓↓↓

![snap5_20230722052455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/4de20e30-08cf-b291-d0f9-7c84d0eda76f.png)

以上です！
2023/7/24主にITとかセキュリティの記事

Google・MS・OpenAI・Metaなど7社、米政権に「責任あるAI開発」を約束(7/22)
https://gunosy.com/articles/e8q4s

ドコモ顧客情報持ち出しか、業務委託先の男を書類送検(7/22)
https://www.nikkei.com/article/DGXZQOUE221RZ0S3A720C2000000/

Google従業員のミスで世界の防衛・情報機関の個人情報流出、日本も含む(7/22)
https://news.mynavi.jp/techplus/article/20230722-2732336/

宿泊予約管理システムへの不正アクセスとチャット機能の不正利用についてまとめてみた(7/22)
https://piyolog.hatenadiary.jp/entry/2023/07/22/005314

ＦＢＩとも連携　警察庁直轄サイバー部隊の実力(7/22)
https://www.sankei.com/article/20230722-7Z7RTNDSNBPRFPTIGQZGJFGFKM/

フィッシングサイトに誘導するメッセージ配信についてのお詫びとお知らせ（御宿 野乃 大阪淀屋橋）(6/9)
https://www.hotespa.net/dormyinn/pdf/pdf20230609.pdf

生成ＡＩ活用へ指針　山形市　検討作業部会設置へ(7/22)
https://www.yomiuri.co.jp/local/yamagata/news/20230722-OYTNT50005/

偽パスポート・卒業証明書…韓国企業の就職志望者の正体は「北朝鮮ハッカー」だった(7/22)
https://www.afpbb.com/articles/-/3473709?cx_part=top_category&cx_position=1

近畿大学、奈良キャンパス利用ドメインのメアドなど3,549件流出か(7/21)
https://cybersecurity-jp.com/news/85569

メール数十万通不正流出か(7/22)
https://ibarakinews.jp/news/newsdetail.php?f_jun=CO2023072101000926.2.N.20230722T004443.xml&elem=z
https://373news.com/_news/compactnews.php?newsitemid=2023072101000926
https://www.minpo.jp/globalnews/detail/2023072101000926

米商務長官、ハッカー攻撃「容認できず」　年内訪中計画は維持(7/22)
https://jp.reuters.com/article/usa-china-cyber-hacker-idJPKBN2Z11HY

米国務長官 対中政策担う高官らサイバー攻撃“情報流出なし”(7/22)
https://www3.nhk.or.jp/news/html/20230722/k10014138741000.html

サイバー犯罪防止、アニメで分かりやすく　作成協力の学生に感謝状(7/22)
https://news.yahoo.co.jp/articles/cc9ccab07e3f8292b2cf8325cde073fdac6b7ec0

ハッキングオフィサーのケビン・ミトニック氏が死去＝米ＫｎｏｗＢｅ４〔ＢＷ〕(7/21)
https://sp.m.jiji.com/article/show/3000074

スカパーJSATに不正アクセス(7/22)
https://www.nikkei.com/article/DGKKZO72966130R20C23A7TB0000/

デジ庁立ち入り検査　独立委として厳正対応を(7/22)
https://www.fukuishimbun.co.jp/articles/-/1832742

社説：デジタル庁検査　マイナンバー、ひずみ究明を(7/22)
https://www.kyoto-np.co.jp/articles/-/1072488

河野デジタル相、マイナ保険証問題でメール謝罪も「なんで支援者にだけ？」批判殺到…26日には集中砲火も(7/22)
https://news.yahoo.co.jp/articles/4c20e371919056f01e88c4706624d5da7745bda5

「行政トップとして本当に申し訳ない」首相、マイナ問題で改めて謝罪(7/21)
https://news.yahoo.co.jp/articles/43face1ab1f3293f2545282c55e3a41319774633

市民545人分の個人情報漏えい　エクセル使用時にミス　東京・町田(7/22)
https://news.yahoo.co.jp/articles/09b4e6e850f62cb94b477f74de8eb8bdcf158540

人間ドック対象者301人の名前や住所がネットに漏えい　教職員ら加入の共済組合兵庫支部(7/21)
https://news.yahoo.co.jp/articles/c6e836f91c7fcb9afe3ab761c0c7959617720ed8
LinuxでのAMDビデオカードの過度な発熱。

もしモニターが60Hz以上をサポートしているなら、時々次のような問題が発生することがあります：モニターのリフレッシュレートを、例えば144Hzに設定すると、ビデオカードが過熱するようになります。

このとき、ユーティリティのradeontop（ https://github.com/clbr/radeontop ）を実行すると、`100% Memory Clock`と表示されます。
また、グラフィックス用の`htop`アナログであるユーティリティ`nvtop`（ https://github.com/Syllo/nvtop ）もあります。

ファンが動作しないというバグ（ https://qiita.com/valsaven/items/1dbd4df3522929a0ba4c ）と併せて、これはビデオカードの過熱や、さらには破損を引き起こす可能性があります。注意してください。

解決策：リフレッシュレートを60Hzに下げると、すべてが正常に戻ります。

このバグについての詳細は、以下のコメントで見ることができます：
https://gitlab.freedesktop.org/drm/amd/-/issues/1301

Issueは閉じられていますが、このバグは一部のシステムでまだ発生する可能性があります。
Manjaro LinuxでAMDのビデオカードのファンが回らない対処法

かつて私はこの問題に自分の前のビデオカード6600XTで直面し、以下のような解決策を見つけました：

1. amdgpu-fanをインストールする

    ```sh
    yay -S amdgpu-fan
    ```

2. 設定ファイル `/etc/amdgpu-fan.yml` を作成する
設定例：

    ```yaml
    #Fan Control Matrix. [<Temp in C>,<Fanspeed in %>]  
    speed_matrix:  
     # DEFAULTS
     #- [0, 0]  
     #- [30, 33]  
     #- [45, 50]  
     #- [60, 66]  
     #- [65, 69]  
     #- [70, 75]  
     #- [75, 89]  
     #- [80, 100]  
     - [0, 0]  
     - [30, 0]  
     - [45, 20]  
     - [60, 66]  
     - [65, 69]  
     - [70, 75]  
     - [75, 89]  
     - [80, 100]  
    # optional  
    # cards:  # can be any card returned from `ls /sys/class/drm | grep "^card[[:digit:]]$"`  
    # - card0  
      
    # optional  
    # temp_drop: 5  # how much temperature should drop before fan speed is decreased
    ```
3. amdgpu-fanをサービスとして作成し、起動する

    ```sh
    sudo systemctl start amdgpu-fan
    sudo systemctl enable amdgpu-fan
    ```

これが誰かの役に立つことを願っています。
ビデオカードが過熱しているとは思わず、モニター上のビデオアーティファクトを見るまで全く予期していなかったので、このようなことに注意を払ってください。
JavaでPostgreSQLのエラーコードを取得する

PostgreSQLには、エラーの種類に応じてエラーコードがある。
詳細は[公式ページ](https://www.postgresql.jp/docs/9.0/errcodes-appendix.html)を参照。
数えてみたら199種類あった。
とはいってもお目にかかるのはほぼ「23 クラス — 整合性制約違反」だとは思う。

このエラーコードをMyBatisでクエリ実行したときに取得したい。
※試してはいないが、別にMyBatisでなくてSpring JDBCやJPAなど他のデータベースマッパー、ORマッパーであっても同じようにできるはず。

catch節をこのようにする。

```java
}catch(Exception e){
    String errorCode = ((SQLException)e.getCause()).getSQLState();
    System.out.println(errorCode);
}
```

MyBatisでの一例

```java
Articles articles = new Articles(){{
    setArticleTitle("タイトル");
}};

try{
    articlesMapper.insertSelective(articles);
}catch(Exception e){
    String errorCode = ((SQLException)e.getCause()).getSQLState();
    System.out.println(errorCode);
}
```
非NULL違反の場合、23502がerrorCodeとして取得できた。
定期更新処理からの非同期処理取り扱いやすさ比較（await無し）

# 前提
ゲームのシーン進捗管理を定期処理中でしている前提。後付けで非同期処理完了待ちに対応する場合に、扱いやすい手法があるか考察する。机上検討のみ。掲載コードは **疑似コード** 。C#をイメージしてはいるが **ビルド通らないはず** 。

# １、ポーリングで完了確認

```c#
void Update()
{
    ...
    if (state == 0)
    {
        taskAbc = StartAbcAsync();
        state = 1;
    }
    else if (state == 1)
    {
        if (taskAbc.IsCompleted)
        {
            state = 2;
        }
    }
    else if (state == 2)
    ...
}
```

# ２、コールバックで完了確認

```c#
void Update()
{
    ...
    if (state == 0)
    {
        state = 1;
        StartAbcAsync(() => {
            // 要排他制御
            state = 2;
        });
    }
    else if (state == 2)
    ...
}
```
# ３，ポーリングで完了確認、さらにコルーチンでラッピング

```c#
void UpdatePrivate()
{
    if (this.coroutineCurrent == null)
    {
        this.coroutineCurrent = Update();
    }
    bool needBreak = false;
    do
    {
        while (this.coroutineCurrent.MoveNext())
        {
            if (this.coroutineCurrent.Current == null)
            {
                needBreak = true;
                break;
            }
            else
            {
                this.coroutineList.Add(this.coroutineCurrent);
                this.coroutineCurrent = this.coroutineCurrent.Current;
            }
        }
        if (!needBreak)
        {
            this.coroutineCurrent = this.coroutineList[this.coroutineList.Length - 1];
            this.coroutineList.RemoveAt(this.coroutineList.Length - 1);
        }
    } while (needBreak);
}

IEnumerator Update()
{
    ...
    taskAbc = StartAbcAsync();
    while (!taskAbc.IsCompleted)
    {
        yield return null;
    }
    ...
}
```

# 比較

１は１つか２つならできなくはない。１か所に記述が固まっていることもあるし。

２も１つか２つならできなくはない。しかし排他制御が必要で、たとえプロパティ側でカプセル化したとしても呼び出し順番を１つ間違えただけで動いたり動かなかったりする可能性があって怖い。fiberとかタスクキューのような仕組みの導入とセットならある程度軽減はできそうだが、使いにくさは１とあまり変わらない。

３は１と２に比べればまだマシに思える。ただ戻り値使えないのは使いにくい。

# 比較結果

どれも手間はかかるがコルーチンを使うのがまだまし。フラグ利用個所を減らせる。

状況が許すなら非同期処理をあきらめてブロッキングで待つのも現実的。件数や経過時間を見てたまに呼び出し元に制御を戻せば完全にフリーズはしないはず。

正攻法で非同期処理の取り扱いやすさを改善するにはasync/awaitを利用できるようにすることが先。ただしC#ではスレッドプール動作がデフォルトで並列処理になってしまうのでその対策も必要。
RestTemplateを使ってWebAPIを呼ぶ（Maven）

Mavenプロジェクトにおいて、httpリクエストを送る。
httpクライアントとしては、springframeworkの1モジュールであるRestTemplateを使いたい。

### pomに下記を追加。

```xml
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.3.13</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version>
    </dependency>
```

※jackson-databindがないと、実行時、
org.springframework.web.client.RestClientException: No HttpMessageConverter for CallWebApi$1 and content type "application/json"
というエラーになる。Content-Typeがapplication/jsonでなければおそらく不要。

### Javaの実装。

```java
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import com.peechan.dto.RestMessage;

public class CallWebApi {

    static RestTemplate restTemplate = new RestTemplate();
 
    public void callWebApiSample(){

        System.out.println("callWebApiSample開始");

        try{
            String url = "http://127.0.0.1:10000/spring/aaa";

            RestMessage restMessage = new RestMessage(){{
                setAaa("aaa");
            }};

            RequestEntity<RestMessage> req = 
                RequestEntity.post(url).contentType(MediaType.APPLICATION_JSON).body(restMessage);

            ResponseEntity<Long> result = restTemplate.postForEntity(url, req, Long.class);
            System.out.println(result.getStatusCode());
            System.out.println(result.getBody());
            
            System.out.println("callWebApiSample終わり");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

```

### 実行結果

※とりあえずレスポンスボディは1固定値。

```
callWebApiSample開始
200 OK
1
callWebApiSample終わり
```
一般ユーザ（家族）の Android 端末が [`Process 〜 has died`] でアプリが頻繁にクラッシュするという相談に logcat を使って調査/改善した

2019 年ごろ購入した docomo キャリアで購入した Android 端末でアプリが頻繁にクラッシュすると相談を受けた。

調査/改善したため対応ログをまとめます。

## 相談時の現象

Android 8.1

- 前日にはふつうに使えていた。
- アプリが頻繁にクラッシュする前後に特殊な操作はした覚えがない。
- よくクラッシュするアプリと現象は以下だった。
  - LINE（SNS）：アプリを開いて数秒は動作するがそのあとクラッシュ
  - ツムツム（ゲームアプリ）: スプラッシュ画面が出る前にクラッシュ
  - ほかのアプリもクラッシュしていたが、上記アプリよりひどくなかった
- 再起動は相談前に数回していて改善しなかった。
- 「設定」→「ストレージ」でストレージは合計128GB で空きは 8GBだったので満タン付近だった。
- 「設定」→「ストレージ」→「メモリ」で3時間の平均メモリ使用量が合計 6GB、使用 2.5GBなことを確認した。
- 設定アプリはふつうに動いていた。
- 開発向けオプションは有効になっていない。（使っていたのはエンジニアではなく特殊な設定はしてなさそう）

## 対応時系列

1. 再起動を自分でも2回行って改善しなかった。
1. 「設定」→「アプリ」→「すべてのアプリ」でシステムアプリ含めてアプリ名とストレージサイズを中心にすべて眺めて、変なものがないか確認した。パッと見で怪しいものはなかった。
1. アプリ名/バンドルIDで通信キャリア系のものだと判断したものについて、検索してみた。パッと見で怪しいものはなかった。
1. 開発向けオプションを有効にして、USBデバッグを有効にした。
1. `adb logcat` の確認を始めた。`ActivityManager` で LINEの `Process 〜 has died` のログが出ていた。これはアクティビティがキルされるときのログです。
1. `adb logcat | grep died` していたら Google Play 開発者サービス（com.google.android.gms.persistent）が数秒おきにクラッシュしていたことを確認できた。ログは後述しています。
1. 「設定」→「アプリ」から Google Play 開発者サービスを無効化、再インストールした。
    * 参考: [(´・ω・`)ｼｮﾎﾞｰﾝ: persistentプロセスの暴走とGoole Play 開発者サービス再インストール](https://blog.shobota.com/2016/02/persistentgoole-play.html)
1. よくクラッシュしていたアプリで動作確認した。クラッシュしなくなったことを確認した。

## 感想など

調べたら「Goole Play 開発者サービス」が不調の原因になるのはよくある？
自端末で以前「Goole Play 開発者サービス」関連のエラーメッセージを見たことはあったが、今回はエラーメッセージが出ていなかった。

相談のトラブルシューティングで logcat を使うことになるかと思わなかったが、役に立ってとてもうれしかった。

発生原因はつかめず端末が古いこともあり、買い替えを検討するよう案内した。LINEなどのバックアップが安心できる状態に改善できたのはよかった。

## logcat ログ

`Process 〜 has died` のログで検索してもあまり見つからなかったためログを残します。

```
$ adb logcat | grep died
...
07-23 22:09:57.864  1051  6240 I ActivityManager: Process com.google.android.gms.persistent (pid 18434) has died: fore BFGS
07-23 22:10:01.281  1051  6240 I ActivityManager: Process com.google.android.gms.persistent (pid 18567) has died: fore RCVR
07-23 22:10:02.367  1051  6240 I ActivityManager: Process com.google.android.gms.persistent (pid 18629) has died: fore BFGS
07-23 22:10:05.142  1051  3597 I ActivityManager: Process com.google.android.gms.persistent (pid 18695) has died: fore BFGS
07-23 22:10:08.676  1051  2188 I ActivityManager: Process com.google.android.gms.persistent (pid 18905) has died: fore IMPB
07-23 22:10:09.660  1051  2188 I ActivityManager: Process com.google.android.gms.persistent (pid 18962) has died: fore BFGS
```

数秒おきにクラッシュしていた。
fore 以降の情報は検索してみたがわからなかった。なのでクラッシュしていた原因は不明のまま。
Capistranoでのデプロイ後にプロンプトへの入力文字が表示されなくなる問題への対処

# 事象
capistranoでのデプロイ実行後、プロンプトに入力した文字が表示されなくなってしまうことがある。条件は以下。

* `cap deploy`を実行する環境のシェルがbash
* デプロイに使用するSSH秘密鍵にパスフレーズを設定している
* デプロイ先に複数のサーバーを設定している

# 原因
OpenSSHでは秘密鍵のパスフレーズを入力する際、一時的に端末(tty)オプションが変更され、ユーザーの入力を非表示にした状態でパスフレーズを入力できる。

通常は入力完了後ユーザー入力が表示されるよう端末オプションが戻されるが、
複数回パスフレーズを聞くような場合の処理がcapistranoもしくはsshkitでうまくハンドルできておらず、ユーザー入力が非表示のままの状態になってしまっていると思われる。

なお、zshの場合はコマンド完了時にシェル側で端末オプションが修正されるため発生しない。

# 対処
以下のコマンドで端末オプションを修正し、事象を解消することができる。

```shell-session
stty echo
```
PowerAutomate: スケジュール実行を平日8:00-18:59 の間だけ動かす

# 背景
Excel Action である Run Scripts が正規表現利用にとても便利
ガンガン使ってたら実行制限に引っかかるようになってきたので、TriggerCondition を設定して実行量を減らすことにした。

Run Scripts は通常のActionとは別に、実行制限が別途ある為
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/1503a363-89a2-8394-8ea7-d8805dab7ffe.png)
[アクションの既知の問題と制限](https://learn.microsoft.com/ja-jp/connectors/excelonlinebusiness/#%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%97%A2%E7%9F%A5%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%A8%E5%88%B6%E9%99%90)

Trigger Condition を確認するのは、以下で楽々に

https://qiita.com/baku2san/items/2221c43657bd7707960e

# Trigger Condition
Trigger で以下の部分に設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/fa16b23d-8898-ce90-ecfe-480da552ab44.png)

```json
@and(
    greaterOrEquals(int(convertFromUtc(trigger()?['startTime'], 'Tokyo Standard Time', 'HH')), 8),
    lessOrEquals(int(convertFromUtc(trigger()?['startTime'], 'Tokyo Standard Time', 'HH')), 18),
    and(
        not(equals(convertFromUtc(trigger()?['startTime'], 'Tokyo Standard Time', 'ddd'), 'Sun')),
        not(equals(convertFromUtc(trigger()?['startTime'], 'Tokyo Standard Time', 'ddd'), 'Sat'))
    ) 
)
```

Trigger Condition については、以下で

https://qiita.com/h-nagao/items/46d5d95cfacb3c70841b

# 解説
- 今回の例は、Recurrence Trigger の例
- Recurrence の場合、startTime で、Trigger 起動時刻が取得できる
- convertFromUtc でUTC から JST に変換しつつ、時刻だけ取得
    - 分まで制御したい場合はこの辺から修正必要
    - 詳細は [convertFromUtc](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#convertfromutc)
- greater/less をする場合、型合わせが必要なので、int() にしておく
    - 多分、'9' みたいにして文字列に合わせてもいける筈だけど
- 曜日は、土曜日と日曜日を外すだけ

# あとがき
とりあえず、一日の動作上限から考えると
- 1600 / 11 [hours] = 145 [times/hour]
 ってことで

五分間隔なら、12回程度は使えるってところで、
結局は、Run Scripts使いまくりの現状を見直す必要あり・・か・・ :laughing:
マイページを編集するときにパスワードなしで編集可能にする

## はじめに
初めまして、プログラミングスクールGeekSalonのWebコースメンターをしています。　

今回の記事は、ユーザーマイページ(プロフィールページ）を編集する際にパスワードを入力せずに編集を可能にする方法をお教えします。　

## 前提　
:::note info
・Railsバージョン: 5.0以上
・Deviseバージョン: 4.2以上
・ログインページが実装されている
・ユーザーマイページ（プロフィールページ）が実装されていること　
:::

Deviseでは、アカウントをアップデートする際に、3つのパスワード情報が必要になります。

**password**
**password_confirmation**
**current_password**

パスワードを3回も打つ理由としては、**パスワードの誤入力を防止、不正なアクセスを防止**などが挙げられます。ただ、プロフィールを編集するために、パスワードを3つも入力させるのは、マジで面倒です。　

なので、パスワードなしで実装する方法をこの記事のゴールとします。


## 1.RegistrationsControllerの作成 
```
rails g controller registrations
```
ターミナルに上記のコードを打つちみます。
 
作成したら、以下のコードを追加してください。　

```app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  #ここから
  def update_resource(resource, params)
    # パスワード変更を行う場合のみ、current_passwordも含めて更新する
    if params[:password].present? && params[:password_confirmation].present?
      resource.update_with_password(params)
    else
      # パスワード変更を行わない場合は、通常の更新を行う
      resource.update_without_password(params.except(:current_password))
    end
  end
  #ここまで
end
```
これにより、パスワード変更が必要な場合にはcurrent_passwordも含めて更新が行われ、パスワード変更を行わない場合にはcurrent_passwordを除外して更新が行われるようになります。　

##  routes.rbに指定　
```config/routes.rb　
Rails.application.routes.draw do
  devise_for :users, # この行にカンマを追加
    controllers: { registrations: 'registrations' } # この行を追加

  resources :users, only: [:show]
end
```

## modelのコードを追加　
```app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  
  validates :name, presence: true
  validates :self_introduction, length: { maximum: 500 }


  # ==========ここから追加する==========
  def update_without_current_password(params, *options)

    if params[:password].blank? && params[:password_confirmation].blank?
      params.delete(:password)
      params.delete(:password_confirmation)
    end

    result = update_attributes(params, *options)
    clean_up_passwords
    result
  end
  # ==========ここまで追加する==========

end
```

```app/models/user.rb　
params.delete(:password)
params.delete(:password_confirmation)
```
上記のコードでpasswordとpassword_confirmationのパラメータを削除しています。
```app/models/user.rb　
if params[:password].blank? && params[:password_confirmation].blank?
```
このコードで、パスワードとパスワードの確認のフォームが空のときにtrueを返すif式です。

blank?は中身が空か、入れものそのものが存在しないときにtrueを返すRubyのメソッドです。　

「保存」ボタンを押したあと、トップページに遷移すればうまく動作しています。

以上で本パートは終了です。

お疲れさまでした。
WSL2でgoogle-chromeを実行してみた

###   WSL2でgoogle-chromeを実行しようとした経緯
以下2つの記事の続きです。

1つめ
[WSL1でsyslogサーバを立ててみた](https://qiita.com/shinfx/items/55cdf8c3814e2206e213)
2つめ
[WSL2でNTPサーバを立ててみた](https://qiita.com/shinfx/items/96690d00ab3fdbe75fac)

snmpサーバ（zabbix）を立てようと準備していましたが、zabbixを操作するためにGUI環境がほしいと思いWSL2上で起動するブラウザー（chrome）を用意することにしました。

しかし思いのほか準備に手間がかかりましたので備忘録として記載します。

セットアップの流れは以下の通りです。
1. WindowsにX Serverをインストール
2. WindowsのfirewallでX Serverを許可する
3. WSL2にgoogle-choromをインストール
4. WSL2でDisplayを設定する

### 　1.WindowsにX Serverをインストール
以下記事を参照してください。
[VcXsrv（Xサーバー）をWindowsにインストールしLinuxのGUIをリモート操作する設定方法](https://rin-ka.net/windows-x-server/)


PCを毎回起動すると同時にX Serverも動かさないといけません。
それが面倒な方は以下手順を実施してください。

1.赤丸のところに”-ac”と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446740/2ad1dfdc-d57b-f797-5ae4-77bdf8dc7b6f.png)

2."Save configuration"で設定を保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446740/3d467eb1-b8cc-c67b-72c9-08ba6233266e.png)

3.保存した”config.xlaunch”ファイルのショートカットを作成し、スタートアップフォルダーにショートカットを格納する。
スタートアップは"Windowsボタン ＋ R"でポップアップを開き”shell:startup”と入力する。

### 　2.WindowsのfirewallでX Serverを許可する
自分はfirewallの許可ができておらずなかなかgoogle-chromeを起動できずにいました。

以下手順で画面遷移をする。
設定＞更新とセキュリティ＞Windowsのセキュリテイ＞ファイアーウォールとネットワーク保護＞ファイアーウォールによるアプリケーションの許可

”VcXsrv windows Xserver”の左側チェックボックスを有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446740/ecc7c315-ab11-9d82-1e01-1a705879ab98.png)

### 　3.WSL2にgoogle-choromをインストール
最初にroot権限を付与する。
```conf
$ sudo su -
```

アップデートする
```conf
$ sudo apt update
```

リポジトリ追加する
```conf
$ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
```

公開鍵をダウンロードする
```conf
$ sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
```

chromeをインストールする
```conf
$ sudo apt install google-chrome-stable
```

### 　3.WSL2でDisplayを設定する
ハマりポイント2でした。
はじめ以下内容でコマンド入力しましたが、以下エラーが発生しました。
```conf
# 環境設定コマンド
$ export DISPLAY=:0.0

# エラー内容
$ Error: Can't open display: :0.0
```

なので、以下内容で設定してください。
簡単に説明すると明示的に自身のIPアドレスを指定しています。

```conf
$ export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```
詳しい説明は以下記事を参照してください。
[WSL2におけるVcXsrvの設定](https://qiita.com/ryoi084/items/0dff11134592d0bb895c)

これで設定は完了です以下コマンドでgoogle-chromeを起動してみてください。
```conf
$ google-chrome
```

エラーが出た場合は以下コマンドで起動してください。
```conf
$ google-chrome --no-sandbox
```

起動できれば完了です。

### 　PC再起動後にエラーが発生する場合
WSL2のIPアドレスは自動割振りのため、DISPLAYの環境設定を都度設定しないといけません。
以下のどちらかコマンドを入力してください。
```conf
$ export DISPLAY=:0.0

$ export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

### 　まとめ
たかがGUIアプリを起動するだけですが、すごく時間がかかりました。検証時に用意していると時間がもったいないため、スキマ時間にサーバ類はすべて準備したいものです。
【React】特定のキーが入力された時に処理を行う方法

# `Esc`が入力された際の処理

以下のように記述すると`Esc`が入力された際に実行される処理を定義できます。

```tsx
import { useEffect } from 'react';

const Sample = () => {
  useEffect(() => {
    const handleEscape = (event) => {
      if (event.key === 'Escape') {
        // エスケープキーが押された時の処理をここに記述する
        console.log('Escape key was pressed!');
      }
    };

    document.addEventListener('keydown', handleEscape);

    return () => {
      document.removeEventListener('keydown', handleEscape);
    };
  }, []);

  return <div>sample</div>;
};

export default MyComponent;
```
DockerのMySQLに接続できなくて困った話

## 開発環境

M1Mac
PHP,Laravel
Docker
(nginx:1.17-alpine,php 7.4,mysql 8.0.32)

## Laravelとデータベースが接続できなくて困った( ´Д`)y━･~~

LaravelとDockerを使ってでサイトを作っていたのだが、
データベースに接続できなくて、php artisan migrateができない！
という所で詰まった。

.envファイルの内容もあっている様だが、どうにも接続できない、

## 解決方法

ターミナルからDockerに入ってphp artisan migrateしたらmigrateできましたとさ。

結局のところは、
ローカルのLaravelからDockerのMySQlに接続するのではなく、
DockerにあるMySQLにはDockerに入って接続すればよかった様です

自分が今ローカルで作業しているのか、Dockerで作業しているのかを考えるのが大事かも。


## まとめ

Dockerのデータベースに接続するには、Dockerに入って接続するべし！
ということで引き続き開発を進めていきます。
アクション間で同じインスタンス変数を使い回す方法

## 本記事の内容
アクション間で同じインスタンスを使いたいことがありました。
今回は、アクション間で同じインスタンス変数を使い回す方法を解説しています。

## 要件
1.ユーザー登録画面では、ユーザー名とメールアドレスのみを入力
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985135/e6e21e29-2e65-b582-a161-6ad67ae24eac.png)

2.入力されたメールアドレス宛に確認コードを送信、ユーザーが確認コードを入力する
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985135/a0f7edb8-af25-2681-b832-f51a94625c00.png)


このように、「ユーザー名・メールアドレス・確認コード」の3つを同じFormオブジェクトで管理しているが、別々のviewでそれぞれ入力したい場合があります。
この時、ユーザー登録画面から確認コード入力画面にリダイレクトするため、
ユーザー登録画面で作成したインスタンス変数は本来ならば、消えてしまいます。
今回は、ユーザー登録画面で入力された内容を保持して確認コード入力画面に遷移できるようにしたいと思います。


## 実装方法
結論としては、セッションを用います。
リダイレクト前にインスタンスをセッションに詰め、リダイレクト先でセッションから再度インスタンスを作成します。
```
def create
　　　　〜〜(バリデーションチェックなど)〜〜
  # インスタンス変数をセッションに詰める
  session[:user_form] = @user_form
  redirect_to verify_email_path
end

def verify_email
  # セッションから再度インスタンスを作成
  @user_form = UserForm.new(session[:user_form])
end
```

しかし、これだけだと下記画像のような、errosという属性がないというエラーが発生します。
![属性なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985135/591a6a8a-a9b8-26bd-5958-d22a04e7c5cc.png)

これは、バリデーションチェックした後では、自動でインスタンス変数に`errors`と`validation_context`という属性が追加され、これに対応するFormオブジェクトのセッターがなく値をセットできないことが原因です。
↓`binding.pry`で確認した`@user_form`
```
{"errors"=>{}, "name"=>"テスト", "email"=>"test@sample.com", "validation_context"=>nil}
```

そのため、Formオブジェクトのコンストラクタを下記のように編集します。
ActiveModel::ModelをincludeしたFormオブジェクトは、デフォルトでActiveModel::Modelのinitializeメソッドを使用するため、今回はFormオブジェクト内で特定の属性のみ初期化するinitializeメソッドを定義する必要があるためです。
```
class UserForm
  include ActiveModel::Model

  attr_accessor :name, :email, :verify_code

  def initialize(attribute = {})
    → @name = attribute['name']
    → @email = attribute['email']
  end
end
```

以上です！！

## 今回のサンプルコード
こちらです⤵︎⤵︎

https://github.com/tsubasahirakida/my_form_session

ご拝読ありがとうございました！！m(_ _)m
Springフレームワークで動的QRコードを作る方法

こんにちは。今日はプログラミングの世界に足を踏み入れた皆さんに、Springフレームワークを使って動的なQRコードを生成する方法をご紹介します。新たなスキルを学び、プログラミングの知識を増やしたいというあなたのニーズにお応えします。

# Maven設定の追加

まず始めに、QRコードを生成するために必要なライブラリ、GoogleのZXingをプロジェクトに追加します。pom.xmlファイルに以下の依存関係を追加します。

```xml:pom.xml
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.5.1</version>
</dependency>
```

# QRコード生成サービスの作成

次にQRコードを生成するためのサービスクラスを作成します。

```kotlin:QRCodeService
@Service
class QRCodeService {

    @Throws(WriterException::class, IOException::class)
    fun getQRCodeImage(source: String, encoding: String, size: Int): ByteArray {
        // QRコード生成のための設定
        val hints = ConcurrentHashMap<EncodeHintType, Any>()
        hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.M
        hints[EncodeHintType.CHARACTER_SET] = encoding
        hints[EncodeHintType.MARGIN] = 0

        // QRコード生成
        val writer = QRCodeWriter()
        val bitMatrix: BitMatrix = writer.encode(source, BarcodeFormat.QR_CODE, size, size, hints)
        val image: BufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix)

        // 画像をbyte配列に変換
        val baos = ByteArrayOutputStream()
        ImageIO.write(image, "png", baos)
        return baos.toByteArray()
    }
}
```

このサービスクラスを用いて、SpringのコントローラからQRコード生成リクエストを受け付けます。生成されたQRコードはHTTPレスポンスとして返されます。

```kotlin:QRCodeController
@Controller
open class QRCodeController(
    // 依存性注入
    var qrCodeService: QRCodeService
) {

    @RequestMapping(value = ["/generateQRCode"], method = [RequestMethod.GET])
    fun generateQRCode(@RequestParam(value = "url", required = true) url: String, res: HttpServletResponse) {
        // QRコード生成
        val encoding = StandardCharsets.UTF_8.displayName()
        val size = 512
        val qrCode = qrCodeService.getQRCodeImage(url, encoding, size)

        // QRコードをレスポンスに書き出し
        res.setContentType(MediaType.IMAGE_PNG_VALUE);
        IOUtils.copy(ByteArrayInputStream(qrCode), res.getOutputStream())
    }
}
```

これにより、ユーザーは`/generateQRCode?url=任意のURL`という形でアクセスし、指定したURLのQRコードが生成されます。

# QRコード生成の応用

この動的なQRコード生成は、ウェブサイトの記事を共有するためのQRコードをページロード時に生成する等、様々な場面で利用できます。URL以外の情報もQRコードに埋め込むことが可能なため、ユーザー情報等を暗号化してQRコードにし、セキュアな情報共有も可能です。

以上がSpringフレームワークを使った動的QRコード生成の方法になります。Maven設定からサービスクラス作成、コントローラの設定まで手順を踏んで解説しました。SpringフレームワークとZXingライブラリを活用して、自分だけのQRコード生成サービスを作ってみてはいかがでしょうか。プログラミングの世界は広大で、常に新たな知識を吸収し続けることで成長していけます。今回学んだ知識があなたの一助となれば幸いです。
docker+keras+tensorflow+GPU(nvidia)でBLASがロードされていないと怒られる

## 環境
- Core i7 12世代
- GeForce RTX 3090Ti 24GB
- `Ubuntu 22.04LTS`
- `Docker`のコンテナ上にGPUをあてて`tensorflow`と`keras`を使用

## 問題
学習しようとしたら…

```bash
023-07-23 14:07:09.037140: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:219] failed to create cublas handle: the library was not initialized
2023-07-23 14:07:09.037177: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:222] Failure to initialize cublas may be due to OOM (cublas needs some free memory when you initialize it, and your deep-learning framework may have preallocated more than its fair share), or may be because this binary was not built with support for the GPU in your machine.
```
BLASがロードされてないよ。とかいわれてます。
メモリは十分あるのに…

## 解決
コンテナ上で`nvidia-smi`が叩けて内容もOKだったので油断してしまいましたが、仮想環境でない方で`nvidia-smi`を叩くと

```
Failed to initialize NVML: Driver/library version mismatch
```

となって、まさかのドライバが～ってなっていました。

https://qiita.com/ell/items/be3d3527b723f70f888d

こちらのありがたい記事にしたがって`nvidia-smi`を叩けるようにしたら、解決しました。
asyncとawaitの基本的な使い方

今回もメモ用。
自分なりの解釈です。

# 概要
asyncとawaitの基本的な使い方です。

とりあえず、以下を書いてみます。
asyncとawaitを使用すると、非同期処理が実装できます。
asyncをつけた関数をコルーチン関数と呼びます。
awaitでコルーチン関数を呼び出してしようします。

# 内容
とりあえず、test1~test3を順番通り実行してみます。

```asyncawait.py
import asyncio

async def test1(num):
    print(num + 10)
    await asyncio.sleep(5)
    print("test1")

async def test2(num):
    print(num + 0)
    await asyncio.sleep(5)
    print("test2")


async def test3(num):
    print(num + 20)
    await asyncio.sleep(5)
    print("test3")

async def main():
    await test1(10)
    await test2(10)
    await test3(10)

asyncio.run(main())
```
以下、実行結果です。
```
20
test1
10
test2
30
test3
```

asyncio.run(main())では、コルーチン関数main()を実行しています。
※asyncio.run()は一時的にイベントループを作成し、そこに引数で指定したコルーチン関数を入れ、
イベントループを実行し、コルーチン関数が終了すると、勝手にループを閉じます。

main関数内でtest1を実行→実行待ち→実行完了→test2を実行→実行待ち→実行完了→test3を実行→実行待ち→実行完了となります。これはawait test1(10)を実行するとmain関数がtest1が完了するまで、その他の処理を受け付けず、
順番通り処理を実行させることができます。


これを、test1実行中にtest2を実行させる場合、並行処理させる必要があります。
その場合、以下の様にします。
```asyncawait.py
import asyncio

async def test1(num):
    print(num + 10)
    #test1の処理を５秒停止します。
    await asyncio.sleep(5)
    print("test1")

async def test2(num):
    print(num + 0)
    #test2の処理を５秒停止します。
    await asyncio.sleep(5)
    print("test2")

async def test3(num):
    print(num + 20)
    #test3の処理を５秒停止します。
    await asyncio.sleep(5)
    print("test3")

async def main():
    #コルーチンをループに追加し、asyncio.Taskを作成。
    exetask1 = asyncio.create_task(test1(10))
    exetask2 = asyncio.create_task(test2(10))
    exetask3 = asyncio.create_task(test3(10))
    #各asyncio.Taskを並列実行しますが、出力は第一引数からとなります。
    await asyncio.gather(exetask1,exetask2,exetask3)

#mainコルーチン関数をループに入れて実行
asyncio.run(main())
```

こうすると、asyncio.run()で一時的に作成したイベントループにasyncio.create_task(tasks)でコルーチンオブジェクトをスケジュールします。await asyncio.gather(exetask1,exetask2,exetask3)で、指定した３つのタスク(exetask1,exetask2,exetask3)の処理が完了するまで、main関数の処理の受付を停止します。

各タスク内で、await asyncio.sleep(5)を実行していますが、これはタスクの処理を一時停止します。
なので、並行処理をしている別のタスクを実行することができます。
そのため、以下のような結果になります。
```
20
10
30
test1
test2
test3
```

# 補足
ループイベントを任意に作成することもできます。
作成した、ループイベントをloop.run_until_complete()で実行します。
```asyncawait-loopevent.py
import asyncio

async def test1(num):
    print(num + 10)
    await asyncio.sleep(5)
    print("test1")

async def test2(num):
    print(num + 0)
    await asyncio.sleep(5)
    print("test2")


async def test3(num):
    print(num + 20)
    await asyncio.sleep(5)
    print("test3")

#ループイベントを作成します。
loop = asyncio.new_event_loop()
#ループイベントをカレントループイベントとして設定します。
asyncio.set_event_loop(loop)

#作成したループイベントに追加し、タスクを作成します。
exetask1 = loop.create_task(test1(10))
exetask2 = loop.create_task(test2(10))
exetask3 = loop.create_task(test3(10))
#コルーチン関数を指定して、最後まで実行します。
loop.run_until_complete(asyncio.gather(exetask1,exetask2,exetask3))
#ループイベントを閉じます。
loop.close()
```

# 参考URL
https://docs.python.org/3.7/library/asyncio-eventloop.html#