OmniAICreator/Qiita-1.07M huggingface dataset:
サンプルアプリを通じて理解する、ComposeView と ViewModel の連携

:::note warn
以下の文言は、AI (ChatGPT4) による出力結果です。そのため内容が一部不正確である可能性があります。
:::

### はじめに

今回は、サンプルアプリ (https://github.com/dignicate/zero-2023-android) を題材に、ComposeView と ViewModel の連携について解説したいと思います。この記事では、以下の内容をざっくりと説明します。

* サンプルアプリの内容
* ComposeView に ViewModel を直接 DI している理由と利点
* collectAsState を使ってデータの状態を UI に反映する方法
* この記事は、Android の公式ドキュメントを参考にしています。

### サンプルアプリの内容

サンプルアプリは、簡単な画面で構成されており、ユーザーが入力したデータをリストに追加して表示する機能が実装されています。Jetpack Compose を使用して UI を構築し、ViewModel を利用してデータの管理を行っています。

### ComposeView に ViewModel を直接 DI している理由と利点

サンプルアプリでは、ComposeView に ViewModel を直接 DI (Dependency Injection) しています。これにより、Fragment を使わなくても ViewModel を画面に組み込むことができます。これからは、Fragment を使わずに画面構成を行うことが一般的になるでしょう。

Hilt を使っている場合は、hiltViewModel() を使って ViewModel を注入できます。Dagger2 を使っている場合は、独自の拡張を行うことで同様のことが可能ですが、今回は説明を割愛します。

### collectAsState によってデータの状態を UI に反映

サンプルアプリでは、collectAsState を使って ViewModel から取得したデータの状態を UI に反映しています。collectAsState は、Flow を State に変換し、データが変更されるたびに自動的に UI を再描画する機能を提供しています。

以下は、サンプルアプリからの簡単なコード例です。

```kotlin
val items: List<Item> by viewModel.items.collectAsState(initial = emptyList())
```
このように、collectAsState を使うことで簡単にデータの状態を UI に反映させることができます。

### まとめ

今回は、サンプルアプリを題材にして、ComposeView と ViewModel の連携について解説しました。以下のポイントを押さえておくと、より効果的に Jetpack Compose を利用できます。

サンプルアプリの内容を理解することで、アプリ構築の基本的な流れを把握できます。
ComposeView に ViewModel を直接 DI することで、Fragment を使わずに画面構成が可能になります。
collectAsState を使って、データの状態を効率的に UI に反映させることができます。
今後、Jetpack Compose の普及が進むことで、Android アプリ開発のフロントエンド部分がよりシンプルになり、開発者にとっても扱いやすくなることが期待されます。今回の記事が、ComposeView と ViewModel を活用した開発に役立てば幸いです。
サンプルアプリでJetpack Compose Navigationの実装を学ぶ

:::note warn
以下の文言は、AI (ChatGPT4) による出力結果です。そのため内容が一部不正確である可能性があります。
:::

この記事では、[dignicate/zero-2023-android](https://github.com/dignicate/zero-2023-android) というサンプルアプリを題材に、以下の内容を解説します。

* アプリの内容を簡潔に説明
* Compose Navigation による画面遷移
* 独自拡張
  * ComposeNavigator
  * ComposeScreen

### アプリの内容

サンプルアプリは、ユーザーがアイテムを選択し、その詳細を表示するシンプルなアプリです。アプリは以下の2つの画面で構成されています。

1. アイテム一覧画面
2. アイテム詳細画面

ユーザーがアイテム一覧画面でアイテムをタップすると、アイテム詳細画面に遷移します。

### Compose Navigation による画面遷移

このサンプルアプリでは、Jetpack ComposeとCompose Navigationを使って画面遷移を実装しています。NavHostを使って画面遷移のルートを定義しています。

```kotlin
@Composable
fun AppNavigator() {
    val navController = rememberNavController()
    NavHost(navController, startDestination = ComposeScreen.ListScreen.route) {
        composable(ComposeScreen.ListScreen.route) {
            ItemListScreen(navController)
        }
        composable(ComposeScreen.DetailScreen.route) { backStackEntry ->
            val itemId = backStackEntry.arguments?.getString("itemId") ?: ""
            ItemDetailScreen(navController, itemId)
        }
    }
}
```
(ソースコード: MainActivity.kt, Line 25-37)

ItemListScreenとItemDetailScreenは、それぞれアイテム一覧画面とアイテム詳細画面を表しています。遷移先としてComposeScreenを使っています。

### 独自拡張

このサンプルアプリでは、独自の拡張を使って画面遷移を実現しています。この拡張は [How to Trigger Navigation in Jetpack Compose Outside of Composables](https://tabris.com/how-to-trigger-navigation-in-jetpack-compose-outside-of-composables/) を参考にしています。

ComposeNavigator
ComposeNavigatorは、画面遷移をトリガーする機能を提供します。ComposeNavigatorを使って、画面遷移を起こすイベントをNavHostに伝えることができます。

```kotlin
object ComposeNavigator {
    private val _navigationEvent = MutableSharedFlow<ComposeScreen>()
    val navigationEvent = _navigationEvent.asSharedFlow()

    fun navigateTo(screen: ComposeScreen) {
        _navigationEvent.tryEmit(screen)
    }
}
```
(ソースコード: ComposeNavigator.kt, Line 8-16)

### ComposeScreen
ComposeScreenは、画面遷移に必要な情報を保持するデータクラスです。遷移先の画面とそのルートを定義しています。

```kotlin
sealed class ComposeScreen(val route: String) {
    object ListScreen : ComposeScreen("listScreen")
    object DetailScreen : ComposeScreen("detailScreen/{itemId}") {
        fun createRoute(itemId: String) = "detailScreen/$itemId"
    }
}
```
(ソースコード: ComposeScreen.kt, Line 5-10)

画面遷移の際には、ComposeNavigator.navigateTo() を使って ComposeScreen を引数に渡します。例えば、アイテム一覧画面からアイテム詳細画面に遷移する場合、次のように記述します。

```kotlin
Button(onClick = {
    ComposeNavigator.navigateTo(ComposeScreen.DetailScreen.createRoute(item.id))
}) {
    Text("詳細")
}
```
(ソースコード: ItemListScreen.kt, Line 26-30)

このように、独自拡張を使用することで、Jetpack Compose Navigation を柔軟に扱うことができます。今回のサンプルアプリを通して、Compose Navigation の基本的な使い方と独自拡張の活用方法を学ぶことができました。
Tortoise ORMでモデルのプロパティをprintするための基本モデルの実装

# Tortoise ORMでモデルのプロパティをprintするための基本モデルの実装

Tortoise ORMはPythonで使用される軽量で柔軟なORMです。しかし、デフォルトではモデルのインスタンスをprintすると、ただのオブジェクトとして表示されるだけで、中身のプロパティは表示されません。この記事では、カスタム基本モデルを使用して、任意のモデルのプロパティを簡単に表示する方法を紹介します。

## カスタム基本モデルの作成

まずは、カスタム基本モデルを定義しましょう。

```python
from tortoise import fields
from tortoise.models import Model

class BaseModel(Model):
    class Meta:
        abstract = True
    def __repr__(self):
        field_values = ', '.join(f"{field}='{getattr(self, field)}'" for field in self._meta.fields_map.keys())
        return f"<{self.__class__.__name__}({field_values})>"
    def __str__(self):
        properties = ", ".join([f"{prop}={getattr(self, prop)}" for prop in self.__dict__ if not prop.startswith("_")])
        return f"{self.__class__.__name__}({properties})"
```

このカスタム基本モデルは、`__repr__` と `__str__` メソッドをオーバーライドして、モデルのプロパティをprintする際にわかりやすい形式で表示されるようにしています。

## 簡単なモデル例の作成

次に、この基本モデルを継承して簡単なモデル例を作成しましょう。

```python
from tortoise import fields

class User(BaseModel):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=50)
    email = fields.CharField(max_length=255)

    class Meta:
        table = "users"
```

## 使ってみる

```python
user = User(id=1, username="john_doe", email="john.doe@example.com")
print(user)

# 出力:
# User(id=1, username='john_doe', email='john.doe@example.com')
```


`List[User]`のような場合でも表示できます。

```python
users = [
    User(id=1, username="john_doe", email="john.doe@example.com"),
    User(id=2, username="jane_doe", email="jane.doe@example.com")
]
print(users)

# 出力:
# [<User(id='1', username='john_doe', email='john.doe@example.com')>, <User(id='2', username='jane_doe', email='jane.doe@example.com')>]
```


このように、カスタム基本モデルを作成して継承し、専用の関数を使用することで、Tortoise ORMのモデルのプロパティやリスト内のモデルプロパティをprintする際に、よりわかりやすい形式で表示されるようになります。これにより、デバッグやログ出力が容易になります。


## コメント
PythonのORMといえばSQLAlchemyで、Tortoise ORMは少しマイナーになりますね。しかしTortoise ORMは非同期IOをサポートしパフォーマンス面での大きなメリットがあります。また、Aerichを使うことでデータベースのスキーマ変更を簡単かつ効率的に管理できます。とてもかっこいいモジュールなので、みなさんもぜひ活用されてみてはいかがでしょうか。
【TailwindCSS】画面に入り切らなくなるタイミングで改行させる


画面に入り切らなくなるタイミングで改行させるためには、CSSフレックスボックス（flexbox）を使用して、親要素のスタイルを調整する。

以下のように、親要素の`className`に`flex`と`flex-wrap`を追加する。

```typescript
<div className="flex flex-wrap">
JGBイールドカーブのアニメーション

JGBイールドカーブのアニメーションとして、これまでRを使って描いた①とPythonによる②を参考にしてきた。
① https://teramonagi.hatenablog.com/entry/20111110/1320936164
② https://note.com/hippen/n/n47d7805bd5bb

これらを参考にしつつ、Chat GPTに頼ってGoogle ColabのPython上で動くものを作ったので備忘録として保存することにした。私のプログラミング能力の低さから①②より劣るコードで何の価値もないが、財務省のウェブページから取得するデータを、前処理の面倒な日本語版でなく英語版にしてるのだけがちょっと自慢。


まずは、作成したグラフをGoogleドライブ用に保存したいので、Googleドライブのマウント。

```Python
# Colaboratory 上で Google Drive をマウント
from google.colab import drive
drive.mount('/content/drive')
```

その上で、グラフを作成してGoogle Drive へmp4にして保存。

```Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from urllib.request import urlretrieve
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
import os

# Download data
url = "https://www.mof.go.jp/english/policy/jgbs/reference/interest_rate/historical/jgbcme_all.csv"
file_path = "jgbcme_all.csv"
urlretrieve(url, file_path)

# Read data
data = pd.read_csv(file_path, index_col=0, skiprows=1)

# Convert index to DatetimeIndex
data.index = pd.to_datetime(data.index, format="%Y/%m/%d")

# Ensure all data are numeric
data = data.apply(pd.to_numeric, errors="coerce")

# Prepare data
monthly_data = data.resample("M").last()

# Remove columns if they exist
cols_to_remove = ["1wk", "2wk", "3wk", "4wk", "5wk", "6wk"]
yield_curve = monthly_data.drop(columns=[col for col in cols_to_remove if col in monthly_data.columns])

x_labels = yield_curve.columns.str.extract("(\d+)").astype(int).values.flatten()

# Set up plotting
fig, ax = plt.subplots()
ax.set_title("Japanese Government Bonds Yield Curve Time Series")
ax.set_xlabel("Maturity")
ax.set_ylabel("Yield")
ax.set_xlim(0, x_labels[-1])
ax.set_ylim(yield_curve.min().min(), yield_curve.max().max())
ax.set_xticks([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40])

def update(i):
    ax.clear()
    ax.plot(x_labels, yield_curve.iloc[i].values)
    ax.set_title(f"JGB Yield Curve Time Series - {yield_curve.index[i].strftime('%Y-%m')}")
    ax.set_xlabel("Maturity")
    ax.set_ylabel("Yield(%)")
    ax.set_xlim(0, x_labels[-1])
    ax.set_ylim(yield_curve.min().min(), yield_curve.max().max())
    ax.set_xticks([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40])

ani = FuncAnimation(fig, update, frames=range(len(yield_curve)), repeat=False)

# Ensure that FFmpeg is installed
os.system("apt-get install -y ffmpeg")

# Save the animation as an MP4 file in Google Drive
save_path = "/content/drive/MyDrive/yield_curve_animation.mp4"
ani.save(save_path, writer="ffmpeg", dpi=100)

# Display the animation in Google Colab
HTML(ani.to_jshtml())
```

とりあえず、以下のグラフが完成と言いたかったが、mp4でのアップはダメだった。
[AWS Q&A 365][Pinpoint]AWSのよくある問題の毎日5選 #48

# 1. Amazon Pinpointで利用可能な異なるチャネルは何ですか？
回答：Amazon Pinpointでは、プッシュ通知、電子メール、SMS、音声、およびアプリ内メッセージなど、さまざまなチャネルを提供しています。

# 2. Amazon Pinpointでカスタムチャネルを設定および管理できますか？
回答：はい、Amazon Pinpointでは、独自のチャネルを通じて顧客にメッセージを送信するために、カスタムチャネルを設定および管理できます。

# 3. Amazon Pinpointで電子メールチャネルを有効または無効にするにはどうすればよいですか？
回答：Amazon Pinpointの電子メール設定に移動し、電子メールチャネルを有効または無効にするオプションを選択することで、電子メールチャネルを有効または無効にすることができます。

# 4. SMSおよび音声設定における米国の電話番号の機能と制限は何ですか？
回答：Amazon PinpointのSMSおよび音声設定では、米国の電話番号の機能と制限に関する情報が提供されており、無料電話番号、10DLC、ショートコードのサポートなどが含まれます。

# 5. Amazon PinpointでSMSおよび音声設定を管理するにはどうすればよいですか？
回答：Amazon PinpointのSMSおよび音声設定に移動し、番号の購入、サポートのリクエスト、およびサンドボックスの管理などのオプションを選択することで、SMSおよび音声設定を管理できます。また、メッセージ配信、エンドポイント、イベント、ワンタイムパスワードに関連するメトリクスを表示することもできます。
[AWS Q&A 365][Pinpoint]Daily Five Common Questions #48

# 1. What are the different channels available in Amazon Pinpoint? 
Answer: Amazon Pinpoint offers various channels for sending messages, including push notifications, email, SMS, voice, and in-app messages. 

# 2. Can I set up and manage custom channels in Amazon Pinpoint? 
Answer: Yes, Amazon Pinpoint allows you to set up and manage custom channels to send messages to your customers through your own channels. 

# 3. How can I enable and disable the email channel in Amazon Pinpoint? 
Answer: You can enable and disable the email channel in Amazon Pinpoint by going to the Email settings and selecting the option to enable or disable the email channel. 

# 4. What are the capabilities and limitations of US phone numbers in SMS and voice settings? 
Answer: The SMS and voice settings in Amazon Pinpoint provide information about the capabilities and limitations of US phone numbers, including support for toll-free numbers, 10DLC, and short codes. 

# 5. How can I manage SMS and voice settings in Amazon Pinpoint? 
Answer: You can manage SMS and voice settings in Amazon Pinpoint by going to the SMS and voice settings and selecting the options to purchase numbers, request support, and manage sandboxes. You can also view metrics related to message delivery, endpoints, events, and one-time passwords.
neosでlogix その136

# 概要
neosでlogixやってみる。
練習問題やってみた。

# 練習問題
websocketで、chatgptを実行せよ。

# 写真

![2023-05-05 11.31.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/917764e6-3495-96b5-e631-35a4a11b1c33.jpeg)

# サーバーは、これ。

https://qiita.com/ohisama@github/items/efbb702cc71a58560824

# 手順
- websocketサーバーを起動。
- transceiverを実行する。


以上。
log(x+1,3-x)>0「2023公立千歳科学技術大学前期【１】(3)」をWolframAlphaとsympyでやってみた。


WolframAlphaとsympyのグラフがでます。

オリジナル

https://kamelink.com/blog/2023/05/01/2-2-23-kouritutitosekagidai-rikou-1-3/

以前、以下で私はコメントしていました。

https://mathmathmass.exblog.jp/33234724/

上と同じです。大学入試数学問題集成＞テキスト【１】(3)

https://mathexamtest.web.fc2.com/2023/202311025/2023110250100mj.html#top-0103

# WolframAlphaで

log(x+1,3-x)>0

https://www.wolframalpha.com/input?i=log%28x%2B1%2C3-x%29%3E0&lang=ja

# sympyで
```python
from sympy import *
x=symbols('x',real=True)
f=log(3-x,x+1) 
print("#",solve_univariate_inequality(  f > 0, x) )
plot(f)
# (0 < x) & (x < 2)
```
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

？？？？plotコマンドは、縦横比？異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/48ea16c1-516f-059d-b69d-3c17835ffae8.png)

# 参考
class sympy.functions.elementary.exponential.log(arg, base=None)

https://docs.sympy.org/latest/modules/functions/elementary.html#log

?????
sympy.solvers.inequalities.solve_univariate_inequality(expr, gen, relational=True, domain=Reals, continuous=False)

https://docs.sympy.org/latest/modules/solvers/inequalities.html#sympy.solvers.inequalities.solve_univariate_inequality
【React】Next.js13以降でURLのクエリパラメーターを取得する方法

## 概要
Next.jsでURLのクエリパラメータを取得する場合、[Next.js useRouterで、query stringを取得する](https://zenn.dev/knaka0209/articles/4f3726ed13535a)の記事にある通り、`useRouter`を使用する方法が検索すると出てくるかと思います。
ただ、Next.js13の`App Router`を使用している状態で同様の実装を行うとパラメータが取得できず、どのように実装すれば良いのかというのを今回メモ書きします。

## 前提
* Next.jsのバージョンは13.3で動作確認しました。
* `App Router`の使用を前提としています。

## 対応
stackoverflowの記事、[NextRouter was not mounted Next.JS](https://stackoverflow.com/questions/74421327/nextrouter-was-not-mounted-next-js)にある通り13から`useRouter`の仕様が変更になったようです。パラメータについては`useSearchParams`を使用して、取得する必要があるそうです。
`useSearchParams`の仕様の詳細については公式のドキュメント[useSearchParams API Reference](https://nextjs.org/docs/app/api-reference/functions/use-search-params)を参照ください。

## 実装サンプル
`useSearchParams`を使用して、URLのクエリパラメータを取得する実装サンプルを、以下の通り記載します。

```react
"use client";

import { useSearchParams } from "next/navigation";

export default function SampleParamComponent() {
  const searchParams = useSearchParams();
  const id = searchParams.get("sample_id");
  const name = searchParams.get("sample_name");

  return (
    <>
      <div>{id}</div>
      <div>{name}</div>
    </>
  );
}
```
本日の微分方程式（1日目）

なんとなく脳トレがてら1日1問解説しようと思っただけです．飽きたらやめます．

## 問題
```math
y^{\prime} = y\cos x.
```

## ポイント
- $\displaystyle\frac{\mathrm{d}y}{\mathrm{d}x}=P(x)Q(y)~$ の変数分離型です．
- 両辺を $Q(y)$ で割って $x$ で積分したくなるのですが， $Q(y)\neq 0$ に注意しましょう．
    - つまり，$Q(y)\neq 0$ と $Q(y)=0$ で場合分けが必要です．

## 解答
**① $y\neq 0$ のとき．**
```math

\begin{align}
    y^{\prime} &= y\cos x, \\
    \frac{\mathrm{d}y}{\mathrm{d}x}&=y\cos x,\\
    \frac{1}{y}\frac{\mathrm{d}y}{\mathrm{d}x}&=\cos x.
\end{align}
```
両辺を $x$ で積分して，

```math
\begin{align}
    \int\frac{1}{y}\frac{\mathrm{d}y}{\mathrm{d}x} \mathrm{d}x&=\int\cos x\mathrm{d}x,\\
    \int\frac{1}{y}\mathrm{d}y&=\int\cos x\mathrm{d}x,\\
    \log|~y~|&=\sin x +C_1~~~(C_1:任意定数).
\end{align}
```
ここで，両辺の指数をとると，

```math
\begin{align}
      e^{\log{|~y~|}}&=e^{\sin x +C_1},\\
    |~y~|&=e^{C_1}e^{\sin x},\\
    y &=\pm e^{C_1}e^{\sin x}.
\end{align}
```

また， $C_1$ が任意の実数値を取るとき， $\pm e^{C_1}$ は0以外のすべての値をとるので（$y=e^x$ および $y=-e^x$ のグラフの漸近線が $y=0$ であることをイメージしよう），解は

```math
y =Ce^{\sin x}~~~(C\neq 0),
```

と書き換えることができる．

**② $y=0$ のとき．**

$y=0$ のとき $y^\prime = 0$ であるから，関数 $y=0$ は方程式 $y^{\prime} = y\cos x$ を満たす．
よって $y=0$ も解である．

また， $y=0$ は，①の解 $y =Ce^{\sin x}~~~(C\neq 0)$において，$C=0$ としたものと一致する．
よって，①と②の解を合わせれば，

```math
y =Ce^{\sin x}~~~(C: 任意定数),
```
が微分方程式 $y^{\prime} = y\cos x$ の解である．

## 【参考】 Wolframalpha

非常に便利なので皆さん積極的に使っていきましょう．

https://www.wolframalpha.com/input?i=y%27%3Dycosx&lang=ja
Rubyの===について

## はじめに
Ruby初学者の備忘録です。

## リファレンスマニュアル より
>メソッド Object#== の別名です。case 式で使用されます。
>このメソッドは case 式での振る舞いを考慮して、各クラスの性質に合わせて再定義すべきです。
>一般的に所属性のチェックを実現するため適宜再定義されます。
>when 節の式をレシーバーとして === を呼び出すことに注意してください。
>また Enumerable#grep でも使用されます。
>[PARAM] other:
>比較するオブジェクトです。

[参考:Ruby 3.2 リファレンスマニュアル : instance method Object#===](https://docs.ruby-lang.org/ja/latest/method/Object/i/=3d=3d=3d.html)

## 例

`===`は、オブジェクトが特定のクラスやケースに属するかどうかをテストするために使用される。また、`case`文の条件分岐では暗黙的に使用される。

1.クラスやモジュールの場合：

```ruby
p String === "hello" # true
p Integer === 42     # true
p Integer === "42"   # false

```

2.正規表現の場合：

```ruby
p /^h/ === "hello" # true
p /^x/ === "hello" # false

```

3.範囲の場合：

```ruby
p (1..10) == 5   # false
p (1..10) === 5  # true
p (1..10) === 15 # false

```

4.`case`文の条件分岐

```ruby
when Integer
  p "It's an Integer"
when String
  p "It's a String"
else
  p "It's something else"
end

```
この例では、`when`節のオブジェクト（`Integer`や`String`）に対して、暗黙的に`===`演算子が呼び出される。つまり、`when Integer`は実際に`Integer === value`を評価し、それが`true`の場合、その`when`節が実行される。
Qiita knowhow

Qiita KnowHow


# 記事の編集方法　「記事作成年月日なし」

https://help.qiita.com/ja/articles/qiita-edit

>記事の内容やタグを変更するには、以下の手順を踏みます。
編集したい記事のページにアクセスします
左にある「…」からメニューを開き、「編集する」を選択します
内容を変更して右下にある「内容を確定」ボタンをクリックします
モーダル右下の「更新する」をクリックすると、記事の内容が更新されます


# Qiitaへの投稿の編集履歴が見られるようになりました！
2013/1/7


https://blog.qiita.com/40000062194-2/

# Qiitaの編集履歴の+は何ですか? 最初の投稿に手軽に戻す方法を教えて下さい。
@mrrclb48z
 2022年05月07日に投稿

https://qiita.com/mrrclb48z/questions/3b98ef137a1c57c07601

## 1件の回答
@uasi 2022年05月07日に投稿

>①先頭の+は、前の版と比べて新しく挿入された行を表します。反対に削除された行の先頭には-がつきます。これは diff （2つのテキストの差分を表示するプログラム）で使われる記法です。
②一番古い履歴を開いて内容をコピーします。すべての行が新しく挿入された扱いになっているので、すべての行の先頭に+がついています。+を消し、それを投稿すれば最初の内容に戻せます。なお、本文の変更点の上には @@ -0,0 +1,5 @@ などと書いてありますが、これは変更された行数を表します。投稿には含めないでください。


# QiitaのUI—「編集を続ける」での編集内容を簡単に捨てたい
@YumaInaura 投稿日 2018年08月19日 更新日 2022年08月21日

https://qiita.com/YumaInaura/items/5a0bd4f6c51c39e4c3ac

# 限定共有投稿について 「記事作成年月日なし」

https://help.qiita.com/ja/articles/qiita-private-article

# まとめに代えて

Qiitaの記事の記載年月日がないのは奇異だ。違和感がある。Qiitaは本当にIT企業なのだろうか。　

データ解析結果に基づいた説明がほとんどない。　

個人宛の１年の報告くらい。　

Qiitaは本当になにがしたいのだろう。　

大事なのは、Qiitaを使って、自分がなにをしたいかだろう。　

## 現在の使い道

1 GitHub活動予備の置き場　
2 Github活動の呼び水
3 Reseachmapの予備の置き場　
＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20230505

## 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
streamを使用した自作クラス配列の最大・最小値の取得

もっといい方法があるような気はします。

```java
class Stock {
    private int maxPrice;
    private int minPrice;

    Stock(int maxPrice, int minPrice) {
        this.maxPrice = maxPrice;
        this.minPrice = minPrice;
    }

    public int getMaxPrice() {
        return this.maxPrice;
    }

    public int getMinPrice() {
        return this.minPrice;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Stock> stocks = new ArrayList<>();
        ...
        
        int maxPrice = stocks.stream()
                .max(Comparator.comparing(Stock::getMaxPrice))
                .get()
                .getMaxPrice();
                        
        int minPrice = stocks.stream()
                .min(Comparator.comparing(Stock::getMinPrice))
                .get()
                .getMinPrice();
    }
}
```
ESLintなどの設定ファイルに型をつける方法

ESLintなどのフロントエンドまわりのツールでは、設定ファイルのフォーマットとして、JSON、YAML、JavaScript、TypeScriptなど、様々なフォーマットがサポートされています。

https://qiita.com/munieru_jp/items/a13aff36401e570b2fa4

TypeScriptがサポートされていれば設定に対して型をつけられるので、間違いをある程度防ぐことができるでしょう。
ここでは、ESLintのようにTypeScriptがサポートされていない設定ファイルに対して、型をつける方法を紹介します。

## TypeScriptがサポートされている場合

JestのようにTypeScriptがサポートされていれば、普通にTypeScriptで書くだけです。

```ts
import type { Config } from 'jest'

const config: Config = {
  verbose: true
}

export default config
```

## TypeScriptがサポートされていない場合

ESLintのようにTypeScriptがサポートされていない場合でも、型定義さえあればJSDocコメントで型をつけることができます。

https://www.typescriptlang.org/ja/docs/handbook/intro-to-js-ts.html

たとえば、ESLintの場合は次のように書くことができます。

```js
// @ts-check

/** @typedef {import('eslint').ESLint.ConfigData} ConfigData */

/** @type {ConfigData} */
const config = {
  extends: [
    '@munierujp/eslint-config-typescript'
  ],
  parserOptions: {
    project: './tsconfig.json'
  }
}

module.exports = config
```

ただし、型定義の場所がドキュメントに記載されていない場合は、自分で探し出す必要があります。
もっとも、著名なツールならGitHubを`@ts-check path:<設定ファイル名>`のようなクエリで検索すれば使用例が見つかるでしょう。

https://github.com/search?q=%40ts-check+path%3Aeslintrc&type=code
Cognitoってなんだっけ？

## はじめに

### 概要
AWSのassociate資格であるDVAを勉強する際に、ふんわり分った気になっていたCognitoについておさらいしてみました

### この記事で得られること
- Cognitoの概要
- Cognitoの主な機能
    - ユーザープール
    - IDプール
    - Cognito Sync

## どんなサービス？
AWSの認証/認可のサービスの一つ。
AWSの認証/認可サービスというと、IAMやSSOなどがあります。
IAMやSSOはチーム内や社内など、組織内での認証を行うサービスです。

では、組織外のユーザーの認証を行うには？
それを実装するのがCognitoです！

### 組織外のユーザーの認証を行う場合って？
簡単な例でいうと、Qiitaにログインする際、私たちはQiitaという組織の外の人ですよね？
普段わたしたちが使用しているアプリケーションはほとんど組織外からのアクセスだと言えます。

そんな組織外の私たちを認証して認可を与える仕組みがCognitoです。

## 認証と認可
簡単に認証と認可の違いについてみてみましょう。
認証：その人が、その人であることを確認すること
認可：その人ができることを確認すること

ここでは認証と認可の違いについては深くは言及しませんが、なんとなくこんな感じです。

## Cognitoの主な機能
Cognitoの主要な機能に
- ユーザープール(認証)
- IDプール(認可)
- Sync(同期)

という機能があります。

### ユーザープール
プールとは小学校に必ずあるプールが最初に思いつくかもしれませんが、英語でpoolは「たまり場所」などと訳されます。
なので、ユーザープールとはユーザーの情報をためておく(一元管理する)場所ということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/1919fa9e-bdf1-b225-f15d-1ae0b28611c1.png)

ユーザープールはCognitoで最も使用されるユーザーの認証機能を提供しています。
下に認証の流れを図にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/5dacf1f6-17fc-78f8-3bd5-932df16a0e1d.png)


JWTが使われているのは、複数のアプリケーションで認証情報を共有する必要があるからだと思います。

### ユーザープールの認証方法
ユーザープールには2つの認証方法があります。
1. Cognitoで管理するスタンドアロンのユーザーディレクトリを使った認証
2. 外部サービスを使った認証

ユーザーディレクトリを使った認証
ユーザーが初回アクセス時に登録した情報を使って認証を行います。
これは一般的なアプリケーションでよくある構成なのでわかりやすいと思います。
Cognitoの設定では、認証にEmail,ユーザー名,SMSの他にMFA(2要素認証)を使った認証もサポートしています。

外部サービスを使った認証
こちらも最近では当たり前になった、google,Facebookなどの外部サービスの認証情報を使って認証を行う機能です。 

そのほかに、ユーザープールの提供している機能として
サインイン、サインアウト、パスワード忘れ、パスワード変更など、ユーザー情報に関する操作もサポートしています。

### IDプール
IDプールは上記のユーザープールで認証をされた後、受け取ったトークンを元にユーザーにクレデンシャルを渡す機能です。
横文字が多くてわかりづらいですね。

トークンは認証後にCognitoから発行されるアクセス許可証です。
クレデンシャルはユーザーの身元を確認するための情報です。
ややこしい...

流れとしては、
1. ユーザープールから得たトークンを使ってIDプールへ問い合わせ
2. IDプールの機能でクレデンシャルを発行
3. クレデンシャルを元に、アシュームロールを使ってAWSリソースを操作

という流れでAWSのリソースを操作できます。
これはユーザーにAWSリソースを操作する一時的な権限(IAMロール)を与える機能なので、アプリケーションがEC2上で動作しているだけであれば必ずしもIDプールを使う必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/728acb4e-adfc-131f-95f2-0ae44950e14a.png)


### Cognito Sync
これは今までのユーザープール、IDプールとは少し毛色が違います。
Cognito Syncはデバイス間でユーザーデータを同期するための機能です。
例えば、PCとスマホに対応したゲームで、ユーザー情報を同期することでPCでもスマホでも同じユーザーで遊べるといった具合です。

ただし、現在はAppSyncというCognito Syncの機能を含んだサービスがあり、そちらの使用が推奨されているようです。

## 便利なユースケース
API GatewayやAppSyncの背後にLambdaやDynamoDBを使ったサーバレスアプリケーションでは、API Gateway,AppSyncにcognitoで発行されたトークンを検証する機能があります。
そのため、バックエンド側でトークンを検証するという開発の手間が削減できます。

## まとめ
ユーザープールとIDプールはそれぞれ独立した機能ではなく、ユーザープールがあってのIDプールということです。

### 所感
勉強前はCognitoはユーザーの認証をマネージドで行ってくれる便利なやつくらいに思っていましたが、クレデンシャルを発行する認可機能もあるということを知りました。
AWSのBlack Beltではユーザープールの内部的な処理の解説もしてくれていたので、また勉強してまとめてみようと思います。

参照: https://pages.awscloud.com/rs/112-TZM-766/images/20200630_AWS_BlackBelt_Amazon_Cognito_ver2.pdf
初投稿

みなさん、はじめまして。
インフラエンジニアとして働いているRyoといいます。
よろしくお願いします。

このブログのコンセプトとして、私の技術のアウトプットと、
これからインフラエンジニアを目指している方、まだ経験が浅い方向けにお話しできればと思います。


技術的な投稿は次回以降からするとして、まず初めに、私の経歴から紹介します。
現在は30歳、出身は鳥取県で、高校卒業までいました。
大学からは大阪に出てきて、そこからずっと大阪で過ごしています。

今勤めている会社は、いわゆるSES企業といわれる会社で、
ざっくり言えば、取引しているお客様の会社で常駐して業務をおこなうような会社です。
SES企業について詳しく知りたい方は、ググってみてください。
いいことからよくないことまでいっぱい出てきますよ(笑)

エンジニアをやっていますが、高校でも大学でも全然そのような勉強はしておらず(大学では文系の学部)
3年前に未経験採用という形で、今の会社に中途で入社しました。
なぜIT業界に飛び込もうと思ったかは、長くなりそうなのでまたおいおい話しますね。

そんな私ですが、入社時のスペックを紹介します。
・家にパソコンがない。
・タイピングは人差し指。
・Wordは卒論で使ったことはあるが、Excel、PowerPointなどは使ったことなし。

こうやって字にすると、よくエンジニアを目指そうと思ったなと思いますね…。
カフェで指カタカタさせて文字打つ人にすごく憧れてましたもん。笑

晴れてインフラエンジニアとしての第一歩を歩み始めたのですが、
第一の関門が私の前に立ちはだかります。それが、
『2カ月でLPICレベル1を取得せよ』です。
LPICとはなんぞや、そもそもなんて読むんや、な所から始まったわけです。
ちなみに結果から申し上げますと、失敗しました。
これも話せば長くなるので、また次回以降にお話しできればと思います。

とこんな私ですが、現在でもなんとかエンジニアとしてやっていけています。
今回は初投稿ということで、私の紹介をざっくりですがしてみました。
更新頻度はわからないですが、のんびりと投稿できればなと思っています。
では！
redux入門① reduxについて

プロジェクトでreduxを使用するので、
キャッチアップのため勉強したことをまとめます。
redux入門者用です。

学習教材はUdemyを参考にしました。

声が聞き取りやすい。
説明がわかりやすい。

オスススメの教材です。
https://www.udemy.com/course/react-redux-beginner-course/learn/lecture/32581514#overview

# ①reduxとは
reduxとは状態管理をより効率よくするためのライブラリのこと。

状態管理とは、例えば
・SNSにログインしているか、していないのかを管理
・オンラインショッピングでの合計金額を管理
etc


# ②reduxを使用しない場合
reduxを使用しなくても状態管理は行えます。

しかしその場合、componetn間でのpropsのバケツリレーを行う必要が出てきます。

小規模なアプリであれば、バケツリレーでも対応できますが
大規模なアプリになるとバグの温床となる危険性があります。

reduxを使用すれば、バケツリレーを行わずにpropsを渡すことができるため、
効率性が高く、安全なアプリを作成することができます。

# ③reduxの仕組み
まずはreduxの公式ページから以下の画像を引用しました。
https://redux.js.org/tutorials/essentials/part-1-overview-concepts

![ReduxDataFlowDiagram-49fa8c3968371d9ef6f2a1486bd40a26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2378833/530dc13b-3da1-c72a-6b63-18fc2808e67a.gif)

以下各単語についての引用です。

Store（stateを保存しておく要素、内部にReducerを保持する）

Reducer（Actionを受け取り、既存のstateとActionを利用して新たなstateを作成する要素）

Dispatch（ViewなどからActionを受け取り、Store（正しくは内部のReducer）へ送信する要素）

Action（変更内容を内部に含む要素であり、Dispatchによって送信される。基本的にオブジェクト形式）

state（Store内で保持される要素。アプリケーションの状態を模したオブジェクトとして扱われる）

参考
https://zenn.dev/ryotarohada/articles/9a677d6f7fdc8e

# まとめ
今回はreduxについての基本的な用語についてまとめました。
次回から具体的な記述方法についてまとめます。
MacOS Venture でVirtualBox環境構築から起動まで

# はじめに
自己学習の一環として、自身のPCにてVirtualBox（CentOS）の環境構築を行おうとしたところ、下記のようなエラーが発生しました。<br>
同じような症状が出た方は、参考になるかと思い書き留めします。

![スクリーンショット 2023-04-27 15.33.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/7a10a18f-ba98-2f87-62d5-65532384af93.png)

# 環境
<ul>
<li>PC：MacBook Pro 2020</li>
<li>OS：MacOS Ventura13.3.1</li>
<li>ソフトウェア：VirtualBox6.1.36　→　VirtualBox7.0.8</li>
<li>ディストリビューション：CentOS7</li>
</ul>


# エラー原因
VirtualBox6がMacOS Venturaに対応していないことが原因のようです。<br>
VirtualBox7であれば対応しているようなので、Venturaを使用している方はVirtualBox7を使用しましょう。

# 構築手順
#### ①[VirtualBox](https://www.virtualbox.org/wiki/Downloads)と[CentOS７](http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/7.9.2009/isos/x86_64/)をダウンロード
リンクよりVirtualBox及びCentOSをダウンロードする。ダウンロード箇所は下記<font color="red"><b>赤枠</b></font>の通り
![スクリーンショット 2023-05-03 15.49.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/18a79192-5634-eefc-87bf-36dd8be01acb.png)
![スクリーンショット 2023-05-03 15.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/0ede21ad-d4fa-203f-8fc2-908091c70ace.png)

#### ②VirtualBoxを起動し、環境を新規作成
VirtualBoxをインストールし、起動。「新規」から仮想マシンを新規作成する。
注意点としては、ISO Imageに①でダウンロードしたCentOSを選択、「Skip　Unattended Installation」にチェックを入れる。（下記画像参照）
CPU、メモリ、ドライブのサイズは用途に合わせて調整する。
![スクリーンショット 2023-05-03 17.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/930ae308-fe83-e04e-6937-01c947936bbd.png)

#### ③CentOSをインストールし、起動
VirtualBoxでCentOSを選択し、起動するとインストール画面に進むので、下記<font color="red"><b>赤枠</b></font>よりインストールする。
![スクリーンショット 2023-05-03 17.15.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/161deed9-1268-4823-680f-4ef82b8798b1.png)

「インストールの概要」では下記下記<font color="red"><b>赤枠</b></font>三箇所を設定し、「インストールを開始」を押下する。
　・ソフトウェアの選択　→　ベース環境でサーバー（GUI使用）を選択し完了　<b>※GUI操作でなければ変更可</b>
　・インストール先　→ インストール先を確認して完了
　・ネットワークとホスト名　→ Ethernet(enp0s3)をオンにして完了
![スクリーンショット 2023-05-03 17.32.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/efbe716c-814e-4a11-2ea6-7060970e048b.png)

インストール中にROOTパスワードとユーザー作成をする必要があるので、任意のユーザー、パスワードを設定する。
![スクリーンショット 2023-05-03 17.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/f45fd474-54cb-9b85-ea0d-092819b26a5b.png)

ライセンスの同意して設定の完了を押下する。以降は画面通り手順で起動できます。
![スクリーンショット 2023-05-05 18.23.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/ac11b9d6-fa12-fcb7-af8d-542c332a9cd5.png)

#### ④画面のサイズを変更
（<font color="red"><b>赤枠</b></font>）View→Virtual Screenから変更、もしくは（<font color="blue"><b>青枠</b></font>）設定→ディスプレイ→解像度から画面サイズを変更することができる。
![スクリーンショット 2023-05-05 18.32.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2119179/6164930f-db15-2f32-853a-eb259afcbf69.png)
オープンソース推進計画2023でONLYOFFICEのプロジェクトに参加募集中

良いニュースです！オープンソースコミュニティとして、私たちは[オープンソース推進計画2023](https://summer-ospp.ac.cn/)において、2つのプロジェクトを発表しました。

私たちは、世界中の学生がプロジェクトに応募することを歓迎します。参加者には、ボーナスと修了証が授与されます。詳しくは記事をお読みください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/b6dbdbf5-158c-2c62-eac5-8457b2eede16.png)

## オープンソース推進計画とは

オープンソース推進計画（OSPP）は、中国科学院ソフトウェア研究所が主催するサマープログラムです。大学生がオープンソースソフトウェアの開発＆メンテナンスに参加することを奨励し、オープンソースコミュニティを促進することを目的としています。

世界中の大学生を対象にしています。学生は、興味のあるプロジェクトに応募することができます。合格した学生は、コミュニティメンターの指導のもと、プロジェクトに取り組みます。最終審査に合格した参加者には、ボーナスと修了証が授与されます。

過去のイベントについては、[こちらのページ](https://summer-ospp.ac.cn/2022/)をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/6648d638-da56-08ab-c74e-bd3d7f3ec989.png)

## ONLYOFFICEプロジェクト

弊社はOSPP2023に参加し、以下のような難易度の異なる2つの開発プロジェクトをリリースしています：

**プロジェクト1**：ONLYOFFICEでBaiduの検索結果をスプレッドシートに挿入するマクロを作成する。

**難易度**：ベーシック

**言語**：英語または中国語

**説明**：マクロは、ルーチンワークを自動化し、ドキュメントを標準化することを可能にします。ONLYOFFICEのマクロは、JavaScriptの構文とONLYOFFICE Document Builder APIのスクリプト表記を使用しています。このプロジェクトでは、Baidu検索結果をスプレッドシートに挿入するのに役立つONLYOFFICE用マクロを作成します。

**技術的な要件**：自己学習能力が高く、JavaScriptの一定の知識があり、[ONLYOFFICE API](https://api.onlyoffice.com/?utm_source=qiita&utm_medium=article&utm_campaign=OSPP_2023&_ga=2.231425623.91652590.1683029655-2010401340.1681826884)の習得に意欲的な方。

[今すぐ応募する](https://summer-ospp.ac.cn/org/prodetail/23fed0074?lang=en&list=pro)

**プロジェクト2**：ONLYOFFICEのAIプラグインを書く

**難易度**：上級

**言語**：英語または中国語

**説明**：ONLYOFFICEはプラグインをサポートしており、開発者がOOXMLフォーマットとは直接関係のない特定の機能をエディタに追加することができます。このプロジェクトでは、中国語のAIを文書内で直接使用するのに役立つONLYOFFICE用プラグインを開発する予定です。

**技術的な要件**：強い自己学習能力、JavaScriptの強い知識、プラグイン開発の一定の経験、ONLYOFFICE APIの習得に意欲的であること。

[今すぐ応募する](https://summer-ospp.ac.cn/org/prodetail/23fed0072?lang=en&list=pro)

## 参加方法

学生は、[公式サイト](https://summer-ospp.ac.cn/)の学生ログインポータルからOSPPシステムに登録・ログインし、プログラム要件に従って必要な情報を入力することで応募を完了することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/c380e755-dd17-8e70-6afe-9232629139ec.png)

プロジェクトの応募時期：2023年4月29日～6月4日、北京時間（UTC+8）

登録の締切日：6月3日15:00 UTC+8.
プロジェクト応募の締切：6月4日18:00（UTC+8）

登録時に18歳以上であること、応募時に有効な学生証が必要であることに留意してください。

詳しくは、学生ガイドをご覧ください。

## 何が得られるか

* オープンソースのパートナーや技術専門家に会える。
* コミュニティメンターから専門的な指導を受け、オープンソースプロジェクト開発者と深い議論ができる。
* プロジェクトの実務経験を積み、プロジェクト開発スキルを向上させる。
* 学習の方向性の参考となり、キャリア形成のための人脈を得る。
* ボーナス（ベーシックプロジェクト：～1170ドル、アドバンスプロジェクト：～1760ドル）と修了証書を取得する： 最終審査に合格した学生のみ、優秀学生証明書を取得する機会がある。

## お役立ちリンク

* [ONLYOFFICE公式Webサイト](https://www.onlyoffice.com/?utm_source=qiita&utm_medium=article&utm_campaign=OSPP_2023)
* [OSPP公式Webサイト](https://summer-ospp.ac.cn/)
* [OSPPの学生ガイド](https://summer-ospp.ac.cn/help/en/student/)
* [基本プロジェクト「マクロを書く」に応募する](https://summer-ospp.ac.cn/org/prodetail/23fed0074?lang=en&list=pro)
* [上級プロジェクト「プラグインの作成」に応募する](https://summer-ospp.ac.cn/org/prodetail/23fed0072?lang=en&list=pro)
* [ONLYOFFICE求人情報](https://www.onlyoffice.com/ja/vacancies.aspx?utm_source=blog&utm_medium=article&utm_campaign=OSPP_2023)
ひずみエネルギとそれを使った材料力学 基本例題8.32 P288 「材料力学演習(20221021)」をsympyでやってみたい。

・勉強して、直しました。(2024/01/13)
~~・申し訳ありません。意味がわかっていません。勉強中。~~

 # オリジナル
[基本例題8.32 P288 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=293)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
・ver0.3　下と同じです。(2024/01/18)
```python
# ver0.3
# 基本例題8.32 P288
from sympy import *
var('P,a,b,AE,EI,x1,x2',real=True)
U  = 1/(2*EI)*integrate( ( P*b)    **2,(x1,0,a))+1/(2*AE)*integrate((-P)**2,(x1,0,a)) \
    +1/(2*EI)*integrate( (-P*b+P*x2)**2,(x2,0,b))                                       #;print('#',U)
δCH=diff(U,P)                                                                          ;print('#',δCH)                                              
δCV= 1/EI   *integrate( (-P*b)*(-a+x1),(x1,0,a))                                       ;print('#',δCV)
# P*a*b**2/EI + P*b**3/(3*EI) + P*a/AE
# P*a**2*b/(2*EI)
```

・ver0.2　ver0.1のEq()が不要でした。(2024/01/13)
```python
# ver0.2
# 基本例題8.32 P288
from sympy import *

var('l,EIz,AE,P,a,b,x1,x2,z',real=True)
MAB=-P*b      
MBC=-P*b+P*x2
NAB=-P
NBC=0
U1  =1/(2*EIz)*Integral(MAB **2,(x1,0,a)) 
U2  =1/(2*AE )*Integral((-P)**2,(x1,0,a)) 
U3  =1/(2*EIz)*Integral(MBC **2,(x2,0,b))  
U   =U1+U2+U3                                                         ;print("# U   =",U) 
δCH=diff(U1.doit(),P)+diff(U2.doit(),P).simplify()+diff(U3.doit(),P) ;print("# δCH =",δCH) 
mAB=-a+x1
δCV=1/EIz*Integral(MAB*mAB,(x1,0,a)).doit().simplify()               ;print("# δCV =",δCV) 
# U   = Integral(P**2*b**2, (x1, 0, a))/(2*EIz) + Integral((-P*b + P*x2)**2, (x2, 0, b))/(2*EIz) + Integral(P**2, (x1, 0, a))/(2*AE)
# δCH = P*a*b**2/EIz + P*b**3/(3*EIz) + P*a/AE
# δCV = P*a**2*b/(2*EIz)
```

・ver0.1　(2023/05/05)
```python
from sympy import *
P      =symbols('P'      ,real=True)
a  ,b  =symbols('a   b'  ,real=True) 
MAB,MBC=symbols('MAB MBC',real=True)
NAB,NBC=symbols('NAB NBC',real=True)
A      =symbols('A'      ,real=True)
EE     =symbols('EE'     ,real=True)
x1,x2  =symbols('x1 x2'  ,real=True) 
U      =symbols('U'      ,real=True)
IZ     =symbols('IZ'     ,real=True)
myMAB  =Eq(MAB,-P*b)
myMBC  =Eq(MBC,-P*b+P*x2)
myNAB  =Eq(NAB,-P)
myNBC  =Eq(NBC, 0)
U      = 1/(2*EE*IZ)*integrate((-P*b     )**2,(x1,0,a)) \
        +1/(2*A *EE)*integrate((-P       )**2,(x1,0,a)) \
        +1/(2*EE*IZ)*integrate((-P*b+P*x2)**2,(x2,0,b))
print("#",diff(U,P))
dCV=1/(EE*IZ)*integrate((-P*b)*(-a+x1),(x1,0,a))
print("#",dCV)
# P*a*b**2/(EE*IZ) + P*b**3/(3*EE*IZ) + P*a/(A*EE)
# P*a**2*b/(2*EE*IZ)
```
# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

https://docs.sympy.org/latest/modules/integrals/integrals.html#module-sympy.integrals

https://www.delftstack.com/howto/python/python-partial-derivatives/

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~
pipでつくる数理最適化Docker環境

# 概要

Pythonで数理最適化のライブラリを実行できるDocker環境をつくりました。
数理最適化ってカッコイイ！やってみたい！！と思い↓2冊を始めたのですが、M1チップMacBookでライブラリが動かない・・・とハマりました。

https://www.asakura.co.jp/detail.php?book_code=12895

https://www.ohmsha.co.jp/book/9784274227356

本で紹介されている方法や先人が記事にしてくださっている方法だとpipとanacondaを混同しているものが多く、[condaとpip：混ぜるな危険](https://onoz000.hatenablog.com/entry/2018/02/11/142347)の危険を冒しそうに思っています。
特に本番環境で動作させる場合、他のライブラリとの依存関係も考慮することになるため、anaconda前提の構築は事故る可能性が非常に高いと思います。

ということで、pipのみで動作する数理最適化環境をつくりました。
Dockerを利用して構築するので、Mac以外でも動くはずです。
DockerコンテナをビルドしてブラウザからJupyter Notebookにアクセスするところまで書きます。


## 1. Dockerをインストール

以下からDockerをインストールしてください。

https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/

## 2. コンテナをビルド

↓のリポジトリでDockerfileなどを公開しているので、git cloneしてください。

https://github.com/RNakao/math_optimization_environment

cloneしたらコンテナをビルドします。

```
$ cd math_optimization_environment
$ chmod 755 install_cvxopt.sh
$ docker-compose up -d --build
```

## 3. ブラウザからJupyter Notebookにアクセス

正常にコンテナが立ち上がればブラウザからJupyter Notebookにアクセスできるはずです。

```
http://localhost:8888/
```

もし立ち上がっていない場合、ログにエラーが出ていることがあるので確認してみてください。

```
$ docker-compose logs -f
```
Flashにバックアップ

おうちモニターのデータはsqlite3のファイルをメモリーディスクに保存しています。

停電があったらふっとぶので、一日一回バックアップをFlashにとったとします。

Flashの書きこみ寿命は10万回くらいはあるので、

100000 / 356 = 280年

位は稼動できると思われます。

スマホも100年くらいは使えるようにならないかな。
Docker　Docker-compose インストール linux

最新バージョンを確認
```
curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4
```
```
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
```
Compose の別バージョンをインストールする場合は、v2.4.1の部分を、インストールしたい Compose バージョンに置き換えてください。

実行バイナリに対して実行権限を与えます。

```
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```

全ユーザー向けの Compose インストールを行う場合には以下とします。
```
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
```

インストール結果をテストします。
docker compose version
【Rails】 form_withについて

```ruby:sample.html.erb
<%= form_with model: @user do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>
```

>form_with引数のインスタンス(@user)が何も情報を持っていない場合、createアクションへ、 情報を持っている場合、updateアクションへ自動的に振り分けてくれます。
例えば、newの場合は自動でcreateアクションに振り分けられ、既に情報を持っているcreateの場合は自動でupdateアクションに振り分けられます。

>※form_withヘルパーメソッドは、渡されたインスタンス（この場合は@post）のプロパティを見て、createに飛ばすかupdateに飛ばすかを判断してくれる便利な子です。

### 参考
* [Railsのform_withのあれこれ【殴り描き】 - 技術ブログ](https://lhiroki1205.hatenablog.com/entry/2020/10/22/122525)
* [[Rails]初学者がform_withの流れを整理・理解するための記事 - Qiita](https://qiita.com/sew_sou19/items/e9944904b50899fbb4cf)
【Vue.js】ディレクティブ　チートシート

## 目次
1. [v-bind](#1-v-bind)
2. [v-on](#2-v-on)
3. [v-model](#3-v-model)
4. [v-if / v-else-if / v-else](#4-v-if--v-else-if--v-else)
5. [v-for](#5-v-for)
6. [v-show](#6-v-show)
7. [v-text](#7-v-text)
8. [v-html](#8-v-html)
9. [v-once](#9-v-once)
10. [v-pre](#10-v-pre)
11. [v-cloak](#11-v-cloak)
12. [v-slot](#12-v-slot)
13. [v-scroll](#13-v-scroll)
14. [v-focus](#14-v-focus)
15. [v-lazy](#15-v-lazy)
## 1. v-bind
- 動的に属性やプロパティをバインドする
   ```html
   <img v-bind:src="imageSource">
   <div v-bind:class="{ active: isActive }"></div>
   ```

## 2. v-on
- イベントリスナーをアタッチする
   ```html
   <button v-on:click="handleClick">Click me</button>
   ```

## 3. v-model
- 双方向データバインディングを実現する
   ```html
   <input v-model="username">
   <select v-model="selectedOption">
     <option v-for="option in options" :value="option.value">{{ option.text }}</option>
   </select>
   ```

## 4. v-if / v-else-if / v-else
- 条件付きレンダリング
   ```html
   <div v-if="condition">表示されます</div>
   <div v-else-if="anotherCondition">それ以外の場合に表示されます</div>
   <div v-else>どちらの条件も満たさない場合に表示されます</div>
   ```

## 5. v-for
- リストレンダリング
   ```html
   <ul>
     <li v-for="(item, index) in items" :key="index">{{ item }}</li>
   </ul>
   ```

## 6. v-show
- 条件によって要素の表示・非表示を切り替える（v-ifと異なり、要素はDOMに残る）
   ```html
   <div v-show="isVisible">表示・非表示が切り替わります</div>
   ```

## 7. v-text
- テキストコンテンツを更新する（マスタッシュ構文と同様の効果）
   ```html
   <span v-text="message"></span>
   ```

## 8. v-html
- HTMLコンテンツを描画する（セキュリティ上のリスクがあるため、信頼できるソースからのみ使用すること）
   ```html
   <div v-html="htmlContent"></div>
   ```

## 9. v-once
- 一度だけ描画する（その後のデータ変更が反映されない）
   ```html
   <span v-once>{{ message }}</span>
   ```

## 10. v-pre
- コンパイルをスキップする（生のテンプレートの内容を表示する）
    ```html
    <span v-pre>{{ message }}</span>
    ```

## 11. v-cloak
- Vueインスタンスがマウントされるまでの間、要素を非表示にする
    ```html
    <style>
      [v-cloak] { display: none; }
    </style>
    <div v-cloak>{{ message }}</div>
    ```

## 12. v-slot
- スロットに名前を付けるためのディレクティブ
```html
    <!-- 子コンポーネント -->
    <slot name="header"></slot>
    <slot></slot>
    <slot name="footer"></slot>
    
    <!-- 親コンポーネント -->
    <child-component>
      <template v-slot:header>
        <h1>ヘッダー</h1>
      </template>
      
      <p>デフォルトスロットの内容</p>
      
      <template v-slot:footer>
        <footer>フッター</footer>
      </template>
    </child-component>
```

## 13. v-scroll
- スクロールイベントをハンドリングする（公式ではなく、カスタムディレクティブとして実装することが一般的）
```html
<div v-scroll="onScroll">スクロールイベントを取得します</div>
```

## 14. v-focus
- オートフォーカスを実装する（公式ではなく、カスタムディレクティブとして実装することが一般的）
```html
<input v-focus>
```
## 15. v-lazy

- 画像の遅延読み込みを実現する（公式ではなく、カスタムディレクティブやサードパーティ製のプラグインとして実装されることが一般的）
```html
<img v-lazy="imageSource">
```
IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8] が発生する

# 概要
以下のように StandardCharsets.UTF_8.toString() をエンコーディングの指定として渡すと、一部の Android 端末で IllegalCharsetNameExceptionが返ってくるので調査しました。


```java
URLDecoder.decode("%2F%2F", StandardCharsets.UTF_8.toString())
```

```java
java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]
at java.nio.charset.Charset.checkCharsetName(Charset.java:201)
at java.nio.charset.Charset.forName(Charset.java:295)
at java.net.URLDecoder.decode(URLDecoder.java:60)
at com.example.test.TheTest.Test(TheTest.kt:26)
```

# 解決方法
```java
StandardCharsets.UTF_8.toString()
```
を
```java 
StandardCharsets.UTF_8.name()
```
とするだけ。

# 原因

Android 6 以下の端末は　OpenJDK を使用していないので、Charset 周りの実装が今と微妙に異なります。

### Android 6 の実装
```java
// https://cs.android.com/android/platform/superproject/+/android-6.0.1_r81:libcore/luni/src/main/java/java/nio/charset/Charset.java
@Override
public final String toString() {
    return getClass().getName() + "[" + this.canonicalName + "]";
}

```

### Android 7 以降の実装
```java
// https://cs.android.com/android/platform/superproject/+/master:libcore/ojluni/src/main/java/java/nio/charset/Charset.javajava/nio/charset/Charset.java;l=1?q=Charset.java&sq=
public final String toString() {
    return name();
}
```

このように Android 6 以下の場合は debug 表示用の文字列を返すコードになっていたのが原因だったようです。実装を見てる感じ Android のバージョン関係なく toStringよりname()を呼んだ方が良さそうですね。

# 参考
* https://swada.net/urlencoder-encode-crash/
nanoのチュートリアルを作ってみた【nanotutor】

# TL; DR

- vimtutorのnano版作ってみた
- nanoのショートカットを覚えよう！

https://github.com/Syuparn/nanotutor


# はじめに

nanoは多くのLinuxに初めからインストールされています。機能がシンプルで愛用しているのですが、ネットの評判的には「VimかEmacsを覚えるまでのつなぎ」のような扱いが否めません... :cry:

しかし、nanoにも便利なショートカットはたくさんあります。
そこで、**nanoの布教のためにチュートリアルを作ってみました**。

# 作ったもの

実践型のチュートリアルです。

https://github.com/Syuparn/nanotutor

元ネタは、Vimのチュートリアル「vimtutor」です。テキストに従って移動、編集することで手を動かしながら操作を覚えられます。

https://github.com/vim/vim/blob/master/runtime/tutor/tutor.ja.utf-8

```:vimtutor日本語版レッスン1.1より引用
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			 レッスン 1.1:  カーソルの移動


       ** カーソルを移動するには、示される様に h,j,k,l を押します。 **
	     ^
	     k		    ヒント:  h キーは左方向に移動します。
       < h	 l >		     l キーは右方向に移動します。
	     j			     j キーは下矢印キーのようなキーです。
	     v
  1. 移動に慣れるまで、スクリーンでカーソル移動させましょう。

  2. 下へのキー(j)を押しつづけると、連続して移動できます。
     これで次のレッスンに移動する方法がわかりましたね。

  3. 下へのキーを使って、レッスン1.2 に移動しましょう。
```

そんなvimtutor~~のパクr~~をリスペクトして、nanoのチュートリアルを作りました。

```:nanotutor
# Lesson 3: 編集
## 3.1: バッファの切り取り、貼り付け

ctrl + k : 現在の行をバッファへ切り取り
ctrl + u : バッファから内容を貼り付け

以下の各行を順番通りに並べ替えてください。

4. fox
1. The
7. the
8. lazy
3. brown
9. dog
5. jumps
6. over
2. quick
```

英語版を作ってから日本語に訳したのでちょっと文が硬いですね...

~~「あなたがvimtutorをもう一度復習してvimmerになれば良いのでは？」というご意見は受け付けておりませんのでご了承ください~~

# 仕組み
## ショートカットの洗い出し

公式のチートシートを参考にしました。全部やると多いので、すぐに使いそうなものに絞って取り上げています。

https://www.nano-editor.org/dist/latest/cheatsheet.html

## コマンド化

続いて、`nanotutor` のコマンドで実行できるようにします。今回はGoで実装しました。
シェルのエイリアスでも作れますが、Goの場合はインストールがシングルバイナリのダウンロードで完結し初心者にやさしいです。

`tutor` のテキストを `embed` で実行ファイルへ埋め込むことで、シングルバイナリ化しています。

```go
import (
	_ "embed"
)

// コンパイル時に、同じディレクトリ内のテキストファイル tutor の中身がセットされる
//go:embed tutor
var tutorTextBytes []byte
```

nanoの呼び出しには `os/exec` を使用しています。

```go
// `$ nano ${tempFilePath}` を実行

cmd := exec.Command("nano", tempFilePath)
// NOTE: 入出力を設定しないとnanoが異常終了してしまう
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

err := cmd.Run()
```

## ファイルを壊してしまっても閉じれば元通り

vimtutorでは、繰り返し練習ができるようテキストを変更しても再起動すると元通りになります。一時ファイルへコピーしてから起動することでこれを実現しています。

というわけで、nanotutorでも一時ファイルを使うようにします。ランダムな名前の一時ファイルを作るには、`os.CreateTemp`が便利です。

```go
// nanotutorで使う一時ファイルを作成
func createTutorFile() (string, error) {
	dir := os.TempDir()
      // `nanotutor_` で始まるランダムな名前がつく
      f, err := os.CreateTemp(dir, "nanotutor_*")
	if err != nil {
		return "", fmt.Errorf("failed to create tutor temp file: %w", err)
	}

	// tutorファイルの原本の内容(embedでバイナリに埋め込んでいる)をコピーし書き込み
	_, err = f.Write(tutorTextBytes)
	if err != nil {
		return "", fmt.Errorf("failed to initialize tutor temp file: %w", err)
	}

	// ファイルの絶対パスを返す
	return f.Name(), nil
}
```

ゴミが残らないように、終了時にファイルを消しておきましょう。

```go
tempFilePath, err := createTutorFile()
if err != nil {
	fmt.Fprintf(os.Stderr, "FATAL: %v\n", err)
	os.Exit(1)
}
defer os.Remove(tempFilePath)
```

## インストールしやすくする

インストールで詰まって心が折れてしまってはチュートリアルへ進めません。goreleaserでコンパイル済みのバイナリをリリースし、ダウンロードだけで使えるようにしておきます。

https://github.com/Syuparn/nanotutor/releases

# おわりに

以上、nanoのチュートリアルを作ってみた紹介でした。~~春からの新メンバーへの布教に活用してください~~
定積分x3/(x2-2x+2)「2017福島県立医科大学前期【１】(2)」をWolframAlphaとsympyでやってみた。

WolframAlphaとsympyのグラフがでます。

オリジナル(youtube)

https://youtu.be/E6nVBwBiLT8

上と同じです。大学入試数学問題集成＞テキスト

https://mathexamtest.web.fc2.com/2017/201711151/2017111510100mj.html#top-0102

# WolframAlphaで
Integrate[x3/(x2-2x+2),{x,1,1+√3}]

https://www.wolframalpha.com/input?i=Integrate%5B+++++x3%2F%28x2-2x%2B2%29++++++%2C+%7Bx%2C+1%2C+1%2B%E2%88%9A3%7D%5D&lang=ja

# sympyで
```python
from sympy import *
x=symbols('x',real=True) 
a=1
b=1+sqrt(3)
expr=x**3/(x**2-2*x+2)
print("#",integrate(expr, (x, a, b)).simplify())
plot(0,expr,(x,a,b))
# -2*pi/3 + log(4) + 3/2 + 3*sqrt(3)
```

①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

plotコマンドは、縦横比？異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/bd343adf-5423-dcdf-7150-6ae2451ecfe8.png)


# 参考
https://www.wolframalpha.com/examples/mathematics/calculus-and-analysis/integrals/

https://docs.sympy.org/latest/modules/integrals/integrals.html#module-sympy.integrals
ドキュメント内の内容をスプレッドシート内のリストに変更して複数のドキュメントを作成するコード

異なる会社ごとに文面が同じの文書をプリントしたいと思い、作成。
文面は同じだが、宛先と住所は変更したい。

参考記事
https://blog.synnex.co.jp/google/gas-for-google-document/

　ドキュメントは下記の通り。
https://docs.google.com/document/d/1u9IOJI9E6e3svnP7y1FIHacx2gQamJCSQF0OAOOSEw4/edit

スプレッドシートで作成したリストは下記の通り。
https://docs.google.com/spreadsheets/d/1g2cDTXmy2KDT7ltxJYLVRzxLn2cqSCKTMEWnmlfjteU/edit#gid=0


## コード
```ドキュメント内の内容をスプレッドシート内のリストに変更して複数のドキュメントを作成するコード.gas
/**
 * オリジナルのメニューを追加
 */
function onOpen() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [];
  menuEntries.push({ name: "宛名作成", functionName: "makeDocs" });

  ss.addMenu("宛名作成メニュー", menuEntries);
}

/**
 * Googleドキュメントを作成する
 */
function makeDocs() {
  // テンプレートとするドキュメントIDを設定
  var docID = '****************変更する****************'

  // スプレッドシートのデータの範囲を設定
  var dataStartRow = 2;
  var dataEndRow = 10; // 実際のデータに併せて十分余裕を持った最大行数を設定
  var dataStartCol = 1;
  var dataEndCol = 4;

  // スプレッドシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('****変更する****');

  // スプレッドシートのデータを取得
  var datalist = sheet.getRange(dataStartRow, dataStartCol, dataEndRow, dataEndCol).getValues();

  // テンプレートをコピーして、スプレッドシートのデータで置換 
  for (var i = 0; i < datalist.length; i++){
    // データがなくなったらループを抜ける
    if (datalist[i][0] === '') {
      break;
    }
    // テンプレートをコピーしてファイル名を設定する
    var docCopyID = DriveApp.getFileById(docID).makeCopy('宛名_' + datalist[i][3]).getId();

    // コピーしたドキュメントを取得し、スプレッドシートのデータで文字列を置換する
    var doc = DocumentApp.openById(docCopyID);
    var body = doc.getBody()
    body.replaceText("｛number｝", datalist[i][1]).replaceText("｛address｝", datalist[i][2]).replaceText("｛name｝", datalist[i][3]);
  }
  
}
```

## 悩んだところ

ドキュメント内の置換文字を日本語にしていたらリストの内容が反映されなかった。
ドキュメント内の置き換え文字を日本語から英語に変えたら動いた。



　ドライブ内にスプシ（リストが記載されているもの）とドキュメントのテンプレートを格納して使用すると同じドライブ内にドキュメントが格納されるので管理しやすいと思う。
年齢の算出

## 年齢の算出と出力
さまざまなアプリケーションで、ユーザー情報を登録する際、年齢の登録が必要になってくる場合があります。
今回は、ユーザーの年齢を誕生日から算出、出力する計算式とコードを書いていきます。

### 環境
・Windows 10
・python 3.10.6
・VScode

## 計算式
年齢の計算式は、
`(現在の日にち(Year,month,day)-誕生日(Year,month,day)) / 10000`
で算出した数値を小数点以下切り捨てを行うことで算出できます。

例（私の生年月日で算出（1999年10月12日））
```
 (20230505-19991012)/10000
 239493/10000
=23.9493
≒23
```

## Pythonでの出力
ここでは、今日の日付をdatetimeで入力します。
```python:Console
import datetime

today   = datetime.date.today()
birth    = 19991012
print ((int(today.strftime("%Y%m%d")) - int(birth)) // 10000)
```

結果
```
PS C:\Users\kelp> & "C:/Program Files/Python310/python.exe" c:/Users/kelp/Desktop/age_test.py
23
```

## おわり
今回は、うるう年等を考慮せず、簡易的に年齢を出力するものを書きました。
覚えていれば、うるう年等を考慮した式をDjangoに組み込んだものを追記します。