OmniAICreator/Qiita-1.07M huggingface dataset:
DALL-Eで日本の歴史的衣装　第２戦　奈良時代への挑戦１

次に奈良時代の服を描かせる方法はないかと模索。ポイントは「Alternate」を活用する。

奈良時代の服装は唐代の服装に近いものです。まず唐代の服装を出してみる。琵琶を演奏する唐代の宮廷婦人を出してもらいました。
![DALL·E 2024-01-02 11.37.49 - A Chinese court lady from the Tang dynasty, elegantly dressed in traditional silk robes with intricate patterns, playing a Biwa, a four-stringed lute.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/6c3fc082-adee-7512-22cd-203fc8f94fa7.png)


これをもとに同じ宮廷婦人を日本の奈良時代に持ってゆこうとしたらこうなってしまう。日本髪の現代の琵琶演奏家が琵琶を演奏しているみたいな感じですね。
![DALL·E 2024-01-02 11.39.07 - A Japanese court lady from the Nara era, wearing clothing that originated from the Tang dynasty of China, showcasing the cultural exchange between the.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/9c2e1be6-5025-0b0c-4b4c-a07ccc52a9b5.png)


まるっきり唐代の衣装で琵琶を演奏する奈良時代の日本人女性とすると、こんな感じに。中国の変身写真館の唐代衣装の感じが出ていて、ちょっと奈良時代っぽくなくなる。トレーニングデータに奈良時代の衣装やインテリアがないので仕方がないのですが。
![DALL·E 2024-01-02 11.43.21 - A Japanese court lady from the Nara era, accurately dressed in traditional Tang dynasty attire. She wears a sumptuous silk robe with vibrant colors an.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/44139f51-6b37-8603-fb39-d0f874df5fad.png)


これなんかもう本当に髪型も着物も明治時代の奥様。
![DALL·E 2024-01-02 11.46.33 - A Japanese court lady from the Nara era, dressed in a historically accurate Tang dynasty style. She should wear a refined, traditional silk robe that .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/8c020efe-9820-8f52-1105-96e56a050689.png)


人間の視点で見ると非常にシンプルなのですが、AIには難しいんですね。（こちらはイラストACからダウンロードした奈良時代衣装のイラスト）
![22524845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/bd34de83-fa33-d75c-f760-db51a2fcf0e1.png)


床をWooden Floorに指定すると畳のように並べられたフローリングが…。
![DALL·E 2024-01-02 11.49.49 - A woman from the Tang dynasty, sitting on a polished wooden floor in a setting that reflects the Japanese Nara period architectural style. She is wear.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/c57bfed9-fc5e-dd41-11e2-bce8019b6759.png)


じゃあ、シンプルな唐代の衣装の女性を描いてと言ったらこのかわいいイラストが。結構気に入りました。
![DALL·E 2024-01-02 11.52.05 - Illustrate a lady in simple Tang Dynasty attire. She should be wearing a high-waisted, A-line dress known as a 'ruqun', with a crossed collar and wide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/b9867636-d141-ec0d-6e65-d6b93b54a4cf.png)


この人物のバックに平城京の建物を入れてと言ったらこうなりました。現代の中国の変身写真館の唐代衣装みたいな感じがありますがこれ以上の改善は難しいかなと思ったのでこれで終わり！　絵の雰囲気的には気に入りました。全然天平文化じゃないですが（笑）
![DALL·E 2024-01-02 11.53.17 - Create a full-length portrait of the lady in pale Tang Dynasty attire, standing in front of the Nara Heijo Palace replica. Her attire consists of a hi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/9aa4c9fb-f4ef-1342-0c03-e3efadbaa917.png)
ABC320(A~D)をPythonで解く

# 初めに

ABC320のA~D問題をPythonで解きました。

https://atcoder.jp/contests/abc320

# A: Leyland Number 

https://atcoder.jp/contests/abc320/tasks/abc320_a

`x`の`y`乗は```x**y```で計算できます。

<details><summary>コード</summary>

```python
A, B = map(int, input().split())
print(A**B+B**A)
```

</details>


# B: Longest Palindrome

https://atcoder.jp/contests/abc320/tasks/abc320_b

`S`の制約が小さいので部分文字列の初めと終わりで全探索しても間に合います。

文字列`s`の回文判定は、文字列を左右反転させたもの```s[::-1]```と`s`が一致するかどうかで可能です。

また、長さ一文字の部分文字列は常に回文です。

<details><summary>コード</summary>

```python
S = input()
ans = 1
for start in range(len(S)):
    for end in range(start+1, len(S)+1):
        s = S[start:end]
        if s == s[::-1]:
            ans = max(ans, len(s))

print(ans)
```

</details>

# C: Slot Strategy 

https://atcoder.jp/contests/abc320/tasks/abc320_c


制約が100と小さいので三つのリールを全探索しても$O(N^3)$で間に合います。

`t`秒目に押せるボタンは一つなので、リールを止めるタイミングは別々である必要があります。

三つのリールにおいて共通する数字が同じ位置にしか存在しない場合はスロットが3周する必要があるので、事前に全てのリールを3倍にしておきます。

それぞれのリールの組み合わせにおいて、数字が一致するか、そしてタイミングが別々か確認します。ボタンを押す最後のタイミングを更新してそのうちの最小を求めます。

<details><summary>コード</summary>

```python
M = int(input())
s1 = input()*3
s2 = input()*3
s3 = input()*3

cnt = 10**18

for f in range(M*3):
    for s in range(M*3):
        for t in range(M*3):
            if (s1[f]==s2[s]==s3[t]) and (f!=s and f!=t and s!=t):
                cnt = min(cnt, max(f,s,t))


print(cnt if cnt < 10**18 else -1)
```

</details>

# D: Relative Position 


https://atcoder.jp/contests/abc320/tasks/abc320_d

座標が一意に定まるのは、座標がすでに定まっている点から観測された時です。なので座標１から観測できる点をすべて定め、定まった点から観測できる点を同様にすべて定め、の繰り返しで可能なすべての点を定めることができます。

これは点１から始める幅優先探索(BFS)で実行できます。

観測は双方向で可能なことに注意します。具体的には、点1から点2がx軸正方向に3, y軸正方向に4離れているとき、点2から点1はx軸正方向に-3, y軸正方向に-4離れています。

<details><summary>コード</summary>

```python
from collections import deque

def main():
    N, M = map(int, input().split())
    graph = [[] for _ in range(N+1)]
    INF = 10**9+1

    for _ in range(M):
        a, b, x, y = map(int, input().split())
        # 双方向の観測
        graph[a].append([b, x, y])
        graph[b].append([a, -x, -y])

    def bfs(g):
        
        # 各点の座標
        cord = [(INF, INF) for _ in range(N+1)]
        # すでに座標が定まっているかどうか
        seen = [(False) for _ in range(N+1)]
        # 原点よりスタート
        cord[1] = (0, 0)
        seen[1] = True

        #　キューを作成して原点(点,x座標, y座標)を追加します
        que = deque([])
        que.append((1, 0, 0))

        while que:
            v, x, y = que.popleft()
            seen[v] = True
            # 点ｖより観測可能な点の座標を定めます
            for next_v, nx, ny in g[v]:
                if seen[next_v]: continue 
                cord[next_v] = (x+nx, y+ny)
                que.append((next_v, x+nx, y+ny))
    
    bfs(graph)

    for i in range(1, N+1):
        x, y = cord[i]
        if x == y == INF:
            print("undecidable")
        else:
            print(x, y)

main()
```

</details>
ALB(パブリック)- VPCエンドポイント-S3の構成   （追加でパスによる振り分け）

# 外部ALBに対してS3を直接紐づける


## 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/9fb0bf02-c0b4-8251-a10d-c82068ab36e4.png)



この構成です。この構成を実施したい人も多いと思うので記載します。

AWSの公式には内部ALBのバージョンの手順が載っているのですが、外部ALBバージョンでも作成できます。AWSのサポートには、これだとヘルスチェックが落ちると言われましたが、それも下記のようにすれば回避できます。


## 手順概要

内部ALBで構築するときの公式の手順

https://aws.amazon.com/jp/blogs/news/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/

ほとんど上記の手順通りに進めます

**Step1: Amazon S3 のVPC Endpoint を作成する**
**Step2: VPCエンドポイントから S3 へのアクセスを許可する**
はそのまま踏襲

**Step3**から少しもちろん違います

## Step3以降の手順詳細

