OmniAICreator/Qiita-1.07M huggingface dataset:
本日の微分方程式（10日目）

なんとなく脳トレがてら1日1問解説しようと思っただけです．飽きたらやめます．
これを執筆している本日は日曜日ということで，休憩回です．ちょっと簡単すぎるかもしれませんが，ご了承ください．

## 問題
微分方程式，
```math
\dfrac{\mathrm{d}y}{\mathrm{d}x}=f\left( \dfrac{y}{x} \right),
```
において， $u=\dfrac{y}{x}$ とおくことで，

```math
x=C\exp\left( \displaystyle\int\dfrac{\mathrm{d}u}{f(u)-u} \right)~~~(C\neq 0),
```

となることを示せ．なお， $x\neq 0, ~f(u)\neq u$ とする．

## ポイント
- $\exp(x)$ とは，$e^x$ のことです．

- $\dfrac{\mathrm{d}y}{\mathrm{d}x}=f\left( \dfrac{y}{x} \right)$ の形の微分方程式は同次形と呼ばれます．
    - 同次形については，ヨビノリさんの動画もご参照ください．

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

- $u$ は $x$ についての関数であることに注意してください．


## 発想

「示せ」と言われると「何から始めたらいいかわからない」状態になりますよね．
今回の問題を初見で解こうとした際の，とっかかりの発想は次のとおりです．

- 「示せ」と言われている対象が $x$ と $u$ だけで構成されているので，「$y$ を無くせばいいんだな」と予想できます．
- "$u=\dfrac{y}{x}$ とおくことで" と問題文側の司令がありますから，一旦右辺が $f(u)$ になることはわかります．
- 上記より，与式は $\dfrac{\mathrm{d}y}{\mathrm{d}x} = f(u),$ と変形できますが，$u, y, x$ と文字が3つ並び，なんだか余計難しくなったように思えます． 
-  ここで思考が止まっては勿体ないです．どうなるかはわかりませんが，一旦は「微分方程式を $u$ と $x$ だけの式にできないか？」に集中します．
- 右辺はバッチリなので，左辺 $\dfrac{\mathrm{d}y}{\mathrm{d}x}$ を頑張って $\dfrac{\mathrm{d}u}{\mathrm{d}x}$ で置き換えることを考えます． $u=\dfrac{y}{x}$ という関係がありましたから，$\dfrac{\mathrm{d}y}{\mathrm{d}x}=...$ を作るために「$y=ux$ の両辺を $x$ で微分してみようかな」と手が動けばベストです．

## 解説

$u=\dfrac{y}{x}$ とおくと $y=ux$ です．
ここで，両辺を $x$ で微分すると（$u$ は $x$ の関数であることに注意しましょう），

```math
\begin{align*}
\dfrac{\mathrm{d}y}{\mathrm{d}x} &= \dfrac{\mathrm{d}u}{\mathrm{d}x}\times x + u\times 1=x\dfrac{\mathrm{d}u}{\mathrm{d}x} + u,
\end{align*}
```

が得られます．ここで，積の微分 $\left(f(x)g(x)\right)^\prime = f(x)^{\prime}g(x)+f(x)g(x)^{\prime}$ を用いました．

これらを，問題文で与えられた微分方程式に代入して，

```math
\begin{align*}
x\dfrac{\mathrm{d}u}{\mathrm{d}x} + u&=f(u),\\
\dfrac{\mathrm{d}u}{\mathrm{d}x}&=\dfrac{f(u)-u}{x},
\end{align*}
```

と変形できます．また，問題文より $x\neq 0$ ですから，$x$ は分母にあって問題ありません．
さて，得られた式は $x$ と $u$ についての変数分離形です．問題文より， $f(u)\neq u$ ですから，左辺に $u$ ，右辺に $x$ をまるごと持っていき， $x$ で積分を行いましょう．

```math
\begin{align*}
\dfrac{1}{f(u)-u}\dfrac{\mathrm{d}u}{\mathrm{d}x}&=\dfrac{1}{x},\\
\int\dfrac{1}{f(u)-u}\dfrac{\mathrm{d}u}{\mathrm{d}x}\mathrm{d}x&=\int\dfrac{1}{x}\mathrm{d}x,\\
\int\dfrac{1}{f(u)-u}\mathrm{d}u&=\int\dfrac{1}{x}\mathrm{d}x,\\
\int\dfrac{1}{f(u)-u}\mathrm{d}u&=\log|~x~| + C_1~~~(C_1: 任意定数),\\
\log|~x~| &= \int\dfrac{1}{f(u)-u}\mathrm{d}u - C_1,\\
|~x~|&= \exp\left(\int\dfrac{1}{f(u)-u}\mathrm{d}u - C_1\right),\\
|~x~|&= \exp(-C_1)\times\exp\left(\int\dfrac{1}{f(u)-u}\mathrm{d}u\right),\\
x&= \pm\exp(-C_1)\times\exp\left(\int\dfrac{1}{f(u)-u}\mathrm{d}u\right),\\
x&= C\exp\left(\int\dfrac{1}{f(u)-u}\mathrm{d}u\right)~~~(C\neq 0).\\
\end{align*}
```
解答は以上です．
少しわかりにくいのは，$\exp(a+b) = \exp(a)\times\exp(b)$ の部分と，$C = \pm\exp(-C_1)\neq 0$ の部分でしょうか．
前者は，指数法則 $e^{a+b}=e^a\times e^b$ と全く同じ意味です．$e^{\int\frac{1}{f(u)-u}\mathrm{d}u}$ と書くと小さくて読みにくいので，横につらーっと書く表記法を用いております．

後者は，$y=\pm e^{-x}$ のグラフが， $y=0$ に漸近線をもつことを意味しております．つまり，$x$ が任意の実数をとるとき， $y=\pm e^{-x}$ は $y=0$ を通りません．

$y=\pm e^{-x}$のグラフは，以下のWolframalphaをご参照ください．

https://www.wolframalpha.com/input?i=y%3De%5E%28-x%29%2C+y%3D-e%5E%28-x%29&lang=ja
Pythonのグラフ描画での文字サイズ調整と関数引数の順序について

この記事は、Pythonでのグラフ描画における文字サイズ調整と、関数の引数の順序に関してとなります。

### 1. 散布図のx軸とy軸の目盛りの表示を大きくする方法
散布図のx軸とy軸の目盛りの表示を大きくするには、plt.xticks() および plt.yticks() を使用して目盛りのフォントサイズを変更します。

```
import matplotlib.pyplot as plt

# Define Display a scatter plots Function
def scatterplot(x, y, data, figsize=(48, 42), xlabel_fontsize=65, ylabel_fontsize=65, tick_fontsize=50):
    plt.figure(figsize=figsize, dpi=20)
    plt.scatter(data[x], data[y], alpha=0.8, s=1000, marker='o')
    plt.xlabel(x, fontsize=xlabel_fontsize)
    plt.ylabel(y, fontsize=ylabel_fontsize)
    
    # Set tick font size for x-axis and y-axis
    plt.xticks(fontsize=tick_fontsize)
    plt.yticks(fontsize=tick_fontsize)
    
    return plt.show()
```

### 2. sns.jointplot() 関数の引数の順序エラーの修正方法
Pythonでは、位置引数はキーワード引数の前に記述する必要があります。そのため、以下のようなコードではエラーが発生します。
```
sns.jointplot(x='Age', y='NFOGQ', subjects_df)
```
この問題を解決するためには、data パラメータに subjects_df を指定するように修正します。

```
import seaborn as sns

# Correlation between age and NFOGQ
sns.jointplot(x='Age', y='NFOGQ', data=subjects_df)
```
Pandasデータフレームのdf.rename()とdf.where()関数の解説

# Pandasデータフレームのdf.rename()とdf.where()関数の解説

Pythonのデータ分析ライブラリであるPandasには、データフレームの操作を容易にする多くの便利な関数が存在します。本記事では、`df.rename()` と `df.where()` という二つの関数について解説します。

## df.rename()関数

`df.rename()`関数は、データフレームの列名（カラム名）や行名（インデックス）を変更するために使用します。以下のコードは、`str.strip`関数を各列名に適用して、列名の両端にある空白文字を削除します。

```
df.rename(mapper=str.strip, axis='columns
```

ここで、

mapper=str.strip は、str.strip関数を各列名に適用します。この関数は、文字列の両端の空白文字を削除するために使用されます。
axis='columns' は、rename()関数が列名に対して作用することを指定します。
この操作により、列名が整形され、データ分析や前処理が行いやすくなります。

df.where()関数
df.where()関数は、条件に基づいてデータフレームの要素を選択するための関数です。条件に一致する要素はそのまま保持され、一致しない要素はNaNに置き換えられます。

基本的な使用法は以下のとおりです。

```
df.where(condition, other)
```

ここで、

condition は、データフレーム内の要素に適用する条件式です。この条件に一致する要素は、新しいデータフレームにそのままコピーされます。
other は、オプションの引数で、条件に一致しない要素に代入する値を指定します。デフォルトではNaNが使用されます。
以下のコードは、A列の値が3より大きい行のみを取得する例です。
```
filtered_df = df.where(df['A'] > 3)
```
これにより、条件に応じたデータフレームの要素の選択や置換が容易になります。

以上、Pandasのdf.rename()とdf.where()関数についての基本的な解説でした。これらの関数を使いこなすことで、データ分析がより効率的になります。
Google Bardにコーディング補助を頼む場合の精度を確認

