OmniAICreator/Qiita-1.07M huggingface dataset:
生成AIやAIを活用したウェブサイト作成・運用のためのガイド

近年、AIの技術は急速に進化しており、ウェブサイト構築においてもその力を借りることができるようになりました。
生成AIやAIを活用することで、効率的なコンテンツ管理やパーソナライズされたユーザーエクスペリエンスの提供など、多くのメリットが得られます。
本記事では、生成AIやAIを活用したウェブサイト構築の手法とその具体的な利点について解説します。

# 1.AIによるコンテンツ生成:
AIを使用してウェブサイトのコンテンツを生成することは、時間と労力を節約するだけでなく、大量のコンテンツを効率的に作成する手段となります。AIは自然言語処理（NLP）技術を使用して、テキストベースのコンテンツを生成します。たとえば、ブログ記事や商品の説明文、ニュース記事など、特定のテンプレートやキーワードを基に自動的に文章を生成することが可能です。生成されたコンテンツは文法的に正確でありながら、自然な文章を作成する能力を持っています。AIによるコンテンツ生成は、ウェブサイトの更新や情報提供のスピードを向上させるだけでなく、一貫性のあるコンテンツを提供することも可能です。

# 2.ユーザーエクスペリエンスのパーソナライズ:
AIはユーザーの行動や嗜好を分析し、個別のユーザーに合わせたパーソナライズされたコンテンツや推奨を提供することができます。ウェブサイトのナビゲーションやコンテンツの表示をユーザーに合わせて最適化することで、ユーザーエクスペリエンスを向上させることができます。たとえば、ユーザーの過去の閲覧履歴や購入履歴を分析し、関連性の高いコンテンツや製品を提案することができます。
また、ユーザーが特定のアクションを実行した場合には、自動的に対応するコンテンツやオファーを表示することもできます。パーソナライズされたユーザーエクスペリエンスは、ユーザーの満足度を高め、売上や顧客ロイヤルティの向上にも寄与します。

# 3.自動化されたデータ分析:
AIは大量のデータをリアルタイムで分析する能力を持っています。ウェブサイトのアクセスデータやユーザーの行動データを解析し、傾向やパターンを把握することで、意思決定のための有用な情報を提供します。たとえば、AIはユーザーの行動に基づいて、どのコンテンツが人気であるかや、どのコンバージョンパスが最も効果的かを特定することができます。これにより、ウェブサイトの改善点や機会を把握し、迅速かつ正確な意思決定を行うことができます。また、AIはデータの可視化やレポート生成も自動化するため、データの解釈や分析にかかる時間を削減することも可能です。

# 4.画像と音声の認識:
AIは画像や音声の認識技術を駆使して、ウェブサイトにおける多様なメディアコンテンツの管理をサポートします。画像認識技術を使用することで、ウェブサイト上の画像を自動的に分類したり、タグ付けしたりすることができます。これにより、検索エンジン最適化（SEO）のための画像の最適化や、画像ベースの検索機能の実装が容易になります。音声認識技術を利用することで、音声入力や音声コマンドによるウェブサイトの操作を実現することも可能です。これにより、ユーザーはより直感的かつ便利な方法でウェブサイトと対話することができます。

# 5.チャットボットと自動応答システム:
AIを利用したチャットボットや自動応答システムをウェブサイトに統合することで、ユーザーの問い合わせに迅速かつ正確に対応することができます。AIは自然言語処理と機械学習の技術を駆使して、ユーザーとの対話をシームレスに行うことができます。チャットボットは、FAQへの回答や問題解決の支援、製品やサービスの案内など、さまざまなタスクを自動化することができます。自動応答システムは、ユーザーからの問い合わせに対して適切な応答を返すことができます。これにより、ウェブサイトの運営者は24時間体制でのサポートやコミュニケーションを提供することができます。

# 結論
AIを活用したウェブサイト構築は、コンテンツ生成、ユーザーエクスペリエンスのパーソナライズ、データ分析、画像・音声認識、チャットボットなどの機能を通じて、効率的で魅力的なウェブサイトを実現する手段です。これらのAI技術は、時間と労力の削減、ユーザー満足度の向上、効果的な意思決定の支援など、多くの利点をもたらします。ウェブサイト構築においてAIを組み込むことで、競争力のあるオンラインプレゼンスを構築し、ビジネスの成果を最大化することができるでしょう。

# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Adafruit_を改造しST7735(パラレル)にイメージを表示する3(160ライン化)(白黒)(ATM0177B5)(フラットケーブル型)





ハード

https://qiita.com/caa45040/items/0593a160613fe6c87a0d


https://qiita.com/caa45040/items/efddba8347efe30039ab


プログラム


https://qiita.com/caa45040/items/5035e9753f8123fa6eb4

![o_cop617.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/78d0a745-2584-3760-ca52-737821b8bf82.jpeg)


変更箇所

設定2を有効化する

```c++


/*
//GPIOの設定1　開始

//GPIO
#define GPIO_A0_P A0
#define GPIO_A1_P A1
#define GPIO_A2_P A2
#define GPIO_A3_P A3

//GPIO
#define GPIO_A0(s) digitalWrite(GPIO_A0_P,s)
#define GPIO_A1(s) digitalWrite(GPIO_A1_P,s)
#define GPIO_A2(s) digitalWrite(GPIO_A2_P,s)
#define GPIO_A3(s) digitalWrite(GPIO_A3_P,s)

#define GPIO_RD_P     GPIO_A3_P //RD=1
#define GPIO_WR_P     GPIO_A2_P //WR=1
#define GPIO_RS_P     GPIO_A1_P //RS=0
#define GPIO_RESET_P  GPIO_A0_P //RESET=1


#define GPIO_RD(y)     GPIO_A3(y) //RD=1
#define GPIO_WR(y)     GPIO_A2(y) //WR=1
#define GPIO_RS(y)     GPIO_A1(y) //RS=0
#define GPIO_RESET(y)  GPIO_A0(y) //RESET=1


#define GPIO_DB7  7
#define GPIO_DB6  6
#define GPIO_DB5  5
#define GPIO_DB4  4
#define GPIO_DB3  3
#define GPIO_DB2  2
#define GPIO_DB1  A5
#define GPIO_DB0  A4

//GPIOの設定1　終了
*/

///*

//GPIOの設定2　開始

//GPIO
#define GPIO_A4_P A4
#define GPIO_A5_P A5
#define GPIO_D3_P 3
#define GPIO_D2_P 2

//GPIO
#define GPIO_A4(s) digitalWrite(GPIO_A4_P,s)
#define GPIO_A5(s) digitalWrite(GPIO_A5_P,s)
#define GPIO_D3(s) digitalWrite(GPIO_D3_P,s)
#define GPIO_D2(s) digitalWrite(GPIO_D2_P,s)


#define GPIO_RD_P     GPIO_A4_P //RD=1
#define GPIO_WR_P     GPIO_D3_P //WR=1
#define GPIO_RS_P     GPIO_A5_P //RS=0
#define GPIO_RESET_P  GPIO_D2_P //RESET=1

#define GPIO_RD(y)    GPIO_A4(y) //RD=1
#define GPIO_WR(y)    GPIO_D3(y) //WR=0
#define GPIO_RS(y)    GPIO_A5(y) //RS=0
#define GPIO_RESET(y) GPIO_D2(y) //RESET=1


#define GPIO_DB7  A0
#define GPIO_DB6   7
#define GPIO_DB5  A1
#define GPIO_DB4   6
#define GPIO_DB3  A2
#define GPIO_DB2   5
#define GPIO_DB1  A3
#define GPIO_DB0   4

//GPIOの設定2　終了

//*/


```
佐久間宣行のずるい仕事術――僕はこうして会社で消耗せずにやりたいことをやってきた

https://www.amazon.co.jp/%E4%BD%90%E4%B9%85%E9%96%93%E5%AE%A3%E8%A1%8C%E3%81%AE%E3%81%9A%E3%82%8B%E3%81%84%E4%BB%95%E4%BA%8B%E8%A1%93%E2%80%95%E2%80%95%E5%83%95%E3%81%AF%E3%81%93%E3%81%86%E3%81%97%E3%81%A6%E4%BC%9A%E7%A4%BE%E3%81%A7%E6%B6%88%E8%80%97%E3%81%9B%E3%81%9A%E3%81%AB%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F-%E4%BD%90%E4%B9%85%E9%96%93-%E5%AE%A3%E8%A1%8C-ebook/dp/B09RWN3VF6/ref=sr_1_1?adgrpid=134854984224&hvadid=658800416601&hvdev=c&hvlocphy=1009255&hvnetw=g&hvqmt=e&hvrand=18324086793972163386&hvtargid=kwd-1711024366037&hydadcr=21804_13467787&jp-ad-ap=0&keywords=%E3%81%9A%E3%82%8B%E3%81%84+%E4%BB%95%E4%BA%8B+%E8%A1%93&qid=1688333255&sr=8-1

