OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Workspacesの設定をAnsibleで実施する（準備編）

# はじめに
Amazon Workspaces の設定をIaC化したいので実施しました

バンドルは下記
Standard with Windows 10 and Office 2019 Pro Plus (Server 2019 based)

# 設定
## Chocolateyのインストール
公式サイトに従ってインストール
https://chocolatey.org/install#individual

## OpenSSHの導入
WindowsだけどSSHでやったほうが楽だなぁと思ったのでOpenSSHを入れることに

公式に手順がある
https://docs.ansible.com/ansible/latest/os_guide/windows_setup.html#installing-openssh-using-windows-settings

Powershellを管理者で起動して
`choco install --package-parameters=/SSHServerFeature openssh`

途中で下記メッセージが表示されたら「Y」を入力
`Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): Y`

## Security Group 設定
- Amazon Workspaces のIDをクリックし、「WorkSpace IP」を確認する
- EC2→ネットワークインターフェイス
- 「WorkSpace IP」でENIを特定する
- セキュリティグループを特定する
- セキュリティグループにAnsible操作元IPの設定をする
- SSH接続確認 Amazon WorkspacesユーザのID/PASでssh接続できる
`ssh -i アカウント@パブリックIP`

# memo
- Ansible操作元で一回ログインしておくこと
https://qiita.com/taka379sy/items/331a294d67e02e18d68d
- Auto StopでAnsibleが途中で止まると、「Gathering Facts」から先に進まなくなった。`~/.ansible`を削除すると動く
neosでlogix その91

# 概要
neosでlogixやってみる。
logixを、俺コードで表現してみる。

# 参考にしたページ

https://qiita.com/FRICK/items/5ba9c07c31df844f84c7

# 俺コード

```
Box.Rotate = T*10
	|> X 5.5
	|> Pack_xyz 0 45
	|> From_Euler

```

以上。
カスタム投稿と固定ページが入り組んだwordpressを作ってしまったので反省する

## はじめに
Webサイトを運用していくにつれ、コンテンツの拡充や統合が起きるのは当たり前のこと。
顧客要望をそのまま受け取りすぎて拡張性・汎用性をおろそかにしてしまったエンジニアのログです。
このプロジェクト自体はずっと前の者ですが、下書きしてから2年（もうすぐ3年）とあたためすぎたものです。ご容赦ください。

## Season 1

### 出会い
WebサイトをHTMLで管理しているが難しいので感覚的に操作できるようにしたい、というよくある要望からのスタートでした。
WordPressのカスタマイズを商売にしているので、カスタムフィールドを駆使して入力項目を明確にすることでを担当者のレベルに影響されずそれなりのクオリティのページを作成できるようにしていました。
今回もそれに漏れない要望だったので、項目をヒアリングしてそれっぽく構築をはじめました。


### 打ち合わせを重ねて
構築を進めながら原稿が集まり、着々とWebサイトの体を成してくるとクライアントも気持ちが盛り上がってくるものです。
今思えば当初の要望やスコープを軸に盛り上がりすぎた熱を収める必要があったように思いますが、未熟な私は自身の経験不足と要望を飲み込んでしまっていたのでした。


## Season 2

### 特に肝いりの製品情報
特にカスタマイズしたのは製品を管理する画面でした。
カスタム投稿を別途用意し、写真、カラーバリエーション、仕様、PDF…製品に関するすべての情報を盛り込みました。
製品ページとして出力するだけでなく、一押し製品としてのピックアップ、他製品との比較などなど…あらゆる出力が求められました。

### ええっ？！ここまでカスタマイズしておいて？！
まあまあ作りこんだのですが、専用管理画面のみでなくデフォルトの固定ページのみで済ますページも必要であることがわかりました。
ウィジウィグは残してあったんですが、出力するデザインの分岐等やそもそもの管理画面の機能が多すぎて切り替えもわかりづらくなってしまいました。
しかもクライアントからは管理画面使いづらいって言われてしまう始末。

つまり、固定ページを使う必要がでてきました。おかえり！

## Season 3

### 逆は作ったことがあった
オリジナル管理画面は使いづらいけど既に製品は登録されているので使い続ける。
でも今後は固定ページで運用していくから、固定ページを優先して表示する。
連携とかワンソースマルチユースとかめっちゃ求められてた気がするのに、全部それぞれ管理することになりました。

つまり最終的に、【基本は固定ページで、固定ページに存在しないときだけカスタム投稿を参照する】仕様となりました。

