OmniAICreator/Qiita-1.07M huggingface dataset:
簡単な音声認識で疑似音声通話

以前ラズパイで音声認識をしようとしたところ日本語の発声がバグって上手くいかなかったので音声ファイルの再生をすることで上手く出来ました。
動画再生・ページ検索・現在時刻・Wikipedia朗読ができます
①MP３ファイルを作成
```py
from gtts import gTTS
from pydub import AudioSegment
from pydub.playback import play

tts = gTTS(text="キーワード",lang="ja")
tts.save("keyword.mp3.mp3")
play(AudioSegment.from_mp3("hello.mp3"))
```
※キーワードの部分は喋らせたい言葉を
　keyword.mp3は好きなファイル名を(.mp3は必須)

②音声認識
```py
from math import inf
import speech_recognition
import pyttsx3
import pywhatkit
import datetime
import wikipedia
from gtts import gTTS
from pydub import AudioSegment
from pydub.playback import play
import time

recognizer = speech_recognition.Recognizer()
speaker = pyttsx3.init()
voices = speaker.getProperty('voices')
speaker.setProperty('voice',100)
wikipedia.set_lang("ja")


def take_command():
    try:
        with speech_recognition.Microphone() as source:
            recognizer.adjust_for_ambient_noise(source)
            voice = recognizer.listen(source)
            commnd = recognizer.recognize_google(voice,language="ja-JP")
            commnd = commnd.replace('聞きたいことは何ですか','')
            print(commnd)
            commnd= text.lower()
            
    except:
        pass
    return commnd

def run_speech():
    try:
        cmd = take_command()

        if '動画' in cmd:
            song = cmd.replace('動画','')
            print(song + "\n")
            tts = gTTS(text = f"{song}を再生します",lang="ja")
            tts.save("song.mp3")
            play(AudioSegment.from_mp3("song.mp3"))
            pywhatkit.playonyt(song,open_video=True)
        
        elif '時間' in cmd:
            time = datetime.datetime.now().strftime('%H:%M')
            print(f'{time}')
            tts = gTTS(text = time,lang="ja")
            tts.save("time.mp3")
            play(AudioSegment.from_mp3("time.mp3"))
        elif 'について' in cmd:
            cmd = cmd.replace('について','')
            result = wikipedia.page(cmd).content
            result = result[:200] + "以下省略"
            print(result + "\n")
            tts = gTTS(text = result,lang="ja")
            tts.save("tell_me.mp3")
            play(AudioSegment.from_mp3("tell_me.mp3"))
        elif '検索' in cmd:
            pywhatkit.search(cmd)
        elif 'こんにちは' in cmd:
            print("こんにちは")
            play(AudioSegment.from_mp3("hello.mp3"))
        else:
            print("もう一度言ってください")
            play(AudioSegment.from_mp3("agein.mp3"))
    except:
        pass
print("聞きたいことは何ですか....\n")
play(AudioSegment.from_mp3("ask.mp3"))
    
while True:
    run_speech()
```
```py
※ elif 'キーボード' in cmd:
            print("キーボード")
            play(AudioSegment.from_mp3("keyword.mp3"))
```
※キーボードの部分は好きな言葉を
　keyword.mp3の部分は①作ったファイルを指定します。
Nginx.confをフォーマットする

## インストール

```
git clone https://github.com/1connect/nginx-config-formatter.git
sudo cp nginx-config-formatter/nginxfmt.py /usr/local/bin/
```

## 使い方

```
nginxfmt.py -b -v /etc/nginx/nginx.conf
```


## 参考
https://github.com/slomkowski/nginx-config-formatter
[react-konva] Next.jsでReactKonvaCore.js not supported.

# [react-konva] **ReactKonvaCore.js not supported.エラーを解決**

Next.jsにてreact-konvaを使おうとしたら、以下のエラーが出ました。

```tsx
**require() of ES Module /Users/~~~/node_modules/konva/lib/Core.js from /Users/~~~/node_modules/react-konva/lib/ReactKonvaCore.js not supported.
Instead change the require of Core.js in /Users/~~~/node_modules/react-konva/lib/ReactKonvaCore.js to a dynamic import() which is available in all CommonJS modules.**
```

こんな感じで、ssrなしのコンポーネントとして設定してあげると解決できます。

```tsx
import dynamic from 'next/dynamic'

const SampleComponent = () => {
	return <NoSSRComponent
      propsA={'sampleA'}
      propsB={'sampleB'}
  />
}

const NoSSRComponent = dynamic(() => import('../../SampleCanvas'), {
  ssr: false,
})
```

このissueを参考に解消しました。

https://github.com/konvajs/react-konva/issues/588
ワードプレスでwebスクレイピング を使って自動投稿するプログラム

自分で色々と開発した機能の保存メモとして残しています。

# 機能概要

・好きなURLの記事一覧から記事情報を取得して、各下層ページ記事のタイトル＆内容も取得する。
・取得した各記事をワードプレスの投稿に入れる（公開or下書き）
・これをcronで時間指定をする
・最後に同じ記事の情報は取得しない。

# 環境
WordPress 5.9.3
PHP7.4.25

# ※思いつきで作ったコードです。
変数名など適当なのでぜひ変えて使ってください。





```php
//スクレイピング関数
//aタグそのまま使えるバージョン
  function my_cron_function()
  {

	  //DB情報
$dsn='mysql:host=ホスト名;dbname=データベース名;charset=utf8';
$user='データベースユーザー名';
$password='パスワード';
	  

	  //スクレイピング用phpQuery読み込み
require_once( __DIR__ ."/phpQuery-onefile.php");
$home = "取得するURLのTOPドメイン";//トップURL
$html = file_get_contents("情報を取得するURLを指定");
$urls = phpQuery::newDocument($html)[".archive > .archive__item > .archive__contents > h2 > a"];

	  
$pdo = new PDO($dsn,$user,$password,[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);//dbに接続する
$f_sql = "CREATE TABLE if not exists `scrap_meta` ( `scrap_id` INT(11) AUTO_INCREMENT PRIMARY KEY, `scrap_url` VARCHAR(255) NOT NULL) charset=utf8 ENGINE = InnoDB";//もし無ければテーブルの作成
	  
$sql = "SELECT COUNT(*) FROM scrap_meta WHERE scrap_url = ? ";//レコードにあるかカウント
$sql2 = "INSERT INTO `scrap_meta` (`scrap_id`, `scrap_url`) VALUES (?,?) ";//レコードに挿入
	  
	  //最初はテーブルの作成
	  $pdo->query($f_sql);
	  
	  foreach ($urls as $url) {
		  $null = NULL;
		  $s_url = pq($url)->attr("href");
		  		  
		  $stmt = $pdo->prepare($sql);
		  $stmt->bindValue(1,$s_url);
		  $stmt->execute();
		  $count = $stmt->fetchColumn();
		  
		  if($count == 0){//カウントしてURLがレコードになければ
  $pq_url[] = $s_url;//URLをそれぞれ配列に格納
			  $stmt2 = $pdo->prepare($sql2);
			  $stmt2->bindValue(1,$null);
			  $stmt2->bindValue(2,$s_url);
			  $stmt2->execute();//取得したURLをレコードに挿入
		  }
}
	  
	  
	  if(isset($pq_url)){//$pq_urlがセットされていれば実行
		  	  
	  foreach ($pq_url as $k_url) {//下層URLでforeachする
		  sleep(5);// 連続実行するとサーバー負荷かかりすぎる5秒待機
  $pq_title[] = pq(phpQuery::newDocument(file_get_contents($k_url))[".dividerBottom > h1"])->text();//下層記事のタイトル
  $pq_content[] = pq(phpQuery::newDocument(file_get_contents($k_url))[".postContents > section "])->html();
}
	  
	  $pq_query = array_combine($pq_title,$pq_content);//配列の結合
	  
	  foreach ($pq_query as $key => $val) {
				   
              $my_postquery = array(
				  'post_title' =>$key,
				  'post_content'  => $val,
				  'post_status'   => 'draft',
				  'post_category' => array(7)//カテゴリー指定
			  );
             // 投稿をデータベースへ追加
             wp_insert_post( $my_postquery );
  }
  }
  }

  if (getenv('CRON') == 'ランダムな文字列' ) {//cronの値が'ランダムな文字列'なら実行
my_cron_function();
}
```

# 自分で設定をする部分①
```php
$urls = phpQuery::newDocument($html)[".archive > .archive__item > .archive__contents > h2 > a"];
```
取得するhtmlのタグを指定していきます。

# 自分で設定をする部分②
```php
$pq_title[] = pq(phpQuery::newDocument(file_get_contents($k_url))[".dividerBottom > h1"])->text();//下層記事のタイトル
$pq_content[] = pq(phpQuery::newDocument(file_get_contents($k_url))[".postContents > section "])->html();
}
```

