OmniAICreator/Qiita-1.07M huggingface dataset:
【HTML】学習メモ：style指定で苦戦したときの話【Laravel】

今回はHTMLで思ったような画面レイアウトが組めずに苦戦したときのメモを共有します。
前回のRuby on Railsと同様に初心者の学習記録です。

# 筆者のステータス
今回も初心者。
HTMLの書き方については何となく知っている。要領が分かればできそう。

# やりたいこと
今回のポイントとしては次の通りです。
* Laravelで作成されたWebページの改修
    * 項目やボタン等の追加、変更、削除、レイアウト調整など
    * 対象のWebページにはPC向け表示とスマートフォン向け表示が存在するため、それぞれに対応したレイアウトを組む必要がある

# 今回の困りごと
主にレイアウト変更が上手くいかず、苦戦しました。
画像サイズや配置が指定からずれているほか、思ったような位置にボタンを配置することができておらず、特に画面サイズ変更時の表示崩れが深刻でした。
具体的には次のような点で問題が見られました。

* 埋め込み画像が想定したサイズになっていない
* 幅指定が機能していない
* マージン、パディング指定が機能していない
* 幅寄せがうまくいかない　→暫定的に固定値でパディングを設定したため、画面サイズ変更時に表示崩れが起こる

などなど……。

# 解決方法
* **適切な位置に適切なstyle指定を行う。**

**結局のところこれしかありませんでした。**

# HTMLに慣れていない人はどうしたらいいのか？
とはいえ、(筆者のような)HTMLコーディングに不慣れな人にとっては「適切な位置」を探すだけで一苦労です。
そもそもどこの指定がどの範囲に作用しているか、それ勘のようなものを見つけるためにもある程度の習熟(いわゆる勘のようなもの)が必要となるように感じました。
解決の糸口を見つけるために、いろいろとstyle指定を変更しつつ様子を見るのも悪くありませんが、やみくもに試すべきではありません。
いろいろと試行錯誤するうち、非常に単純なことに気が付きました。

* **気になるところにborderを表示させ、まるごと囲ってしまえばいい！**

要するに、自分の書いたstyle指定がどこからどこまで作用しているかの境界線を可視化してしまえ、というやり方です。
非常に初歩的かつ全くイケてないやり方で、もっといい手段があるように思えますが、今回思いついたのはまずこの方法でした(試行錯誤の記録として綴っているため、ご容赦ください)。
感覚的にはデバッグログを仕込むのとほとんど変わらないはずですが、これにたどり着くまでも随分と時間がかかってしまったところは反省点だと考えています。

以下、イメージ図です。
* ソースコード
```html
<div class="xxx" style="xxx; border:1px solid #000000">　★要素A
	<div class="xxx" style="xxx">　★要素B
         ......
         ......
    </div>
	<div class="xxx" style="xxx; border:1px solid #000000">　★要素C
         ......
         ......
    </div>
</div>
...
......
```

* 表示イメージ
![Slide1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753033/16478361-6ff6-0aa9-ab81-dc42c944e358.jpeg)
※要素Cに指定したstyleの有効範囲を確認するためにborderを設定した際のイメージ

# 試行錯誤の結果わかったこと
地道にborderを表示しながらレイアウトを調整して学んだことは、おおよそ次のとおりです。

* 表示幅などを%で指定している場合、実際の表示は親要素に影響されるため、子要素のみstyleを変更しても想定通りのレイアウトにならないことがある
* レイアウトの調整に固定値を使用した場合は一見して簡単に画面が整えられるが、画面サイズが変わると表示が大きく崩れることが多い
    * 特にPCとスマートフォンに対応したサイトの場合は固定値を避けたほうがよい
* styleの指定はcssファイルにまとめたほうが、修正時に便利
    * 直書きすると、どこで何をしているのか後からわかりづらくなる。ここまでいろいろ書いてきたが、これが最大の学びかもしれない

cssの書き方なども勉強しつつ、次の機会にはより良い改修ができるように上達していきたいと思います。
ShaderGraphでUVスクロールを実装する【Unity、ShaderGraph、UV Scroll】

# ■ 概要
本記事ではUnityの「ShaderGraph」を使って、**Shaderの基本テクニックである「UVスクロール」の実装**を紹介します。

# ■ 環境

Unityバージョン：Unity2022.3.36f1
プロジェクトテンプレート：Universal 3D

**今回はShaderGraphの機能が標準で搭載されている「URP」レンダリングパイプラインのプロジェクトで実装しています。**