これがほんとにうまくいかなくてTeratail先生にお世話になったのでした。
[特定のカスタム投稿の優先順位を下げ、固定ページが優先して表示されるようにしたい](https://teratail.com/questions/199681)

add_filterほんと意味わからないんですけどどうやって皆さん使いこなしているんですか？
ここの修正はすごく時間がかかった気がするのですがあまり覚えてなくて、Teratail残っていたので思い出せる感じです。
関係ありませんが人間はある程度の痛みやストレスを感じると記憶を消去するらしいです。

### 納品
その他にもカスタマイズしたりデフォルト機能に戻したりありましたが、どうにか納めることができました。
そのサイトは今も公開されており更新されているのできっと中の人が頑張っているのだと思います。
当時の私（メンバー含め）の頑張りが手離れして使われているのは不思議な感じです。

## 反省点
### スコープや当初の目的から外れない
そもそも当初の見積や仕様から大幅に外れた作業となっていました。
製品管理のシステムを作ったことがない広報系Web屋が気軽に踏み入れていいものではなかったですね。
設計をもっと落とし込んだ上で見積りするべきでした。
設計を落とし込むってどういうことって感じですが、それこそ受注できる体制ではなかったということ…いい勉強になりました。

### オリジナルのデータは切り分ける
WordPressのカスタムフィールドで追加要素を保存できる事実はありますが、あまりに込み入るデータ量であれば別途にするべきでした。
項目の追加削除についても汎用性がないし、そもそも保存で配列になるしシリアライズ化すると検索や置換もうまくいかない…
当時の私はテーブルにデータを保存するという発想や知見がなかったのも大問題です。

### 「作れるか」でなく「使えるか」で考える
顧客の要望に「できらあ！」と無茶をしましたが、作れはしたもののそれは使いにくいものでした。
仕事なので、自分の達成感よりも実用性や顧客満足度にもっとフォーカスするべきでした。
かなりの工数を使いましたが、顧客が使えないのであればサービスとして本末転倒です。

## 過去の私へ
お疲れ様でした。よく生き残ったと思います。
あなたは半年後10年分のカタログとデータの突き合わせを一人でします。
骨の折れる作業ですが、あなたの嫌いな作業ではありません。頑張ってください。

つたない文章ですがこれでこの仕事を成仏させたいと思います、ありがとうございました。
配列処理を明確にする(for, foreach, while)

# はじめに
以前にも、配列処理についてはまとめましたが、まだ具体的に理解できていなかったのと少し時間が経ったので改めてまとめたいと思います。
今回は配列からデータを取得する方法に観点をおいてまとめました。

# データを取り出すにはfor / foreach /whileの3種類がある
## 特徴(使い道)
__for__
条件が成立するまで繰り返す。
回数が定まっているときに使用。

__(頻出)foreach__
指定したコレクションから要素を1つずつ取り出してコレクションの要素数分だけ繰り返す。

__while__
指定の条件を満たすまで繰り返す。
無限ループ注意。

## 基本構文
__for__
```
for(回数を格納する用の変数 = 始まりの値; 繰り返しが続く条件; カウントアップする数)
    {
    //処理内容
    }
```

__foreach__
```
foreach(データ型 変数名 in コレクション)
    {
    //処理内容
    }
```

__while__
```
while(条件式)
    {
     //処理内容
    }
```

## 取り出し方(例文)
__【for】__
__配列__

```
string[] protein = {"肉", "魚", "卵"};
void Start()
{
     for(int i = 0; i < protein.Length; i ++)
     {
          Debug.Log(protein[i]);
     }
}

```
__リスト__
```
List<string> protein = new List<string>{"肉", "魚", "卵"};
void Start()
{
     for(int i = 0; i < protein.Count; i ++)
     {
          Debug.Log(protein[i]);
     }
}
```
__【foreach】__
__配列__
```
string[] protein = {"肉", "魚", "卵"};
void Start()
{
     foreach(string proteinType in protein)
     {
          Debug.Log(proteinType);
     }
}
```
__リスト__
```
List<string> protein = new List<string>{"肉", "魚", "卵"};
void Start()
{
     foreach(string proteinType in protein)
     {
          Debug.Log(proteinType);
     }
}
```

__【while】__
__配列__
```
string[] protein = {"肉", "魚", "卵"};
void Start()
{
     int i = 0;
     while(i < protein.Length)
     {
          Debug.Log(protein[i]);
          i ++;
     }
}
```
__リスト__
```
List<string> protein = new List<string>{"肉", "魚", "卵"};
void Start()
{
     int i = 0;
     while(i < protein.Count)
     {
          Debug.Log(protein[i]);
          i ++;
     }
}
```

# その他知識
以前に他の記事でコメントをいただいたのですが、
forとforeachでは、 __forの方がパフォーマンスは良い__ とのこと。
また、__Listを使う場合、大体はforeach使用する__。(またはLinq)
__for文は使い道が限定的__ である。(コントロールやファイル読み込み等で列挙不可なオブジェクトのlengsをみる必要があるときとか)

# 関連記事
https://qiita.com/hanatan079/items/9c29d7ab61729177cbe3

https://qiita.com/hanatan079/items/01530bc45bab85f3d19f

https://qiita.com/hanatan079/items/45bf74a00dfe1c4249cc
neosでlogix その90

# 概要
neosでlogixやってみる。
logixを、俺コードで表現してみる。

# 参考にしたページ

https://qiita.com/tatmos/items/cfe4498fc74d6067fedb

# 俺コード

```
Box.Scale = Pack.xyz 3 1 1

Box.Scale = T
	|> % 3
	|> Pack.xyz 1 1


```

以上。
pyenv内でのpipのセグフォエラー対処法

# 実行環境
- OS: Ubuntu20.04
- pyenv 3.6.9

# pyenv内でpip install時のエラー
pyenv内でpip installする際に下記のエラーが発生。

```:コード実行内容とerror内容
$ pip install {package}

/home/${username}/.pyenv/pyenv.d/exec/pip-rehash/pip: line 20: 143005 Segmentation fault      (core dumped) "$PYENV_COMMAND_PATH" "$@"
```

# 解決策

```
$ sudo apt install clang -y
$ CC=clang pyenv install 3.6.9
```

として, pyenvのpython3.6.9環境を入れ直すと上記エラーが出なくなる.
Ruby 変数を利用して値に名前をつけて使う

# 変数とは
変数とは、値を入れる箱のようなものです。
その箱に名前を付けたものが、変数名と言います。

変数を利用することで、値を再利用したいときに、変数名を使うだけで呼び出すことができます。

# 変数名の定義
```
fruit = "りんご"
puts fruit
=> "りんご"
```
定義は上記のようにします。" = "を挟んで、右辺に置いた値を、左辺の変数（今回はfruitという箱）の中に入れるイメージ。

***変数名　= 格納する値***　

この" = "は、「等しい」という意味ではなく、「変数の箱の中に値を入れる」という意味です。
***代入演算子***と言います。



例
変数を使って、以下の条件に沿ってプログラムを作成します。

条件：
国語が80点、英語が50点、数学が70点の場合のテストの平均点をターミナルに出力させる。
 ターミナルに、「３教科の平均点は、◯点です。」と出力されるようにコードを書く。

```ruby
# 模範解答
japanese_score = 80
english_score = 50
math_score = 70
average_score = (japanese_score + english_score + math_score) / 3
puts "3教科の平均点は#{average_score}点です。"
```
```ruby
# ターミナル出力
3教科の平均点は66点です。
```

仮に、上記模範解答の中にある点数はAさんの得点だったとします。
次にBさんの点数の平均を求めたいときには、点数を変更するだけで平均点を出すことができます。
そのため、変数を利用することで、値を再利用したい場合に、変数の名前を使うだけで呼び出すことができるということになります。
SMC電磁弁SY　CKD電磁弁4GBシリーズの型番

カタログ毎回見てたら間に合わないので。
### SY3140-5LUF
- SY:シリーズ名

- 3
サイズ
シリンダ径×移動速度で選ぶ。5や3にしてもあんまり安くないのでサイズが収まるなら7
https://qiita.com/ki_kifa/items/7de00514b3c3b35416ef

- 1(シングル)　　2(ダブル)　　3(クローズドセンタ)　　4(エキゾーストセンタ)　5(プレッシャセンタ)
停止時に押したいときに4をまれに使うくらいで、基本は1,2

- 0:プラグイン　SS5Y5-10L33-04U-C8やSS5Y5-10S60-16B-C8等と組み合わせ、
2:個別配管
4:マニホールド配管　SS5Y7-42-08-C10等と組み合わせ。
意外にも安いのは4なので、迷ったら4にして4か8連ブロックを買う。

- 0:メタルシール　粉体に弱い
1:弾性体シール　ゴムは油に弱い
だいたい0でいい。メタルは微小量漏れるが寿命が長い。

- 5(DC24V)　　6(DC12V)　　R(3V)　　　2(AC200V)
5が主流。R(3V)はラズパイとかで駆動できそうだが、消費電力0.4Wがつらい。

ここから下は違っても交換できる。
- D（ねじ締めDINターミナル）　L（コネクタ式300mmリード線）　WO(M8コネクタ)
配線端子の違い。Lが配線しやすくて好き。よっぽど施工時間なければWOだがやや高。

- Z（NPNランプ付き）　U（無極性・ランプ付き）
古い設備ではランプなしもあるが、補充はZかUにする。Uは200円くらい高いけど配線逆でもいいのでとりあえずU。
VQシリーズ(大きいサイズ)は標準が無極性なので配線で極性に頓着しない人が多い。

- E（レバーロック）F(スライドロック)　無記号（プッシュ式手動）D(ドライバ操作)
シングルは押しっぱなしがつらいのでF、ダブルは戻し忘れ防止で無記号が良いです。Dは取り付け向きでドライバー入らないからやめとけ。

- プラグイン式は末尾に1がつく。

- ー01　配管径
配管方式が2(個別配管)の時のみ選択。

マニホールド配管用に合わせて買う。
メタルマニホールド
SS5Y7-42-08-C10
ブランキングプレート
SY7000-26-22A
プラグ
PP10V-0　(pisco)10のとこがホース外径

MN
Nはブロックをつなげていく形式。無記号にして最初から8連を買え。

### 4GB419R-00-E2A-3
- 4G シリーズ名
- B　A個別配管　Bベース配管　Dグリス封入個別配管　Eグリス封入ベース配管
　Bにする。DやEは湿潤エアに強いが使わない。
- 4 サイズ
- 1(シングル) 2(ダブル)
- 9R 搭載用バルブ　0がマニホールドベース
- 00接続口径 Bはベース配管なので00
- E2(ランプ付きリード線300mm)　E21(ランプ付き1000mm)
- A切削油対応 無記号でいい。
- 3　24V

メタルマニホールド
M4GB4R-C10-D-8
-D DINレール組付
マスキングプレート
4G3R-MP
Unity 敵の自動追従の設定

## 0.0 はじめに
プレイヤーが敵から追いかけられる状況を作る方法です。
ちなみに自動追従式のことを英語でホーミング（Homing）と言うようです。

## 1.0 自動追従用のスクリプト
以下のスクリプトを自動追従するオブジェクト（敵など）に貼り付けます。
このスクリプトではプレイヤーをタグをたよりに取得しています。
忘れずにプレイヤーのタグをPlayerにしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/b4926022-f015-c255-9434-3d8c2cb51cc6.png)


```C# Test.cs
using UnityEngine;

public class Homing : MonoBehaviour
{
    Transform playerTr; // プレイヤーのTransform
    [SerializeField] float speed = 2; // 敵の動くスピード

    private void Start() {
        // プレイヤーのTransformを取得（プレイヤーのタグをPlayerに設定必要）
        playerTr = GameObject.FindGameObjectWithTag("Player").transform;
    }

    private void Update() {
        
        // プレイヤーとの距離が0.1f未満になったらそれ以上実行しない
        if (Vector2.Distance(transform.position, playerTr.position) < 0.1f)
            return;

        // プレイヤーに向けて進む
        transform.position = Vector2.MoveTowards(
            transform.position,
            new Vector2(playerTr.position.x, playerTr.position.y), 
            speed * Time.deltaTime);
    }
}
```

## 2.0  MoveTowards関数 Vector2.MoveTowards(Vector2 current, Vector2 target, float maxDistanceDelta)
MoveTowards関数はオブジェクトを目的地に移動させる際に使われる関数です。引数で設定するのは「現在地の座標current」、「目的地の座標target」、「速度の値maxDistanceDelta」です。上のスクリプトでは “current” に自分の座標、”target” にプレイヤーの座標、”maxDistanceDelta” にspeedの値にした１フレームでの移動距離（=速度）を指定することで敵がプレイヤーを追いかけるようになっています。
ちなみにVector3を使ったMoveTowards関数であるVector3.MoveTowards(Vector2 current, Vector2 target, float maxDistanceDelta)も同じ処理がされます。