ALB に名前を付け、「internal」スキームを選択する
-> ALB に名前を付け、「extenrnal」スキームを選択する

これぐらいが差分ですが
**外部ALB名と同じバケット名を作成することがキモです。**

つまり、AWSによって払い出される`test-demo-alb-XXXXXXXX.ap-northeast-1.elb.amazonaws.com`
このようなALB名に対して同等のバケット名でS3を作成してください

ALB名でS3のバケット名を下記で設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/7d3263c6-7df6-dad5-440c-54a2eb91f56e.png)

こちらのヘルスチェックを踏襲して、307,445で監視すれば生死監視もOKです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/f03f38a5-2b35-c9f1-ec5e-95764fd39d98.png)

ちなみに何度か作り直している際に、SGのこの手順を実施してなくてハマったので、SGやIAMの権限不足のようなAWSハマりあるあるのところはご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/9f878a9c-0583-d62b-7fc3-4d1b005198b3.png)

### 追加でターゲットグループによって振り分けをする


追加で今回、ALBの振り分けも実施したかったのですが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/ff95194c-d49a-e7e7-7c74-23e9b58bd650.png)

その場合は二点注意すれば作成できます

#### 1点目　ターゲットグループの作成とルーティング

こちらは当たり前だと思うのですが、ターゲットグループの作成とルーティングが必要です


**1-1 IPベースのターゲットグループ**

先程のStep3のところであったIPを使って
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/15547260-370d-054d-9f0b-bf38948e0256.png)

https://dev.classmethod.jp/articles/ip-target-for-alb/
こちらの記事のようにターゲットグループを作成します。

**1-2 ルーティング**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/6de04e5f-a52f-b1cf-cac0-0f07f4c08792.png)


#### 2点目 S3にパス名でフォルダを作成

S3にパス名でフォルダを作成をしてください。こうしないとALBからS3のどこにルーティングしていいのかがAWS側がわからないのだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1364181/43ac5227-456c-d54e-a291-1e79beb1d9bc.png)



### その他

ALBのログを出すときに

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/enable-access-logging.html

こちらの公式だけだとログがでず、IAMではマリました、このクラスメソッドさんの記事で書かれている方法が必要で
https://dev.classmethod.jp/articles/alb-connection-logs/

さらにこの記事のIAM中の582318560864は
`"AWS": "arn:aws:iam::582318560864:root"`
自分のAWSアカウントとかではなく、ap-northeast-1で固有の値なのでご注意ください
【ChatGPT無】でカウンセリング。


　どうも、カーブミラーです。

　今回は、ChatGPTにカウンセラーになってもらいます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　まずは、令和六年一月一日に起きた「令和6年能登半島地震」で、被災された方々のご無事を願います。そして、被災者方を救助・援助されている方々を応援いたします。支援表明してくださった国々に感謝。
![DALL·E 2024-01-02 10.50.56 - A soft, pastel-colored image showing a side view of a woman in a bright red Japanese-style culotte skirt and a plain, patternless white haori. Her lon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/f829fe4c-e5d1-24b2-d191-2a6042d79ba3.png)

***
　こんなときですので、
　　ChatGPTに不安な気持ちを
　　　相談してはいかがでしょうか。

　もちろん、
　　無料版では
　　　たかが知れています。

　しかし、
　　避難所などで
　　　不安なときを
　　　　無為に過ごすよりは、
　　　　　何かしている方が
　　　　　　一時的でも不安を
　　　　　　　感じないものです。

　今回は、
　　以前に上げた記事
[[【ChatGPT無】セラピストプロンプトを実行した感想](https://qiita.com/kabumira/items/033a72daa04321be6acf)
　　　で使ったPromptを
　　　　カウンセラーに変えて
　　　　　お届けします。

　暇つぶしくらいには
　　なって欲しいな、と。

```Text:カウンセラーPrompt
#指示
あなたは、プロのカウンセラーとして、振る舞ってください。

#内容
相談者である私との会話を通じて、私の精神的健康について、アドバイスが必要と判断したならば、アドバイスをお願いします。

#対話
必要な情報を得るために、質問や促しをしてください。
質問は、ひとつずつでお願いします。

以上を理解しましたら、「はい」と答えて、最初の質問をしてください。
その後は、待機してください。
```

　やり取りは、
　　出しませんので、
　　　やってみてください。

　まぁ、たいしたことには
　　なりませんから
　　　暇つぶしと思って。
***
　では、
　　今回は、ここまで。
Vim 9.0 patchダイジェスト (2023/11)

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([9.0.2082](https://github.com/vim/vim/commit/43cb8e1c3b60f6fcd30a9a0f9b01b86d640b2165) ～ [9.0.2138](https://github.com/vim/vim/commit/fda700cb04612fe2f9301a9ba820309175decabf))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**
runtimeファイルも直接commitされるようになりました。ただ、数が多いので基本的にはここでは取り扱わないことにします。

* [9.0.2133](https://github.com/vim/vim/commit/d1c3ef1f47c87d1da056c56564e1985fe6f2931d): :four_leaf_clover: コマンドライン編集上書きモード時には `mode(1)` が `cr` を返すようにしました。(Vim Ex モード中の上書きモード時は `cvr`) (関連patch: [9.0.2135](https://github.com/vim/vim/commit/fcaeb3d42b228e73c669b2fce78f1d3fe112769f))
* [9.0.2096](https://github.com/vim/vim/commit/03042a2753e3e6ac971045a8ce256d709214710e): :four_leaf_clover: Vim9: `_` で始まるメンバ/メソッドの説明を `private` ではなく `protected` 表記にしました。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
DALL-Eで日本の歴史的衣装　第１戦　平安時代、長い垂髪が描けない！

ChatGPTを使ってBOTを作ったりSNS投稿記事を作成したりしているのですが、少し遊び半分にDALL-Eで日本の昔の衣装を描かせることを試みてみました。今年2024年の大河ドラマは「光る君へ」なので、平安時代を描いてみたい。これが実は意外と難関なのです。

ChatGPTに聞いてみたところ、DALL-Eのトレーニングに使われている日本の衣装のデータは、平安時代、江戸時代と明治以降とのこと。しかしです、平安時代が一筋縄では行かないのです！

十二単を着た女性。ストレートな黒い髪というプロンプトの描写に対して、頑なまでも日本髪結った女性の絵を生成してくる。

![DALL·E 2024-01-02 11.02.10 - A portrait of a woman with East Asian features and straight, waist-length hair, wearing a Juunihitoe that reflects the style in the reference provided.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/0681ccd6-7b89-d72c-2362-b676c47883e9.png)

私が欲しいのは源氏物語絵巻で描かれるような衣装と髪型。長いストレートの黒髪を後ろにまっすぐ垂らして髪を結ったり飾りをつけたりしていないと指定しても言うこと聞いてくれないのです。
（こちらの画像はイラストACからダウンロードしたもの）
![1101096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/395b5d4f-1839-6ccf-f11e-d568c6f3aa90.png)


飾りをつけない、髪を結ってないと指定したら、指定通りではないことはわかるがどうしても結ってかんざしを付けた髪型がでてしまうとのこと。ChatGPTもごめんなさいと謝ってきました。どうも着物を着ている場合日本髪というデータがあるんですね。
![DALL·E 2024-01-02 11.26.04 - Illustrate a historically accurate Heian period Japanese court lady, standing. Her hair should be very long, straight, and black, flowing all the way .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/5f294567-6788-19c5-022a-40908f8515da.png)


こちらは中国の剣劇に出てきそうな感じですがまだよいかもしれない…。この絵が出てきたときに、気づいたのが「平安時代装束」としてトレーニングされているのが平安初期、唐代の服装ではないかということ。つまりは紫式部の時代の服装ではなく、髪を結いあげて唐代風にしていた平安初期ですね。

![DALL·E 2024-01-02 11.14.04 - A full-body portrait of a woman with East Asian descent, featuring unbound, waist-length, straight black hair, without any buns, ties, or ornaments. S.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/3fcc916d-4da5-d5b0-0e44-c48ca4fe1076.png)


じゃあ。奈良時代なら描ける？？？

註：生成した絵のタイムスタンプはPCにダウンロードした日付であるため、実際の生成順ではありません。
Quick Start: Create HTTP Callouts with Flow Builder


https://trailhead.salesforce.com/content/learn/projects/quick-start-create-http-callouts-with-flow-builder/create-the-credentials

# Create the Credentials


なにもしないで、検証ボタンをクリックする。

:::note alert
We can't find the 'Animals API External' external credential in your org.
:::

Create the External Credentialを終わったあと

:::note alert
We can't find the 'Animals API Named’ named credential in your org.
:::

Create the Named Credentialを終わったあと

:::note alert
We can’t find the 'Animal API' Permission set in your org.
:::

Create a Permission Setを終わったあと

:::note alert
We can’t find the Animals API permission set assigned to you. Make sure you’ve assigned it to yourself in your Trailhead Playground.
:::

Assign the Permission Setを終わったあと合格できました。

# Build the Flow

なにもしないで、検証ボタンをクリックする。

:::note alert
We can't find a flow named 'Round Up the Animals'.
:::


:::note alert
In the Get Animals Action element, we can’t find an external service named 'AnimalsExternalService'.
:::

:::note alert
We can’t find an Action element named 'Get Animals'. Make sure the API Name is 'Get_Animals'.
'AnimalsExternalService'.
:::


フローを削除して再作成するが、できませんね。相変わらずの腐った仕様です。意味が分からん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/911fde2d-4d41-8dc9-0c47-ccd3351ca125.png)

ごみ箱にも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0b2b0daf-2dde-a26d-eba6-957287306daa.png)

シークレットモードでも機能しませんね。本当これらの検証ロジックには全く信頼をおけません。無償の部分なので品質がかなり低いと感じます。

面倒ですが新しいプレイグランドで再実行したら合格できました。



+ [We can’t find a response to the flow’s API call. Make sure you click Debug to run the flow.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007QfLzmSAF)
+ ["We can’t find a response to the flow’s API call. Make sure you click Debug to run the flow." Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007RJ2DySAL)

+ [【解決】Quick Start: Create HTTP Callouts with Flow Builder Challenge Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Uu0XZSAZ)

:::note
I was struggling with this one as well, in the end I realized I had forgotten to set the variable as 'available for output' - easily missed. Just posting in case that solves your issue as well.
:::

------------------
+ [In the Get Animals Action element, we can’t find an external service named 'AnimalsExternalService'. Please help me with this error.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PvNpeSAF)
+ [In the Get Animals Action element, we can’t find an external service named 'AnimalsExternalService'. Please help me with this error.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007VKs7xSAD)
+ [In the Get Animals Action element, we can’t find an external service named 'AnimalsExternalService'. Please help me with this error.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PvNpe)

新しいプレイグランドを使う
モデル駆動アプリ リレーション機能を使って別テーブルのデータをLookUpする方法

**やりたいこと**
データテーブルの列に、他テーブルのリストを参照したLookUp列を作成する。

**1.リレーション作成**
検索結果を表示する列名と参照元のテーブルを紐付ける。
紐付けは検索結果を表示したいテーブルを開いて作業する。
紐付けと同時に検索のキーとする列を新規に作成する手順になる。
参照元の検索キーは自動的にプライマリ列となる。

<手順>
テーブルリストから対象のテーブルを選びオープンで開く(編集で開かずオープンで開くこと)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/4d01ef09-95cf-57de-78b6-74c7233e6982.png)


リレーションシップボタンを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/722fcbe9-1c0c-71d6-f541-8c102b3d878f.png)


新しいリレーションシップから多対一を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/c1099863-a30e-0426-0470-d541681cf432.png)


参照するテーブルを選択し、検索のキーとるする列の名前を記入する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/f3765241-3121-7055-347c-54717e9fa158.png)