※ビルトインのレンダリングパイプラインでも、パッケージを後からインストールしてShaderGraphを使用することができます。
[その手順はこちらの記事が参考になります。](https://ekulabo.com/unity-built-in-shader-graph)

# ■ 実装
![画面録画 2024-08-27 175423.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/c29ac267-3a00-83ea-b00c-a9a500a8af9c.gif)

ShaderGraphファイルの全体像はこちら。
![スクリーンショット 2024-08-27 175819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/f63964c1-93e6-5a3d-4dba-2e5b2bf9cb67.png)
UV座標に対して時間経過で増加する値を加算していくことでUVスクロールを実装しています。

# ■ UV （UV座標） とは
「UV（UV座標）」とは、マテリアルや3Dモデルに対してテクスチャを正確に貼り付けるための2次元平面上の座標系のことを指します。

UV座標の「U」は横方向、「V」は縦方向を示しており、テクスチャのどの部分をマテリアルの表面に貼り付けるかを指定することができます。マテリアルや3Dモデルは通常、複数のポリゴン（面）から構成されていますが、これらのポリゴンにテクスチャのどの部分を表示するかを決めるのがUV座標というわけです。

たとえばキャラクターの3Dモデルに顔のテクスチャを貼り付けたいとします。UV座標を使って「テクスチャのここが顔の部分で、3Dモデルのこの部分に対応させる」と指定します。こうすることでテクスチャが正しく3Dモデルに表示され、顔がきちんと表示されるようになります。

# ■ 応用
上記の実装を応用させることで、縦や斜め方向のUVスクロールも実装することができます。

![画面録画 2024-08-27 175651.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/28427b5c-cd9c-fc6b-4162-1199a33e2c3a.gif)
![スクリーンショット 2024-08-27 175900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/528d4a94-6cd0-a78d-d7b8-d3ea69f95a4d.png)
![スクリーンショット 2024-08-27 175929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730387/c9d5578b-2f27-6e69-718d-c3e079fff21c.png)

# ■ 最後に

今回は基本的なShaderGraphの使い方は省略し、簡潔にUVスクロールの実装を紹介させていただきました。今回紹介した実装以外にも工夫次第で様々な表現ができると思います。

最後までご覧いただき、ありがとうございました。
記事紹介：API に Lambda Monolith (別名:Lambdalith) を使うべきか？

## 序文
バックエンドAPIから非同期処理を切り出したくLambdaで設計した際に、以下のようなディスカッションをした。

*「1つのLambdaに色々な処理を詰め込むモノリスLambdaはアンチパターンと言われているけど、処理ごとに作るのも開発速度が遅くなってしんどそう」*

その際にとても良い記事を見つけることが出来たのでメモ代わり&日本語の検索導線を増やしたい気持ちで紹介記事を起稿。

## 本題

https://rehanvdm.com/blog/should-you-use-a-lambda-monolith-lambdalith-for-the-api

紹介記事冒頭の意訳

*この投稿では、モノリスのLambda API関数（別名Lambdalith）について、APIエンドポイントごとの単一目的のLambda関数と比較して、賛否両論を検討する。 
"ベストプラクティス"に挑戦し、APIに関しては多くの場合モノリスLambda関数の方が優れていると主張する。*

*【重要】
この投稿は、APIに面したLambda関数にのみ適用できる。 
それ以外のものには、単一目的の関数を使おう。*

*【TL;DR】
最初から範囲をAPIエンドポイントごとに制限するという議論は、細かすぎるし大袈裟で最適化も早すぎる。
範囲の境界は、従来のソフトウェアがそうであったように、API/サービスレベル全体であるべきだ。
AWSの高度な機能を使用せず、移植性を最高レベルにしたい場合は、Lambalithを使用するといい。
またこれは、単一目的Lambdaで実現したい要件を満たすための多くの抜け道がある。*

## 余談
2023の某アドカレにほぼ上位互換の記事がありました。
https://zenn.dev/watany/articles/183d40f8e31a45
【React(TypeScript)】Utilityの作り方

# 概要 
React(Typescript)でUtilityクラスを作りたいけど、どう書けばいいのか今までしっくりきてなかったのですが、やっとしっくりした書き方が分かりましたのでマイベストプラクティスとして共有させていただきたいと思います。

## Badな書き方
メソッドを直接exportする。この方法だと使用時にメソッドの数だけimportが必要になるのと、呼び出し元にあるメソッドとの区別がつきにくい。

AlertUtil.ts
```typescript
export const showAlert = (message: string) => {
    ...(省略)
}

export const showConfirm = (message: string) => {
    ...(省略)
}

```

### 使用する時
```typescript
import { showAlert, showConfirm } from 'utils/AlertUtil'

showAlert("テスト")

showConfirm("テスト")
```

## Goodな書き方
Utilをexportして、この中にメソッドを定義する。この方法だとUtilの中にあるメソッドを使っているのが一目で分かる。

AlertUtil.ts
```typescript
export const AlertUtil = {
    showAlert(message: string) {
        ...(省略)
    },
    showConfirm(message: string) {
        ...(省略)
    }
}
```

### 使用する時
```typescript
import { AlertUtil } from 'utils/AlertUtil'

AlertUtil.showAlert("テスト")

AlertUtil.showConfirm("テスト")
```
KtorでGETリクエストを行う方法

chatgptとcopilotを使ってサンプルコードを抽出してもらい、実装しました。

## 依存関係の追加
build.gradle.ktsに次を追加します。

```
dependencies {
    implementation("io.ktor:ktor-client-core:2.3.11")
    implementation("io.ktor:ktor-client-cio:2.3.11")
    implementation("io.ktor:ktor-client-json:2.0.0")
    implementation("io.ktor:ktor-client-serialization:2.0.0")
}
```


## ソース
httpクライアントを作ります。
リクエスト先は「https://ktor.io/」です。
```
class Greeting() {
    private val client = HttpClient()
    suspend fun greeting(): String{
        val response: HttpResponse = client.get("https://ktor.io/")
        return response.bodyAsText()
    }
}
```
CoroutineScopeを使って非同期で呼び出します。
この場合、用意したResultコンポ―ザブルを使って表示しています。
```
   val scope= rememberCoroutineScope()
   var text by remember { mutableStateOf("Loading") }
   LaunchedEffect(true){
       scope.launch{
           text = try{
               Greeting().greeting()
            } catch (e: Exception){
                e.localizedMessage ?: "error"
            }
        }
    }
    
    Result(
        name = text,
        modifier = Modifier.padding(innerPadding)
    )
```

## 結果
レスポンスを表示します。



![スクリーンショット 2024-08-27 181607.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3859154/35b044fb-3bf7-6adf-617b-d0cdda119320.png)
Next.jsで時計を実装する

## 作成するもの
以下のような感じです。（gifにした関係で時計ぽっくないですが😉）

![Videotogif (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486141/1d53c839-c510-b029-ce17-c8e55dec7bca.gif)


## Next.js準備
バージョン13です。
```
npx create-next-app@13 timeapp && cd timeapp && npm i next@13
```

## 現在時刻を計算するカスタムフック

```useTime.ts
import { useEffect, useState } from "react";

export const useTime = () => {
	const [time, setTime] = useState(new Date());
	const culcTime = () => {
		setTime(new Date());
	};
	useEffect(() => {
		const intervalId = setInterval(culcTime, 1000);
		return () => clearInterval(intervalId);
	}, []);
	return time;
};

```
・Dateクラスをインスタンス化し、標準時を取得します。
・culcTimeという時間を更新する関数を、setIntervalを用いて毎秒実行することで現在の標準時を取得します。
・アンマウントされたら毎秒の処理は実行したくないので、クリーンナップ関数としてインターバルをクリアするように定義します。（インターバルは副作用のため、Reactが管理してくれないから）
## 時刻表示のコンポーネント
```Timer.tsx
"use client";
import React from "react";
import { useTime } from "./hooks/useTime";

export default function Timer() {
	const time = useTime();
	return <div>{time.toLocaleTimeString()}</div>;
}

```
・toLocaleTimeString()という非常に便利なメソッドで標準時から時間のみ取り出し、表示します。

## トップレベルのコンポーネント
```page.tsx
import dynamic from "next/dynamic";
const Timer = dynamic(() => import("@/features/timer/Timer"), {
	ssr: false,
});
export default function Home() {
	return (
		<main className="bg-black min-h-screen">
			<div className="m-auto text-white text-6xl font-bold pt-10 w-fit">
				<Timer />
			</div>
		</main>
	);
}

```
ダイナミックインポートでフロントにて実行するようにします。（ssr:false）
バックエンドで実行した際の時刻と、フロントエンドで実行した際の時刻にラグがあるためです。
ダイナミックインポートに関して↓

https://qiita.com/kaitoppp/items/958292194fb3a831a71c
TeX で日本語と悉曇を混植する

 　ずっと英語で調べていたのでおそろしく時間を溶かしてしまいました。わたしたちのように悉曇を日本語と混ぜて入力したいひとはたぶんいっぱいいるでしょうから，その人たちがもっとほかのことに時間を使えるように，書いておきます。

　とりあえずコピペしただけで日本語と混ぜられるようにしてありますが適当に自分好みに変えてください。


## パッケージ
　非ラテン文字の多言語テキストを混植できるパッケージとして ``Polyglossia``、``fontspec``、``Babel``などがあります。しかし ``fontspec`` 以外に悉曇に対応しているパッケージはないようなので，この記事では ``fontspec`` のみを取り扱います。``fontspec`` は LuaLaTeX もしくは XeLaTeX でコンパイルするパッケージであることに注意してください。

## LuaLaTeX
```tex
% とりあえず日本語で打つ前提。
\documentclass{ltjsarticle}

% ``fontspec`` を入れる。
\usepackage{fontspec}

% Noto Sans Siddham を入れる。HarfBuzz にしないと合字がうまく機能しない。cf. [6]．
\newfontface\sidd[Script=Siddham,Renderer=HarfBuzz]{Noto Sans Siddham}
\begin{document}

% 中括弧で囲うと欧文と混ぜられる。
こんにちは，大日如来の真言は「{\sidd \Uchar71052\Uchar71101 \Uchar71040\Uchar32\Uchar71082\Uchar71088  \Uchar71080 \Uchar71086\Uchar71091\Uchar71101 \Uchar71055\Uchar71101}」（oṃ a vi ra hūṃ khaṃ）です。

\end{document}
```
 
## XeLaTeX

```tex
\documentclass{任意}

%とりあえず日本語を打てるようにする
\usepackage{xeCJK}
\setCJKmainfont{IPAexMincho}
\setCJKsansfont{IPAexGothic}
\setCJKmonofont{IPAexGothic}

% ``fontspec`` を入れる。
\usepackage{fontspec}

% Noto Sans Siddham を入れる。HarfBuzz にしないと合字がうまく機能しない。cf. [6]．
\newfontface\sidd[Script=Siddham,Renderer=HarfBuzz]{Noto Sans Siddham}

\begin{document}

% 中括弧で囲うと欧文と混ぜられる。
こんにちは，大日如来の真言は「{\sidd \Uchar71052\Uchar71101 \Uchar71040\Uchar32\Uchar71082\Uchar71088  \Uchar71080 \Uchar71086\Uchar71091\Uchar71101 \Uchar71055\Uchar71101}」（oṃ a vi ra hūṃ khaṃ）です。

\end{document}
```

## 参考文献
[1] [CTAN: Package polyglossia](https://www.ctan.org/pkg/polyglossia)
[2] [CTAN: Package luatexja](https://ctan.org/pkg/luatexja)
[3] [CTAN: Package fontspec](https://ctan.org/pkg/fontspec/)
[4] ["Multilingual typesetting on Overleaf using polyglossia and fontspec" - Overleaf, オンラインLaTeXエディター](https://ja.overleaf.com/learn/latex/Multilingual_typesetting_on_Overleaf_using_polyglossia_and_fontspec)
[5] [「梵字鏡フォントをLaTeXで利用」–曼荼羅寺](https://mandaraji.xsrv.jp/bonjikyo/)
[6] [「新しいluaLaTeXと梵字フォント」―曼荼羅寺](https://mandaraji.xsrv.jp/%E5%82%99%E5%BF%98%E9%8C%B2/%E6%96%B0%E3%81%97%E3%81%84lualatex%E3%81%A8%E6%A2%B5%E5%AD%97%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88/) - 本記事はほとんど曼荼羅寺様のこの記事に負っています。ありがとうございます。
仮想環境の画面をキャプチャしてUDPで配信する！

# 仮想環境の画面をキャプチャしてUDPで配信する！
## 何がしたいのか
Proxmoxの中に立てたXbuntuのデスクトップ画面をffmpegでキャプチャしてUDPを用いて配信をする

# シェルコードで実装！
サーバー側のコード
```bash
ffmpeg \
    -f x11grab \
    -s 1440x900 \
    -r 15 \
    -thread_queue_size 8192 \
    -i :0.0 \
    -c:v libx264 \
    -preset ultrafast \
    -tune zerolatency \
    -g 15 \
    -f h264 \
    udp://<受診するPC>:1234?pkt_size=512
```
受診PCのコード
(ffmpegのインストールする必要あるよ)

```bash
ffplay -fflags nobuffer udp://<受診するPC>:1234
```
現役エンジニアによる生成AIの実践的活用法3選

# はじめに
こんにちは！
皆さんは開発において、生成AIはご活用されるでしょうか。
本記事では、私現役エンジニアがオススメする生成AIの活用方法３選についてご紹介いたします！

- ## その1.エラー解決に使う
まずは基本の使い方ですね。
とりあえず表示されたエラーメッセージを貼っつけて聞いてみる方法です。
個人的にはエラーメッセージだけでなく、`どのタイミングで、どこでエラーが発生したか`も一緒に記載すると回答の精度が高いような気がします。

- 例（copilotを使用）
![スクリーンショット 2024-08-26 22.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832049/e3712820-6bb5-4db9-3d51-a983510ffb1e.png)

↑のようなイメージですね。
ブラウザのコンソール上で表示されているエラーメッセージをそのままプロンプトに貼り付けていつどこで発生しているかも一緒に書いています。
この例は簡単なエラーなのでしっかり回答されていますが、前提条件が複雑だとやはり回答の精度も悪くなるので、そのへんはうまいこと質問を考えて聞いてみる必要があります。
私の感覚ですが、生成AIに聞いたエラーの解決率は大体8割弱といったところですかね（めっちゃ凄い）。
これからの生成AIの進化に期待です！

:::note info
**使用している生成AI**
私は基本的にgithub copilotを使用しています。
vscodeと連携が出来るので、他の生成AIと違ってソースの内容も一緒に簡単に聞くことが出来るので、正直プログラマであればcopilot一択かなと思っています。
:::

- ## その2.調べれば分かるんだろうけどそこまでするのは面倒な時に使う
これはどういうことかと言うと、自分でググればしっかり出来るんだろうけど、そこに時間を費やす価値は無いな…という時に使うということですね(そのまんまですが)。
例えば、javaScriptで引数の日付形式を「yyyy/MM/dd HH:MM」形式で返却する関数を自作する場合、などですかね（`日付編集は面倒だから毎回調べてるの私だけ？？`）。

- 例（copilotを使用）
![スクリーンショット 2024-08-25 19.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832049/def6d81e-5757-36ed-3d3e-63c4d315485a.png)

↑で生成してくれてるソースをそのまんまパクってソースに貼り付ければ使えるので非常に便利ですね！
この手のわざわざ時間をかけたくない系の作業から開放されて、やりたいことに集中出来るのは本当にありがたいです！
いい時代になったもんだ…

- ## その3.調べ物をする時、代わりに生成AIにググってもらう時に使う
これは<a href="https://qiita.com/Kei-dev-1213/items/cdf00fdb2d00255f80f5">以前の私の記事</a>でも紹介させてもらった生成AI（perplexity）の活用方法なのですが、調べ物をする時に代わりに生成AIにググってもらって、その上で追加で質問したり自分で調べる方法です（残念ながらcopilotにはリアルタイム検索の機能がまだ無いので。。）。
まさに最新の情報を調べたいときなどに活用出来る方法で、例えば↓の通り、React19で追加される予定の機能を確認したいときなどに役に立ちます。

- 例（perplexityを使用）
![FireShot Capture 002 - Perplexity - www.perplexity.ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832049/49d8742b-db42-dd8f-512a-eaa6d740ddfb.png)

perplexityは質問をした時にリアルタイムで検索する機能を備えているので、まさに最新の情報を調べるときにはうってつけです！更に分からない事があれば追加で質問も出来るので、自分でググるよりも非常に効率アップを見込むことが出来ます！

:::note info
perplexityは無料版と有料版があり、有料版だと情報の精度がかなり高いです！
とはいえ、無料版でも利用にあたって登録は不要で、リアルタイムの検索機能も搭載されているので十分有用な生成AIです。是非ご活用ください！
:::

# おわりに
いかがだったでしょうか。
開発効率アップのためにはもはや生成AIは欠かせないということがおわかりいただけたと思います。
私は生成AIが無い時代からこの業界で働いていますが、`生成AIを有効に使うことは開発効率を2倍3倍にアップさせる`と言っても過言ではないと思っています。
これまでAIをあまり活用してこなかったという方は、これを機に是非ご活用ください！！
また、この生成AIはかなり有効だよ、というものがあれば是非コメント下さると嬉しいです！

# 参考

https://qiita.com/Kei-dev-1213/items/cdf00fdb2d00255f80f５

https://docs.github.com/ja/copilot

https://www.perplexity.ai/

## JISOUのメンバー募集中🔥
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
気になる方はぜひHPからライン登録お願いします！👇

https://projisou.jp/
Account Engagementからフローを介してチャターに投稿する



+ [リードの内容更新時の所有者への通知について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqhd8)

Account Engagementフォームがはいるとリードへ連携する。
Chatterアクションでは

「Only internal users can set visibility to InternalUsers」エラーで止まってしまった。
　（Account Engagementの連携更新は外部扱いなんでしょうかね？）


:::note
＞ 「Only internal users can set visibility to InternalUsers」エラーで止まってしまった。

 このエラーのように現状ではAccount Engagementからのポストはできないみたいです。アイデアに上がっています。

Pardot - Post To Chatter Automation/Completion Activity
https://ideas.salesforce.com/s/idea/a0B8W00000GdoByUAJ/pardot-post-to-chatter-automationcompletion-activity

もう少し調べてみるとヒントが述べられていますが... 具体的な方法が分からないですね。

**Platform Events to the Rescue**

Platform Events are essentially like records whose sole purpose is to trigger other things. There is plenty of developer documentation if you want to learn more about them, but for our purposes, the key thing to realize is that Apex Triggers on Platform Events will run as the Automated Process User, NOT as the user who created the event.

This means that a Platform Event triggering a chatter post will post as the Automated Process User, which does not have the same technical limitations as the B2BMA Integration User. 

https://pedallucid.com/thoughts/chatter-notifications-for-pardot-with-platform-events

さらに読み進めてみると、フローでChatterにポストするのではなくて、プラットフォームイベントを発火させて、Apexトリガーで受け取ってChatterにポストするのかもしれません。

フローは実行しているユーザのコンテキストは変えることができないのですが、Apexトリガーならシステムモードで動いているので、上記の制限を回避できるようなことが述べられていると思います。

**Solution Design**

This architecture was designed to be as admin-friendly as possible, and require the bare minimum Apex to build and maintain. We have limited the scope of Apex to the one thing it needs to do: change the user context in which automation runs. Although Flows can be triggered by Platform Events, they do not change the context of the running user! The first iteration simply used Flow to create a Platform Event, and another Flow to listen for it—this will not suffice. It’s unclear whether this difference was an intentional decision made by Salesforce or not, but it’s key to this whole operation. 
 :::
(5話) 熱波師おかん、snowflakeで半分だけ構造化されたデータってどう使うん？

こんにちは、サウナ熱波師を目指しながらSnowflakeの勉強中のアキコです！本日も私のブログにお越しいただき、ありがとうございます。

さて、最近は少しまずいかもと思うことがあります。というのも、今の職場を続けながら将来的にはサウナ熱波師に転職しようと考えているんですが、そのことが職場にバレたらかなり気まずいんです。どんな職場でもそうですよね。これはひっそり内密にすすめねばいけません。
今の私の仕事は「外国人の生活補助をするみんなのおかん」です。役所手続きや、生活相談や人生相談、そのたいろいろ。ほんまにいろいろです。いきなりメッセージで「Help me」と入ってきてドキーッ！なんてこともしばしば。

そんな私がいまsnowpro core取得を目指してることが職場にバレたらITの世界に飛び込もうとしてると間違いなく思われるやろうし、「違うんです、熱波師になりたいんです」と本当のことを言っても「なんやそれ」と騒がれそうです。

あと家の都合もあり、試験を受けに行くのも平日に有給を取って仕事抜けてこっそり行くしかないんです。

ということで、念には念をということであまり個人の特定に繋がるような内容は書かないようにします。いろいろとぼかしたり、省略したりすることも多いと思いますがそんな事情ですのでごめんなさい。
ちなみにSnowflakeの内容についてぼかしているのは、決して職場の気まずさのためではなく、たんに私の知識不足が原因です。

ところで、snowpro coerの試験に挑戦している方にはぜひおすすめのブログがあります！紹介する許可もいただけました（ありがとうございます）
SnowPro Core 合格体験記 [COF-C02] 効果的な勉強法を丁寧に解説
こちら素晴らしく詳しく丁寧な体験記で、試験対策のコツや実際に役立った勉強法が詳しく紹介されています。このリンクを見れば、あなたもわたしも試験勉強にもきっと大きなヒントが得られると思います。

https://note.com/taro_milk/n/n6cfa1fbc3649#9e0a2efa-63fc-4465-98db-2261ee7a6404

Pistachioさん、ありがとうございます！

では本日は半構造化データについて勉強します。
以前のブログでお手上げ降参した話題ですが、自分なりに理解してみました。

構造化データ
半構造化データ
非構造化データ
のみっつ。

分かりやすく銭湯のロッカーに例えると

「構造化データ」は、きっちり整理された銭湯のロッカーのようなもの（と私は理解しました）。ロッカー内には細かく区切られた棚があり、メガネ置き場、上着、ズボン、着替えなど、どこに何を置くかが決められていて、必要なものをすぐに取り出せるようになっている感じです。まさに構造化。

「半構造化データ」は、名前の通り半分だけ構造化されてる。これは仕切りのない自由なロッカーをイメージしています。ロッカー自体はあるけれど、内部は自由で、どこに何を置いても良いので、大小さまざまな荷物を柔軟に収納できる状態です。大きなバッグをそのまま置いたり、大きめのサウナマットいれたり、小物をまとめて一緒に置いたり、何でもアリな感じです。ある意味、自由度が高いけど、整理が必要な場合にはちょっと工夫が要る感じです。

「非構造化データ」は、ロッカーそのものがなく（えっ！）、銭湯の利用者が床に直接荷物を置いているような状態。荷物が散らばっていて、何がどこにあるのかわからず、整理もされていないので、探すのが大変なイメージです。家に帰ってきて洗濯物を出そうとしたら、誰のかわからない靴下が混じっている、みたいな感じでしょうか。ひえー！

ざっくりイメージできたところで、snowflakeとしてはこれら3つのデータの形をどのように扱うのでしょうか。まず「構造化データ」。これはまさにsnowflakeのような仕組みが取り扱うのにもともとベストな形なので何の問題もなさそうです。

次に「半構造化データ」。これが前回私がギブアップしてしまった項目です。どうやら、半構造化のなかにもさらに種類があり、Snowflakeが扱える形式や特長があるみたいなんです。

https://docs.snowflake.com/ja/user-guide/semistructured-data-formats

たとえばJSON(ジェイソンと読む）という有名な形式があります。ジェイソンと聞くとわたしら世代は13日の金曜日とか思い出して怖い気持ちになっちゃいますが大丈夫。これは半分だけ構造化されたデータの形式で、ルールにのっとって扱えばSnowflakeでつかうことができます。ほかにもAvro(アブロ？）、ORC（オーアールシーー？）、Parquet(パーケイ？)などがありそれぞれルールがありそうです。
このあたりは試験で出そうなので暗記祭りかなと身構えてます！

最後の「非構造化データ」。そう、ロッカーのない銭湯に誰のものかわからない荷物が散乱した戦場。これもSnowflakeではデータとして扱えるようです。

https://docs.snowflake.com/ja/user-guide/unstructured-intro

ここのページに、かいてありました！「非構造化データには、画像、ビデオ、オーディオも含まれます。」つまりわたしら一般人がイメージする写真とかの「データ」は非構造化データってことがつながりました！

ということで3種類のデータについてざっくりと理解を深めることができました。いつもながら、これは私の理解ですので間違ってる内容とかあれば教えていただけると嬉しいです。あと、いいねつけてもらえると本当に嬉しいです！
レビューアイで 東横イン 東京駅新大橋前 のレビュー分析をしてみた

弊社リテジーリンクではレビュー分析AI[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
レビューアイ (英語表記 ReviewAI) は、商品・サービスのレビューを分析し、
観点ごとに強みと改善点を明らかにする、レビュー分析AIです。

本記事では、東横イン 東京駅新大橋前のレビューを例に
レビューアイで明らかになった強みと改善点を1つずつ紹介します。

## 強み

レビューアイでレビュー分析すると、レビューでよく出てくる観点が一覧できます。
強み順に並べると、**部屋**が一番上にきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/92061ea2-5a06-26e9-6991-893b02c26ae4.png)


**部屋** の詳細を確認すると、部屋に関してどのようなレビューがあるのか可視化されます。
こちらを強み順に並べると、**広い**、**きれい**、**清潔** が上位にきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/436e4186-ea30-02b9-5aea-507664635fe3.png)

**広い** のレビューを見ると、感情分析した結果で整理してレビューの抜粋文が確認できます。
ユニットバスも含め、ビジネスホテルより広いという評価をされている様子がわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/b7a77842-076a-98cf-2758-341721e5e541.png)


## 改善点

レビュー分析で見つかる観点を改善順に並べると、**朝食** が一番上にきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/27a8ee8b-fa6c-f53d-88a6-b9baa262e76e.png)

**朝食** の詳細を確認すると、どのような点で改善の余地があるか一覧できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/e1a325f8-602d-9bab-de24-e4cbd53061eb.png)

**席** のレビュー文を見ると、席が少ないという意見が多いようです。
一方で席はすぐに空くという意見も一部あるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/67eebab6-514e-324a-62ba-26237506273e.png)

## まとめ

レビューアイで東横イン 東京駅新大橋前のレビュー分析をしました。
結果として
- 部屋は広くてきれい
- 朝食は席が少なめ
ということが判明しました。

今回は紹介できていませんが、
- 送迎バスについての改善点
- フロントのスタッフに対する意見
などについても貴重な知見があります。

[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
ぜひ[こちら](https://reviewai.next-seed.work/)からお申込みください。
【AWS】Parameter Store を使用して機密情報を terraform で安全に管理する方法

AWS インフラストラクチャを Terraform で管理する際、データベースのパスワードや API キーなどの機密情報を安全に扱うことは非常に重要です。今回は、AWS Systems Manager Parameter Store を使用して機密情報を SecureString として保存し、それを Terraform で取得および復号化する方法を紹介します。

## 前提
- AWSアカウントを持っている
- AWS CLIをインストールしている
- terraform をインストールしている

## 1. Parameter Store に機密情報を SecureString として保存

まず、AWS CLI を使用して Parameter Store に機密情報を SecureString として保存します。以下のコマンドを実行してください：

```
aws ssm put-parameter --name "/app/database/password" --type "SecureString" --value "your-secret-password" --description "Database password for the application"
```

`your-secret-password` を実際の機密情報（この例ではデータベースパスワード）に置き換えてください。

## 2. Terraform で Parameter Store から SecureString を取得し復号化

次に、Terraform の設定ファイル（例：`main.tf`）に以下のコードを追加して、Parameter Store から機密情報を取得し、復号化します：

```
data "aws_ssm_parameter" "db_password" {
  name = "/app/database/password"
  with_decryption = true
}

locals {
  database_password = data.aws_ssm_parameter.db_password.value
}
```

ここでの重要なポイントは `with_decryption = true` の設定です。これにより、Terraform は自動的に SecureString パラメータを復号化します。

## 3. 取得した値の使用例

復号化された機密情報を使用する場面で、以下のように `local.database_password` を参照できます：

```
resource "aws_db_instance" "example" {
  engine         = "mysql"
  engine_version = "5.7"
  instance_class = "db.t3.micro"
  username       = "admin"
  password       = local.database_password

  # その他の設定...
}
```

## なぜ Secrets Manager を使わないのか？

AWS Secrets Manager も機密情報管理のための優れたサービスですが、Parameter Store にはいくつかの利点があります：

1. コスト効率：
   Parameter Store は基本的に無料で使用できます（高度なパラメータには少額の料金がかかります）。一方、Secrets Manager はストアされている秘密ごとに料金が発生します。

2. 単純さ：
   Parameter Store はより単純で、学習曲線が緩やかです。基本的な機密情報の保存と取得には十分な機能を提供しています。

3. 統合の容易さ：
   多くの AWS サービスが Parameter Store と直接統合されており、設定が簡単です。

4. 汎用性：
   Parameter Store は機密情報だけでなく、設定データなど様々な種類のデータを保存できます。これにより、一つのサービスで多様なデータ管理ニーズに対応できます。

5. 既存のインフラとの互換性：
   多くの既存のインフラストラクチャやツールが Parameter Store をサポートしており、移行が容易です。

ただし、自動ローテーションや詳細なバージョニングが必要な場合は、Secrets Manager の使用を検討する価値があります。プロジェクトの要件、予算、既存のインフラストラクチャに基づいて、適切なサービスを選択することが重要です。
文系未経験エンジニアが「ここで躓いた！」シリーズ～サーバーって何？編～

# はじめに
このシリーズでは、文系出身未経験入社の開発エンジニア2年目の自分が、
なんとなく分からずにモヤモヤしていた知識や疑問をざっくりと解説していきます。
ざっくりとなので、多少正確性を欠くことがありますが、もし誤った記載がありましたらご指摘いただけますと幸いです。

# 「サーバー」と聞いてピンとくる？
あなたは「サーバー」と聞いて、何を指しているのかピンときますか？
おそらく初心者エンジニアの方の多くは
「何回も聞いたことあるけど、なんかよく分からないんだよなぁ」
という印象だと思います。
「サーバーとは、何らかのサービスを提供するコンピューターのことです」
という説明もよく聞きますが、やっぱりピンと来ませんよね。

# 「サーバー」とは？
サーバーとは、
**「コンピュータが、特定の役割を担った状態」**
のことを指します。

「サーバー」には、以下のような種類があります。
>* Webサーバー
>* アプリサーバー（APサーバー）
>* DBサーバー
>* メールサーバー

などなど。
# あなたのパソコンも「サーバー」になれる
あなたのパソコンにWebサーバーの役割の担うためのソフトウェア（Apacheなど）をインストールして実行すれば、
あなたのパソコンはWebサーバーになります。

同様に、もしあなたが画面上に"Hello World!"と表示させるだけのシンプルなアプリケーションを作成して実行すれば、
あなたのパソコンはアプリサーバーになります。

さらに、↑の2つを同時に実行すれば、
あなたのパソコンはWebサーバーでありアプリサーバーであるというわけです。

もしあなたが入社時の研修やインターン等で
LAMP環境（Linux,Apache,MySQL,PHP）を構築したことがあるのなら、
そのパソコンはwebサーバーでありDBサーバーでありアプリサーバーです。
# 「サーバー＝物理的なコンピュータ1台」？
「サーバー＝物理的なコンピュータ1台」というようなイメージがあるかもしれませんが、
当然ながら実際は、1台のコンピュータに複数の役割を持たせることも可能です。
そのため、必ずしも「サーバー＝物理的なコンピュータ1台」とは限りません。

ただ、本番環境や本番環境を模して作られた検証環境は、沢山のユーザーがそのシステムを利用する想定で作られているため、
処理の負荷を分散させたり、役割一つ一つの責務をはっきりさせるために、
「このコンピュータはこの役割専用！」と決めてしまうことが多いです（「サーバー＝物理的なコンピュータ1台」というようなイメージがあるのはこれが原因かもしれませんね）。

# 1台に沢山の役割を持たせた方がいい？
1台のコンピュータに沢山の役割を任せちゃえばいいじゃん！と思うかもしれませんが、これは目的によります。
例えばですが、
>**実装作業中**：
性能面は置いておいて、とりあえず1台のパソコンで、
実際にユーザーが利用したときの一連の流れを検証しながら開発したい！

→この場合、1台のコンピュータに複数の役割を持たせた方が検証しやすい。
>**本番運用**：
同時アクセスに耐えれて、重たい処理もできるだけ早く処理できるようにしたい！
何かエラーが起きたときは、すぐに原因を特定して復旧できるようにしたい！

→この場合、複数のコンピュータにそれぞれに1つずつ役割を与えて、
処理を分散させて性能を高めたり、
責務を分散させてエラー原因の特定や復旧作業がスムーズにできた方がよい。

というように、どちらが良いのかは目的によって異なります。

# おわりに
体感ですが、IT業界で当たり前のように使われている用語や概念って、
なにを指しているのか曖昧だったり、分かりづらかったりすることが多い気がします。

特に未経験で入社すると、「これってどういう意味なんだろう？」と思って調べてみても、結局曖昧な理解のままになってしまい、
上司の指示がちゃんと理解できずに怒られ、結果としてITエンジニアという仕事に苦手意識を持ってしまう...というようなことも少なくないのではないでしょうか？

この記事が、そんな悩みを抱えている方の一助になることができれば幸いです。
Java と C# での違い

## JavaとC＃のひっかりやすい違い
C＃使用者がJavaを使用するにあたり、ひっかかりやすい違いをまとめる

ここでの違いは全ての違いを網羅しているわけではないので、
用法要領を守り正しくお使いください。



## Javaのprivate はpublicの内部クラスでしか使えない

```java.java
public class MyClass {
    // このクラスは public なので他のパッケージからもアクセス可能
    private class PrivateClass {
    }
}

class DefaultClass {
    // このクラスはデフォルトアクセスなので同じパッケージ内のみでアクセス可能
}
```

```C#.cs
// Program.cs
namespace TestApp
{
    public class MyClass
    {
    }
    private class PrivatelClass
    {
    //C#はprivateで内部クラスが定義できる
    }
}
```

## Javaは名前空間はpackageを利用

```java.java
package test.pg;

public class MyClass {
    public void sayHello() {
        System.out.println("Hello from MyClass in package test.pg");
    }
}

```
```C#.cs
namespace TestApp
{
    public class MyClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello from MyClass in namespace TestApp");
        }
    }
}

```

# JavaはGetSetがない


```java.java
public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

```
```C#.cs
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

```

## オーバーロードとオーバーライド
オーバーロードはC＃同じと考えて問題なし。

オーバーライドの違い
```
@Overrideを付ける
```
```java.java
class Animal {
    public void makeSound() {
        System.out.println("Animal sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

```
```C#.cs
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

```

## Javaはイベントとデリゲートが、ない
リスナーで実装する

```java.java
interface ButtonClickListener {
    void onClick();
}

class Button {
    private ButtonClickListener listener;

    public void setClickListener(ButtonClickListener listener) {
        this.listener = listener;
    }

    public void click() {
        if (listener != null) {
            listener.onClick();
        }
    }
}

```

```C#.cs
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

```

## Javaのメモリは自動でクリーンアップされる。
Javaはガーベッジコレクタによって自動的にクリーンアップされる

```20240827追記.
Javaでもtry-with-resources文を使用しメモリを明示的に解放できる仕組みがある。
```

C#の場合メモリを明示的に管理できる仕組みが言語レベルで存在する。
```C#.cs
using System;

class Resource : IDisposable
{
    public void Dispose()
    {
        // リソースのクリーンアップコード
        Console.WriteLine("Resource cleaned up");
    }
}

class Program
{
    static void Main()
    {
        using (Resource res = new Resource())
        {
            // リソースを使用
        }
        // 自動的にDisposeが呼ばれる
    }
}

```
【jQuery】なぜかクリックイベントが効かない

# はじめに
jQueryでなぜかイベントが正常に実行されなかったので原因を調べてみました。
# 問題
以下のようにクリックイベントを実行してもなぜか処理が実行されない。
```js
$(".demo").on("click", () => {
    console.log("クリックしました");
});
```
# 原因&解決策
クリックする要素(今回の場合は.demo)がjsなどにより後から追加された要素の場合は処理が正しく実行されないみたいです。今回の場合はページが全て読み込まれた後にjQueryで追加した要素をクリックしているのが原因でした。以下のようにdocumentを使って記述することで正常に動作するようになりました。
```js
$(document).on("click",".demo", () => {
    console.log("クリックしました");
});
```
# 追記: 注意点と補足
一応上記のやり方で処理は正常に行われますが、document内の全てのクリックイベントを受け取ってから指定したクリックイベントを実行するため、クリックイベントが増えてくるとパフォーマンスに影響を与える可能性があるみたいです。なので何も考えずdocumentにするのではなくクリックイベントを受け取る範囲を狭めてあげることでパフォーマンスを改善できます。
```js
$("#元々あった親要素").on("click",".demo", () => {
    console.log("クリックしました");
});
```
上記のように後から追加された要素である.demoから元々存在する親要素探して指定してあげることでdocumentを使わなくても動くようになりました。

# おわりに
コードは合ってるのになんで実行されないのか自分で色々試していたら解決に少し時間がかかってしまいました。検索してみると結構同じ内容がヒットしたのですぐ調べてみるのも大事ですね。

# 参考
https://ez-program.com/2024/01/28/1737/

https://webcreatetips.com/coding/1683/
シャドウトラフィックテスト(シャドーイング)

# シャドウトラフィックテストとは

Webシステムテスト手法の一つ

「本番環境へのリクエストを、検証環境へミラーリング(分割 or 転送)」することで

負荷テスト・リグレッションテストを実施できる

A/B テストをシステムテスト特化したものと考えれば良い

別名は シャドーイング, シャドーテスト, shadowing, traffic shadowing, shadow traffic test

( 以降「ミラーリング」をシャドーイングと表記する )

## 構築イメージ

下図の通り、本番から検証へリクエストをシャドーイングする

シャドーイング手法(転送, 分割, etc.) はロードバランサーの仕様に依存する

![shadow_traffic_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31223/b40390d3-5e9d-6b09-71d9-36a1f7682e35.png)

## テスト時の留意点

**(1) 「シャドーイングの重みづけ」を適量にする**

例えば分割でやる場合、どの重みづけでやるかをテスト目的で決める

( nginx では [`split_clients`](https://nginx.org/en/docs/http/ngx_http_split_clients_module.html) の割合を指す )

**(2) 本番リクエストへの影響を限りなく抑える**

ロードバランサーの性能が、全く落ちないとは言い切れない

なので

* 第一検証環境(本番扱い)
* 第二検証環境(検証扱い)

の2環境で、事前に負荷をかけて確認をする

**(3) 検証環境では、ロードバランサーから先を機能制限する**

**検証が本番と同じ動きをする** ので、次のような対策を施す

* メール送信や通知機能無効化
* DBトリガー無効化
* 本番と同等の認証・認可プロセスを経ても正常系となるようにする
  * 工数上できないなら、未認証・未認可で確認可能な機能に絞る
* etc.


# 余談

AWS 既存構成で試そうとした話

...

下のような AWS 構成でシャドーイングができるか、まず机上検証した

本番・検証のALB のターゲットグループ(VPC)が異なっていた為断念。代案を探す

![shadow_traffic_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31223/a122df2a-13a4-4692-4a26-cebf12d7bc20.png)




* A案. VPC peering の導入
* B案. 下のような「リクエスト複製」
  * `Traffic Repication Service` で `Forward Request for Shadowing` をシャドーイングするように、Staging ALB へ非同期リクエスト


までは出た。

![shadow_traffic_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31223/d98d181b-620e-33d5-cb43-7b51420ea773.png)


この後はスケジュール・予算・その他色々の相談である

後続記事がなければ、余談はここまで
AWSコンテナ環境の監視を強化する方法：CloudWatch、アプリケーションシグナル、コンテナインサイトを活用しよう！

## はじめに
AWSでコンテナ環境を利用しているあなたへ！ 
「コンテナ環境の監視って、どうすればいいの？」
「問題発生時に、迅速に原因を突き止めたいんだけど…」
そんな悩みをお持ちではないでしょうか？
この記事では、AWSのコンテナ環境をより効果的に監視し、問題解決を迅速化する方法をご紹介します。

**AWSのマネージドコンテナサービス**

AWSでは、EKS（Amazon Elastic Kubernetes Service）やECS（Amazon Elastic Container Service）、サーバーレスオプションのFargate、コンテナイメージレジストリなど、様々なマネージドコンテナサービスを提供しています。これらのサービスを利用することで、コンテナ環境の構築と運用を効率化できます。

**AWS CloudWatch：コンテナ環境の監視に最適なツール**

AWS CloudWatchは、120以上のAWSサービスと統合可能な監視サービスです。コンテナ環境の監視にも最適で、インフラ、システム、アプリケーションの健全性を可視化し、様々なデータセットを関連付けることで、環境における問題を早期に発見し、解決するのに役立ちます。

**アプリケーションシグナル：アプリケーションの健全性を一元的に確認**

アプリケーションシグナルは、アプリケーションの依存関係を統一的に表示し、アプリケーションの監視と問題解決を支援する機能です。レイテンシー、可用性、エラー率などのアプリケーション中心のメトリクスを提供し、インフラレイヤーとの相互の可視性を提供することで、環境全体の状況を把握するのに役立ちます。

**コンテナインサイト：コンテナ環境の詳細な監視を実現**

コンテナインサイトは、コンテナ環境の詳細な監視を可能にする機能です。クラスタの健全性、ノードの健全性、メモリ使用率などを一元的に表示し、アラーム設定も可能です。アプリケーションからインフラまで、様々な視点からの監視を可能にするため、問題解決を迅速化することができます。

**ペットクリニックの予約システムに問題が！CloudWatchを使って対応した例を紹介します。**

アプリケーションシグナルでエラーを発見
トレース機能で原因を追跡
DynamoDBの処理能力不足が判明
迅速に対策を実施
このように、問題の発見から解決までスムーズに行えるんです。

**まとめ：AWSの機能を最大限に活用しよう！**

AWSは、コンテナ環境の監視を強化するための様々な機能を提供しています。これらの機能を活用することで、問題を迅速かつ効率的に解決し、コンテナ環境の運用をより安定させることが可能です。

ぜひ、今回の記事を参考に、AWSの機能を最大限に活用して、あなたのコンテナ環境をより安全で効率的に運用してみて下さい！
'NoneType' object has no attribute 'sendall' 

# なんの記事？
pythonのftplibを使ってファイルアップロードするプログラムを作っていた時に起きたエラーのメモです。

# 'NoneType' object has no attribute 'sendall'


### なんでこのエラーが起きたのか？
プログラムは一つの宛先アドレスにそれぞれ別アカウントでログインしてファイルを送ることを想定していて、宛先を切り替える時にセッションを作り直さなかったからです。

つまり
```python
for 宛先 in 宛先s:
    ftp = FTP_TLS('宛先アドレス')
    ~~ログイン処理や送信処理など
    ftp.quit()
```
とするべきところを
```python
ftp = FTP_TLS('宛先アドレス')
for 宛先 in 宛先s:
    ~~ログイン処理や送信処理など
    ftp.quit()
```
としていたことが原因。
CakePHP4.xのアプリをCakePHP5にアップグレードする　とりあえずアップグレード編

## はじめに
PHPのバージョンやらMySQLのバージョンやらをあげるためにCakePHPも5に上げようと思い、手順を記録しておこうと思いました

### PHPとMySQLのバージョンを上げる
CakePHP5ではPHP8.1以上が必要です
今回は

https://qiita.com/scarym/items/6b5e813f0972896780fc

の通り、MAMP7で

* PHP8.3.9
* MySQL8.0.35

という環境で動かします

### アップグレード・ツールを使う

https://book.cakephp.org/5/ja/appendices/5-0-upgrade-guide.html

を参考にアップグレードツールをインストールします。
今回は現在動いているアプリを仮に「my_app_name」とします
まずは「my_app_name」に移動して
```
git clone https://github.com/cakephp/upgrade
```
my_app_nameの下に「upgrade」が出来るのでそちらに移動
```
cd upgrade
git checkout 5.x
composer install --no-dev
```
インストールができたらそのまま
```
bin/cake upgrade rector --rules cakephp50 ../src
bin/cake upgrade rector --rules chronos3 ../src
```
で既存のsrcをアップグレード

### composer.jsonを書き換える
クリーンインストールしたCakePHP5のcomposer.jsonと比較して変更していきます
```
"require": {
        "php": ">=8.1",
        "cakephp/cakephp": "^5.0.1",
        "cakephp/migrations": "^4.0.0",
        "cakephp/plugin-installer": "^2.0",
        "mobiledetect/mobiledetectlib": "^4.8.03"
    },
    "require-dev": {
        "cakephp/bake": "^3.0.0",
        "cakephp/cakephp-codesniffer": "^5.0",
        "cakephp/debug_kit": "^5.0.0",
        "josegonzalez/dotenv": "^4.0",
        "phpunit/phpunit": "^10.1.0"
    },
```
私の場合authentication　やbootstrap-uiを使っているので、そちらも修正
 ```
         "cakephp/authentication": "^3.0",
        "friendsofcake/bootstrap-ui": "^5.0",
```
authenticationは2.0だとエラーになるので^3.0にしておきます。

 ```
 composer update
  ```
  これでとりあえずをCakePHP5で動く....はず

## ひたすらエラーを解消していく
これで簡単に動くようなら苦労はしません
エラー解消編に続きます
nop命令のオペランド

## nop命令のオペランド？
あるバイナリを逆アセしたところ、nop命令にオペランドがあることを見つけました。
```
nop DWORD PTR [rax+0x0]
```
nop命令とは、no operation命令のことであり、つまり「何もしない命令」のはずです。このオペランドは何でしょう？？？

## chatGPTに聞いてみた
気になったのでchatGPT君に聞いてみました。
すると、次のように返してくれました。
>なぜオペランド付きの nop を使用するのか？
    コードアラインメントの最適化:
    マルチバイトの nop 命令を使って、特定のアドレス境界にコードを揃えるために使用されます。これは、キャッシュラインやメモリアラインメントの観点から重要で、CPU のパフォーマンス向上に寄与します。
命令パディング:
特定のサイズのパディングが必要なときに、異なるバイト長の nop を挿入することで、コードのアドレスを整えることができます。例えば、1バイトの nop ではなく、5バイトの nop を使うことで命令のアラインメントを調整できます。

    
どうやら、一言で言ってしまえば **「コードのデータ長を都合のいいように調整するため」** らしいです。したがって、こちら側としては依然としてno operation、飛ばし読みしてかまわなそうです。

## 終わりに
なんか間違いがあれば教えてください。
【git】管理外の資産を含めた差分をテキストファイルに出力する


gitの差分を他者へ共有したいとき、差分が大量にあるとファイル名の一覧をコピーしてチャットに貼り付け。
というのが面倒な上相手にとっても見づらいかなと思い、テキストファイルに吐き出す形としました。

```
git status --untracked-files=all > xxx.txt
```
Web ONNXで、failed:Protobuf parsing failedでハマる。

# まとめ onnxファイルが本当に壊れてて、ブラウザーキャッシュに残ってた。
久しぶりだったので忘れたたが、Javascript/ブラウザーでよくあるキャッシュに壊れたファイルが残ってて。それを見に行ってた。

今、ログを見直せば、サーバー側に onnxファイルにアクセスしてるログがなかった。

ちなみに、wasmは　mime/typeは以下で返すといい。
```
return "application/wasm"
```
僕はプログラムを教えられない。

# 僕はプログラミングを教えられない。
先日、エンジニアの交流会で「僕らはプログラミングを教えられない」という話を聞いた。
いや、そんなことはないだろう？と思って話を聞いていたが最後には、確かに僕はプログラミングを教えられないと納得していましたった。

僕はゲーム開発を20年以上行っておりプログラマ歴も同様に20年以上ということになる基本的な構文などはもちろん教えらえるが、僕はプログラミングを教えられないのだということを認識した。

# バグの臭い
コードの臭いよりもバグの臭いの方が臭そうなので好きだ。
コードの臭いはリファクタリングを行うべきいくつかのパターンで治すべきパターンだが、バグの臭いと言うのはもっとわかりにくく臭いものだと思う。

複雑な参照構造からなる迷路のそうな実装、非同期によるすれ違い処理、はたまた初期化時の誤入力まで大きなものから小さなものまで大量に存在する。
一見正しく動作するように見えるがひょんなことから不具合として顔出してくるから非常に厄介だ。

*昔、memcpyの範囲をミスしていて不具合をだされた事があった、これの修正に1日を費やしたのはいい思い出である。
ああ...もう一つ思い出した...マルチスレッドの切り替えタイミングではまる不具合は発生頻度も低く非常に追いにくい不具合だった、その経験から非同期やマルチスレッドを避けがちになった。*

長くプログラミングを行っているとバグの臭いを感じる方法が身についてくる。

# 嗅覚の鍛え方
バグの臭いの嗅ぎ方をどうやって教えるか、コードレビューなのか、ペアプロなのかまだ何も試していないので正直わからない。

「ここ、バグの臭いするから直して」なんてレビューは出来るわけがない。
「この処理はAって危険性があってBってパターンでCってバグになる可能性があるから修正して」なげぇよ！毎回してきされたら、もうお前が書けよ！ともなりそうだ。

結局のところしばらくは経験によって鼻を鍛えていくしかないのだと思う、ただ最近はプロジェクトの長期化やタイトルの運営など鼻を鍛えるタイミングが減っている。

# やっぱり僕はプログラミングを教えられない。
バグの臭いなどプログラミングには経験からなる部分も多く、それを言語化できない。
これはプログラミングだけでなく、仕様から発生するバグの臭いもある。これに気が付けるかどうかで作業量は倍近く変わると思う。
やっぱり僕はプログラミングを教えられないのだと思う。

# 終わりに
文章を書くのは苦手だが興味本位からQiitaへ初めて投稿を行っています。
何か指摘があればコメントにて記載していただければ幸いです。
【Python】Tkinterのウィジェットにはどんなものがあるか

Pythonで手軽にデスクトップアプリを作成できるTkinterには様々なウィジェット(アプリの中身を構成する部品)が用意されています。
どんなものがあるのか、簡単ではありますが代表的なものを軽くご紹介させていただきます。
Python、Tkinterについての説明は割愛しておりますのでご了承ください。

## 最初に
コードの下記部分は各ウィジェットで共通となります。
```python
import tkinter            # Tkinterのインポート

root = tkinter.Tk()       # アプリのウィンドウを作成
root.title('ウィジェット') # ウィンドウにタイトルを表示
root.geometry('400x300')  # ウィンドウの大きさを設定

root.mainloop()           # アプリを実行
```

## 代表的なウィジェット
### Label
主な用途：文字を表示させる。
```python
import tkinter

root = tkinter.Tk()
root.title('ウィジェット')
root.geometry('400x300')

# Labelの作成
label = tkinter.Label(root,
                      text='label text' #「text='xxx'」で表示する文字を設定
                      )
label.pack()

root.mainloop()
```
実行結果
![スクリーンショット 2024-08-17 155339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/e0fae8d4-2225-5937-6692-ae1f16f22348.png)

### Button
主な用途：ボタンの表示、ボタン押下による関数の実行など。
```python
import tkinter

root = tkinter.Tk()
root.title('ウィジェット')
root.geometry('400x300')

def click():
    print('Hello World')

# Buttonの作成
button = tkinter.Button(root,
                        text='Button', #「text='xxx'」でボタンに表示する文字を設定
                        command=click  # click関数の実行
                        )
button.pack()

root.mainloop()
```
実行結果
![スクリーンショット 2024-08-17 160752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/4c35a84b-f360-342d-5f1f-4d9270b3129f.png)

上記コードではボタン押下によってターミナルに文字を表示するclick関数を実行しています。
「command」オプションに関数名を渡すことで関数を実行できます。
この際通常の関数の実行とは違い、関数名の後ろに「()」は付けないことにご注意ください。

### Entry
主な用途：テキストボックスの表示。
```python
import tkinter

root = tkinter.Tk()
root.title('ウィジェット')
root.geometry('400x300')

# テキストボックスの作成
entry = tkinter.Entry(root)
entry.pack()

root.mainloop()
```
実行結果
![スクリーンショット 2024-08-17 163540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/54db6eea-9052-7db7-3b1d-28493fe0bcd5.png)
テキストボックスを表示させる単純なものですが、前述のButtonと組み合わせて、関数に引数として渡すなど様々なことに使用します。

### Combobox
主な用途：コンボボックスの表示。
```python
import tkinter
from tkinter import ttk # ttkのインポート

root = tkinter.Tk()
root.title('ウィジェット')
root.geometry('400x300')

# コンボボックスの作成

item_list = ['りんご', 'バナナ', 'メロン', 'ブドウ'] # リストの作成
combobox = ttk.Combobox(root,
                        values = item_list         # リストをセット
                        )
combobox.pack()

root.mainloop()
```
実行結果
![スクリーンショット 2024-08-17 165341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/d3caaaa3-d037-cf31-ee8f-d36cc854029d.png)
Comboboxウィジェットはttkで新しく追加されたウィジェットなので、インポートをお忘れなく。
コンボボックスの作成にはリストを使用します。
「values」オプションにリストを渡すことでコンボボックスを作成することができます。

## ウィジェットのオプションやその他のウィジェット
今回の紹介では基本的な表示のみを行いましたが、各ウィジェットに用意された様々なオプションを設定することで色や大きさ、表示位置などを設定することができます。
例えば「label.pack()」の「side」オプションに「'bottom'」を渡し、「label.pack(side='bottom')」とすることで、ウィンドウの下側に文字を表示させることができます。
また、記事で紹介したウィジェットは極々一部です。
他にも様々なウィジェットや使い方がありますので、是非参考元サイトもご覧になってみてください。

## 参考
[【tkinter】ウィジェット・関連ツールの使い方一覧【Python】](https://www.python-beginners.com/entry/20210607/1623057987 "【tkinter】ウィジェット・関連ツールの使い方一覧【Python】")
プログラムのネーミングに困ったらCodic

こんにちは、WEBエンジニアの堀井です。

今回はネーミングの付け方についての記事になります。

# はじめに
プログラマであれば一度は変数名やメソッド名の付け方（ネーミング）に悩んだことがあると思います。
私が初心者の頃はメソッド名を考えるだけで５分かかったりしてしまうこともありました。
そんなお悩みを一瞬で解決してくれるサービス __「Codic」__ を紹介したいと思います。

# Codicとは
Codicとは、日本語を入力することで英語のネーミングを生み出してくれる基本無料のWEBサービスです。

https://codic.jp/engine

# 使い方
使い方は簡単で、左側の入力欄に日本語を入力するだけです。
また、改行することで複数入力することもできます。

### 普通に入力してみる
いくつか入力してみます。

![スクリーンショット 2024-08-26 20.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/4751f5e7-f437-c5da-b525-723530300a6f.png)

この結果を見ると、プログラマらしく「〜かどうか」と書くと「Is〜」となり、「〜できるかどうか」と書くと「Can〜」となってますね。

いい感じです。

### 結果の記法を変更する

現在は結果の記法が「PascalCase」になっていますが、これを変更することもできます。
左上の「Aa」となっている箇所をクリックすると記法一覧が表示されるので、そこから選択することで変更できます。

![スクリーンショット 2024-08-26 21.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/aa375c17-5877-12e0-2a53-b408d884ad04.png)

試しに「snake_case」にしてみましょう。

![スクリーンショット 2024-08-26 21.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/e994a973-ba0c-c389-8cda-266cd1d7e2ac.png)

いい感じですね。
これでそのままコピペで使えそうです。

# まとめ
今回はネーミングサービスのCodicを紹介しました。

ネーミングに悩んで時間を使うくらいであれば、このようなサービスを使って一瞬でネーミングをつけることで他の作業時間を増やすことができるので、積極的に使っていくのも良いかと思います。

以上、堀井でした。
JavaScriptの式と文

## アジェンダ
JavaScriptの式の文について簡潔に備忘録としてまとめます。

## 式 (Expression)
**値を生成する**ものです。
例えば、数値や文字列、関数の呼び出しなどが含まれます。
```javascript:例
5 + 3  // 式：値8を生成する
'Hello' + 'World'  // 式：文字列"HelloWorld"を生成する
x > 10  // 式：真偽値を生成する
```

## 文 (Statement)
**特定の動作を実行**するための命令です。
文は必ずしも値を返す必要はありません。
```javascript:例
let x = 5;  // 代入文：変数xに5を代入する

if (x > 10) {
  console.log('x is greater than 10'); 
}  // 制御文：条件に基づいてコードを実行する

for (let i = 0; i < 5; i++) {
  console.log(i);
}  // 繰り返し文：繰り返し処理を行う
```

## まとめ
式は値を生成し、文は動作を実行します。
式が文の中に含まれることもありますが、文は単独で実行可能で、コードの動作を決定する役割を持っています。
Windows Server 2016でSSHが使えない問題の解決方法

# はじめに
Windows Server 2016でSSH接続を試みた際に、OpenSSHがインストールされていなかったため、接続できずに作業が滞ってしまいました。
この記事では、その解決方法について紹介します。

# 目次
1. [問題の発端](#Chapter1)
1. [解決方法](#Chapter2)
1. [参考文献](#reference)

<a id="#Chapter1"></a>
# 問題の発端
Windows Server 2016でリモートサーバにSSH接続しようとしたところ、標準ではOpenSSHがインストールされていないため、接続ができませんでした。
以下のようなエラーメッセージが表示されることがあります。

```bash
'ssh' is not recognized as an internal or external command, operable program or batch file.
```

このエラーメッセージは、SSHコマンドが認識されていないことを示しており、OpenSSHがインストールされていない可能性があります。

<a id="#Chapter2"></a>
# 解決方法
以下の手順でOpenSSHをインストールし、SSH接続を可能にしました。

1. **OpenSSHのインストール**
   - [Server World](https://www.server-world.info/query?os=Windows_Server_2016&p=openssh)のガイドに従い、Windows Server 2016にOpenSSHをインストールしました。

2. **インストール手順**
   - OpenSSHクライアントおよびサーバをインストール。
   - サービスの起動と自動起動の設定を行いました。

3. **SSH接続の確認**
   - インストール後、以下のコマンドを使用してサーバーのバージョンを確認し、SSH接続が正常に動作することを確認しました。

   ```bash
   ssh -V
   ```

   実行結果の例:

   ```bash
   OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
   ```

   このように、OpenSSHのバージョン情報が表示されれば、インストールが成功していることを確認できます。

<a id="#reference"></a>
# 参考文献
- [Server World - OpenSSHのインストール (Windows Server 2016)](https://www.server-world.info/query?os=Windows_Server_2016&p=openssh)
git push --force したくなった時の事故防止オプション

```
# NG
git push --force

# OK
git push --force-with-lease --force-if-includes
```

- `--force` 制限なしにpush
- `--force-with-lease` fetchしてないとコケる
- `--force-if-includes` fetchしてもコミットが取り込まれてないとコケる

オプションが長いのでエイリアスを登録する

```
git config --global alias.pushf 'push --force-with-lease --force-if-includes'
```

```
git pushf
```

## 参考

https://scrapbox.io/Nodewww/git_push_-f_%E3%81%AF_--force-if-includes_%E3%82%92%E4%BD%BF%E3%81%88
AWSのAuroraPostgreSQLで遅いSQLを調査する方法

## 作業リスト

1. SQLの実行ログを出力するように設定変更
1. ログから指定した処理時間以上のログを抽出

## 作業内容

### 1. SQLの実行ログを出力するように設定変更

PostgreSQLのパラメータグループで以下の設定を変更します。
今回は、CloudWatchの方で処理時間を指定するのですが、処理時間が300ms未満を除外しておきたいので`300`を指定します。
これで、300ms以上かかるSQLと処理時間がログに出力されます。
※処理時間に関わらず全て出力したい場合は`0`を指定します。

|項目名|設定値|備考|
|--|--|--|
|log_min_duration_statement|300|SQL実行にかかったミリ秒を指定|

#### (参考)マネジメントコンソールの画面
RDSのパラメータグループの設定から、AuroraのClusterで利用する設定値を以下の通り変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/de180f37-aa79-1bbe-29fc-b462a8bdf817.png)

※タイプの適用が`Dynamic`となっているので動的に設定されます。

### 2. ログから指定した処理時間以上のログを抽出

今回は、1000ms超のログを抽出します。
CloudWatchのログのインサイトにて、以下のクエリを作成して実行します。

```sql
fields @message
| filter @message like /duration:/
| parse @message "duration: * ms" as duration
| filter duration > 1000
| sort duration desc
| display @timestamp, duration, @message
```

#### (参考)マネジメントコンソールの画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/13011d46-4c0f-77a3-a458-af1aabd32bb1.png)

## 最後に

- 開発中は、この遅いSQLのログは開発中に随時チェックすることで変なSQLが無いか随時チェックしましょう
- 開発者以外も見られるように、CloudWatchのダッシュボードを共有することでログを見られるようにするのもお勧めです
ArduinoUno: ホルムアルデヒドセンサー SFA30 を使う

こちらにあるサンプルプログラムをそのまま使いました。
[Play with Arduino Software](https://wiki.seeedstudio.com/Grove-Formaldehyde-Sensor/#software)

![sfa30_aug27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ca08a15a-c90b-a26e-b852-6a291c3707f4.jpeg)

## プログラム

```text:i2c_read.ino
#include <Arduino.h>
#include <SensirionI2CSfa3x.h>
#include <Wire.h>

SensirionI2CSfa3x sfa3x;

void setup() {

    Serial.begin(115200);
    while (!Serial) {
        delay(100);
    }

    Wire.begin();

    uint16_t error;
    char errorMessage[256];

    sfa3x.begin(Wire);

    // Start Measurement
    error = sfa3x.startContinuousMeasurement();
    if (error) {
        Serial.print("Error trying to execute startContinuousMeasurement(): ");
        errorToString(error, errorMessage, 256);
        Serial.println(errorMessage);
    }
}

void loop() {
    uint16_t error;
    char errorMessage[256];

    delay(1000);
    int16_t hcho;
    int16_t humidity;
    int16_t temperature;
    error = sfa3x.readMeasuredValues(hcho, humidity, temperature);
    if (error) {
        Serial.print("Error trying to execute readMeasuredValues(): ");
        errorToString(error, errorMessage, 256);
        Serial.println(errorMessage);
    } else {
        Serial.print("Hcho:");
        Serial.print(hcho / 5.0);
        Serial.print("\t");
        Serial.print("Humidity:");
        Serial.print(humidity / 100.0);
        Serial.print("\t");
        Serial.print("Temperature:");
        Serial.println(temperature / 200.0);
    }
}
```

## Arduino IDE



次のライブラリーをインストールしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/00271921-3803-54d2-a453-f1e1d37a4ec8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/28c1147b-6ffe-d0f5-4ac0-ad02ee5019d3.png)
Gitプッシュ時に発生したHTTP 500エラーの解決方法

## 概要

ローカルリポジトリのコミットをプッシュしようとした際、HTTP 500エラーが発生してしまいました。
この記事では、この問題の原因と、それを解決するために行った手順を紹介します。

## 表示されたエラーメッセージ
### SourceTreeでのエラーメッセージ

SourceTreeからプッシュを試みた際に、以下のエラーメッセージが表示されました。

```bash  
git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags --set-upstream my-repository refs/heads/my-branch-name:refs/heads/my-branch-name  
Pushing to https://gitlab.com/****.git  
POST git-receive-pack (chunked)  
error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500  
send-pack: unexpected disconnect while reading sideband packet  
fatal: the remote end hung up unexpectedly  
Everything up-to-date  
Completed with errors, see above  
```

### ターミナルでのエラーメッセージ

試しにターミナルからもプッシュしてみましたが、同様にHTTP 500エラーが発生しました。

```bash  
% git push my-repository my-branch-name  
Username for 'https://gitlab.com': ****  
Password for 'https://****@gitlab.com':  
Enumerating objects: 99, done.  
Counting objects: 100% (99/99), done.  
Delta compression using up to 16 threads  
Compressing objects: 100% (74/74), done.  
error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500  
send-pack: unexpected disconnect while reading sideband packet  
Writing objects: 100% (75/75), 3.59 MiB | 3.73 MiB/s, done.  
Total 75 (delta 22), reused 0 (delta 0), pack-reused 0  
fatal: the remote end hung up unexpectedly  
Everything up-to-date  
```

## 解決方法

この問題を解決するために、GitのHTTPバッファサイズを増やす設定を行いました。
通常、Gitのデフォルト設定ではバッファサイズが小さいため、大量のデータをプッシュする際にエラーが発生することがあります。
バッファサイズを増やすことで、データの送信が正常に行えるようになります。

### 手順

1. **ターミナルでGitリポジトリのディレクトリを参照する**

   まず、ターミナルを開いて、Gitリポジトリが保存されているディレクトリに移動します。以下のコマンドを使用して、目的のディレクトリに移動します。

   ```bash  
   cd /path/to/your/repository  
   ```

   `/path/to/your/repository` を実際のリポジトリのパスに置き換えてください。例えば、リポジトリが `Documents` フォルダにある場合、次のようになります。

   ```bash  
   cd ~/Documents/your-repository  
   ```

   正しいディレクトリに移動したことを確認するには、以下のコマンドでディレクトリの内容を表示できます。

   ```bash  
   ls  
   ```

   このコマンドで、リポジトリ内のファイルとフォルダが表示されれば正しいディレクトリにいます。

2. **HTTPバッファサイズを増やす**

   次に、以下のコマンドを実行して、バッファサイズを500MBに増やします。

   ```bash  
   git config --global http.postBuffer 524288000  
   ```

   この設定により、Gitがデータを送信する際に使用するバッファサイズが増加し、通信の安定性が向上します。

3. **再度プッシュを試みる**

   バッファサイズを増やした後、再度プッシュ操作を実行します。

   ```bash  
   git push your-remote-name your-branch-name  
   ```

   この結果、プッシュが正常に完了し、エラーが解消されました。

## 結論

今回の問題は、SourceTreeとターミナルの両方からプッシュを試みた際にHTTP 500エラーが発生しましたが、Gitの**HTTPバッファサイズを増やす**ことで解決しました。

同様のエラーが発生した場合、今回のようにバッファサイズを調整することで解決できる可能性があります。
ネットワーク環境やリモートサーバーの状態も関係するため、問題が続く場合はサーバーのステータス確認やネットワーク設定の見直しも検討した方がいいかもしれません。
【ElasticBeanstalk】新規環境構築をする時に、DBを作成しなければ！

どうもこんにちは。

今回はRailsを動かすためのEB環境を構築した時にDBの作成を忘れてつまづいたので、メモします。

# 前提

今回は、`RDS`と`ElasticBeanstalk`の作成は済んでいることとして話を進めます。

# ぶつかった壁

`RDS`と`ElasticBeanstalk`を作成し、開発したRailsアプリケーションをデプロイしました。

すると、以下のようなエラーが出てきました。

```ruby
Unknown DataBase
```

RDS作成したのにデータベースがない？？？

# 結論

結論として、RDSを作成しただけでは、データベースは作成されないようです。

RDSは、**データベースを作成するための箱**だと解釈しました。

なので、AWSのセッションマネージャー or SSH接続（`eb ssh`）でEB環境に接続して、データベースを作成するコマンドを叩く必要があります。

以下の手順で作成できます。

```sh
$ eb ssh
```

```sql
> mysql -u ユーザ名 -h ホスト名 -p
-- パスワードを求められるので入力

> SHOW DATABASES;
-- RDS内に存在しているデータベースを確認

> CREATE DATABASE データベース名;
-- データベースを作成
```

データベースの名前を間違えたりしたら、以下のコマンドを実行します。

```sql
> DROP DATABASE 削除するデータベース名;
```

データベースを作成したら、デプロイを実行しましょう。

以上
逆三角関数ってなんだろう？

# 三角関数とは
中学校で習う、こんなやつ。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/f76ae12a-3af1-66e2-7d9a-aba51720b93f.png)

半径１の円に接している斜辺が１のこんな直角三角形。
これに対して以下の様に決める。
```
sinθ=対辺/斜辺
cosθ=隣辺/斜辺
tanθ=対辺/隣辺
```

と、ここまでは覚えてたけど逆三角関数が教科書で出てきて「？？」となった

## 逆三角関数

![Untitled２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722467/3c8292fa-e50b-d134-39cc-a66095a04f15.png)
これはarcsin(h)と同義とする。

hは高さ。

hは１からー１の範囲で、その時θは-π/2からπ/2まで動けばよい。
h=0.5（1/2）だとすると

斜辺１、対辺1/2の直角三角形を考えると、θは30°。
つまり下記のようにあらわせる
```
θ = arcsin(0.5)=π/6
```
対辺がhのsinならθはいくつになる？と考えればよいかな？
高校でならったはずなのにすっかり忘れていました。もう少し勉強します。