**青い丸がPlayer、緑の丸が自動追尾するオブジェクト**
![MoveTowards.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/a30f8356-8d5e-a005-97b9-f1c1335164e4.gif)
Reactの基礎５:フォームの作成

# フォームの作成と値の更新

```test.js
[value, setValue] = React.useState("")
```

で、変数とその値の更新の関数を宣言できます。`setValue(xxx)`を実行する度に`value`が`xxx`に更新されて、それらが宣言された関数(コンポーネント)が再実行されます。例えば次のコードでは画面には返り値のフォームが表示されていて、その入力が更新されると`onChange`の中の関数が呼び出されます。すると、値が更新されて再実行によって更新後の値がコンソールに表示されます。

```App.js
import React from "react"

function App() {
    const [firstName, setFirstName] = React.useState("")
    
    console.log(firstName)
    
    function handleChange(event) {
        setFirstName(event.target.value)
    }
    
    return (
        <form>
            <input
                type="text"
                placeholder="First Name"
                onChange={handleChange}
            />
        </form>
    )
}

export default App;
```

なお、以下のようにindex.htmlを作成します。`<div id="root"></div>`にrootと紐づけた`index.js`の中身(正確にはそこで呼び出したApp.jsの関数`App`)であるフォームが呼び出されています。

```index.html
<html>
    <head>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <div id="root"></div>
        <script src="index.pack.js"></script>
    </body>
</html>
```

例えばjohnと打ち込んでみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/1304a144-0754-6bbe-326e-065c015a2bb9.png)


一文字打つごとに値が更新されてコンソールにそのログが表示されていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/caff5d33-aaf0-c07d-cf5b-99a8877447fe.png)

## 構造体の更新

今は文字列が変数でしたが、構造体でも同様の操作ができます。そのためには、キーと値を指定して更新するようにします。

```App.js
import React from 'react';
import './App.css';

function App() {
    const [formData, setFormData] = React.useState(
        {firstName:"",lastName:"",email:""}
    );
    
    console.log(formData);
    function handleChange(event) {
        setFormData(prevFormData => {
            //配列の要素の追加方法と同様
            return {
                ...prevFormData, [event.target.name]: event.target.value
            }
        });
    }
  
    return (
        <form>
            <input
                type="text"
                placeholder="First Name"
                onChange={handleChange}
                name="firstName"
                value={formData.firstName}
            />
            <input
                type="text"
                placeholder="Last Name"
                onChange={handleChange}
                name="lastName"
                value={formData.lastName}
            />
            <input
                type="text"
                placeholder="email"
                onChange={handleChange}
                name="email"
                value={formData.email}
            />
        </form>
    )
};


export default App;
```

例えば次のように打ち込んでみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/ea9857c8-c13d-6bf6-40fb-64edfff591f2.png)

コンソールには構造体`formData`の更新の様子が出力されています（一部抜粋）：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/fde52501-a335-3e10-872f-7d7d1f0ee5a4.png)


# 参考記事
- https://scrimba.com/learn/learnreact
- https://ja.reactjs.org/
javaのメソッド

# メソッドとは
+ コードを分割＆整理、共通で利用できる機能
+ 使用する場面：大規模なプログラムを開発する時
+ コード名付けることが可能
+ 何度でもコードを呼び出し可能
+ コードは組み合わせ可能
+ public static voidでメソッドを作ることが可能。
    これをmainメソッド内で呼び出し可能。
　`public static void メソッド名(){処理内容}`

## 使用例
```java
import java.util.*;
public class Main{
    public static void main(String[] args){
        int a=(int)(Math.random()*10+1);
        System.out.println("リンゴを"+a+"個買った");
        //メソッドはMath.random()とSystem.out.println()
    }
}
```

System.out.println(引数)
メソッド内で処理した結果は戻り値として変数aに使える。
wsl2にdocker, docker-composeをインストールする【メモ】

# インストール
dockerとdocker-composeをインストールする一連のコマンド
```bash
USERNAME=#ユーザ名
```
```bash
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install -y     ca-certificates     curl     gnupg     lsb-release
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
sudo echo   "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo gpasswd -a $USERNAME docker

sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo curl -SL https://github.com/docker/compose/releases/download/v2.15.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
```
この後再起動が必要
# 動作確認
```bash
sudo service docker start
docker run hello-world
```

# 自動起動設定
以下を実行して編集画面へ
```bash
sudo visudo
```
末尾に以下を追加して保存
```bash
%docker ALL=(ALL)  NOPASSWD: /usr/sbin/service docker start
```
~/.bashrcの末尾に以下を追記して保存
```bash
if [ $(service docker status | awk '{print $4}') = "not" ]; then
  sudo service docker start > /dev/null
fi
```
参考文献付きの新たなるAI Perplexityが登場

ここ最近AI界隈ではChatGPTが何かと話題ですが、
[Perplexity](https://www.perplexity.ai/)
という新たなAIが誕生しました。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Announcing a major update to Perplexity Ask: the world’s first conversational search engine! Now, you can read answers with up-to-date sources and ask follow-up questions to dig deeper. In other words, you can chat with your search engine!<br>Try it out at <a href="https://t.co/ut3wdOxstL">https://t.co/ut3wdOxstL</a> <a href="https://t.co/rQCyeJhzto">pic.twitter.com/rQCyeJhzto</a></p>&mdash; Perplexity AI (@perplexity_ai) <a href="https://twitter.com/perplexity_ai/status/1616120452338036736?ref_src=twsrc%5Etfw">January 19, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

公式Twitterによると、


>世界初の会話型検索エンジン「Perplexity Ask」のメジャーアップデートを発表!世界初の会話型検索エンジンです！最新のソースで回答を読んだり、フォローアップの質問をして、より深く掘り下げることができるようになりました。つまり、検索エンジンとチャットができるのです。
http://perplexity.ai でお試しください。
※DeepLによる翻訳

ということで、AIを用いた会話型検索エンジンとなっています。

ChatGPTではそれなりに高精度で質問の答えが返ってきますが、
Perplexityにおいては、なんと参考文献付きでの解答となっており、
より信頼できる回答となっています。
※必ずしも回答が正しいとは限りません。
日本語での質問が可能ですが、
必ずしも日本語で回答してくるわけではありません。

また、2023年1月現在無料で利用できます。
※アカウント登録とかもなしです。

以下にいくつか事例を紹介します。

# 今日は何の日?
今日は何の日なのか質問してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/75ae3b28-f5de-28c0-5d44-d4f5cee42fb7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/524dc248-3b94-1719-2bdf-46e481496ca4.png)

答えとして、参考文献付きで回答してくれています。
[数字]の所をクリックすると、参考文献先に飛んでくれます。
しかも、関連する情報につても記載があり、関連情報を追加で調べることもできます。
また、Ask a follow upで追加質問ができるので、より詳しく調べることもできます。

# 鉄道運行情報
鉄道の運行情報について聞いてみました。
今回はJR九州について聞きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/63d3d3a6-5aa0-0831-44cf-c5591caa324f.png)
遅延についての情報は得られませんでしたが、
運休情報については回答してくれました。

# 文章生成
チャットAIでよくある文章生成を行ってみました。
今回はサクラで始まる文章を作成させてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/ac7efb21-614f-1145-d315-71109ee0d2f0.png)
あまり文章作成は得意ではないようです。
今度はサクラで始まる小説を作成させてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/a8d31232-27d7-84ba-7708-5aa106757418.png)
作成というよりは既存の小説でサクラから始まるものをピックアップしてくれています。

# 数学の問題を解かせる
数学もできるのかということで、
中学で習う解の公式の証明について聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/2a155bff-2315-bdef-4214-f2c4a4a58590.png)
いくつかの証明方法が記載されているのみで、詳細な解法の記載はありませんでした。
ただし、参考文献に行けば解法の記載がありました。
今度は微分を計算させてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/1ef1c591-fb74-4f0e-75d3-44dd54eb86f3.png)
こちらはうまくいきました。


# まとめ
すごいAIが登場してきました。エビデンス付きという今までにはなかったAIです。
とりあえずで上記事項を試してみましたが、
他にもできることはありそうです。
皆さんも色々試してみてはいかがでしょうか。
自分用 Dockerコマンド一覧


**コンテナの操作をするにはコマンドが必要!!**
ということで、Dockerコマンドの一覧をメモしときます

# ⚙️代表的なコマンド