本書を手に取った背景
書籍の紹介をみて、人間関係、チーム、マネジメント、企画、メンタルについて書かれていること、また著者佐久間宣行氏のYoutubeチャンネルはよく見ているのがだ、非常に面白いのでこんな人の仕事のやり方はどんなものなんだろうと思い、気になって手に取った。
今のしごとが、企画やマネジメントに直結しているのだが、壁にぶち当たってるのでなにかヒントがほしかった。

本書のテーマ
テレビ東京で培ったノウハウを余すことなく、書いてくれています。たかが仕事だから、もっとずるくやってやろうという、「ズルく」がどうやるのかを学ぶことができます。

個人的なポイント
１，ホウレンソウを使いこなす。
ホウレンソウで共有すべきは、「進捗状況」「優先順位」
上司を不安にさせたり、文句を言わせない、上司の上司に文句を言わせないのが目的。

２，相談のゴールは解決にする
解決できそうな人を選んで相談すべき。なぜあなたに相談したかを伝える。

３，会議は事前準備で出し抜く
その他大勢から抜け出すのが会議。日々の会議が重要。
想定質問に答えられるようにする。必要になりそうな資料は用意する。いつ振られてもいいようにアイデアを練る。前回の会議で話題にあがったら調べて次の会議にもっていく。

４，正しい努力をする
なんとなくでやるのがだめ。仮説をたてて組み立てる癖をつける。

５，リーダーはだれより本気で働け
リーダーが楽しくしていれば、みんなが楽しくなる。

６，空回りを感じたら？
「説明不足」「負担超過」を疑う。メンバーがついてきていないとき。

７，アイデアの出し方
反転法とかけあわせ法

８，企画は仕組みで作る
企画やアイデアは時間を作って捻出するのではなく、時間を作る。仕組み化する。

１番心に残った部分
注力しているタスクの考え方が根本的に違かった。
日々のメール、打ち合わせに追われていたが、会議、アイデア出し、リーダーとしてのあり方、他部署とのコミュニケーションなどをもっと意識する。

今後やれること
・アイデア出しの仕組み化
・会議の取り組み方
・相談のやり方

まとめ
仕事への取り組み方が変えられそうで、非常に良い本と出会えたと思う。
ここにタイムマネジメントの考え方も盛り込めれば、仕事がもっと楽しくなる気がする。
最近、忙しいことのかまけて読書をできてなかったが、やっぱり大事なことだ。
読書も仕組み化したほうがいいのかもｗ
テキストテンプレートのまとめ

[Flowに関するまとめページに戻る](https://qiita.com/Keiji_otsubo/items/55ebc9c634a3216f3990)

------------
+ [lightningフローからの画面遷移](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000075xW6J)

リッチテキストのような中にリンクを埋め込場合には同ブラウザ内に遷移しない

テキストテンプレートのプレーンテキストだとHTMLのタグが使えるみたいです。

新しいテキスト テンプレート リソースを作成し、この HTML コードをプレーン テキスト モードで追加します。

```
<a href="{!RecordLink_Formula}" target="_self">Click here</a>
```

https://salesforcetime.com/2023/02/12/how-to-control-the-target-behavior-of-links-in-flow/


# URLを動的につくる

```
LEFT({!$Api.Enterprise_Server_URL_570} , FIND('/services', {!$Api.Enterprise_Server_URL_570})) & "/lightning/r/Account/"& {!$Record.Id} &"/view"
```

+ [フローでメールを送った際、URLに不要な文字列が入る ★ID18桁★%E2%80%8B/view ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MYvz0)

:::note
どうもURLエンコードされている感じですね。 
メールの本文ですがテキストテンプレート（リッチテキスト）のようですので、URLを直接記入しないで、リンクとして登録してみてください。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3adb059e-bb4b-4239-8930-9dea479039d0.png)

:::

# 解答例

+ [How to create a link to a custom object to an internal user?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bL5ka)

:::note
When using an email template, you need to obtain the ID  ( Onboarding__c.Account__c )  of the related object that specifies the link destination as a formula field .

I want to make a URL from record in a custom object in lightning email template 
https://salesforce.stackexchange.com/questions/400831/i-want-to-make-a-url-from-record-in-a-custom-object-in-lightning-email-template

The base URL can be referenced using the following formula.

```
LEFT({!$Api.Enterprise_Server_URL_600} , FIND('/services', {!$Api.Enterprise_Server_URL_600})) & "/lightning/r/Account/"& {!$Record.Id} &"/view"
```
:::

+ [画面フローで作成した質問への回答をケースの１つの項目にまとめて表示させたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epk8T)

:::note
各質問の結果をテキストテンプレート（プレーンテキスト）に配置してこのテキストテンプレートを使って更新する方法が可能です。

これを使えば改行もできるので、見やすい形で登録できると思います。

テキストテンプレートにその他のリソースの情報を参照するには、差し込み項目を使用します。

https://help.salesforce.com/s/articleView?id=sf.flow_ref_resources_texttemplate.htm&type=5
:::


# できないこと

+ [How can i remove underline from a hyperlink in text template in flow ?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ervcl)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0b6ed5d2-e7e6-f24f-fe6d-f7c47ba703c4.png)
【Ren’Py】ビルド時の設定

:::note info
2023年7月1日時点Ren'Py ver.7.6.0の初心者の覚書。
変なところやもっと効率的な部分があったら教えてください。
:::

# 目的
* Ren’Pyで作成したゲームをビルドする際に確認する内容をメモしておく
# やること
## 動作確認をする
バグがないか・テストのために変更したフラグが残っていないかなどの確認をする。
実装しているすべての言語ですべてのルートを通過するのが理想。

## 画像の設定
画像名と配置場所

①読み込み画面
■DL版
gameフォルダ直下
presplash_background.jpeg
presplash_foreground.jpeg

■ブラウザ版
gameフォルダ同階層
web-presplash.png

②アイコン
■DL版アイコン
gameフォルダ直下
icon.ico

■ブラウザアイコン
gameフォルダ同階層
wmd.ico(512×512以上)

## モバイル版・ブラウザ版に向けたコメントアウト
gui.rpyのMobile devicesについての言及をコメントアウトする
やらないとスマホやブラウザで見たときの画面表示がおかしくなる