# 取得するhtmlのタグを指定の方法
例えば以下のようなhtmlがあったとします。
```html
<div class="header">
 <ul>
  <li class="list1"><a href="https://sample.com">テストURL</a></li>
  <li class="list2"></li>
  <li class="list3"></li>
 </ul>
</div>
```

ここで https://sample.com を取得したい場合は
```
["header > ul > .list1 > a"]
```
こんな感じで指定します。
DX(デジタルトランスフォーメーション)でビジネスはどう変わる？

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# DXとは
　DX(Digital Transformation)とは、IT技術により、産業構造や人々の生活をより良いものにすることです。

# DXでビジネスはどう変わる？
__DX__ と言うと __IT化__ と解釈する人もいますが、この2つは意味が大きく異なります。一般的に、DXは __組織横断的(全社規模)な変革__ を指し、IT化は __アナログでしている作業をデジタルに変換する__ ことを指します。つまり、DXとIT化は目的と手段のような関係にあります。
また、DXは主に __柔軟性の向上__ と __時間短縮__ という2つの目的で実施されます。
この2つの観点からビジネスがどう変わるかを見ていきましょう。

1.日本郵便によるドローンでの荷物輸送
輸送コストがかかる地域で、優先的にドローンを用いた輸送を開始しました。ネット通販市場の拡大による物流量の増加に対して、柔軟に対応し運送時間も削減することが可能です。

2.JTBによる外国人向けアプリ開発
アプリから得られる訪日外国旅行者の行動データや嗜好データを分析することで、インバウンド戦略に取り組む企業をサポートすることを目的としています。インバウンドの増加に柔軟に対応するのみならず、今まではアンケート等のアナログで実施していたデータの取得・分析をデジタルに変換することで時間短縮にもなります。

3.NETFLIXによるサブスクリプションサービスの確率
従来は、TSUTAYAやGEOのようなレンタルショップでDVDをレンタルするのが一般的でしたが、DVD配送型のビジネスモデルを破棄し、ビデオ配信という新たなビジネスモデルを確立しました。
このように新たなビジネスモデルを構築することができるのもDXの強みです。

# 終わりに
すこし横道に逸れますが、私の実家が酒屋を営んでいます。今までは居酒屋やBarのような業務店のみを対象に酒類を販売していました。それがコロナの影響もあり飲食店の売り上げが大幅に下がったことから、自社のホームページを開設し、ネットからの注文やお酒のサブスクリプションのようなサービスを開始しました。新しく事業領域を伸ばしたので、それに対応するための増員やSNSでの宣伝等も必要になり多くの苦労がある反面とても楽しそうに仕事をしています。これもITの力を利用してビジネスモデルを変化させているため、DX事例の一つとして言えるでしょう。

最後までお付き合いくださりありがとうございました。
【初心者向け】ローカルでmaildevを立てて、ターミナル（telnet）からメール送信してみる


アウトプットとして。

誤りやもっと良い点などありましたらコメントして頂けると幸いです m(_ _)m
　
※ 操作ログ中の「*****」部分はご自身の名称をお使いください

# 環境

・Mac

```
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H1713
```

　


# maildevをインストール、起動

```
% npm install -g maildev
npm WARN deprecated opn@6.0.0: The package has been renamed to `open`
npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
npm WARN deprecated nodemailer@3.1.8: All versions below 4.0.1 of Nodemailer are deprecated. See https://nodemailer.com/status/

added 118 packages, and audited 119 packages in 7s

3 packages are looking for funding
  run `npm fund` for details

9 vulnerabilities (5 moderate, 4 critical)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
npm notice
npm notice New major version of npm available! 7.19.1 -> 8.4.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.4.0
npm notice Run npm install -g npm@8.4.0 to update!
npm notice

% maildev
MailDev webapp running at http://0.0.0.0:1080
MailDev SMTP Server running at 0.0.0.0:1025
```

github

https://github.com/maildev/maildev
　
　
### 各port

1080　→　web画面参照用のポート

1025　→　SMTP用のポート

　
### SMTPプロトコルとは

SMTPとはメール送信のためのプロトコル。通信ポートは通常25となっている

https://nadesi.com/delphi/winsock/6-1-smtp.htm

今回は **localhost: 1025** がメールの受信するアクセス先ポート



### 流れ

```
telnet ○ ○ 　→　サーバへアクセス
HELO ○ ○ 　→　どういったメールアドレスからの送信であるかを指定
RCPT ○ ○ 　→　そのメールをどこへ送信するかを指定
DATA 　→　これから本文を送る宣言
.（ピリオド）　→　本文の入力終了を宣言
```

# メールを送信

```
% telnet localhost 1025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 *****noMacBook-Pro.local ESMTP
HELO foo.jp
250 *****noMacBook-Pro.local Nice to meet you, [127.0.0.1]
MAIL FROM:<bar@foo.jp>
250 Accepted
RCPT TO:<hoo@gmail.com>
250 Accepted
DATA
354 End data with <CR><LF>.<CR><LF>
From: hoo@gmail.com
Subject: Hello foo!

Hello !

This is sample mail.

.
250 Message queued as Ujw0pQ9B
421 Timeout - closing connection
Connection closed by foreign host.
```

　
すると、、、
　



Display - Plain Text（デフォルト）

![スクリーンショット 2022-01-29 11.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1205416/060da288-842b-9e67-5dff-285c6d19a0ba.png)
　
　
Display - Headers

![スクリーンショット 2022-01-29 11.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1205416/65b07a89-0242-7cd1-0556-6279ea7a02e2.png)


無事メールを確認できました

昔個人で書いた記事でしたが、閉じることとなりせっかくなので残しました。
お読み頂きありがとうございました!!

## ご参考