# 挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
今回はGoogle Bardによるphpコード出力について簡単に試しましたので、その覚え書きになります。
 
# Google Bard
Googleが試験運用中の対話型 AI モデルで、2023/05/11に日本語に対応しました。（ただし、日本語対応はしたものの日本語による応答はやや精度に欠けるという評判です。）
そんなGoogle Bardですが「よくある質問」の項を見るとコーディングを手伝う、コーディングに関する質問に回答することを特徴としているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/a7eb9281-dbba-640f-3f4c-691350cc0cc6.png)
そこで、今回はphpのソースコードを出力してもらうことを試してみます。

# 実施内容
今回はpaiza（オンラインのプログラミング学習コンテンツ）を用いて、その演習課題をBardに出力してもらい、それをpaizaの採点システムに採点してもらいます。

## 単純な出力
まずは、paizaでも最初の演習課題である「Hello paiza」と表示させる問題に解答してみます。
paizaの問題画面（初期表示）:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/f3ff81c7-4753-f675-d610-d927310dd822.png)
Bardに入力した内容と回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/b962d49a-2462-0676-c96c-69fd2c84874f.png)
無事に設問内容を満たすphpのコードとその説明が出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/557a6e1e-2e82-a9ab-594c-c1282b3ea610.png)
出力されたコードを入力し採点をすると、問題ないことがわかりました。

## 単純な条件分岐
続いて、以下のpaizaの問題で条件分岐が必要な処理を出力してもらいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/709e0c2b-dbea-12cc-cf2d-8decb15b4861.png)
以下のように回答が得られ、採点の結果問題ないことがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/a246104b-a6c0-9048-bccb-e4af8e8089b9.png)

# ユークリッドの互除法
paizaの初等問題にユークリッドの互除法を実装する問題があります。その問題文を読み込ませ、Bardがどのようなソースコードを出力するか見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/e94eda1a-90c5-fd94-f43a-a4f3add5885b.png)
こちらは一見問題ないように見えるため、入出力部分を手動で付け足し動作確認機能で確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/bae43505-cbc5-4d05-5cc1-a46682dcf883.png)
すると、Runtaime errorが発生しています。よく見ると8行目の変数$bの$が欠けています。
そこで、手動で$を書き足し採点処理をしてもらうと、無事問題ないことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/dc403105-eaa3-3788-5508-dde7ea793bc5.png)


# まとめ
Google Bardは単純な処理やプログラミング問題のような前提が明確に指示ができていればおおよそ正しいコードを出力するようです。ただし、細かいミスは発生するようで、ユークリッドの互除法くらいの複雑度でもそのまま正しいコードが出力されないことがあります。
やはり公式文書にあるように「お手伝い」やコードの説明を頼むにとどめる方が賢明であるように思えます。
ちなみに、出力されたコードの誤りを指摘するようGoogle Bardに指示をしましたが、$のつけ忘れは指摘されませんでした。「お手伝い」をさせる場合にも、ある程度運用方法にコツのようなものが必要になりそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641357/bb71c12a-890d-7058-6932-c3d2ec1f7de0.png)
Pythonでグラフのビン数をスタージェスの公式で計算し、レイアウトを調整する

この記事では、Pythonで作成したグラフのビン数をスタージェスの公式に基づいて計算する方法と、複数のグラフのレイアウトを調整する方法を説明します。

## 1. スタージェスの公式とヒストグラムのビン数
スタージェスの公式は、データを分析する際にヒストグラムを作成するときの「ビン（bin）」数、つまりデータをいくつの区間に分けるべきかを推定するための公式です。

具体的には、データ数がn個のとき、ビン数kは以下の公式で推定します。

```
k = 1 + log2(n)
```
ここで、log2は底が2の対数を表します。この公式は、データ数が増えるにつれてビン数も増えることを示しています。

### なぜスタージェスの公式が必要なのか
ヒストグラムは、データの分布を視覚的に理解するのに非常に便利なツールです。しかし、ビン数をどう設定するかによって、ヒストグラムの形状は大きく変わります。ビン数が少なすぎると、データの細かい特徴を見落とすことになります。一方で、ビン数が多すぎると、ノイズによる影響が大きくなり、データの本質的な特徴を見誤る可能性があります。

スタージェスの公式は、このビン数を適切に設定するための一つの基準を提供します。データ数に応じて適切なビン数を自動的に決定することで、データの特徴を適切に捉えることができます。

ただし、スタージェスの公式が常に最適なビン数を提供するわけではありません。データの性質によっては、他の方法（例えば、平方根法、ライスの公式など）を用いた方が良い場合もあります。そのため、ビン数の設定はデータの性質を考慮した上で、適切な方法を選択することが重要です。

## 2. スタージェスの公式に基づいてビン数を計算する

以下のコードでは、Plotlyを使用して背景を白格子に設定し、KDEプロットを表示し、スタージェスの公式に基づいてビン数を表示するようにコードを変更しています。
```
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
from scipy.stats import gaussian_kde

def display_value_counts_bar(df, column, xaxis_title, yaxis_title, color='goldenrod'):
    value_counts = df[column].value_counts()

    fig = px.bar(x=value_counts.index, y=value_counts.values, color_discrete_sequence=[color])
    fig.update_layout(xaxis_title=xaxis_title, yaxis_title=yaxis_title)
    fig.show()

def display_histogram(df, column, color='goldenrod'):
    # Calculate the bin number using Sturges' formula
    bin_number = int(1 + np.log2(len(df[column])))

    fig = px.histogram(df, x=column, nbins=bin_number, color_discrete_sequence=[color])

    # Add KDE plot using scipy
    kde = gaussian_kde(df[column])
    x_range = np.linspace(df[column].min(), df[column].max(), 1000)
    kde_values = kde(x_range)
    
    fig.add_trace(go.Scatter(x=x_range, y=kde_values, mode='lines', name='KDE', line=dict(color='blue')))

    # Set background to white grid
    fig.update_layout(
        plot_bgcolor="rgba(255, 255, 255, 1)",
        xaxis_title=column,
        yaxis_title="Frequency",
        xaxis=dict(showgrid=True, gridcolor="rgba(200, 200, 200, 0.5)"),
        yaxis=dict(showgrid=True, gridcolor="rgba(200, 200, 200, 0.5)"),
        title="Distribution of " + str(column)
    )

    fig.show()
```
## 3. グラフ間のレイアウトを調整する
以下のコードでは、plt.subplots_adjust()を使ってサブプロット間のスペースを調整し、文字が重ならないようにしています。
```
import seaborn as sns
import matplotlib.pyplot as plt

features = ["UPDRSIII_On", "UPDRSIII_Off", "Age"]
labels = ["UPDRSIII_On", "UPDRSIII_Off", "Age"]

fig, axs = plt.subplots(nrows=3, ncols=1, figsize=(14, 13))

sns.set_style('darkgrid')

axs = axs.flatten()

sns.set_style('darkgrid')

for x, feature in enumerate(features):
    ax = axs[x]
    _ = sns.histplot(data=subjects, x
```
Pythonでデータフレームの列の値を基に円グラフを描画し、特定の部分を強調表示する

# Pythonで円グラフを描画し、特定の部分を強調表示する

Pythonの可視化ライブラリであるMatplotlibを使うと、簡単に円グラフを作成することができます。円グラフは、全体に対する各部分の割合を視覚的に理解しやすくするためのツールです。

今回は、データフレームの特定の列の値の頻度に基づいて円グラフを作成し、特定の部分を強調表示する方法を紹介します。

## 必要なライブラリのインポート

まずはじめに、必要なライブラリをインポートします。

```python
import matplotlib.pyplot as plt
import seaborn as sns
```
## 円グラフを描画する関数
以下に示す関数plot_frequency_pie_chartsでは、複数のデータフレームと列名を引数として受け取り、それぞれのデータフレームに対して指定された列の値の頻度に基づいた円グラフを描画します。
```
def plot_frequency_pie_charts(dataframes, column, titles, figsize=(8, 7)):
    fig, axs = plt.subplots(nrows=len(dataframes), ncols=1, figsize=figsize)
    axs = axs.flatten()

    for i, (df, title) in enumerate(zip(dataframes, titles)):
        counts = df[column].value_counts().to_dict()
        
        _ = axs[i].pie(
            x=list(counts.values()),
            autopct=lambda x: "{:,.0f} = {:.2f}%".format(x * sum(counts.values()) / 100, x),
            explode=[0.05] * len(counts.keys()),  # Update this line to include explode parameter
            labels=counts.keys(),
            colors=sns.color_palette("Set2")[0:len(counts.keys())],
        )
        _ = axs[i].set_title(f"Frequency of Values in {title}", fontsize=15)
    
    plt.tight_layout()
    plt.show()
```
円グラフの部分を強調表示する
円グラフの中で特定の部分を強調表示するには、explodeパラメータを利用します。explodeは、円グラフの各部分を中心から切り離す距離を指定します。これにより、強調したい部分を目立たせることができます。explodeの値を[0.05] * len(counts.keys())とすることで、すべてのパイの部分が同じ距離で切り離されるようにしています。

以上がPythonを使用した円グラフの作成と部分の強調表示の方法になります。

分析において、このような視覚化は非常に有用であり、特にカテゴリデータの分布を理解する際に役立ちます。

## 注意点