**2.検索結果を表示する列の作成**
LookUp結果を表示したいテーブルに検索結果列を挿入する。
この時、検索のキーとなる列は事前に追加しておくこと。

<手順>
アプリケーション編集画面の「ビューの編集」ボタン(えんぴつマーク)を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/10ac7e21-0675-7881-0c6f-8c911b9dca5a.png)

「列を表示する」ボタンを選択し「関連」を押下。「検索のキーとする列名 (参照テーブル)」の中から検索結果を表示する列名を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/e7853fa2-882f-6018-8ed8-6a0ecbe7fe7a.png)

**3.参照テーブルをLookUpした結果が表示できた**

参照元テーブルのプライマリ列と対になる部材1の入力値が参照先に表示された。

参照元テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/bbc8b3e2-9da4-2d13-2db4-f00d94533506.png)

結果表示テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/a6f5cb7d-7dd4-54f7-2573-12082c912c8b.png)
AWSのAutoscalingによるスピンアップとは？の備忘録

"スピンアップ"は、Auto Scalingグループ内で新しいインスタンスが起動され、アプリケーションが新しいリソースで安定して動作するまでの時間を指します。Auto Scalingグループがインスタンスを自動的にスケールアウト（増やす）すると、新しいインスタンスが「スピンアップ」します。

図にするとこんな感じ？？？？
違ってたらご指摘いただけると幸いです。

![AWSスピンアップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540462/86773804-044c-989d-a9fa-b33ce6231069.png)



スピンアップには、以下の主なプロセスが含まれます：

### 新しいインスタンスの起動

Auto Scalingグループは、需要が増えた場合に新しいインスタンスを起動します。これは通常、AMI（Amazon Machine Image）を使用して定義されたイメージをもとにした新しい仮想マシンの起動です。
起動時の設定の実行:

インスタンスが起動されると、指定された起動スクリプトや構成管理ツールによって、必要な設定やソフトウェアのインストールが行われます。

### ロードバランサへの登録

起動したインスタンスがロードバランサなどの負荷分散装置に登録され、トラフィックの一部または全体を処理する準備が整います。

### アプリケーションの起動と初期化

アプリケーションが起動され、必要なサービスやデータベースへの接続が確立され、正常な動作が確認されるまでの時間。
スピンアップの期間は、インスタンスの起動時間やアプリケーションの初期化にかかる時間によって異なります。アプリケーションが正常に処理できるようになるまでの時間を確保するために、Auto Scalingグループではクールダウンの設定が重要です。クールダウン期間は、Auto Scalingグループがスケールアウト（増加）またはスケールイン（減少）する際に新しい変更を行わないようにする時間を指定します。これにより、新しいインスタンスが起動して安定するまでの時間を考慮して、スケーリングの頻繁な変更を防ぐことができます。
react-router-dom v6で共通のヘッダを適用する

## はじめに

Udemyの講座『Reactに入門した人のためのもっとReactが楽しくなるステップアップコース完全版』の「セクション12：実践アプリ作成」に取り組んでいます。

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

講座ではCodeSandbox上でreact-router-domのv5を使用されていますが、私はローカル環境でv6を使用しています。

ルーティングの書き換えについては別の記事で書きました。

https://qiita.com/wsigma21/items/22e09d6a88c683645103

今回は、共通のヘッダを適用するにあたり書き換えを行いました。

## 環境

- React：18.2.0
- TypeScript：5.2.2
- ret-router-dom：6.21.1

## コード

`/home`, `/home/user_management`, `/home/setting`に共通の`<HeaderLayout />`を適用させます。

ポイントは、

- `path="home"`の`element`にヘッダを指定すること
- `<HeaderLayout>`内で`<Outlet />`を指定し、子コンポーネントを表示すること


```react:Router.tsx
<Routes>
  <Route path="/" element={<Login />} />
  <Route path="home" element={<HeaderLayout />}>
    <Route index={true} element={<Home />} />
    <Route path="user_management" element={<UserManagement />} />
    <Route path="setting" element={<Setting />} />
  </Route>
  <Route path="*" element={<Page404 />}/>
</Routes>
```

```react:HeaderLayout.tsx
import { FC, memo } from "react";
import { Header } from "../organisms/layout/Header";
import { Outlet } from "react-router-dom";

export const HeaderLayout: FC = memo(() => {
  return (<><Header /><Outlet /></>)
})
```

## 終わりに

v5とv6では大幅に異なり、対応が大変です。。


## 参考

https://reactrouter.com/en/main/components/outlet
Pythonで「辞書を作成する」の動作を確認してみた

# 概要

Pythonで「辞書を作成する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/dictionary/index1.html

# 実装

以下のファイルを作成しました。
```sample.py
x = 1
y = "Desktop"
mydict = {x:y}
print(mydict)

mydict = {1:"Desktop"}
print(mydict)

x = 1
y = "Desktop"
mydict = {x:y}
print(mydict)
y = "Movile"
print(mydict)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
{1: 'Desktop'}
{1: 'Desktop'}
{1: 'Desktop'}
{1: 'Desktop'}
```

# まとめ

