OmniAICreator/Qiita-1.07M huggingface dataset:
sendgridメール認証

sendgridのメールサーバーを経由してメールを送る場合、

まずはドメイン認証

![a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/0a9bc947-698f-16b4-ae4c-07f81f3f8de6.png)

ドメインを入力

![a2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/48d35766-b160-c769-8cd7-404351ccadde.png)

出てきたものを
conohaのDNSにコピペしていく

![a3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/704e2027-8d53-3a99-6a1f-a5ac4828fd40.png)


以上


ちなみに送信設定は

https://qiita.com/ma7ma7pipipi/items/c9598c0de46dd96f1172

を参考にどうぞ。
Goのコードの見通しの良さについて(happy path)

### はじめに
ハッピーパスとは、プログラムがエラーや例外なしに順調に動作する、最も一般的な処理フローのこと。開発では、このハッピーパスを明確にし、エラーハンドリングを効率的に行うことが重要だと思います。

## 改善前のコード
下記のようなコードがあるとして、これは一般的に見ると結構見にくいコードだと思います。このコードでは、ネストが深くなっており、ハッピーパスが明確ではないと思います。エラー処理とメインの処理が混在しているため、読みにくい構造になっています。
```go
func ProcessData(data *Data) (*Result, error) {
    if data != nil {
        processedData, err := processData(data)
        if err != nil {
            return nil, err
        } else {
            result, err := createResult(processedData)
            if err != nil {
                return nil, err
            } else {
                return result, nil
            }
        }
    } else {
        return nil, errors.New("data is nil")
    }
}
```

## 改善後のコード
改善後は、コードが左側に保たれ、エラー処理が簡潔でGoらしいコードになっています。それにより、コードの読みやすさとメンテナンス性が向上しています。早期リターンを使用して、ネストを減らし、コードの見通しを良くしています。
```go
func ProcessData(data *Data) (*Result, error) {
    if data == nil {
        return nil, errors.New("data is nil")
    }
    processedData, err := processData(data)
    if err != nil {
        return nil, err
    }
    result, err := createResult(processedData)
    if err != nil {
        return nil, err
    }
    return result, nil
}
```

### まとめ
ハッピー パスは、エラーや例外がなく順調に動作する処理フローを指し、効率的なエラーハンドリングとコードの可読性の向上に役立ちます。改善前のコード例と改善後のコード例を比較することで、ハッピー パスの重要性とその具体的な実装方法が理解できます。このアプローチにより、コードはより読みやすく、保守しやすくなります。参考文献として、Mat Ryerによる記事を読んで参考にしました。

### 参考
https://medium.com/@matryer/line-of-sight-in-code-186dd7cdea88
SwiftUIでWebviewを使用する方法

# 概要

SwiftでWebViewを実装する際には、WebKitフレームワークを用いたWKWebViewの使用が一般的です。一方で、アプリケーションの開発では主にSwiftUIを使用し、SwiftUIでは提供されていない機能についてのみUIKitを利用します。このため、SwiftUI環境でUIKitを適切に使用する方法の習得が重要です。

## WebKitフレームワークの利用

Webコンテンツの表示には、WebKitフレームワークが不可欠です。WebKitはAppleが開発したブラウザエンジンで、iOSアプリ内でウェブページを表示する際に利用される`WKWebView`を提供します。この`WKWebView`は、高性能で柔軟性があり、モダンなウェブページの要件を満たす能力を持っています。

## SwiftUIでUIKitを使用する方法

SwiftUIでUIKitのコンポーネントを使用するには、`UIViewControllerRepresentable`プロトコルを実装することが一般的です。これにより、UIKitベースの`UIViewController`をSwiftUIビューとして使用できるようになります。このプロトコルを利用することで、`WKWebView`などのUIKitベースのコンポーネントを、SwiftUIのビュー階層に簡単に統合することが可能になります。

# 実装

## WKWebView

`WKWebView`は、Appleが提供するWebコンテンツを表示するための高性能なブラウザエンジンです。以下のSwiftコード例では、`UIViewController`内で`WKWebView`を設定し、ウェブページをロードしています。

