OmniAICreator/Qiita-1.07M huggingface dataset:
「令和6年一級建築士試験学科Ⅳ(構造)〔Ｎｏ． 1 〕」断面二次モーメントと断面係数をsympyのPolygonでやってみた。

・タイトルを変更予定です。
・**???section_modulusがでませんでした。??? TypeError...**
・専門家様のアドバイスをいただければ幸いです。
・どなたかAIで実行してほしいです。

# 公式ホームページ
試験問題〔Ｎｏ．１〕と正答肢
https://www.jaeic.or.jp/shiken/1k/1k-mondai.files/1k-2024-1st-gakka4_5.pdf#page=2
https://www.jaeic.or.jp/shiken/1k/1k-mondai.files/1k-2024-1st-gokakukijun.pdf
「学科の試験」< 一級建築士を志す者に対して、...
https://www.jaeic.or.jp/smph/shiken/1k/1k-mondai.html
「学科の試験」< 二級建築士を志す者に対して、...
https://www.jaeic.or.jp/smph/shiken/2k/2k-mondai.html

# 普通に？
勉強中

# sympyのPolygonで
　
https://live.sympy.org/

```python
# 令和6年一級建築士試験学科Ⅳ(構造)〔Ｎｏ． 1 〕
# ver0.1
from sympy import Polygon, symbols
a= symbols('a')
myP = Polygon((-a/2,-a),(-a,-a), (-a,-2*a),( a,-2*a), ( a,-a), ( a/2,-a),
              ( a/2, a),( a, a), ( a, 2*a),(-a, 2*a), (-a, a), (-a/2, a)
             )
print("# I=",myP.second_moment_of_area()[0])
# print("# Z=",myP.section_modulus())
print("# Z=",myP.second_moment_of_area()[0]/(2*a))
# I= 10*a**4
# Z= 5*a**3
```

# MathematicaのPolygonで できませんでした。
? [Element]は、記号の貼り付けが必要です。
```
Integrate[
 y^2, {x, y} \[Element] 
  Polygon[{      {-a/2, -a}, {-a, -a}, {-a, -2*a}, {a, -2*
      a}, {a, -a}, {a/2, -a}, {a/2, a}, {a, a}, {a, 2*a}, {-a, 
     2*a}, {-a, a}, {-a/2, a}
        }]]
```

# 参考
#### sympyのdoc
second_moment_of_area(point=None)

https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Polygon.second_moment_of_area

section_modulus(point=None)

https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Polygon.section_modulus

#### Mathematicaのdoc
＞Integrate[f,{x,y,…}∈reg]　幾何領域 reg 内で積分する．

https://reference.wolfram.com/language/ref/Integrate.html?view=all

https://reference.wolfram.com/language/ref/Polygon.html

#### Youtube
「令和6年学科構造」　構造力学問題No1-No6　解説　一級建築士試験　構造力学対策講座　
やまもと構造塾+kakeno塾 様

https://youtu.be/DKm2Mjg5xmc

#### Qiita

https://qiita.com/mrrclb48z/items/66cbc2ec2e5c1174c7d9

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

https://qiita.com/mrrclb48z/items/893cb0967e4ddb2945f7
SmartColorPickerとは？



# 1. SmartColorPickerとは？
SmartColorPickerは、UIコンポーネントとして利用できる色選択ツールで、色相（Hue）、彩度（Saturation）、明度（Brightness）などのパラメータを調整して、ユーザーが自由に色を選べるようにするものです。様々なライブラリやフレームワークで利用可能なカラーピッカーの一種で、使いやすいUIと広範な色の選択肢を提供します。

代表的な機能：
色相、彩度、明度の調整：ユーザーはこれらのパラメータを調整して、正確な色を選べます。
透明度の選択：透過率を調整できるカラーピッカーも存在します。
リアルタイムプレビュー：選択した色をリアルタイムでプレビューしながら確認できます。

# 2. なぜSmartColorPickerを使うべきか？
SmartColorPickerを導入することで、以下のようなメリットがあります。

2.1 ユーザビリティの向上
ユーザーが簡単に色を選択できるようになるため、Webアプリケーションやデザインツールの使い勝手が向上します。色選びは多くのプロジェクトで重要な部分を占めるため、視覚的に優れたカラーピッカーを導入することはUXの向上に繋がります。

2.2 柔軟なカスタマイズ
多くのカラーピッカーライブラリは、カスタマイズが可能です。テーマに合わせた配色パレットの提供や、必要な機能だけを表示することで、ユーザーが必要な色を簡単に選べるようにカスタマイズできます。

2.3 簡単なインテグレーション
カラーピッカーライブラリは、JavaScriptやReact、Vue.jsなど、様々なフレームワークと簡単に統合できます。これにより、既存のプロジェクトに簡単にカラーピッカーを組み込むことができます。

# 3. SmartColorPickerの導入方法
SmartColorPickerの導入は非常に簡単で、既存のプロジェクトに追加するだけで使用できます。ここでは、代表的なカラーピッカーライブラリの一つ「react-color」を使用した導入手順を説明します。

3.1 Reactプロジェクトにおける導入
1. ライブラリのインストール
まず、react-colorというカラーピッカーライブラリをインストールします。

```bash
npm install react-color
```

2. コンポーネントに追加
次に、インポートしてカラーピッカーコンポーネントを作成します。

```jsx
import React, { useState } from 'react';
import { SketchPicker } from 'react-color';

function ColorPickerExample() {
  const [color, setColor] = useState('#fff');

  const handleChangeComplete = (newColor) => {
    setColor(newColor.hex);
  };

  return (
    <div>
      <h2>Selected Color: {color}</h2>
      <SketchPicker
        color={color}
        onChangeComplete={handleChangeComplete}
      />
    </div>
  );
}

export default ColorPickerExample;
```


3. 表示して確認
コンポーネントをレンダリングすると、SketchPickerが表示され、ユーザーはリアルタイムに色を選択できます。選択した色はcolorという状態に保存され、選んだ色を他のUI要素に適用することも簡単です。


# 4. カスタマイズと拡張
SmartColorPicker（もしくはreact-colorのようなライブラリ）は、多くのカスタマイズオプションを提供しており、アプリケーションに最適化されたピッカーを作成できます。

4.1 プリセットカラーの追加
ユーザーに色のプリセット（例えばブランドカラー）を提供したい場合は、プリセットカラーを定義できます。

```jsx
<SketchPicker
  color={color}
  onChangeComplete={handleChangeComplete}
  presetColors={['#D0021B', '#F5A623', '#50E3C2', '#4A90E2', '#B8E986']}
/>
```

4.2 サイズやデザインの調整
カスタムCSSを使用して、カラーピッカーのサイズや表示方法を調整することが可能です。例えば、テーマに応じたデザインにするために、スタイルを追加して外観を変更できます。

# 5. SmartColorPickerの応用
SmartColorPickerは、次のような応用例に利用できます。

5.1 テーマ選択機能
アプリケーション内でテーマカラーをユーザーに選ばせることで、カスタマイズ性を向上させることができます。選択したテーマカラーは、アプリ全体に反映されます。

5.2 グラフィックデザインツール
デザイナー向けのツールに統合することで、画像やデザインの色を直感的に変更できるようにすることができます。

5.3 ダッシュボードでのデータビジュアライゼーション
データを可視化する際、カスタマイズ可能なカラーピッカーを使って、ユーザーが好みの色でチャートやグラフを表示できるようにします。


今回はsmartpickerについて記事にしました。
毎日更新していますので、@y-t0910をフォローしていただけると嬉しいです。
IBM Cloudにログインせずにサポートケースを起票する

<h1> はじめに </h1>

IBM Cloudではサポートチームとのやりとりを行うときにサポート・ケースという文書を使ってやりとりします。このサポートケースの操作はIBM CloudのGUIコンソールにログインし、コンソール内のサポート・センターからアクセスし、起票、閲覧や更新などを行います。
アカウントの開設ができない場合など、IBM Cloudにログインできないような問題があると、一般的な方法ではサポート・ケースを起票できません。実はサポートケースを起票するためのページが用意されているので、そのアクセス方法と使い方をご紹介します。

<h1> サポートケースを起票するためのシステムへのアクセス </h1>

IBM Cloud Docs内の[サポートケースの作成](https://cloud.ibm.com/docs/get-support?topic=get-support-open-case&locale=ja&interface=ui)ページからアクセスできます。

ヒントのところにある「アカウント、ログイン、または請求要求の作成 (Create an Account, Login or Billing Request)」というリンクをクリックすると、システムにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/856144a7-995d-8d96-243a-4cfd1c5205c0.png)

以下のようなページが表示されます。
IBM Cloud Docsにアクセスできない可能性もあるので、URLも記しておきます。
https://watson.service-now.com/x_ibmwc_open_case_app.do#!/create

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/5cafba14-904d-3161-f9ac-a09746467ad3.png)


<h1> 入力すべき内容 </h1>
各フィールドに英語で問い合わせ内容を記入してください。一つのサポート・ケースでは一つの質問・依頼のみを記載します。また以下のフィールドには個人情報やパスワードやAPI KEYをはじめとする機密度が高い情報は含めないでください。