[telnetでメール送信](http://ash.jp/net/telnet_smtp.htm)

[maildev (SMTP mock server) を使ってハイパーメール開発](https://qiita.com/pocari/items/de0436c39ffc65647cf0)

[telnetでのメールの送信方法(smtpのポートにアクセスする)](http://www.mm-labo.com/computer/linux/mail-telnet-smtp.html)

[MailCatcherでメール送信をテスト](https://qiita.com/pocari/items/de0436c39ffc65647cf0)
100日後くらいに個人開発するぞ！day019

## 今日もHTML＆CSS初級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/87f6c6a9-cba6-a85d-9158-50d3e6c5b5f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/9811db4d-23fc-0a54-2ac9-ca867c947454.png)



## 今日の備忘録

### リストの先頭のマークを消す方法
- （CSS）リスト要素はlist-styleプロパティを用いてnoneを指定することで先頭のマークを消す
    - 例 `li{list-style: none;}`

### 余白を入れる方法
- 要素に余白を入れる場合はpaddingプロパティを用いる
    - 上下左右の全ての方向に同じ幅の余白を入れる場合
        - 全方向に20pxの余白：`{padding:20px;}`
    - 上下左右のそれぞれの方向に異なる幅の余白を入れる場合
        - 上だけ20px：`{padding-top:20px;}`
        - 下だけ20px：`{padding-bottom:20px;}`
        - 左だけ20px：`{padding-left:20px;}`
        - 右だけ20px：`{padding-right:20px;}`
    - [省略形①]上下左右のそれぞれの方向に異なる幅の余白を入れる場合（上から時計回りに指定）
        - 上40px右30px下20px左10px：`{padding:40px 30px 20px 10px;}`
    - [省略形②]上下左右のそれぞれの方向に異なる幅の余白を入れる場合（上下・左右で指定）
        - 上20px右10px下20px左10px：`{padding:20px 10px;}`
Azureの資格８個を２か月で取得した方法

# はじめに
この記事は、一日で書ききれないので、何回かに分けて書いていこうと思います。
２か月でAzureのExpert系２つと、AssociateのAI系を含めて、計８個の資格をどうやって取ったのか。

そこを、個人的なおまとめをしていこうと思います。

# まずは証明
LinkedInのプロファイルからですが、こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242133/599031a3-6d9c-b4a1-6298-6f4de4b556f7.png)

はい、嘘ではないのです。2022/2～2022/4の間に計８個。
といっても、そのうち１つは、MCTの資格ですが。

この取得方法について、キンキンにまとめていきますので、
よろしければストック＆LGTMオネシャス～

Thank you for reading this article!
See you next time!
WSLにてVisual Studio Codeを使用するには


# 概要
wslをwindows上にインストールし意気揚々と開発をしようとすると、.gitフォルダがあるにもかかわらずVisual Studio Codeが認識してくれず困った人はいるだろうか？
別にwslのターミナル上でgitコマンドを叩いてもいいのだが、Visual Studio Codeがそもそも認識してくれてるとエディタ上でステータスを確認出来たりして便利だし、そもそも組み込み機能が使えないなんて、、という失望も感じる。
だがこれに関してMicrosoftは当然？解決策を用意している。そんなもんビルトインで入れとけよと思わなくもないが解決方法を備忘録として記載する。

# 解決策

以下をインストールすればよい。

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

インストールした後にvisual studio codeを再起動し、ターゲットのフォルダを信頼するとgitの機能が使用できる。

# 参考

https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode
PCEPに出題される範囲で間違いやすいところ

<h1>ここが間違いやすい</h1>

<h1>notation（進数）</h1>
02 <font color="red">b</font>in 0<font color="red">b</font>---<br>
08 <font color="red">o</font>ct 0<font color="red">o</font>---<br>
10 dec   __---<br>
16 he<font color="red">x</font> 0<font color="red">x</font>---<br>

<h1>power（べき乗演算子の計算順序）</h1>
2**3**2 = 2**9 = 512　⇒　つまり、右から計算される<br>
(2**3)**2 = 8**2 = 64　⇒　ちなみに、左から計算すると値が異なる 

<h1>計算したら、「.0」がつくかどうか？</h1>
1+1. => 2.0 （つく）<br>
1/1 => 1.0 （つく）

<h1>演算子</h1>
/　商（少数）<br>
//　商（切り捨て）<br>
%　余り<br>
**　べき乗（exponent）<br>
~　ビット反転<br>
&　AND<br>
|　OR<br>
^　XOR（excelだと、べき乗なので、注意！）<br>
<<<　<>　左シフト<br>
>>　右シフト<br>
is　等しい<br>
is not　等しくない（notの位置に注意）<br>
in　含む<br>
not in　含まない（notの位置に注意）<br>

<h1>rangeのデフォルト値</h1>
range(②start[0]、①stop、③step[1]）<br>
引数は、丸数字の順序で解釈される。<br>
省略した場合、[]が初期値として入る。<br>
①stop とあるが、この値は処理しない。<br>
start = stop の時は、何も処理しない。<br>
start+step*n >= stop の時は、何も処理しない。<br>
<br>
例題１　range(10)<br>
range(0,10,1) ⇒ 0,1,2,3,4,5,6,7,8,9<br>
<br>
例題２　range(3,5)<br>
range(3,5,1) ⇒ 3,4<br>
<br>
例題３　range(1,7,2)<br>
range(1,7,2) ⇒ 1,3,5<br>
<br>
例題４　range(5,5)<br>
range(5,5,1) ⇒ start = stopなので、何も表示されない<br>
<br>
例題５　range(5,5,-1)<br>
range(5,5,-1) ⇒ start = stopなので、何も表示されない<br>
<br>
例題６　range(5,0)<br>
range(5,0,1) ⇒ start+step*n >= stopなので、何も表示されない<br>
<br>
例題７　range(5,5)<br>
range(5,0,-1) ⇒ 5,4,3,2,1<br>

<h1>変数のswap</h1>
a,b,c=1,2,3　初期値<br>
a,b,c=c,b,a　swap<br>
a,b,c=c',b',a'　こういう処理がされている<br>
a=3,b=2,c=1　結果<br>
<br>
a,b,c=1,2,3　初期値<br>
a,b,c=a,a,a　右辺は、かぶっても<br>
a,b,c=a',a',a'　こういう処理がされているので<br>
a=1,b=1,c=1　問題ない<br>
<br>
a,b,c=1,2,3　初期値<br>
b,b,b=a,b,c　左辺は、かぶってると<br>
b,b,b=a',b',c'　こういう処理がされているので<br>
a=1,b=3,c=3　問題ない（上書き）<br>

<h1></h1>
<h1></h1>
AzureのCloud ShellでSSH接続先のVMをCodeEditorで操作したかったけどうまくいかなかったのでVSCode経由でSSH

# VSCodeによるSSH設定

AzureでSSHで接続した先のLinux VMのファイルをVSCodeEditorをCloudShellから起動して操作したかったんだけど、なんだかCodeって打っても空ぶるので、致し方なく、VSCodeからSSHで接続して対応した話。

# SSHでの接続手順
1. VSCode起動（ラボ内にインストール済みのVSCode(GUI)を起動）
2. Extensionsにて、「Remote - SSH」を検索してインストール
3. VSCodeにインストールされたサイドパネルから、「Remote Explore」を選択
4. Remote EXPLORERの上部にあるプルダウンにて「SSH Targets」を選択
5. SSH TARGETSと書かれているあたりにフォーカスを当てると表示される「＋」をクリック。画面上部に、Enter SSH Connection Commandという欄が出るので、「ssh ＜ユーザ名＞@＜IPアドレス＞」と入力してエンター。
※＜IPアドレス＞は、VMのIPを調べればOK。
6. Edit Custom SSH configuration fileと出るので、C:\Users\＜ユーザ名＞\.ssh\configを選択
7. 右下に、「Host added!」とでる。
8. ついで、上記5で「＋」を押した場所の右隣に表示される、Configureアイコンをクリックし、「Settings」をクリック
9. Remote.SSH: Config Fileの項に、「C:\Users\＜ユーザ名＞\.ssh\config」と入力
10. REMOTE EXPLORERに表示されている、IPアドレス（SSH接続先）を選択して、右クリックから、Connect to Host in ～のどちらかを選択。
11. 画面が切り替わって、Enter password for ＜ユーザ名＞@＜IPアドレス＞の画面が表示されるので、パスワードを入力
12. VSCODEのEXPLOREを表示して、Open Folderをクリック
13. 自動的に上部にOpen Folderの欄が表示されて、「/home/＜ユーザ名＞/」とうたさるはずなので、そのままOKをクリック
14. 再度パスワードを求められるので、上記11のパスワードを入力
15. これで、SSH先のVM内がVSCodeで触れるようになる。Codeで編集という個所は、この起動しているVSCodeを使って、編集を行っていく（ファイルパスに応じた場所は階層をたどって開く）

図解したいところなんだけど、ちょっとドタバタ中なので、文章でお許しを。

Thank you for reading this article!
See you next time!
Windows上での Emacs の SKK の辞書の設定

SSK 用の辞書をダウンロードして、統合した上で Windows 上の Emacs で利用する手順。忘れちゃうので、自分用のメモ。

# 手順1: 辞書ファイルのダウンロード

`M-x skk-get` で辞書をダウンロードします。以下の辞書がダウンロードできます。

```
SKK-JISYO.assoc
SKK-JISYO.edict
SKK-JISYO.fullname
SKK-JISYO.geo
SKK-JISYO.itaiji
SKK-JISYO.jinmei
SKK-JISYO.JIS2
SKK-JISYO.JIS2004
SKK-JISYO.JIS3_4
SKK-JISYO.L
SKK-JISYO.law
SKK-JISYO.lisp
SKK-JISYO.mazegaki
SKK-JISYO.office.zipcode
SKK-JISYO.okinawa
SKK-JISYO.propernoun
SKK-JISYO.pubdic+
SKK-JISYO.station
SKK-JISYO.zipcode
```

各辞書の説明は [SKK辞書 \- SKK辞書Wiki](http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1) を見てください。

# 手順2: skktools のダウンロード

辞書ファイルは複数のままでも利用できますが、ここでは一つのファイルにまとめてしまいます。これには skktools を利用します。

skktools は [skk\-dev/skktools: SKK dictionary maintenance tools](https://github.com/skk-dev/skktools) にありますが、今は Windows 用のバイナリーが欲しいので、[SKK関係のツール](http://www1.interq.or.jp/~deton/skktool/) のものを利用します。ここから [skktools-20060212.zip](http://www1.interq.or.jp/~deton/skktool/skktools-20060212.zip) をダウンロードして展開します。

この中の `skkdic-expr2.exe` と `skkdic-sort.exe` を辞書を保存したフォルダにコピーする。


# 手順3: 辞書ファイルの統合

コマンドプロンプトを開き、辞書を保存したフォルダに移動します。そして、以下のコマンドを貼り付けて実行します。
```
skkdic-expr2.exe SKK-JISYO.assoc + SKK-JISYO.edict + SKK-JISYO.fullname + SKK-JISYO.geo + SKK-JISYO.itaiji + SKK-JISYO.jinmei + SKK-JISYO.JIS2 + SKK-JISYO.JIS2004 + SKK-JISYO.JIS3_4 + SKK-JISYO.L + SKK-JISYO.law + SKK-JISYO.lisp + SKK-JISYO.office.zipcode + SKK-JISYO.okinawa + SKK-JISYO.propernoun + SKK-JISYO.station + SKK-JISYO.zipcode | skkdic-sort.exe > SKK-JISYO.myjisyo
```
これで上手くいけば、`SKK-JISYO.myjisyo` という辞書ファイルができあがります。

上の統合では、ダウンロードした辞書ファイルから `'SKK-JISYO.mazegaki` と `SKK-JISYO.pubdic+` の2つは除いてあります（この辞書ファイルに登録されているものは使わなそうなので）。

# 手順 4: 文字コードの変換

できた辞書ファイルはそのままだとおそらく euc-jp（か euc-jis-2004）という文字コードになっています。このままでも特に問題ないかもしれませんが、辞書ファイルを utf-8 に変換しておきます。変換には Emacs でファイルを開いて、`C-x ENTER f`で utf-8 を選択して、ファイルを保存する。


# 手順 5: Emacsでの設定

Emacs の設定ファイル（`~/.emacs.d/init.el`）では、以下のように辞書ファイルと辞書の文字コードの設定をおこなう。仮に `SKK-JISYO.myjisyo` ファイルが `~/.emacs.d/` フォルダにあるとすると
```
(setq skk-large-jisyo "~/.emacs.d/SKK-JISYO.myjisyo")
(setq skk-jisyo-code 'utf-8)
```
AWSのRDSでメンテナンスの案内が来た時におまえがすること

ここ最近、AWSのRDSでハードウェアメンテナンスに伴う案内が来たやろうと思う。ここにきたんやったらそうやろう。
そしたらお前がせなあかんことは環境によってわかれるんや。

# シングルAZ
開発環境とかやな。対応は再起動や。この場合は、お前がせなあかんのは以下の４つや。

1. 再起動完了に１０分くらいかかるのを関係者に説明する
1. その間RDSはつかえやんので関係者に同意を取る
1. AWSでの自動再起動か、手作業で再起動するか決める
1. やる

だいたい１０分くらいかかるんで、その間はRDSがつかえへん。それを何とかせえっちゅうスキルとは全く関係ない話をせなあかんちゅう寸法や。
AWSが通知されたメンテナンス時期（ウィンドウと言うやつや）まで待つか、先にRDSのコンソールからメンテナンス適用するかも関係者で決めやなあかんやろな。まぁ、シングルAZは開発環境やろうからどうでもええやろ。

# マルチAZ
本番環境やろな。これもだいたいおんなじや。シングルAZと違ってフェイルオーバが発生する。したがってお前は前項と似たようなことをせなあかん。
1. フェイルオーバに６０秒かかる（AWSの言い分）
1. その間はRDSが使えやんので関係者に同意を取る
1. AWSでの自動フェイルオーバか、手作業でフェイルオーバするか決める。
1. フェイルバックしたいかも関係者で決める。細かいとこやとここまでいるやろ。
1. やる。

# しかし現実はメキシコより非常である

再起動にしろフェイルオーバにしろ、これはRDSの標準仕様や。つまりメンテナンスに限らずいつでも起こりうる。RDSのAWS管理部分で障害があったら起こりうる事象や。
具体的にいうと **お前んとこのアプリケーションは再起動もしくはフェイルオーバが発生しても自動復旧して稼働し続けるように作られとる** のが当たり前っちゅうことや。
また、 **シングルAZやったら１０分、マルチAZなら６０秒のシステム停止は想定内** とシステム仕様がなっとるはずや。
 **つまり前述のお前がやらなあかんことは、システム設計時に決まっとるはずなんや。**
これができてへんともめるし、影響調査になるやろな。 **しらんけど。**
PaizaラーニングのLaravel入門編１をやってみた。

昨日まででPaizaラーニングのLaravel入門編１を全部やってみたので、感想をお伝えしたいと思います。
# 全体的に
プログラミングスクールでコピーアプリをAWSを使いやったあとでの学習だったので、復習にはなったと思います。
# 内容は
Paizaのクラウド環境（PaizaCloud）を使用して、プロジェクトの作成からコントローラの作成・ルーティング・ビューの作成などを通して一行掲示板を作るものです。
# やってみて
コードの記述でやはり細かいミスをしてしまうことがあり、エラーになることがありました。（演習課題）
自分でやるとこんなもんかと思いました。

動画を見ながらの部分は問題ありませんでした。


以上が感想になります。
RaaS ってなに？

## 勉強前イメージ

SaaSとかPaaSとかの仲間？

## 調査

### RaaS とは

Ransomware as a Service の略で、ラースと読みます。
身代金要求型不正プログラムの [ランサムウェア](https://qiita.com/miyuki_samitani/items/3fd9a681bbaf70aba3e1) をサービスとして提供するものです。
ユーザはRaaSを利用してランサムウェアを作成、使用して身代金を受け取ります。
RaaSの利用者はランサムウェアの手間を省く、またサービス提供者は自身の手を汚さずに費用を受け取ることができます。

気軽にRaaSを利用してランサムウェアで攻撃を行うことができるので、最近のランサムウェアの増加につながっています。

### RaaSの対策

RaaSの対策としては、マルウェアの対策と一緒になります。
あくまでランサムウェアを実行する側の話なので
受ける側としては基本的にはOSやソフトウェアのアップデートを行い、セキュリティソフトを導入したりすることが必要になります。

## 勉強後イメージ

全然違ったわ・・・
でもそういうサービスも出来てしまってるのね...

## 参考

- [闇市場とサイバー犯罪：「RaaS」 ランサムウェアのサービス化](https://blog.trendmicro.co.jp/archives/17416)
- [RaaS（Ransomware as a Service）](https://eset-info.canon-its.jp/malware_info/term/detail/00138.html)
NVIDIA RTX Voice を起動すると Initialization failed になる！

# NVIDIA RTX Voice を起動すると Initialization failed になる



NVIDIA RTX Voiceをインストールして、起動しようとすると以下のエラーダイアログが出るようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/6851a92f-aba3-3093-2b7a-f827591a3152.png)

> Initialization failed (no speaker/mic present?)
>
> Please note that currently the application requires a headphone and mic to work
>
> Please check logs for further details (ProgramData/Nvidia Corporation/RTX Voice/log.txt)

メッセージに記載されている `ProgramData/Nvidia Corporation/RTX Voice` フォルダーを確認すると、以下のように、日付ごとのlogファイルが大量にありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/7b0be5bb-efdb-9984-7309-9759ac956456.png)

試しに、一番新しい日付のlogファイルを開くと、以下のような内容になっていました。

```log
2022-05-07,20:59:51: Logging session started
2022-05-07,20:59:51: App version: v0.5.12.6
2022-05-07,20:59:51: Initializing microphone pipeline.
2022-05-07,20:59:51: Initializing effect
2022-05-07,21:00:06: error in nvAudCapCheckDefaultEndpoint
2022-05-07,21:00:06: NvAFXPLUGIN_InitializeEffect failed.
```

どうやら `nvAudCapCheckDefaultEndpoint` という箇所でエラーになっているようです。



# `サウンド` で `Speakers NVIDIA RTX Voice` を有効化する

同じ症状を検索してみると、

 **`サウンド` で `Speakers NVIDIA RTX Voice` が有効にすれば解決する！**

という情報を見かけました。

さっそく、私のPCで確認してみましたが、以下の図のように、 `Speakers NVIDIA RTX Voice` が見当たりませんでした。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/4adf8d69-53ab-71e3-12e2-9e01606f6b89.png)

根気よく調べていくと、とある情報を見つけました。

**`サウンド` を開いた状態で、 `RTX Voice` を起動すると、  `Speakers NVIDIA RTX Voice` が出現する**

その通りやって見たところ、以下の図のように、  `Speakers NVIDIA RTX Voice` が出現しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/f1a83916-a7c1-fe82-444d-8beffda20b89.png)

右クリックしてから有効にしたところ、無事に症状が改善しました！



# さいごに

本記事作成にあたり、以下のサイトを参考にさせていただきました。ありがとうございました。

- [NVIDIA RTX Voice: セットアップ ガイド](https://www.nvidia.com/ja-jp/geforce/guides/nvidia-rtx-voice-setup-guide/)
- [【RTX Voice】Initialization failed Errorの解決方法](https://makise-lab.com/rtxvoice_1/)
- [How to fix NVIDIA RTX Initialization Failed Error & no speaker-mic present issue?](https://digistatement.com/how-to-fix-nvidia-rtx-initialization-failed-error-no-speaker-mic-present-issue/)
- [RTX Voice error fix](https://www.youtube.com/watch?v=27MCs7Xx2aE)
- [【NVDIA】ノイズ除去プラグイン「RTX Voice」インストール＆設定方法](https://game-ru.com/rtxvoice/)
- [NVIDIA RTX Voice トラブル対応。インストールできない/起動するとエラー](https://note.com/shintak/n/n467fb8fbadc2)
jQuery 遅延実行　setTimeout

# はじめに
「この処理を少し遅らせて実行させたい。。。」という時に使う```setTimeout```の使い方を毎回忘れてその都度ググっているので、短い記事ですが、メモとして記述します。

## setTimeout
```javascript
<script>
  setTimeout(function(){
    $("#header").show();   //遅延実行させたい処理
  },7000);                 //何ミリ秒後に実行するか数値を入れる
</script>
```

```function(){}```の```{}```内に遅延実行させたい処理を記述する。
(setTimeout内に複数の処理を書くことも可能。)

``` },7000);  ```　ここの数字の部分が、何ミリ秒後に実行するかの数値。
(1000ミリ秒＝1秒)

## まとめ

イベント内で処理の順番がうまくいかない時等、これを使って無理矢理解決しています。笑
短い記事ですが、どなたかの参考になれば幸いです。
youtube「PASSLABO.....整数問題 基本解法パターン全解説」で合同式を勉強中。

オリジナル 視聴時間1:49:20

https://youtu.be/aZh0LiWyV4c

テキストをダウンロードできます。

# ［16］ １次不定方程式の応用系（中国剰余定理）
youtube解説 1:19:31〜1:25:18です。
「中国人の剰余定理」を参考に、他5通りで計算してみた。

https://qiita.com/mrrclb48z/items/ff978d6cd87e05aa486a

　
　




# §1.大切な前提知識
①割り算の基本定理
wolframalphaで

例1)～例3)

https://www.wolframalpha.com/input?i=mod%2819%2C7%29&lang=ja

https://www.wolframalpha.com/input?i=mod%28-19%2C7%29&lang=ja

https://www.wolframalpha.com/input?i=mod%28-19%2C-7%29&lang=ja

https://www.wolframalpha.com/input?i=%28-19%29+mod+%28-7%29&lang=ja

結果
5
2
-5
-5

②合同式の基本性質
例4)～例6)　勉強中

➂合同方程式の解き方
例7)

https://www.wolframalpha.com/input?i=x%2B3%3D1+mod+8&lang=ja

https://www.wolframalpha.com/input?i=3x%3D2+mod+5&lang=ja

https://www.wolframalpha.com/input?i=4x%3D2+mod+5&lang=ja

https://www.wolframalpha.com/input?i=4x%3D5+mod+11&lang=ja

https://www.wolframalpha.com/input?i=6x%EF%BC%8B2%3D5+mod+9&lang=ja

例8)



# §2.modの利用（余りを求める）
# §4.modの利用した証明（平方剰余）
#### ［10］平方剰余の定番問題


# §5.不定1次方程式の応用(mod)
#### ［14］不定方程式の別解法(mod)

https://www.wolframalpha.com/input?i=37x-90y%3D4+over+the+integer&lang=ja

結果
x = 90 n + 22 , y = 37 n + 9 , n element Z
整数解の例
y = 46 , x = 112
y = 83 , x = 202
y = 120 , x = 292


#### ［15］不定方程式の別解法(mod)

https://www.wolframalpha.com/input?i=22x%2B37y%3D2+over+the+integer&lang=ja

結果
x = -37 n - 10 , y = 22 n + 6 , n element Z
整数解の例
y = 28 , x = -47
y = 50 , x = -84
y = 72 , x = -121

 
 　
 

つづく。
ServiceNowでスクリプトを書きたい時のメモ

ServiceNowでスクリプトを書く時の自分用メモ

テーブルにもしもししたいとき使うおまじない「GlideRecord」
もしもししたテーブルを変数に格納していろいろつけたら便利～というメモ
削除、挿入はあんまり使わないので書きませんでした・・・
「システム定義」＞「スクリプト - バックグラウンド」からお試しできますが、
updateは本当に更新されちゃうので注意です！重いな～と連打すると痛い目を見ました
シングルクォートで行けるときとダブルクォートで行けるときの違いがわかりません・・・怒られたら直してます・・・ﾎｮｮ

|スクリプト|説明|
|:----|:----|
|.addActiveQuery()|アクティブがTrueになっているレコードにのみクエリを発行する|
|.addInactiveQuery()|アクティブがFalseになっているレコードにのみクエリを発行する|
|.addEncodedQuery(String Query)|クエリ内で指定したパラメーター設定でレコードをフィルターする|
|.getRowCount()|行数を取得してくれるオプション|
|.addJoinQuery(‘テーブル名’)|関連テーブルにあるレコードについてフィルターしてくれる|
|.addNotNullQuery(‘カラム名’)|カラム名にて指定した列項目がNullでないレコードのみにフィルターをかける|
|.addNullQuery(‘カラム名’)|カラム名にて指定した列項目がNullのレコードのみにフィルターをかける|
|.setLimit(‘数字’)|数字で指定した数のみ結果を返す。該当レコードが多すぎる場合に使えそう。|
|.setWorkflow(true/false)|ビジネスルールのONOFF設定が可能|
|.orderBy(‘カラム名’)|指定列にて昇順ソートできる|
|.orderByDesc(‘カラム名’)|指定列にて降順ソートできる|
|.update()|更新を反映させる|

↓インシデントリストから優先度1のレコードを抽出してインシデント番号を返すスクリプト
```JavaScript
var gr = new GlideRecord(‘incident’);
gr.addQuery(‘priority’,’1’);
gr.query();
while(gr.next()){
gs.print(gr.number);
}

```
↓addJoinQuery(‘テーブル名’)の使い方
例）インシデントテーブル内で、関連PRBの「優先度が1」となっているレコードを抽出する
```JavaScript
var b = new GlideRecord(‘problem’);
var a =b.addJoinQuery(‘incident’);
a.addCondition(‘priority’.’1’);
b.query();
while(b.next())
{
gs.print(“このPRB番号は：”+b.number);
}
```
↓.update()の使い方
例）優先度１のインシデントレコードにのみ、説明欄を更新する（下記内容だと、既存の説明文の前に「更新されてるよ：」をつける更新をしている）
```JavaScript
var Test= new GlideRecord(‘incident’);
Test.addQuery(‘priority’,’1’);
Test.query();
while(Test.next())
{
Test.short_description =”更新されてるよ：”+ Test.short_description;
Test.update();
}
```
SpringBoot data.sqlの日本語が文字化けするときの対応

## 前提

- MySQL 8
- SpringBoot 2.6.7

## 課題

data.sqlでデータを入れようとしたら文字化けする。

```yml:application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mysqldb
    username: test
    password: test
    driver-class-name: com.mysql.cj.jdbc.Driver
  sql:
    init:
      mode: always
```

```sql:schema.sql
CREATE TABLE IF NOT EXISTS m_motorcycle (
    moto_no int NOT NULL PRIMARY KEY,
    moto_name varchar(20)
);
```

```sql:data.sql
INSERT INTO m_motorcycle (moto_no, moto_name) VALUES (1, 'ばいくめい1');
INSERT INTO m_motorcycle (moto_no, moto_name) VALUES (1, 'ばいくめい2');
```

data.sqlは`UTF-8`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/635b4166-9572-b720-bf64-25f8749e4546.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/da878ec0-552a-d372-d1d6-cab78b0b9d73.png)

## 解決

`sql-init-encoding=UTF-8`を設定追記することで解消できた。

```yml:application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mysqldb
    username: test
    password: test
    driver-class-name: com.mysql.cj.jdbc.Driver
  sql:
    init:
      mode: always
      encoding: UTF-8
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/ad052292-b7f1-efcc-81f9-3ba37dfafad9.png)
Windows 11 に SSH サーバーを立てて公開鍵認証を使う

Linux または macOS のクライアント OS から Windows 11 へ公開鍵認証で接続するケースを想定.

1.  Windows で管理者として PowerShell を実行し OpenSSH をインストール

    ```PowerShell
    # Install the OpenSSH Server
    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

    # Install the OpenSSH Client
    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
    ```

2.  Windows で OpenSSH Server を起動

    ```PowerShell
    # Start the sshd service
    Start-Service sshd

    # OPTIONAL but recommended:
    Set-Service -Name sshd -StartupType 'Automatic'

    # Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
    if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
        Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
        New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
    } else {
        Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
    }
    ```

3.  Windows で OpenSSH デフォルトシェルを PowerShell に変更

    ```PowerShell
    New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
    Restart-Service sshd 
    ```

4.  クライアント OS で公開鍵と秘密鍵を作成

    ```sh
    $ ssh-keygen -t rsa
    ```

5.  クライアント OS から Windows へ公開鍵をコピー

    ```sh
    # Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
    $ scp ~/.ssh/id_rsa.pub username@servername:C:\\ProgramData\\ssh\\administrators_authorized_keys

    # Appropriately ACL the authorized_keys file on your server
    $ ssh username@servername icacls.exe C:\\ProgramData\\ssh\\administrators_authorized_keys /inheritance:r /grant Administrators:F /grant SYSTEM:F
    ```

6.  クライアント OS から Windows へ秘密鍵を用いて接続テスト

    ```sh
    $ ssh -i ~/.ssh/id_rsa username@servername
    ```

参考:
- https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_overview
- https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration
Ruby on Railsのrefileでwrong number of arguments (given 3, expected 2; required keyword: object)が発生したときの対処

Rails初心者大学生です。
https://www.youtube.com/watch?v=uos2mowBrJA
こちらを元に、編集画面にrefileで画像アップロードをしようとした所、上記のエラーが吐かれたので奮闘しました。
再び同様の事態が起きても対処できるようにメモ。

## 環境
Ruby: 3.1.2
Rails: 7.0.2.4

## 原因
https://teratail.com/questions/313718
上記の回答によると、どうやらrefile自体が長らく保守されていないため、現在のバージョンに対応していないらしいです。

## 試したこと
バージョンダウンを試みました。rbenvを利用してインストールし、Gemfileの内容を変更。
Ruby: 2.7.6
Rails: 6.1.3.2

こちらで、「bundle install」を実行すると、
```
Bundler could not find compatible versions for gem "activesupport":
  In snapshot (Gemfile.lock):
    activesupport (= 7.0.2.4)

  In Gemfile:
    turbo-rails was resolved to 1.0.1, which depends on
      actionpack (>= 6.0.0) was resolved to 7.0.2.4, which depends on
        activesupport (= 7.0.2.4)

    rails (~> 6.1.3.1) was resolved to 6.1.3.2, which depends on
      activesupport (= 6.1.3.2)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```
activesupportをrailsのバージョンと一緒にしないといけないらしいです。
なので、Gemfileの末尾に
```
gem "activesupport", "~> 6.1.3.1"
```
を記載して「bundle update」と「bundle install」を行うと、無事installには成功しました。

その後、サーバを立ち上げようと「rais s」を打った所、
```
undefined local variable or method `primary_class' for #<Class:0x00007f9f4c5e01d0> (NameError)
```
というエラーが発生。
https://qiita.com/khinatas3/items/b1970f0c5a54b0234543
こちらの記事を手順通りに進めると、無事バージョンダウンに成功し、refileのエラーも無くなりました。
AWS Certified Developer - Associate（DVA-C01）に合格するまで

先日DVAを取得しました。
取得するまでの流れを書きます。

## 事前の知識
・インフラエンジニア歴７年くらい
・AWS経験は１年くらい
・CLP、SAA、SOA取得済

## 勉強内容
**・総勉強時間：50hくらい（1ヶ月）**
平日は2hくらい、土曜は５hくらい。
直前はさらにがっつりやりました。

いつも思いますが、仕事後はやっぱりきついですね。
頭の回転が鈍いのが明らかにわかるので絶対効率的じゃないです。
早起きできる人は早起きしてやると圧倒的に効率あがると思います。

試験は勉強開始時点で合格者の情報拾って1ヶ月後で予約しました。
この先予約は退路を断つために絶対やった方がいいです。

**・勉強内容①：問題集**
<img width="200" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/c65ad522-6cca-2b74-26cf-c6fb9da96ca7.png">

DVAはポケットスタディが有名ですが、黒本がでてたのでこれを読みました。
いつもどおり、ガッツリは読み込まずさらっと全体を読んで
試験の出題内容を掴んでおく程度です。一般的な読書とかわらないイメージです。

インプットは頭に入りにくいので、時間は最小限にします。
以降、この本は問題集でつまったりしたときの辞書がわりになります。

3,960円とちょっとお高めですが、ボリュームはすごいです。469ページもありました。
内容は良かったのですが、初版ということで表記ミスとかがけっこうありました。
目次がズレまくってるのは辛かったです。買うのは改版されてからがいいかなと思います。

**・勉強内容②：koiwaclub**
いつものkoiwalub神です。３週やりました。

１週目の平均点：59
２週目の平均点：75
３週目の平均点：81

過去の試験の蓄積があるので、最初からそれなりにとれます。
前の試験の資格が生かせるというのはとてもいいですね。

## 試験
前回のテストセンター渋谷が微妙だったので、今回は渋谷道玄坂で受けました。
特別いいということはありませんでしたが、前回の渋谷よりは良かったです。

試験は特につまずくこともなく1時間くらいを残して終了。
序盤は微妙でしたが、後半に進むにつれて確実に解けてる問題が
増えてきたイメージでした。

koiwaでもよく出ましたが、**cognito**はよくでました。
cognitoは問題文から回答を導きやすいのでボーナス的な存在ですね。

いつも受かるか微妙かなぁと思いますが、無事合格してました。
いつも合格ぎりぎりの点数ですが、今回は800点ごえと少し余裕が
あっての合格でした。点数にならない問題が仕込まれているらしいので、
できない問題が多少あってもメンタル崩さなくて大丈夫ですね。

## 最後に
合格はもちろん嬉しいのですが、
会社の人とか友人で受けてる人がけっこういるので、
そういう人たちと会話できることに喜びを感じますね。

最近転職したのですが、そういう環境に入れて改めて本当に良かったなとおもいました！！
こういうコミュニティが生まれるなら資格自体は副産物みたいなものですね。

次はSCSいきます！！
Dockerをcockpitで管理する

# はじめに
　Docker初心者にとってdockerのイメージをインストールしたりコンテナを起動したりするのはめんどｋ・・・難しいことです。
　そこでcockpitで少しでも簡単にdockerを使えないかとするのが今回の記事です

# cockpitとは！
　LinuxをWebインターフェースで監視、管理することの出来るシステムです。
　初期段階ではCPUやメモリ使用量をグラフで可視化してくれたり、エラーログなどログを確認できたり、ネットワークの接続状況だとかファイアウォールの設定だとかを確認できたり、アカウント管理・サービス管理がGUI的に出来たりします。
　他追加機能はアドオンをインストールすることで出来ます。

# Dockerとは！
　開発環境を簡単に構築、配布しやすいことで有名なプラットフォームです。
　コンテナ型と呼ばれる仮想環境をDocker Engine上で立ち上げて、コンテナとコンテナをネットワークで繋ぎ合わせることで理想的な開発環境を作っていきます。
　

# 環境
**2022/05/07**
・Linux CentOS7
・cockpit 195.12.
・Docker 1.13.1

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

```
sudo yum -y install cockpit
```

### Dockerのインストール
　cockpitでDockerコンテナをいじるための。

```
sudo yum install -y cockpit-docker
```

# 使い方

　cockpitのサービスをスタートさせます。

```
sudo systemctl start cockpit
```

　サーバーが再起動してもcockpitが再起動できるよう恒久的な設定にします。

```
sudo systemctl enable cockpit.socket
```

　cockpitのポートは9090なのでファイアウォールのポートを開けてリロード。

```
firewall-cmd --add-port=9090/tcp --permanent
firewall-cmd --reload
```

　サーバーのIPかドメイン名+ポートの9090でURLを書きます。

例

```
https://8.8.8.8:9090
```

　アクセスして次の画面が出てきたらcockpitはちゃんとインストールされているということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/007fe62b-6219-37fd-38b4-40fdf6b35cf9.png)

　CentOS7に追加してるユーザーかrootをユーザー名に。
　パスワードはパスワード。

　ログイン出来ればコンテナタブをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/a27a38a7-f4a5-aa5c-ef7b-26e51bf43dcd.png)