[WKWebView | Apple Developer Documentation](https://developer.apple.com/documentation/webkit/wkwebview)

```swift
import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string:"https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
}
```

## UIViewControllerRepresentable

SwiftUIでUIKitの`UIViewController`を使用するためには、`UIViewControllerRepresentable`を実装する必要があります。このプロトコルにより、UIKitベースのビューコントローラをSwiftUIビューに統合できます。ただし、`final class`または`struct`で定義しなければエラーが発生します。

```swift
import SwiftUI

struct ViewControllerRepresentable: UIViewControllerRepresentable{

    func makeUIViewController(context: Context) -> ViewController {
				// ビューコントローラーオブジェクトを作成し、その初期状態を設定します。
        return ViewController()
    }
    
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
				// SwiftUI からの新しい情報で指定したビューコントローラの状態を更新
    }
}
```

## App

アプリのメイン部分では、`@main`で定義された`MainApp`構造体内で、`WindowGroup`を用いて`ViewControllerRepresentable`を表示します。これにより、SwiftUI環境でUIKitのビューコントローラを効果的に利用できます。

```swift
import SwiftUI

@main
struct MainApp: App {
    var body: some Scene {
        WindowGroup {
            ViewControllerRepresentable()
        }
    }
}
```

# まとめ

この記事では、SwiftUIとUIKitを組み合わせて、特にWebViewの実装方法を詳しく解説しました。WebKitフレームワークを用いたWKWebViewの利用がSwiftでの標準的なアプローチであること、そしてSwiftUIの中でUIKitのビューコントローラを利用するための`UIViewControllerRepresentable`プロトコルの重要性を学びました。実際のコード例を通じて、`WKWebView`の設定、SwiftUIビュー内でのUIKitコンポーネントの統合方法、そしてアプリケーションの基本構造について理解を深めました。

この知識は、SwiftUIを使った最新のiOSアプリ開発において非常に役立つもので、WebKitフレームワークと`UIViewControllerRepresentable`を使いこなすことで、より複雑でインタラクティブなUIコンポーネントを効果的に実装できるようになります。今後のアプリ開発において、これらの技術を活用して、ユーザーにとって魅力的で機能的なアプリケーションを作成するための一歩となるでしょう。

# 参考

- [WebKit | Apple Developer Documentation](https://developer.apple.com/documentation/webkit)

- [UIViewControllerRepresentable | Apple Developer Documentation](https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable)
mkcertインストール、ローカル環境でhttps通信できるようにする （Windows11）

# 環境
* Windows11 Pro

# mkcertとは
ライブラリで、これを利用することによって本番のサーバー証明書の代わりとなる自己証明書（通称オレオレ証明書）を発行し、ローカル環境でもhttps通信（SSL化）が可能になる。

# インストール手順

1. Powershellを起動する 
2. mkcertをインストールする
    ```powershell
    PS C:\> winget install mkcert
    ```

# 自己認証局、ルート証明書など作成

さて、インストールできたことですし、証明書の発行してローカル環境でhttps通信できるようにしましょう。

1. **自己認証局を作成する（証明書、秘密の鍵を作成する）**
    ```powershell
    PS C:\> mkcert --install
    ```

2. **証明書が作られているか確認する**
証明書は以下に作られてるはずだよ。
```C:\Users\ユーザー名\AppData\Local\mkcert```
下記コマンドで確認することもできるよ。
    ```powershell
    PS C:\> mkcert -CAROOT
    ```
    このフォルダーに以下ファイルが作られる。
    * rootCA.pem （ルート証明書）
    * rootCA-key.pem （秘密鍵）

# サーバー証明書（自己証明書）作成
localhostに対して自己認証局によって正当性が保証されたサーバー証明書を作成する。
このコマンドを入力した際のフォルダに作成されるから、好きなフォルダで実行してね。
```powershell
PS C:\MyWork\mkcert> mkcert localhost
```
* localhost.pem （サーバー証明書）
* localhost-key.pem （秘密鍵）
これをローカルの開発環境に設定することでhttps通信が可能になるよ。

# さいごに
最後まで読んでくれてありがとうm(_ _)m
クラウド初心者がAWS認定SAAを取得してみた

# はじめに
こんにちは。記事をご覧いただきありがとうございます。

オンプレミスサーバーを約5年間扱ってきた経験を持ち、2023年からAWSに触れ始めたクラウド初心者の私が、AWS認定SAAを取得した経験の記録として書いてみます。
私はオンプレミスサーバーにはある程度詳しいですが、クラウドおよびAWSに関する知識はほとんどなく、VPCやEC2といったAWSのサービスや用語についても初心者レベルでした（笑）

ちなみに、私は試験に一度不合格になった経験もありますので、それについても記事内で触れていきます。

# SAAについて
SAAは、AWS Certified Solutions Architect - Associate（AWS認定ソリューションアーキテクト - アソシエイト）の略称です。
これは、AWSの基本的なサービス、アーキテクチャの設計原則、ベストプラクティス、セキュリティや可用性の概念などを理解し、AWSベースのソリューションの設計や展開の能力を備えたことを証明する資格になります。

書いたものの、ここら辺の形式ばった内容はAWSの公式ページを見てもらえればより詳しい内容が書かれていると思うのでこれ以降は割愛し、私が実際に受けたタイミングでの各情報を並べてみます。

# 受験の情報
### スケジュール
##### 1回目・・・2023/10/28(不合格)
##### 2回目・・・2023/11/26(合格)

合格点は720点で、1回目の受験ではギリギリ合格できず、2回目の受験ではギリギリ合格でした(笑)

AWSでは、試験の最初の受験時から14日間は再受験ができないという受験制限が設けられているので、
1回目が不合格ということが確認できた直後に最短で予約できる土日の試験日を2回目として申し込みました。

※ちなみに3回目受験の場合は3ヶ月のブレイクが必要になるらしいので注意！


### 試験バージョン
今回私が受けたのはどちらもSAA-03です。

### 受験料
##### 1回目・・・8250円
##### 2回目・・・16500円

1回目は半額バウチャーを利用できたので安く受験できました！
とはいえ、2度も受験すると出費が痛いですね...(涙)

### 試験会場
テストセンターでの受験を選びました。
自宅から徒歩20分程の距離にテストセンターがあるので、Pearson VUE上で予約して受験しました。

# 試験対策
##### 教材
・Udemy
・参考書&対策本

##### 1回目の試験対策
①UdemyのSAA対策講座を受講
プライベートの時間をあまり割くことができなかったので、通勤の合間にスマホで視聴してましたが、多くの情報を断片的に収集することしかできなく、復習の時間も設けられなかったので、結果としてこの方法は自分の状況においては良い選択ではありませんでした。

②試験前日に対策本の熟読
試験前日に詰め込みで対策本を熟読。「SAA対策講座で見たぞ！」という内容は流し目に、その他の頻出内容を重点的に確認。

##### 2回目の試験対策
①UdemyのSAA対策問題集をひたすら解く
1回目の試験対策の際に講座の受講ではそもそも試験合格レベルに到達する前に試験を迎えることになるということを把握できたので、今回は試験に受かる目的で問題集をひたすら解きまくりました。
解いて間違った問題を復習してを繰り返す。これであれば映像を見ることなく文字で理解できるので、通勤の合間でも進みます。

②Udemyの解説で分からなかった部分について
Udemyの解説を読んで分からなかった部分は別で携帯のメモに残し、プライベートの空いている時間を見つけてはAWSの図解付き教科書で逆引きして理解するように努めました。(ここだけの話、読んでも今時点ではイマイチわからかったサービスもありましたが...)

③試験前日に対策本の熟読
これは1回目の受験対策と同じです。
今回は頻出する部分を網羅する形で読破しました。

# 受験時
##### 試験時間
130分（2時間10分）
##### 問題数
65問
時間たっぷりと思ってても、意外と時間無くなります。

##### 心構え
1回目も2回目も共通してますが、実際に問題を解き始めると
「なんだこのサービス見たことないぞ...」
「こんな問題の出し方初めて見たぞ...」
ってなります。
でも一度落ち着いて見直したら、言いたいことってこういう事かっていう風に整理できてきます。(これは試験となると緊張しちゃったりする私の特性かも...)

とにかく、落ち着いて問題文を読めば答えが見えてきます。
見えてこなかった問題は、「後で見直す」ボタンがあるのですぐにそのリストに加えて先に進みましょう。
「後で見直すリスト」に入れた問題は最後の見直し時にマークがついて分かりやすくなります。そこで改めて見直すといいかもしれません。

# 受験後の考え
間違いなく言えることは、「思い立ったらまず時間の確保を」ですね。

1回目の試験対策で講座を視聴し、中途半端に終了。
2回目の試験対策で問題をひたすら解きました。

この結果、試験対策はある程度できたが、SAAレベルの知識が付いたかと言われると疑問が残ります。
ネット上に何時間の勉強時間という目安が良く書かれてますが、結局その資格を盾に業務を行うとなると知識が求められます。
目安時間に捉われず、自分が理解できたと思う段階まで勉強することが大事です。

私は合格はしましたが、また勉強しようと思ってます。
私のような謎のサイクルを皆さんが辿らないことを祈ります...！

# さいごに
「自分が理解できたと思うまで」と書かせてもらいましたが、選択は自由です。
私の意見に縛られず、最低限の知識レベルでもいいという方もたくさんいらっしゃると思うので、各々にあった方法で合格を目指してください。

この記事がSAAを取ろうと思っている方や気になっている方にとって参考になれば幸いです。
データベースに作成されたカラムを確認するには

データベースに作成されたカラムを確認するには、ターミナルに

```ターミナル
docker compose run web rails c
```
を打ってコンソールを立ち上げてから、
```
User.column_names
```
を打つと、カラムが表示される。
```
=> ["id", "last_name", "first_name", "email", "crypted_password", "salt", "created_at", "updated_at"]
```
Pythonの「if __name__ == "__main__":」について

## 最初に結論
- ```if __name__ == "__main__":```は、主にPythonの自作モジュールを使う際に用いられる記述です。
- これは「モジュール本体」に記載すべきもので、モジュールの「呼び出し側」には書きません。
- これを書いておくと、モジュール自体を単体で実行した際にのみそのコードブロックが実行されます。呼び出し側では実行されません。
- この挙動により、モジュール単体での実行時にのみ関数を実行させる、といったことが可能となり、主にテスト時に便利です。

## 具体的な挙動
```mymodule.py
def say_hello():
    print("Hello, world!")

if __name__ == "__main__":
    say_hello()
```
このように書いておくと、
- `mymodule.py`を単体で実行した際には、`say_hello()`が実行されます。
- 呼び出し側では、明示的に```say_hello()```と書かない限り実行されません。
- 仮に```if __name__ == "__main__":```がない場合、呼び出し側ではimport文を読み込んだ段階で自動的に```say_hello()```が実行されてしまいます。

## name・main とは何か？
- ```__name__```は、Pythonファイルを実行した際に自動で割り当てられる変数です。
- 直接実行の際には```__main__```が自動で格納されます。
- 呼び出して実行した際には、呼び出し名が格納されます。
    - 例：```import mymodule```のように別のスクリプトからインポートされた場合、```__name__```は ```"mymodule"``` になります。
    - そのため、```if __name__ == "__main__":``` ブロック内のコードは実行されない、ということになります。
インフラ作って！から作るまでの話

# はじまりの挨拶
「アケマシテオメデトウゴザイマス、ヤマモト＝サン、インフラツクッテクダサイ」
「ドーモ、アケマシテオメデトウゴザイマス、タケタニ＝サン、ナンノインフラデスカ？」

BGM ♪コレから始まるインフラの物語

なお、この記事は相手方には掲載の許可を取って一部脚色したり隠蔽したりしています。

# 登場人物
メールじゃなくて凸電ってあたりに時代を感じますね・・それぞれの登場人物のスペック

1. ヤマモト：私
1. タケタニ＝サン：依頼方　中小web屋さんのエンジニアリーダー的な存在
1. ミツヒデ＝クン：タケタニ＝サンの部下のエンジニアの人

他にも外野は何人かいましたがAとかBとかにします。

# バックストーリーの整理
いままであまりクラウドでバックエンドを構築したことがない会社さんのエンジニアの人から、クラウドでインフラをくれたまえとかいう雲を掴むような話がきました・・・・・いや雲掴むでいいのか、クラウドだけに。

LAMP構成の頃はバックエンドも作ってたんだけど最近はフロントかSaaSばっかりでねえ・・バックエンドどうやって作ったらいいかわかんねえという話でした。

いままで自社ではPaaSで構築したことはなく、作ったことがなく、取り急ぎAWSのアカウントとサービス提供するためのドメインを取るようにお願いしました。

・・いや、Amazonのお買い物アカウントじゃなくてですね？　別物よ？

途中電話からmeetsに切り替わってここまでだいたい雑談しながら１ｈというところ。

# 戦略を詰める

なにかしら私が作らないといけないものはありそうだったので、その場で以下の回答を求めました

Q. スピードと確実性のどちらを取るか？
    A. スピード

Q. コストとの向き合ったとき妥協する余地はどの程度あるか？
    B. 結構ある　なんだったら脱いでもいい

Q. テストできる環境は必要か？
    C. ほしいけど高いならいらない

ま、こんな感じのお客様です。

# 要件を詰める

Q. 営業時間とメンテナンスウィンドウは？
A. 24時間365日、予告すれば可能だけど夜にしたい

Q. 障害時の対応
A. １日以内に復旧してほしい

Q. １日の取り扱い高
A. 平均すると30~50万円くらい

Q. １ヶ月にかかるインフラのコスト感
A. 10万円くらいで収まる？
R. 円安だからなー　ちょっと厳しいかもよ**妥協することで安くなることもあるからあんまり高望みしないでね**

Q. ワイへの報酬
A. 分割払いでいい？

# エンジニアとの対話
このあたりはミツヒデ＝クンに取り次いでもらってヒアリング。
フロントはnext.js, バックエンド(API)はpython、データの永続化はPostgreSQL、githubでソースコードを管理してローカルで動作確認をしている。
開発のエンジニアは２名。

レポジトリを見ると通り一遍まともそう。
Github Actionsを知らないそうなのでどういうものかを説明して利用に同意をもらう。
あとGihhubは**課金しなさい**。

ドキュメントはどこにまとまってますか？→社内のwikiに・・・notionかなにかに移ったら？と提案。

とりあえずローカルで動かす方法を教えてもらって動かしてみる・・・うん、いけそうだな。ビルドの方法も明瞭でよいと思います。

# インフラに落とす
その場で設計図を手書きする。

Region: ap-northeast-2 (osaka)

メインで動くやつは AWS Amplify - ALB-ECS - RDS(PostgreSQL)
あとECR, VPC, Route53, CMとか準備、余力でCloudWatchでかんたんな死活監視のアラート仕込。

RDSのバックアップはスナップショット取ってap-northeast-1に逃がしとこう。

# 作るよ！
さて、CDKで過去に作ったコードをゴニョゴニョ・・・よし、構築完了２日で８ｈくらい。
ついでにこのCDKもgithubで管理しとこ。

AmplifyからGihhub Actionsを参照するようにして、Gihhub ActionsでECRにイメージをpushするようにして、リリース戦略とブランチ戦略をgithub flowでお願いしますと提案する。

依頼が１月４日で当日中にヒアリング完了、そして３連休はガッツリなにもせず１０日にはなんかいんたあねっと上で動くものが出来上がっていたとさ。

１月のコストは $600 って出てるけど円安なんだよなあ・・・１０万超えるって言っとこ・・

さて、おおいにケチる要素のあるテスト環境の話をこれからします。

たぶん、スペック変えるだけで一瞬でできますね。

まだ細かいこと詰めないといけないけど妥協できるところ妥協していけばこのスピード感ですね。
IaCさまさまです。
Databricksノートブック上でのDelta Live Tablesの構文チェック

知らなかった…。これまでは[Delta Live Tables](https://www.databricks.com/jp/product/delta-live-tables)のロジックを記述したノートブックは、Delta Live Tablesパイプラインとして登録しない限り実行できなかったのですが、構文チェックができるようになってました。[検証機能](https://docs.databricks.com/ja/delta-live-tables/updates.html#validate-update)の導入に合わせてかと思います。

**Delta Live Tables SQLクエリーはどこで実行しますか？**

> ノートブックまたはSQLファイルを使用してDelta Live Tables SQLクエリーを作成できますが、Delta Live Tablesはノートブックのセルで対話的に実行するように設計されていません。DatabricksノートブックでDelta Live Tables構文を含むセルを実行すると、クエリーが構文的に有効かどうかに関するメッセージが返されますが、クエリーロジックは実行されません。

ちなみに、検証機能はパイプラインの画面から実行できます。
![Screenshot 2024-01-12 at 14.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1604d0bb-29ef-93a9-a67e-b3ce0972b36b.png)

ノートブックからセルを実行します。
![Screenshot 2024-01-12 at 14.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5d71e09b-0224-2581-718d-6565ad2531fc.png)

以前はエラーになってましたが実行できます。なお、ここでは構文チェックのみが行われ、データの処理自体は行われません。データを処理するにはパイプラインとして実行する必要があります。
![Screenshot 2024-01-12 at 14.21.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6bba4437-aefa-e970-8409-258add9724f1.png)

以降のセルでも同様に実行できます。処理の結果生成されるテーブルのスキーマを確認できます。
![Screenshot 2024-01-12 at 14.23.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1e1d6436-32ab-d405-e028-ce370e77ad58.png)

これで、ノートブック上でロジックを構築し、構文チェックを行うというイテレーションが可能となります。一通りチェックが終わったら、パイプラインとして作成してデータを用いたデバッグを行うという流れとなります。ご活用下さい！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Single Responsibility Principle(単一責任の原則):関数の責任を絞る

## Single Responsibility Principle（単一責任の原則）
「Single Responsibility Principle（単一責任の原則）」とは、各部分が一つの責任だけを持つべきだというソフトウェア設計の考え方です。

これは、関数設計においても適用でき、それぞれの関数が一つしかタスクを持たないような設計を心掛けた方が良いと言われています。

## 上司からのアドバイス
上司から「関数の責任は1つにした方が良い」とアドバイスを頂きました。

ずばり、ソフトウェア開発において非常に重要な「Single Responsibility Principle（単一責任の原則）」です。

## 実際のコードの例
1つのexample関数の中で引数のnullチェックと本来の処理のロジックを一緒に書いていました。

```typescript
function example(args: string | null) {
  if (args === null) {
    return;
  }
  // 本来の処理を実行...
}
```

単一責任の原則の観点では、引数のnullチェックの役割が本来の関数そのものには含まれない方が良いと考えられます。

この`example`関数で行われていることは、まず`null`チェック、その後に本来の処理を行うという二重の責任があります。

これは単一責任の原則には反する設計です。

これを修正するためには、以下のような書き換えが考えられます。

```typescript
function example(args: string) {
  // 本来の処理を実行...
}

const data: string | null = fetchData(); 
const result: string | null  = data ? example(data) : null;
```

この新しい設計では、`null`チェックの責任が関数を呼び出す側に移され、`example`関数は本来の処理を行うだけの単一の責任を持つようになります。

これにより、各関数やオブジェクトが一つの役割、一つの責任を持つように設計が行われ、単一責任の原則に従った設計となります。

1つの関数に複数の処理を含めないようにすることを忘れないように、この記事に残しました。
SwiftUIとUIKit

# SwiftUIとUIKit

SwiftUIとUIKitは、AppleのiOS, macOS, watchOS, tvOSなどのプラットフォームでユーザーインターフェイスを構築するための2つの異なるフレームワーク。

## SwiftUI

2019年にAppleによって導入された比較的新しいフレームワーク。
Swift言語で書かれており、宣言的なシンタックスを採用。

| 特徴 | 内容 |
| --- | --- |
| 宣言的UI | 宣言的アプローチを使用。
これは、UIの各部分が何であるべきかを宣言し、フレームワークがその外観と動作を処理することを意味。 |
| データ駆動 | データの変更がUIの更新をトリガー。
これにより、UIとデータの状態の同期が容易。 |
| クロスプラットフォーム | 同じコードベースを使用して、iOS、macOS、watchOS、tvOSなど複数のAppleプラットフォーム向けのUIを構築可能。 |
| ライブプレビューとインタラクティブデザイン | Xcodeのインターフェイスビルダー内でコードの変更がリアルタイムで反映され、インタラクティブな開発プロセスを提供。 |
| コンポーネントベース | UIは再利用可能なコンポーネントから構築。 |

## UIKit

iOSの最初のリリース以来使われているフレームワーク。

Objective-CまたはSwiftで書かれたアプリケーションで使用されます。

| 特徴 | 内容 |
| --- | --- |
| 命令的UI | UIKitは命令的アプローチを使用し、開発者がUIの各部分の外観と動作を直接管理。 |
| イベント駆動 | ユーザーのアクションやイベントに基づいてUIを更新。 |
| iOS専用 | 主にiOSアプリケーション向けに設計されており、他のAppleプラットフォームでは異なるフレームワーク（例：AppKit for macOS）を使用。 |
| Interface Builderの使用 | XcodeのInterface Builderを使用して、UIを視覚的に構築。 |
| 広範囲なAPIセット | 長い間の開発とサポートにより、非常に豊富なAPIとカスタマイズオプションを提供。 |

## 採用基準

多くの場合、両方のフレームワークを組み合わせて使用。

| 考慮事項 | 内容 |
| --- | --- |
| プロジェクトの要件 | SwiftUIは最新のOSバージョンにのみ対応。
古いOSバージョンをサポートする必要がある場合はUIKitが適しています。 |
| 開発速度 | SwiftUIは迅速な開発とより簡単なコードの書き方を提供。
しかし、一部の高度な機能はUIKitにしか存在しません。 |
| 学習曲線 | 既存のiOS開発者にとっては、UIKitの方がなじみ深い。
SwiftUIは新しい開発者にとって学びやすいかも。 |

## SwiftUIとUIKitの組み合わせ

SwiftUIが登場したことで、多くの開発者はSwiftUIを中心にUIを構築し、欠けている部分にUIKitを組み合わせるというアプローチを取るようになりました。この方法は、SwiftUIのシンプルさとUIKitの豊富な機能を活用できるという大きな利点があります。

# 参考

- [SwiftUIの概要 - Xcode - Apple Developer](https://developer.apple.com/jp/xcode/swiftui/)
- [UIKit - 日本語ドキュメント - Apple Developer](https://developer.apple.com/jp/documentation/uikit/#overview)
コイントスのコインが偏っていようが（最初の一回目は）なんら問題ないという話


## 前提

無関係な第三者にコイントスをやらせる方法が一番いいでしょう。そりゃ。
でも思考実験としてはつまらないので登場人物はA,Bだけとします。

## 本題

例えば、AとBで以下のようなコイントスをしたとする。

1. Aがあらかじめ仕込んだ表が100%出るコインを用意する。
1. Aが表が出ると予想する。
必然的にBの予想が裏に割り当てられる。
1. 誰でもいいのでコイントスを行う。
1. 表が100%出るため、Aの予想が当たる。

これは不平等だろう。
ではイカサマコインだろうが平等にコイントスを行うにはどうすればいいのか？
以下にその方法を示す。

1. Aがあらかじめ仕込んだ表が100%出るコインを用意する。
1. Bが表か裏かどちらが出るのか予想する。
Aの予想はBの選択しなかった面になる。
1. 誰でもいいのでコイントスを行う。
1. A, Bの予想が当たる確率は50%50%のため、平等な結果となる。

この方法でもなお、平等にならないとしたら以下が考えられる。

* コイントスを行う人物が任意の面を出せる技術を持っている。
* AがBが予想する面をあらかじめ予想し（癖とか）、コインの確率をいじる。
* BがAが仕込んだコインの表裏の確率を知っている。
* 2回目以降、結果がどちらかの面にあからさまに偏っていればBは予想しやすくなる。

複数回やる場合、公平を期すならコイントス毎にコインは変えたほうがいいかもしれない。
もしくはAとBの役割を交互に交換するのもよい。

## 余談

Wikipediaにイカサマコインで公平にコイントスを行う方法が書かれているので気になる人は見てみては？

https://ja.wikipedia.org/wiki/%E5%85%AC%E6%AD%A3%E3%81%AA%E3%82%B3%E3%82%A4%E3%83%B3#%E4%B8%8D%E6%AD%A3%E3%81%AA%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%AB%E3%82%88%E3%82%8A%E5%85%AC%E6%AD%A3%E3%81%AA%E7%B5%90%E6%9E%9C%E3%82%92%E5%BE%97%E3%82%8B%E6%96%B9%E6%B3%95

というか複数回やるならば、こっちのやり方が全然いい。
Postgresqlで遅延実行をする

## はじめに
業務でタイムアウトエラー時の処理を実装する際にデバッグとして使用したので、そのメモです。

## 実行環境
- Windows 10 Pro 22H2
- psql (PostgreSQL) 16.1

## 本文
```
select pg_sleep(n);
```
* n: integer型
* 単位: 秒

例)
```
select pg_sleep(60);
// 60秒スリープさせる
```


他にも以下のような関数が実装されている。
```
pg_sleep_for ( interval );
pg_sleep_until ( timestamp with time zone );
```
例)
```
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');
```

## おわりに
特記するべき事項はないが、テストやデバッグの際に覚えておくと便利なので、頭の片隅にでも置いておくのがいいと思います。

## 参考文献
[PostgreSQL 15.4文書 9.9.6. 遅延実行](https://www.postgresql.jp/document/15/html/functions-datetime.html)
JavaScript: Logical OR (||) と Nullish Coalescing (??) の違い

JavaScriptには`||`（論理OR）と`??`（Nullish Coalescing）という2つの演算子があります。

これらはどちらも値が`null`または`undefined`のときにデフォルト値を設定するために使用されますが、その挙動には重要な違いがあります。

## 論理OR (||)
```javascript
return params || "";
```

`||`演算子は左辺の値が`falsy`（評価時に偽となる値）の場合に右側の値を返します。JavaScriptでは以下の値は `falsy`と評価されます。

```
false
0 や -0
""（空文字列）
null
undefined
NaN
```

このため、`params`変数が`null`や`undefined`だけでなく、その他の`falsy`な値（例えば空文字列や`0`）の場合にも右辺のデフォルト値（この場合は空文字列`""`）が返されます。

## Nullish Coalescing (??)
```javascript
return params ?? "";
```

`??`演算子は`null`または`undefined`の場合に右辺の値を返します。

この演算子は、`null`と`undefined`の値を確認する特別な場合に使用され、他の`falsy`な値（例えば`false`、`0` 、`""`）では右辺には移動しません。

これは、特に`false`や`0`などの値が有効な値として意図されている場合に便利です。
値が本当に`null`か`undefined`かを確認したいときに役立ちます。

## まとめ
`||`演算子は、左辺の値が`falsy`（偽となる値）の場合に右辺の値を返します。

`??`演算子は、左辺の値が`null`または`undefined`のときのみに右辺の値を返します。

常にどの値が予期されるか、どの値をデフォルトとして設定したいかを考慮することが重要です。

これにより、コードは予期しないバグから保護され、読みやすく保守しやすくなります。
conoha メール dmarc 設定

参考
https://soracidblog.com/dmarc-conohawing/

# conohaにログイン

DNS > 設定したい yourdomain.comを選択

TXTレコードに以下を入力

dmarc と 最後が c なので注意！

```
タイプ：TXT
名称：_dmarc
TTL：3600
値：v=DMARC1; p=none; fo=1; rua=mailto:info@yourdomain.com
```

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/f35bf055-abfc-ed17-e683-d9b3a9d20267.png)

値の最後の info@yourdomain.com は、設定するドメインが入っていないといけないらしい。info@hoge.comとかにするとNG。

浸透するまでに1時間近くかかったので、とりあえず設定したら
時間を置きましょう。


# 確認

yahoo メールに送信するのが一番わかりやすい

info@yourdomain.com から
yahoo メールに送信し、確認

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/bc673704-acd0-375e-2545-c70565260793.png)


DMARCが pass になっていることを確認。
たったこれだけ。





# linuxでの確認

```
dig txt _dmarc.yourdomain.com
```

結果
```
;_dmarc.yourdomain.com.                        IN      TXT

;; ANSWER SECTION:
_dmarc.yourdomain.com.         3600    IN      TXT     "v=DMARC1; p=none; fo=1; rua=mailto:info@yourdomain.com"
```

これで設定されていることが確認できる。


# sendgridの設定もする

sendgridを利用している場合、

https://app.sendgrid.com/settings/sender_auth

の設定もしないといけないようだ。
面倒くせー


# aws を利用している場合

awsを利用している場合は、aws側(lightsail)のネームサーバーが有効になっているので、awsのDNS変更する必要がある。
Slackワークフローの回答形式で「日時」を使うと回答文字列が崩れるため、ドロップダウンで対応した

# やりたいこと
社内のアルコール検査報告をSlackワークフローで実現。

# はまったこと
Slackワークフローにおいて回答形式として「日時」を選択した場合、
回答文字列が崩れてしまった。
![0003_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/0778f934-fc0b-3241-e603-a1b672c2f2a4.png)

# 対応したこと
ドロップダウンの選択肢として時間「4:00」「4:30」～「3:00」「3:30」まで、
30分刻みで24時間分登録し、選択させるようにした。
![0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/bfd5f44b-5a23-f2e7-c3e0-2dd0baec9140.png)

やりたいことは、報告日時を回答に含めたい、かつ、そこまで厳密な時間の
報告は不要だったので、回答形式として「ドロップダウン」を使用する
ことで対応した。
![0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/143d95e5-e167-703a-1f6c-016c7b679558.png)

# 結果
時刻を選択させているので、当然ちゃんとした時刻となる。
やりたいことはできた。
![0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/cd8da183-9513-4460-44f0-5a3cf5929eb7.png)

# 疑問点
日本語で使用した場合だけ崩れるのだろうか？
そもそも使い方が悪い？
「デデンネする」をJavaScriptでコードゴルフ


## 元ネタ

http://kutachu.web.fc2.com/dedenne.htm

## ルール

* デ：50%, ン：25%, ネ：25% の割合でランダムな文字列を生成する。
* 末尾がデデンネになったら生成を止め、文字列を表示する。

## コード

67文字

```js
for(t='';!t.match(d='デデンネ');)t+=d[Math.random()*4|0];console.log(t)
```

```js:読みやすく加工
for (t = ''; !t.match(d = 'デデンネ');) {
    t += d[Math.random() * 4 | 0];
}
console.log(t);
```
Azure App Serviceでkeycloakを起動させる

認証系の機能が必要な時におためしで立ち上げてみた記録

# App ServiceをWebアプリで作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476893/06eeff6e-fe5b-6b0d-85fb-fcea84619ead.png)

## Docker Hubから取得する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476893/6b62a820-6e11-d8b3-121d-165cd78b339e.png)

## その他はデフォルト設定で作成


# App Serviceで環境変数の設定を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476893/ee02772b-8376-b10f-bacd-43ee56e52571.png)

```json:sample
[
  {
    "name": "DOCKER_REGISTRY_SERVER_URL",
    "value": "https://index.docker.io/v1",
    "slotSetting": false
  },
  {
    "name": "KC_HOSTNAME",
    "value": "XXXXX.azurewebsites.net",
    "slotSetting": false
  },
  {
    "name": "KC_HOSTNAME_STRICT",
    "value": "false",
    "slotSetting": false
  },
  {
    "name": "KC_HOSTNAME_STRICT_HTTPS",
    "value": "false",
    "slotSetting": false
  },
  {
    "name": "KC_HTTP_ENABLED",
    "value": "true",
    "slotSetting": false
  },
  {
    "name": "KC_PROXY",
    "value": "edge",
    "slotSetting": false
  },
  {
    "name": "KEYCLOAK_ADMIN",
    "value": "admin",
    "slotSetting": false
  },
  {
    "name": "KEYCLOAK_ADMIN_PASSWORD",
    "value": "password",
    "slotSetting": false
  },
  {
    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
    "value": "false",
    "slotSetting": false
  }
]
```

# 設定後にadminのパスワードで入ると画面が表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476893/f2a212f3-dab7-8649-f166-36ce64413b36.png)
正規形

資格試験に合格することを目的に、正規化の詳細な手順ではなく表を見てそれが第何正規形なのかを判断できるようにする。

## 非正規形
繰り返し部分を持つ表
1つのセルに2つ以上データが格納されているかどうかを見る。
一目見て判断できるので、試験で出題されることは少ない

## 第一正規形
非正規形から繰り返し処理を排除した表。
1つのセルに1つのデータしか含まれていない表は、少なくとも第一正規形の条件は満たしている。
非正規形との違いは一目見てわかる。第二正規形との違いをしっかりと把握する。

## 第二正規形
すべてのひ非キー属性が、主キーに完全関数従属している表。
主キーに部分関数従属している非キー属性があると第一正規形ということになる。
また主キーがひとつしかない表は、（非正規形でない場合）第二正規形以上ということになる。
試験では主キーが複数ある表が提示される可能性が高いので、非キーが主キーに完全関数従属しているかを見る。

## 第三正規形
主キーに推移的関数従属している非キー属性を別の表に分解した表。
非キー間の関数従属がない状態。

## 正規形判断チャート
1つのセルに2つ以上のデータが含まれている ***(YES) → 非正規形***
***(NO)
↓***
すべての非キー属性が、主キーに完全関数従属している ***(NO)→ 第一正規形***
***(YES)***
↓
非キー間で関数従属がある ***(YES) → 第二正規形***
***(NO)***
↓
***第三正規形***
Dynamo DBの格納値に勝手につく大文字は何？

## データ型記述子
Dynamo DBに「16538」などの数値データを格納したとき、
[{N:16538}]のようになっていることについて調べた

まずは画像を掲載する
AWS公式のリファレンスの画像を引用し吹き出しで補足した
![DBデータ記述子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334388/cdc4fbcd-3bea-b7f8-6f25-404600de07b9.png)

AWS　SDK→DynamoDBへデータを送る時
Low-Level APIがデータ型記述子という各属性を解釈する方法をDynamoDB に伝えるトークンを付与する
これがデータ記述子というもので先ほどの数値の頭についた「N:」という表記である

[{N:16538}]は16538が
N＝数値（Number）である
ということを表す

これらのデータ型記述子は普段上位階層であらかじめコードを記述する必要はないものだということがわかった
（ただしDBから値を取得したときはデータ型記述子があることに注意）
Python プログラムをデスクトップ上で実行する方法

## Python プログラムをデスクトップ上で実行する方法

### 経緯
あるとき、インフラエンジニアの方に頼み事をされた。
内容はここでは割愛するが、そのプログラムを書いた。
そこで、便利に使ってもらいたいということで
デスクトップ上でプログラムを実行できる方法を調べたので
それを紹介する。


### 方法
#### A. プログラムのショートカットキーをデスクトップに作成する方法
1. **ショートカットを作成**
   - プログラムファイルを右クリック。
   - 「送る(N)」を選択。
   - 「デスクトップ(ショートカットを作成)」を選択。

2. **インタープリタとプログラムパスを設定**
   - 作成したショートカットを右クリック。
   - 「プロパティ(P)」を選択。
   - ショートカットタブを選択。
   - リンク先(T)に Python のインタープリタファイルとプログラムファイルのパスを入力。
     - 例: `"C:\Users\Programs\Python\python.exe" "C:\Users\Desktop\sample.py"`

#### B. バッチファイルをデスクトップに作成する方法
1. **バッチファイルの作成**
   - テキストと同じように、拡張子を `.bat` にするだけで作成できます。

2. **バッチファイルの編集**
   - ファイルに以下の内容を記載：
     ```
     @echo off
     python "C:\Users\Desktop\sample.py"
     ```
     - (パスは例です)

3. **バッチファイルの保存**
   - 例: `sample.bat`

### 最後に
AまたはBの手順を行えば、デスクトップにアイコンが作成され、クリックで実行が可能になる。
色の見え方（色彩検定おさらい）

## 色の見え方

色の見え方について学んだことをまとめてみました

### 色とは
光によって目に認識される情報の一つ
色が成立するには光源、物体、目が必要

![20231113_色１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334388/68570302-87c1-9bb1-da2e-7ef93cd39ead.png)

### 分光分布
光源ごとの光の性質。
光源の光に含まれている色味の量を可視化したもの

### 分光反射率
光源以外の物体の色の性質。
その物体が光を受けた時、どの色を多く反射するか、という量を可視化したもの
Ubuntu 22.04でリポジトリから提供されるVirtual Boxが起動しない場合

# リポジトリで提供されるVirualBoxがシステムアップデート後起動しない
原因は、最新カーネルでVirual Boxのドライバがmodprobeでロードできない状態になっている。

## 対処方法
１．起動時にgrubメニューを起動して（Escキーを数回押す）
２．Advanced option for ubuntuを選ぶ
３．kernel 6.2.0.39で起動する。

これで起動するあとはアップデートで修正されるまでまつのみ・・・

## 解消確認！！
2024年 １月１８日付の Ubuntu22.04LTS　環境がアップデートされモジュールが正常に読み込まれた！！
AWS上に載せたGitLab関連のメモ(メールサーバー無し)

# 概要
https://qiita.com/yushikmr/items/902436a64ccc213947fe

EC2上にGitLabアカウントを作成したが,メール送信等はいらないので,入れなかった.  
そうしたらアカウント発行ができなくなったので,解決策を模索中

## アカウント作成
GitLabのRootユーザーによって作成できます.

## アカウントのパスワードを変更
AWSのコンソール上でコマンドを打つことによって変更できます.

https://docs.gitlab.com/ee/security/reset_user_password.html?tab=Linux+package+%28Omnibus%29

```
GitLabのコンソールからパスワードをリセットする：
GitLabのサーバーにrootユーザーとしてログインします。
GitLabのコンソールを使用してtestユーザーのパスワードをリセットします。
コマンドラインで以下のように実行します（GitLabバージョンによって異なる場合があります）：

sudo gitlab-rails console
user = User.find_by(username: 'test')
user.password = 'newpassword'
user.password_confirmation = 'newpassword'
user.save!

ここで、'test'はユーザー名、'newpassword'は新しいパスワードに置き換えてください。
```

# GitLabの再起動

```
sudo gitlab-ctl restart
```


# SMTP Setting(今回しなかったメール設定)
https://docs.gitlab.com/omnibus/settings/smtp.html#amazon-simple-email-service-aws-ses


# GitLabのプロジェクトクローン時にローカルIPでしかできない
こんな感じにローカルIPが参照されている状態になる.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/bc65582a-bd91-678f-2296-17a2d5a43d55.png)
コマンドで設定できるらしいが,今回は応急処置をする.(まだ固定IPをとってないため)

AWSのインスタンスのパブリックIPを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/a6c5ab91-8ec5-8add-ade7-8306651322ed.png)