| フィールド | 記入すべき内容 |
|:-------------------------|:-------------|
|IBMid or e-mail address <b>(必須)</b>| お客様のE-mailアドレスを記入ください |
|Invoice number (任意)|請求にかかるお問い合わせの場合、わかるようならIBM CloudのInvoice番号もしくは請求番号を記入ください|
|Select a Service (任意)|<div>問題が発生しているサービスを特定できる場合にはリストから選択ください。</div><div>クレジットカードの登録やサブスクリプションコードの適用に失敗する場合には `Account - upgrade`を選択ください </div><div>選択すべき項目がよくわからない場合には `IBM Cloud` を選択しましょう。</div>|
|Resource Name (任意)|IBM Cloud上のリソースを特定できるインスタンス名などが分かる場合には記入ください|
|Problem Summary <b>(必須)</b>|<div>問題を簡潔に短文で表現します</div>|
|Problem Description <b>(必須)</b>|<div>質問や依頼の内容を具体的に記載します。</div><div>質問の場合には背景情報を含め、ご依頼内容や質問を記載ください。</div><div>英語が苦手という方は機械翻訳などを使っていただいても構わないません。機械翻訳は主語をはっきり書くと誤訳が少なくなると思います。</div><div>問題が発生しているアカウントについて情報が分かる場合にはここにアカウント番号等を含めてください。</div>|
|Include an Attachment (任意)| スクリーンショットなど状況の説明に役立つ資料がある場合には「Add files」ボタンをクリックしてファイルを追加します。1つのファイルの最大サイズは25MBです。|
|Add additional email addresses to receive notifications on this case (任意)|以降のE-mailでのやりとりに関する追加のE-mailアドレスがあればここに記載します。|

すべて記入したら「Submit」ボタンをクリックします。
システム上で「CS」で始まるサポートケースの番号が採番されます。


:::note warn
この方法ではサポートケースの優先度を設定することができません。
優先順位が低い優先度4のケースと同様の扱いになってしまうので、有償サポートをご契約されている場合は、可能な限りIBM Cloudにログインし、サポートケースを起票いただくほうが、早く問題・依頼を解決できます。
:::

<h1> さいごに </h1>

以降はメールでのIBM Cloudサポートチームとのやり取りとなります。
お手数をおかけしますが、メールでのやりとりも日本語ではなく英語でお願いいたします。
皆様にとって有用かつ一般化できそうなトピックが見つかれば、この記事に追記するもしくは別記事を作成したいと思います。

<h1> 参考文献 </h1>

[IBM Cloud Docs サポートケースの作成](https://cloud.ibm.com/docs/get-support?topic=get-support-open-case&locale=ja&interface=ui)
人工知能とは

# 目次
[人工知能はいつ提唱されたのか](#人工知能とは何か)
[人工知能の大まかな分類について](#人工知能の大まかな分類)
[人工知能とロボットの違い](#人工知能とロボットの違い)
[AIのブームと冬の時代](#AIのブームと冬の時代)


# 人工知能とは何か
- **1956年**に**ダートマス会議**で「人工知能(Artificial Intelligence)」という言葉が生まれた
    ※「ダートマス会議に行くころ(1956)だ」で覚えられます
- 人工知能は「推論・認識・判断」など人間と同じ知的な処理能力を持つ機械(情報処理システム)と呼ばれている
    -> 「知識」や「知能」の定義がない

# 人工知能の大まかな分類
まず、「**制御工学**」と「**人工知能**」の違いについて...
- 制御工学
    - すべての振る舞いがあらかじめ決められているもの
- 人工知能
    - 周囲の状況(入力)によって自動的にふるまい(出力)を変えるもの


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2483440/d9c5c816-0f85-19e8-0f69-3372ffd77467.png)

#### 上図のように、人工知能は大きく3つに分けられる
<details><summary>レベル1[制御工学]:シンプルな制御プログラム</summary>
    <ul>
    <li>エアコン</li>
    <li>洗濯機</li>
    <li>掃除機</li>
    <li>etc...</li>
    </ul>
</details>
-> すべての振る舞いがあらかじめ決められているもの

<details><summary>レベル2[人工知能]:古典的な人工知能</summary>
    <ul>
    <li>掃除ロボット</li>
    <li>診断プログラム</li>
    <li>etc...</li>
    </ul>
</details>
-> 探索・推論・知識データを利用することで、状況に応じて極めて複雑な振る舞いをするもの

<details><summary>レベル3[機械学習]:機械学習を取り入れた人工知能</summary>
    <ul>
    <li>検索エンジン</li>
    <li>交通渋滞予測</li>
    <li>不良品検知</li>
    <li>etc...</li>
    </ul>
</details>
-> 非常に多くのサンプルデータをもとに入力と出力の関係を学習したもの

<details><summary>レベル4[深層学習]:ディープラーニングを取り入れた人工知能</summary>
    <ul>
    <li>画像認識</li>
    <li>音声認識</li>
    <li>翻訳システム</li>
    <li>CNN, RNN, Transformer</li>
    <li>etc...</li>
    </ul>
</details>
-> 特徴量を自動的に学習するサービスや製品

# 人工知能とロボットの違い
- ロボットに**脳**がついたのがAI
- 人工知能の研究とは、『**考える(知的な処理能力)**』という「目に見えないもの」を中心に扱う学問 
-> だから培養した人の脳組織を使ってコンピュータを作ろうとする人だっています

https://gigazine.net/news/20231212-brainoware-brain-computer/

# AIのブームと冬の時代
AIの研究は1950年代から続いていますが、ブームと冬の時代が交互に訪れていました。
<img width="400" alt="boom_img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2483440/811dca70-2b2b-411d-ec1a-e4155fbfe6f1.png">

## 第1次AIブーム：「推論・探索の時代」
- 1950年代後半～1960年代
- コンピュータによる「推論」や「探索」が可能となり特定の問題に対して解を提示できるようになったことがブームの要因！
<details><summary>詳細</summary>
      東西冷戦下のアメリカでは、
      特に英語ーロシア語の機械翻訳が注目された。
      しかし、迷路や数学の定理の証明のような
      簡単な問題(「トイ・プロブレム(おもちゃの問題)」は解けても、
      複雑な現実の問題は解けないことが明らかになり、AI冬の時代を迎える...
</details>

## 第2次AIブーム: 「知識の時代」
- 1980年代
- データベースに大領の専門知識をため込んだエキスパートシステムと呼ばれる実用的なシステムの増加がブームの要因！
<details><summary>詳細</summary>
          データベースに大量の専門知識を溜め込んだ
          エキスパートシステムと呼ばれる実用的なシステムがたくさん作られた。
          日本では、政府によって「第五世代コンピュータ」
          と名付けられた大型プロジェクトが推進された。
          しかし、知識を蓄積・管理することの大変さが明らかになり、AI冬の時代を迎える。
</details>

## 第3次AIブーム: 「機械学習と特徴表現学習の時代」
- 2010年代
- ビッグデータと呼ばれる大量のデータを用いて人工知能自ら学習を行う手法の登場がブームの要因！
<details><summary>詳細</summary>
          ビッグデータと呼ばれる大量のデータを用いることで、
          人工知能が自ら知識を獲得する機械学習が実用化された。
          また、知識を定義する要素(特徴量)を人工知能自ら習得する
          ディープラーニング(深層学習)が登場したことが、ブームの背景にある。
          ディープラーニングを用いたチーム(AlexNetのCNN)が
          画像認識競技(ILSVRC 2012)で圧勝したことや
          人間の碁のチャンピオンにディープラーニングを用いた人工知能である
          AlphaGoが優勝するなど象徴的な出来事が重なり、
          また、人間を超える超知性が誕生する(シンギュラリティー)
          可能性に対する懸念などが広まったことで、
          期待値がさらに高くなっている。
</details>
【AWS】EC2インスタンス上にWebサーバ（Apache）構築やってみた

## 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/9f794dc1-b4c5-f17c-11c6-2fcd03b4f3fa.png)

## 必要なAWSリソース
・VPC　×　１　（ ap-northeast-1：東京リージョン）
・パブリックサブネット　×　１
・EC2インスタンス　×　１
・インターネットゲートウェイ　×　１

## 到達目標
　自PCからEC2（Webサーバ）へHTTPアクセスを実施し、"Hello World"を表示できること。

## 構築手順
　*今回は、AWSリソースの作成について説明を省略しますので、確認したい方は、こちらを参考にしてください。
 ![AWSコンソールを使用した構築手順１－１](https://qiita.com/Hiro_tech/items/7b63e3f7899e75d9845f)

 １．TeraTermにてEC2へのsshログイン
　➀「ユーザ名」入力　→　➁「RSA/DSA/ECDSA/ED25519鍵を使う」を選択　→　➂「...」を押下し、AWSコンソールからダウンロードしたkeyファイルを選択　→　➃「OK」押下
  
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/9459f36c-cc38-0a4a-e02b-e8fcb9e7c76b.png)

 
 ２．APATCHインストールと起動
　　下記コマンドを順に実行
``` 
sudo yum install httpd 
```
  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/3d68f0c2-4137-9dce-4f81-0572534ee251.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/b43102c2-36dd-b79a-d941-39ccbe24b323.png)

```
 sudo yum list installed | grep http*
 ```
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/9533c48b-41db-ebad-87f2-89384b8f5ff3.png)

```
 sudo httpd -v
```
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/7e118082-2c7b-5d19-310b-1bebb3e8f315.png)

```
sudo systemctl status httpd.service
```
```
sudo systemctl start httpd.service
```
```
sudo systemctl status httpd.service
```

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/182d35b4-2ad6-87a3-0397-9a2a8548845f.png)

```
sudo echo "hello world" > /var/www/html/index.html
```
 
３．EC2のセキュリティグループのインバウンドのHTTP許可設定
　➀「インバウンドのルールを編集」　→　➁「ルールを追加」　→　➂「HTTP」を選択
 　→　➃「0.0.0.0/0」を選択　→　➄「ルールを保存」を押下
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/8877602a-14a2-d7cd-7b7f-67e88558b5ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/ec908f5e-3428-53ce-233e-0fbaab10f1f7.png)