何かの役に立てばと。
【Prolog】マリオRPGのトライアスロン問題を解くプログラム

## 前書き（予防線）

ガチProlog初心者です。（4時間くらいしか触っていない。）
コードが出来た瞬間にやる気ゲージが尽きたのでリファクタとかはしていません。
そのため書き方が冗長だったり、
もっといい書き方があるかもしれません。

## 問題

A,B,C,Dがトライアスロン（※）をしました。
それぞれの証言から順位を推理してください。

※：水泳→自転車→マラソンの順で争う競技。マラソンの順位が最終的な順位

【証言】
A「水泳も自転車も順位は同じだったけど、マラソンで二人に抜かれちゃった。」
B「自転車でDを抜いて、そのあとはゴールまで Dには抜かれてないよ。」
C「水泳で3位だったけど、ゴールするまで3位より上になったことはなかったよ。ちぇ。」
D「自転車で調子が悪くて 4位に落ちちゃったけど、結局水泳と同じ順位でゴールできた。」

## プログラム

```prolog
a_testimony(A_Swi, A_Cyc, A_Mar) :-
	A_Swi =:= A_Cyc,
	A_Mar =:= A_Cyc + 2.

b_testimony(B_Cyc, B_Mar, D_Cyc, D_Mar) :-
	B_Cyc < D_Cyc,
	B_Mar < D_Mar.

c_testimony(C_Swi, C_Cyc, C_Mar) :-
	C_Swi =:= 3,
	C_Cyc >= 3,
	C_Mar >= 3.

d_testimony(D_Swi, D_Cyc, D_Mar) :-
	D_Cyc =:= 4,
	D_Swi =:= D_Mar.

all_testimony(A_Mar, B_Mar, C_Mar, D_Mar) :-
	between(1, 4, A_Swi),
	between(1, 4, A_Cyc),
	between(1, 4, A_Mar),
	between(1, 4, B_Swi),
	between(1, 4, B_Cyc),
	between(1, 4, B_Mar),
	between(1, 4, C_Swi),
	between(1, 4, C_Cyc),
	between(1, 4, C_Mar),
	between(1, 4, D_Swi),
	between(1, 4, D_Cyc),
	between(1, 4, D_Mar),
	A_Swi =\= B_Swi, A_Swi =\= C_Swi, A_Swi =\= D_Swi,
	B_Swi =\= C_Swi, B_Swi =\= D_Swi, C_Swi =\= D_Swi,
	A_Cyc =\= B_Cyc, A_Cyc =\= C_Cyc, A_Cyc =\= D_Cyc,
	B_Cyc =\= C_Cyc, B_Cyc =\= D_Cyc, C_Cyc =\= D_Cyc,
	A_Mar =\= B_Mar, A_Mar =\= C_Mar, A_Mar =\= D_Mar,
	B_Mar =\= C_Mar, B_Mar =\= D_Mar, C_Mar =\= D_Mar,
	a_testimony(A_Swi, A_Cyc, A_Mar),
	b_testimony(B_Cyc, B_Mar, D_Cyc, D_Mar),
	c_testimony(C_Swi, C_Cyc, C_Mar),
	d_testimony(D_Swi, D_Cyc, D_Mar).

program :- 
    findall(A_Mar-B_Mar-C_Mar-D_Mar, all_testimony(A_Mar, B_Mar, C_Mar, D_Mar), Bag),
    print(Bag).
```

## 結果

https://ideone.com/hGzTPD

```
[3-1-4-2]
```

## 参考にした（勉強に利用した）サイト

http://www.nct9.ne.jp/m_hiroi/prolog/prolog01.html

https://guppy.eng.kagawa-u.ac.jp/2018/ouj/exerciseProlog.html

ChatGPT先生にもお世話になりました。
といってもbetweenの存在とリストぐらいしか知識を得ていません。

## その他

論理的な解き方が知りたい方は以下のサイトを見てください。

https://game8.jp/mario-rpg/547218

元ネタ

https://qiita.com/mogamoga1337/items/4d773b3c6fbeea28e395
箱根駅伝データ分析物語　#８-１：第100回大会予測結果【当日変更確定後】（往路）

まずは、石川能登地震で被害に遭われた方のご無事を心よりお祈り申し上げます。
また、箱根駅伝開催に向けてご尽力いただいた皆様に深く感謝いたします。

-----------------------------------------------

さて、ではいよいよ箱根駅伝当日！ということで、当日エントリー変更後の予測結果（往路）を載せる。（現在07:30am）

第100回は機械学習の予測実施が間に合わなかったため、線形回帰×補正ロジックでの予測を実施。予測ロジックは当日エントリー変更前のオーダーで予測を行った以下記事を参照。

# 予測結果

エントリー確定後の予測結果は、以下のようになった。

## 予測まとめ

:::note warn
**念のためですが、この予測結果はあくまで定量的な分析による予測以外のなにものでもなく、主観は介在しません。**

**この分析結果をもとに特定の方を誹謗中傷することは決してないよう、あくまで楽しみの一つとしてご参考ください。
（僕に対するコメント、改善要望などはドシドシお寄せください。）**
:::

当日エントリー変更がない場合、以下予測成績となった。

### 大学成績TOP5

**往路成績**
１位：駒澤　　　05:20:43
２位：青山学院　05:22:48（+02:05）
３位：創価　　　05:24:17（+03:34）
４位：中央　　　05:24:35（+03:52）
５位：國學院　　05:25:42（+04:59）



### 個人成績（区間賞）

１区：溜池一太②　（中央）　1:01:20
２区：鈴木芽吹④　（駒澤）　1:06:06
３区：佐藤圭汰②　（駒澤）　1:01:00
４区：森下翔太②　（明治）　1:00:14
５区：吉田響③　　（創価）　1:09:44

いや駒澤篠原区間賞予測じゃないんか～～～い

## 予測詳細

PCの都合上直接画像ペーストできず画質が荒い……

### 各区間タイム・順位

![IMG_5326.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145067/3489d7cf-c957-288c-80e2-35e60b9fc348.jpeg)



# おわりに

結果やいかに！！！
First Aidでwarning: inode (id xxxxx): Resource Fork xattr is missing for compressed fileが発生した場合

# First Aidを実行したら、以下のようなワーニングが表示された

```
warning: inode (id 41326531): Resource Fork xattr is missing for compressed file
warning: inode (id 41254098): Resource Fork xattr is missing for compressed file
warning: inode (id 41326531): Resource Fork xattr is missing for compressed file
warning: inode (id 41328041): Resource Fork xattr is missing for compressed file
warning: inode (id 41329717): Resource Fork xattr is missing for compressed file
warning: inode (id 41331922): Resource Fork xattr is missing for compressed file
warning: inode (id 41336279): Resource Fork xattr is missing for compressed file
warning: inode (id 44980919): Resource Fork xattr is missing for compressed file
```

## inodeを特定する
ログに表示されているinode番号41326531は何のファイルなのかを特定する。
inodeからファイル名を引くにはGetFileInfoコマンドが利用できる。
GetFileInfoは以下のように使用する。
```shell-session
# GetFileInfo /.vol/16777223/643246
file: "/private/var/root/.viminfo"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz
created: 05/27/2020 11:16:24
modified: 05/27/2020 11:16:24
```

/.vol/は仮想ファイルシステムで以下のように指定する
```
/.vol/{ボリュームID/{inode}
```
この場合、ボリュームID=16777223のinode=643246のファイルは`/private/var/root/.viminfo`ということになる。

ボリュームIDは上記で問題の起きているボリューム上にあるファイルをstatすれば取得できる。一つ目の16777223がボリュームID、二つ目の643246がinodeになる。
```shell-session
# stat .viminfo
16777223 643246 -rw------- 1 root wheel 0 13593 "May 17 13:38:47 2022" "May 27 11:16:24 2020" "May 17 14:01:46 2022" "May 27 11:16:24 2020" 4096 32 0 .viminfo
```
したがってinode=41326531のファイルを特定するには以下のコマンドを使用すれば良い。
```shell-session
# GetFileInfo /.vol/16777223/41326531
```

## 具体的な対応
僕の場合は、ワーニングの出ていたinodeは全て`/System/Volumes/Data/.Spotlight-V100/`
以下のファイルだった。[Mac で Spotlight のインデックスを再作成する](https://support.apple.com/ja-jp/102321)ことで解決した。
mindの研究 その59

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
mindでweb serverを書け。zundokoを実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6ce9c32b-6136-8dca-9eca-21a6a6632f78.png)