ただし、円グラフは使用する際に注意が必要です。円グラフは2つまたは3つのカテゴリで最も効果的であり、それ以上のカテゴリがある場合は棒グラフなど他のタイプのグラフを検討することをおすすめします。これは、多くのカテゴリがある場合、円グラフは視覚的に混乱しやすく、また各カテゴリの差を正確に理解するのが難しくなるためです。

## まとめ

Pythonの`matplotlib`ライブラリを使って、データフレームの特定の列の値の頻度に基づいて円グラフを作成し、特定の部分を強調表示する方法を紹介しました。円グラフは全体に対する各部分の割合を視覚的に理解しやすくするツールですが、多くのカテゴリがある場合は他のタイプのグラフを検討することも重要です。
Pandasを用いたデータフレームの操作：結合と重複率の計算

2つのデータフレームの結合を考える時に、共通のキー、ここではIdとしますが、それらが、どれだけ共通しているのかを確認する必要があると思います。もし、片方のデータフレームにしかないIdがある場合は、そのデータフレームのデータに関する取扱いを慎重に考慮しなければなりません。Pythonのpandasライブラリを使用して、2つのデータフレーム（ここでは DataFrame_AAAA と DataFrame_BBBB）を操作する方法を説明します。特に、データフレームの結合と、共通列（ここでは 'Id'）における重複率の計算について詳しく解説します。

#### データフレームの結合
```
# データフレームの結合
metadata = pd.concat([DataFrame_AAAA, DataFrame_BBBB], axis=0).reset_index(drop=True)
 ```
上記のコードでは、DataFrame_AAAAとDataFrame_BBBBのデータフレームを縦方向（axis=0）に結合します。デフォルトのaxisパラメータ値は0なので、axis=0を省略しても同じ結果になります。また、結合後のデータフレームは、reset_index(drop=True)を使ってインデックスをリセットし、元のインデックスは削除されます（drop=True）。これにより、新しい連番のインデックスが作成されます。

#### 重複するIdの調査
```
# Take the 'Id' column from data frames DataFrame_AAAA and DataFrame_BBBB and check for duplicate Ids.
common_key = pd.merge(DataFrame_AAAA['Id'], DataFrame_BBBB['Id'], on='Id')

# Show the number of duplicate IDs
print("Number of common IDs:", len(common_key))

# Show duplicate IDs
print("Common IDs:", common_key['Id'].tolist())
 ```

このコードでは、pd.merge()関数を使って、DataFrame_AAAAとDataFrame_BBBBの両方に存在するId列の重複している要素を調べます。結果は、common_keyという新しいデータフレームに格納されます。

#### 重複率の計算
```
# Calculate the total number of unique Ids in each data frame
total_unique_ids = len(set(DataFrame_AAAA['Id']).union(set(DataFrame_BBBB['Id'])))

#  Calculate the number of common Ids
num_common_ids = len(common_key)

#  Calculate the duplication rate
duplication_rate = num_common_ids / total_unique_ids * 100

#  Show the number of duplicate IDs
print("Number of common IDs:", num_common_ids)

#  Show the duplication rate
print("Duplication rate: {:.2f}%".format(duplication_rate))
 ```

このコードでは、まずDataFrame_AAAAとDataFrame_BBBBのデータフレームのId列から、それぞれのユニークなIdを集合（set()）に変換し、union()を使って和集合を計算し、その要素数をtotal_unique_idsに格納します。

次に、num_common_idsに重複するIdの数（len(common_key)）を格納し、duplication_rateを計算します。この値は、重複しているIdの数を全体のユニークなIdの数で割った値に100を乗じたものです。

最後に、重複するIdの数と重複率を表示します。重複率は小数点以下2桁まで表示するようにフォーマットしています（{:.2f}%）。

以上が、Pandasを用いたデータフレーム操作の一例です。PythonのPandasライブラリは、データ分析のための強力なツールです。データの結合や重複率の計算など、データの探索や前処理に役立つ機能が豊富に揃っています。ぜひ活用してみてください。
batファイル チートシート

## rem - コメントアウト
batファイルの中にコメントを記述する。
Windows系で使える。
 remark[^1]の略。

[^1]: コメント。reが強調、markが印をつけるという意味。

参考：
https://www.javadrive.jp/command/bat/index4.html

## type - ファイルの内容を表示
ファイルの内容を表示する。
複数ファイルの内容を表示するには、スペース区切りで指定する。

## more - ファイルの内容を表示
ファイルの内容を表示する。
typeと違い全量を表示しない。
スペースキーで続きを見る。

## more - ファイルの内容を表示
ファイルの先頭から内容を表示する。
デフォルトで10行を表示する。
・オプション
-n 行数　：表示する行数を指定する。




## Tabキー - オートコンプリート
ファイルやフォルダ名を自動で補完してくれる。
sweetalert2で出したウィンドウを自動的に消した後になにか処理を入れる（メモ）