４．自PCのブラウザからEC2へHTTPアクセスを試す。
```
 http://（EC2のパブリックIPアドレスもしくはEIP）/
 ```

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/819d6627-599c-81e0-53c4-96c77af229a4.png)

５．作業完了( 一一)

## 構築してみての感想
　今回は、AWS上でWebサーバを構築してみましたが、virtualBoxに比べると構築の手間が少し省ける印象でした。（firewallコマンドやSELinuxの設定変更がなかったため）
もし、 virtualBoxでの構築も需要がありましたら、投稿したいと思いますので、ぜひ皆さんのコメントをお待ちしております。
Flutterで全角ファイルが取得できない 〜ドは2種類あるという話〜

# はじめに
今回は、Flutterで開発をしていた時に、なぜか日本語の画像ファイルが取得できなかったバグについて紹介します。最初はFlutter側の問題かと思いましたが、実は、mac側に問題がありました。そのため、「Flutter 全角ファイル 取得できない」など調べても、一生答えが出ずに困っていました。同じ悩みを抱えている方の手助けになればと思います。

# 問題
Flutterで、Assets中にあるファイル名が全角の画像ファイルが取得できない。

# 解決
コード側とファイル側の名前を合わせる。具体的には、濁点系のファイル名について、「**ファイル側の文字をコピペ→コード側にペースト**」が安全。

# 原因
macには「ド」が2種類あるため。

```plaintext
【コード側】
ド：E3 83 89

【ファイル側】
ト゛：E3 83 88 E3 82 99
```

正確には、ドだけではなく、濁点が分離するタイプ/しないタイプの2種類がいます。

Gitの差分を見ると、ドの箇所で差分が確認できます。
「イズナ」「バニーガール」とかもダメでした。

![2種類のド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/64d7a93d-fbcd-04aa-6cfc-71f6e86385af.png)