# サンプルコード

```

乱数種値は　変数。 

簡易小数表示とは　（小数　→　・）
	５桁で　小数形式で表示すること。

一様乱数とは　関数　小数出力
	Ｙ２は　変数
	Ｙ１は　小数変数
	乱数種値を　Ｙ２に　入れる
	Ｙ２を　１３　左シフトし、　Ｙ２と　ＸＯＲし、　Ｙ２に　入れる
	Ｙ２を　１７　右シフトし、　Ｙ２と　ＸＯＲし、　Ｙ２に　入れる
	Ｙ２を　１５　左シフトし、　Ｙ２と　ＸＯＲし、　Ｙ２に　入れる
	Ｙ２を　乱数種値に　入れる
	Ｙ２を　絶対値を　小数化し　Ｙ１に　入れる
	Ｙ１を　2147483648.0で　ｆ割り　Ｙ１に　入れる
	Ｙ１をもどす
。

ずんどことは
　変換後は　文字列実体　長さ　2048
　ズン数は　変数
　ズン数に　０を　入れる
　変換後を　クリア
　変換後に　「HTTP/1.1 200 OK」を　追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　変換後に　「Content-Type: text/html」を　追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　変換後に　「<html><head><meta charset='sjis'/></head><body><h1>server side mind</h1><form method='get' action='index.html'>」を　追加し
　変換後に　「入力：<input type='text' name='q' size='30'><input type='submit' value='送信'><br><textarea rows='15' cols='50'>」を　追加し
　ここから
　　もし　一様乱数が　0.5より　f大きい
　　ならば
　　　「ズン」を　変換後に　追加し
　　　ズン数に　１を　加え　ズン数に　入れる
　　さもなければ
　　　「ドコ」を　変換後に　追加し
　　　ズン数に　０を　入れる
　　つぎに
　　もし　ズン数が　４に　等しい
　　ならば
　　　打ち切り
　　つぎに
　繰り返し
　「ドコ　キヨシ！ 」を　変換後に　追加し
　変換後に　「</textarea></form></body></html>」を　追加し
　変換後を　返すこと
。



レスポンス1とは
　変換後は　文字列実体　長さ　2048
　変換後を　クリア
　変換後に　「HTTP/1.1 404 Not Found」を　追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　変換後に　「Content-Type: text/html」を　追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　０DＨを　変換後に　一文字追加し
　０AＨを　変換後に　一文字追加し
　変換後に　「<html><head></head><body>」を　追加し
　変換後に　「<h1>404</h1>」を　追加し
　変換後に　「</body></html>」を　追加し
　変換後を　返すこと
。

メインとは
　ホスト名は　文字列
　ポート番号は　変数
　待ちソケットは　変数
　データソケットは　変数
　エラーコードは　変数
　文字列１は　文字列
　文字列2は　文字列
　単語1は　文字列
　単語2は　文字列
　20231224を　乱数種値に　入れる
　「localhost」を　ホスト名に　入れ
　40001を　ポート番号に　入れ
　ホスト名と　ポート番号と　１個で　ｌｉｓｔｅｎし　待ちソケットに　入れ
　エラー？
　ならば
　　エラー文字列で　重大エラー
　つぎに
　ここから
　　「start」を　一行表示する
　　待ちソケットで　ａｃｃｅｐｔし　データソケットに　入れ
　　エラー？
　　ならば
　　　「エラー：」を　エラー出力し　エラー文字列を　一行エラー出力し
　　　打ち切り
　　つぎに
　　ここから
　　　データソケットから　ハンドル指定で一行読み出し　文字列１に　入れる
　　　データ終り？
　　　ならば
　　　　「[EOF]クライアントが終了しました。」を　一行表示する
　　　　打ち切り
　　　つぎに
　　　文字列１から　単語切り出し　単語1に　入れ
　　　文字列１から　単語切り出し　単語2に　入れ
　　　もし　単語1が　「GET」に　等しい文字列
　　　ならば
　　　　「get」を　一行表示する
　　　　ずんどこを　文字列2に　入れ
　　　　文字列2を　データソケットに　ハンドル指定で一行書き込み
　　　　打ち切り
　　　つぎに
　　　もし　単語1が　「POST」に　等しい文字列
　　　ならば
　　　　「post」を　一行表示する
　　　　レスポンス1を　文字列2に　入れ
　　　　文字列2を　データソケットに　ハンドル指定で一行書き込み
　　　　打ち切り
　　　つぎに
　　　「データ ＝ 」を　表示し　文字列１を　一行表示し
　　繰り返し
　繰り返し
。





```

以上。
特定の条件でしか使わない変数を無造作に定義したくない


誰が読んでも分かるシンプルなコードがあるとする。

```js
function なんかの処理(array = []) {
    let hoge = null;
    for (let i = 0; i < array.length; i++) {
        hoge = 処理1(hoge, i);
    }
    hoge = 処理2(hoge);
    return hoge;
}
```

ここから仕様が増えてきて、外部のパラメータがAのときはこうする。Bのときはこうする。みたいな処理が組み込まれていくとする。

```js
function なんかの処理(array = [], isA = false, isB = false) {
    let hoge = null;
    let aCount = 0;
    let aText = "";
    let bCount = 0;
    let bText = "";
    for (let i = 0; i < array.length; i++) {
        hoge = 処理1(hoge, i);
        if (isA && 処理A1(hoge)) {
            aCount++;
            aText += hoge.toString();
        }
        if (isB && 処理B1(hoge)) {
            bCount++;
            bText += hoge.toString();
        }
    }
    hoge = 処理2(hoge);
    if (isA && aCount < 10) {
        hoge = 処理A2(hoge, aText);
    }
    if (isB && bCount < 20) {
        hoge = 処理B2(hoge, bText);
    }
    return hoge;
}
```

さて、このコードのaCount, aText, bCount, bTextという変数はisA, isBがfalseのときには利用されない。
が、これはなんか嫌だ。
特定の条件でしか使わない変数を定義すると無駄に「なにこの変数？」と思われてしまう。
頭をなるべく使わないコードにしたい。

（一応、断っておきますが、別のこのコードがすごく悪いとは思わないです。
私が個人的に変数減らしたいなー。って思ってるだけです。）

## ではどうするか

こーする。

```js
function なんかの処理(array = [], isA = false, isB = false) {
    let hoge = null;
    const Aの処理 = isA ? Aの処理生成() : null;
    const Bの処理 = isB ? Bの処理生成() : null;
    for (let i = 0; i < array.length; i++) {
        hoge = 処理1(hoge, i);
        Aの処理?.処理1(hoge);
        Bの処理?.処理1(hoge);
    }
    hoge = 処理2(hoge);
    if (isA) hoge = Aの処理.処理2(hoge);
    if (isB) hoge = Bの処理.処理2(hoge);
    return hoge;
}

const Aの処理生成 = () => ({
    aCount: 0,
    aText: "",
    処理1(hoge) {
        if (処理A1(hoge)) {
            this.aCount++;
            this.aText += hoge.toString();
        }
    },
    処理2(hoge) {
        if (this.aCount < 10) {
            return 処理A2(hoge, this.aText);
        }
    },
});

const Bの処理生成 = () => ({
    bCount: 0,
    bText: "",
    処理1(hoge) {
        if (処理B1(hoge)) {
            this.bCount++;
            this.bText += hoge.toString();
        }
    },
    処理2(hoge) {
        if (this.bCount < 20) {
            return 処理B2(hoge, this.bText);
        }
    },
});
```

多少は見やすくなったか…？

もちろん、クラスを使ったってかまわない。
2024/1/2主にITとかセキュリティの記事

Wordpressプラグインのセキュリティアップデートと脆弱性情報(2023年12月)(12/31)
https://news.mynavi.jp/techplus/article/20231231-2854521/

管理の不十分なLinux SSHサーバに注意、継続的な攻撃を確認(12/31)
https://news.mynavi.jp/techplus/article/20231231-2853378/

iPhoneを侵害する「三角測量作戦」とは、未知のはずの機能を悪用(12/31)
https://news.mynavi.jp/techplus/article/20231231-2853242/

マルウェア「Carbanak」が復活、ランサムウェア攻撃での悪用確認(12/31)
https://news.mynavi.jp/techplus/article/20231231-2852488/

Azure WAF のマネージドルールセットが Apache Struts の脆弱性 CVE-2023-50164 に対応したので試してみた(12/31)
https://dev.classmethod.jp/articles/azure-waf-cve-2023-50164/