### ---- container ----------------------------------
| Dockerコマンド | 何を | どうするか | オプション |（意味）|
|:-:|:-:|:-:|:-:|:-:|
| docker  | container  |  start |  -a , -i|（コンテナを開始する）|
|   |   |  stop | -t  |(コンテナを停止する)|
|   |   | create  | -a -e -i -p -v ...  |(コンテナを作成する)|
|   |   | run  |  -d -e -i -t ... |（Dockerイメージをダウンロードし、コンテナを作成して起動する）|
|   |  | exec  |  -i -t |（実行中のコンテナ内でプログラムを実行する）|
|   |  | ls  |  -a |（コンテナ一覧を表示する）|
|   |  | cp  |   |（DockerコンテナとDockerホスト間でファイルをコピーする）|
|   |  | commit  |   |（Dockerコンテナをイメージに変換する）|

### ---- image ----------------------------------
| Dockerコマンド | 何を | どうするか | 意味|
|:-:|:-:|:-:|:-:|
|  docker | image  | pull  |（Docker Hubなどからイメージをダウンロードする）| 
|   |   | build  |（Dockerイメージを作成する）| 
|   |   | rm  |（Dockerイメージを削除）| 
|   |   | ls  |（自分がもっているイメージを表示）| 
|   |   | search  |  |

### ---- volume(ボリューム) -----------------------------
コンテナからマウントできるストレージ
| Dockerコマンド | 何を | どうするか | 意味|
|:-:|:-:|:-:|:-:|
|  docker | volume  | create  | (ボリュームを作る)  |
|   |   | rm  | (ボリュームの削除) |
|   |   | inspect  | （ボリュームの詳細情報の表示） |
|   |   | ls  | （ボリュームの一覧表示） |
|   |   | prune  | （現在マウントされていないすべてのボリュームの削除） |

### ---- network ----------------------------------
| Dockerコマンド | 何を | どうするか | 意味|
|:-:|:-:|:-:|:-:|
|  docker | network  | connect  | (コンテナをネットワークに接続)  |
|   |   | disconnect  | (ネットワークから切断する) |
|   |   | create  | (ネットワークの作成) |
|   |   | inspect  | （ネットワークの詳細情報の表示） |
|   |   | ls  | （ネットワークの一覧表示） |
|   |   | rm  | (ネットワークの削除) |
|   |   | prune  | （現在コンテナがつながっていないすべてのネットワークの削除） |

### ---- 単独のコマンド ----------------------------------
| コマンド | 意味 | オプション |
|:-:|:-:|:-:|
| login  | Dockerレジストリにログイン  |  -u -p |
| logout  |  Dockerレジストリからログアウト |   |
|  search | Dockerレジストリで検索  |   |
|  version |  Docker Engineおよびコマンドのバージョンを表示する |   |

# ⚙️コンテナ操作にはDockerコマンド

コンテナ操作するコマンド文は、`すべて「docker」コマンドから始まります。`

dockerコマンドに続いて、「何を」「どうする」「対象」を記述
```
docker  「何を」「どうする」「対象」
           ↓　　　　 ↓        ↓
docker container   run     penguin
```
# ⚙️オプションと引数
しかし、実際に操作するときはもっと長い命令を書いています。
基本は上に書いてある通りですが、ほかに `「オプション」「引数」と呼ばれる付属情報`が付きます。
例えば、「container run」コマンドに「-d」「penguin」という対象に対して「--mode=1」という引数をつけると以下の通りになります。

```docker:オプションと引数をつけたコマンド
docker container run -d penguin --mode=1
```
「‐d」は、「バックグラウンドで実行する」、「--mode=1」は、「モード1で起動する」程度の意味ですが、オプションと引数が付く場合と、付かない場合があります。

# ⚙️コマンドの基本まとめ
まとめると、コマンドがこのように構成されています
```docker:dockerコマンドの基本
docker コマンド (オプション) 対象 (引数)
```
### ---- コマンド ----------------------------------
Dockerコマンドに続けて、「何を」「どうしたいのか」という指示を書くのがコマンド部分でした。

### ---- オプション ----------------------------------
オプションはコマンドに対して、細かい設定をするものです。バックグラウンドで動かす場合は、「-d」、キーボードから操作する場合は「-i」
「-t」をつけるなど、コマンドの実行方法やコマンドに渡したい値を設定します。
```docker:オプションの記述例
-d
--all
```
「-d」のように「-」と１文字の組み合わせのオプションは、まとめて書くことができます。
```docker:-d , -i , -t をまとめた記述例
-dit
```

### ---- 対象 ----------------------------------
コマンドの「何を」「どうする」に対し、具体的な名前を指定します。

### ---- 引数 ----------------------------------
対象に対し、持たせない値を書きます。文字コードの指定や、ポート番号の指定などを行います。
例えば、MySQLとWordPressを組み合わせて使うときに、MySQL側で、WordPressが対応している旧式の認証方法を指定するために3つの引数を指定するなど、使う場面は限られます。
ドメイン参加のWindowsマシンから、エクスプローラ経由で WORKGROUP 配下の共有フォルダへアクセスする方法


「ドメイン参加しているPC **(A)**」から、「非ドメイン参加(WORKGROUP)のサーバの共有フォルダ **(B)**」へ、エクスプローラでアクセスすると、アクセスできない。