上記のローカルIPの代わりにパブリックIPを入力する.


# 終わりに
ここに知識を蓄積してきます.
Xcode CloudでArchiveが完了しない

## 概要
Xcode Cloudでビルド（`Build`と`Archive`）を実行している。

状況としては以下の通りで、通常は15〜20分あれば完了しているはずである。
Build：成功
Archive：進行中から終わらない（10時間程度経過しても終わらない）

## 調査
「Xcode Cloud Archive Not Completed」辺りで検索
↓
[Xcode Cloud: All builds get stuck in Archive action - all tasks are green, but the action stays running for 10+ hours or until killed](https://forums.developer.apple.com/forums/thread/707445)
↓
要約：「ビール🍻飲みながら待て」（未解決）

## 対応
待っていても一生終わる気がしないのでビルドをキャンセルして、対象ブランチのビルドを再実行すると問題なく完了したので解決とする。
lifecycle 2.7.0についてのメモ

# 概要

lifecycle 2.7.0がリリースされています。
https://developer.android.com/jetpack/androidx/releases/lifecycle#2.7.0

ChatGPTにお願いした更新内容の要約は次の通りです。
1. `TestLifecycleOwner`に、状態変更とLifecycleObserverコールバック完了のためのサスペンド機能`setCurrentState()`が追加されました。
1. LiveData拡張の`map`と`switchMap`は、`distinctUntilChanged`のように振る舞い、LiveDataの値を即座に設定するようになりました。
1. `SavedStateHandle`でカスタムParcelableクラスがプロセスの死後に正しく復元されるよう修正されました。
1. LifecycleObserverに関連するProGuardの保持ルールが削除されました。
1. Jetpack ComposeとFlowで`Lifecycle.Event`と`Lifecycle.State`を観察する新機能が追加されました。

# LifecycleとComposeのIntegrate

ComposeでLifecycleに応じた処理を書きやすくするComposableが追加されています。

1. LifecycleEventEffect
1. LifecycleStartEffect
1. LifecycleResumeEffect
1. Collect lifecycle state with flows


ドキュメントも新しく用意されていました。
https://developer.android.com/topic/libraries/architecture/compose

# LifecycleEventEffectの例

LifecycleEventEffectの例。onResumeのタイミングでviewModelのメソッドを叩いています。
今までlifecycle ownerを取得して監視するコードを書いたりしてましたが、簡単に書けます。
Activity/Fragmentに書いていたLifecycleに応じたコードもComposeに移せますね。

```kotlin
@Composable
fun HomeScreen(viewModel: HomeViewModel = viewModel()) {
  LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
    viewModel.refreshData()
  }
  // …
}
```

# LifecycleStartEffectの例

こちらはLifecycleStartEffectの例。

```kotlin
fun HomeScreen(viewModel: HomeViewModel = viewModel()) {
  LifecycleStartEffect(viewModel) {
    val timeTracking = viewModel.startTrackingTimeOnScreen()
    onPauseOrDispose {
      timeTracking.stopTrackingTimeOnScreen()
    }
}
```

# Collect lifecycle state with flows

「Collect lifecycle state with flows」ということで、Lifecycleの状態をStateFlowとして購読できるようになっています。

```kotlin
val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()
```

# 関連資料

- https://developer.android.com/jetpack/androidx/releases/lifecycle#2.7.0
- https://developer.android.com/topic/libraries/architecture/compose
Recoveryコンテナー作成時に冗長構成が指定できるようになってて、ちょっとだけテンション上がったよ、って話。

表題の通りです。笑。

先日久々にAzure Backup取得時に必要なRecovery Servicesコンテナーを作成したのですが、
作成時に冗長構成が指定できるようになってました。（いつからできるようになっていたのかは分かりませんが、、）

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/0b1ae7c0-696f-be00-6dce-517a8e9bfbb3.png)