　Dockerの起動をすれば次のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/68e07228-306c-d040-19f0-b7de16d78687.png)

# イメージのインストールとコンテナの起動
　新規イメージの取得をクリック。
　今回は適当にnode.jsでもインストールしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/6fcdac8f-ea77-3963-b9df-fa805e03a85b.png)

　一番上のnodeをクリックしてダウンロードしましょう。
　インストールが出来れば次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/cc6e9d54-9b6b-4f30-a360-141d9dd82e7e.png)

　docker.io/node:latestをクリックすれば次の画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/bb40232d-c667-c56d-65a3-db8ce7487833.png)

　右上にある実行をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/1e45752d-4b07-e0c4-4d04-8f7b3f2f6d2f.png)

　コンテナー名はいつもランダムで出てきます。
　実行をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/9f266d33-eb23-ab6d-208a-0eee5c34346a.png)

　コンテナーにコンテナー名で設定した名前が出てきます。
　これをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/2c075190-72e0-4b9f-888e-aaa350522477.png)

　下のターミナルを一回Enterしてみて>が出ればテストしてみましょう。

```javascript
console.log('test');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/8929f839-4ea7-dbaa-1a21-8aa82c24c00f.png)

　途中でナンカヨクワカンナイヤツが割り込んできますが、気にせず打ち込んでみればちゃんと出力されています。node.jsのコンテナはきちんと起動しましたね。

# 最後に
　Dockerイメージのインストールとコンテナの起動には便利なのですが、Docker-composeみたいなネットワーク構築が何かしら便利になる機能はなかったりします。とっても残念！
　ですが、何だか統合的な開発環境を用意するのに便利そうなImage Builderというものを見つけたので、今度はそれを試してみようと思います。
別アカウントへAMIの共有をしてみた　※コピーではない！

## はじめに

みなさんは、開発用アカウントで作ったAMIを本番用アカウントでも利用したいと思ったことはありませんか？
今回はそういったケースに使える[「AMIの共有」](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/sharingamis-explicit.html)をしていきたいと思います。
この**AMIの共有**を利用すれば、アカウントを跨いでAMIを共有することが出来ます！


---

## 手順

①　移行元アカウント（Account-A）で AMI を作成
②　①で作成した AMI を移行先アカウント（Account-B）に共有
③　移行先アカウント（Account-B）で共有されたAMIからEC2起動
④　③で起動したEC2からAMIの取得

---

## やってみよう

**①　移行元アカウント（Account-A）で AMI を作成**

該当インスタンスを選択→アクション→イメージとテンプレート→イメージを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/999d82aa-0db0-de5f-f6a5-3869dbacfc5f.png)


下記の画面に推移するので、必要内容を記載しAMIの作成を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/e9f08269-182c-14e0-e33c-33a01f5d73e5.png)


<br>
<br>
<br>

**②　①で作成した AMI を移行先アカウント（Account-B）に共有**

AMIの画面より、①で作成したAMIを選択→アクション→AMI許可を編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/e1a738f3-10b7-247d-ecd5-d341789986e7.png)



プライベート→アカウントIDを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/a4aa01d7-19b8-3b3d-5ebb-0b59acf908a2.png)



移行先アカウント（Account-B）のIDを入力→AMIを共有
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/18f6259a-e454-10b8-3d21-f854a2d64747.png)


共有アカウントIDに移行先アカウント（Account-B）が追加されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/019216d7-37e1-b6a6-e103-68d4a6910f4a.png)

<br>
<br>
<br>


**③　移行先アカウント（Account-B）で共有されたAMIからEC2起動**

共有されたAMIを選択→イメージからインスタンスを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/576ef68a-5629-6576-0376-be091fa2809b.png)


画面に沿って情報を記載→インスタンスを作成
<br>


インスタンスが作成されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/dbb3f5db-8f4a-7393-d925-b5d68fde0687.png)


<br>
<br>
<br>

**④　③で起動したEC2からAMIを作成**

該当インスタンスを選択→アクション→イメージとテンプレート→イメージを作成
（①と同様の流れで作成）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/999d82aa-0db0-de5f-f6a5-3869dbacfc5f.png)



作成したAMIを確認し、所有者が移行先アカウント（Account-B）になっていればOK!
<br>

流れとしては、以上となります。


---

## 注意点

③、④の手順を踏まないと、所有者である移行元アカウント（Account-A）からAMIが削除されると、移行先アカウント（Account-B）で共有されたAMIが見れなくなってしまうので注意。
<br>

また移行先アカウント（Account-B）に共有されたAMIを単純にコピーしようとすると以下のような表示がされコピーが出来ません。
理由としては、移行元アカウント（Account-A）となっているからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/512954fb-822c-82ec-4782-6c3129e7ac5c.png)
[firebase]エミュレータfirestoreの変更が反映されない

firestoreを直接変更 => getDoc()でデータを取得した際に変更が反映されない問題に遭遇。

# 原因
firebase.jsonで設定したportとEmulatorの初期化時のportの設定が間違っていた。
```firebase.json
// ...
"firestore": {
    "port": 8089
},
```
```firebase/config.ts
const firestore = getFirestore(app)
connectFirestoreEmulator(firestore, 'localhost', 8088)
```

8088のportが塞がっていてfirebase.jsonを変更したが、config.tsの変更を忘れていた。

なぜかデータは取得できていたので発見に時間がかかった。
謎。キャッシュみたいなのがあるのか？
JXA（JavaScript で書いた AppleScript）で window.confirm(); を使いたい

```javascript
const CONFIRM_RESULT_YES = 0;
const CONFIRM_RESULT_NO = 1;
const CONFIRM_RESULT_CANCEL = -1;