![MicrosoftTeams-image (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919932/1e716f81-3bcd-d3d3-38c3-9994683b28b8.png)

ポート139、445 が開いているのは確認。

ちなみに、理由はわからないけど、何故か「**(B)**」へエクスプローラでアクセスできている端末もある。
謎。

いろいろと調べて見ると、どうも、ドメイン参加しているユーザで「**(B)**」へアクセスしようとしているっぽい(そりゃそうだ)。だから、ドメインに参加していない「**(B)**」へはアクセスできない模様。
なので、「**(A)**」端末上でプロンプトを開いて下記コマンドを実行。

```
net use \\192.168.5.2 /user:administrator passwordhogehoge
```

192.168.5.2 は「**(B)**」のIPアドレス。
administrator ユーザで、 パスワードが passwordhogehoge という例

その後、あらためてエクスプローラで「**(B)**」へアクセスしたところ、無事アクセスできた。
わーい。


ちなみに、何故か「**(B)**」へエクスプローラでアクセスできている端末は、「**(B)**」と同じ「非ドメイン参加(WORKGROUP)のPC」でした。
AWSのEC2にTeraTarmのマクロでログインする

自分の備忘録

2022/02/01
学習中作り直しや停止起動で毎回IP変わるので
IPを毎回入力する場合と固定IPの場合に分けました


毎回IP聞いてくれるマクロ
```EC2_login.ttl
;基本情報====================
username = 'ec2-user'
userkeyfile = '秘密鍵のパス'
portnum = '22'

;接続先入力================
inputbox '接続先を入力してください。' '接続先'
hostname = 'EC2のパブリックIPｖ４アドレス'

;実行内容================
msg = hostname
strconcat msg ':'
strconcat msg portnum
strconcat msg ' /ssh /2 /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg userkeyfile

;サーバへ接続=================
connect msg

;マクロ終了===================
end
```


IP変わらない場合

```EC2_login.ttl
;基本情報====================
username = 'ec2-user'
hostname = 'EC2のパブリックIPｖ４アドレス'
userkeyfile = '秘密鍵のパス'
portnum = '22'
 
;実行内容================
msg = hostname
strconcat msg ':'
strconcat msg portnum
strconcat msg ' /ssh /2 /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg userkeyfile

;サーバへ接続=================
connect msg

;マクロ終了===================
end
```
[FAQ] docker-compose up で「strconv.Atoi: parsing "": invalid syntax」が発生した場合の対処

# 事象
docker-compose up コマンドでコンテナを起動しようとすると
「strconv.Atoi: parsing "": invalid syntax」
が発生し、コンテナが起動できない。

```console:console
docker-compose up
...
...
...
...
strconv.Atoi: parsing "": invalid syntax
```

# 原因
意図していないdockerコンテナが実行されていたり、不要なファイルなどの残骸が残っている場合などに発生します。
たとえば、Ctr+Cでコンテナを停止したが正常終了できていない場合などに発生します。

# 解決方法
コンテナを正常終了し、コンテナおよびネットワークを削除する。
```console:console
docker-compose down
```

上記のコマンドで問題が解決しない場合は
以下のコマンドで、Composeファイルで定義していないコンテナも削除する。
```console:console
docker-compose down --remove-orphans
```
Laravel Fortify メールアドレス以外でログインする

Laravel Fortify でログイン方法をメールアドレスから別のカラムに変更したい人向け。
簡単２ステップで、終わりです。

### ①FortifyServiceProviderに追記する
FortifyServiceProviderのbootメソッドに下記の通り、追加

```FortifyServiceProvider.php
    public function boot()
    {
        Fortify::authenticateUsing(function (Request $request) {
            $user = User::whereLoginId($request->login_id)->first();

            if ($user &&
                Hash::check($request->password, $staffMember->password)) {
                return $user;
            }
        });
    }
```

### ②config/fortify.phpを変更する
'username'というのがどこかにありますので、それを'email'から指定したいカラムに変更します。
```config/fortify.php
 //'username' => 'email', // デフォルト
 'username' => 'login_id',
```

これで完了です。
公式ドキュメントも読んでみてください。
https://laravel.com/docs/9.x/fortify#customizing-user-authentication
TypeScriptでコンパイル時にAbortSignalのエラー

# はじめに

本記事は、タイトルにある通り TypeScript のコンパイル時に以下のようなエラーが出たときの解決策です。

## エラー内容

tscコマンドを実行して、TypeScript ファイルをコンパイルした際に、以下のようなエラーが発生しました。

```sh:tscコマンド実行
% tsc using-ts.ts   
../../../../node_modules/@types/node/globals.d.ts:341:13 - error TS2403: Subsequent variable declarations must have the same type.  Variable 'AbortSignal' must be of type '{ new (): AbortSignal; prototype: AbortSignal; abort(reason?: any): AbortSignal; timeout(milliseconds: number): AbortSignal; }', but here has type '{ new (): AbortSignal; prototype: AbortSignal; }'.

341 declare var AbortSignal: {
                ~~~~~~~~~~~

  ../../../../../../usr/local/lib/node_modules/typescript/lib/lib.dom.d.ts:2071:13
    2071 declare var AbortSignal: {
                     ~~~~~~~~~~~
    'AbortSignal' was also declared here.


Found 1 error in ../../../../node_modules/@types/node/globals.d.ts:341
```

環境によって内容は異なるかと思いますが、どうやら`AbortSignal`の定義が重複してしまっていることが原因のようです。
上記の例だと、`@types/node/globals.d.ts`と`typescript/lib/lib.dom.d.ts`が重複しているとのこと。僕の環境では、Node.js と TypeScript がどちらもグローバルでインストールされているようです。
ちなみにバージョンは、@types/node が 15.3.0、typescript は 4.9.4 でした。

## 解決方法

定義が重複してしまっているのが原因ですので、とりあえずどちらかを削除するのが良さそうです。
念の為、それぞれの定義をみてみます。

```typescript:globals.d.ts（341行目）
declare var AbortSignal: {
    prototype: AbortSignal;
    new(): AbortSignal;
};
```

```typescript:lib.dom.d.ts（2071行目）
declare var AbortSignal: {
    prototype: AbortSignal;
    new(): AbortSignal;
    abort(reason?: any): AbortSignal;
    timeout(milliseconds: number): AbortSignal;
};
```

今回は、TypeScript を使った作業に関するものなので、TypeScript （typescript/lib/lib.dom.d/ts） 側を残します。なので、@type/node 側の４行をコメントアウトしました。

```typescript:コメントアウト後
// declare var AbortSignal: {
//     prototype: AbortSignal;
//     new(): AbortSignal;
// };
```

以上でコンパイル時のエラーは解消されました。
修正した場所を記録する目的も兼ねて記事にしておきました。
Qwikのedgeでbleedingする方法

割と主要なAPIだった`useEndpoint`が急にdeprecatedになったり、取って代わる`action$`はドキュメントが無かったりと、なかなか変化が激しいbetaなQwikですが、これほど変化が激しいのであればリリース版よりも最新のコードを使って開発したほうが変化にすぐキャッチアップできて良いかもしれません。

>The worst kind of code magic is the kind that's invisible to the developer.
>-- <cite>https://qwik.builder.io/docs/advanced/dollar/#rules</cite>

というわけで、リリース版より新しいQwikを使って開発する方法を２つ紹介します。

### Nightly build版を使う

QwikとQwik Cityのナイトリービルドが以下に公開されています。

 * [qwik-build](https://github.com/BuilderIO/qwik-build)
 * [qwik-city-build](https://github.com/BuilderIO/qwik-city-build)

これを使ってqwik projectに以下のように上書きします。

```shell
npm i -SD BuilderIO/qwik-build BuilderIO/qwik-city-build
```

`package.json`の中身：

```json
  "devDependencies": {
    "@builder.io/qwik": "github:BuilderIO/qwik-build",
    "@builder.io/qwik-city": "github:BuilderIO/qwik-city-build",
```

### Qwikのリポジトリを直接使う

今まさに修正されたバグに困っているとき、自分の手でバグを直せる場合などは本家のリポジトリをcloneして使うのが良いでしょう。
`/path/to/qwik` 以下にcloneしたと仮定して、`package.json`を以下のように書き換えます。

```
  "devDependencies": {
    "@builder.io/qwik": "file:/path/to/qwik/packages/qwik",
    "@builder.io/qwik-city": "file:/path/to/qwik/packages/qwik-city",
```

あとは、`/path/to/qwik`で

```shell
pnpm run build
```

します。 `wasm-pack` 等が必要なので別途インストールしておきましょう。

#### CLIの設定

以下のようにPATHを通しておきます

```shell
npx link /path/to/qwik/packages/qwik
npx link /path/to/qwik/packages/qwik-city
```
__init__.py に定義した lambda_handler を Handler へ指定する。

`__init__.py` に `lambda_handler` をコーディングしている Flask アプリケーションを AWS CloudFormation の `AWS::Serverless::Function` や `AWS::Lambda::Function` リソースの `Handler` プロパティへ `lambda_handler` を設定する例です。

`app.py` や `lambda_function.py` の例が公式に掲載されているため、世の中の実装もその踏襲が多く、初学者によく質問されるので掲載しておきます。

以下は、AWS SAM として定義する場合の例です。

```yaml
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: >-
  AWS CloudFormation Template for my-app stack:
  The FROG Brigade dot NET - Rev. 1.0.0, 2023-01-01

Resources:
  MyAppLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: MyApp
      Architectures: x86_64
      Runtime: python3.9
      Description: "Marvelous My Application"
      PackageType: Zip
      CodeUri: my_app/
      Handler: __init__.lambda_handler
```

https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html

AWS Lambda として定義する場合も `Handler` プロパティ部分は変わりません。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html

**補足**

このように `Handler` プロパティへ任意の Python 関数を指定できるため、AWS Lambda Function ハンドラは `lambda_handler` という名称でなくても構いません。

https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html

`event` と `context` を引数とする任意の関数を AWS Lambda Function ハンドラとすることができます。
neosでlogix その89

# 概要
neosでlogixやってみる。
logixを、俺コードで表現してみる。

# 参考にしたページ

https://qiita.com/komashiba/items/8817b4cbf30c76efe186

https://qiita.com/komashiba/items/8817b4cbf30c76efe186

# 俺コード

```
Box.Matrial.Albedocolor, Box.Matrial.Emissivecolor = T
	|> X 5
	|> Sin
	|> > 0
	|> ?: 1000 0010 

```

以上。
スペース区切りの文字を配列に格納する

スペースで区切られた文字を配列に格納して出力するプログラムを実装しました。
explode関数を簡易的に実装しています。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>スペースで区切られた文字を配列に分ける</title>
</head>
<body>
  <?php

    // スペース区切りで文字列を定義(文字列の最後はスペースで区切る)
    $input = 'Manatsu Akimoto ';
    // 配列の定義
    $array1 = [];
    

    // $date = date('Ymd');
    $num = strlen($input);
    echo $num;
    $ans = "";
    

    echo $date . PHP_EOL;
    
    
    for($i=0;$i<$num;$i++){
      $str = substr($input,$i,1);
      // echo $str;
      if (($str == ' ')){
        array_push($array1,$ans);
        $ans = "";
      } else {
        $ans = $ans . $str;
        
      }
      
    }
    foreach($array1 as $line){
      echo "<p> ${line} </p>" . "\n";
      
    }
  ?>
</body>
</html>
```

PHPの実装部分は下記のとおりです。

```PHP
    // スペース区切りで文字列を定義(文字列の最後はスペースで区切る)
    $input = 'Manatsu Akimoto ';
    // 配列の定義
    $array1 = [];
    

    // $date = date('Ymd');
    $num = strlen($input);
    echo $num;
    $ans = "";
    

    echo $date . PHP_EOL;
    
    
    for($i=0;$i<$num;$i++){
      $str = substr($input,$i,1);
      // echo $str;
      if (($str == ' ')){
        array_push($array1,$ans);
        $ans = "";
      } else {
        $ans = $ans . $str;
        
      }
      
    }
    foreach($array1 as $line){
      echo "<p> ${line} </p>" . "\n";
      
    }

```
npm install -g {packageName}は古いと言われた

先日、モブプロで開発作業中にnpm install -gを実行しようとして先輩に「npm install -gはもう古い。[npx](https://www.npmjs.com/package/npx)を使った方がいい」と言われた。

```
npm install -g {packeageName} # インストールしたらディスク上残る上にインストール後に実行する必要がある

npx {packageName} # インストール、実行、削除、を全部やってくれる
```

npxは node package executerの略でパッケージの実行ツールらしい。
パッケージを探してインストールして実行、処理が終わればパッケージを消してくれる優れもの。便利だなぁ～
オブジェクトって何だろう・・・？

 # はじめに
オブジェクトって何だろう？実際の業務でオブジェクトやら配列やら文字列やら・・・いろいろな言葉が飛び交います。実際に、オブジェクトとは何だろう？と思ったので、記事にしてみます。

 # オブジェクトとは・・・？
オブジェクトとは「モノ」に相当するものだそうです。なんだかふわっとした表現ですが、オブジェクトとはそういうことだそうです。プログラミング的にはクラスやインスタンスがオブジェクトに相当するようで、厳密にいうとクラスやインスタンスを包括してオブジェクトと言っているそうです。つまり、何かをがばっとまとめたものをオブジェクトというのかな？と思います。

 # クラスやインスタンスとは・・・？
少し話がそれてしまいますが、クラスやインスタンスの話を使用と思います。端的にいうと、クラスというのは設計図や概念でインスタンスは作成物や物体と考えられるようです。例えば、人は何かを作るとき、設計図を作成し、設計図をもとに実際にものを作るわけです。これを言い換えると、クラスという設計図があり、クラスをもとにインスタンスというものを作るわけです。そして、これらをまとめてオブジェクトと呼ぶ。

 # オブジェクト指向
オブジェクトという考え方はオブジェクト指向で出てきます。オブジェクト指向とは、インスタンスのまとまりであるクラスを部品として扱い、その部品を組み合わせてプログラムを組んでいくというものです。ちなみに、オブジェクト指向で押さえておきたいのは「継承」「多様性(ポリモーフィズム)」「カプセル化」の3つです。

 # 継承
継承とは元となるものから何かしらを受け継いだ新しいもののことです。例えば、人は親から生まれます。そして、一般的に子供は親の特徴を引き継ぐものだと思います。言い換えると、親クラスの何かを、子クラスで継承することを指します。これによって、いちいちクラスを作らなくても、クラスを継承したものがあることで動作を変えることが容易にできます。

 # 多様性(ポリモーフィズム)
多様性とは同じ呼び出しに対して応答が異なることです。例えば、鳴けという命令に対して、猫は「にゃー」と鳴き、犬は「ワン」と鳴く。言い換えると、cryメソッドを呼び出した際にインスタンスによって「にゃー」と返ってきたり、「ワン」と返ってきたり、応答が異なることを言います。これによって、同じオブジェクトなのに、ものによっては動作を変えることができます。

 # カプセル化
カプセル化とは内容を外部から見られないように隠ぺいすることです。例えば、誰にも秘密はあるものです。しかし、その秘密が他の人にしられないように隠すことです。言い換えると、内容がわからないようにアクセス修飾子をつけて公開範囲を限定することです。これによって、外部から内容を容易に見られないようにしています。

 # 参考文献

https://wa3.i-3-i.info/word1119.html

https://wa3.i-3-i.info/word1202.html
Qiitaの投稿画面で改善してほしい「投稿」

 # 単一画面に同一単語を使うときに気をつけること!

![Screenshot 2023-01-26 at 9.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214128/10245931-ce2e-9a00-4997-093d1baadf10.png)
単一画面に、利用者側が選択する箇所（主にボタン）で、同一の単語を利用する場合は、アプリケーション構築側の意図を誤解してうけとるケースがあるので要注意です。

このケースでいえば **「投稿」** というキーワードを使っているので、記事作成後、投稿しようとして上部の[投稿する📝]を押してしまうという誤操作が起こります。記事作成後に、このボタンを押してしまっても、書き換えている記事が消えるわけではないので致命的な問題にはならないのは幸いですが。

# なぜ、記事投稿する際に、上部の[投稿する📝]を押してしまうというミス操作を誘発してしまうのか？
人間は、パソコン画面で必要な情報（この場合は、記事投稿するためのアクション＝ボタンなど）を探す際、視点を、左上、右上、左下、右下の順に確認する、視点的にはＺな動きをするケースが多いと言われています。多少のＵＸ的知識があれば、基礎中の基礎だと思うはずです。

投稿する際に、その順序で、必要な情報を探すと、投稿する際の正しい操作である右下のボタン到達する前に、右上の[投稿する📝]ボタンをみてしまい、意図しないボタンをおしてしまう可能性があるのです。

# 改善する方法
いくつか方法が考えられます。
## 投稿編集画面から[投稿する📝]ボタンを無くす
ボタンなければ、間違っておすことはありません。
## 新規投稿ボタンのラベルを変更する
例えば[新規投稿する📝]にすれば、編集中に、このボタンを押すことは、あらためて、いちから記事作成するという印象を感じると思います。
最上部をヘッダとしていて、その中にこのボタンを配置してるのは、どのページにも表示させたい（＝たくさん投稿させたい）という意図もあると思われるので、ボタンラベルの変更は、全ページで意図通りの意味になるのか？の確認は必要かもしれません。
# 放置している理由が気になる
Qiitaさんが気が付いていないわけないと思うので、ふかーい理由があるのだとおもうのですが、放置しているのには、なんらかの意図があると想像しています。

#毎回私がひっかかるのでちょっと愚痴ってみましたｗ
#って、この記事を投稿しようとして、上部[投稿する📝]ボタンをおしてしまう自分がなさけないｗ
【C#】配列とリストの違いについて

# はじめに
1からゲームを作成しようとした時に配列からオブジェクトを取得するところで詰まったので復習です。


# 配列とリストについて
## 共通
どちらも、 __同じデータ型の値を複数取り扱う__ ものです。


## 違い

具体的な違いは __データ数が決まっているか__ です。
(初歩的なところを理解するために、今回は具体的なメモリ上の数値やビット数は割愛します...。)


### 配列
データ数が __決まっている__。(宣言時に必要なメモリを確保する)
2次元配列や3次元配列などを作ることが可能。
個々の要素を追加・変更・削除・挿入することが出来ない。


### リスト
データ数が __決まっていない__。
1次元しか作れない。
要素を追加・変更・削除・挿入することが可能。


## 使い分け
注目したいところは __要素数が変わるのか__、__パフォーマンスの重視さ__ の２つです。

__要素数を後から変えたい場合__ → __List__ / __変えない場合__ → __配列__
__パフォーマンスを重視する場合__ → __配列__

事前に要素数が決まっている場合は配列で大きさを指定することができます。

# 最後に
多くはListで大丈夫という記事も見かけますが、大きい処理をした時に処理の速さや重さに違いが出て来るので、しっかりと使い分ける癖をつけることが大切です。

# 関連記事
https://qiita.com/hanatan079/items/4ecbb759c8b9ca9c9264
Pythonコードの中に記載されたHTMLテキストをブラウザで表示する(Api Gateway,Lambda)

# 書くきっかけ
Pythonコードの中に直書きしたHTMLを、クライアントからリクエストがあったときにブラウザで表示するコードを書いてみました。
自分の話で恐縮ですが、ちょっとApi GatewayとLambdaのテストをしてみたいと思ったときに、HTMLレスポンスが返せる簡単なLambda関数を用意したくなります。
そういった際に使えるのではと考えました。
# 使うもの
AWSで以下のものを使います。
* Api Gateway
* Lambda (Python 3.9)

# やってみる
## Lambda
以下の設定値でLambda関数を作成しました。ほかはデフォルトの設定値です。
| 項目 |設定値|
|:-----------|:-----------|
|関数名|htmlResponseFunc|
|ランタイム|Python 3.9|
|ハンドラ|lambda_function.lambda_handler|
|アーキテクチャ|x86_64|

## コード
`string`型でHTMLを記述し、それを`bytes`型に変換するところがポイントだと思います。
```python
import base64

def lambda_handler(event, context):
    str_html = '''
<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>TestTitle</title>
        <meta charset="utf-8"/>
    </head>
    <body>
        <h1>This is a test of ApiGateway and Lambda</h1>
    </body>
</html>'''
    bytes_html = bytes(str_html, 'utf-8')
    result = base64.b64encode(bytes_html)
    
    return result
```
## Api Gateway
### 作成
以下の設定値でApi Gatewayを作成しました。
| 項目 |設定値|
|:-----------|:-----------|
|プロトコル|REST|
|API名|htmlResponseApiGw|
|エンドポイントタイプ|リージョン|
### リソース
GETメソッドのリソースを作ります。
`統合タイプ`は`Lambda関数`として、`Lambda関数`に先ほど作成したLambda関数の関数名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252459/63bf7908-70d9-192e-b630-fc233b0b42a3.png)
`メソッドレスポンス`の`コンテンツタイプ`のみ`text/html`に変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252459/2800f85d-8390-d58e-fe5b-d4e5769088a0.png)

`統合レスポンス`の`コンテンツの処理`を`バイナリに変換(必要な場合)`に変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252459/cb47bc3e-cdc5-a325-040f-62a56737edde.png)


こちらを`dev`というステージを作成してデプロイしました。
`URLの呼び出し`に記載されてURLにアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252459/cc530074-86af-0e19-fcca-2f1487660f6c.png)
## 結果
WEBページが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252459/77049515-e6d7-ed07-86c0-6ae6682251e6.png)

## あとがき
こちらの簡単な環境を使用して、Api Gatewayのステージ変数の動作確認をやってみたいと思います。
# 参考サイト
https://qiita.com/yutake27/items/30ca4bdffd130087b708

https://codechacha.com/ja/python-convert-string-to-bytes/#1-bytes-%E9%96%A2%E6%95%B0%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E3%83%90%E3%82%A4%E3%83%88%E3%81%AB%E5%A4%89%E6%8F%9B
venvの仮想環境作成・仮想環境のアクティベート

・仮想環境作成
```
python3 -m venv 仮想環境名
```

ここで、以下のようなエラーが出たら、
```
The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

    apt install python3.8-venv

You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.
```
```
sudo apt install python3.8-venv
```
・仮想環境のアクティベート
```
source ./仮想環境名/bin/activate
```
ノーコード、ローコードでも設計必要

# 技術者＝プログラミングしている人という誤解
ITに弱いひと、結構、この誤解しているケースに遭遇します。
# ノーコード、ローコードなら誰でも技術者チックになれるのでは？！という誤解
これは技術者にもいます。でも、結局、設計必要のです。最低でもER図くらいかけないと、ノーコード、ローコードな環境があってもろくなモノはつくれません。
Excelでデータ収集するだけでも、型は意識しているか？正規化できているか？など考慮している人と、考慮していない人がいますが、ノーコード・ローコードツールを手に入れて使いこなせるのは、当然前者になります。
資格取得について意味がある・意味がないって聞くけど実際どうなのよ

はじめまして。
都内某所でエンジニアしてます。

今日は社内の記事に投稿した内容（資格取得について）を投稿したいと思います。



資格取得に向けて勉強されている方が多いと思います。
それぞれ勉強している資格は違いますが、中には「資格取得なんか意味がない」という声も聞くような気がします。
（気のせいであれば読み飛ばしてください。。）

では本当に意味ないのかを知るために他の人の意見を見てみたいと思います。

今回はGoogleにて「エンジニア　資格取得　意味ない」と検索してみました。

そうすると約4,750,000件ヒットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/7f1a25dd-9459-6693-a197-045642f0bebd.png)

結構な数ヒットするので資格取得するの意味ないんじゃないかなー。って思いますよね。

実際にどんな内容が書いてあるのかは後ほど触れますが、逆に

「エンジニア　資格取得　意味ある」

で検索してみると先ほどの「意味がない」と比べるとヒットする数はどれぐらい変わるでしょうか。
皆さんも予想してみてください。


多いのか、少ないのか。。


それでは答え合わせの時間ですが、、


正解は、、
意味あるという記事が5,310,000件ヒットし、意味ないという記事より多くヒットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/c6c63b13-7db4-bb84-6bb8-13911040831a.png)

※2023/1/23現在

これをみてじゃあ資格を取得しよう！！
と思ればちゃんちゃん。ですが、そう思う人はあまりいないですよね。。

大切なのは中身！
記事の内容ですが、いくつか抜粋記事を乗っけておきます。
まず「エンジニア　資格取得　意味ある」で検索上位にあった記事です。

##### ①IT資格が必要なエンジニアと不要なエンジニアについて解説します
https://it-kyujin.jp/article/detail/2182/

IT資格が必要な人の４パターン
・未経験からITエンジニアになりたい人
・エンジニアとしての適正があるかを知りたい人
・専門分野について深く学習したい人
・キャリアアップを目指す人

IT資格が必要ではない人
・フリーランスエンジニアとして活躍している人
・事務職などプログラミングを学ぶ必要がない人

##### ②Web系エンジニアに資格は必要ないって本当？資格不要の理由3つを解説！
https://runteq.jp/blog/programming-school/web_engineer/10630/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/b9bd0532-e439-4eba-c50f-7a7d06b444c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/9efd5d49-4378-498b-7379-81760394fe21.png)


##### ③【断言します】ITエンジニアを目指すのに、いる資格、いらない資格
https://infla-lab.com/blog/it-certification-unnecessary/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/a1307b62-7c39-1a10-23df-ca20c8f0541e.png)


上記は「エンジニア　資格取得　意味ある」で上位にヒットしたものを抜粋しています。


では次に「エンジニア　資格取得　意味ない」の上位にヒットしたものを見てみましょう。

![スクリーンショット 2023-01-23 13.47.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/77d2323f-6c27-bcc9-94bf-0151f53ef036.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/95ab11e5-2cff-7eab-a968-1997a593aec4.png)

あれ？ほとんど見たやつ（記事の文字色が変わっている）やん。

つまり、資格取得の意味あり・なしで検索したヒット数を比較してもあまり意味なさそうですよね。。
　

なので、記事の中身で判断すべく他にも記事を見てみましたが、
「資格取得　意味ある」の検索記事にも「意味がない」よりで書かれている記事が書かれていたので、
「意味ある」「意味ない」のどちらかといえば「意味ない」と言うのかなと。。


でも、ちょっと待ってよ！会社からは「資格取得してください。」って言われているのに
これじゃ資格取得するために頑張っても意味ないじゃん！！


って怒られてる方。安心してください。（履いてますよ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/0f7fd401-cd99-cc30-b15a-0aa98bd36dc6.png)


確かに資格取得の意味が「ある・なし」でいうと「なし」よりの意見が多かったですが、
それってあなたの今の状況と当てはまりますでしょうか。

以下の記事では、「LPIC」はエンジニアとしての選択肢が広がると書いてありますし、
https://codexcode.jp/magazine/4159/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/20c58c18-b93d-56d7-c521-fde0747bccb1.png)


インフラ系エンジニアを目指す場合には資格は非常に有効と書いてあります。
https://infla-lab.com/blog/it-certification-unnecessary/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120138/b92861c7-715a-24cc-4486-301f4b67db33.png)


つまり、人によっては資格取得によって道が広がる方もいるのは事実だと思います。


是非資格取得するための勉強ではなく、取得後のイメージを持って資格勉強するといいのかなと思います。


ご清聴ありがとうございました。
【初学者向け】DockerでRails7の環境構築（2023年版）

[Dockerの公式ドキュメント](https://docs.docker.jp/compose/rails.html)でRails７系の環境構築をしたら途中で詰まったので、スムーズに構築していく方法を記します✏️

<br>

## 前提条件
開発環境
- M1Mac: Ventura13.0
- [Docker Desktop](https://docs.docker.com/desktop/install/mac-install/)インストール済み

<br>


## この記事でわかること

✅[Dockerの公式ドキュメント](https://docs.docker.jp/compose/rails.html)に沿ったRails7系の環境構築方法✅
（公式ドキュメント通りに行うとエラーが発生するので、本記事ではその解決方法も記します！）
※ 本記事では、DockerでRails7を最速で環境構築する方法を記します。DockerやRailsの詳しい説明については別記事をご参照ください🙏


<br>


## 環境構築手順

### 1. 任意のディレクトリを作成
Macの任意の開発スペースにアプリを作成するディレクトリを作成します✅

```terminal:terminal
# mkdir お好きなアプリ名
```

<br>


### 2. Dockerfileの作成
作成したディレクトリに移動し、vscodeなどのエディタで開きます。
```terminal:terminal
# cd 作成したアプリ名
```
<br>

Dockerfileを作成し以下を記述します✅
Rubyは任意のバージョンにしてください。

```dockerfile:Dockerfile
FROM ruby:3.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

<br>


### 3. GemfileとGemfile.lockの作成
Gemfileを作成し以下を記述します✅
Railsバージョンを指定したい場合このタイミングで記述しておきます。
（バージョン指定がない場合は、最新の安定版になります）

```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails'
```
<br>

Gemfile.lockは空ファイルで作成します✅
```ruby:Gemfile.lock
```

<br>


 ### 4. docker-compose.ymlの作成
Gemfileを作成し以下を記述します✅
※ こちらの記述が公式ドキュメントと異なります！
[Dockerの公式ドキュメント](https://docs.docker.jp/compose/rails.html)のdocker-compose.ymlをコピペして起動するとエラーになるので注意してください⚠️

```docker:docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_HOST_AUTH_METHOD=trust
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```


<br>


### 5. rails new
Railsアプリの雛形を作ります✅
Docker Desktopを起動して、MacのメニューバーにDockerのマークが表示されていることを確認 🐳
↓コマンドを実行すれば、見慣れたRailsのファイル群が生成されます！
```terminal:terminal
docker-compose run web rails new . --force --database=postgresql
```

<br>


### 6. build実行
Gemfileが書き変わったので↓コマンドを実行します✅
```terminal:terminal
docker-compose build
```

<br>


### 7. database.yml書き換え
↓のように書き換えます✅
[Dockerの公式ドキュメント](https://docs.docker.jp/compose/rails.html)のdatabase.ymlをコピペして起動するとエラーになるので注意してください⚠️

```yaml:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
```

<br>


### 8. DBの作成
↓コマンドを実行してDBを作成します✅

```terminal:terminal
docker-compose run web rake db:create
```

<br>


### 9. 起動！！！
最後に↓コマンドで起動させると、見覚えのある画面が出てきます✅
```terminal:terminal
docker-compose up
```
[![Image from Gyazo](https://i.gyazo.com/2cc3cb46f4aac18a693c4f9b4a037581.png)](https://gyazo.com/2cc3cb46f4aac18a693c4f9b4a037581)


## 参考にさせていただいた記事
- https://docs.docker.jp/compose/rails.html
- https://qiita.com/at-946/items/2fb75cec5355fad4050d

<br>

## 最後に
Docker × Railsの環境構築がスムーズにいくことを願ってます🐳🚂
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「管理グループ」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「管理グループ」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[管理グループを作成する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-policy/2-create-management-groups)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「コスト削減に役立つオプション」](https://qiita.com/fsd-jume/items/dbd5c9658e2e2c057496)

## 管理グループ
AZ-900の学習まとめでも扱っておりますので、復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure管理インフラストラクチャ」](https://qiita.com/fsd-jume/items/cbbfe233a868901cf1e7)

### 管理グループの特性
・各ディレクトリには最上位の管理グループ(ルート管理グループ)が1つ必ずある
・管理グループを初めて使用する時にルート管理グループが作成される
・デフォルトでは新しいサブスクリプションはすべてルート管理グループ下に配置
・管理グループに適用した条件は配下のサブスクリプションにも自動的に継承
・管理グループの深さは最大6レベルまで(ルート管理グループとサブスクリプションは含まない)
・RBACで認可されたユーザもデフォルトでは管理グループの操作は不可

### 管理グループ使用時の考慮事項
**◆カスタムの階層とグループを検討**
・独自の階層とグループ化を使用してサブスクリプションを整理
・管理グループで、サブスクリプション全体のポリシーと支出予算の対象をまとめることが可能

**◆ポリシーの継承を検討**
・管理グループにポリシーを適用すると、グループ内のサブスクリプションに条件を継承
・例：VMの作成が可能なリージョンを指定するポリシーを管理グループに適用
　⇒適用した管理グループ下のサブスクリプション/リソースグループ/リソースに条件継承
　⇒確実にVMが指定したリージョンのみでしか作成できなくなる

**◆コンプライアンス規則を検討**
・サブスクリプションを管理グループにまとめることでコンプライアンス規則を満たすのに役立つ
⇒個々の部門とチームに同一のポリシーが適用されるため

**◆コストレポートを検討**
・サブスクリプション全体の予算詳細を確認可能

### 管理グループの作成
・Azure Portal/PowerShell/Azure CLIで作成可能
・管理グループ作成時に下記を設定
　-管理グループID：Azureシステム全体で使用されるため作成後の変更不可
　-表示名：Azure Portal内で表示される名前でいつでも変更可能(省略可)
・管理グループIDはこの管理グループでコマンドを送信するために使用する一意識別子

## 次の学習内容
**◆Azure Policy**

https://qiita.com/fsd-jume/items/76402c98a2d0c50635fa

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

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
拡張ドメインを有効にするのにかかる時間


+ [拡張ドメインを有効にするのにかかる時間](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jg0yySAB)

拡張ドメインを採用するには、次の 2 つの手順があります。

 

1.拡張ドメインを有効にします。このステップでは、[私のドメイン] 設定を更新すると、Salesforce が対応するドメインをプロビジョニングします。つまり、展開できるように準備します。

このプロセスの間、ユーザーへの影響はなく、URL も変更されません。通常、プロビジョニング プロセスは数分で完了しますが、最長で 24 時間かかる場合があります。

実際、次のステップに進む予定の少なくとも 24 時間前に、このステップを実行して、新しい [私のドメイン] をプロビジョニングすることをお勧めします。Spring '23 での自動リリースの準備として、Salesforce が現在多くの組織でこのステップを実行しているため、この機能が既に有効になっていることに気付くかもしれません。

1. Enable enhanced domains. In this step, you update the My Domain setting, and then Salesforce provisions the corresponding domains. In other words, we get them ready for you to deploy.

There's no impact to your users during this process, and no change to your URLs. The provisioning process usually finishes in a few minutes, but can take up to 24 hours.

In fact, we recommend that you take this step and get your new My Domain provisioned at least 24 hours before you intend to take the next step. You may even discover that the feature is already enabled for you, because Salesforce is taking this step in many orgs now in preparation of the auto-deployment in Spring '23.

2\.拡張ドメインを使用して新しい [私のドメイン] を展開します。変更をデプロイすると、新しい URL は「ライブ」になります。このプロセスはほぼ瞬時に行われ、組織へのすべての接続 (ユーザーがログインし、インターフェイスが実行されている) が中断され、再度ログインする必要があります。 

2\. Deploy the new My Domain with enhanced domains. After you deploy the change, the new URLs are "live". This process is almost instantaneous, and any connections to your org (users logged in, interfaces running) are interrupted and must log in again. 

For more information on provisioning & deployment, see My Domain Provisioning and Deployment in Salesforce Help.
【SwiftUI】SwiftUIでライフサイクルを定義したい。AppDelegateしたい。

# 概要
- SwiftUIでもUIKit時代のアプリのライフサイクルを決めておきたいなと思う
- 当たり前のことだけどメモ

# ソースコード
1. やり方は簡単。まず、AppDelegate.swiftを作成。
1. 以下のように、AppDelegateクラスを継承する（今回は通知の許可リクエストをアプリ起動時にやってほしいことを想定）。

    ``` swift: AppDelegate.swift
    
    import UIKit
    
    class AppDelegate: NSObject, UIApplicationDelegate {
        
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
            // 通知の許可リク
            let center = UNUserNotificationCenter.current()
            center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
                if granted {
                    print("通知が許可されたよ")
                } else {
                    print("通知が拒否されたよ")
                }
            }
            return true
        }
    }
    ```
1. デフォルトで作られるAppの構造体に以下のように`@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate`を定義する。
    ``` diff_swift: SampleApp.swift
    
    import SwiftUI
    
    @main
    struct SampleApp: App {
        
   +   @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
        
        var body: some Scene {
            WindowGroup {
                ContentView()
                    .environmentObject(LocationManager())
            }
        }
    }
    ```

1. 以上。無事アプリが開いた時に通知許可云々のダイアログが出た。
アプリの個人開発で食べてる「あたか」さんの記事を読んで面白かったので共有

アプリの個人開発で食べてる「あたか」さんの記事を読んで面白かったので共有（自分メモ）

https://zenn.dev/ataka/articles/e3429be662ced6

https://zenn.dev/ataka/articles/48f50112716e51

https://zenn.dev/ataka/articles/68b239aa753e38
経済分析と動的計画　東洋経済　坂口実先生

```r

#p.32 順序付けと探索の問題

p=c(0.85,0.42,0.87)
v=c(1,2,0.9)
pv_1p=p*v/(1-p)

result=data.frame(rank=c("A","B","C"),p,v,pv_1p)
result=result[order(result$pv_1p,decreasing = T),]

f=result$p[1]*result$v[1]
for(i in 2:nrow(result)){
f=f+prod(result$p[1:i])*result$v[i] 
}

```