Recovery Servicesコンテナーはデフォルトだと「GRS（geo冗長ストレージ）」で作成されるのですが、今までは作成時に冗長構成を指定できない、かつ、初回バックアップ取得前までに変更しないと変更不可だったため、
変更を忘れてバックアップを取得してしまい、バックアップデータを一度全部消すことに...なんてことをたまにやらかします...（おいｗ）

作成時に変更できるようになれば、忘れることは減りそうなので安心！！！（たぶん）

なお、今まで通り、Recoveryコンテナの[プロパティ]-[バックアップ構成]からも変更可能です。
（作成時に指定する場合も、作成後に変更する場合も、初回バックアップ実行前までしか変更できないことは変わっていないのでご注意を。）

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/003c1588-1279-1a44-7777-c051ffc8db4a.png)


ちなみに、現在Azure Backupで指定できる冗長構成は以下の3種類です。

1. LRS（ローカル冗長ストレージ）
   取得したバックアップデータは1つのデータセンターのみに保管されます。
   一番安価ですが、データセンターに有事があった場合はデータ復元ができません。
   ![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/e7bd4c06-d2d7-8495-2cb6-2fd26cd047fd.png)

   
2. GRS（geo冗長ストレージ）
   Recovery Servicesコンテナーをデフォルト値で作成すると、GRSのコンテナーが作成されます。
   ペアリージョン（東日本リージョンにコンテナーを作成した場合は西日本リージョン）にもデータが同期されるので、東日本で有事があった際も、西日本にバックアップデータをリストアして稼働させるということも可能です。
   ただし、費用面では1番コストがかかります。
   ![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/d460ed3c-5a57-256d-4f9e-dde21431235c.png)

   