/**
 * JavaScript の window.confirm() のように振る舞う。
 * @param {string} msg ユーザに表示するメッセージ内容。'\n' で改行できます。
 * @param {string} yesButton Yes の意味となるボタン名称（既定は "Yes"）。
 * @param {string} defaultBtn No の意味となるボタン名称（既定はなし）。
 * @param {string} noButton デフォルトにしたいボタン名（既定は Yes ボタン）。
 * @param {string} cancelButton キャンセルボタンにしたいボタン名（既定はなし）。
 * @returns 0: Yes、1: No、-1: Cancel
 */
function confirm(msg,
    yesButton = "Yes",
    noButton = null,
    cancelButton = null,
    defaultBtn = null) {

    let app = Application.currentApplication();
    app.includeStandardAdditions = true;

    let params = {};
    let buttons = [yesButton];

    if (defaultBtn === null) {
        defaultBtn = yesButton;
    }

    if (noButton !== null && noButton !== "") {
        buttons.push(noButton);
    }

    if (cancelButton !== null && cancelButton !== "") {
        if (!buttons.includes(cancelButton)) {
            buttons.push(cancelButton);
        }
        params.cancelButton = cancelButton;
    }

    params.buttons = buttons;

    if (buttons.includes(defaultBtn)) {
        params.defaultButton = defaultBtn;
    }

    let result = {};
    try {
        result = app.displayAlert(msg, params);
    } catch (e) {
        if (e.errorNumber === -128) {
            return CONFIRM_RESULT_CANCEL;
        }
        throw e;
    }

    if (result.buttonReturned === yesButton) {
        return CONFIRM_RESULT_YES;
    }
    else {
        return CONFIRM_RESULT_NO;
    }
}