# まとめ
いかがだったでしょうか。今回はFlutterで起きた問題と、その原因についてを紹介しました。
このように、フロント系の紹介から、Unity, AWS, 量子コンピューティングなど、幅広いジャンルについて取り扱っております。お役に立てましたら、いいね, フォローなどよろしくお願いします！
ESP32: MicroPython で SSID をスキャン (ampy で書き込む）

こちらのプログラムを改造して、ampy で書き込みました。
[ESP32: MicroPython で SSID をスキャン](https://qiita.com/ekzemplaro/items/6392b0e77fa8cad9593a)

## プログラム

```py:main.py
import network
import utime

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

while True:
	aplist = wlan.scan()
	llx = len(aplist)
	print(llx)
	for it in range(llx):
	    print(aplist[it][0].decode())
	utime.sleep(2)
 ```

 ## 書き込み

ボードは実行モードで書き込みます。
　(MicroPython が実行している状態)


 ```bash
 ampy --port /dev/ttyUSB0 put main.py
 ```

 ## 実行結果

 ```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
17
TP-Link_E2EE

rs500m-e1eaf5-1
rs500m-e1eaf5-2
Buffalo-G-C600-WPA3

DIRECT-Gb-EPSON-EW-M754T Series
Buffalo-G-C600
Extender-G-1AA0
Extender-G-1AA0-WPA3
SGP200W-7CA8-bg
Buffalo-G-37E8-2
```
フルリモートで病んだ話

# 自己紹介
・文系出身
・大人数だと地蔵になり、少人数だと喋るタイプの人間

・2024年6月入社
・人生初フルリモート
・広報兼未経験エンジニアとして採用をもらう




# 病み期突入

入社当初は、はじめてのフルリモートでドキドキしていました。
が、実際は入社してから1ヶ月半くらいひたすらに病んでいました。

<img width="200" alt="病む.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812430/d0a6e07a-af44-c788-5dd7-69b6e0118cc0.png">


## 理由

### ①知識不足からくるネガティブ

未経験の私がすぐに参加出来る案件があるはずもなく、指定された教材を勉強していました。
わからないことを聞く【質問チャンネル】をslackで作ってもらいましたが、

**「初歩的な質問だったら恥ずかしい」** **「誰からも返信がなかったらどうしよう」**
**「忙しいのに質問して申し訳ない」** **「わからないことを文章にするのが難しい」**

などといったことを考えてしまい、自分の存在＝迷惑 とネガティブになっていました。


### ②コミュニケーション不足

週に１回行われる社内会議でしか発言する機会がなく、①に書いたような理由もあり、
それ以外は基本的に誰とも会話せずに毎日過ごしていました。


### ③運動不足

前職では、毎日歩いて出社していました。それも片道40分ほど・・。
フルリモートになってから、運動どころか日中にほとんど家から出なくなりました。
そのせいで日光を浴びることもなく、完全にセロトニン不足でした。

<img width="200" alt="混乱.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812430/a3548792-69ea-23a0-594d-af1b65bb5e08.png">



# 病み気終了

１ヶ月半に及ぶ病み期は突然終了しました。
その理由は、**案件に参加することになったから** です。

それまでほぼ会話０だったのが、多い時で週４ほど話すようになり
仕事のこと以外に、雑談や近況など話せるようになったことで病まなくなりました。

１人でも気軽に話せる上司がいるとフルリモートでもこんなに働きやすくなるんだ、と実感しました。

<img width="200" alt="スッキリ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812430/7f67ce8f-107c-63a0-18f0-60fdef3d146c.png">



# 自分に足りなかったこと

病み期の自分と今の自分を比べると、相変わらず知識は１人前には程遠いですが
上記の理由で考えると、足りなかったのは圧倒的に **コニュニケーション** です。

未経験で入社しているので、わからないことはあって当たり前ですが
そこで縮こまって誰にも聞けなかったことが反省点です。

大切なのは、**自分から積極的に会話をし１人でも話せる人を作る** ことです。

今入社したての頃に戻るなら、最低でも週に１回誰かと話す機会を設けてください
とお願いしていると思います。多分(笑)

ちなみに運動不足もジム通い＆朝の10分ほどの散歩で解消されました。
夜も早く寝るようにしたので、徹夜していた時より特に午前中の集中度が上がった気がします。



# 終わりに

今は会社の取り組みで、定期的に1on1が実施されたり
会議の時間を使って普段話す機会がない人と雑談する場が設けられています。
（これがすごく良いです）

~~前職では忙しくて誰とも話したくない時でも話しかけられて、困っていましたが笑、~~
リモートは孤独との戦いになります。
普段会わないからこそのコミュニケーションの取り方を今後も模索していきたいと思います。

最後まで見てくださった方、ありがとうございました😊

<img width="300" alt="enjin_people.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812430/3ee05381-f514-4b69-8908-900a8b443767.png">
好きなエディタを使いたいじゃないですか。

# はじめに
新しいプロジェクトを始めるにあたって、他社と協業することになったのですが、

「うちは、開発者が好きなエディタ使ってます」

という話が出てきました。
いろんな開発者がいるからコードの品質を一定にするためにも、
少なくともソースコードのフォーマットは揃えたいですよね。
だからエディタとかも共通のほうがよくないですか？
そうすると

「レビューで指摘します」

と・・・、レビューでそんな本質的なことじゃない部分に、力を割きたくないので、
じゃぁどうやったらフォーマットをそろえられるかな？と考えたのがきっかけで記事にしてみました。

# 環境
Windows11
Eclipse（最新）
VSCode（最新）
Gradle 8.8
spotless（Gradle用のプラグイン）

Prettierもありかなとは思ったのですが、
どうもEclipse上で動かす良いプラグインが見つからず、
Eclipseのフォーマット設定を、VSCodeおよび、Gradleから実行する方向で考えました。

# 各種設定
## Eclipseでの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/bc69b080-e6b6-a209-102d-baa1bf40caea.png)

フォーマッターの設定を、新規から作成する。
その後、編集にてプロジェクトで利用するフォーマットの設定を行ってください。
最後に、編集画面から、エクスポートボタンを押下し、以下のファイル名で保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/05fff1f5-5c3c-90ac-99de-0dce8f37db9d.png)

```
config/formatter.xml
```

## VSCodeでの設定

./vscode/settings.json に、以下の記述を追記してください。
ただ、インデントスペースの数を設定しても、4以外には設定できませんでした。
おそらく適用されるものと、適用されないものがあるのだろうと推測されますので、実際に試してみてください。

```json
{
    "editor.detectIndentation": false,
    "[java]": {
        "editor.defaultFormatter": "redhat.java"
    },
    "java.format.settings.url": "./config/formatter.xml",
    "java.format.settings.profile": "MyProject"
}
```


## Gradleでの設定
build.gradleを以下の通りに編集します。

まずはspotlessを使えるようにプラグインを追加
```groovy
plugins {
	id 'war'
	id 'com.diffplug.spotless' version '6.25.0'
}
```

次に、spotlessの設定を行います。Eclipseのフォーマット設定を読み込むようにします。
```groovy
spotless {
    java {
        // Eclipseのフォーマッタ設定ファイルを指定
        eclipse().configFile("config/formatter.xml")  // 相対パスでEclipseの設定ファイルを指定
    }
}
```

ここまでできたらあとは実行するだけです。
フォーマットを実行します。
```bash
./gradlew spotlessApply
```

フォーマットが設定に準拠しているかをチェックします。
```bash
./gradlew spotlessCheck
```

# 最後に
いろいろと方法を考えながら時間がかかりましたが実際に試してみたところ
1時間程度でここまでできました。
Gradleで出来るので、もはやエディタはなんでもいいですね。

おそらくは、制約とかパターンによってはうまくフォーマットできないなど
ありそうな気もしますが、発生したとき考えることにします。
Delft 3Dの導入

# Delft 3Dとは
Delft3DはオランダのDeltares社の開発した、多様な水環境モデリングを行うことのできるオープンソースソフトウェア。

# 環境
Windows 11 Home/Pro

# 1. Delft3Dのダウンロード
公式サイトに登録してダウンロードできる．(要ユーザー登録)

# 2. 必要なソフトウェアのダウンロードとインストール
- Anaconda Python
    - 最新版で普通にインストールでOK．
- Visual Studio 2019
    - 2022は不可，2019でも新しいバージョンだと動かない．
    - 16.11.10なら動く．
    - Visual Studio 2019の古いバージョンは[こちらのリンク](https://learn.microsoft.com/en-us/visualstudio/releases/2019/history)からダウンロード可能．
    - インストーラを開いたら，「C++によるデスクトップ開発」にチェックを入れる．
    - 右側の「インストールの詳細」で「最新のv142ビルドツール用C++ MFC」「v142ビルドツール用C++/CLIサポート」「v142ビルドツール用C++モジュール」にチェックし，インストール．
- Intel oneAPI Base Toolkit
    - 2021である必要がある．
    - インストーラを開き，カスタムインストールを選択．
    - 「Intel Distribution for GDB」と「Intel oneAPI Math Kernel Library」にチェックし，残りはチェックを外す．
![basekit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842281/3babdf11-06b4-ed42-2f64-23bcb9ab59ff.png)
    - 右矢印を押して進み，インストールを実行．

**以下のIntelのインストーラは最新版のWindows 11では動作しないようです（2025/1/27追記）**
- Intel oneAPI HPC Toolkit
    - 2021である必要がある．
    - インストーラを開き，カスタムインストールを選択．
![hpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842281/fe861db9-5220-528b-b1aa-98f0b52a0fe6.png)
    - 「Intel MPI Library」「Intel Fortran Compiler (Beta) & Intel Fortran Compiler Classic」「Intel oneAPI DPC++/C++ Compiler & Intel C++ Compiler Classic」をチェックし，残りはチェックを外す．
    - 右矢印を押して進み，インストールを実行．
- Delft3D-4 GUI
    - Delft公式のGUI
    - ダウンロードし，ファイルを展開する．
    - Install-Shield.exe を実行．
    - Install Licence Manager をクリック．
    - ダウンロードしたライセンスファイル（.lic）を選択しインストールを実行．
    - Install-Shieldのトップ画面でInsatll Delft3D をクリックし，手順に従ってインストールを実行．

# 3. Visual Studion ソリューションの準備
- ダウンロードしたDelft3Dを解凍し，ドキュメントなどの場所に保存し，「SNL-Delft3D-CEC」というわかりやすい名称に変更する．
- インストール用のPythonプログラムprepare_sln_auto.pyを[このリンク](https://gist.githubusercontent.com/H0R5E/162ffb929d946e9ccf1c9202e30c9b92/raw/c8ca5f3ed6d02746977af9d5b4683b93714b0eb3/prepare_sln_auto.py)からダウンロードする．
- 右クリックで名前を付けて保存を選択し，SNL-Delft3D-CECの下のsrcフォルダに保存する．
- 次に，Anaconda Powershell Promptを管理者で実行する．
- 先ほどのsrcフォルダに移動し，以下を実行する
```
python prepare_sln_auto.py
```
- 正常に実行できれば，以下が表示される
```
Visual Studio  Version : 2019
.Net Framework Version : v4.6.1
Intel oneAPI Version : 2021
Solution path :
```
# 4. Visual Studioでのコンパイル
- src内のdelft3d_opn.slnをvisual studioで開く．
- third_party_open/netcdf/netcdff/Header Files/nfconfig.inc を開き，99行目のundefをdefineに変更する．
- ツールバーのプルダウンで，DebugをReleaseに，Win32をx64にそれぞれ変更する．
![undef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842281/a5867cf5-d608-6f8e-d7b9-23c48856ccb2.png)
- ビルド＞ソリューションのビルドを実行．
- 完了したら，src/bin/x64にファイルが生成される．
- それらをフォルダごとすべてコピーし，C:/Program Files/Daltares/Delft3D 4.05.01/x64にペーストする．

# 5. 実行
- デスクトップのショートカットからDelft3Dを実行できる．
- QUICKPLOTを行うためには，MATLABを入れる必要があり，これはInstal-Shields.exeから実行可能．

# 参考資料
https://www.youtube.com/watch?v=Lsk5Kvh_xJo

https://www.youtube.com/watch?v=D_IWxD9QPn8

Guide and helper scripts for compiling Delft3D FM with Visual Studio 2019 and Intel oneAPI [ARCHIVED] · GitHub
https://gist.github.com/H0R5E/162ffb929d946e9ccf1c9202e30c9b92
Instructions for compiling the SNL-Delft3D-CEC version of Delft3D-4 · GitHub
https://gist.github.com/H0R5E/8ea0d262b79cadc2c0973d5fc06334a4
NumPyの np.sum() と np.add.reduce() ってどう使い分けるの？

# `np.sum()` と `np.add.reduce()` を比較してみる

NumPyには、配列の要素を合計するための関数として、よく使われる `np.sum()` のほかに、 `np.add.reduce()` という関数もあります。今回、この2つの関数の違いと使い分けについてどう違うのか？と疑問が浮かんだので記録に残そうと思います！

## `np.sum()` とは？
`np.sum()` は、配列の要素を合計するための関数です。シンプルな加算だけでなく、**特定の軸に沿った合計**や、**部分的な合計**を簡単に行えるのが特徴

```python
# 基本的な使い方

import numpy as np
# 1次元配列の合計
arr = np.array([1, 2, 3, 4])
print(np.sum(arr))  # 出力: 10

# 2次元配列の合計（軸を指定）
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr2, axis=0))  # 出力: [5 7 9]
print(np.sum(arr2, axis=1))  # 出力: [ 6 15]
```

## `np.add.reduce()` とは？
`np.sum()` は、軸（axis）を指定して部分的な合計を計算できるなど、多次元配列に対して柔軟に操作ができる一方、 `np.add.reduce()`は、単純な加算しかできないため、柔軟性では `np.sum()` に劣るらしい...

```python
# 基本的な使い方

# 2次元配列の軸を指定した合計
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr, axis=0))  # 出力: [5 7 9]
```

## 処理速度について
`np.add.reduce()` は、内部的に `ufunc` の `reduce` メソッドを直接使用するため、特に小さな配列や特定の状況で `np.sum()` よりも高速に動作することがあります。実際どのくらい速いの...？とふと疑問が浮かんだので、実際の差分を見てみました！

```python
import numpy as np
import timeit

arr = np.arange(100)

# np.add.reduce の実行時間
reduce_time = timeit.timeit(lambda: np.add.reduce(arr), number=100000)

# np.sum の実行時間
sum_time = timeit.timeit(lambda: np.sum(arr), number=100000)

print(f"np.add.reduce: {reduce_time:.5f}秒")
print(f"np.sum: {sum_time:.5f}秒")
```
結果としてはこんな感じの値が取得できました。
```python
np.add.reduce: 0.11344395799096674秒
np.sum: 0.18717783299507573秒
```
出力結果として、 ```np.add.reduce``` の方がわずかに速いことがわかりました！

## 使い分けのポイント
`np.add.reduce()` 使用した方が早いことを出力結果含めて実感できたわけですが、となると基本的にreduceを使うべきなのか、使用パターンが決まっているのか気になってしまったので、使用用途について着目してみました。

### `np.add.reduce()` 
- 速度が重要な場合：特に小規模な配列や、数値計算での合計を素早く行いたい場面では `np.add.reduce()` を使うことで、わずかながら速度向上が見込める
- シンプルな合計を行いたい場合：多次元配列で特定の軸を指定せずに合計を行う場合など、柔軟性が不要な状況で有効となる
### `np.sum()` 
- 軸を指定して合計を行いたい場合：多次元配列の処理や、データフレームのような構造的なデータの一部を合計する際には `np.sum()` が適しテイル
- 可読性が重要な場合： `np.sum()` はNumPyの合計関数として広く知られており、コードの可読性も高くなる


## まとめ
`np.sum()` と `np.add.reduce()` は、どちらも配列の合計を計算するための便利な関数ですが、それぞれに適した使い方があります。柔軟性や可読性を重視する場合は `np.sum()` を、速度やシンプルな合計処理を求める場合は `np.add.reduce()` を選ぶのが良い。


## おわりに
Pythonに触れ始めてどう使い分ければいいの？とちょっとした疑問から調べるに当たりました。フロント実装している時も何やら似たような処理を行なってくれるメソッドは溢れるほどあるわけで、いつも悩むんですよね〜•••。
少しずつ頭にインプットしながら覚えていけば実務の時のタイパも良くと実感しているので、これからも初歩的な疑問解決についてはドキュメント**にも**残して引き出したくさん作ろうと思います💐
DDT M0602C_112をArduino Megaでとりあえず動かす

<iframe width="560" height="315" src="https://www.youtube.com/embed/TNNTxNhM3Zw?si=jlvXY3nvGF-Qe4Fd" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 0. 接続のようす

#### Arduino側

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915/d0344092-d822-3413-bdd6-561357906e24.png)

#### モーター側

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915/b4109d46-2081-7c86-87fe-da5de25102fc.png)


## 1. 仕様メモ

##### Arduino Mega

VINは、12V(9V~18Vで動作)を繋いでテストしました

##### ケーブル1(2芯): 電源線

| arduino mega | motor |
|:-----------|:------------:|
| GND       | 黒         |
| VIN       | 赤         |

##### ケーブル2(4芯): 信号線

| arduino mega | motor |
|:-----------|:------------:|
| GND       | 茶         |
| RX1       | オレンジ         |
| TX1       | 白         |
| 接続不要       | 黒         |


#### 使用するモーター

https://www.switch-science.com/products/7647

## 2. コード関連

#### ほぼ下記のライブラリをそのまま使っていますが、一部Arduino用に変更を加えています

https://zenn.dev/takex5g/articles/d3ddcc65867a8f

#### ArduinoSTL.hで「multiple definition of `std::nothrow'」が出る

下記、22行目あたりをコメントアウトにする

```:ArduinoSTL/src/new_handler.cpp
// const std::nothrow_t std::nothrow = { };
```

詳しくは下記を参照

https://github.com/mike-matera/ArduinoSTL/issues/84


#### 修正したコード

https://github.com/rin1024/M5_DDTMotor_M15M06

サンプルは`spin_the_motor.ino`のみ更新しています


## 3. その他

#### 下記のStepファイルをベースに、簡易的なアタッチメントを作成

https://github.com/takasumasakazu/DirectDriveTech_test/tree/main/STEPdata
PHP-クラス-オブジェクト定数

# はじめに
PHP・WEB開発を独学中アラフィフ主婦の忘備録です。

## 定数とは
**変数と同様の性質を持っているが、再代入できない値のこと。**
* システム固有の番号など一度定めたら原則として変更しない値を保存します。
* クラス内で定義された定数のことをオブジェクト定数といいます。

### サンプルコード

```PHP
class Item
{
    // const キーワードを用いてオブジェクト定数を定義
    const VAT = 1.2;  // 定数名は全て大文字
                      // 複数の単語はアンダースコア _ で繋ぐ(コンスタントケース または アッパースネークケース)
    public $cost = 200; 

    public function displayCost()
    {
        // クラス内からオブジェクト定数へのアクセス
        // self::オブジェクト定数 
        echo (int)($this->cost * self::VAT), "円\n";
    }
}

// クラス外からオブジェクト定数へのアクセス方法は２つ

// 1. インスタンス生成なしで出力
echo Item::VAT . "\n"; // クラス名::定数名

// 2. インスタンス生成してから出力
$item = new Item();
echo $item::VAT . "\n"; // オブジェクト変数::定数名

$item->displayCost(); // `displayCost()`メソッド(関数)を実行

```

#### 出力結果
```
1.2
1.2
240円
```

定数を使うことによって、消費税の変更が無いのに誤ったプログラムにより値が再代入され、本来表示したい金額よりも高い金額・税率が表示されてしまうという不具合を回避することができます。

*****
## 【疑問点１】オブジェクト定数はなぜ大文字？

### 他のコードとの一貫性
* 定数の名前をすべて大文字にするのは、広く使われている慣習です（PHPに限らず、C、Java、Pythonなどの言語でも同様）。
* 一貫性のあるルールがあれば、他のプログラマや自分自身がコードを見たときに、変数と定数を瞬時に区別できるため、メンテナンス性が向上します。

### 定数と変数の区別がつきやすい
* 定数は再代入できない固定値ですが、変数は変更が可能です。大文字で書くことで「この値は不変である」という意図を明示します。
* 大文字にすることで、定数と他の変数やプロパティを明確に区別できます。
```PHP
const vat = 1.2;  // これも実行できるが...
public $vat = 0.8;  // 変数も似た名前にすると混乱の原因に
```

### 読みやすい命名（複数単語の区切り）
* アッパースネークケース（例: TAX_RATE）では、複数の単語をアンダースコアで区切るため、読みやすくミスが少なくなります。
```PHP
const TAXRATE = 1.2;   // 読みにくい
const TAX_RATE = 1.2;  // 読みやすい
```

### 公式ドキュメントやコミュニティの推奨事項
PHPの公式ドキュメントやコミュニティのスタイルガイドでも、定数名には大文字を使用することが推奨されています。これに従うことで、他の開発者と協調して作業する際に混乱が起きにくくなります。

https://www.php.net/manual/ja/language.constants.php

*****
## 【疑問点２】`$this->cost` と `self::VAT` でアクセス方法が異なるのはなぜ？
同じクラスの中の関数に書かれているのに、`$this->cost` と `self::VAT` ではアクセスの仕方が違うはどうして？

### プロパティと定数の違い
それぞれが持つ性質の違いにより、アクセスの仕方が異なります。

#### プロパティ（$this->cost）の性質とアクセス
* プロパティは、インスタンスごとに異なる値を持つことができます。
* そのため、プロパティにアクセスする際は、`$this` キーワードを使ってそのインスタンス（オブジェクト）自身に紐づけてアクセスします。

```PHP
$this->cost // `$this`は、現在使っているインスタンス自身を指す
```

例えば、2つの `Item` オブジェクトがあれば、それぞれで異なる `cost` を持たせることができます。


```PHP
class Item
{
    const VAT = 1.2;
    public $cost = 200; 

    public function displayCost()
    {
        echo (int)($this->cost * self::VAT), "円\n";
    }
}

// 実行してみよう
$item = new Item();

$item->displayCost(); // $costを指定しないとクラス内で定義した200で計算される

$item->cost = 3000;   // $costに3000を代入
$item->displayCost(); // 3000でメソッド(関数)が実行される

$item->cost = 25000;  // $costに25000を代入
$item->displayCost(); // 25000でメソッド(関数)が実行される
```
##### 出力結果
```PHP
240円
3600円
30000円
```

#### 定数（self::VAT）の性質とアクセス
* 定数は、クラス全体で共通の値を表します。つまり、全てのインスタンスで共有され変更できません。
* 定数にアクセスする際は、`self::` を使ってクラス自身に紐づけます。`self::` は「このクラス自身に定義された定数」を指します。

```PHP
self::VAT
```

定数はインスタンスではなくクラスに属するため、`$this`（インスタンス）ではなく、`self::` を使います。


### アクセスの違い "まとめ"
プロパティと定数の性質の違いが、`$this->` と `self::` の使い分けを生んでいます。

| 項目 | プロパティ | 定数 |
|:-----------:|:------------:|:------------:|
| 所属       | インスタンス  | クラス   |
| アクセス方法  | `$this->プロパティ名`   | 	`self:: 定数名`       |
| 値の変化  | 各インスタンスで異なることが可能  | すべてのインスタンスで共通 |
| 変更  | 可能 | 不可能 |

## オブジェクト定数 ”まとめ”
* オブジェクト定数とはクラス内で定義された定数のこと
* const をつけて定義する
* 変更しない値を保存する
* 定数名は自由につけられるが全て大文字にする
* クラス内からアクセスするには`self::定数名`
* クラス外からアクセスするには`クラス名::定数名`
SAPシステムインストールの後処理【SAP BASIS向け】

■システムログイン

■ユーザ作成SU01
作業用ユーザ、アプリユーザ作成等

■SICK
DBとの接続確認

■SPAM
コンポーネント情報取得

■移送設定
DMYに接続筒

■SMLT
使用言語のインストール

■Slicense
OSSからライセンス取得してインストール。(テンプライセンスはインストールされている)

■STZAC
Timezone
タイムゾーンの確認

■RZ10
OSからプロファイル読込、プロファイル調整

■STRUST
証明書インストール等

■バックボーン対応確認
サポートバックボーン対応状況確認(Snoteダウンロード確認)

■SGEN
wpを増加した上で実行(実行時間は数時間程度)

■SMLG

■RFC宛先（SM59）

■SAPディレクトリ（AL11）

■SAPジョブ管理（SM37）

■外部コマンド（SM69）

■ファイルネーム、ファイルパス（FILE）

■プリンタ設定（SPAD）

■ログオングループ（SMLG）

■RFCサーバグループ（RZ12）

■ジョブサーバグループ（SM61）

■SAP Connect設定、メール関連に使用（SCOT）

■バックアップ取得
AMI取得、DBバックアップ等

■DBログモード変更
overwriteに設定等
Flask + SQLAlchemyで音楽共有SNSを作る - ライブラリのインポート編

## はじめに

この記事では、Flask、SQLAlchemy、その他の関連ライブラリを使用して音楽共有SNSを構築する際の、必要なライブラリとモジュールのインポートについて説明します。

## 必要なライブラリとモジュールのインポート

```python
import os
from datetime import date, datetime, timedelta
from flask import Flask, render_template, request, redirect, url_for, flash, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.utils import secure_filename
from flask_wtf import FlaskForm
from wtforms import StringField, SelectField, SubmitField, URLField
from wtforms.validators import DataRequired, URL, Length
from flask_migrate import Migrate
import requests
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
```

## 各ライブラリとモジュールの説明

### os
- **用途**: ファイルやフォルダを操作するためのモジュール
- **例**: 新しいフォルダの作成、ファイル名の変更など

### datetime
- **用途**: 日付や時間を扱うためのモジュール
- **例**: 現在の日付の取得、日付の計算など

### Flask関連
- **Flask**: Webアプリケーションの基本機能を提供
- **render_template**: HTMLテンプレートの表示
- **request**: ユーザーからのリクエスト処理
- **redirect**: 別のページへのリダイレクト
- **url_for**: URLの生成
- **flash**: ユーザーへのメッセージ表示
- **jsonify**: データをJSON形式に変換

### SQLAlchemy
- **用途**: データベース操作を簡略化するORM
- **例**: データベースの作成、クエリの実行など

### Flask-Login
- **用途**: ユーザー認証機能の管理
- **主要コンポーネント**:
  - LoginManager: ログイン機能の全体管理
  - UserMixin: ユーザーモデルの基本機能提供
  - login_user: ユーザーのログイン
  - login_required: ログインが必要なページの指定
  - logout_user: ユーザーのログアウト
  - current_user: 現在のユーザー情報の取得

### Werkzeug
- **generate_password_hash, check_password_hash**: パスワードのハッシュ化と検証
- **secure_filename**: アップロードされたファイル名の安全性確保

### Flask-WTF と WTForms
- **用途**: Webフォームの作成と検証
- **主要コンポーネント**:
  - FlaskForm: フォームの基本クラス
  - StringField, SelectField, SubmitField, URLField: 各種フォームフィールド
  - DataRequired, URL, Length: フォームのバリデーション

### Flask-Migrate
- **用途**: データベースのマイグレーション管理

### requests
- **用途**: HTTP通信の実行
- **例**: 外部APIからのデータ取得

### APScheduler
- **用途**: バックグラウンドタスクのスケジューリング
- **主要コンポーネント**:
  - BackgroundScheduler: バックグラウンドでのタスク実行
  - CronTrigger: 定期的なタスク実行の設定

## まとめ

これらのライブラリとモジュールを組み合わせることで、機能的で安全な音楽共有SNSを構築することができます。

## 参考リンク
- [Flask公式ドキュメント](https://flask.palletsprojects.com/)
- [SQLAlchemy公式ドキュメント](https://docs.sqlalchemy.org/)
- [Flask-Login公式ドキュメント](https://flask-login.readthedocs.io/)
【MySQL】select * from テーブル名 と書かなくても全カラムを取得する方法

## はじめに
MySQLのリファレンスを読んでいたところ、`select * from テーブル名`と書かなくても、全部のカラムのデータを取得できる方法を見つけた。
この記事ではそのやり方を紹介する。

## この記事の対象者
- `select * from テーブル名`以外のやり方で全部のカラムのデータを取得する方法を知りたい人

## 検証環境
DBFiddleのMySQL8.0を使用する。

https://www.db-fiddle.com/

```
select version();
```
```
8.0.35
```

## 方法

MySQLのv8.0.19で導入された、`table`ステートメントを使う。
他のDBも少し調べてみたが、同じような機能はなく、MySQLの独自拡張と思われる。

```sql
table テーブル名
```

https://dev.mysql.com/doc/refman/8.0/ja/table.html


## 実際に試してみる
### DDL
```sql
create table t1 (
  id int not null primary key,
  name varchar(20)
)
;
  
insert into t1 values
  (1, 'aaa'),
  (2, 'bbb')
;
```

### DML


```sql
table t1;
```

|id|name|
|---|---|
|1|	aaa |
|2|	bbb |

#### `order by`も書ける
```sql
table t1 order by id desc;
```

|id|name|
|---|---|
|2|	bbb |
|1|	aaa |

#### `limit`も書ける
```sql
table t1 order by id desc limit 1;
```

|id|name|
|---|---|
|2|	bbb |

## まとめ
- `table`ステートメントを使えば、`select * from テーブル名`と書かなくても、全カラムのデータを取得可能

リファレンスを見ていると知らない機能がいっぱい出てきます。

## 参考資料

https://dev.mysql.com/doc/refman/8.0/ja/table.html
Firebase Cloud Functions デプロイ時のログを見る

# はじめに
* Firebase Cloud Functionsへデプロイ時に以下、エラーになった際、ログが見たい

# デプロイ時のログが見れるコマンド
* `--debug` オプションをデプロイコマンドに付与してあげる
```plaintext
firebase deploy --only functions:<function_name> --debug
```

https://zenn.dev/nbstsh/scraps/dd0b90a35cf3f8

# おわりに
よくわからないデプロイ時のエラーもこれで解消できるのではないか！
ConvexPolygonShape3Dの体積を求める

4面体に分解して計算するのが単純明快な解決法。

Godotにはドロニー分割法を使って凸形形状を4面体に分割する`Geometry3D.tetrahedralize_delaunay()`という関数が用意されているのでこれを使う。

## コード

```gdscript
static func calc_convex_volume(points: PackedVector3Array) -> float:
	# 4面体を構成する頂点の入力配列内でのインデックスが代入される。
	var tetrahedrons := Geometry3D.tetrahedralize_delaunay(points)
	if tetrahedrons.is_empty(): # 4面体化失敗
		return 0 # お好みでエラーを出したり、NANを返しても良いでしょう。
	
	var volume := 0.0
	for i in tetrahedrons.size():
		if i % 4 != 0:
			continue
		var a := points[tetrahedrons[i]]
		var b := points[tetrahedrons[i + 1]]
		var c := points[tetrahedrons[i + 2]]
		var d := points[tetrahedrons[i + 3]]
		# 頂点から4面体の体積を計算して加算。
		volume += abs((a - d).dot((b - d).cross(c - d))) / 6
	return volume
```

### 使用例

```gdscript
extends ConvexPolygonShape3D

func get_volume() -> float:
	return calc_convex_volume(points)
```

頂点を与えるだけで計算できるので、物理系以外でも使えそう。

## 注意点

`Geometry3D.tetrahedralize_delaunay()`は頂点数が増えると途端に遅くなるので、スタッターを発生させたくない場合はスレッドで計算してキャッシュするなどの工夫が必要になる。
Qiita 始めました！！！！！！！！

初めまして！　rii_125です。（プログラマー初心者）
初投稿なので、見る人が少ないと思いますが、（暇なら）是非見てください。
![IMG_0607.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911357/b245d3c0-fdf9-4c44-bfce-b73904452b86.jpeg)
# 自己紹介
**NAME**:rii_125
**FROM**:非公開
**OLD** :非公開
**DETAILS**:rii_125という名前で[Scratch](https://scratch.mit.edu/users/rii_125/)やってます。
# 使う言語
* Java
* JavaScript
* HTML
* CSS
# プログラム
暇なら是非見てね〜
~~（Paizaとかで実行してるものが多いから大目に…）~~
*VScodeを使います。（PC環境で投稿のみ）
## Javaで制作したもの
ただの作品紹介。。。
**①HelloWorld!!の改造** 
```Java:Main.java
import java.util.*;
//Mainメソッド
public class Main {
  public static void main(String[]args) {
    System.out.println("初めてのJava!!");
    }
}
```
**ー結果ー**
 ```Java:実行
 初めてのJava!!
 ```
------
**②変数を用いたプログラム**
```Java:Main.java
import java.util.*;

public class Main {
  public static void main(String[]args) {
    int i = 125;
    System.out.println("変数iは"+i);
    System.out.println(i+"は上書きができます。");
    System.out.println("変数iを"+i+"から、");
    i = 120;
    System.out.print(i+"にしました");
    }
}
```
**ー結果ー**
```Java:実行
変数iは125
125は上書きができます。
変数iを125から、120にしました。
```
-----
**③配列を用いたプログラム**
``` Java:Main.java
import java.util.*;

public class Main {
  public static void main(String[] args) { 
    //配列の作成（byte型）
    //配列の番号　     0  1  2  3  4
    byte[] power = {20,40,60,80,100};
    System.out.println("配列の数値を表示します。");
    System.out.println("0〜4までの数字を入力してください。");
    byte x = new java.util.Scanner(System.in).nextByte();
    System.out.println("読み込みが完了しました。");
    System.out.println(power[x]);
    
  }
}
```
**ー結果ー**
``` java:実行
配列の数値を表示します。
0〜4までの数字を入力してください。
4
読み込みが完了しました。
100
```
:::note info
4の値は0〜4の間を入力するとそれぞれの値が出る仕組みになってます。
:::
# まとめ
今回は、初投稿でいろんな機能を試しながら投稿しました。:relaxed:
特に、プログラムを書くときの表示を頑張って慣れながら書いて、マジで疲れました:sweat_drops:
何か気になる点があったり、質問があったら是非お願いします:bow_tone1:
【超基礎から解説編】Flaskで音楽共有SNSを作る：ユーザーモデルの設計と実装

## はじめに

音楽共有SNSの核となるユーザーモデルの設計と実装について解説します。データベースの構造、ユーザー情報の管理、そしてフォロー機能の実装方法を、初心者にもわかりやすく説明していきます。

## 目次

1. [ユーザーモデルの基本構造](#1-ユーザーモデルの基本構造)
2. [ユーザー情報のフィールド](#2-ユーザー情報のフィールド)
3. [フォロー関係の実装](#3-フォロー関係の実装)
4. [フォロー機能のメソッド](#4-フォロー機能のメソッド)
5. [まとめ](#まとめ)

## 1. ユーザーモデルの基本構造

```python
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
```

- `UserMixin`: Flask-Loginが提供するクラスで、ログイン機能に必要なメソッドを提供します。
- `db.Model`: SQLAlchemyのモデルクラスを継承し、データベースとの連携を可能にします。
- `id`: 各ユーザーを一意に識別するための番号（主キー）です。

## 2. ユーザー情報のフィールド

```python
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(120), nullable=False)
favorite_band = db.Column(db.String(120))
favorite_genre = db.Column(db.String(50))
icon = db.Column(db.String(120))
```

- `username`: ユーザー名（最大80文字、重複不可、必須）
- `password`: パスワード（最大120文字、必須）。実際には暗号化して保存します。
- `favorite_band`: お気に入りのバンド名（任意）
- `favorite_genre`: 好きな音楽ジャンル（任意）
- `icon`: ユーザーアイコンの画像パス（任意）

これらのフィールドにより、各ユーザーの基本情報と音楽の好みを記録します。

## 3. フォロー関係の実装

```python
followed = db.relationship(
    'User', secondary=followers,
    primaryjoin=(followers.c.follower_id == id),
    secondaryjoin=(followers.c.followed_id == id),
    backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')
```

この複雑に見える部分は、ユーザー間のフォロー関係を管理するための設定です：

- `secondary=followers`: 先ほど定義した中間テーブルを使用
- `primaryjoin`, `secondaryjoin`: フォロワーとフォロー先の関係を定義
- `backref`: 逆方向の関係（フォロワー）を定義
- `lazy='dynamic'`: クエリの最適化のための設定

## 4. フォロー機能のメソッド

```python
def follow(self, user):
    if not self.is_following(user):
        self.followed.append(user)

def unfollow(self, user):
    if self.is_following(user):
        self.followed.remove(user)

def is_following(self, user):
    return self.followed.filter(
        followers.c.followed_id == user.id).count() > 0
```

これらのメソッドにより、フォロー機能を簡単に実装できます：

- `follow`: 指定したユーザーをフォローします。
- `unfollow`: 指定したユーザーのフォローを解除します。
- `is_following`: 指定したユーザーをフォローしているかチェックします。

これらのメソッドを使うことで、ビュー関数内でフォロー操作を簡潔に記述できます。

## まとめ

ユーザーモデルは、音楽共有SNSの中心的な要素です。このモデルを適切に設計することで、ユーザー情報の管理やフォロー機能の実装が容易になります。

今回のモデル設計のポイントは以下の通りです：

1. 基本的なユーザー情報（ユーザー名、パスワードなど）の保存
2. 音楽の好みに関する情報（お気に入りのバンド、ジャンル）の追加
3. フォロー関係の効率的な管理
4. フォロー機能を簡単に使えるメソッドの実装

次回は、このユーザーモデルを使って、実際のビュー関数（ログイン、登録、プロフィール表示など）の実装について解説する予定です。

## 参考リンク

- [SQLAlchemy ORM](https://docs.sqlalchemy.org/en/14/orm/)
- [Flask-Login documentation](https://flask-login.readthedocs.io/)
- [Flask-SQLAlchemy: Declaring Models](https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/)
NeovimでVSCodeみたいにRemoteSSHする方法を見つけた

## プロローグ
vim大好きな自分が，ときたまVScodeを使わざるを得ない時がありました．
それは，サーバー内orコンテナ内のファイルをローカルから直接編集したい時．
vimでもできないかと半年くらい前から思って色々探していましたが見つからず．
でも見つけちゃいました．
その名は[remote-nvim.nvim](https://github.com/amitds1997/remote-nvim.nvim)

## remote-nvimについて
これマジで神です👼
OSはLinux, mac, FreeBSDにサポート対応していて,
ssh, docker-container/image, dev-containerに対応してます．

やってることとしては
- リモート先にneovimをshで自動インストール 
- ローカルのオレオレnvimコンフィグをリモートにプッシュ
- リモートのnvimを起動し，ローカルのnvimと接続
- 実質ローカルからオレオレnvimでリモート先のファイルを操作できる．もちろんさまざまなプラグインをほとんど使えるし，他にインストーしたい依存ツールとかも設定で自動インストできる（自分はlazygitとか入れてる）
- しかも使い終わったらちゃんとクリーンアップして，サーバーの環境を汚さない

## インストール
lazy.nvimでプラグインごとにファイル分割してる場合
```lua
return {
   "amitds1997/remote-nvim.nvim",
   version = "*", -- Pin to GitHub releases
   dependencies = {
       "nvim-lua/plenary.nvim", -- For standard functions
       "MunifTanjim/nui.nvim", -- To build the plugin UI
       "nvim-telescope/telescope.nvim", -- For picking b/w different remote methods
   },
   config = true,
}
```
あとは，githubとか見て各々でconfigのパラメータとか設定していけば使えるようになります．
自分はssh_promptsのEnter passphrase for keyの設定してなくて，ssh接続するときにパスワード入力できひんってなりました． 

```lua
local ssh_config = {
			ssh_binary = "ssh",
			scp_binary = "scp",
			ssh_config_file_paths = { "$HOME/.ssh/config" },
			ssh_prompts = {
				{
					match = "Enter passphrase for key",
					type = "secret", -- パスフレーズはシークレットとして扱う
					value_type = "static", -- 毎回新しいパスフレーズを入力するか
					value = "", -- 初期値
				},
				{
					match = "password:",
					type = "secret",
					value_type = "static",
					value = "",
				},
				{
					match = "continue connecting (yes/no/[fingerprint])?",
					type = "plain",
					value_type = "static",
					value = "",
				},
			},
		}
```

## 使い方
デモ動画がgithubに載っています．
起動はRemoteStartコマンド打って，ssh接続の必要項目などをtelescope上で選択していくだけで簡単にできます．

`:RemoteStart`
リモートインスタンスに接続する。リモートneovimサーバーがすでに実行されている場合、ユーザーはローカルクライアントを起動できる

`:RemoteStop`
Neovimサーバーの実行を停止し、セッションを閉じる

`:RemoteInfo`
現在の Neovim 実行で作成されたセッションに関する情報を取得する．進行状況ビューアーを開く

`:RemoteCleanup`
リモートインスタンスからワークスペースおよびリモートneovimセットアップ全体を削除する．また，リモートリソースの構成をクリーンアップする．

`:RemoteConfigDel`
保存されたセッションレコードから、存在しなくなったリモートインスタンスのレコードを削除する．

`:RemoteLog`
プラグインのログファイルを開く．エラーが出たらここ見れば大体わかる．

`:RemoteInfo`
接続に関する情報などが表示される．
【超基礎から解説編】Flaskで音楽共有SNSを作る：アプリケーションの初期化と設定

## はじめに

FlaskでWebアプリケーションを作る際の最初のステップ、アプリケーションの初期化と設定について解説します。ここでは、音楽共有SNSを例に、各設定の意味と重要性を初心者にもわかりやすく説明していきます。

## 目次

1. [Flaskアプリケーションの作成](#1-flaskアプリケーションの作成)
2. [アプリケーションの設定](#2-アプリケーションの設定)
3. [データベースの初期化](#3-データベースの初期化)
4. [ログイン管理の設定](#4-ログイン管理の設定)
5. [フォロワー関係のテーブル定義](#5-フォロワー関係のテーブル定義)
6. [まとめ](#まとめ)

## 1. Flaskアプリケーションの作成

```python
app = Flask(__name__)
```

この行は、新しいFlaskアプリケーションを作成しています。これは、Webサイトの土台を作る最初のステップです。`__name__`は、現在のPythonモジュールの名前を指す特別な変数です。

## 2. アプリケーションの設定

```python
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///music_sns.db'
app.config['UPLOAD_FOLDER'] = 'static/uploads'
app.config['ALLOWED_EXTENSIONS'] = {'mp3', 'wav', 'ogg'}
```

ここでは、アプリケーションの重要な設定を行っています：

- `SECRET_KEY`: セッションデータの暗号化やCSRF保護に使用される秘密鍵です。実際のプロジェクトでは、この値を環境変数から読み込むなど、安全に管理する必要があります。
- `SQLALCHEMY_DATABASE_URI`: データベースの場所を指定します。ここではSQLiteデータベースを使用しています。
- `UPLOAD_FOLDER`: ユーザーがアップロードした音楽ファイルを保存する場所を指定します。
- `ALLOWED_EXTENSIONS`: アップロードを許可するファイルの拡張子を指定します。

## 3. データベースの初期化

```python
db = SQLAlchemy(app)
migrate = Migrate(app, db)
```

- `SQLAlchemy(app)`：データベース操作を簡単にするためのORM（オブジェクト関係マッピング）を初期化します。
- `Migrate(app, db)`：データベースの構造を変更（マイグレーション）するための機能を初期化します。

## 4. ログイン管理の設定

```python
login_manager = LoginManager(app)
login_manager.login_view = 'login'
```

これらの行は、Flask-Loginを使用してユーザー認証システムを設定しています：

- `LoginManager(app)`：ログイン機能を管理するオブジェクトを作成します。
- `login_manager.login_view = 'login'`：ログインが必要なページにアクセスしようとしたときに、リダイレクトするビュー（この場合は'login'）を指定します。

## 5. フォロワー関係のテーブル定義

```python
followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)
```

これは、ユーザー間のフォロー関係を表す中間テーブルを定義しています。この設定により、多対多のリレーションシップを効率的に管理できます。

- `follower_id`：フォローしているユーザーのID
- `followed_id`：フォローされているユーザーのID

## まとめ

Flaskアプリケーションの初期化と設定は、Webアプリケーション開発の重要な第一歩です。ここで行った設定は、アプリケーションのセキュリティ、データの保存方法、ユーザー認証、そしてSNSの核心的機能であるフォロー関係の管理など、多岐にわたる要素に影響します。

適切な設定を行うことで、安全で機能的なWebアプリケーションの基盤を作ることができます。次回は、これらの設定を基に、実際のユーザーモデルやビュー関数の実装について解説していく予定です。

## 参考リンク

- [Flask Configuration Handling](https://flask.palletsprojects.com/en/2.1.x/config/)
- [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/)
- [Flask-Login](https://flask-login.readthedocs.io/)
- [Flask-Migrate](https://flask-migrate.readthedocs.io/)
DailyBeat技術スタックと選定理由

## ライブラリとフレームワーク

### 1. Flask
**選定理由**:
- 軽量で柔軟性が高く、小規模から中規模のアプリケーションに適している
- 学習曲線が緩やかで、初心者でも比較的容易に習得できる
- 必要な機能を持つ拡張機能が豊富に用意されており、開発効率を高められる
- Pythonベースであるため、開発者にとって親しみやすい言語である

**使用機能**:
- ルーティング（URLと機能の紐付け）
- テンプレートレンダリング（HTMLの生成）
- リクエスト処理
- レスポンス生成

### 2. SQLAlchemy
**選定理由**:
- Pythonで最も広く使われているORMの一つで、信頼性が高い
- データベース操作をPythonオブジェクトとして扱えるため、開発効率が向上する
- 複雑なSQLクエリを書かずに済み、コードの可読性が向上する
- 将来的なデータベースの変更（例：SQLiteからPostgreSQLへ）が容易になる

**使用機能**:
- データベースモデルの定義（User, DailySong）
- データの挿入、更新、削除、取得操作

### 3. Flask-Login
**選定理由**:
- Flaskアプリケーションに簡単にユーザー認証機能を追加できる
- セッション管理やユーザーのログイン状態の追跡が容易になる
- 「ログインが必要」な機能を簡単に実装できる

**使用機能**:
- ユーザーのログイン、ログアウト処理
- 現在のログインユーザーの取得
- ログインが必要なページの保護（@login_required デコレータ）

### 4. WTForms
**選定理由**:
- フォームの作成と検証を簡単に行える
- CSRF保護が組み込まれており、セキュリティ強化が容易
- Flaskとの統合が容易で、Flask-WTFという拡張も利用可能

**使用機能**:
- 楽曲投稿フォーム（DailySongForm）の作成
- メッセージ送信フォーム（MessageForm）の作成
- フォームのバリデーション

### 5. APScheduler
**選定理由**:
- Pythonで定期的なタスクを簡単にスケジュールできる
- 様々なスケジューリング方法（間隔ベース、日付ベース、クーロン式など）をサポートしている
- アプリケーション内で直接スケジューリングを管理できるため、外部のcronなどに依存しない

**使用機能**:
- 毎日の楽曲リセット処理のスケジューリング

## データベースモデル

### 1. User
**説明**: ユーザー情報を格納するモデル
**主な属性**:
- id: ユーザーの一意識別子
- username: ユーザー名
- password: ハッシュ化されたパスワード
- favorite_band: お気に入りのバンド
- favorite_genre: お気に入りの音楽ジャンル
- icon: ユーザーアイコンのファイルパス

**関連する技術**:
- SQLAlchemy: モデルの定義と操作
- Flask-Login: UserMixinを継承してログイン機能を実装

### 2. DailySong
**説明**: 日々の楽曲投稿を格納するモデル
**主な属性**:
- id: 投稿の一意識別子
- user_id: 投稿したユーザーのID（外部キー）
- title: 曲のタイトル
- artist: アーティスト名
- genre: 音楽ジャンル
- music_url: 音楽の共有URL
- date_posted: 投稿日
- is_current: 現在の投稿かどうかを示すフラグ

**関連する技術**:
- SQLAlchemy: モデルの定義と操作

### 3. followers
**説明**: ユーザー間のフォロー関係を表す中間テーブル
**主な属性**:
- follower_id: フォローしているユーザーのID
- followed_id: フォローされているユーザーのID

**関連する技術**:
- SQLAlchemy: 多対多関係の定義

## フォーム

### 1. DailySongForm
**説明**: 日々の楽曲投稿用フォーム
**主な項目**:
- title: 曲のタイトル
- artist: アーティスト名
- genre: 音楽ジャンル（選択式）
- music_url: 音楽の共有URL

**関連する技術**:
- WTForms: フォームの定義とバリデーション

### 2. MessageForm
**説明**: メッセージ送信用フォーム
**主な項目**:
- message: メッセージ本文

**関連する技術**:
- WTForms: フォームの定義とバリデーション

## ルート（エンドポイント）

1. **ログイン**
   - 技術: Flask, Flask-Login
   - 機能: ユーザー認証、セッション管理

2. **登録**
   - 技術: Flask, SQLAlchemy
   - 機能: 新規ユーザーの作成、パスワードのハッシュ化

3. **ログアウト**
   - 技術: Flask-Login
   - 機能: ユーザーセッションの終了

4. **マイページ表示**
   - 技術: Flask, SQLAlchemy, Flask-Login
   - 機能: ユーザー情報と投稿の取得、テンプレートレンダリング

5. **楽曲投稿**
   - 技術: Flask, SQLAlchemy, WTForms
   - 機能: フォーム処理、データベースへの保存

6. **全投稿表示**
   - 技術: Flask, SQLAlchemy
   - 機能: 投稿データの取得とソート、ページネーション

7. **ユーザーフォロー/アンフォロー**
   - 技術: Flask, SQLAlchemy, Flask-Login
   - 機能: フォロー関係の更新

8. **ユーザープロフィール表示**
   - 技術: Flask, SQLAlchemy
   - 機能: ユーザー情報と投稿の取得、テンプレートレンダリング

9. **メッセージ送信**
   - 技術: Flask, SQLAlchemy, WTForms
   - 機能: フォーム処理、メッセージのデータベース保存

この技術スタックにより、DailyBeatは効率的な開発と保守が可能な、機能的な音楽共有SNSアプリケーションとして実現されています。各技術の選択は、開発の容易さ、パフォーマンス、セキュリティ、そして将来の拡張性を考慮して行われています。
【SwiftUI】長文の文字列をTextで表示する際にHangする問題の対処法

## 問題
SwiftUIでの開発で必ず使用する`Text`ですが、非常に長い文字列を表示することはあまり想定されていないようです(T_T)
実際に`NavigationLink`による遷移先に`ScrollView`でラップされた`Text`を用意して、10000文字程度の日本語の文字列を表示する様子をInstrumentsで確認すると、遷移する直前に画面が固まってしまいます。

```swift
    var body: some View {
        NavigationStack {
            NavigationLink(destination: ScrollView{Text("ここに非常に長いテキスト")}) {
                Text("Link")
            }
        }
    }
```

![スクリーンショット 2024-10-16 13.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326888/247c5176-b5c8-2041-4a03-a0465628726f.png)


## 解決策
文字列を改行で区切り、`LazyVStack`を使用して縦に重ねることで、表示パフォーマンスが改善されました。

```swift
import SwiftUI

struct LazyText: View {
    let text: String
    private let lines: [String]

    init(_ text: String) {
        self.text = text
        self.lines = text.components(separatedBy: .newlines)
    }

    var body: some View {
        ScrollView {
            LazyVStack(alignment: .leading, spacing: 0) {
                ForEach(Array(lines.enumerated()), id: \.offset) { _, line in
                    Text(line)
                }
            }
        }
    }
}
```

### 使用例
```swift
 let sampleText = """
        これは長い長いテキストのサンプルです
        複数の行に分かれています。
        1万文字程度表示する場合は
        LazyVStackを使用することで、
        表示パフォーマンスが向上します。
        スクロールも滑らかになります。
        """
        LazyText(sampleText)
            .frame(height: 200)
```