[Amazon Detectiveの最新アップデートをキャッチアップ]生成的AIを使ってセキュリティ調査を高度化する #AWSreInvent #SEC244(12/31)
https://dev.classmethod.jp/articles/aws-reinvent-2023-session-sec244/

「犯罪者のExcel離れ」が止まらない理由(12/31)
https://atmarkit.itmedia.co.jp/ait/articles/2312/31/news025.html

中国で摘発されたハッカー事件、3年連続増(12/31)
https://news.yahoo.co.jp/articles/12046b59cb13a89fa61feba8d982b0cea4c3b5db
https://www.afpbb.com/articles/-/3498411

2023年 Python / データ分析関連の人気Qiita記事150選(12/31)
https://qiita.com/kunishou/items/5e29e06e6669b05dc022

シェルとUNIXコマンドの未来 ～ これからの10年で起きるシェルスクリプトの変化(12/31)
https://qiita.com/ko1nksm/items/4907c1c88d478cac0be5

高まる脅威に危機感／人員、権限少なく機能せず(12/31)
https://ryukyushimpo.jp/newspaper/entry-2635160.html

政府、内閣サイバー職員倍増へ　次官級配置、指揮系統を強化(12/31)
https://www.47news.jp/10333239.html

パナHD、電力向けサイバー防衛 25年にも開始(12/31)
https://www.nikkei.com/article/DGKKZO77391600Q3A231C2TB0000/