confirm("続行しますか？", "Yes", "No", "No");
```
OpenAPI(Swagger3.0) ファイル送信APIを記述する

## 本記事で扱うこと
- ファイル送信API(POST)の記述方法(YAML形式)および関連するオブジェクトの説明

## 本記事の構成
1. ファイル送信APIの記述例
1. 記述例を参照しながら、記述の解説
1. openapi.yaml全体の記述例

## 1. ファイル送信APIの記述例
```yaml
# ~~省略
requestBody:
  content:
    multipart/form-data:
      schema:
        type: object
        properties:
          filename:
            type: string
          file:
            type: string
            format: binary
# 省略~~
```

## 2. 記述例を参照しながら、記述の解説
ファイル送信APIにとって、肝となる部分は`content`と`type`です。

まずPOST通信なので、parametersではなく`requestBody`を使用します。

次にcontentについて、通常であれば`application/json`を定義することが多いと思いますが、ファイル送信APIでは`multipart/form-data`を定義します。
このことにより、Swagger Viewerで確認するときにも、動作の確認を行いやすくなります。

最後にfileプロパティのtypeとformatがstringとbinaryになっています。
これはSwagger3.0に(2.0もそうなのですが)fileタイプが用意されていないため、このような記述になっています。
このことは、公式ドキュメントの[こちら](https://swagger.io/docs/specification/data-models/data-types/#file)に記載されています



## 3. openapi.yaml全体の記述例
```yaml
openapi: "3.0.2"
info:
  version: 1.0.0
  title: Qiita Demo File Upload API
  license:
    name: MIT