個人開発でLINEボット(https://qiita.com/skyfish20ch/items/7e0ec382292fa660f8d5)を作っています。


しばらく何もしていなかったのですがherokuの無料枠がなくなるタイミングで、エンジニアの端くれとして
自分のWEBサーバーくらい持っててもいいかもと思い、課金をしました。

そこでまた手を入れていこうとしたときに、ユーザーが投稿した情報に「いいね」とか「コメント」とか
残したいなと思ったときに、javascriptがあんまりわからないのでページの遷移で対応しようかと思ったのですが
著しく操作性が落ちるので、、

どうしようかと思った時に、javascriptのpromotで良いんじゃないかとやってみたらデザインが、、、

そこで行き着いたsweetalert2！

タイマー値をセットすれば自動で消えるし、HTMLでメッセージとか書けるし最高ですね

よくSNSで「いいね」した時に、ポッと♥が出て消えるみたいなのやりたかったのでそのメモです

```javascript:sa2.js 
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>

	Swal.fire({
		width:"8em",//ウィンドウの横幅
  		html: '<font color=red size=5>♥</font><br><font size=2>LIKE!</font>',
		showConfirmButton:false,//デフォルトで出ているconfirmボタンを隠す
		timer:"800",//８００ms後に自動で消す
		willClose: () => {
        	//ここにウィンドウが消えた後の処理をいれる
		}
	});
```

こんな感じです。
RubyでAtCoder ABC259(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC259のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Growth Record
https://atcoder.jp/contests/abc259/tasks/abc259_a
```ruby:a-259.rb
n, m, x, t, d = gets.split.map(&:to_i)
puts x <= m ? t : t - ((x - m) * d)
```
## 解説
X歳からN歳までは身長は変わらないので、X<=MであればそのままTを出力します。一方、M<Xであれば、X-M回分Dcm伸びた結果Tcmになったということを考え、計算することで答えを求めることができます。

# B - Counterclockwise Rotation
https://atcoder.jp/contests/abc259/tasks/abc259_b
```ruby:b-259.rb
a, b, d = gets.split.map(&:to_i)
r = Math.sqrt(a ** 2 + b ** 2)
theta = Math.atan2(b, a)
theta += d * Math::PI / 180
puts "#{r * Math.cos(theta)} #{r * Math.sin(theta)}"
```
```ruby:別解
a, b, d = gets.split.map(&:to_i)
theta = d * Math::PI / 180
puts "#{a * Math.cos(theta) - b * Math.sin(theta)} #{a * Math.sin(theta) + b * Math.cos(theta)}"
```
## 解説
（公式解説を参考にしました）

距離を求め、逆三角関数から角度を求めます。そして、dをラジアンに変換して角度θに足し、sin、cosを使うことで移動後の点を求めることができます。

# C - XX to XXX
https://atcoder.jp/contests/abc259/tasks/abc259_c
```ruby:c-259.rb
# 修正前
def f(str)
  array = []
  count = 1
  str.size.times do |i|
    if str[i] != str[i + 1]
      array << [str[i], count]
      count = 0
    end
    count += 1
  end
  return array
end

s = gets.chomp
t = gets.chomp
ss = f(s)
tt = f(t)
if ss.size != tt.size
  puts "No"
  exit
end

ss.size.times do |i|
  if ss[i][0] != tt[i][0]
    puts "No"
    exit
  else
    if (ss[i][1] == 1 && tt[i][1] > 1) || ss[i][1] > tt[i][1]
      puts "No"
      exit
    end
  end
end
puts "Yes"

```
```ruby:c-259.rb
# 修正後
def f(str)
  array = []
  str.scan(/((.)\2*)/).each { |factor| array << [factor[1], factor[0].size] }
  return array
end

s = gets.chomp
t = gets.chomp
ss = f(s)
tt = f(t)

if ss.size != tt.size
  puts "No"
  exit
end

ss.zip(tt).each do |factor1, factor2|
  if factor1[0] != factor2[0] || factor1[1] > factor2[1] || (factor1[1] == 1 && factor2[1] != 1)
    puts "No"
    exit
  end
end
puts "Yes"
```
## 解説
（公式解説を参考にしました）

最初に、連続する文字で同じものの数（例えば、aaaならa3）に置き換えるメソッドを定義します。そして、条件として「文字が一致しているか」「ssにおけるそれぞれの文字数がttにおけるそれぞれの文字数を超えていないか」を調べることで実装することができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
lazeの作法 その4

# 概要
lazeを見つけたので、やってみた。
再帰、やってみた。

# サンプルコード

```
function: hanoi(int: n, int: a, int: b, int: c) => () {
	if (n > 0)
	{
		hanoi(n - 1, a, c, b);
		string: s = "";
		s += n;
		s += " = ";
		s += a;
		s += " -> ";
		s += c;
		print(s);
      	hanoi(n - 1, c, b, a);
	}
}
function: main() => () {
	hanoi(3, 0, 2, 1);
}
```

# 実行結果

```

1 = 0 -> 1
2 = 0 -> 2
1 = 2 -> 0
3 = 0 -> 1
1 = 1 -> 2
2 = 1 -> 0
1 = 0 -> 1

```

以上。
新しくフレームワークを学ぶときに、とりあえず調べる７つのこと。

こんにちは、松井です。

私ごとですが、
最近、新しくフレームワークを学ぶことが増えました。

Symfony、CakePHP、Flutter、Ionic、Flask、などなど、、。

いくつか学んでいるうちに、
**「開発に入っていくためには、
　とりあえず、これは分からんと話にならんな！」**
というものがわかってきたので、ちょっとまとめていきます。

ぶっちゃけ、どれも超基本的なことです。

そして、超基本だからこそ、100％明々白々にしとかないと、
開発の最中に何度も何度も、詰まることになって、（徐々に）大きなストレスとなります。

今回調べることは、紙１枚にまとめておいて、
（初期の）開発のお供にするのが、おすすめです！
　
## 前提

最近のフレームワークは、何らかのカタチで
MVCになっていると思うので、その前提で話を進めてゆきます。

## ７つのポイント

1. ルーティングの仕方
    - Controllerをどのように呼び出すのか？
2. Viewの形式 （画面の作り方）
    - 何で作られるのか？（ex. HTML、jsp、twig、ctp）
3. View ⇄ Controllerの繋がり方 （ページ遷移の仕方）
    - Controllerから、Viewをどのように呼ぶのか？
	- Controllerから、Viewにどのように値を渡すのか？
	- Viewから、Controllerにどのように値が返ってくるのか？
4. DBアクセス
	- Select、Insert、Update、Deleteは、どうやってやるのか？
5. DBマイグレーションの方法
    - DBテーブル変更時は、どのような手順が必要なのか？
6. 設定ファイルの使い方
    - 設定ファイルの場所、書き方、呼び出し方。
7. デバックの仕方
    - 色々言ったけど、これが一番大事かもしれん。

## 僕は、こんな感じにノートにまとめています。

少し話はそれますが、僕は、こんな感じにノートにまとめています。

先ほどあげた７つのポイントを含め、
調べてわかったことは、どんどん書き込んでいきます。
（とはいえ、使わないことを書いても仕方ないので、書くことの取捨選択は重要です）

![IMG_20230514_155857.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406290/67dea0d1-275a-c661-a92c-fd9cfbf80a0a.jpeg)

## １ページにまとめることの重要性

知識は、バラバラなままでは、何の役にも立ちません。

最近、大学受験の本を読んだのですが、そこではこのようなことが書かれていました。

> **勉強は掃除と似ています。**
>
> せっかく物をたくさん買い集めても、
> どこに何が収納されているか、わかっていなかったら、
> いざという時に使いませんよね。
> 
> 「あれ、あの洋服どこに入れたっけ？」
> 
>  となって、結局、なにひとつ役に立たないのです。
> 
> 
> これと同じく、
> **どれだけ勉強しても、知識は凝縮していかないと、使いものになりません。**
> 
> 勉強しても勉強しても、成績が伸びない
> 多くの原因は、知識が整理されていないからなのです。

分からないことが発生したら、
その都度その都度調べることになると思います。

そして、その調べたことは、１ページに凝縮させていくことが大切です。

　

バラバラに、調べたことをまとめて、

「前に調べた、あのメモ、どこいっちゃったけ、？」

と言って、せっかくのエネルギーがもったいないです。

　

本来、プログラマーが集中すべきことは、プログラムの構文を思い出すことでも、
フレームワークのルールを思い出すことでも、ないはずです。

## 最後に

これから、（または、今現在、）
新しくフレームワークを学んでいく方は、
今回紹介したポイントをおさえつつ、勉強していくと、
フレームワーク習得がスムーズになると思います！

ぜひ、調べた結果を、紙１枚にまとめておき、開発のお供にしてください！

では、ここまで読んでいただき、ありがとうございました！
PyMySQLでSQLインジェクション対策を実施する方法

## 概要

対象SQLのようなクエリをPyMySQLを使いSQLインジェクション対策実施した上で実行する方法について書いています

## 方法

### 対象SQL

#### 単純なクエリの場合

**SQL**
```sql
SELECT content
FROM article_cache
WHERE
crawl_jobid = '1111'
```

**Python**
```python
import pymysql
from pymysql.cursors import DictCursor

# MySQLに接続
connection = pymysql.connect(
    host='your_host',
    user='your_username',
    password='your_password',
    db='your_database',
    charset='utf8',
    cursorclass=DictCursor
)

# 対象の値
crawl_jobid = '1111'

try:
    with connection.cursor() as cursor:
        sql = f"""
        SELECT content
        FROM article_cache
        WHERE
        crawl_jobid = %s
        """

        # クエリの作成
        query = cursor.mogrify(sql, (crawl_jobid)) 

        # クエリ実行
        cursor.execute(query)

        # 結果の取得
        result = cursor.fetchall()

finally:
    connection.close()
```

#### IN句の場合

**SQL**
```sql
SELECT content
FROM article_cache
WHERE
crawl_jobid IN ('1111','2222','3333','4444')
```

**Python**
```python
import pymysql
from pymysql.cursors import DictCursor

# MySQLに接続
connection = pymysql.connect(
    host='your_host',
    user='your_username',
    password='your_password',
    db='your_database',
    charset='utf8',
    cursorclass=DictCursor
)

# 対象の値
crawl_jobids = ['1111', '2222', '3333', '4444']

# 対象の値に数だけプレースホルダを作成
format_strings = ','.join(['%s'] * len(crawl_jobids))

try:
    with connection.cursor() as cursor:
        sql = f"""
        SELECT content
        FROM article_cache
        WHERE
        crawl_jobid IN ({format_strings})
        """

        # クエリの作成
        # リストの各要素を個別の引数として渡すため変数の先頭に「*」をつけています
        query = cursor.mogrify(sql, (*crawl_jobids)) 

        # クエリ実行
        cursor.execute(query)

        # 結果の取得
        result = cursor.fetchall()

finally:
    connection.close()
```

#### ORを使い複数指定する場合

**SQL**
```sql
SELECT content
FROM article_cache
WHERE
message LIKE '%' || 'aaaa' || '%' OR message LIKE '%' || 'bbbb' || '%' OR message LIKE '%' || 'cccc' || '%')
```

**Python**
```python
import pymysql
from pymysql.cursors import DictCursor

# MySQLに接続
connection = pymysql.connect(
    host='your_host',
    user='your_username',
    password='your_password',
    db='your_database',
    charset='utf8',
    cursorclass=DictCursor
)

# 対象の値
search_terms = ['aaaa', 'bbbb', 'cccc']

# 対象の値に数だけプレースホルダを作成
like_strings = " OR ".join(["message LIKE %s" for _ in search_terms])
search_terms = ["%" + term + "%" for term in search_terms]

try:
    with connection.cursor() as cursor:
        sql = f"""
        SELECT content
        FROM article_cache
        WHERE
        {like_strings}
        """

        # クエリの作成
        # リストの各要素を個別の引数として渡すため変数の先頭に「*」をつけています
        query = cursor.mogrify(sql, (*search_terms)) 

        # クエリ実行
        cursor.execute(query)

        # 結果の取得
        result = cursor.fetchall()

finally:
    connection.close()
```
Python Pandasで特定の列をダミー変数化する方法

#### 問題
Pythonでデータフレームintegrated_dataの質的変数をダミー変数にしたく、以下のコードを実行するもエラーが出ました。
```
# ダミー変数
df = integrated_data
integrated_data = pd.getdummies(df, drop_first=True)
```
エラーは以下の通りです。
```
AttributeError: module 'pandas' has no attribute 'getdummies'
```
#### 解決策
エラーの原因は、pd.getdummies()の関数名が正しくないためです。正しい関数名はpd.get_dummies()です。以下のように修正してください：

```
# ダミー変数
df = integrated_data
integrated_data = pd.get_dummies(df, drop_first=True)
```
これで質的変数をダミー変数に変換することができます。

#### 特定の列だけをダミー変数化する
データフレーム integrated_data の特定の列 Type に対してのみダミー変数化を行いたい場合は、以下のようにコードを修正してください。

```
# ダミー変数化
type_dummies = pd.get_dummies(integrated_data['Type'], prefix='Type', drop_first=True)
```

```
# ダミー変数を元のデータフレームに結合
integrated_data = pd.concat([integrated_data.drop('Type', axis=1), type_dummies], axis=1)
```
このコードでは、まず Type 列に対してダミー変数化を行い、それを type_dummies に格納します。次に、Type 列を元のデータフレームから削除し、type_dummies を元のデータフレームに結合しています。これで、Type 列に対してのみダミー変数化が実行されます。

以上がPythonで特定の列をダミー変数化する方法についての説明です。この方法を使うことで、特定の質的変数をダミー変数化して、分析に利用することができます。
いつも忘れるGitHubのトークン生成

## はじめに
年々記憶力が低下してるのでメモ！
公式にも書いてるよ
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#fine-grained-personal-access-token-%E3%81%AE%E4%BD%9C%E6%88%90

## 手順
ProfileのSettingsから`Developer settings`をポチる
![Cursor_と_Your_Profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/46d622cf-efc1-bf59-9c0c-8153e2ef4fec.png)

https://github.com/settings/profile


あとは作るだけ。
- Tokens
    - Generate new token
        - 良い感じに権限をぽちぽち
            - 1行で収まる程度のトークンが生成されるのでコピる

これをpullとかpushするときに聞かれるYourPasswordに入れてあげればOK！


まじでこのページに辿り着くまで10分くらいかかったぜ。。
![Personal_Access_Tokens__Classic_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/f5ce64ad-93b0-d214-7092-ae5562ae3291.png)

https://github.com/settings/tokens

## おわりに
公式もChatGPTも偉大だけど、脳のメモリが逼迫されてる時は己のメモに限りますね！

簡単ですが以上です:hugging:
PythonのSeriesのfloat64をint64に変換する方法

### はじめに
Pythonのデータ分析ライブラリであるpandasでは、Series内のデータタイプを変換する方法が用意されています。本記事では、float64からint64に変換する方法と、NaN（非数値）や無限大（inf）などの非有限値が含まれているときの対処法について紹介します。

#### 基本的な変換方法
pandasのSeriesに対して、データタイプを変更するにはastype()関数を使います。以下に、float64からint64に変換する基本的な方法を示します。

```
import pandas as pd

# float64のSeriesを作成
data = pd.Series([1.0, 2.5, 3.7, 4.2])

# float64からint64に変換
int_data = data.astype('int64')

print(int_data)
```
このコードは、float64のSeriesをint64に変換し、結果を表示します。ただし、この方法では、小数部分が切り捨てられることに注意してください。切り上げ、四捨五入などの異なる変換方法が必要な場合は、numpyの関数を使って適用してからastype()関数でint64に変換してください。

#### 非有限値が存在する場合の対処法
float64からint64への変換を行う際、Series内にNaN（非数値）または無限大（inf）などの非有限値が存在すると、IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integerというエラーが発生します。この問題を解決するには、欠損値（NaN）を処理する必要があります。

#### 欠損値を削除する
dropna()を使ってデータを削除する方法です。以下のように実行します。

```
subjects = subjects.dropna(subset=['Visit'])
subjects['Visit'] = subjects['Visit'].astype('int64')
```
#### 欠損値を他の値で置き換える
fillna()を使って欠損値を他の値で置き換える方法です。例えば、以下のように0で置き換えることができます。


```
subjects['Visit'] = subjects['Visit'].fillna(0).astype('int64')
```
欠損値の処理方法はデータと分析目的に応じて適切な方法を選択してください。

### まとめ

本記事では、Pythonのpandasライブラリを使用して、Seriesのfloat64をint64に変換する方法について説明しました。また、データ内に非有限値が存在する場合のエラー対処法についても触れました。データの前処理はデータ分析作業の重要な一部であり、データのタイプを正しく理解し、適切に処理することが求められます。非有限値や欠損値の存在は常に注意が必要で、その対処法を知っておくことは大変重要です。

それでは、次回のデータ分析作業での成功を祈っています。Happy coding!
Windowsのスタート画面にショートカットが表示されない

# 問題
Gitのホームディレクトリをよく使うところに設定するため，Git Bashのショートカットをコピーしてプロパティから作業フォルダの項目を編集した．
（以下の画像）
![スクリーンショット 2023-05-14 142256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3382868/c0db94fd-f4d2-06ae-f633-93274946d3bb.png)

このショートカット自体は完成したが，いざスタートメニューに登録すべくスタートメニューフォルダー`C:\ProgramData\Microsoft\Windows\Start Menu\Programs`に移動させてもスタートメニューに表示されない．

# 解決策
時間が解決してくれた．しばらく待ってみてもいいかも．
[C++] 10進数数値を2進数文字列に変換する(2パターン)

タイトルにある通り、整数型の数値を2進数表記(文字列)に変換する方法を2つご紹介する。

## 1. bitset

bitset についてはこちら。

https://cpprefjp.github.io/reference/bitset/bitset.html

```conv_bitset.cpp
#include <iostream>
#include <bitset>
using namespace std;

int main(void){
    cout << "数値を入力してください:";
	long long n;
	cin >> n;

	bitset<60> bs(n);
	cout << bs << endl;
}
```

```sh
# コンパイル
$ g++ conv_bitset.cpp

#実行(数値として 123456789 を入力)
$ ./a.out
数値を入力してください:123456789
000000000000000000000000000000000111010110111100110100010101
```

## 2. format

format についてはこちら。

https://cpprefjp.github.io/reference/format/format.html

```conv.format.cpp
#include <iostream>
#include <format>
using namespace std;

int main(void){
    cout << "数値を入力してください:";
	long long n;
	cin >> n;

	string s = format("{:0>60b}", n);// 60桁の2進数表記で、'0'で左詰めする
	cout << s << endl;
```

```sh
# コンパイル
$ g++ conv_format.cpp

#実行(数値として 123456789 を入力)
$ ./a.out
数値を入力してください:123456789
000000000000000000000000000000000111010110111100110100010101
```

### format は C++20 から導入された、新しい機能である

コンパイル時、`fatal error: format: No such file or directory` のようなエラーが出たら、お使いの環境が C++20 より古い可能性がある。

以下で導入方法を簡単に説明する。

### 前提

- M1 Mac
- C++ コンパイラ: g++

### format が利用可能な g++ バージョン確認

[こちらのページ](https://en.cppreference.com/w/cpp/compiler_support#cpp20) にて、`GCC libstdc++` の列、 `Text formatting` の行のところを見ると、`13` となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/54954049-6e36-c62f-c9ce-63bbf8b73fa4.png)

### マシンの g++ バージョン確認

```sh
$ g++ --version
#g++ (Homebrew GCC 11.x.x) 11.x.x (x の部分は忘れました)
```

### g++ 13 のインストール

```sh
$ brew install gcc@13
$ g++ --version
#Apple clang version 14.0.0 (clang-1400.0.29.202)
#Target: arm64-apple-darwin21.6.0
#Thread model: posix
#InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

コンパイラが Clang に設定されてしまった。
Mac では、デフォルトの g++ コンパイラが Clang らしい?ので、g++ をコンパイラとして設定しなくてはならない。
このバージョンアップ以前にも g++ を使用していたが、その際にも設定は行っていたが、どうやら g++ のバージョンを上げたことでデフォルトしてしまったらしい。

g++ をコンパイラとして設定するには、シンボリックリンクを該当のフォルダへ貼る。

```sh
$ ln -s /opt/homebrew/bin/g++-13 /usr/local/bin/g++
```

M1 Mac での homebrew 

```sh
$ g++ --version
#g++ (Homebrew GCC 13.1.0) 13.1.0
#Copyright (C) 2023 Free Software Foundation, Inc.
#This is free software; see the source for copying conditions.  There is NO
#warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$which g++
#/usr/local/bin/g++
```

無事 g++ 13 がインストールされた。

### コンパイル

```sh
$ g++ conv_format.cpp
# ...error: 'format' was not declared in this scope
```

このエラーはコンパイル時に C++20 であることを伝えることで解消される。

```sh
$ g++ -std=c++20 conv_format.cpp

#実行(数値として 123456789 を入力)
$ ./a.out
数値を入力してください:123456789
000000000000000000000000000000000111010110111100110100010101
```

bitset の場合と同様の出力結果となった。


## まとめ

bitset でも format でも一度設定すればコード量も変わらないが、format はさまざまなフォーマティングに対応しているので、みて見ると面白いかもしれない。



## :book: 参考にさせていただいた記事

https://qiita.com/Yossy_Hal/items/e204c3fb8f86722ee9db
Kaggleカーネルのメモリ制限を対処する5つの方法

本記事では、Kaggleカーネルで発生する可能性のあるメモリ制限問題について解説します。Kaggleのカーネルはデフォルトで16GBのRAMを提供していますが、これを超えるとメモリエラーが発生します。そこで、以下にその問題を解決するための5つの手法を提案します。

#### 1. データの読み込みを最適化する

大きなデータセットを扱う際には、不要な列を削除したり、データ型を適切に選択することでメモリ使用量を削減することが可能です。例えば、整数型の列に対してはint8やint16を用いると、int64と比べてメモリ使用量を大幅に減らすことができます。

#### 2. データの分割

データセットが大きすぎる場合、一度に全てのデータをメモリにロードするのではなく、分割して逐次的に処理することが有効です。この方法を用いると、一度にメモリにロードされるデータ量が減少し、メモリ使用量を制御することができます。

#### 3. メモリ使用量を監視する

Pythonのgc.collect()関数を使用して不要なメモリを解放するだけでなく、psutilライブラリを用いてメモリ使用量を監視することも重要です。これにより、メモリ消費が多い箇所を特定し、適切に対処することが可能になります。

#### 4. モデルのサイズを調整する

使用するモデルのサイズを小さくする、またはモデルの構造を調整することで、メモリ使用量を抑制することができます。例えば、深層学習の場合、ネットワークの層を減らす、またはノード数を減らすことでメモリ使用量を抑制することが可能です。

#### 5. KaggleのGPUカーネルを利用する

KaggleのGPUカーネルを利用することで、メモリ制限を緩和し、GPUの高速な計算能力を利用することができます。しかし、GPUカーネルは一日あたりの使用時間制限があるため、使用時間の計画を適切に立てることが重要になります。
【Azure5000万円無償】海外VCで評判がすこぶるいいマイクロソフトの新しいスタートアップ支援プログラム

マイクロソフトが新しい、スタータップ向けの支援プログラム **Microsoft for Startups Pegasus Program** を発表したので公式情報をもとにまとめてみた。

https://www.microsoft.com/ja-jp/startups/pegasus

# Microsoft for Startups Pegasus Program とは
Microsoft for Startups Pegasus Programとは、成長段階のスタートアップをMicrosoftの主要な顧客数千社につなげるプログラムであり、Microsoft for Startups Founders Hub（※）の延長として、**AI**、**ヘルスケア**、**ライフサイエンス**、**サイバーセキュリティ**、**小売業**などの業界ですでに製品市場適合性を達成したスタートアップに対し、追加的な支援を提供し、売上を増加させる。このプログラムはマッチメーカーとして機能し、ビジネスの課題を抱えるエンタープライズ顧客を特定し、それらに適したスタートアップのソリューションとつなげます。試験段階では、このプログラムがすでに100社以上のスタートアップにエンタープライズの顧客を紹介し、平均取引規模は350,000ドルです。

**今話題のLangChainもこのPegasus Programに参加している**

https://blog.langchain.dev/langchain-expands-collaboration-with-microsoft/

>Microsoft とより緊密に連携することで、Azure エコシステムが提供するエンタープライズ保証を備えた AI に対する当社のコミットメントに応える、より深い製品統合を共通のお客様に提供できることを嬉しく思います。また、LangChainが **Microsoft for Startups Pegasus Program** に参加したことも発表します。

つまり、 **スタートアップの売上を伸ばすことに重きを置いたプログラム**である。

>Commerce.AIの創設者兼CEOのAndy Pandharikarは「多くのスタートアップがエンタープライズセールスに苦労しています。Microsoft for Startupsと協力することで、エンタープライズの顧客が新しい革新的な製品をどのように見て、購入するのかを理解することができ、このプログラムを通じて、ほぼ100万ドルの取引を成立させることができました」と述べています。

このプログラムは現在、**招待制**で、私たちはMicrosoftの技術を使用してサービス構築をしているFounders Hub Comunityのスタートアップから招待をしている。

※ **[Microsoft for Startups Founders Hub](https://speakerdeck.com/daikikanemitsu/microsoft-for-startups-founders-hub-new-offer)とは？** 公開資料より引用
<script defer class="speakerdeck-embed" data-id="76b9ea32b32a471abc8f4a3b37b29f46" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

# どのようなサポートがあるか？

**機会の創出**：
プログラムに選ばれたすべてのスタートアップは、業界の専門家からサポートを受け、セクター内での販売機会を創出し、信頼できるアドバイザーとして行動します。
**市場投入サポート**：
スタートアップはMicrosoftの市場投入専門家と協力して、取引の生成と開発のための最良のリソースを確保します。
**Microsoftの技術へのアクセス**：
スタートアップは、専用のCloud Solution Architect (CSA)から技術的成功をサポートを受け、AzureのAIオファリングへの優先アクセス (GPU優先アクセス)、そして**最大350,000ドル**の技術クレジット（Azure：**Azure OpenAI Service**を含む）、およびGitHub、LinkedInを得ることができます。CSAは、スタートアップが技術的にエンタープライズ顧客とエンゲージする準備ができていることを確認し、コンプライアンスとセキュリティチェックを容易にし、アーキテクチャに関するアドバイスを提供するための窓口となります。

>Merckのエグゼクティブディレクター兼主任科学者であるGeof Hanniganは、「Merckでは、デジタルライフサイエンス技術の革新を求めています。Pegasusプログラムのようなエンタープライズ対応スタートアップと働くことは、薬物の発見と開発を進めるデジタル技術を開発する上で重要です」と述べています。
# 最後に
ここまでスタータップに対して手厚いサービスを提供していることは過去のマイクロソフトからは考えられない。Microsoft for Startups Founders Hubそして、Microsoft for Startups Pegasus Program ともに今後のアップデートが楽しみ。

参考リンク
[Unlocking opportunities by bridging the gap between startup solutions and enterprise challenges](https://startups.microsoft.com/blog/connecting-startups-to-customers-with-the-microsoft-for-startups-pegasus-program)
[Microsoft for Startups Pegasus Program](https://www.microsoft.com/en-us/startups/pegasus)
SwiftUIでWebを表示する方法


```Swift


import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    let url: URL

    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        return webView
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        let request = URLRequest(url: url)
        uiView.load(request)
    }
}



struct ContentView: View {
    var body: some View {
        WebView(url: URL(string: "https://www.example.com")!)
            .edgesIgnoringSafeArea(.all)
    }
}
```
ChatGPTにPDFを読み込ませてみた

PDFで資料をもらった時に、ページ数が多い場合にどこが重要か知りたい場合があり
ChatGPTにPDFを読み込ませて要約したり、分からないワードがあれば補足してくれることができないかと思い検討してみた。
個人の責任でお願いします

# URLを使う
PDFがWEB上にある場合に、ChatGPTの入力フォームにPDFのURLを貼り付けてChatGPTにPDFを参照してもらう方法です。
ChatGPTにWEBデザイン(HTML/CSS）を依頼する時に同じ方法をとったことがあります（質問内容によっては回答してくれないこともありますが）

最近、日本の農業が熱いので（個人的感覚）、農林水産省が発行している食料・農業・農村白書の一部をChatGPTに要約してもらいました。
![スクリーンショット 2023-05-14 13.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/012543bb-4891-f50d-d521-9eb6767c3204.png)

約17GBの白書全体を読み込んでもらった時には即レス要約することができましたが、ファイルサイズが大きい場合は分割することが必要そうです。


# PDFをテキストファイルに変換する
ChatGPTはLLMなのでテキストに強いシステムなので、テキストで渡した方が相性が良いです。
GoogleのサービスでPDFを開き、.txt形式に変換したり、PDF変換ツールを使うことでテキストファイルに変換できます。


# あとがき
今回は書いたもののPDFのテキストを全コピーしてChatGPTに貼り付ければ済む話を書きながら思う...
グラフがあれば今回のようなことが重要かと思います。

p.s.
Qiitaが自動保存に対応しました。
プレゼンのセリフはAIに考えさえろ!?

# 解説
- プレゼン資料を{documemt}に代入することでセリフを作成してくれます
- 以下の制約事項に遵守することを指示しています
    - {document}に書かれている内容からセリフを考えること
    - 挨拶や感謝の言葉は使わないこと
    - {document}から言語を推測し、その言語で回答すること

# プロンプト
```:プロンプトテンプレート
Please prepare a presentation script to illustrate the Powerpoint document, adhering to the following constraints 

#Constraints
 ・Be brief and concise, using just only the information in the document
 ・Explaining without saying hello or thank you
 ・Infer the language from the document and create in that language 

document："""
{document}
""" 
script：
```

試しに、[20230217_AIの進化と日本の戦略_松尾研.pdf](https://note.com/api/v2/attachments/download/a29a2e6b5b35b75baf42a8025d68c175)からセリフを考えさせてみます。

## 入力例
```
Please prepare a presentation script to illustrate the Powerpoint document, adhering to the following constraints 

#Constraints
 ・Be brief and concise, using just only the information in the document
 ・Explaining without saying hello or thank you
 ・Infer the language from the document and create in that language 

document："""
ビッグテックの大規模化への競争

• 2020.7 GPT-3 by OpenAI （1750億パラメータ）
• 2021.12 Gopher by DeepMind （2800億パラメータ）
• 2022.5 Open Pretrained Transformer (OPT) by Meta （1750億パラメータ）
• 2022.4 Pathways Laguage Model (PaLM) by Google （5400億パラメータ）
• 完全に規模の戦争に。冗談がなぜ面白いかを解説することもできる。
""" 
script：
```

## 出力例
```
ビッグテック企業の間で大規模化への競争が繰り広げられています。

2020年7月にはOpenAIがGPT-3を発表しました。GPT-3は1750億パラメータを持つモデルです。それから、2021年12月にはDeepMindがGopherというモデルを2800億パラメータで開発しました。

2022年5月にはMetaがOpen Pretrained Transformer（OPT）を1750億パラメータで公開し、2022年4月にはGoogleがPathways Laguage Model（PaLM）を5400億パラメータで発表しました。

これらの企業は規模を追求する競争を展開しています。冗談でさえもなぜ面白いのかを説明することができるほど、規模の戦争が進んでいるのです。
```

# あとがき
年表もうまく説明してくれていますね。プレゼン準備のためにセリフを考える手間がなくなりそうです。
このまま自分の合成音声に読ませれば、いよいよプレゼンも不要ですね。
Ubuntu22.04 セットアップ（Docker, fish, vscode, Proxy）

# 目的
古いPCをUbuntuPCにしたときの個人的なメモ。
このPCはweb系を触るために使う予定。
追記予定

# やったこと
## ubuntuのインストール
USBブートでインストールした。イメージダウンロードしてきてRufus?で作った。
BIOSでbootの優先順位を変えるの忘れずに。
言語は日本語。キーボードレイアウトは好み的にJIS。
ユーザー名とか設定したら最初に出てくるソフトウェアアップデートを実行。
そんでreboot。


## bash -> fish
補完機能やプラグインが優秀なfishを使うようにします。
こちらの記事を参考にしました。

https://shoalwave.net/develop/2022052927273/

ubuntuにはcurlコマンドが標準搭載されいていないため、インストールしてない人は
```shell
sudo apt install -y curl

```
でインストールしましょう。
あとは参考記事のように
```bash:Terminal
sudo apt install -y fish
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
which fish
chsh #whichで出てきたパスを入力
```
プラグインを使用する場合、標準フォントだと99.99%文字化けする。
そこで推奨されているpowerline系のフォントをインストールする。
```bash:Terminal
git clone https://github.com/powerline/fonts.git
./fonts/install.sh
rm -rf ./fonts
```
ここまで実行したらPCを再起動。
Terminalでfishが実行されているのが確認できたら、Terminal上で右クリックして、
Preferences->Profiles->text->Custo fontからPowerline系のフォントを選択しましょう。
ここまでできたらfisher使ってTerminalのテーマ変えたり、便利なプラグインいれていきましょう。

https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md

https://futurismo.biz/archives/6087/

## vscodeのインストール
使い慣れたvscodeをインストールする。
公式を参考にして、.debファイルからインストールする方法でやった。

https://code.visualstudio.com/docs/setup/linux

```shell:Terminal
sudo apt install ./Downloads/code_1.78.2-1683731010_amd64.deb
```
Terminalでcodeコマンドを実行してvscodeが実行できたら成功。

## Dockerのインストール
インストールスクリプトを使ってインストールします。
```bash:Terminal
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo docker run hello-world
```
hello-worldが表示されたら成功。
でも、このままだとdockerコマンドを実行するのにsudoが必須になるので
```bash:Terminal
sudo groupadd docker
sudo usermod -aG docker $USER
```
ここまで実行したらPC再起動してsudoをつけずに実行してみる
```bash:Terminal
docker run hello-world
```
GG

## Proxy(必要に応じて)
GUIあるならネットワーク設定でやる。
aptのProxy設定
```bash:/etc/apt/apt.conf
Acquire::http::Proxy "http://192.168.1.1:433"
Acquire::https::Proxy "http://192.168.1.1:433"
```
## 日本語入力
この記事通りにやればいい。

https://hirooka.pro/ubuntu-22-04-lts-japanese-input-ibus-fcitx-mozc/
コンテナと仮想マシンって何が違うの？

## はじめに

### 概要

コンテナ技術と仮想マシンの違いについてなんとなく分かっているフリをしていたので、実際にどのような点で違いがあり、メリットデメリットがあるのか調べてみました。

コンテナ側の内容が多めです。

## コンテナ技術とは

では、コンテナ技術とはどのようなものかについて見ていきます。
よくコンテナ技術と比較されるのが、仮想マシン技術です。

二つの違いは
コンテナ:「OSレベル」での仮想化技術
仮想マシン:「ハードウェアレベル」での仮想化技術
です。

図を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/47cd3b42-033b-07fd-f262-80cd54e89ba2.png)

この図では、

コンテナはubuntuやdebianなどの「OS」とapacheやpythonなどの「アプリケーション」を仮想化しています。

それに対して、仮想マシンでは上記に加えて「カーネル」と「ハードウェア」部分も仮想化しています。

ここでいうハードウェアというのは、CPUやメモリ、ストレージといったPCのリソースを完全にホストOSから独立した状態で割り当てるということです。

## 特徴

コンテナはOSより上層を仮想化しています。
例えば、ubuntu上にpythonをインストールした状態を仮想化することが可能です。
これを一つのパッケージ化(イメージ化)することで、環境の再利用が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/d6cc3bc2-6980-fa95-1d9e-0a372b64aa51.png)


PCは物理リソース(CPUやメモリ)を効率よく使用するために、カーネルを使用しています。
コンテナではホストOSのカーネルを利用することで、コンテナの構成要素を削減しています。
それによってコンテナは仮想マシンに比べて、環境を簡単に複製したり使い捨てることができます。

このコンテナの扱いやすさによって、デプロイのテストやマイクロサービスアーキテクチャの構築というのは非常に楽になりました。

仮想マシンでは物理マシンを買ってくるのと同じように、仮想マシンに独立したCPUやメモリ、ストレージといったリソースを割り当てることが可能です。

もちろん、どちらもリソースはホストOSのリソースを使用することになります。

### カーネルの役割

カーネルの共有という言葉が出てきたのでカーネルの役割を解説します。
カーネルはハードウェアとソフトウェアの間のインターフェースとして機能します。

具体的には、プロセス管理、メモリ管理、デバイス管理などを行います。
コンテナでは、ホストOSのカーネルを共有するためハードウェアのリソースを効率的に使用し、個々のコンテナが独自のOSを必要とせずに動作できます。

## カーネルを共有することによるメリット

では、カーネルを共有することでどのような利点があるのでしょうか。

### 速い

カーネルはPCの起動時にハードウェアの初期化やBIOSの起動、OSの入ったストレージへのアクセスなどハードウェアレベルの仕事をしています。

コンテナはこれらのカーネルの仕事を省略して、直接OSを起動します。
これによるメリットは「速さ」です。
起動、停止、削除の速さはコンテナ技術による圧倒的なメリットでしょう。

### 軽い

仮想マシンではカーネルも仮想化します。
そのため、カーネルの容量というのが発生します。

コンテナにはこのカーネルに割り当てる容量が必要ないため、仮想マシンに比べて軽量です。

## カーネルを共有することでの注意点

### カーネルの種類に依存する

Linuxベースのカーネルではwindowsのコンテナを起動することはできません。
逆も然りです。

ただし、windows10以降ではWSL2というLinuxカーネルをwindows上で実行できるようになっています。本題から逸れるためここでは割愛します。

### 独立性とセキュリティ

コンテナはホストOSのカーネルを使用しています。
そのため、ホストOS上で動作している複数のコンテナの内一つが攻撃を受けると、その範囲が他のコンテナ、ホストOSにまで影響を与える可能性があります。

一方、仮想マシンでは個々の仮想マシンが完全に独立しています。
そのため、一つの仮想マシンが攻撃を受けたとしても他のマシンへの被害を抑えることがコンテナに比べると容易です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/cd0a5a93-a964-e04b-5289-4026af658364.png)


では、独立性の強い仮想マシン同士でネットワークを組むことは可能なのか？

これは可能です。それぞれは物理のホストと同じように考えればよいので、IPアドレスの割り振り等、適切なネットワークの設定を行うことで通信が可能です。
他にも、ホストOSのディスクを共有することでファイルのやり取りを行うことも可能です。

しかし、これらの通信では通常のホスト間でのやりとりと同様に、通信を暗号化するなどセキュリティの対策が必要です。

仮想マシンだから安全でコンテナだから安全ではない。ということではありません。
どちらも適切なセキュリティの設定を行う必要があります。

## 結局どっちがいいの？

ここまででコンテナと仮想マシンの違いを説明してきましたが、どちらが正解ということではありません。以下は一例です。

[仮想マシン]

- 独立したゲストOSが必要な場合
- 異なるOSを同時に実行する必要がある場合(Linuxカーネルとwindowsカーネルの共存など)
- 強固な隔離が求められるセキュリティが重要な環境

[コンテナ]

- 素早い起動やスケーリングが必要な場合
- マイクロサービスのような分散型アプリケーションを開発する場合
- 開発環境と本番環境を合わせる場合

上記は一部の例ですが、作成するアプリケーションや環境の要件によってうまく使い分ける必要があります。

## まとめ

色々と違いを説明しましたが、仮想マシン上でコンテナを動かすということも可能です。
そうすることでホストOSに依存することなくコンテナを立ち上げることができます。

どちらかに依存するのではく、状況により何を使うと楽になるか。ということを考えるといいと思います。

### 所感

なんとなくコンテナはカーネルを共有しているという事は知っていましたが、今回勉強したことによってカーネルを共有することで、どのような利点があるという部分まで理解できました。
コアサーバーの評判レビュー

この記事では独自調査で判明したコアサーバーの良い評判と悪い評判を詳しく紹介します。またコアサーバーのメリットとデメリットも詳しくレビューしています。レンタルサーバー選びで悩んでいる方は必見です。

https://www.caliberelectronics.com/category/rental-server/core-server-reputation/
SQLコマンドまとめ備忘録（初心者向け）


個人的な備忘録も兼ねてSQLコマンドをまとめておきます。

・mysqlの開始コマンド
net start mysql80

・ログイン
mysql -u ユーザー名 -p
→このコマンドを入力後にパスワードを入力

rootユーザーでログインする
mysql -u root -p

・ログアウト
exit;

・mySQLの停止
net stop mysql80

・データベース一覧の確認
SHOW DATABASES;

・データベースの指定
USE database_name;

・ユーザーの作成
CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';

・ユーザー一覧の確認
SELECT user, host FROM mysql.user;

・ユーザーへの権限付与
GRANT  [権限] ON [適用対象のデータベース].[適用対象のテーブル] TO 'ユーザ名'@'ホスト名'

・ユーザーの削除
DROP USER 'ユーザー名'@'localhost';

・テーブルの表示
mysql> USE shop;
mysql> SHOW TABLES;

・カラムの追加
ALTERTABLE shohin ADDCOLUMNstockINT;

・カラムの表示
show columns from shohin;

・カラムの削除
ALTERTABLE shohin DROPCOLUMN stock;

・テーブルの削除
DROP TABLE テーブル名;

・データの登録
INSERTINTOitems(name,price,category)VALUES('にんじん',60,'野菜');

・データの検索（すべてのデータ）
SELECT *
     FROM items;

・カラムを選択して検索
SELECT column_name1, column_name2 FROM table_name;

・列名を変更してカラムを検索
SELECT emp_no  AS"従業員番号"
    FROM dept_manager;

・重複列を削除してカラムを検索
SELECT DISTINCT dept_no
    FROM dept_manager ;

・データの更新
UPDATE テーブル名
SET 列名1 = 新しい値1, 列名2 = 新しい値2, ...
WHERE 条件;

・データの削除
DELETE FROM テーブル名
WHERE 条件;



・テーブルの作成の例

mysql> CREATE TABLE IF NOT EXISTS shop.shohin(
    ->     id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->     title VARCHAR(50),
    ->     content TEXT,
    ->     created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    -> );

上記のSQL文では、下記の４つのカラムを作成して行きます。

id（ID）
title（タイトル）
content（本文）
created_at（登録された日時）

id INT AUTO_INCREMENT NOT NULL PRIMARY KEY
- カラム名：id
- データ型：INT
- AUTO_INCREMENT：自動的に値が1ずつ増えていく設定
- NOT NULL：空データを許さない設定
- PRIMARY KEY：データ（レコード）を一意に特定するためのカラムを決めるもので、1つのテーブルに必ず1つは必要

title VARCHAR(50)
- カラム名：title
- データ型：VARCHAR
VARCHAR型は文字列であり、(50)は50文字と制限するためのものです。VARCHARでは必ず最大文字数を指定する必要があります。

content TEXT
- カラム名：content
- データ型：TEXT

created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
- カラム名：created_at
- データ型：TIMESTAMP
- NOT NULL：空データを許さない設定
- DEFAULT CURRENT_TIMESTAMP：現在日時を保存すると言う意味です。
rbenvのアップデートをしようとしたら何も反応がなかったときの対応

# 解決方法

自分の場合は`origin`のURLが`rbnev/rbnev`のURLではなくて、`sstephenson/rbenv`の古いほうなのでうまく反応しなかった。

なので新しいURLに変更する。
```
$ git remote set-url origin https://github.com/rbenv/rbenv.git
```

# メモ

rbenvのアップデートを久しぶりにやろとうしたら、なぜかうんともすんとも反応がなかった。
```
⋊> ~/.rbenv on master ◦ git pull origin master
^C
```

とりあえず`-v`でもつけたら何か出るかなと思い調べてみる。
```
⋊> ~/.rbenv on master ◦ git pull -v origin master
Looking up github.com ... done.
Connecting to github.com (port 9418) ... ^C
```

何かログが出てきたので、ここで関係がありそうな`github git pull connecting 9418`で検索してみる。

[github git pull connecting 9418 - Google Search](https://www.google.com/search?client=firefox-b-d&q=github+git+pull+connecting+9418)

下記のページを眺めていると、`git remote -v`でリモートリポジトリを調べてたので実行してみる。
[Githubとの接続でremote errorがでる - Qiita](https://qiita.com/roark/items/9a04f5687e3b525fba46)

```
⋊> ~/.rbenv on master ◦ git remote -v
origin  git://github.com/sstephenson/rbenv.git (fetch)
origin  git://github.com/sstephenson/rbenv.git (push)```
```
なんかおかしくない？と思って公式ページを見にいくと`rbenv/rbenv`になっていたのでURLが相当古いことがわかった。

URLがおかしいっぽいのでoriginのURLを変える。
```
⋊> ~/.rbenv on master ◦ git remote set-url origin https://github.com/rbenv/rbenv.git
```

変えたらpullしてみる。
```
⋊> ~/.rbenv on master ◦ git -v origin master
POST git-upload-pack (317 bytes)
POST git-upload-pack (943 bytes)
remote: Enumerating objects: 351, done.
remote: Counting objects: 100% (345/345), done.
remote: Compressing objects: 100% (199/199), done.
remote: Total 351 (delta 193), reused 259 (delta 134), pack-reused 6
Receiving objects: 100% (351/351), 108.51 KiB | 15.50 MiB/s, done.
Resolving deltas: 100% (193/193), completed with 8 local objects.
From https://github.com/rbenv/rbenv
 * branch            master     -> FETCH_HEAD
   62d7798..af9201e  master     -> origin/master
Updating 62d7798..af9201e
Fast-forward
 .gitattributes                  |   1 +
 .github/dependabot.yml          |   6 ++
 .github/workflows/lint.yml      |  29 +++++++
 .github/workflows/release.yml   |   2 +-
 Makefile                        |   4 +
...
...
...
```

ちゃんとアップデートできたのでめでたしめでたし。
2023.4.25 プログラミングメモ

・スライドクリックしたらモーダル表示
（modaalプラグイン使用)

・HTML
	<div class="js-slider">
		<div class="slider-box">
			<a href="img/01.jpg" class="image" data-modaal-desc="ソニック"><img src="img/01.jpg" alt="ソニック"></a>
		</div>

・JS
$('.image').modaal({
  type: 'image'
});

参考URL
https://shu-naka-blog.com/website/modaal-js/

●4/26

・Ajax(エージャック）通信をする
file:///D:/Users/yuya/Desktop/yuya...
のようなローカルのファイルでAjax通信をするとブラウザのセキュリティが働き、エラーが発生し、上手く通信ができない。

→ザンプやドッカーの「ハローワールドエンジェックス」などを利用してlocalhostなどで呼び出す。
↑基礎から学ぶ vue.js　より

ローカルで簡易的なサーバーを立てる。
Node.jsをインストール
コマンドでverが表示されていればOK

![node.jsがインストールされているか確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/9a427a14-0793-3bed-1b4f-979593aeb476.png)


コマンドプロンプト
作業フォルダー初期設定
%HOMEDRIVE%%HOMEPATH%

ajaxをローカルで動作させるのに必要な手順

・ローカルでサーバーを立てる

①node.jsをインストール

②http-serverをインストール（コマンド）
npm install --global http-serverを実行

![http-serverのインストール（コマンドで）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/c50378c7-b8ab-7990-b77b-cd239c6269db.png)

③http-serverを実行する（コマンド）
※作業中のドキュメントに切り替えてから実行する
【例】D:\Users\◯◯\Desktop\local>http-server
下記の表示がされたらURLをコピペして開く
Available on:
  http://◯◯
  http://◯◯
Hit CTRL-C to stop the server

![http-serverを実行しローカルで簡易的なサーバーを立てる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/0bb9adfe-3120-1f7e-0cbc-467449b9298b.png)


★POINT
・ローカル環境でブラウザの変更が反映されない場合
キャッシュをクリアすることで解決
Ctrl+F5
CでHelloWorldプログラムを実装してみた

# 概要
CでHelloWorldプログラムを実装してみました。以下のページを参考にしました。
https://www.geekpage.jp/programming/c/helloworld.php

# ソースコード
以下の通りプログラムを実装しました。
```hello.c
#include <stdio.h>

int main(){
  printf("Hello World\n");
  return 0;
}
```

# コンパイル
以下のコマンドを実行しました。
```
$ gcc hello.c
```

# 実行結果
以下のコマンドを実行しました。
```
$ ./a.out 
Hello World
```

何かの役に立てばと。
Midjourneyで画像生成する方法

# はじめに
自分用メモみたいなものですが、Midjourneyで画像生成する方法の共有です。

![image.png](https://soco-st.com/wp-content/themes/socost/upload/11813_color.svg)

:::note alert
現在無料トライアルが停止されているようです😭😭
:::

https://www.theverge.com/2023/3/30/23662940/deepfake-viral-ai-misinformation-midjourney-stops-free-trials

# 準備
Discordのダウンロード及び会員登録😃

https://discord.com/

# 画像生成方法

## MidjourneyのDiscordチャンネルに入る

https://www.midjourney.com/auth/signin/

「Join the Beta」をクリックです！
![Screen Shot 2023-05-14 at 9.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/fa236739-60d4-51b0-409e-c966cf735497.png)

## MidjourneyのDiscordチャンネルにて

1. 左側のチャンネル一覧の中から、`newbies-〇〇`の内どれか1つに入る
1. `/imagine`と入力
1. すぐ上に表示される`prompto`をクリック
  ![Screen Shot 2023-05-14 at 9.21.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/34935c16-9d30-c7d7-f3a8-b73b7d5793d4.png)
1. 生成したい画像を文字で入力し、エンター
  ![Screen Shot 2023-05-14 at 10.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/619308ef-4358-593d-2477-e4de645bc841.png)
1. しばらくすると生成されます！

:::note info
初めて生成する場合は`accept`をクリックする必要があります
:::


## 生成後
1. どんどん流れて気づかないこともあるので、右上の通知ボックスを見ると良いです！
1. 4種類画像が作られます！
1. U1,U2,U3,U4は作られた4種類の内対象の画像1つを高解像度版として再生成できます
1. V1,V2,V3,V4は作られた4種類の内対象の画像1つをベースとした方向性にてさらに4つの画像を生成できます！

# おわりに
お読みいただきありがとうございました。
記事作成していたら無料トライアルが停止とのことで途中から参考画像がなくすいません…
無料で試すこともできない微妙なタイミングですが、一応記事公開いたしました…🙇

# 参考

https://www.youtube.com/watch?v=EiRB_M9_02w&list=PLbbAjoPuxpm-6q0cOLbeJF9bM1MEeMZtJ&index=4