## 言語設定を確認する
※起動時に言語選択設定がある人や、デフォルト言語設定に興味がない人は無視して良い手順
```option.rpy  
define config.default_language = "english" #言語設定を英語に変更
```
デフォルトの言語設定が英語になっていることを確認する。
言語設定を日本語にしたい時は該当の記述は削除して良い。
参考ドキュメントは翻訳の[既定の言語](https://ja.renpy.org/doc/html/translation.html#default-language)

config.languageに値を設定した場合は、メインメニューに戻るたびに設定した言語に強制的に戻されるのでセットしないようにしましょう！（自戒

## アーカイブ化の設定を追加する
### アーカイブ化とは？
ゲームを配布する際の画像や音楽ファイルをまとめる処理（たぶん
これをすると画像や音楽ファイルを外部から確認しにくくなる。
参考ドキュメントは配布物のビルドの[アーカイブ](https://ja.renpy.org/doc/html/build.html#archives)

Ren’Pyのデフォルトファイルをそのままビルドすると、以下のように画像・テキストファイル・音楽・フォントなどがユーザーに全て見える状態になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/646d46d2-166c-cbc7-274a-8537a24841b0.png)
↑こんな

その状態でゲームを配信サイトにアップロードすると、ゲーム内容のネタバレをしていたり知らないうちに再配布禁止の素材を再配布したりしている可能性があるので、そのような意図がない限りはアーカイブ化をした方がいいような気がします。

### アーカイブ化の設定
gameファイル直下のpng・jpgファイルをアーカイブしたい場合はoption.rpyのビルド設定(160行目くらい)の以下の項目のコメントアウトを外す
``` diff_python
    ## アーカイブ（書庫化・暗号化）したいファイルは 'archive'（または任意の文字
    ## 列）に分類します。

-    # build.classify('game/**.png', 'archive')
-    # build.classify('game/**.jpg', 'archive')
+     build.classify('game/**.png', 'archive')
+     build.classify('game/**.jpg', 'archive')
```
画像をキャラクターごとにフォルダを分けている/フォント・音楽もアーカイブしたい時はそれぞれに合わせた設定を同様の書き方で追加する。
私の場合は以下の設定でした。
``` option.rpy
    build.classify('game/**.png', 'archive') ### png画像
    build.classify('game/images/**.png', 'archive') ### game/images直下のpng画像
    build.classify('game/images/yuri/**.png', 'archive') ### game/images/yuri直下のpng画像
    build.classify('game/images/bg/**.png', 'archive') ### game/images/bg直下のpng画像
    build.classify("game/**.rpy", "archive") ### rpyファイル
    build.classify("game/**.rpyc", "archive") ### rpycファイル
    build.classify("game/audio/**.mp3", "archive") ### game/audio直下のmp3の音楽ファイル
    build.classify("game/audio/**.ogg", "archive") ### game/audio直下のoggの音楽ファイル
    build.classify("game/**.mp3", "archive") ### mp3の音楽ファイル
    build.classify("game/**.ttc", "archive") ### ttcのフォントファイル
    build.classify("game/**.ttf", "archive") ### ttfのフォントファイル
```

アーカイブ化する際にもそれぞれ音楽ファイルは音楽ファイルにまとめた方が良いらしいけど、今はよくわからないので全部archiveに突っ込んでいる。
参考URLは以下
[Ren'Py memo ビルド設定](https://renpymemo.hateblo.jp/entry/2023/06/30/182117)
[非プログラマのRen'Pyメモ：ビルド（パッケージング）の基本とポイント](https://note.com/akutaba/n/n98485c649e71)

gameフォルダ直下がこんな感じでスッキリしたらアーカイブ化成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/5820a486-d27d-9bb1-85a4-ea2de597943f.png)
※presplash_*.pngはアーカイブ化されないらしいです。[Ren'Py memo 読み込み中のバーを表示する（PC版のみ）](https://renpymemo.hateblo.jp/entry/2021/08/21/173322)

# まとめ
とりあえずあとはランチャーでビルドすれば大丈夫です。
のちのちやらないといけないことに気付いた場合は加筆していきます。
【Unity】DissolveShader

## 概要
じわーっと消えてくエフェクトです。
![Dissolve.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112894/c10518a6-18b3-5927-c8a1-c410846cbd20.gif)

消したい画像にノイズ画像を組み合わせると実現できます。
今回はPerlinノイズを使用しました。

## 実装
```
Shader "Custom/Dissolve"
{
    Properties
    {
        [HDR]
        _BaseColor ("Color", Color) = (1, 1, 1)
        [HDR]
        _EdgeColor ("Dissolve Color", Color) = (0, 0, 0)
        _MainTex ("Texture", 2D) = "white" {}
        _DissolveTex ("Dissolve Texture", 2D) = "white" {}
        _AlphaClipThreshold ("Alpha Clip Threshold", Range(0, 1)) = 1
        _EdgeWidth ("Dissolve Margin Width", Range(0, 1)) = 0.01
    }
    SubShader
    {
        Tags {
            "RenderType"="Transparent"
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderPipeline"="UniversalPipeline"
        }
        LOD 100

        Pass
        {
            Name "ForwardLit"
            Tags { "LightMode"="UniversalForward" }

            Cull Off
            Lighting Off
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Varyings
            {
                float2 uv : TEXCOORD0;
                float4 positionHCS : SV_POSITION;
            };

            half4 _BaseColor;
            half4 _EdgeColor;
            sampler2D _MainTex;
            sampler2D _DissolveTex;
            half _AlphaClipThreshold;
            half _EdgeWidth;

            CBUFFER_START(UnityPerMaterial)
            float4 _MainTex_ST;
            float4 _DissolveTex_ST;
            CBUFFER_END

            Varyings vert (Attributes v)
            {
                Varyings o;
                o.positionHCS = TransformObjectToHClip(v.positionOS.xyz);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            half4 frag (Varyings i) : SV_Target
            {
                half4 edgeColor = half4(1, 1, 1, 1);

                half4 dissolve = tex2D(_DissolveTex, i.uv);
                float alpha = (dissolve.r * 0.2 + dissolve.g * 0.7 + dissolve.b * 0.1) * 0.999;
                
                if (alpha < _AlphaClipThreshold + _EdgeWidth && _AlphaClipThreshold > 0)
                {
                    edgeColor = _EdgeColor;
                }
                if (alpha < _AlphaClipThreshold)
                {
                    discard;
                }
                return tex2D(_MainTex, i.uv) * _BaseColor * edgeColor;
            }
            ENDHLSL
        }
    }
}
```

## あとがき
ノイズ画像によってエフェクトががらっと変わるので色々試してみるのがいいかもしれません。
細かいノイズより大雑把なものの方が見た目良さそう:thinking:

参考にしたリンク
https://qiita.com/JunNishimura/items/14b3ae3f80c9098aeb5a
https://zenn.dev/r_ngtm/books/shadergraph-cookbook/viewer/recipe-dissolve
YouTubeDataAPIでライブ配信の開始日時を取得したい

## はじめに
YouTubeDataAPIの`Videos::list`を使って特定のアーカイブの配信開始日時を取得しようとしたところ、想定と違う値（配信開始日時の前日）が取れてしまいました。
これまでにも想定と違う値が取れるケースがたまにあったため、改めて配信開始日時の取得方法を調べました。

## 前提
APIキーの取得など、APIを使う準備ができていること。

## 結論
`liveStreamingDetails.actualStartTime`を取得する。

## 調査した内容
### 間違っていた方法
`snippet.publishedAt`を取得する。
```json:parameter
"part": "snippet"
"fields": "snippet/publishedAt"
```

上記の場合、配信枠を取った日時が取得されてしまいます。
時間を空けて再度実行すると日時が配信終了の数時間後になっていることも確認したので、配信終了後にエンコードが完了した場合にも更新されるのかもしれません。

### 正しい方法
`liveStreamingDetails.actualStartTime`を取得する。
```json:parameter
"part": "liveStreamingDetails"
"fields": "liveStreamingDetails/actualStartTime"
```

上記の場合、配信開始日時が取得されます。
`liveStreamingDetails`の子要素には他にも便利な情報が格納されています。

| プロパティ名 | 概要 |
|:--|:--|
| actualStartTime | 配信開始日時 |
| actualEndTime | 配信終了日時（配信終了まで取得できない） |
| scheduledStartTime | 配信開始予定日時 |
| scheduledEndTime |  配信終了予定日時（未設定の場合は取得できない） |
| concurrentViewers | 同時接続数（配信中のみ取得できる） |
| activeLiveChatId | チャット欄のID（配信中のみ取得できる） |

## 公式ドキュメントを読めば良いのでは？
今回調べてわかったことですが、公式ドキュメントでも日本語は英語に比べてかなり**情報が古い**です。
試しにそれぞれのページに記載されている`videos`リソースの表現をWinMergeで比較してみた画像を以下に掲載します。
（左：日本語ページ　右：英語ページ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927120/3b7f871c-b094-447f-3013-69bfcb02094e.png "差分")

正直なところ、誤訳程度ならともかくここまで違いがあるとは思ってもみませんでした。
公式ドキュメントでも油断せず原典をあたるようにしようと改めて思いました。

## 参考
[YouTubeDataAPI Videos (jp)](https://developers.google.com/youtube/v3/docs/videos?hl=ja "YouTubeDataAPI Videos (jp)")
[YouTubeDataAPI Videos (en)](https://developers.google.com/youtube/v3/docs/videos?hl=en "YouTubeDataAPI Videos (en)")
SES新人向けの記事を書いてみようかしら

**まだ執筆中のもので、随時更新します。気になる点あったらコメント欄にてどうぞ**
last update: 2024/01/03

# お断り
ここに書かれた内容は過信せず、あくまで「参考程度」にして頂ければ良いかもしれません。

SESとは、客先常駐をメインにリモートワークも含めるシステムエンジニアのことだと、本稿では主にこれを前提に話を進めていきます。

筆者自身も専門家でもベテランエンジニアでもなく、ただのそこら辺に居るサラリーマンなので、言ってることが間違っている可能性もございますので、そういった場合はコメント欄にてお知らせ頂けると、後から来た方の参考にもなりますので非常に助かります。何卒よろしくお願い申し上げます。

# 目次
1. 役立ちリンク集
2. よくある質問
3. 余談話

# 1.役立ちリンク集

## 調べもの
https://wa3.i-3-i.info/
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

佐々木さんマジ神。あそこまで噛み砕いて説明できるのは言葉のセンスを感じるわ。テキストじゃなくてもコメディとして読んでも普通に面白い記事が多い

https://www.infraexpert.com/

CISCOのコマンドや設定とかよく忘れるので、いつも世話になってます

## 情報収集
https://chat.openai.com/

ほぼ説明不要のChatGPT大明神。こいつが何年も早く誕生していたらもっと多くの新人ちゃんの心が救われたはず（わりと本気）


https://www.bing.com/search?q=Bing+AI&showconv=1
Bing AI （ ~~要ChroniumコアEdgeブラウザ~~2024時点でChromeでOKになっている  、要Microsoftアカウント）

ChatGPT（GPT-3.5）と違いこちらのGPTモデルのバージョンが新しい（GPT-4）
ChatGPTと比べこちらは画像の生成やより人間的な感情表現が入った回答が返ってくるが、
コードやコマンドの生成には不向きの印象


https://www.reddit.com/
筆者はユーザー登録も質問もしたことないが、 Google検索で"Site:reddit.com+聞きたいこと"で何か手掛かりになりそうなものが出たりする時がある
https://ja.stackoverflow.com/
同上、Google検索で"Site:stackoverflow.com+聞きたいこと"で何か手掛かりになりそうなものが出たりする時がある



## 余った時間を使ってお勉強

https://linuc.org/textbooks/linux/

資格取得のためのテキストにも使える

https://lpi.or.jp/lpic_all/linux/

Linuxを学ぶ際つかう

## ちょっと便利なツール
https://regex101.com/

正規表現をちゃんと書ける自信がないのでいつも世話になってます

https://www.deepl.com/translator

翻訳。ページ丸ごと翻訳はChrome自前のやつでほとんど十分だが、細かい表現の確認とかはこちらで

# 2. よくある質問

Q. 職場の人間関係が上手くいく方法は何ですか？

A. 一言で答えるのが難しいですが、一般論で答えますと、まずはしっかり挨拶をしましょう。そして連絡は密に行いましょう。自分が絶対正しいと思わず、常に議論の余地を持たせながら会話をしましょう。上司に理不尽なこと言われても過度に落ち込まず、その場乗り切ってから、別の機会にストレスを発散しましょう。それでも人間関係が上手くいかない場合は諦めましょう。人間関係が良好は望むところではあるが必須条件ではないのでそういうもんだって思えばいいのです。

ちなみに、いい本がありますのでこの場を借りて紹介したいと思います。

最強のエンジニアになるための 話し方の教科書 単行本 – 2019/1/19、亀山 雅司

こちらの本は、エンジニアの仕事をこなしていく上で、よく出くわす場面が盛りだくさん紹介されているので、そこの対応方法や理由を読めば、自分の立ち回りが分かってくると思います。

（その他、コメント欄にて募集しております！是非！）

# 3. 余談話

Q. 職場で怒鳴ったりものをわざと机の上に叩き込んだり音を立てたりしてる方がいて気が散るんですがどうしたらいいですか？

A. ハイプレッシャーな場面ですね。気持ちはすごくわかります。それもSESとしてやっていく上でいつか必ず遭遇する場面ですから、今のうちに慣れておくとしか申し上げることないですね。ちなみに、私が世話になった本を紹介しましょう。

ITエンジニアのためのハイプレッシャー下での対応術 単行本 – 2011/4/13、鳥山 康見

上記の本はほとんど答えを言ってるようなものなので、非常に参考になりますので是非ご一読頂けたらと思います。
<cloudflare d1>✘ [ERROR] The supplied SQL string contains no statements

cloudflare の d1 を使おうとしたがschemaがmigrateできない問題に遭遇。
しかも本番の d1 だと通るが `--local` にするとなぜかうまくいかない

# 問題
```bash
wranlger d1 execute <db> --local --file=./schema.sql

...

✘ [ERROR] no such column: test

If you think this is a bug then please create an issue at https://github.com/cloudflare/workers-sdk/issues/new/choose
```


```schema.sql
CREATE TABLE IF NOT EXISTS Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    last_login DATETIME
);

INSERT INTO Users (username) VALUES ("test");

```

# 解消
Insert values のダブルクオーテーションがダメなようです。

これでok
```schema.sql
INSERT INTO Users (username) VALUES ('test');
```


# その他
ちなみに Insert を消してもうまくいかない?
```schema.sql
CREATE TABLE IF NOT EXISTS Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    last_login DATETIME
);
```

これだけだと
```bash
✘ [ERROR] The supplied SQL string contains no statements
```

# まとめ
ダブルクオーテーションは識別子(カラム、インデックスなど)として認識されるようで文字列リテラルはシングルクオート使おう！

これはsqlite独自なのか？ormに甘えたい。

# 参考
https://www.javadrive.jp/sqlite/type/index4.html
何かいうと優しい言葉を返してくれて英語の勉強にもなるLINEBotの作成例


LINEBotで半分は優しさ、半分はポジティブなメッセージを、
優しい言葉をくれる機械的な優しさのLINEBotの作成方法を紹介します。
大学入試の時は英語は得意だったとしても社会人ブランクで英語が読めなくなってきていたので、最近のリスキリングにあたって英語復習もしたく、勉強ツールも兼ねます。


【作業手順】
lesson:1
LINE Developersアカウントを作り、LINEボットを作成・管理します。
![スクリーンショット 2023-07-03 004259.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478355/aa3092c6-5856-9702-99b6-3974354951f4.png)


lesson:2
Makeというノーコードで自動化が行えるツールを使用します。
![Make_TOP画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478355/e6eed986-44f0-8b9a-8458-56a7a78b4e83.png)


lesson:3
HTTPとJSONを組み合わせて、色々なことができます。
APIよっては、一意やオウム返しの他、ランダム返しもあると学びました。
なので今回はランダム返しでやってみました。
![スクリーンショット 2023-07-02 232110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478355/cb524376-6d67-05d0-c7e5-0237a11918c2.png)
このGoogle Translateを分岐させた状態でつなぐかで自問自答に。
技術面というよりはアイデア面で、何をしたいの？と要件定義で自問自答です
こんな場合は取り合えず色々作ってみれば良かったかと内省。

動作確認
<blockquote class="twitter-tweet">
<a href="https://twitter.com/ah540627/status/1675537284249317377?s=20
"></a>
</blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script

今後の課題
・テキスト以外に心に優しい画像をつけれないか。
・語尾など話し言葉を、壱百満天原サロメ様のようなお嬢様言葉で明るく和訳できないか。
　ツンデレやヤンデレも良く見かけるので、ランダムにカオスにできないか。
・そもそもChatGPTで良いのではないか。なのでChatGPTにない機能をつけれないか。
・いやいやChatGPTが機能革新しているのだから利用しない手はないのではないか。
OpenCVの動画のフレーム取得エラー「error while decoding MB 〇 〇, bytestream 〇」

## はじめに
表題の通り、PythonのOpenCVを使って動画からフレームを読み込んだ時でデコード中にエラーが発生しました。
調査しても解決したというような内容がないので、とりあえず私が対処した方法を共有しようか思い、投稿してみました。
「私、同じようなことが起きてこんな対処したよ」なんてことがある人が入ればコメントを残して頂けると幸いです。

## エラー内容
#### 環境
- Ubuntu 20.04
- Python 3.8

#### 実行したソースコード
以下のソースコードは解析のため最低限まで減らしたソースコード。この状態でも発生する
```ruby:python
import cv2

cap = cv2.VideoCapture('動画パス')

whlie cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
```

#### エラー文
> <font color="red">missing picture in access unit with size104922
> Invalid NAL unit size (-1378577636 > 104918)
> Error splitting the input into NAL units.
> cabac decode of qscale diff failed at 20 128
> error while decoding MB 20 128, bytestream 15066</font>

#### 読み込んだ動画
- MP4の4K動画

## 事象
3万フレームの動画を1枚ずつ読み込み、500フレームのデコード中にエラーが発生し、cap.read() の戻り値retが Falseとなり終了する。
発生している事象は以下のイメージでデコードが発生するとcap.read()を実行しても次のフレームに移動しないような仕様になっているようで終了する。。
![スクリーンショット 2023-07-03 010954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/4155fcc8-e0b7-4b41-4c8a-dda4eff09dfa.png)
そのため、処理するフレームが残っている場合は読み込むフレームをセットする処理を追加する。
以下のようなイメージの仕様になる想定。
![スクリーンショット 2023-07-03 010905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/a41feec5-5288-2f15-50d9-d85496197b07.png)



## 対策
今回困ったことに残りの2万5500フレームが読み込まれずに終わることが問題。その対策が以下の通り。

```ruby:python
import cv2

cap = cv2.VideoCapture('動画パス')

for i in range(cap.get(cv2.CAP_FROP_FRAME_COUNT)):
    ret, frame = cap.read()
    if not ret:
        if cap.get(cv2.CAP_PROP_POS_FRAMES) < cap.get(cv2.CAP_PROP_FRAME_COUNT):
            cap.set(cv2.CAP_PROP_POS_FRAMES, i)
            continue
        break
```
上記のように書き込むことで、途中で終わることがなくすべてのフレームを読み込むことができる。
簡単な話ではあるものの、読み込みができないと次のフレームに移動しないこと知らないと対策も思いつけないこともあるので解析は大切ですね。
この対処法ではデコード中のエラーがなぜ発生しているかが分からないことも問題点は残っているので要調査ではあります。
TimelineでMarkerを配置するためのTrackを作る

Markerを配置できる場所には、TimelineのMarkerTrackとGameObjectをバインドしたTrackの２つがある。

後者を使うことでGameObjectを個別に制御できる

```INotificationReceiver```を実装したクラスを```TrackAsset```クラスを継承したクラスの```TrackBindingType```属性に設定すればいい

例えば、全てのリストに設定したゲームオブジェクトをアクティブにするには以下の通りに書く
通知を受け取る側は、MonoBehaviourを継承しているのでGameObjectに対してどんな処理でもできる

```csharp
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class CustomMarker : Marker, INotification
{
    PropertyName INotification.id { get; }
}
```

```csharp
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

public class CustomReceiver : MonoBehaviour, INotificationReceiver
{

    void INotificationReceiver.OnNotify(Playable origin, INotification notification, object context)
    {
        if(notification is PlatoonEncounter marker)
        {
            Activate();
        }
    }

    public List<GameObject> gameObjects = new List<GameObject>();

    void Activate()
    {
        gameObjects.ForEach(_ => _.SetActive(true));
    }
}
```

```csharp
using UnityEngine.Timeline;

[TrackBindingType(typeof(CustomReceiver))] // この属性でどのゲームオブジェクトが通知を受け取るか指定できる
public class CustomTrack : TrackAsset {}   // クラス名がTrackの名前になる
```
【Golang】Echoのテンプレートレンダリングでちょっとはまった話

https://echo.labstack.com/guide/templates/#template-rendering
上記を参考に実装したがInternal Server Errorが出てしまってちょっぴりつまずいたところの記事。

## 結論だけ知りたい人向け
```c.Render(http.StatusOK, "index", nil) // no data passed```
で本来"index.html"として指定すべきところを"index"として指定していた。
indexとして指定するのであれば、表示させたい箇所(基本的には対象のファイルの全部だと思うが)を
{{define "index"}}と{{end}}で囲む必要があった


## ソースコード
フォルダ構成はこんな感じ
├─public
│  └─views
│    └─ index.html
└─main.go

ソースコードはそれぞれ以下のように記述

main.go
```
package main

import (
	"html/template"
	"io"
	"net/http"

	"github.com/labstack/echo/v4"
)

type TemplateRegistry struct {
	templates *template.Template
}

func (t *TemplateRegistry) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
	return t.templates.ExecuteTemplate(w, name, data)
}

func main() {
	e := echo.New()

	// Initialize a new template registry and register all html templates
	reg := &TemplateRegistry{
		templates: template.Must(template.ParseGlob("public/views/*.html")),
	}
	e.Renderer = reg

	e.GET("/", func(c echo.Context) error {
		return c.Render(http.StatusOK, "index", nil) // no data passed
	})

	e.Logger.Fatal(e.Start(":1323"))
}
```

index.html
```
<!DOCTYPE html>
<html>
<head>
    <title>Welcome Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>
```

## 解決までの流れ
最近は詰まるとChatGPT君に質問しているのだが、質問したところ
```
	e.Debug = true // enable debug mode
```
を挿入するとデバッグ表示が出るということで、上記を挿入して実行
```
{
  "error": "html/template: \"index\" is undefined",
  "message": "Internal Server Error"
}
```
やはりテンプレートのレンダリングの部分で指定がおかしそう。
"index"の指定がおかしいのかと思って該当箇所を以下のように修正したところ、意図通りにページが表示された。
```
return c.Render(http.StatusOK, "index", nil) // no data passed
```
独自ドメインからEC2へのアクセス問題とその解決法

## この記事について
今回は、AWSのRoute53で取得した独自ドメインを使ってEC2内のWebサーバーへアクセスする際に詰まったことを備忘録として残しておきます。

## やりたいこと、前提条件・環境など
AWSのアーキテクチャは画像の通りです。
EC2内ではウェブサーバーのnginxを、アプリケーションサーバーのpumaを使っています。
<img src="https://github.com/junpei314/RealWorld/blob/main/documents/RealWorld.png?raw=true" width="500">


## 詰まったこと
下記のページを参考に取得した独自ドメインをEC2インスタンスにルーティングしました。
[トラフィックを Amazon EC2 インスタンスにルーティングする Amazon Route 53 の設定](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)
設定を終え、独自ドメインで検索したところ、「このサイトにアクセスできません」とブラウザに表示されアクセスすることができませんでした。

## 試したこと
- nslookupコマンド
    - `nslookup ドメイン名`を実行し、名前解決されるか確認。
    →名前解決されている。
- セキュリティグループの設定
    - EC2に設定されているセキュリティグループにおいてHTTPやHTTPSからのトラフィックが許可されているか確認。
     →しっかり設定してある。
- ブラウザのキャッシュを削除
    - ブラウザが古いDNS情報をキャッシュしている可能性を考えて、キャッシュを削除。
     →改善されず。
- Railsのホスト認証の設定
    - インスタンス内のRailsアプリのproduction.rbに以下のコードを追加した。
```config/environments/production.rb
  config.hosts << "独自ドメイン"
```
成功！うまく表示されました。
## エラーの原因
ドメイン名をRailsの設定に追加していなかったため、ドメインからのリクエストがブロックされていたことが原因でした。
以下の記事を参考に解決しました。
[サルでもできる!? Rails6 のアプリをAWS EC2にデプロイするまでの全手順](https://qiita.com/take18k_tech/items/5710ad9d00ea4c13ce36)


## まとめ
今回はRoute53で取得した独自ドメインを使ってEC2インスタンスにアクセスする際に詰まったこと、試したこと、解決方法をまとめました。
AWSを使ってアプリケーションを始めてデプロイしました。学ぶことが多く大変でしたが、無事アプリケーションへの独自ドメインを使ったアクセスができて大満足です。


## 参考文献・URL
[トラフィックを Amazon EC2 インスタンスにルーティングする Amazon Route 53 の設定](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)
富士登山中に通信速度測ってみた

# はじめに
2023/7/1(土) - 7/2(日) 、富士登山に行ってきました。
夏休みの自由研究的に、登山中に通信速度を測ってみたので、結果をまとめます。

# 前提
■ 登ったルート
　吉田ルート

https://www.fujisan-climb.jp/trails/yoshida/index.html

■ 筆者のスマホの契約
　povo2.0

https://povo.jp/

■ 通信速度の計測に利用したページ
　[https://fast.com/ja/](https://fast.com/ja/)

https://fast.com/ja/

# 結果
### 1合目（富士スバルライン入口）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/753c8c20-a8e8-3996-18f8-124fc32040f5.png)
普通に遅い。

### 2~4合目
遅すぎて計測不能。
そもそも速度の計測ページに繋がらない。
2合目~4合目くらいまでこんな感じ。

### 5合目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/6353c896-ca1d-c993-d289-a49952000ae9.png)
ちょっと遅いし、繋がりにくい。
若干ストレスを感じる。
![LINE_ALBUM_230702.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/49d05570-a162-55c7-3e99-638c828a8fd4.jpeg)

### 6合目
すみません、計測忘れてました🙇‍♂️

### 7合目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/db83f051-6e9d-595b-6519-e7a3cba9e5eb.png)
5合目より早い、、だと、、
![LINE_ALBUM_230703.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/718d6a44-588d-eea1-1d61-03c626087819.jpeg)



### 8合目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/6ccd5cb4-d0a4-9048-5dd9-cdd04c9b0171.png)
だんだん速くなってる。なぜ。


### 9合目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b4c8e888-90c4-89a8-0198-b8011e09e634.png)
普通に繋がる。
Twitterへの画像投稿もストレスなくできた。

### 山頂
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/e3811041-4ccd-3872-7b55-75c814289a84.png)
思ったより速い。
ていうか疲れ果ててそれどころではない。
![LINE_ALBUM_230703_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/e3dba4cd-c047-94d9-7626-7a038d1f1b6a.jpeg)


# 終わりに
山開きの日に富士登山してきました。
思ったより普通にTwitterとか使えました。
なんでこんな結果になったのか、基地局の場所とか調べて考えようと思ったんですが、疲れたので寝ます😪
【Mac】アプリのBundle Identifierの取得方法


## `Bundle Identifier`の取得方法

次のコマンドを実行することでアプリの`Bundle Identifier`を取得できます。

```terminal
lsappinfo info -only bundleid "アプリ名"
```

```terminal
$ lsappinfo info -only bundleid "Google Chrome"
"CFBundleIdentifier"="com.google.Chrome"
```

また次のコマンドでも取得できます。

```terminal
osascript -e 'id of app "アプリ名"'
```

```terminal
$ osascript -e 'id of app "Safari"'
com.apple.Safari
```
Flutterで、Columnの中にListViewを入れた時のエラーの解消方法

## エラー内容

~~~
The following assertion was thrown during performResize():
Vertical viewport was given unbounded height.
~~~


## やりたかったこと

リストの上に文字を表示するために、
Columnの中に、TextとListViewを入れる。

![Screenshot_20230702_195404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661656/f1324e9c-017f-942a-b5a0-e4d38b7db3b4.png)


## 解決策

ListViewを Expandedで囲む。

## 参考にさせていただいたサイト

https://qiita.com/umi_mori/items/fb7b67a5c5bb3dda927e
PSD(Professional Scrum Developer)資格の取得体験

# 概要
(PSD取得時点：2023/05)
[PSD(Professional Scrum Developer)](https://www.scrum.org/assessments/professional-scrum-developer-certification)とはスクラムフレームワークを使い、品質が良いソフトウェアの開発などに関する知識を証明する資格です。

今回はScrum.orgのPSD試験を受け、PSDの資格を取得できました。合計準備時間は10~15時間が十分かと思います。


# この記事を読む対象の方
- PSD(Professional Scrum Developer)の資格を取得したい方
- Scrumに興味がある方

# 資格取得する必要があるか

個人的な意見は、資格取得の申し込み費用をあまり気にしていない方なら、ちょうどスクラムを勉強した場合、ついでに取得するのは良いと思います。

# 勉強方法

## ステップ1
まず、Scrum.orgのサイトにある[Scrum Guide](https://www.scrum.org/resources/scrum-guide)の内容を一度通り読み終わって、[模擬試験](https://www.scrum.org/open-assessments/scrum-developer-open)を試してみてください。
[他の言語](https://scrumguides.org/download.html)と[日本語のScrum Guide](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)もありますが、試験は英語のみになります。試験を受ける際に翻訳ツールを使っても大丈夫ですが、Scrum.orgの指示に従ってください。


## ステップ2
[Scrum Developer Open](https://www.scrum.org/open-assessments/scrum-developer-open)と[Scrum Open](https://www.scrum.org/open-assessments/scrum-open)の各模擬試験は10分以内に完成し、95%以上正解すれば、良いかと思います。

また、間違えたところを深く勉強した方が良いと思います。
自分はTDD(Test-Driven Development)とBDD(Behavior-driven development)が詳しくないので、色々調べて勉強しました。

## ステップ3

Udemyの[Professional Scrum Developer I (PSD I) Practice Tests Exams](https://www.udemy.com/course/professional-scrum-developer-i-psd-i-practice-exams/)は実際の試験と似ていて、とても役に立つと思います。
※このコースはExam Dumpではないことが書いてあります。
※関連のスクラム書籍を読むのも良いかと思います。


# 結論

試験は60分内に80問を解く必要があるので、あまりゆっくり考える時間がないと思います。
四つの選択肢がある質問では、一つの選択肢まで絞るのは難しい問題が多いので、基本定義の質問の点数を絶対確保する必要があると思います。

また、資格を取得する予定がない方でも、Scrum Guideでスクラムの内容の勉強になるので、ぜひ読んでください。
ARC163回答メモ

0.はじめに
　昨日はレートを落としたので挽回できるといいなと参戦。
　A・Bが順調に解けたので、気持ちよく週末を終えられました。

　気になるレート変動は・・・
　+68と大幅アップで803に。
　ついに緑コーダーとなりました。来週には落ちてそうだけど・・・。


1.A - Divide String
　問題を一読して、2個以上と言ってるが、3個以上に分割する意味はないな。
　と気づき、以下のいずれかを満たす文字列が作れるかどうかで判定可能と判断。

　条件１）
　　先頭の文字より、辞書順で大きいアルファベットが使われているか？
　　→使われていれば、その前で区切れば、辞書順昇順を満たす文字列が2つ作れる。
　条件２）
　　先頭の文字と同じアルファベットが使われている場合、先頭からその文字の直前までの
　　文字列①と、その文字以降の文字列②を比較し、①の方が、辞書順で小さいか？
　　→小さければ、その前で区切れば、辞書順昇順を満たす文字列が2つ作れる。

　文字列を、先頭から見ていき、条件１・２いずれかを満たす文字があればYes
　なければNoを出力して終了としました。

　考慮漏れの条件等無いか心配でしたが、特に無く、AC頂けました。

　https://atcoder.jp/contests/arc163/submissions/43186855

2.B - Favorite Game
　問題を一読して、A[0]とA[1]を操作してよいなら、この二つを操作する一択だなと思いました。
　問題文では、Aの一つ目の要素はA1としてますが以下では、0始まりインデックス表記にします。

　考え方
　　・リストAのA[2]～A[N-1]から、M個を選んだ時、その数字達をA[0]とA[1]の間に挟むために
　　　A[0]からマイナス1とA[1]へプラス1をそれぞれ何回すればいいかを求める。

　実装
　　【変数】
　　　・変数S　　：頻繁に使うためA[0]をセットして保持
　　　・変数L　　：頻繁に使うためA[1]をセットして保持
　　　・リストL2 ：リストAから、A[2]～A[N-1]をセットし、昇順ソートしたリスト
　　　・リストL3 ：L3[0]には、L2[0]～L2[M-1]が、S~Lの間に収まるための
　　　　　　　　　 操作数をセットする（このリストを埋めるのがメインロジック）
　　【ロジック】
　　　1）変数S・L・リストL2に上記説明に従い値をセット
　　　2）以下を0～N-M-2まで繰り返し(インデックス変数i)
　　　　(L2リストを読み、iからM個抽出した場合のSとLの操作数を求める)
　　　　2-1)L2[i](M個抽出した際に最小の数字)をSと比較
　　　　　2-1-1)L2[i]がS以上の時、SS(Sを操作する回数の変数)に0をセット
　　　　　　　　(操作する必要が無いため)
　　　　　2-1-2)L2[i]がSより小さい時、SSにS-L2[i]をセット
　　　　2-2)L2[i+M-1](M個抽出した際に最大の数字)をLと比較
　　　　　2-1-1)L2[i+M-1]がL以下の時、LL(Lを操作する回数の変数)に0をセット
　　　　　　　　(操作する必要が無いため)
　　　　　2-1-2)L2[i+M-1]がLより大きい時、LLにL2[i+M-1]-Lをセット
　　　　2-3)L3にSS+LLを追加
　　　3)min(L3)を出力して終了

　思いのほかすっきりと実装できました。

　https://atcoder.jp/contests/arc163/submissions/43192931

以上
AndroidStudioファイルのパッケージ場所を変更する

Androidの開発でファイルのパッケージ場所を変えたい時に変更する方法です。

今回は`com.example.myapplication`から`com.example.myapplication.hoge`に変更してみます。


変えたいファイルで右クリックをします。
![スクリーンショット 2023-07-02 23.24.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/de07f601-610e-889c-7b66-a0db67dbcd39.png)

画像のようにRefactor -> Moveをクリックします。

To packageに移動先を記載します。
File nameに移動させたいファイルを記載します。
![スクリーンショット 2023-07-02 23.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/df3b7fca-3aa3-75de-6a83-49205fd715bc.png)

右下にRefactorのボタンがあるのでクリックしたら移動します！
Pytrhonで10進数の緯度経度からメッシュコードを計算する

# プログラム作成の経緯(概要)
Javascriptのライブラリ[Leaflet](https://leafletjs.com/ "leaflet")(WebMap)と[筆ポリゴン](https://www.maff.go.jp/j/tokei/porigon/ "筆ポリゴン")(農地区画データ)を利用して、Web上で圃場ごとに栽培管理を行うようなシステムを作ってみたいと思って作ってる中で、**緯度経度からメッシュコードが分かると便利だよね**という場面があったので作ってみました。 いろいろな記事を参考にしながら作ってみたのですが、間違っている部分があったらご指摘ください。

# 目次

[やりたい事](#やりたい事)
[実装](#実装)
[53394525が東京なのか検証する](#53394525が東京なのか検証する)
[まとめ](#まとめ)
[参考](#参考)

# やりたい事
東京 経度 :   35.6894
　　 緯度 :   139.6917
今回は東京の緯度経度を参考に、入力として(35.6894,139.6917)を与えてあげると 12345678に様な**３次メッシュコード**が返ってくる

# 実装
今回は3次メッシュコードを求めることを前提にプログラムを作成しています。
```Python
def calc_mesh3dim_from_latlng(lat,lng): 
    dim1_12 = int(round(lat*60,5)/40)
    dim1_34 = int(round((lng-100),5))
    dim1_12_mod = round(((round(lat*60,5)/40)-int((round(lat*60,5)/40)))*40,5)
    dim1_34_mod = round(round((lng-100),5)-int(round((lng-100),5)),5)

    dim2_1 = int(round(dim1_12_mod/5,5))
    dim2_1_mod = round(((dim1_12_mod/5)-int((dim1_12_mod/5)))*5,5)

    dim2_2 = int(round(dim1_34_mod*60/7.5,5))
    dim2_2_mod = (round(dim1_34_mod*60/7.5,5)-int(dim1_34_mod*60/7.5))*7.5

    dim3_1 = int((dim2_1_mod*60/30))
    dim3_1_mod = round((dim2_1_mod*60/30-int(dim2_1_mod*60/30))*30,5)

    dim3_2 = int((dim2_2_mod*60/45))
    dim_3_2_mod = round((dim2_2_mod*60/45-int(dim2_2_mod*60/45))*45,5)

    # print(f"{dim1_12}{dim1_34}{dim2_1}{dim2_2}{dim3_1}{dim3_2}")
    return int(f"{dim1_12}{dim1_34}{dim2_1}{dim2_2}{dim3_1}{dim3_2}")

#　検索エンジンで　[東京　緯度経度]と検索した際にヒットした緯度経度を引数に設定しています。
print(calc_mesh3dim_from_latlng(35.6894,139.6917))
## [出力] 53394525
```

# 53394525が東京なのか検証する
出力された3次メッシュコード"53394525"が東京なのか検証するために以下のサービスを使わせていただきました。
**標準地域メッシュ検索アプリ**
https://www.arcgis.com/apps/instant/lookup/index.html?appid=ec8abf80f76c4417b01561e303ed2d32

上記のサービスを利用して検証してみた結果
53394525は東京都庁辺りの区画であることが分かりました。
計算が正確にできているみたいでよかったです（汗）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492783/5a4e047d-d96e-3881-e541-c6ec103c3146.png)

# まとめ
緯度経度からメッシュコードが分かると便利な場面があったので作ってみました。
初めての投稿なので、分かりずらい点や間違っている点が多々あるかもしれませんが、その際はご指摘いただけると幸いです。

# 参考
作成したときに参考にしたページが見つからなかったので、当時見たものと似た記事をいくつか載せておきます。

https://museum.bunmori.tokushima.jp/ogawa/map/meshtolatlon.html

https://shanari-shanari.com/2022/03/20220305_techs_01/
JP1/AJS3-Managerについて

# はじめに
私が案件先で、JP1/AJS3-Managerを使用しているので、JP1/AJS3-Managerがどういうものなのか、どんなことができるのかまとめてみました。

# JP1/AJS3-Managerとは
JP1/AJS3-ManagerはJP1の実行管理プログラムでAgent機能も有するものになります。
実際にできることは以下になります。

・ジョブの実行条件を設定できる。
・先行ジョブが正常終了して後続ジョブを実行する。
・複数のジョブを並列実行して、全てのジョブが正常終了して後続ジョブを実行する。
・ジョブの保留(指定の時間になったら動くジョブを動かなくさせる)ができる。
・ジョブの実行中止ができる。
・特定のフォルダにファイルが作成されたらジョブを実行する。
・複数のサーバにまたがってジョブフローを組める。

# JP1ユニット種類について
JP1のユニット定義については以下になります。

① ジョブグループ
ルートジョブネットを階層管理するフォルダのことをジョブグループといいます。ジョブグループには、カレンダーや基準日、基準時刻を設定することができます。

② ルートジョブネット
実行登録を行う単位のジョブネットです。ルートジョブネットは、スケジュールや保存世代数、多重起動の設定などができます。

③ ネストジョブネット
ルートジョブネット配下に置かれたジョブネットです。JP1/AJS3-View画面上では、ジョブネットエディタ画面やジョブネットモニタ画面の[ジョブネット]アイコンを指します。
ネストジョブネットは、デフォルトではルートジョブネットと同じスケジュールで動作しますが、個別のスケジュールを設定することも可能です。
④ ジョブネット
ジョブを階層管理するフォルダのような役割を持つものをジョブネットといいます。ジョブネットには2種類あり、それぞれ「ルートジョブネット」「ネストジョブネット」といいます。

⑤ ユニット
ジョブやジョブネット、ジョブグループの総称です。

# おわりに
最後まで読んでいただきありがとうございました！！
JP1/AJS3-Managerを使用していくと業務で色々な作業が自動化できるのでは、と考えれるようになって楽しいです。
JP1/AJS3-Managerでジョブの作成はまだ行ったことがないので、次回はジョブの作成についても記事にできたらなと思います！
JP1/AJS3-Managerについて参考にしたリンクを以下にまとめておきます。
[【JP1/AJS3】入門編！JP1の基本用語を理解しよう！](https://www.ashisuto.co.jp/jp1blog/article/202201-ajs3.html)
CMDでフォルダ全体の領域と残り容量を知るダサい方法

# 空き領域だけ
## 呼び方いろいろ
フォルダサイズだけ
というか
フォルダ容量
というか。
ディレクトリサイズ
というか。
ディレクトリ領域
というか。

## 空き容量（空き領域）だけ
例えば 
```bat
Dir C:\%Userprofile%\
```

とすると

```text
2023/06/30  00:09    <DIR>          .
2023/06/21  00:00    <DIR>          ..
------------------------
20XX/0X/XX  00:00    <DIR>          S
20XX/0X/XX  00:00    <DIR>          V
               0 個のファイル                   0 バイト
              XX 個のディレクトリ  XX,XXX,XXX,XXX バイトの空き領域
```

ということは、タイムスタンプを消すといいわけです。
タイムスタンプはコロンがあります。
コロンを含まなければいい。
`D:\hoge`に出力する。

```bat
@echo off
CD /D "C:\%USERPROFILE%"
dir  | find /v":" > D:\Hoge\PartitioSize.txt
@echo on
```

そうすると
```text
               0 個のファイル                   0 バイト
              XX 個のディレクトリ  XX,XXX,XXX,XXX バイトの空き領域
```
ここだけ表示されます。

# 使用量を知る
今度はこれに`/S`オプションを加えます。
```bat
dir /s | find /v":"
```

```text
           ------------------
          (大量に出る）
          14 個のファイル             239,770 バイト
          (大量に出る）
　　　　　　　　｜
　　　　　　　　｜
           ------------------
           XXXXX 個のファイル     XXX,XXX,XXX,XXX バイト <-使用しているサイズ
           XXXXX 個のディレクトリ  XX,XXX,XXX,XXX バイトの空き領域
```

これはALT+ENterで表示されるプロパティの
サイズ
ディスク上のサイズ
とは一致しない。
[ファイルなどの「サイズ」と「ディスク上のサイズ」の違いは？](https://infinity-i.co.jp/support/1711/)

```bat
@echo off
CD /D "C:\%USERPROFILE%"
dir /S | find /v":" > D:\Hoge\PartitioSize.txt
@echo on
```

しかし、こうすると存在するサブフォルダをカウントするため最後の２行だけが必要なのに、やたら長くなってしまう。
しかし、最後の２行だけ出力する方法が思いつかない。
なお、今回は数字だけなのでUTF-8で出す必要はない。
また、UTF-8で出すとファイルの容量が大きくなる。

# ネットワークフォルダ
また、ネットワーク上のフォルダについて結果は取得できるときがあるが、エラーが表示される場合がある。
この時のネットワーク上のフォルダは `S:\`など割り当てられているかPushDで割り当てた場合に`CD`が有効となる。
`CD /D "\\Server\name"`
などという書き方はできない。

# やっぱりバッチファイルはUTF-8だと動かない
今のテキストファイルはデフォルトがUTF-8になっている。（メモ帳も）
一度新規作成して、あとで文字コードをANSIに変える必要がある。
活性化関数まとめ


- ### ステップ関数

数式 $$f(x)=
\begin{cases}
 0, (x < 0)　\\\
 1, (x\geqq0)\\\
\end{cases}
$$


実装とグラフ

```python
import numpy as np
import matplotlib.pyplot as plt

# ステップ関数
def step_function(x):
  return np.array(x > 0, dtype=np.int64)
  
x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
  
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
```
![Pasted image 20230702214418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/099443df-fdba-b509-2275-b8f1b78c2686.png)



- ### シグモイド関数

数式
$$f(x)=\frac{1}{1+\exp(-x)}$$

実装とグラフ

```python
#　シグモイド関数
def sigmoid(x):
　return 1 / (1 + np.exp(-x))


x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)

plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
```

![Pasted image 20230702221824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/a97f8c58-ddb5-7897-b7fa-00d46101dbd8.png)


- ### ReLU関数（ランプ関数）

数式
$$
f(x)=
\begin{cases}
0, (x \leqq 0) \\
x, (x > 0)
\end{cases}
$$

実装とグラフ

```python
# ReLU関数
def relu(x):
 return np.maximum(0, x)


x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)

plt.plot(x, y)
plt.ylim(-0.1, 5.0)
plt.show()
```
![Pasted image 20230702222601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/c0a4a7a1-1390-e06c-4859-4146f739c521.png)

- ### 恒等関数
あらゆる入力値を、全く同じ数値に変換して（＝そのまま）出力する関数。

式

$$f(x)=x$$
実装とグラフ

```python
# 恒等関数
def identity_function(x):
 return x

x = np.arange(-5.0, 5.0, 0.1)
y = identity_function(x)

plt.plot(x, y)
plt.ylim(-5.0, 5.0)
plt.show()
```
![Pasted image 20230702223824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2107276/9113e58e-0bb0-fad9-20ea-b66c581c83ab.png)

- ### ソフトマックス関数
式
$$f_i(x)=\frac{exp({x_i})}{\sum _{k=1}^n exp({x_k})}$$
実装（グラフは省略）

```python
def softmax(a):
 c = np.max(a)
 exp_a = np.exp(a-c)
 sum_exp_a = np.sum(exp_a)
 y = exp_a / sum_exp_a
 return y
```
初！Vue.js勉強はじめてみた。with ChatGPT

普段はWordPressのエンジニアとして活動していますが、フロントエンドの技術を知りたいと思って、Vue.jsの学習に挑戦することにしました。そして、ついでに、ChatGPTを使いながら学習の試行錯誤しようと思っています。

最初にVueの公式ドキュメントを読んだのですが、ちょっとなにそれ分からないという単語が出るたびにChatGPTを使ってみました。けっこうレベル低いこと聞いてます。

最初は、「プログレッシブフレームワーク」です。分からなかったので聞いてみました。
『ChatGPTによると、「プログレッシブフレームワーク」とは、フレームワークのコア機能を基本としながら、必要に応じて追加の機能を"プラグイン"として組み込むことができるフレームワークのことを指します。』
ん？わかりづら。
もう一度聞いてみると、『開発者が基本的な機能から始めて、その後でより高度な機能やツールを追加していくことができる』。これならわかりそうです。既存のコードをほんの一部から入れ替えができて、拡張できるってことですかね。

さらに、Vue.jsの魅力の一つとして「宣言的にデータを DOM に描画することを可能」とありました。この表現も少し難しいです。宣言的とは、結果をどのように得るかを指定し、そのプロセスをフレームワークに任せる手法を指すそうです。ん、宣言的？
『「宣言的にデータを DOM に描画する」という文は、Vue.jsがHTMLのテンプレートを使用してデータをウェブページに表示する方法を説明しています。これにより、JavaScriptのデータが変更されると、Vue.jsがその変更を検出し、対応するHTML要素を自動的に更新します。』とのこと。
要するに、HTML側は変更しないで、データを変更することで制御しようということですね。

そして、「リアクティブ」という言葉も出てきました。このリアクティブとは、データの変更が自動的に画面に反映される特性を指します。つまり、プログラムがデータを追跡し、何か変更があるとすぐに画面を更新してくれるのです。
うん、これはわかりますね。
一応、”小学生に分かるように説明をお願い”したところ、『ネットのお買い物サイトで、買い物かごに商品を追加すると、合計金額がすぐに更新されるよね。これも「リアクティブ」の一例だよ。』とのこと。
「小学生向けに説明を求める」のは、わかりやすくて使えそうだなと思いました。

まずは概念の理解からなかなか詰まっていますが頑張ろうと思います。
ChatGPTを使って深掘りするのがよい選択なのかすら分からないですが、試行錯誤したいと思っています。
何かいいプロンプトを発見したいなと意気込んでいますが、はてさて。

明日からはToDoアプリを作ることにすっ飛びたいと思います。
途中途中で深掘りできたら、今後も書いていきたいと思います。
現在の作業branchをmasterにmarge

作業ブランチをmasterにpushする作業です。
忘れやすい作業なので自分でわかるようにまとめてみました。

```ruby 
$ git add.
"変更したいファイルをローカルのインデックスに追加"

$ git commit -m "Finish 〇〇ファイル"
"インデックスに追加したファイルをローカルリポジトリに反映"

$ git checkout master
"マージさせたいファイルに移動(今回だとmasterブランチに反映させたい)"

$ git pull origin master
"リモートリポジトリのmasterのファイルの最新状態をローカルファイルに反映"

$ git merge practice
"反映させたいbranchの名前でmerge(今回だとpracticeブランチ)"

$ git push origin main
"反映させたファイルをリモートリポジトリに反映"
```
間違いや不明点あれば意見お待ちしております。
rails モデル間の関連付け　命名規約とオプション

# はじめに
モデル間の関連付けについてまとめます


## 基本の命名規約

・外部キーのカラム名は「参照先のモデル名を単数系にしたもの」＋「_id」
・belong_toに指定する名前は、モデル名の単数系
・has_manyに指定する名前は、モデル名の複数形

#### 実際の書き方

```car.rb
class Cser < ApplicationRecord
  has_many :wheels
end
```
```wheel.rb
class Wheel < ApplicationRecord
  belongs_to :car
end
```

### 外部キーを変更したいとき
foreign_keyオプションを使用する
***foreign_key: "変更したいカラム名"***

```car.rb
class Cser < ApplicationRecord
  has_many :engines, foreign_key: "vehicle_code"
end
```
```engine.rb
class Engine < ApplicationRecord
  belongs_to :car
end
```
通常パターンはengineモデルにのみ```car_id```が存在する
今回のパターンでは両方のモデルに```vehicle_code```カラムが存在するということ


#### 関連付けで使われるメソッド名を変更したいとき
class_nameオプションを使用する
***class_name: 変更したいメソッド名***
```car.rb
class Cser < ApplicationRecord
  has_many :engines, class_name: "Motor"
end
```
実際の使い方
```
car = Car.first
motors = car.motors
```

## マイグレーションファイル
referencesメソッドは指定されたシンボルに「_id」を加えた名前で整数型のカラムを追加する
```t.references :member```は```t.integer :member_id```と書いても同じことですが、referencesメソッドを使用することでこのカラムが外部キーであることを明示できる

#### 実際の書き方

```db/migrate/20230702133134_create_entries.rb
class CreateEntries < ActiveRecord::Migration[6.1]
  def change
    create_table :entries do |t|
      t.references :member, null: false               # 外部キー
      t.string :title, null: false                    # タイトル
      t.text :body                                    # 本文
~省略~
      t.timestamps
    end
  end
end
```
素人がAmazon Lightsailを使ってみて感じたメリット/デメリット

# 経緯
Amazon Lightsailなら簡単にWebサイトを構築できる、というのがずっと気になっており
どれほど簡単なのか、AWSの勉強がてら使ってみることにしました。
[参考：AWSマンガ第 1 話：数分以内にホームページを立ち上げろ！ ( 1 / 4 )](https://aws.amazon.com/jp/campaigns/manga/vol1-1/)

# 構築にあたって参考にしたもの
構築にあたって参考にさせていただいた情報です。
## 公式ドキュメント
- **チュートリアル**
 [チュートリアル: Amazon Lightsail で WordPress インスタンスを起動して設定する](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-tutorial-launching-and-configuring-wordpress)

- **HTTPSの有効化 **
→下記の技術ブログも参照しながらHTTPSを有効化しましたが、私は初期状態ではbncertツールがインストールされておらず、```command not found``` を連発して困惑しました。 SSHでインスタンスに接続後、```sudo /opt/bitnami/bncert-tool```を実行して```command not found``` になる場合はこちらのステップ4.2を参考にしてください 。
[Amazon Lightsail の WordPress インスタンスで HTTPS を有効化する](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-enabling-https-on-wordpress?trk=d7920dcb-23ef-4a3f-9619-088dfdc45d2e&sc_channel=ta) 


## 技術ブログ
- **ドメイン、DNS登録**
インスタンス作成後、静的IPの固定、ドメイン登録に進みます。
Route53から登録する方法と、Lightsailから登録する方法の２種類があるようです。私はこちらを参照してLightsailから登録しました。
 [Amazon Lightsail でドメイン登録が出来るようになりました](https://dev.classmethod.jp/articles/lightsail-domain/) 

- **HTTPSの有効化 **
公式ドキュメントだけではちょっと難しかったので、こちらも参考にさせていただきました。 
[【AWS】LightsailにSSLを設定【HTTPS化】](https://chigusa-web.com/blog/lightsail-ssl/)

# メリット
- **安い＆定額**
 基本的には従量課金のAWSですが、コストが定額で見えるのは一つ安心材料だと思います。 初期費用のドメイン費（.comで13ドル/年、日本円で1,900円/年)に加えて、月額3.5ドル（500円/月）。挑戦しやすい価格帯です。 

- **立ち上がりが早い**
 環境を選んで作成をクリックすると、ものの数分でインスタンスが作成されます。 その後も静的IPアドレスの固定、ドメインの取得、DNSゾーンの設定と進みますが、慣れれば全て1時間以内で終わるのではないでしょうか。 
私は色々不慣れで、4回ほどインスタンスを作り直したので、けっこう時間がかかりました。さすがにそんなに失敗する人は少ないかもしれません…。 

# デメリット
- **AWSまわりの知識習得が大変**
 AWSのサービスなので当然なのですが、AWSのアカウントを取得する必要があります。Lightsailを最低限利用するにあたっては、他のAWSサービスをさほど知らなくても使えると思います。でも、請求の仕組みやリージョンなど、わかっていないと怖いところはありますね。 自分はハンズオン用に元々アカウントがあり、CLFも取っていたので違和感ありませんでしたが、 まったく知識がない状態からだとレンタルサーバを使った方が楽そうです。 

- **情報が少ない **
レンタルサーバーを使ってWordPressを作成する書籍が大多数かと思います。 Lightsailに特化したものは今のところ見つけられていません。構築までは技術ブログ、Wordpressに関するところは書籍で進めましたが、 ちょっと手順や設定が違ったりして、何が原因か分からず詰まることもありました。AWS不慣れ＆Wordpress初めて、だと結構苦労します。

# まとめ
簡単だし、とても早いです。ただし、初めて個人ブログを作る程度ならレンタルサーバーのほうが分かりやすそうですね！
対して、AWSを勉強したい人、サクッと低価格でWebサイト作ってみたい技術者の方はLightsailを使うメリットがあるかもしれません。

# 参考
この記事は初心者が利用するには、という前提ですが、技術的に見てLightsailを採用すべきかについては以下の記事がとても分かりやすかったです。

https://qiita.com/nasuvitz/items/c9a9de3fd8243693f01c