servers:
  - url: http://api-qiitayou.com/
paths:
  "/fileUpload":
    post:
      tags:
        - "File Upload API"
      summary: ファイルのアップロードを行います
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                filename:
                  type: string
                file:
                  type: string
                  format: binary
      responses:
        200:
          description: レスポンスは省略します
```
JXA（JavaScript で書いた AppleScript）で window.prompt(); を使いたい


```javascript
/**
 * JavaScript の window.prompt() のようなものを実行する。
 * @param {string} msg 表示したいメッセージ。'\n' で改行できます。
 * @param {string} answerDefault 規定の答え（オプション）。
 * @param {string} icon アイコン（("stop" | "note" | "caution")。規定は "note"）。
 * @param {array} buttons 設置するボタン名の配列（既定は "OK" ひとつ）。
 * @param {string} defaultBtn デフォルトにしたいボタン名（既定は "OK"）。
 * @returns 返り値オブジェクト。例：{buttonReturned:OK, textReturned:foobar}
 */
function prompt(msg,
    answerDefault = "",
    icon = "note",
    buttons = ["OK"],
    defaultBtn = "OK") {

    var app = Application.currentApplication();
    app.includeStandardAdditions = true;

    return app.displayDialog(msg, {
        defaultAnswer: answerDefault,
        withIcon: icon,
        buttons: buttons,
        defaultButton: defaultBtn,
    });
}