3. ZRS（ゾーン冗長ストレージ）
   同じリージョン内の複数のデータセンターにデータが保管されます。（他のリージョンには保管されません。）
   リージョン全体が災害にあってしまった...等が起きてしまうとどうにもなりませんが、同リージョン内の一部データセンターに有事が発生した場合でも、データは他のデータセンターに残っているのでそのまま使えます。
   費用面は、LRSより高く、GRSよりは安価ですが、サポートされていないリージョンが一部あります。（日本も西日本リージョンでは使えなかったはず...）
   ![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/8191fbce-a1b8-9107-b274-10f11a5d3885.png)

   ***
   という感じの雑な独り言みたいな記事でした。
   （2024年は最低月1でQiita書くっていう目標立ててしまったので、とりあえず何か書きたかっただけです。笑。）
ニフクラ mobile backendのデータストアをParse Serverに移行する

[ニフクラ mobile backendは3月末で終了します](https://mbaas.nifcloud.com/info/2023/12/post-171.html)。

ニフクラ mobile backendからの移行先として、お勧めしているのが[Parse Server](https://parseplatform.org/)です。設計思想が近く、変更するコード量が少なく済むのではないかと思います。

そこでParse Serverへの移行をサポートできるスクリプトを作成中です。今回はデータストアの移行スクリプトを紹介します。

## TL;DR

今回、移行用のスクリプトを作りました。

[NCMBMania/ncmb2parse](https://github.com/NCMBMania/ncmb2parse)

使い方は、以下のような形です。

```bash
npx node dist/datastore.js
  -a YOUR_APP_ID \
  -m YOUR_MASTER_KEY \
  -u YOUR_PARSE_SERVER_URL\
  -j YOUR_JAVASCRIPT_KEY \
  -n YOUR_CLASS_NAME \
  /path/to/datastore.json
```

## 必要な情報を用意する

### ニフクラ mobile backendのデータストアをエクスポートする

データストアのファイルは管理画面のエクスポート機能か、Chrome機能拡張で取得できます。各クラス毎にファイルが分かれており、JSONデータとしてエクスポートが必要です。

## Parse Serverの各種データを取得する

Parse Serverを起動する際の、下記データが必要です。

- アプリケーションID
- マスターキー
- Parse ServerのURL
- JavaScript APIキー

これらを控えておきます。

## 移行用スクリプトを用意する

移行用スクリプトは、Node.jsで動作します。Node.jsがインストールされていない場合は、インストールしてください。

```bash
git clone https://github.com/NCMBMania/ncmb2parse.git
cd ncmb2parse
npm install
```

## 移行用スクリプトを実行する

先ほど取得したParse Serverの情報、データストアのファイルパスを指定して、スクリプトを実行します。 `-n` はクラス名を指定します。

```bash
npx node dist/datastore.js
  -a YOUR_APP_ID \
  -m YOUR_MASTER_KEY \
  -u YOUR_PARSE_SERVER_URL\
  -j YOUR_JAVASCRIPT_KEY \
  -n YOUR_CLASS_NAME \
  /path/to/datastore.json
```

ヘルプは以下の通りです。

```
Usage: datastore [options] <filePath>

Arguments:
  filePath                              インポートするJSONファイルのパス

Options:
  -k, --key <REST API Key>              Parse ServerのREST APIキー (default: "")
  -u, --url <URL>                       Parse ServerのURL
  -a, --app <Application ID>            Parse ServerのApplication ID
  -n, --name <Name>                     クラス名、ロール名を指定 (default: "")
  -m, --masterKey <Master Key>          Parse ServerのMaster Key (default: "")
  -j, --javascriptKey <JavaScript Key>  Parse ServerのJavaScript Key (default: "")
  -h, --help                            display help for command
```

## 注意点

- `-n` オプションはクラス名です
- ACLでユーザー指定している場合、あらかじめユーザーデータがインポートされていれば、そちらとマッチングします。現在は最大1000件までのユーザーデータとしていますが、必要があれば拡張してください。

## まとめ

Parse ServerはデータやACLがニフクラ mobile backendと近いので、データ移行はさほど難しくありません。Parse Dashboardを使えば、Webブラウザからプッシュ通知の作成も可能です。自分でサーバーを立ち上げる必要はありますが、移行先として検討してみてください。

[Parse Platform](https://parseplatform.org/)
早期リターン

## 早期リターン(さっさと処理を抜けたい時に使える)
#### 早期リターンを使用しない場合
引数が0の場合でも、処理が続行してしまう。
余計な処理をしている。
```swift
func sum(number: Int) -> Int {
    guard number > 0 else {
        // 条件が成り立たない場合、ここで処理を続行する
        print("条件不成立")
    }
    
    // 条件が成り立った場合の処理
    var sum = 0
    
    for i in 1...number {
        sum += i
    }
    
    return sum
}

let result = sum(number: 5)
print(result)  // 出力: 15
```
#### 早期リターンした場合(guard文を使った例)
`number <= 0`という条件が成り立つ場合、すぐに0を返して関数を終了しています。
これにより、不要な計算を省略し、コードがより効率的になる。
```swift
func sum(number: Int) -> Int {
    guard number > 0 else {
        // 条件が成り立たない場合、早期リターン
        return 0
    }
    var sum = 0
    
    for i in 1...number {
        sum += i
    }
    
    return sum
}

let result = sum(number: 5)
print(result)  // 出力: 15

```
FirebaseのSPFレコードを登録してる場合はGoogleのSPFは不要という話

# 概要

Firebase AuthenticationとGoogle Workspaceからのメール送信が必要なシステムで、SPFレコードを以下のように登録していた。

`v=spf1 include:_spf.firebasemail.com include:_spf.google.com ~all`

[mxtoolbox](https://mxtoolbox.com/) でSPFの構成をチェックしたところ、以下のような警告を発見。

> Too many included lookups (11) Too many DNS Lookups? Solve this problem with SPF Flattening

SPFにおけるDNSルックアップの最大回数は10回までという制限がある。

# 疑問

FirebaseはGoogleのサービスだからSPFのアドレスも重複しているのでは?

# 調査

redditにも同じような投稿があった。

https://www.reddit.com/r/Firebase/comments/ds9e3o/spf_records/

> It looks like _spf.firebasemail.com just has include:sendgrid.net in there as well as redundant lookups for _spf.google.com.
> You should be able to just put include:sendgrid.net in your SPF record and that will cover you.
> 
> _spf.firebasemail.comにinclude:sendgrid.netがあるだけでなく、_spf.google.comのルックアップも重複しているようです。
SPFレコードにinclude:sendgrid.netを入れれば大丈夫です。

なるほど。

# 検証

実際にFirebaseのSPFレコードをdigしてみる。

```
dig -t txt _spf.firebasemail.com

; <<>> DiG 9.10.6 <<>> -t txt _spf.firebasemail.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65082
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;_spf.firebasemail.com.		IN	TXT

;; ANSWER SECTION:
_spf.firebasemail.com.	300	IN	TXT	"v=spf1 include:sendgrid.net include:_spf.google.com ~all"

;; Query time: 10 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Fri Jan 12 09:24:04 JST 2024
;; MSG SIZE  rcvd: 119
```

普通に `sendgrid.net` と `_spf.google.com` が定義されてた。

[SPF Surveyor](https://dmarcian.com/spf-survey/) でルックアップしてもIPが重複していることが分かる。

![Screenshot_2024-01-12_at_9_31_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/1e55cc25-d34b-c7d9-2b4d-2917bb9e1488.png)

SPFから `_spf.google.com` を外してもメール受信時は `PASS` になることを確認。

![Screenshot_2024-01-12_at_10_55_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/380a7fc2-1e58-4e30-c175-c0023cf01058.png)

ルックアップも11回から8回に減らせた。

![Screenshot 2024-01-12 at 10.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/13134350-b566-f9aa-dea3-baa3324ac0ed.png)

# 結論

FirebaseとGoogle Workspaceを利用してる場合、SPFレコードはFirebaseだけ登録してあれば良い (Sendgridの場合も同様)。
[Terminal/Shell] TerminalとShellの違い

***
### 環境
- Windows 10 Enterprise
***
### まとめ
- Teminal:ユーザーとコンピュータ間のコミュニケーションを可能にするインターフェース
- Shell:Terminalにおけるコミュニケーションを通じてオペレーティングシステム（OS）を操作するためのプログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/ce43e3e1-b7b4-677e-c2bf-72214b2e941e.png)

※Bash,Command Prompt,PowerShell:いずれもTerminalである。また、コマンドラインアプリケーション（またはコマンドラインインターフェース）と呼ばれ、CUI（Character User Interface）で操作する。

***
### 参考リンク
- [【初心者向け】シェル・ターミナル・コンソールの違いとは？](https://eng-entrance.com/linux-basic-shell-terminal-consolel)
CursorをTerminalから起動させたい

---

Cursorってキーワード的にユニークじゃないしまだメジャーではないから
Google検索しても上手く引っかからない・・

---

以下MacOSのお話です

---

VScodeだと
```
$ code .
```
で起動できるけど、
CursorをTerminalから起動する方法がぱっと分からなくて
多分Cursorの起動プログラムがあるだろうって探したら

```
$ find  /Applications/Cursor.app/Contents/ -type f|xargs ls -alg|grep 'x  '
〜
-rwxr-xr-x  1 staff      32816  1  8 23:31 /Applications/Cursor.app/Contents//MacOS/Cursor
〜

```
だったの、フルパスで実行したらCursorが起動した。
ので、
~/.bash_profileに
```~/.bash_profile
alias cursor='/Applications/Cursor.app/Contents//MacOS/Cursor'
```
を追加し
```
$ . ~/.bash_profile
```
で、今のターミナルに反映させて

```
$ cursor .
```
で起動させることができましたとさ、おしまい。
Ubuntu AppImageファイルを置くところに困ったら

## はじめに
以下の問題に悩んでいる人向けに書いた。
- AppImageファイルをどこに置こうか迷っている
- AppImageファイルの管理に困っている
- linuxのデスクトップショートカットの作り方がわからない

## 結論
よく使うファイルなので、`デスクトップ`にフォルダを作成するほうが一見良いかもしれないが、私は下のようにルート直下にすると良いと考える。
```
mkdir ~/AppImages/{XXX}/{XXX.AppImage} # 中括弧は不要
```
そして、後述するAppImageファイルのデスクトップショートカットを作る方法が良いと考える。

## ubuntuでデスクトップショートカットを作る方法
私がこの記事を書く動機は、デスクトップショートカットの作成方法が、少々分かりづらかったからだ。(わかったと思える記事が少ない。)

### cursorエディタを例にしてみる

```
mkdir ~/AppImages/cursor/ #cursorエディタ用のディレクトリを用意する
```

```
cd ~/AppImages/cursor/ #cusorエディタ用のディレクトリに移動
```

[cursor editorのインストールページに移動](https://cursor.sh/)　

```
chmod +x {インストールしたcursorエディタのバージョン}.AppImage #cursorエディタに実行権限を付与
```

```
sudo vi /usr/share/applications/cursor.desktop
```

以下を貼り付ける
```
[Desktop Entry]
Name=Cursor
Exec=~/AppImages/cursor/cursor.AppImage 
Icon=~/AppImages/cursor/icon/cursor.png 
Type=Application
Categories=Development;
```

Iconという変数が見えると思う。先程作った`~/AppImages/cursor/`に`mkdir icon`を実行し、ネット上でcursorエディタのアイコンを`/icon/`にダウンロードすれば`show Applications`に`Cursor`が出てくるはずである。
(アイコンをダウンロードする際は、作成した`.desktop`ファイルのIconと一致させるように改名する必要がある。)
AWS IoT Core でルールアクションの選択備忘録

# AWS Iot Coreのルールアクションの選択（DynamoDB/DynamoDBv２）
IoT Coreでルールを指定し、Dyanamo DBにデータを自動で入れるようにしたかった。

しかしルールアクションの選択で（DynamoDB/DynamoDBv２）
どちらもDBへのデータ追加が可能。どっちを使えば良いのか？

理解できた気がするので備忘録として記載する。

早速だがざっくりまとめる。

| |DynamoDB|DynamoDBv2|
|:--|:--|:--|
|設定方法|テーブル名、プライマリーキー、ロールを指定|テーブル名とロールの指定のみ|
|メリット|SQLの結果を指定したカラムにまとめて入れることが可能|SQLの結果をそのままDBにPut_Itemする|
|デメリット|使えるのは1カラムのみ|プライマリーキーはSQLで指定|
|ユースケース|★取得データ以外の情報をプライマリキーに設定できる|★複数カラムでデータを扱いたい時|


今回はカラムを複数に分けたかったのでDynamoDBv2、という選択にした。
Wiresharkで4.2.0から4.2.2へのアップデートがフリーズする件の対応

# 現象

『更新を確認』をして…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6a9d4bc7-98f8-cb56-cb3b-8e9e6e808c0a.png)

『アップデートをインストール』を押して…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1d79af9f-7d28-e93b-3267-452f43002ac5.png)

アップデーターのダウンロードまでは成功しました。
ですが、いざアップデートを実行しようとしても、 **アップデーターの画面すら出てこずにフリーズ状態** になってしまいました。

# 対応

下記から4.2.2のインストーラーexeを直接ダウンロード。
その後、exeを手動実行したらアップデートできました。



https://www.wireshark.org/download.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/94ed77b3-168b-fd8d-b120-d3f677859c21.png)

# インストーラー経由のアップデート時スクショ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a44afa16-b103-5204-0e7b-5c752d9c4b5a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7fc693bf-243d-711a-2d8f-89efe433b04f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3c601d2b-a8bf-d419-5a4e-61b26833a4f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4ebce970-666c-e321-dbf5-97a20461d11d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5aa6b0b0-8f9a-2225-1699-6e395b28afef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5e439fc7-cf34-fc60-7bb5-59eb3df83778.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/56c21667-2614-1c1c-c66f-049cfecb202e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3c218b27-6e5e-e8a8-d2bb-3e8d05d12bca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3cba8dd3-2c52-4b39-4f6a-cb25d1b421a5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7f1cfb16-0c94-f3f9-233f-38538dca5cff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8a54efdc-8ed5-0003-ebff-5731855dc845.png)

# 参考サイトさん

https://twitter.com/ikeriri/status/1743129905616097398

# バージョン

Microsoft Windows [Version 10.0.19045.3930]
【GPTs】DocBaseと連携する

## GPTsとDocBaseを連携して、自然言語で検索できるようにする
DocBaseで目的の記事を見つけるのが手間になってきたため
GPTモデルを利用して自然言語のクエリを解釈し、それに基づいてDocbaseのAPIを通じて関連する記事を検索させるGPTsを作成する。

## DocBaseのアクセストークンの取得
以下より、アクセストークンを発行する。
https://ドメイン.docbase.io/settings/tokens

## GPTsのActionsの設定
### Authentication
発行したアクセストークンを以下のように、設定する。
Custome Header Nameは、`X-DocBaseToken` にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58745/4b553f8a-9ea8-6cbd-9056-af9ff7680952.png)


### Schema
記事一覧と、記事詳細のAPI schemaを登録する。
```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Get Docbase Posts",
    "description": "Docbaseの記事を取得するAPIです",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://api.docbase.io"
    }
  ],
  "paths": {
    "/teams/ドメイン/posts": {
      "get": {
        "description": "DocBase記事一覧",
        "operationId": "GetDocBasePosts",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "docbase内のpostを絞り込むための検索文字列",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "ページ番号",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "description": "1ページあたりの表示件数",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "deprecated": false
      }
    },
    "/teams/ドメイン/posts/{post_id}": {
      "get": {
        "description": "Docbase記事詳細",
        "operationId": "GetDocBasePost",
        "parameters": [
          {
            "name": "post_id",
            "in": "path",
            "description": "post_id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}
```

## 動作確認
![スクリーンショット 2024-01-12 10.17.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58745/013e6946-1595-c801-ffc8-ed31c6d99603.png)
MindでC言語のDLLと連携する際の注意事項（Mind Tips）

# はじめに

MindでC言語のDLLと連携する際の注意事項についてまとめてみました。Mindユーザーの @mylifewithviolin さんが最近、[MindでC言語のDLLと連携する記事](https://qiita.com/mylifewithviolin/items/7901da4001cada906663)を書かれたので横から？援護射撃？です。

# 対象読者

日本語プログラミング言語 Mindユーザーの皆さん。

# MindでC言語のDLLと連携する際の注意事項

## Cの構造体

Mindの構造体はCのそれとそっくりな概念なので問題ないはずです。

構造体名が「○○構造体」だとすると、

　　　○○構造体の　アドレスで　・・・

のように書くだけで構造体アドレスを参照できます。

細かなところでは、コンパイラが16bit境界、32bit境界のアライメントを強制的におこなうので、たとえば、

　　　○○構造体は　構造体
　　　　　　　変数１は　変数
　　　　　　　変数２は　ワード変数
　　　　　　　変数３は　変数

みたいなのがあると、変数２と変数３の間に16bitのパディングが入ることに注意が必要です。
でも、たぶんAPIの引数で渡すような構造体は上記のような変則的な配置は使わないと思うので大丈夫かとは思います。

## Mindの文字列をCに渡すとき

あとは、Mindの文字列をCに渡すときでしょうか。
文字列先頭のアドレスを渡すところまではどっちも同じですが、Cが文字列を正しく扱えるようにNULL終端する必要があります。

２つのやりかたがあります。
１つ目は正統的な方法で、

　　　　　文字列実体１は　文字列実体　長さ　○○

のように局所変数で確保しておき、

　　　　＜文字列＞を　文字列実体１に　入れ
　　　　０を　文字列実体１に　一文字追加し　←★これ

でNULL終端できます。このあと、

　　　　文字列実体１を　・・・
または
　　　　文字列実体１の　アドレスを得て 　・・・

で文字列先頭アドレスをスタックに積むことができます。本当は前者で良いのですが後者のほうが、いかにもアドレスを渡す気分が出ます(^^)。ただし「アドレスを」ではなく「アドレスを得て」なので注意です（「アドレスを」では文字列実体変数のアドレスを積むことになります）。

ついでなので・・
Cの文字列変数とMindの文字列変数の違いの一つが、文字列変数の形式にあります。Cの場合は文字列変数にヘッダのようなものは付かないので、

　　文字列変数のアドレス＝格納される文字列のアドレス
  
ですが、Mindでは一致しません。Mindの文字列実体変数は先頭部にヘッダがあるので格納されている文字列はその少し先になります。
ではなぜ、

　　　　文字列実体１を　・・・

と書いて良いのかと言えば、文字列実体変数を単に書いた場合は、「その変数に格納されている文字列」をスタックに積む仕様だからです。

２つ目はNULL終端専用の処理単語を使う方法があります。

file\fwinAPI.srcというソースに使用例が多数ありますが、
たとえば、

／￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣＼
モジュールの関数アドレスを得るとは　（モジュールハンドル、関数名　→　関数アドレス）
  　　　　　　　　モジュールハンドルは　変数
  　　　　　　　　関数名ASCIZは 　文字列実体情報
  　　　　　　　　関数アドレスは　　　　変数
　　★１ 文字列実体を獲得して複写しNULL終端し　関数名ASCIZに　入れてから、
 　　　　モジュールハンドルに　入れ
 　　　　エラークリアし
 　　★２ 関数名ASCIZを　文字列実体を参照し　　
 　 　　　　モジュールハンドルで
 　　 　　　　c_get_funcaddr_onlyし
 　　　 　　　　関数アドレスに　入れ
 　　★３ 関数名ASCIZを　文字列実体を解放し
     　　～略～
＼＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿／

のように使われています（★印がポイント）。

「文字列実体を獲得して複写しNULL終端」は内部でmalloc()し、動的生成した文字列実体変数の情報（＝文字列実体情報）を返してきます。メモリ解放も明におこないます。

上のプログラムに

　　　関数名ASCIZは 　文字列実体情報

の個所に「文字列実体情報」という聞きなれない変数宣言がありまずが、これが文字列実体情報を格納するものです。これはCで言えば「変数へのポインタ」です。

文字列実体情報の変数を使っての文字列操作は文字列実体を使う操作とほぼ同じで良いのですが、その変数に格納された文字列を得るには単に変数名を書くのではなく「文字列実体を参照」を使って明に取り出す必要があります。（単に変数名を書いただけではポインタを得ることになってしまうので）
上のプログラムの★２で

　　関数名ASCIZを　文字列実体を参照し
  
とあるのがそれです。

ちなみに、Mindの文字列をそのままAPIに渡すことは問題ありません。なぜならMindの文字列の"整数部"は文字列アドレスなのでそのまま使えます。Mindの文字列の"整数部でない領域"には長さが積まれていますが無視されるので結果的にOKです。

文字列を文字列実体情報変数（が指すところの文字列実体変数）に格納するときも同様で、「○○に　入れ」ではなく「○○に　文字列実体を入れ」と書く必要があります。

以上ちょっと面倒ですがその代わり、実行時にならないと分からない、とても長い可能性のある文字列をNULL終端するとき、最大長を予測しなくて良いというのがメリットです。

## Cの文字列をMindに渡すとき

C側で得られたNULL終端文字列をMind文字列に変換するのは簡単です。

　＜Cの文字列アドレス＞を　Ｍｉｎｄ文字列に変換

によってMind形式の文字列が得られます。何をやっているかと言うと、Cの文字列アドレス(32bit整数)に対し、非整数領域に文字列長さをパックし、合計64bitのMind形式の文字列にします。こちらは変換用のバッファは不要なので楽です。
ループメニュー問題を解いていく1

https://paiza.jp/works/mondai/loop_problems/loop_problems__print_num_step1

python
```py
for i in range(10):
    print(i+1)
```
PHPは仕方ないけど行数多くなってしまうな

```php
<?php
    for ($i=1; $i<=10; $i++){
        print($i . "\n");
    }
?>
```
じゃ次

https://paiza.jp/works/mondai/loop_problems/loop_problems__print_num_step2

python
```py
for i in range(int(input())):
    print(i+1)
```
PHPだと、pythonのように直接入れ込む、ということはできないようです。
つまり下の`$i<=$N`の部分を`$i<=fgets(STDIN)`のようにはできないようです。
何故か調べてますがなかなかそれらしきものは見つからず。
仕方ないのでこのままにします。汗

```php
<?php
    $N = trim(fgets(STDIN));
    for ($i=1; $i<=$N; $i++){
        print($i . "\n");
    }
?>
```

じゃ次

https://paiza.jp/works/mondai/loop_problems/loop_problems__input_num_step1

python
```py
for i in list(map(int,input().split())):
    print(i)
```
PHP
思った通り、直接やる方法はここでもあまりうまくいかないですね

```php
<?php
    $A = explode(" ",fgets(STDIN));
    foreach ($A as $i){
        print($i . "\n");
    };
?>
```

じゃ次

https://paiza.jp/works/mondai/loop_problems/loop_problems__input_num_step2

python
```py
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
    print(A[i])
```
PHP

```php
<?php
    $N = trim(fgets(STDIN));
    $A = explode(" ",fgets(STDIN));
    for ($i=0; $i<=$N; $i++){
        print($A[$i]."\n");
    }
?>
```
(自己学習用途)nuxt.jsについて

# 目的
・Nuxt.jsの深堀用途
# 参照先
https://nuxt.com/docs/getting-started/introduction

# 概要
A.なるほど、自動化と慣習用途のためか。
Automation and Conventions
Nuxt uses conventions and an opinionated directory structure to automate repetitive tasks and allow developers to focus on pushing features. The configuration file can still customize and override its default behaviors.

# pagesについて

A.なるほどroute 設定を簡単にするためか。

・File-based routing: define routes based on the structure of your pages/ directory. This can make it easier to organize your application and avoid the need for manual route configuration.

# 次回アクション
・例題を考えて実際に試す事
scanfを利用してみよう

# はじめに
#### 今日はscanfの使い方をやっていきましょう。
# scanfとは？
scanfとはC言語のコンソール上で入力を行うための関数です。
```c
#include<stdio.h>
int main(void){
    printf("scanf")
    return 0;
}
```
scanfを利用するには・・・
intを利用します。
# intとは？
int=整数(integer)であります。
int x;のようにint型の変数を宣言します。
int型変数には整数値が入ります。
# つまり・・・
scanfで読み込んだ内容をintの変数に入れることができます。
そのプログラムは
```C
#include<stdio.h>
int main(void){
    //変数はプログラムの最初に宣言しておきましょう
    int x;
    printf("数字を入力します。");
    scanf("%d", &x);
    printf("あなたがえらんだ数字は%dです",x);
    return 0;
}
```
# プログラムについて
scanfで読み込んだものをprintfで表示させるプログラムを作っています。
int（変数は必ずプログラムの最初に宣言しましょう。）
# 質問があるならコメントでお願いします。
##### 日本語はあまり得意ではないのでよろしくお願いします。