今こそ学ぶ「デフォゲの向こう側」［第1回］(1/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/121800181/121800001/

TCP（Transmission Control Protocol）データを確実に届ける決まり事(1/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/091900172/121800004/
Rubyのバージョンが勝手に元に戻る現象を解消する

# はじめに

:::note info
本記事は、下記記事内「バージョンが変わらない場合」を実施しても解消されない方向けです。
:::

https://qiita.com/Ficus/items/bdef5c2b504d7a4008fb

# 現状
mac購入時からデフォルトでインストールされているRubyのバージョンを最新版に更新。
しかし、ターミナルを開き直すとバージョンが更新前に戻る。
```
Last login: Tue Jan  2 00:14:52 on ttys000
% ruby -v     
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin22]
```

# 目標
ターミナルを開き直しても、更新後のバージョンが認識されること。

# 対象
mac購入後、初めてローカルのRubyを触る方向け。

# 結論
ターミナルがzshの場合、`.zshrc`ファイルをいじる必要があった。
(上記記事ではターミナルがbashだから成功している)

zshとbash？何それ美味しいの？という方はこちらの記事をどうぞ。

https://qiita.com/its-key/items/f3a80aea0c0d3d218956

# 手順
ターミナルで、
```
% rbenv init
```
と入力すると、
```
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init - zsh)"
```
と返ってくる。

続いて、vimで`.zshrc`ファイルを開く。
```
% vim ~/.zshrc
```

vimで開いた`.zshrc`ファイルに
```
eval "$(rbenv init - zsh)"
```
を貼り付けて`:wq`でvimを抜ける。

```
% source ~/.zshrc 
```
を投入後、

`% ruby -v`を投入してバージョンを確認。
```
% ruby -v
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin22]
```

いけました！

# これは何をしているのか
ターミナルを新しく開いた時、
新しいバージョンのRubyやRailsを置いているファイルを
デフォルトで読み込むように設定している。
(今までは古いバージョンのRubyが保存してあるファイルがデフォルトで読み込まれていた)
```
# 今まで
% which ruby
/usr/bin/ruby
```
```
# 変更後
% which ruby
/Users/(ユーザー名)/.rbenv/shims/ruby
```

# 終わりに
ローカルにデフォルトで入ってるRubyのバージョンを更新してるわけじゃなくて、
新しくダウンロードしたRubyが格納されているファイルを読み込んでいるんですね。
(「更新」ではなく「新規作成」してるんですね)

参考サイトがとても参考になりますのでぜひ！

# 参考サイト

https://qiita.com/hacchi_mom/items/8e3ec4336312be343194

https://mogulla3.tech/articles/2021-07-10-understanding-rbenv-2/
ラズパイ4　電子回路作成

# DHT11で温度湿度を測定
![elec_circuit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/ea9c7a00-69a8-c913-3425-b0e33b359ee6.png)

なぜ0.45mAにしたかというと、DHT11に流れる電流を規格内におさめたかったため。参考文献：https://akizukidenshi.com/download/ds/aosong/DHT11_20180119.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/97be6195-018f-96e4-c199-8893fe6d3663.png)

最高でも1.0mA以内おさめればよいとのことだったので抵抗器11kΩ分用意した。
GPIOはchatgptに聞くと、以下のような感じ
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
GPIO（General Purpose Input/Output）は、一般的な用途の入出力ポートを指す用語です。これは、デジタル信号を扱うための汎用的な入出力ピンであり、コンピュータやマイクロコントローラー、シングルボードコンピュータなどのデバイスに見られることがあります。

主な特徴と用途は次のとおりです：

多目的な入出力: GPIOピンは、デジタル信号（0または1）を入力または出力するための多目的なピンです。これらのピンはプログラムで制御でき、様々なデバイスやセンサーとの接続に使用されます。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

入出力を制御したいときに使うピンということを頭に入れた。

## 動作確認
手順
git cloneでコードもってくる
↓
ピン番号調節
↓
電子回路単純にする(最初は電流が通らなかったため)
テスターあると便利だなと思った。
↓
無事GPIOの値を読み取ってくれた！
Next.js × Ant Designを使ったら、「Cannot use import statement outside a module」で怒られた件

## 概要
Next.js × AntDesignで個人開発を行っています。


AntDesignを導入後、「Cannot use import statement outside a module」というエラーが発生し、解決までに時間を要したので、備忘も兼ねて残しておきます。

殴り書きなので、ご容赦ください。

## 「Cannot use import statement outside a module」とは
直訳では「モジュール環境外ではimportが使えない」という意味になります。

一般的な解決方法は、`next.config.js` に `"type": "module"`を追加するなどになりますが、Google検索で出てきた内容を一通りやりましたが、解決できませんでした。

## 解決方法
Ant Designの[Github Issue](https://github.com/ant-design/ant-design/issues/46053)が立てられており、`next.config.js`に以下を追加する必要があります。

node_modulesに入っているパッケージをトランスパイルし、バンドルする必要があるようです。
そのためには、`transpilePackages` を使う必要があります。

```
const nextConfig = {
  reactStrictMode: true,
  // === 下記を追加 ===
  transpilePackages: [ "antd", "@ant-design", "rc-util", "rc-pagination", "rc-picker", "rc-notification", "rc-tooltip", "rc-tree", "rc-table" ],
}
```
PopOSとWindowsをデュアルブートする方法

## はじめに
手持ちのLGgramにSSDを増設して、1stSSDにはWindowsが、2ndSSDにLinuxを入れて遊んでいる状態。Web上のPopOSの記事を読んで面白そうだと思って2ndSSDにinstallしてみたが、PopOSばかりが立ち上がってWindowsが起動しなくなってしまった。いちいちFirmwareに入ってBoot順位を変えてというのも面倒臭いので、起動時にどちらを起動するか選択できるようにしたい。その記録を残す。ちなみにEFI領域は1stにも2ndにも存在しており、本当はあまりよろしくない状態なのかもしれない。あと専門家でもない素人がイジった結果なので、あくまで自己責任で。

## 参考
[How To Dual Boot Windows And Pop!_OS](https://ostechnix.com/dual-boot-windows-and-pop-os/)
ChatGPT

## 手順
### 1. os-proberをインストールする
```
$ sudo apt install os-prober
```
### 2. sudo os-proberでWindowsの起動ディスクを確認する
```
$ sudo os-prober
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321085/6e70e920-d2c6-a844-c812-0c4d775ce38f.png)
/dev/nvme0n1p1 がWindowsの起動ディスクがある場所

### 3. EFI/Microsoftディレクトリをコピーする
上記で判明した起動ディスクの場所をマウントしてPopOSのブート領域にコピーする
```
sudo mount /dev/nvme0n1p1 /mnt
sudo cp -ax /mnt/EFI/Microsoft /boot/efi/EFI
```
### 4. /boot/efi/loader/loader.confを編集する
```
timeout 10
entries 1
```
この2行を追加

### 5. 再起動する
以上の手続きで、下写真のような選択画面が出てくるはず。
systemdで起動しているはずなので、grub2はインストールせず。ただ検証のため、grub2をインストールしたり、PopOSを入れ直したりしたため、grubがEFI領域に残っている可能性はあるが・・・大丈夫なはずだ。Archlinuxを入れたときも同様の手法でできたから。
参考（自己記事） [systemdでArchlinuxとWindowsのデュアルブートする方法](https://zenn.dev/soh506/articles/b9631abe4813eb)

![PXL_20240101_160623663~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321085/a28accbc-a7f3-f550-6234-1640e0149f25.jpeg)

しばらく記事を書くのをサボっていたが、2024年はなるべくアウトプット重視の1年にしていきたい。
ApacheでのBasic認証

# 目次
1. はじめに
2. パスワードファイル作成
3. グループファイル作成
4. Basic認証設定
5. 動作


# 1. はじめに
Basic認証の動作検証のメモ。
　※参考：[Basic認証(Apache)](https://httpd.apache.org/docs/2.4/ja/howto/auth.html)

`.htaccess`ファイルでBasic認証を設定する場合、`httpd.conf`で該当ディレクトリの`AllowOverride`(デフォルトは`None`)を`ALL`か`AuthConfig`にする必要がある。
しかし、他のディレクトリで稼働中のコンテンツに対して影響を与えたくないため、
`httpd.conf`のDirectoryディレクティブ内で記述する。


# 2. パスワードファイル作成

`htpasswd`コマンドで、パスワードファイルにユーザ名とパスワードを保存する。
コマンド実行後には2回パスワードの入力が要求される。

#### パスワードファイルを新規作成
```
htpasswd -c 保存先 ユーザ名
-------------------------------------------------
htpasswd -c /usr/local/apache/passwd/passwords user1
```

#### パスワードファイルからユーザを削除
```
htpasswd -D 保存先 ユーザ名
-------------------------------------------------
htpasswd -D /usr/local/apache/passwd/passwords user1
```

# 3. グループファイル作成
複数のユーザを認証させる場合はグループを使用すると便利。
（承認させるユーザを変更する際にApacheを再起動する必要がない）
以下の内容をテキストファイル`/usr/local/apache/passwd/groups`に記述する。
```
グループ名: ユーザ名 ユーザ名 ...
-------------------------------------------------
Group1: user1 user2
```

# 4. Basic認証設定
以下の内容を`httpd.conf`の`Directory`ディレクティブ内で記述する。
#### ユーザを認証させる場合
```
AuthType Basic
AuthName "認証名"
AuthBasicProvider file
AuthUserFile パスワードファイルのパス
Require user ユーザ名
-------------------------------------------------
AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
Require user user1
```

#### グループを認証させる場合
```
AuthType Basic
AuthName "認証名"
AuthBasicProvider file
AuthUserFile パスワードファイルのパス
Require group グループ名
-------------------------------------------------
AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group Group1
```



# 5. 動作
#### ブラウザからアクセス
ユーザ名とパスワードの入力を要求される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666237/05db479a-f0cf-675a-d1f5-01411156e13b.png)
・認証失敗
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666237/19c71ec6-e1b9-cb69-5367-07469dac8f51.png)
・認証成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666237/802067e4-c9dd-74fb-bba6-27182aa52394.png)


#### コマンドラインからアクセス
```
curl -u ユーザ名:パスワード URL
-------------------------------------------------
curl -u user1:password http://localhost/basictest/index.html
```

#### コマンドラインからファイルをダウンロード
```
wget URL --http-user="ユーザ名" --http-password="パスワード" -O ファイルの保存名
wget http://localhost/basictest/downloadtest.txt --http-user="user1" --http-password="password" -O downloadresult.txt
```
BigQueryに今年のラッキーナンバーを決めてもらう

# はじめに
1年の計は元旦にあり！ということで、新年１発目はライトなネタ記事書きから始めていこうと思います。
BigQueryのRand関数を使って、2024年のラッキーナンバーを１つ決めてもらおうと思います。

# 結果
今回は1-100の中から１つ決めてもらおうと思います。Rand関数は0-1の小数点を乱数生成するので、でた乱数を100倍して、Round関数で整数化します。
結果は.....![スクリーンショット 2024-01-02 1.12.46 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/d062861f-de68-9152-a9da-f6921bc68042.png)
**71**でした！ 
7入ってましたね。運良さそうです。今年は、何か数字決める時は、71に関係するもの使ってきます。
ABC053 ARC068 の問題を解いてみました

## A問題
https://atcoder.jp/contests/abc053/tasks/abc053_a

1200 未満かを if文で判定しましょう。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int x;
  cin >> x;
  if(x < 1200){ //1200未満なら
    cout << "ABC" << endl;
  }
  else{
    cout << "ARC" << endl;
  }
  
}
~~~

## B問題
https://atcoder.jp/contests/abc053/tasks/abc053_b

最も左にある <code>A</code> の場所と、最も右にある <code>Z</code> の場所を調べることによって、解くことができます。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  string s;
  cin >> s;
  int a = s.size(), z = 0;
  
  for(int i = 0; i < s.size(); i++){
    if(s[i] == 'A'){ 
      a = min(a, i); //左の A の位置を記録
    }
    else if(s[i] == 'Z'){ 
      z = max(z, i); //右の Z の位置を記録
    }
  }
  cout << z - a + 1 << endl;
}
~~~

## C問題
https://atcoder.jp/contests/abc053/tasks/arc068_a

6点 と 5点 を交互に獲得するのが最善手です。
繰り返しで実装すると、 TLE になってしまいます。

四則演算で、最小の操作回数を求めましょう。 (11 = 5 + 6)

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  long long x;
  cin >> x;
  long long score = 0, ans = 0;
  
  ans = x / 11 * 2;  //この計算で、とりあえず目標点数の少し前までの手数を計算できる
  score = ans / 2 * 11;
  if(x - score > 6){
    ans += 2;
  }
  else if(x - score <= 6 && x - score != 0){
    ans += 1;
  }
  
  cout << ans << endl;
}
~~~

## D問題
https://atcoder.jp/contests/abc053/tasks/arc068_b


まず、取り除くべきカードは、その整数が2枚以上のカードに書かれているものです。

消せるカードの数は必ず偶数枚になるので、消す必要のあるカードの枚数が奇数のときは、消す枚数は $消す必要のあるカード + 1$ となります。

なので、$全体のカードの枚数 - 消す枚数$ で答えを求められます。


~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int n;
  cin >> n;
  set<int> card; //どんなかーどがあるかをきろくしておく
  int ans = 0;
  for(int i = 0; i < n; i++){
    int a;
    cin >> a;
    if(card.find(a) != card.end()){
      ans++; //重複のあるカードの数を数えておく
    }
    card.insert(a);
  }
  if(ans % 2 == 1) ans++;
  cout << n - ans << endl;
}
~~~
UnrecognizedClientException: The security token included in the request is invalid. の解決備忘録

新年あけましておめでとうございます。
本年も何卒よろしくお願いいたします。

さて、現在インフラの勉強をしている中で遭遇したエラーの解決備忘録になります
今宵もお付き合いいただけますと幸いです


## 概要
ecspressoを使ってみようと思い、導入する際に...
```
$ ecspresso init --config config.yml --region ap-northeast-1 --cluster prod-my-app --service prod-my-app
```

下記のエラーが発生しました
```
2024/01/02 00:11:05 [ERROR] FAILED. failed to describe service: operation error ECS: DescribeServices, https response error StatusCode: 400, RequestID: request_id_hoge, api error UnrecognizedClientException: The security token included in the request is invalid.
```

## 使用環境
- aws cliを利用中
- ecs cli未使用
- terraformは使用できたので、アクセスキーは有効であると考えていた

## 結論
単純です、エラーメッセージの通りアクセスキーの更新が必要でした
```
The security token included in the request is invalid.
```


## 解決の手順① 新しいアクセスキーの生成
本日は**マネジメントコンソール上で新しいアクセスキーを生成しました**
こちらをaws cliで対応する手順は本日割愛します

 => 参考情報はこちら
 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-iam-create-creds.html


## 解決の手順② aws configureに上記のアクセスキーを設定する
取得したアクセスキーをaws configureに設定していきます


```
$ aws configure
AWS Access Key ID [****************ABCD]: 取得したアクセスキー
AWS Secret Access Key [****************Fgih]: 取得したシークレットキー
Default region name [ap-northeast-1]: 
Default output format [json]: 
```

こちらでaws configureへの設定は完了です


## 解決の手順③ aws cliの環境変数の設定
特にprofileを指定したaws cliは使用していない前提になりますので
デフォルトの環境変数を更新していきます。

```
$ export AWS_ACCESS_KEY_ID=取得したアクセスキー
$ export AWS_SECRET_ACCESS_KEY=取得したシークレットキー
```


こちらで完了です
簡単に解決できて安心しました！


### 参考情報
aws cliのコマンドを忘れるので、以下のチートシートを毎度拝見しております
大変助かっております、ありがとうございますm(_ _)m

https://qiita.com/notakaos/items/4a7774ee6e1d11bb55d2
ローカル環境で生成AIモデルの回答結果を得る

# 生成AI=ChatGPT?
API経由で生成AIを呼び出すWebアプリを作ろうと思った時に、今まではOpenAIのAPIを呼び出していたが、もし思うようにOpenAIのAPIが使えなくなると今後Webアプリ開発などで支障が出る可能性がある。
そこで、ローカル環境でLLMモデルを使う方法について整理した。

# TL;DR
1. WSL2環境(ubuntu)にllama-cpp-pythonを入れる。
2. モデルファイル（gguf）をhuggingfaceからダウンロードする。
3. pythonでLLMモデルにクエリを投げるコードを書く。

### 実行環境用意
実行環境はWSL2上のubuntuで、python3が入っている。
以下コマンドでllama-cpp-pythonを入れる。
```
pip3 install llama-cpp-python
```
### モデルファイルのダウンロード
[huggingface](https://huggingface.co/)のサイトからモデルファイルをダウンロードする。拡張子が「.bin」でなく、「.gguf」であるものをダウンロードすることに注意。
今回は以下のモデルファイルをダウンロードした。
[Llama-2-7B-Chat-GGUF](https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF)

モデルファイルをダウンロードする時は、モデルファイルのフロントページにアクセスして「Files and versions」タブを選択し、一番下のggufファイルをダウンロードする。
ダウンロードボタンのアクセスリンクをコピーして以下のようにwgetする。
```
wget -O llama-2-7b-chat.Q8_0.gguf https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q8_0.gguf?download=true
```

### 生成AIモデルと対話するコード
LLMモデルに問いかけ、応答を確認するコード。

```
from llama_cpp import Llama

model_name = "llama-2-7b-chat.Q8_0.gguf"
llm = Llama(model_path="./models/" + model_name)

while True:
    text = input("What is your question? [type 'exit' to end]: ")
    if text == "exit":
        break
    query = "Q: " + text + " A: "
    output = llm(query, max_tokens=64, stop=["Q:", "\n"], echo=True)
    print(output)
```

このコードを実行すると、コンソールが入力待機状態になる。そこで、質問を入力するとダウンロードしたLLMモデルを使って回答が得られる。会話を終了する場合は「exit」と入力する。
以下は会話の例。
「Why is dinosaur extinct?」と入力。WSL2に16GBメモリ、2コアCPUを割り振ったローカル環境での応答時間は5秒程度だった。

```
What is your question? [type 'exit' to end]: Why is dinosaur extinct?
〜〜〜
{
　　　　'id': 'cmpl-993fec40-c6f5-4d0f-876b-3b7bfdae0095',
  'object': 'text_completion',
  'created': 1704121983,
  'model': './models/llama-2-7b-chat.Q8_0.gguf',
  'choices': [
  　　{
    'text': 'Q: Why is dinosaur extinct? A:  Dinosaurs are not actually extinct.  In fact, many species of dinosaurs are still alive today and can be found in the modern world. For example, birds are direct descendants of certain species of theropod dinosaurs and share many similarities with them. So, while the last of',
    'index': 0,
    'logprobs': None,
    'finish_reason': 'length'
   }
  ],
  'usage': {
    'prompt_tokens': 14,
    'completion_tokens': 64,
    'total_tokens': 78
  }
}
```

# まとめ
ローカル環境でLLMモデルファイルを使い、簡単に生成AIとやりとりするpythonコードを作成することができた。
このコードをAPIサーバー中に組み込めば簡単に生成AIの結果を返すAPIを作成することができるとわかった。
ABC052 ARC067 の問題を解いてみました

## A問題
https://atcoder.jp/contests/abc052/tasks/abc052_a

面積を比較しましょう。どちらの面積も同じ場合、どちらを出力してもok。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  if(a * b > c * d){ //面積の大きい方を出力(maxを使ってもいい)
    cout << a * b << endl;
  }
  else{
    cout << c * d << endl;
  }
}
~~~

## B問題
https://atcoder.jp/contests/abc052/tasks/abc052_b

もし、<code>I</code> が出現したら 変数に +1 して、
<code>D</code> が出現したら 変数に -1 して、
その変数の最大値を出力します。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int n;
  string s;
  cin >> n >> s;
  int x = 0, ans = 0;
  
  for(int i = 0; i < n; i++){
    if(s[i] == 'I'){ // I なら +1
      x++;
    }
    else{ //D なら -1
      x--;
    }
    if(x > ans) ans = x; //最大値を記録
  }
  cout << ans << endl;
}
~~~


## C問題
https://atcoder.jp/contests/abc052/tasks/arc067_a


https://qiita.com/karaju/items/c8ee5302a3e897475435

## D問題
https://atcoder.jp/contests/abc052/tasks/arc067_b

この問題では、実は 隣の町に移動する と 隣の町にテレポートする 以外の行動を取る必要はありません。
なぜなら、隣の町に移動せずに、そのさらに先の街に移動しても、結局戻る手間が発生して、一度通った道をもう一度往復しなければならないからです。

なので、隣の町に移動する のと 隣の町にテレポートする で、疲労度が少なくなる方を選べばよいです。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  long long n, a, b;
  cin >> n >> a >> b;
  long long x[n];
  for(int i = 0; i < n; i++) cin >> x[i];

  long long ans = 0;
  for(int i = 0; i < n - 1; i++){
    long long cost = (x[i+1] - x[i]) * a;
    //歩きの疲労度を計算する
    
    ans += min(cost, b);
    //隣の町まで歩くか、テレポートするかの楽な方を選ぶ
  }
  cout << ans << endl;
}
~~~
babashkaとadbでスマホの音楽ファイルを手軽に管理する仕組みを作った

今年の年末年始はとある事情で
現在住んでいる埼玉県から、実家の広島県まで車で帰る事になりました。
その運転時間は概算で片道約12時間！

私の車は古くなったカーナビを取り外して、Bluetoothの音楽デッキを積んでいるので
スマホにさえ潤沢な音楽ファイルが入っていれば退屈に耐える事ができそうですが、
Androidの音楽ファイルをメンテする事は非常に面倒でつい忘れがちとなってしまいます。

前回の帰郷では音楽ファイルのメンテを忘れたので、
急遽povo2.0の24時間無制限プランを購入し、YouTubeを再生しまくって帰郷しました。
(あれ？大量の音楽ファイルを買ってメンテするより、330円出すほうが安くね？)

---

幸いAndroid端末にはADBというデバッグ機能が備わっており、
`adb`という実行ファイルを使えばコンソール上でコマンドを実行しながら音楽ファイルを全て送信することが可能なのは知っていました。
この流れを Clojure の babashka で管理すれば更に楽に管理出来ないか？

作ったのがこちら

https://github.com/miyabisun/adb-music-file-updater

---

最初は babashka で手持ちの音楽ファイルをYAMLでリストアップ、
必要なものだけエディタで抽出してからAndroid端末に送信するということを目指していました。

しかし、世の中には`'`や` `のホワイトスペースをアーティストやアルバム名に含ませる、
じゃじゃまる・ぴっころ・ぽろりの3人が「絶対に許さんぞ！じわじわとなぶり殺しにしてくれるわ！」と叫ぶレベルの名前付けをしている事があるんです。

`(shell "adb" "shell" "ls" "/storage/emulated/0/Music/xxx yyy")`
こんな感じでbabashkaのshellから、`adb`に注入してAndroid端末で実行という流れになりますが、
この時の`"/storage/emulated/0/Music/xxx yyy"`が`adb`に注入した時に`/storage/emulated/0/Music/xxx`になって、
`xxx yyy`というアーティスト名なのに、`xxx`アーティストだけを探しに行ってそんなファイルねえよと怒られるわけですね。

このエスケープ処理が極めて面倒でもう無理……ってなりました。

なので最終的には `adb push [ローカルパス]/. [Androidパス]` を実行するだけの超しょぼい物が出来上がりました。