prompt("お名前を入力してください。", "your name");
```
Gem のクラス継承・モジュール利用を可視化する Gem を作った

# 概要
正確には、可視化しようと頑張る（正確に可視化できるわけではない） Gem 

https://github.com/tommy-012/ancestors_visualization

使い方は、↑ に書いてあるので、気になった人はどうぞ

# きっかけ
別件で、Twitter Gem を見ていて、GitHub ページに[クラス継承の ER 図](https://github.com/sferik/twitter#object-graph)があって、全体感を把握する上でいいいなと

クラス継承だけでなくモジュール利用も可視化できたらなと思い、ancestors 等を使って検討していたらそれっぽいものが出来たので

汎用的に使えるよう Gem にしてみた

# 事例
イメージ湧かない人もいると思うので、既存 Gem（[Twitter](https://github.com/sferik/twitter)）に対して、実行してみた結果を載せる

![twitter_ancestors_20220505113344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627625/9fec0f4a-ed53-195e-9e83-986d0f59c7e7.png)

これは上手く描画できているパターン
Gem によっては、全く描画できなかったり、読み込めないファイルがあったりして不完全だったりする（今後対応は考えていきたい）

# 終わりに
起点となるノードをクラスに絞っていたり、そもそも描画できないこともあるので、その辺りは前提にしてもらえると

全体感を把握したい等、何か使い道を見つけてもらえると嬉しいです
万葉集を読む。検索する。

2020年頃までに、万葉集の解説書を読む予定でいた。

言語関係以外の仕事が積んでいて（詰んでいて）、言語処理の仕事に手が回らなかった。

今日、「おらぶ」という単語を耳にして検索した。

https://www.weblio.jp/content/%E3%81%8A%E3%82%89%E3%81%B6

>おらぶ【叫ぶ】
「菟原壮士(うなひをとこ)い天仰(あめあふ)ぎ叫び—・び地(つち)を踏み」〈万・一八〇九〉

し、し、しまった万葉集の出典がある。

万葉集の資料をまだ購入していなかった。

ネットで検索した。

「万・一八〇九」検索

では、めぼしいものが見つからない。

「万葉集 1809」検索

https://art-tags.net/manyo/nine/m1809.html

ここを開いても、よくわからず。「天」の文字で、このページ内を検索

>血沼壮士 其夜夢見 取次寸 追去祁礼婆 後有 菟原壮士伊 仰天 ■於良妣 ■地 牙喫建怒而 如己男尓 負而者不有跡 懸佩之 小劔取佩 冬■蕷都良 尋去祁礼婆

読み

茅渟壮士(ちぬをとこ)、その夜夢(よいめ)に見、とり続(つづ)き、追ひ行(ゆ)きければ、後(おく)れたる、菟原壮士(うなひをとこ)い、天(あめ)仰(おふ)ぎ、叫(さけ)びおらび、地(つち)を踏(ふ)み、きかみたけびて、もころ男(を)に、負(ま)けてはあらじと、懸(か)け佩(は)きの、小太刀(をだち)取り佩(は)き、ところづら、尋(と)め行(ゆ)きければ、

説明

>菟原(うなひ)は、現在の兵庫県の芦屋から神戸にかけての地にあたるといわれています。

# 参考１

https://www.city.kobe.lg.jp/information/institution/institution/library/arc/items/056.html

>江戸時代頃の武庫郡と菟原郡の地図の一部です。現在の神戸市北区、西宮市の一部に相当します。

# 参考2

https://blog.goo.ne.jp/kuru0214/e/9b52f0efee8accfb74987f758d8a4ee2
>それがもう、とんでもなく大きな声で、おらぶおらぶ。
おらぶ、とは方言で叫ぶと言う意味なのですが、ぼんにぃを
表すのにはピッタリの単語です。
さて、最近のお気に入りの『おらびスポット』は、ロフトの上。
今日も、ノドをひっくり返しておらんでいます。
JXA（JavaScript で書いた AppleScript）で alert(); を使いたい

　なんか「そういうときは `displayAlert` を使うんだよ」という情報ばかりだったのでつくってしまった。

```javascript
/**
 * Javascript の alert() のように振る舞う。
 * @param {string} msg 表示したいメッセージ。'\n' で改行できます。
 * @param {string} icon アイコン（("warning" | "informational" | "critical")。規定は "informational"）。
 * @param {array} buttons 設置するボタン名の配列（既定は "OK" ひとつ）。
 * @param {string} defaultBtn デフォルトにしたいボタン名（既定は "OK"）。
 * @param {string} cancelButton キャンセルボタンにしたいボタン名（既定はなし）。
 * @param {int} givingUpAfter 0 より大きい値を設定すると、その秒数でダイアログを閉じる（既定は 0:閉じない）。
 * @returns 返り値オブジェクト。例：{buttonReturned:OK}
 */
function alert(msg,
    icon = "informational",
    buttons = ["OK"],
    defaultBtn = "OK",
    cancelButton = null,
    givingUpAfter = 0) {

    var app = Application.currentApplication();
    app.includeStandardAdditions = true;

    var params = {
        as: icon,
        buttons: buttons,
        defaultButton: defaultBtn,
        givingUpAfter: givingUpAfter
    };

    if (cancelButton !== null) {
        params.cancelButton = cancelButton;
    }

    return app.displayAlert(msg, params);
}

alert("msg", "informational", ["Yes", "No"], "Yes", "No");
```
UIフローで作成したフローをデスクトップフロー（Power Automate for Desktop）に移行する方法

こんにちわ、[のりじ](https://twitter.com/nori790822)です。

Power Automateは「クラウドフロー（DPA）」と「デスクトップフロー（RPA）」、両方の機能を持つプロセスオートメーションサービスです。
この「デスクトップフロー」は現在「Power Automate for Desktop」という名前ですが、以前は「UIフロー」と言う名前で、仕組み自体が違っていました。

![ui000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/837b0830-87fa-cd52-0a46-854c756bd3f1.jpeg)

以前はこのような画面（Windows レコーダー）で記録をする形でした。

というわけで過去UIフローを作成した事がある場合、Power Automateポータルのメニュー「マイフロー」＞「デスクトップフロー」ページを表示すると、図のようなメッセージが出るページが表示されます。

![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/3cef04fb-936f-82ad-d9e3-9f09cca1c021.jpeg)

置き換え自体はリンク先の公式Docsの通りに進めれば数ステップで完了するのですが…まずその前に「移行したいフローが表示されてないけど？！」というところで地味にハマったので個人的なメモです。

## 1. 置き換える前に

Power Automateポータルのメニュー「マイフロー」＞「デスクトップフロー」ページを表示します。

![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/88d42eca-824e-93ad-fb24-04a2b9b22e28.jpeg)

表示されているメッセージ内でリンクになっている「無料試用版を利用する」をクリックします。  
また、Power Automate for DesktopをダウンロードしていないPCの場合は右上にリンクがあるのでダウンロードしておくのがオススメです。（Windows11はプレインストール済み）
※Power Automate for Desktopを利用するためのライセンスについては確認をお願いします。

![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/e3caaca7-996e-019a-d270-394879e78420.jpeg)

このように、Power Automate for Desktopで作成したものとUIフローで作成したものが両方表示されるようになります。

UIフローで作成したものには注意アイコンとビルド元が「Windowsレコーダー（V1）」になっているので見分けが付けやすくなっています。
置き換えたいUIフロー名をクリックします。

![004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/b5300d73-b780-9360-5aa4-b72285a0d51a.jpeg)

上部の「移行」ボタンをクリックします。

![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/52eeb37d-68ba-f7b1-fbf4-4c2caadc3886.jpeg)
![006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/e1d57a4e-94df-df0a-c4c0-257ef97886d8.jpeg)

表示される画面の「移行」ボタンをクリックし、Power Automate for Desktopを起動するだけ。とっても簡単に移行できます！

## 2. 画面を確認する

![008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/40a2a2fc-f0c0-5d2c-89f2-ac11a17dbc2b.jpeg)

Power Automateポータル画面の「デスクトップフロー」を表示してみると、移行が終わったフローは「Copy of～」という形で表示されるようになります。

![009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/a278703a-cdca-7169-32d2-44f1c59a77f0.jpeg)

Power Automate for Desktop画面でも移行済みのフローが一覧に表示されるようになります。

![007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/bca35991-1364-d378-ed1a-99f7b7ca52c4.jpeg)

MainフローとしてUIフローの形だったものがPower Automate for Desktopの形に自動で移行されています。
ちなみにこのフローはPhotoshopを自動起動するものだったのですが、図の赤枠部分（Photoshopのexeのパス）を修正したら問題なくPower Automate for Desktopでも動きました。

UIフロー時に作成したものを再利用したい場合に活用してみてください。

## 3. 参考

- [Windows レコーダー (V1) から Power Automate デスクトップ フローに移行する](https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/migrate)