OmniAICreator/Qiita-1.07M huggingface dataset:
Astroのテーマ「Openblog」の本文に画像が表示されない問題

静的サイトジェネレータの一つとして最近注目を集めているフレームワークの一つに[Astro](https://astro.build/)があります。

そのテンプレートは[こちら](https://astro.build/themes/)から選べます。最近の注目リポジトリについてはGitHubの[Trending Astro repositories on GitHub today](https://github.com/trending/astro)から確認できます。

テーマの中で注目を集めているのは[Openblog](https://github.com/danielcgilibert/blog-template)です。見栄えもよく、無料で大変使い勝手のいいテーマだと思います。

しかし、このテーマには一つ、大きな問題があります。それは（少なくとも私の環境では）「本文中の画像の表示ができない」ことです。

# 解決方法

結論から言うと、GitHubの以下の議論を見てください。

- [Image In Post Body Cannot Displayed #56](https://github.com/danielcgilibert/blog-template/issues/56)

投稿者は以下の点を問うています。

- （Head部分にある）Hero Image（カバー画像）はdist/_astroディレクトリに格納され、ちゃんと見える
- しかしMDXファイルのBody部分の画像ファイルはdist/_astroディレクトリに格納されない
- 結果としてBody部分の画像が表示されない

ほかの方々も以下の現象を報告しています。

- TinaCMSで画像を指定して`src/assets/images`ディレクトリに入れても反映されない

解決方法としては、画像を`public/images`ディレクトリに保存し、以下のコードをastro.config.mjsに書き加えると解決できるそうです。（私は未挑戦）

```typescript:astro.config.mjs
export default defineConfig({
	media: {
		tina: {
			// mediaRoot: '/src/assets/images',
			// publicFolder: ''

			mediaRoot: '/public/images',
			publicFolder: ''
		}
	}
})
```

しかし、いまだに明確な解決方法は見つかっていないようです。

## 結論
私が作ろうとしていたブログは画像がメインだったので、画像の問題でドハマリしてしまってはにっちもさっちもいきませんので、別のテーマを選ぶことにしました。転進というやつです。（[fuwari | astro](https://astro.build/themes/details/fuwari/)にしました。）

[Demo](https://blog-template-gray.vercel.app/)ではカバー画像以外、Body部分には画像を使っておらず、この問題が生じないようにしています。

Qiita、Zenn、Stackoverflowで調べても同様の話題は出てこず、デプロイしたCloudflare Pagesの問題かと思いましたが、Cloudflareのページでもそんな問題は起きていないようでした。Astroのページでも画像の保管場所についての話が出てくるだけです。灯台下暗し、結局、GitHubで見つかりました。

さらに厄介なのが、local環境ではちゃんとbody部分の画像が表示されることです。デプロイする際に画像の圧縮と`dist/_astro`ディレクトリへの移動をするはずが、うまくできていないのがそもそもの原因のようです。そのため、CloudflareやAstroに原因があるのではなく、このテーマ「Openblog」に原因があるようです。

私はTypeScriptに詳しくないので、解決方法は思いつかず…わかったのは以上のようなことでした。
【覚書】pythonコピペ関数(001)

# 個人用覚書

個人的に使用頻度が高い割に忘れがちなコードをまとめておきます。

# 標準モジュール
## 日付→文字列

```sample.py
from datetime import datetime

def get_current_date_time_string():
    current_date = datetime.now()
    return current_date.strftime("%Y年%m月%d日%H時%M分")

# 関数の使用例
print(get_current_date_time_string())
```

# ファイルI/O
## jsonファイル
### 読み込み
```sample.py
import json

def load_json_file(file_path):
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            data = json.load(file)
        return data
    except FileNotFoundError:
        print(f"エラー: ファイル '{file_path}' が見つかりません。")
        return None
    except json.JSONDecodeError:
        print(f"エラー: ファイル '{file_path}' の JSON 形式が無効です。")
        return None
    except Exception as e:
        print(f"エラー: ファイルの読み込み中に問題が発生しました: {str(e)}")
        return None

# 関数の使用例
file_path = 'path/to/your/file.json'
json_data = load_json_file(file_path)

if json_data is not None:
    print(json_data)

```

### 書き込み
```sample.py
import json

def write_json_file(file_path, data):
    try:
        with open(file_path, 'w', encoding='utf-8') as file:
            json.dump(data, file, ensure_ascii=False, indent=2)
        print(f"JSONデータが '{file_path}' に正常に書き込まれました。")
    except IOError:
        print(f"エラー: ファイル '{file_path}' に書き込めません。")
    except TypeError:
        print(f"エラー: 指定されたデータはJSON形式に変換できません。")
    except Exception as e:
        print(f"エラー: ファイルの書き込み中に問題が発生しました: {str(e)}")

# 関数の使用例
data = {
    "名前": "山田太郎",
    "年齢": 30,
    "趣味": ["読書", "旅行", "プログラミング"]
}

file_path = 'path/to/your/output.json'
write_json_file(file_path, data)
```

# beautifulsoup
## divタグの中にaタグがある要素のみを選択する

```sample.py
loop_tag_section = soup.select("div:has(a)")
```
paizaラーニングレベルアップ問題集の「N行のデータの入力」をやってみた

paizaラーニングレベルアップ問題集の[N行のデータの入力](https://paiza.jp/works/mondai/stdin/stdin_n_line)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/stdin/stdin_n_line
- - -
###### 方針
- 整数$N$を受け取る
- $N$回「[1行のデータの入力](https://qiita.com/anonymously115/items/50ed25f7748f1cb1b426)」を繰り返す
	- [3行のデータの入力](https://qiita.com/anonymously115/items/369d00a577e8951f04be)のコードの`3`を`n`に変えればよいです
- - -
###### C
```c
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		char s[102];
		printf("%s", fgets(s, sizeof(s), stdin));
	}
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s;
		getline(cin, s);
		cout << s << endl;
	}
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int n = int.Parse(Console.ReadLine());
		for (int i = 0; i < n; i++) Console.WriteLine(Console.ReadLine());
	}
}
```
- - -
###### Go
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	var n int
	fmt.Scan(&n)

	scanner := bufio.NewScanner(os.Stdin)
	for i := 0; i < n; i++ {
		scanner.Scan()
		fmt.Println(scanner.Text())
	}
}
```
- - -
###### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine(); // 改行コードを読み捨てる。
		for (int i = 0; i < n; i++)
			System.out.println(sc.nextLine());
		sc.close();
	}
}
```
- - -
###### JavaScript
```js
const lines = require("fs").readFileSync("/dev/stdin", "utf8").split('\n');
const n = Number(lines[0]);
for (var i = 1; i <= n; i++) console.log(lines[i]);
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	val n = sc.nextInt()
	sc.nextLine() // 改行コードを読み捨てる。
	repeat(n) {
		println(sc.nextLine())
	}
	sc.close()
}
```
- - -
###### PHP
```php
<?php
	$n = intval(fgets(STDIN));
	for ($i = 0; $i < $n; $i++)
		echo trim(fgets(STDIN)) . PHP_EOL;
?>
```
- - -
###### Perl
```pl
chomp(my $n = <STDIN>);
for (my $i = 0; $i < $n; $i++) {
	chomp(my $s = <STDIN>);
	print "$s\n";
}
```
- - -
###### Python3
```py
for _ in range(int(input())):
	print(input())
```
- - -
###### Ruby
```rb
gets.to_i.times do
	puts gets
end
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	for (_ <- 1 to readInt()) println(readLine())
}
```
- - -
###### Swift
```swift
for _ in 1...Int(readLine()!)! {
	print(readLine()!)
}
```
【書評】SQL緊急救命室

# 読んだ本

https://gihyo.jp/book/2024/978-4-297-14405-0

# 感想

SQL緊急救命室という病院の診療科にやってくるクエリ（患者）をメンバー３人で直していくという会話形式でまとまっていて読みやすい。読み終えたあと知ったのだが、2012年頃のWEB連載を加筆した内容みたいだ。記載されている技術的内容には関係ない話だが、少し前時代的な空気を感じた理由が分かった。

モダンSQLの必須技術として、CASE式とウィンドウ関数の説明から始まり、それらを使ってどう改善できるのかが解説されていく。CASE式は使っていたが、到底使いこなせているとは言えない状況だったので学びが多かった。そしてウィンドウ関数についてはほとんど使ったことがない状態で、学び直しの大切さが身にしみて分かった。実務ではDB負荷を限界まで下げる必要があり、本書ではアンチパターンだったが手続き的にアプリケーション側で処理することが多かった。そのためか、8章で扱われているHAVINGなど、データベースを集合指向で考える能力が低いことが再認識できた。

良かったと思う点として、特定のベンダーに依存しないように書かれているのが良かった。普段はMySQLを使うことが多いが、他のRDBを使うことになっても活かせる知識が学べたのはありがたかった。章末に演習問題があるのだが、回答が本の末尾に記載されていて、電子だと読み辛かったので紙の本をおすすめしたい。

# おすすめの人

- SQLを業務で使っているが、習得してから時間が経っている人

# 次に読むなら

- 著者が[読書ガイドマップ](https://x.com/copinemickmack/status/1871863629706096770)を作ってくれていたので参考にしたい
circuitjsの作法 その33

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレーで、発振回路を作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/518ebd29-0b68-b3e3-0af9-6dd31152e1aa.png)


# ネットリスト

```
$ 1 0.000005 54.00526672067058 50 5 50 5e-11
178 416 192 416 320 6 1 0.2 0.018652751447031928 0.05 1000000 0.02 20 0.015 0.005 0
r 384 320 384 416 0 150
g 384 416 384 448 0 0
R 272 112 208 112 0 0 40 5 0 0 0.5
w 416 112 416 192 0
w 384 192 384 160 0
w 384 160 496 160 0
c 304 208 304 304 0 0.0033 0.41349089072160883 0.001
w 304 208 304 160 0
w 304 160 384 160 0
w 304 304 304 320 0
w 304 320 384 320 0
w 272 112 320 112 0
s 320 112 416 112 0 0 false
w 432 320 496 320 0
w 496 160 496 320 0
o 1 64 0 4099 5 0.1 0 2 1 3

```

以上。
iOSのエミュレーターでタップ位置を表示する方法

iOSのエミュレーターでタップ位置を表示する方法です。

シュミレータのSettingsをタップします。
![スクリーンショット 2025-01-11 17.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/79a17a73-d674-159d-0ddb-7cb266572b5a.png)

Show single touchesにチェックを入れるとタップ位置を表示することができます。
![スクリーンショット 2025-01-11 17.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/d97bbdb5-ea01-cfac-f401-cdbec14b28db.png)


以上です。
【サービス運用】なぜなぜ分析について

# なぜなぜ分析とは
トヨタが作ったといわれている。
なぜを繰り返して、問題を解決に導く手法。
**問題の再発を防ぐためい、発生した事象の根本原因を徹底的に洗い出す**ための考え方。

https://infinity-agent.co.jp/lab/5whys-nazenaze-analysis/

障害などが起こったときに、これを行う事でサービス運用を円滑に進めていく事ができる。

## ポイント

### とりあげる事象は具体的に設定する。
* ミスをした。
* XXが低かった。
というような表現ではなく、
* 取引先A社へメールで送る〇〇の資料の✕✕の部分に誤りがあった
* 先月の売上が目標〇〇円に対して✕✕％下回った

というような表現にするべき。

### 原因→結果の関係にする。

原因があったから事象が発生した。
という論理構造を常に意識すること。

悪い例

事象：メールの宛先を誤った －　要因：作業者は以前からミスが多かった

これでは、原因にはなってない。

### 人を疑う前に仕組みを疑う。

XXさんの技術力が。。。業務態度が。。。
というような内容では、謝罪だけになってしまうかもしれない。
これでは人の入れ替わりによって再度問題が発生するかもしれないし、組織として成長は望めない。

たとえば、レジ打ちで値段を間違えたという事象があった場合、
- レジ打ちの注意不足だった→X
- マニュアルが間違っていた→O
というような考え方をするべき。

# 基本的な考え方。

1. 発生事象はどのような事か。
1. 1W として、なぜその事象が発生したかを考える。
1. それをもとに、次のWhy（2W）を考える。。
1. 2W,3Wは、なぜの要因が分岐する（ツリー構造になる）こともある。
1. なぜの分析を進めていく中で、最下層にある原因の部分が、解決すべき問題になる。
1. それを全部やるのは理想だが、コストやリソースが掛かりすぎる事も懸念される。
1. なので、**原因の中で、これを実行することによって最も効果的になると思われる箇所を優先的に対応する。**
    1. 場合によっては、一つの解決策の実行によって複数の原因が解決することもある。


基本的に、最下層の部分はルールの有無と、フローの有無になる事が多い。

- そういうフローになっていなかった。
- XXするルールになっていなかった。
- 管理体制・コントロールができていなかった。

それらを組み込む事が多くなるパターンが多い。

![image-20250108-020006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/49d533e7-8879-3ee9-21b0-729dc42d9ab5.png)
Data Scienceコースの学習開始

先日Udemy内で購入したコースの学習を開始しました。
５つの講義を購入した中で、最初に始めたのは「Python for Data Science and Machine Learning Bootcamp」。

選んだ理由はpythonのインストールから始まっていて初学者に考慮してくれてそうだと思ったので。

今日はセクション３まで終了。
セクション１でコースの概要紹介とセクション２，３でpythonのインストールと環境設定、セクション３で触れられていた仮想環境に関しては異なるver間でのデータのやり取りは直近やらないだろうなと思いながら聞き流していました。

なのでまだコーディングや分析の中身に入っていないので、具体的な気づきってのは無いのですが、感じたこととしては複数ディスプレイがあると便利だなと。

私は私有PCではそんなに大した作業をしないのでマルチモニタってのは使っていないのですが、この講義を進めていくにあたっては講義用のモニタとコーディング用のモニタがあるとすごく助かる。
今は１つのモニタでウインドウをいったりきたりしながら進めています。

マルチモニタを使っていないので当然外付けモニタってものがないのですが、PCの傍にテレビを置いていて一応そのテレビにHDMI端子を通じて写せるようにはなっているのですが、残念ながらPC側にHDMI端子がないという始末。

USBとの変換コネクタが売ってるとは思うので、こんど買ってこようかな。
【2025年01月版】Proxmox VE 8.3 で構築した開発環境に自動アップデートを入れてみる【unattended-upgrades】

# はじめに

開発環境が多くて、定期的にアップデートと再起動やるのめんどくさいなぁ

セキュリティアップデートと再起動とか自動でやってくれたらいいのに

そうだ、`unattended-upgrades` でやろ、のメモ

# 設定

セキュリティアップデートして必要であれば再起動してくれる設定
セキュリティアップデートはデフォルトでしてくれるようになっているはず

```terminal
$ sudo apt install unattended-upgrades  # デフォルトで入っているから必要ないはず
$ sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
$ sudo dpkg-reconfigure unattended-upgrades
```

修正箇所 1

`Unattended-Upgrade::Origins-Pattern` に Proxmox を追加。セキュリティだけなら必要ないかも。

```/etc/apt/apt.conf.d/50unattended-upgrades
"origin=Proxmox,codename=${distro_codename},label=Proxmox Debian Repository";
```

修正箇所 2

```/etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Automatic-Reboot "true";        # 自動再起動を有効化
Unattended-Upgrade::Automatic-Reboot-Time "04:00";  # 再起動時間指定
```

:::note warn
自動アップデートがおこなわれいないようなら、以下の設定になっているか確認する

```/etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";         # パッケージリストの自動更新
APT::Periodic::Unattended-Upgrade "1";           # 自動アップデートの有効化
```
:::


# 確認

## 手動による実行テスト

```terminal
$ sudo unattended-upgrades --dry-run --debug
```

## 実行ログの確認

```terminal
$ sudo less /var/log/unattended-upgrades/unattended-upgrades.log
```

# さいごに

かんたんでしたね
【React】React Router v6でルーティングを実装

# Reactでルーティングを実装
## はじめに
ReactのWebアプリケーションを開発するために、ルーティングの実装方法について勉強したので、その内容を簡単にまとめる。

React Router v6を使ってルーティングを実装する。v6以前とは実装方法に違いがあるため、バージョンの違いに注意。

## 準備
### 前提
前提として、Reactでの開発環境構築は完了しているものとする。環境構築の方法がわからない場合は、[こちらの記事](https://qiita.com/masa12Y/items/0d8b59854bf6d98a3bdf)を参照。

### React Routerのインストール
以下のコマンドを実行して`react-router-dom`をインストールする。

```
npm install react-router-dom
```
バージョンを指定しない場合、最新のバージョンでインストールされる。v6以前のバージョンではルーティングの実装方法が異なるため、バージョンを指定する場合にはv6以降のものになるようにする。

### ファイル構成
本記事では、以下のディレクトリ構成とファイル名で実装を進める。
```
src/
├── main.tsx
├── App.tsx
└── components/
    ├── pages/
    │   ├── Login.tsx
    │   ├── Home.tsx
    │   └── Detail.tsx
    └── router/
        └── Router.tsx
```

実装前の各ファイルの中身は必要であれば下記参照。
<details>
<summary>main.tsx</summary>

```react:main.tsx
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.tsx'

createRoot(document.getElementById('root')!).render(
  <StrictMode>
      <App />
  </StrictMode>,
)
```
</details>
<details>
<summary>App.tsx</summary>

```react:App.tsx
import { Login } from "./components/pages/Login';

function App() {

  return (
    <BrowserRouter>
      <Login />
    </BrowserRouter>
  )
}

export default App
```
</details>
<details>
<summary>Login.tsx</summary>

```react:Login.tsx
export const Login = () => {
    return (
        <p>ログインページです</p>
    );
};
```
</details>
<details>
<summary>Home.tsx</summary>

```react:Home.tsx
export const Home = () => {
    return (
        <p>ホームページです</p>
    );
};
```
</details>
<details>
<summary>Detail.tsx</summary>

```react:Detail.tsx
export const Detail = () => {
    return (
        <p>詳細ページです</p>
    );
};
```
</details>
<details>
<summary>Router.tsx</summary>

```react:Router.tsx
//ファイルのみ作成
```
</details>

## ルーティングの実装
### 手順1 App.tsx内の実装
`react-router-dom`から**BrowserRouter**をimportし、returnする内容をBrowserRouterで囲む。
```react:App.tsx
import { BrowserRouter} from 'react-router-dom'
import { Login } from './components/pages/Login';

function App() {

  return (
    <BrowserRouter>
      <Login />
    </BrowserRouter>
  )
}

export default App
```

### 手順2 Router.tsx内の実装
1. `react-router-dom`から**Routes**と**Route**をimportする。
2. return全体をRoutesで囲む。
3. Routeでルーティングを設定する。
   - path：遷移する際のURLを設定する
   - element：表示するコンポーネントを設定する

以下のコードでは、URLが
- '/'のとき：Loginコンポーネント
- '/home'のとき：Homeコンポーネント
- '/detail'のとき：Detailコンポーネント

という形でルーティングされ表示される。
```react:Router.tsx
import { Routes, Route } from "react-router-dom";
import { Login } from "../pages/Login";
import { Home } from "../pages/Home";
import { Detail } from "../pages/Detail";

export const Router = () => {
    return (
        <Routes>
            <Route path="/" element={<Login />} />
            <Route path="/home" element={<Home />} />
            <Route path="/detail" element={<Detail />} />
        </Routes>
    );
};
```

## まとめ
1. `react-router-dom`をインストール
2. **BrowserRouter**を設定
3. **Routes**内で、**Route**を使ってルーティング内容を設定

以上のように実装することで、ルーティングを実装することができる。
RSpecの:automatic

カスタムオプションファイルが使われているときはRSpecは`./.rspec`を無視する
>## RSpec ignores `./.rspec` when custom options file is used
>Given a file named “my.options” with:
```
--format documentation
```

>And a file named “.rspec” with:
```
--no-color
```
```rb
RSpec.describe "custom options file" do
  it "causes .rspec to be ignored" do
    expect(RSpec.configuration.color_mode).to eq(:automatic)
  end
end
```

### `:automatic`

rubyから色を設定するために`config.color_mode`を導入する。`:automatic`は初期値で、出力がTTYであれば、色を生産する。`:on`は強制的にオンにするそして`:off`は強制的にoffにする。
>introduce `config.color_mode` for configuring the color from Ruby. :automatic is the default and will produce color if the output is a TTY. :on forces it on and :off forces it off.

https://rspec.info/ja/blog/2017/05/rspec-3-6-has-been-released/#:~:text=Introduce%20config.color_mode%20for%20configuring%20the%20color%20from%20Ruby.%20%3Aautomatic%20is%20the%20default%20and%20will%20produce%20color%20if%20the%20output%20is%20a%20TTY.%20%3Aon%20forces%20it%20on%20and%20%3Aoff%20forces%20it%20off

https://rspec.info/features/3-13/rspec-core/configuration/read-options-from-file/#:~:text=should%20all%20pass.-,RSpec%20ignores%20./.rspec%20when%20custom%20options%20file%20is%20used,Then%20the%20examples%20should%20all%20pass.,-Created%20with%20the

# 感想
タイトルの意味と内容が理解できなかった
書いていないリンクの内容も理解できなかった。
アプリ開発日記 3日目

# 背景  
個人でWebアプリケーションを開発します。  
開発のモチベーションを維持し、履歴を記録するために開発日記を残します。  
この記事はあくまで自分向けの記録として書いています。

# 開発するアプリケーション  
**読書管理アプリ**  
読んだ本を効率的に記録・管理し、読書習慣をサポートするアプリケーションです。

# 開発のきっかけ  
- 読書を習慣化するため、さまざまな本を読み、感想をブログに書いていました。  
- 読書習慣を始めた理由は、自己学習の一環として知識を深めたいと考えたからです。  
- 読んだ本をより分かりやすく管理したいというニーズが出てきました。  
- 既存の読書管理アプリを試すことも考えましたが、学習を兼ねて自分で開発することに決めました。

# 前回の進捗  
- サーバ側の実装
- ローカルの開発環境をdockerコンテナで構築する
  - rails v8.0.1 APIモード
  - postgresql v15.3
- 本のデータを取得するAPI機能を開発する
  - Book, User, UserBook のモデルを生成する
  - ISBNコードを生成するPOROを生成する
  - 外部APIへリクエストを投げるクライアントを生成する

# 今回の作業  
1. タスク管理のためにTrelloを導入
    1. Trelloのアカウント作成
    1. チケット作成
1. Google Books APIを有効化
    1. 利用するAPIはまだ検討中
    1. APIの仕様理解
1. 開発環境のバグ修正
    1. 前回作成した環境で動かないところを修正
    1. minitestを動くようにする
1. migration実行
    1. migrateファイルの書き方が一部おかしかった
1. qiitaのテンプレート調整

# 所感  
前回行った作業の一部、主に開発環境の構築の部分で不具合がありました。
すぐに実装に入りたい気持ちから開発環境の構築作業は簡単に済ませてしまったため、
いざ色々動かしてみると、gemを追加するのにパッケージが足らなかったり、設定ファイル間違えていたり、といった初歩的な問題にぶち当たりました。
今日の作業は大半を外部APIのドキュメントを読むことと、バグ・不具合改修に使いました。
納期があるわけではないし、こういう作業も楽しんでやろうという気持ちです。

このポエム記事のテンプレートも少し調整しました。
Linuxの権限についての知識復習と備忘録

# Linuxのファイル権限と`ls -l`コマンドの見方

## ファイルやディレクトリの権限

- 全てのファイルやディレクトリには**所有者**と**グループ**ごとにアクセス権が割り当てられています。  
- Linuxのコマンドでは`ls -l`を入力することで権限の確認が可能です。

```
-rwxrw-r--
```

### 権限の見方（例: `-rwxrw-r--`）

- **3つずつ**がひとかたまりとなって表示されています。  
- **一番左端の1文字**はファイルの種類を表します。  
  - `-` : 通常のファイル  
  - `d` : ディレクトリ  

- 左から順に**「オーナー」**, **「グループ」**, **「その他」**の権限を意味します。

  | 区分      | 権限  | 説明                      |
  |-----------|--------|---------------------------|
  | **オーナー** | `rwx`  | 読み込み・書き込み・実行可能 |
  | **グループ** | `rw-`  | 読み込み・書き込み可能      |
  | **その他**   | `r--`  | 読み込みのみ可能          |

- 各権限の記号の意味：  
  - `r` : **読み取り可能 (Read)**  
  - `w` : **書き込み可能 (Write)**  
  - `x` : **実行可能 (Execute)**  
  - `-` : **権限なし**

---

## 権限と数値の対応表

権限は数値（8進数）で表すことができます。

| 記号 | 数値 | 説明                      |
|------|------|---------------------------|
| `---` | 0  | 権限なし                  |
| `--x` | 1  | 実行のみ可能              |
| `-w-` | 2  | 書き込みのみ可能          |
| `-wx` | 3  | 書き込み・実行可能        |
| `r--` | 4  | 読み込みのみ可能          |
| `r-x` | 5  | 読み込み・実行可能        |
| `rw-` | 6  | 読み込み・書き込み可能    |
| `rwx` | 7  | 読み込み・書き込み・実行可能 |

**例:**  
`-rwxrw-r--` → **オーナー: 7**, **グループ: 6**, **その他: 4** → `764`

---

## 権限の変更方法

### コマンド形式

```
chmod [オプション] [アクセス権] [ファイル名]
```

### アクセス権の指定方法

- **記号**で指定:  
  ```
  chmod -rw-rw-r-- ファイル名
  ```

- **数値**で指定:  
  ```
  chmod 664 ファイル名
  ```

### 数値指定のメリット

数値で指定した方がシンプルで効率的なので、**記号と数値の対応関係**は覚えておくと便利！

---
VRCおすすめワールド

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTrCDTWlHVF5xd_copyxmZl7sdDFYWPd1PJxpFHzHSN8CMGOUwtLS7g9rAKyhwzmXzQwQEnC03EskX2/embed?start=false&loop=false&delayms=3000" frameborder="0" width="1440" height="839" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
ExcelのINDEX関数のおそらく誰も知らない使い方（特定の行と列の値を抽出する）

# はじめに
INDEX関数に最新バージョンのCHOOSEROWS関数とCHOOSECOLS関数をあわせたような使い方を発見しました
これらの関数が使えないEXCELのバージョンでは代用になるのではと思います
INDEX関数は何気に奥が深いです
過去に私が書いた記事も参考までに紹介しておきます

https://qiita.com/takahasinaoki/items/1295c3df5ddfb13bdf8e

# サンプル
やりたいことは、
ある範囲の特定の行と列の値を順番を自由に並び替えて抽出したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/ce14dab4-62f7-4182-114e-1194cbb9ba27.png)

このようにも書けます```=INDEX(A1:E10, {2;4;6;8;10}, {5,3,1})```
第2引数は<FONT COLOR="RED">;(セミコロン)</FONT>で区切る(縦方向の配列にするため)

構文
```
=INDEX(A1:E10, 抽出行の配列, 抽出列の配列)
```

# 応用例
m行からn行分抽出するには
（CHOOSEROWS関数の代用）
```
=LET(
範囲,A1:E10,
m, 2,
n, 3,
INDEX(範囲,SEQUENCE(n,1,m),SEQUENCE(1,COLUMNS(範囲)))
)
```

奇数行だけ抽出するには
（CHOOSEROWS関数の代用）
```
=LET(
範囲,A1:E10,
INDEX(範囲,SEQUENCE(ROWS(範囲)/2,1,1,2),SEQUENCE(1,COLUMNS(範囲)))
)
```

特定の列だけ抽出するには
（CHOOSECOLS関数の代用）
```
=LET(
範囲,A1:E10,
INDEX(範囲, SEQUENCE(ROWS(範囲),1), {1,3,5})
)
```

# 他にも
特定の1行だけ抽出するには
```
=INDEX(A1:E10,3,0)
または
=INDEX(A1:E10,3,)
```

特定の1列だけ抽出するには
```
=INDEX(A1:E10,0,3)
または
=INDEX(A1:E10,,3)
```
Djangoで残高計算を求めるQuerysetを考える

# 概要
総勘定元帳や出納帳、おこづかい帳などの残高欄を算出すSQL文はいくつか考えられる。それぞれのQuerysetをDjangoでどう書くか、またその計算量や記述量を検討した。

# 背景と課題
総勘定元帳や出納帳は下の表のように、残高は前行の残高に収入が加算、支出が減算され求められる。

||A|B|C|D|E|
|:-:|:-:|:-:|:-:|:-:|:-:|
|1|月日|摘要|収入|支出|残高|
|2|1月1日|前月繰越|10,000||10,000|
|3|1月2日|お年玉|5,000||15,000|
|4|1月3日|コーヒー代||980|14,020|
|5|1月4日|昼食代||1,420|12,600|

表計算ソフトなら以下のような計算式で実現できる。例えば```$E$3```の計算式は、
```
=$E$2+$C$3-$D$3
```
でよい。しかし、データベースでこれを行うのはあまり奨められない。その理由は[考察](#考察)で述べる。

SQLで残高計算する方法はいくつか考えられる。本稿では、各実現方法について考察する。

# 実現方法
アプリケーション名を```journal```、モデル名を```Entry```とし、以下の各方法についてSQL文とQuerysetを示す。

- 各レコードの収入と支出の差分を集計する方法
- 収入の集計と支出の集計の差分をとる方法

## モデル
モデルは以下のとおりとする。簡便化のため各Entryは1日1Entryとする。本質と関係ない摘要フィールド、各フィールドの引数などは省略する。
```python:models.py
class Entry(models.Model):
    date = models.DateField(...)
    income = models.IntegerField(...)
    expence = models.IntegerField(...)
```

## 各レコードの収入と支出の差分を集計する方法
```SQL```と```Querset```は以下のとおりである。
```sql:SQL1
SELECT 
  *, 
  SUM((COALESCE(income, 0) - COALESCE(expence, 0))) 
  OVER (ORDER BY date) AS balance
FROM jounal_entry;
```
```python:views.py
queryset = Entry.objects.annotate(balance=Coalesce(F('income'),0)-Coalesce(F('expence'),0)).annotate(balance=Window(expression=Sum('balance'),order_by='date'))
```

## 収入の集計と支出の集計の差分をとる方法
```SQL```と```Querset```は以下のとおりである。
```sql:SQL2
SELECT 
  *, 
  (COALESCE(SUM(income) OVER (ORDER BY date), 0) - 
    COALESCE(SUM(expence) OVER (ORDER BY date), 0)) AS balance
FROM journal_entry;
```
```python:views.py
queryset =  Entry.objects.annotate(total_income=Coalesce(Window(expression=Sum('income'),order_by='date'),0),total_expence=Coalesce(Window(expression=Sum('expence'),order_by='date'),0)).annotate(balance=F('total_income')-F('total_expence'))
```

なお、以下のようなSQLも考えられる。この方法ではサブクエリ内で外部参照しているが、DjangoではSubquery内にOuterRefがあってもそれ解決できないため[1]、このSQLを実現するためにはraw()を使わなければいけない。
```sql:SQL3
SELECT 
  *, (
  SELECT 
    SUM(COALESCE(t2.income,0))-SUM(COALESCE(t2.expence,0))
  FROM journal_entry AS t2 
  WHERE t2.date <= t1.date
) AS balance 
FROM journal_entry AS t1 
ORDER BY date ASC;
```
```python:views.py
rawqueryset =  Entry.objects.raw('select *, (select sum(coalesce(t2.income,0))-sum(coalesce(t2.expence,0)) from journal_entry as t2 where t2.date <= t1.date) as balance from journal_entry as t1 order by date asc')
```
# 考察
SQL1とSQL2の計算量はどちらも$O(N^2)$であるが、SQL2のほうが集計ループが1つ多いので現実的にはSQL1のほうが良い。また、Querysetの記述もSQL1の方が記述量は少ない。

SQL3の計算量はSQL2と同じであるが、素のSQLを使うためあまり奨められるものではない[2]。

なお、表計算ソフトの計算式のように、1つ前のレコードの残高をもとに計算する方法は、残高フィールドを持たない方法では実現できない。なぜなら、1つ前のレコードを取得するLAG関数の引数にエイリアスを使うことができないためである。一方、
残高フィールド```balance```を用意し残高をテーブルに保持する方法も考えられる。しかし、この方法では```insert```や```update```、```delete```のときに```balance```を再計算し、値を格納しなければいけない。再計算には結局上で述べたいずれかのSQLを発行しなければいけない。また、値の格納には大量の```update```を実行する可能性がある。したがって現実的にはあまり奨められる方法ではない。

# まとめ
総勘定元帳や出納帳、おこづかい帳などの残高欄を計算するSQL文とそれを実現するDjangoのQuerisetを検討した。実現方法はいくつかあるが、$O(N^2)$で求められる「各レコードの収入と支出の差分を集計する方法」がもっとも良いことがわかった。

# 参考
1.  https://docs.djangoproject.com/ja/5.1/ref/models/expressions/#using-aggregates-within-a-subquery-expression
2.  https://docs.djangoproject.com/ja/5.1/ref/models/expressions/#django.db.models.expressions.RawSQL
「設計」について整理してみた

とても大きなテーマなので、完全とは言えないと思います。
フロントエンド開発を通じて学んだ「設計」を概念だけ自分なりの解釈でまとめてました。
ご意見、ご指摘などあればコメントください。

## ソフトウェア開発における「設計」
要件を明確にし、システムを実装できるレベルまで具体的に整理する為に、`検討、準備、計画する`こと
一言でまとめると `実装の道筋を立てる` が適切かと思います。

その成果物として仕様書（設計書）、またはワイヤーフレーム、プロトタイプなどがある。

**仕様**
製品の寸法や材質、性能、動作条件、決まりごとなど製品の`あるべき姿`

**仕様書**
ソフトウェア、機能を実現する為に必要な画面、データ、処理フローなどをまとめたドキュメント（プラモデルの組み立て説明書、料理のレシピに近い）

**ソフトウェア開発フロー**
1. 要件定義（クライアントやビジネスサイドからの要求を明確にする、ここが甘いと設計できない）
2. 設計（画面、データ、DBテーブル、API、など仕様を検討する、ここが甘いと製造できない）
3. 製造（開発）
4. テスト
5. リリース
6. 保守・運用

## 設計方法
設計の方法には「基本設計（外部設計）」と「詳細設計（内部設計）」があります。

**基本設計**
仕様の設計
UI(画面)の設計
・どういう情報を表示するのか？
・どういう操作をユーザーにさせるのか？
・どういう単位でまとめるか？既存ページに載せる？新規ページに切り出す？

**詳細設計**
プログラム設計＝基本設計を実際にどうコードに落とし込むのか
APIの設計
・新しく立てる？既存を改修？
・フロントで欲しいデータの構造、リクエストをBEと相談
・どのタイミングでどんなリクエストを投げるのか？
データベーステーブル設計
・どんなデータが必要か？

会社によって異なるところも多いと思いますが、基本設計、詳細設計を同時に行うケースも多いと思います。

## ベテランエンジニアの設計に関しての考え
先輩方から聞いてきた言葉をまとめの代わりに。

> きちんと設計して、仕様書ができていないと実装できない

> 一番シンプルで無駄のない、かつ拡張性の高い方法を事前に計画するのが設計

> いい設計できないといい実装できないし、いい拡張ができない
設計と実装はセット

> どういうデータを持って、他システムとの連携含め、どういう仕組みで機能を実現するかを考えること

> どこまで考慮するかを決めることも設計

> 不要なバグが起きない様にするにはどう組み立てればいいか考える事
XXXXにならない様にという視点を持って作る事
可読性をあげてメンテナンスしやすく、汎用性高く作る事

> システムの設計＝先を考えて、柔らかく作れるか？

> 設計力（システムの先をかんがえる力）が上がって、考慮点が増えると 見積もりが昔より下手になったと感じるが実際は 見積もり力が設計力の向上に追従できていないだけ

## 最後に余談
構造という概念が存在するものに**設計**が必要になる。

**構造とは**
いくつかの要素が依存して組み立てられるもの（例：ソフトウェア、建物など）

言葉としての設計の意味：
**設**：前もって条件などを定める
**計**：計画を立てる
設計＝前もって、条件を定め、計画を立てること
Databricks WorkspaceとGitHubを連携してDatabricks Appsにデプロイする

# はじめに
Databricks WorkspaceとGitHubを連携させることで、ソースコード管理の効率化を図ることができます。
本記事では、その設定手順とDatabricks Appsにデプロイする方法について解説します。

## 前段
- [Azure DatabricksでDatabricks Appsを検証するための環境構築](https://qiita.com/kei1-dev/items/c5d1f21687bd23489166)
- [Databricks Apps でカスタムアプリのデプロイ](https://qiita.com/kei1-dev/items/3e749e2519535f8c0d56)
- [FastAPIにSPAアプリケーションを統合する](https://qiita.com/kei1-dev/items/09fb914e724016b654eb)
- [Databricks AppsにSPAアプリを含めたカスタムアプリを作成する](https://qiita.com/kei1-dev/items/3e11a598436f52e0ff06)

# GitHub連携の設定手順
※Github アクセストークンは発行済みの前提です。

1. Databricks Workspace画面から、`作成` -> `Gitフォルダ`を選択します
    ![databricks_github_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/b839ff7e-bcf2-dc75-6ffa-64fd334ec339.png)


1. GitリポジトリのURL、Gitプロバイダー、Gitフォルダ名を入力し、`Gitフォルダの作成`ボタンを押下します
   - Github以外にもGitLabやBitbucketなどのGitプロバイダーに対応しています。[リンク](https://docs.databricks.com/ja/repos/index.html#)
    ![databricks_github_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/3031f395-f511-d7c2-ed7c-58ffb34cdc5d.png)

1. 今回はパーソナルアクセストークンの方式で認証するため、`パーソナルアクセストークン`を選択し、Githubユーザ名とアクセストークンを入力します
    ![databricks_github_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/9a7150a4-e4dd-3dc3-076f-e198b64dfa5d.png)

1. WoekspaceにGitフォルダがチェックアウトされていることを確認します
    ![databricks_github_checkout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/e51ed5a5-20f5-15af-063c-1c3ab1558a68.png)

※ [Databricks AppsにSPAアプリを含めたカスタムアプリを作成する](https://qiita.com/kei1-dev/items/3e11a598436f52e0ff06) で作成したカスタムアプリをチェックアウトしています

# Databricks Appsにデプロイする

1. 更新前のAPIレスポンスを確認します

    ![api_response_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/3e461200-316d-7abf-2488-7e1566fec1c1.png)

1. ソースコードを修正して、コミット、GitHubにプッシュします

    ![sourcecode_mod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/fc480e20-3640-f530-cc8b-ec71aac8ac2f.png)

1. Gitフォルダのリポジトリページから、`pull`, `確認`ボタンを押下し、Databricks Workspaceにチェックアウトされているソースコードを更新します
![databricks_git_folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/63a03960-ba91-4dae-4d0b-aa620aea7e75.png)
![databricks_git_folder_pull_confirmation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/effae8c4-58f3-1406-c2e5-2a1943f87b65.png)

2. --source-code-pathをGitフォルダのパスに変更して、デプロイを行います

    ```bash
    cd ./backend
    databricks apps deploy --app-name <app_name>  --source-code-path /Workspace/Users/<username>/<repo_name>/...
    ```

3. デプロイが完了したら、Databricks Appsのページから払い出されたURLから更新後のAPIレスポンスを確認します

    ![api_response_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/6b993503-1f18-3dbc-ce3e-23f2676c9e21.png)

# まとめ
ソースコード管理の効率化のため、Databricks WorkspaceとGitHubを連携させることができました。
また、連携されたGitフォルダを利用して、Databricks Appsにデプロイすることができました。

# 参考
- [Databricks Git フォルダーの Git 統合](https://docs.databricks.com/repos/index.html#)
【Bubble】Tableエレメントの横スクロール設定

# はじめに
Bubbleで利用できるTableエレメントは、画面から表の幅がオーバーした場合の横スクロール機能がデフォルトで実装されていません。（スマホ表示の際は横スクロールできた方が便利かと思うのでぜひデフォルトで横スクロール可能として欲しいです）
本記事では、暫定的な対応としてTableエレメントの横スクロール可能にする方法をまとめます。

# 横スクロールの設定方法

## 前提
以下のようにエレメントを配置します。エレメントツリーは図内の赤枠を参照ください。
（見やすさのため、Tableエレメントの外枠を緑の枠線で囲っています。）
（この先の手順内でツリー構造を変更しますが、あくまでよくある初期のエレメントの状態として以下の構成にしています）
※Table要素の作成方法は[こちら](https://qiita.com/koki_bubble/items/bf09bf932c7d542160f7#%EF%BC%94table%E3%82%A8%E3%83%AC%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E5%B0%8E%E5%85%A5%E6%96%B9%E6%B3%95)を参照ください

**＜エレメント配置における注意点＞**
- Tableエレメントの親要素（画像内の「Outer Box」）の[Container layout]は「Column」に設定ください
- Tableエレメントの親要素（画像内の「Outer Box」）の[Make this element fixed-width]のチェックは外してください
- Tableエレメントが画面の幅から溢れるように、Tableエレメントの[Make this element fixed-width]にチェックを入れ、widthを600pxなどに設定ください（スマホ画面での検証前提）

![Screenshot 2025-01-11 at 14.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/d4389608-5e78-f671-c141-4aa78014d52f.png)

上記の通りエレメントを配置しChrome検証画面でスマホ表示を確認すると、以下の通り、テーブルがBoxエレメントからはみ出てしまいます。

![Screenshot 2025-01-11 at 14.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/f610dbdd-21c5-e377-037c-2149dd21aeb9.png)

以下の手順により、テーブルをBoxエレメント内に納め横スクロールで表全体を閲覧できように設定します。

## ①エレメントにCSSを適用するためID付与機能を有効化
エディター画面の左のツールバーから[Setting]を開き、[General]タブを開きます。[General]タブ内下部にある[Expose the option to add an ID attribute to HTML elements]をチェックします。

![Screenshot 2025-01-11 at 14.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/e4a7f4c0-84d5-c507-9882-f185e2a42b9a.png)

## ②Tableエレメントを入れるためのGroupエレメントを配置
（Tableエレメントに直接CSSを適用しても横スクロールを実現できないため、）Tableエレメントを入れるためのGroupエレメントを配置し、その中にTableエレメントを入れます。

![Screenshot 2025-01-11 at 14.55.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/ef139fed-ced6-27b5-e43e-6a1f101d369c.png)

## ③GroupエレメントにIDを付与
横スクロールを可能にするCSSをに適用するため、Tableエレメントを含んだGroupエレメントにIDを付与します。（画像の例では「enable-horizontal-scroll」というIDを付与しています）

![Screenshot 2025-01-11 at 14.58.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/d529aaa2-4c48-cddc-7456-ad67769ba8ac.png)

## ④ページ内にスタイル（HTML）を記述する
ページ内にHTMLエレメントを配置し、以下のスタイルを記述します。

```html:#enable-horizontal-scroll
<style>

#enable-horizontal-scroll {
        overflow-x: auto !important; /* 横スクロールを有効化 */
        overflow-y: hidden !important; /* 縦スクロールを無効化 */
        display: block;
       white-space: nowrap;
    }

</style>
```
![Screenshot 2025-01-11 at 15.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/25a79a68-1bd6-16a4-1bb9-7ce803978871.png)

## ⑤追加したスタイルを非表示にする
追加したスタイルが画面上に表示されないように、HTMLエレメントの[This element is visible on page load]のチェックを外し、[Collapse when hidden]にチェックを入れます。

![Screenshot 2025-01-11 at 15.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/ca58985f-1dd7-2f46-0d22-886ca4dee6ae.png)

## 完成イメージ
以上の操作を完了しプレビュー表示すると、以下のように表がBox内に収まり、横スクロールが可能になります。

![Screenshot 2025-01-11 at 15.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/c6290917-fff6-088c-8540-3345484f88ef.png)

# 終わりに
本記事に関して不明点やうまく設定できない箇所などありましたらコメントください。
AWS学習方法のロードマップ

## はじめに
AWS（Amazon Web Services）は、クラウドコンピューティングの分野で広く使用されているプラットフォームです。この記事では、AWSを効果的に学ぶためのロードマップを紹介します。

## 基礎から始める
AWSの学習を始める前に、クラウドコンピューティングの基本概念を理解することが重要です。

### クラウドコンピューティングの基礎
- **定義:** クラウドコンピューティングとは何か、その特徴と利点を学びます。
- **サービスモデル:** IaaS, PaaS, SaaSの違いとそれぞれの利用シナリオ。

## AWSのマネージドサービスについて

AWSは多くのマネージドサービスを提供しており、これらのサービスを利用することでインフラ管理の負担を軽減し、セキュリティやスケーラビリティを向上させることができます。

### 主要なマネージドサービス
- **EC2:** サーバーインスタンスの立ち上げ方と基本的な操作。
- **S3:** オブジェクトストレージの利用方法とデータ管理。
- **Amazon RDS:** データベース管理を簡素化するマネージドSQLデータベースサービスです。パッチ適用やバックアップなどの管理作業が自動化されています。
- **Amazon DynamoDB:** フルマネージドなNoSQLデータベースサービスで、高速かつ予測可能なパフォーマンスを提供します。
- **Amazon S3:** オブジェクトストレージを提供し、データの保存と保護に関する広範なマネージメント機能を備えています。
- **AWS Lambda:** サーバーを管理することなくコードを実行できるマネージドコンピュートサービス。使用した分のみの課金となり、高いスケーラビリティを実現します。

### マネージドサービスの利点
AWSのマネージドサービスを利用することで、以下のような利点があります：
- **運用負担の軽減:** インフラの維持管理にかかる手間が大幅に削減されます。
- **コスト効率:** リソースを効率的に使用し、必要なリソースのみに対して支払いを行います。
- **スケーラビリティ:** リソースの自動スケーリングにより、需要の変動に柔軟に対応することができます。
- **セキュリティ:** AWSがセキュリティの維持を管理し、最新の保護対策が施されます。

AWSのマネージドサービスは、特にスタートアップや中小企業にとって、リソースを効率的に利用し、ビジネスに集中することを可能にします。


## 実践的なスキルの習得
AWSを学ぶ上で、実際に手を動かすことが不可欠です。

### ハンズオンラボ
- **AWSの公式トレーニング:** 実際にAWS環境を使った実践的なトレーニングを受ける。
- **Qwiklabs:** ステップバイステップでAWSサービスを学べるプラットフォーム。

### プロジェクト作成
- **個人プロジェクト:** 実際に自分でアイデアを考え、AWS上でアプリケーションを構築してみる。
- **チュートリアルを利用:** GitHubやAWSのドキュメントからプロジェクトのチュートリアルを選び、実際に構築を行う。

## 認定資格の取得
AWSのスキルを証明する方法として、認定資格の取得があります。

### AWS認定試験に向けて
- **試験の種類:** AWS Certified Solutions Architect, AWS Certified Developerなど。
- **勉強方法:** 公式の学習パスを追う、模擬試験を解く、オンラインコースを活用する。

## まとめ
AWSの学習は広範囲にわたりますが、このロードマップを参考に段階的に学習を進めていけば、効果的にスキルを身につけることが可能です。実践的な経験を積みながら、認定資格の取得を目指しましょう。
Azure環境で実運用環境とテスト環境を分けて、実際に使っているリソースを誤削除しないようにする

Azure、というかクラウド・システム利用の基本かと思いますが、自分のAzureで環境を分けておらず、テスト環境クリーンアップのタイミングで誤って本番で使っているリソースも削除してしまったので、ちゃんと構築します。

### 1. サブスクリプションを分ける

そもそもリソースを削除してしまった理由として

なんか使ってないリソース多いのに **Azureめちゃ課金されてるやん。** よく分からんから削除しちゃおう！

が動機である。つまり、課金が本番とテストで分かれていれば、そもそも削除する動機は生まれなかった(※本番で適切に利用しているから、課金されている、と分かったため)

これを実現するにはサブスクリプションを分ける必要がある。

Azureポータルにログイン後、「サブスクリプションを追加」をクリックして適当な名前で追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/f3a2c184-ef02-c677-9074-5b76c275906b.png)

個人管理のテナントなので、課金アカウントや課金プロファイルは変更なし。

### 2. リソースグループを作成する

この手順は自明なので割愛

### 3. リソースロックを設定する


リソースグループにロックを設定することで、誤って削除されることを防ぐ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/dcbf91d9-bab5-21aa-e946-fd679b66a85d.png)

### 4. ロックが削除を防ぐことを確認する

設定したロックが正しく機能しているかを確認するために、リソースグループの削除を試みる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/30c9ce03-a2af-6f5f-353e-fa9412d48347.png)

以上です。
【初心者必見】Pythonの勉強方法について

# Pythonの勉強方法について

## はじめに
Pythonはプログラミング言語として非常に人気があり、その理由の一つに汎用性の高さがあります。この記事では、Pythonの基礎から応用まで効果的に学習する方法を詳しく解説します。

## 基本を理解する
Pythonを学ぶ上で、基礎が非常に重要です。まずはPythonの基本的な文法やデータ構造をしっかりと理解しましょう。

### Pythonの基礎
- **変数:** Pythonでの変数の定義方法と使用方法。
- **データタイプ:** `int`, `float`, `str`, そして `bool` の基本的なデータタイプから、より複雑な `list`, `dict`, `tuple`, `set` について学びます。
- **制御構造:** `if` 文、`for` ループ、`while` ループの使い方をマスターします。

### 練習問題
初学者向けに、[HackerRank](https://www.hackerrank.com/) や [LeetCode](https://leetcode.com/) で簡単な問題を解いてみることをお勧めします。これらのプラットフォームは、実際のコーディング面接で出題されるような問題を扱っているため、実務にも役立ちます。

## 実践的なプロジェクト
理論だけでなく、実際に手を動かして学ぶことが重要です。小さなプロジェクトから始めて徐々に規模を大きくしていきましょう。

### プロジェクトの例
- **計算機:** Pythonを使って簡単な計算機を作成します。GUIライブラリを使用して、ユーザーインターフェースも実装してみましょう。
- **データ分析:** PandasとMatplotlibを使用して、実際のデータを分析し、視覚化します。

### リソースの利用
GitHubで他の開発者がどのようなプロジェクトを行っているかを調査し、オープンソースプロジェクトに貢献してみることも良い経験になります。

## コミュニティとの交流
Python学習者や開発者との交流は、新たな知識を得たり、疑問を解消したりする大きな助けとなります。

### オンラインフォーラム
- [Stack Overflow](https://stackoverflow.com/) では、プログラミングに関する質問を投稿し、世界中の開発者から回答を得ることができます。
- [Reddit](https://www.reddit.com/r/Python/) のPythonコミュニティは、最新のトレンドやライブラリについて情報交換する場として活用できます。

### ミートアップ
Meetup.comなどのプラットフォームを利用して、地元のPythonユーザーグループのミーティングに参加し、直接人と交流する機会を持ちましょう。

## まとめ
Pythonを学ぶことは、技術的なスキルだけでなく、問題解決能力を養うためにも役立ちます。この記事で紹介した方法を実践し、Pythonのプロフェッショナルを目指しましょう。
M2 Mac&dockerで「試して理解 linuxのしくみ」の環境を作る



imageの取得

```
docker pull ubuntu:20.04
```

コンテナの作成

```
docker run -it -d --name linux-no-shikumi --platform=linux/amd64 ubuntu
```

コンテナに入る

```
docker exec -it linux-no-shikumi bash
```

```
# apt-get update
# apt-get install git
Do you want to continue? [Y/n] y
```

```
# git clone https://github.com/satoru-takeuchi/linux-in-practice-2nd.git
# apt update && apt install binutils build-essential golang sysstat python3-matplotlib python3-pil fonts-takao fio qemu-kvm virt-manager libvirt-clients virtinst jq docker.io containerd libvirt-daemon-system
# adduser `id -un` libvirt
# adduser `id -un` libvirt-qemu
# adduser `id -un` kvm
```

```
# cd linux-in-practice-2nd/01-operating-system-overview/
# ./hello.py
hello world
```

```
# exit
```

再起動
```
# docker start linux-no-shikumi
# docker exec -it linux-no-shikumi bash
```

```
apt-get install strace
```
circuitjsの作法 その32

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレーで、発振回路を作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c3292488-7231-0d89-1cf8-127eb787685e.png)


# ネットリスト

```
$ 1 0.000005 54.00526672067058 50 5 50 5e-11
178 416 192 416 320 6 1 0.2 0.014156693858658753 0.05 1000000 0.02 20 0.015 0.005 0
r 432 320 432 416 0 150
g 384 320 384 352 0 0
R 272 112 208 112 0 0 40 5 0 0 0.5
w 416 112 416 192 0
w 384 192 384 160 0
w 384 160 496 160 0
w 496 160 496 400 0
w 496 400 496 416 0
w 432 416 496 416 0
c 304 208 304 304 0 0.0033 0.31678816098247253 0.001
w 304 208 304 160 0
w 304 160 384 160 0
w 304 304 304 320 0
w 304 320 384 320 0
w 272 112 320 112 0
s 320 112 416 112 0 0 false
o 6 64 0 4099 0.625 0.05 0 2 6 3

```

以上。
情報処理安全確保支援士試験に一発合格した勉強法

# はじめに

令和 6 年秋の情報処理安全確保支援士試験に、おかげさまで一発合格することができました！ この試験に向けて勉強する中で、多くの先人たちの体験談に大変助けられました。そこで、この記事では、私がどのように試験対策を行い、一発合格を達成できたのか、その具体的な方法とスケジュールを共有し、今後試験に臨む方々の助けに少しでもなればと思っています。

## 勉強前の私のプロファイルと試験への効果

*   地方国立大出身 → センター試験を経験していたことは大きなプラスでした。
*   前職：インフラ部署（プロマネ、サーバー系インフラ設計・構築・運用）を 5 年 → この経験が、サーバーやネットワークに関する知識の基盤となりました。
*   現職：ISMS 運用を中心としたコーポレートセキュリティ経験 2 年（ただし主務は別で、稼働時間の 1, 2 割程度） → セキュリティ管理の全体像を把握する上で役立ちました。
*   現職：Web 系 SaaS の CRE を 2 年 → Web アプリケーションのセキュリティに関する知識や、開発プロセスにおけるセキュリティの重要性を理解する上で役立ちました。
*   現職：CSIRT を 1 年（兼務。弊社では現在インシデントレスポンスのみの役割。） → 実際的なインシデント対応の流れの理解が役立ちました。

# 勉強スケジュール

試験を受けようと思い立ったのが 5 月頃でしたので、比較的余裕を持ったスケジュールで勉強に取り組むことができました。大まかな流れは以下の通りです。

1. **基礎インプット（ 5 月 ～ 7 月初旬）：** 試験範囲全体の基礎知識を網羅的に理解することを目指しました。
2. **午前 Ⅰ 対策（ 7 月中旬 ～ 8 月初旬）：** 午前 Ⅰ の範囲を参考書と過去問で集中的に対策しました。
3. **午前 Ⅱ 対策（ 8 月中旬 ～ 9 月初旬）：** 午前 Ⅱ の範囲を参考書と過去問で対策しました。
4. **午後対策（ 9 月中旬 ～ 9 月下旬）：** 午後問題の傾向を把握し、解答のコツを掴みました。
5. **総仕上げ（ 10 月初旬）：** 午前 Ⅰ, Ⅱ の過去問を再度解き、苦手分野の克服と点数アップを狙いました。

## 基礎インプット（ 5 月 ～ 7 月初旬）

週に 2, 3 日、往復 2 時間ほどの通勤時間時間を使い、以下の Kindle Unlimited で読める教材を読み進めていました。

*   **[ゼロからスタート！　教育系YouTuberまさるの情報処理安全確保支援士１冊目の教科書](https://www.amazon.co.jp/gp/product/B0CHR7594R/ref=ku_mi_rw_edp_ku) → セキュリティの概要を体系立てて掴むために選びました。初心者にも分かりやすく、イラストも豊富で抵抗なく読み進めることができました。**
*   **[イモヅル式 応用情報技術者午前 コンパクト演習](https://www.amazon.co.jp/gp/product/B09TDLBPQJ/ref=ku_mi_rw_edp_ku) →  情報処理技術者試験の基礎知識を効率的に学習するために活用しました。キーワードから関連知識を芋づる式に学べる点が気に入っていました。**

## 午前 Ⅰ 対策（ 7 月中旬 ～ 8 月初旬）

以下の参考書を一通りやりました。並行して、通勤時間を利用して過去問道場を活用し、5 年分の過去問を１巡しました。計算問題など、じっくり取り組むべき問題には見直しマークをつけ、自宅で時間を確保して解くようにしていました。あとは平日の夜は気が向いた時に 1, 2 時間程度勉強する程度で、月あたり 10 ~ 20 時間プラス通勤時間の過去問道場に費やした 20 時間ほどの勉強時間だったと思います。

*   **[2024年度版　ALL　IN　ONE　パーフェクトマスター　共通午前1](https://item.rakuten.co.jp/book/17534108/) →  午前 Ⅰ 対策として網羅性が高いと評判だったので選びました。解説が丁寧で、知識の抜け漏れを防ぐのに役立ちました。**

## 午前 Ⅱ 対策（ 8 月中旬 ～ 9 月初旬）

午前 Ⅰ 対策と同様の勉強法で取り組みました。参考書を読み込み、過去問道場で過去問を 5 年分解きました。

*   **[2024年度版　ALL　IN　ONE　パーフェクトマスター　情報処理安全確保支援士](https://item.rakuten.co.jp/book/17534118/) →  午前 Ⅱ と午後問題の両方に対応しているため、選びました。午前 Ⅱ 対策としては、各分野の知識を深める上で非常に役立ちました。**

## 午後対策（ 9 月中旬 ～ 9 月下旬）

午前 Ⅱ 対策で購入した参考書の午後問題対策部分を１巡しました。通勤時間の過去問道場は継続していましたが、午後対策に費やした時間は 10 時間程度だったと思います。

**これは、参考書を１巡するだけで午後問題の出題傾向を掴めたこと、そして、問題を解く際に、センター試験の現代文や英語長文読解のように、問題文を前から読み進め、下線部に当たったら設問を解くという進め方で対応できると気づいたためです。** 問題文の構造や設問の意図を把握する上で、これらの読解問題と共通する部分が多いと感じました。そのため、あえて他の過去問には手を広げず、この参考書のみ実施しました。

## 総仕上げ（ 10 月初旬）

過去問道場を活用して、通勤時間などに午前 Ⅰ, Ⅱ の過去問を解き直したり、午前 Ⅰ 分野で苦手意識のある問題を重点的に復習したりしていました。この時期は、通勤時間の勉強に加えて、平日の夜に 2 時間、休日に 2, 3 時間ほど勉強時間を確保するようにしていました。具体的には、**過去問道場で間違えた問題の中から、頻出で公式を覚えるだけで点を取れそうなものを選んで**繰り返し解くようにしていました。

# まとめ

私の場合は、業務でセキュリティに関する知識に触れる機会が多かったため、試験対策としては細かい知識の確認や復習が中心となりました。また、センター試験の勉強で長文読解問題の解き方に慣れていたこと、そして、試験本番まで比較的長い期間を確保できたことも、午前 Ⅰ, Ⅱ、そして午後問題の対策を無理なく進められた要因だと考えています。（総勉強時間は約 150 時間 / 5.5 ヶ月）

久しぶりの試験勉強でしたが、効率的に学習を進め、合格という結果に繋げることができて本当に良かったです。**情報処理安全確保支援士試験は決して簡単な試験ではありません（今回は特に難化して合格率が 15% 程度でした）が、計画的に対策を進めれば合格できると思います。** この記事が、私と似たようなプロファイルの方だけでなく、これから情報処理安全確保支援士試験に挑戦される多くの方にとって、少しでも参考になれば幸いです。皆さんの合格を心から応援しています！
homebrewとは

# Homebrewとは
**Homebrew**とは、macOSやLinuxで使用できるパッケージマネージャで、コマンドラインからソフトウェアのインストールや管理を簡単に行うツールです。

## 他の類似サービスは？
類似サービスには以下があります。
- **apt:** 
    - Debian系Linuxのパッケージマネージャ
- **yum/dnf:** 
    - Red Hat系Linuxのパッケージマネージャ
- **choco (Chocolatey):** 
    - Windows用パッケージマネージャ
- **Snap:**
    - Linux向けのコンテナ型パッケージ管理

## なぜ、homebrewがいいのか
簡単なコマンドでパッケージのインストール・更新ができ、macOS/Linuxで幅広いソフトに対応しているため便利です。

## aptやyumの違いは
aptやyumは主にLinux専用であり、macOSでは使えません。一方、HomebrewはmacOS/Linux両方で使える汎用性が魅力です。

### Homebrewの良いところは
aptやyumはLinuxシステム全体のパッケージ管理を担い、OSコア部分のアップデートも扱います。一方、Homebrewはユーザー権限で動作し、システムに影響を与えず、開発者ツールやユーティリティのインストールに特化しています。このため、OSやシステムライブラリの管理はHomebrewでは非推奨で、aptやyumが適しています。用途に応じて使い分ける必要があります。
browser-useを使ってみる

界隈で話題のツールを使ってみます。簡単に言うと、perplexityをローカル環境で動かすことができます。
ここら辺の記事を参考にさせていただきました。

https://dev.classmethod.jp/articles/browser-use-start/

https://qiita.com/Syoitu/items/5aa84b5d8c6047c4d41b

### 環境セットアップ

```powershell
pip install browser-use
pip install langchain
playwright install
```

### コード

```python index.py
from browser_use import Agent
from langchain_openai import ChatOpenAI

import asyncio

llm = ChatOpenAI(model='gpt-4o', api_key='xxx')

task='今日の運勢について教えて'

agent = Agent(
	task=task,
	llm=llm,
)

async def main():
	await agent.run()

asyncio.run(main())
```

APIキーですが、環境変数に設定しようと思ったがうまく動かず、生で入力しました。

※ 本番環境ではやめましょう

### 結果

playwrightが動き、占い結果をコンソールに出力してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/63fbf8c5-2be6-6bad-07c0-5de927548787.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/f2443df9-3914-b1e3-02f0-068f2184ed5e.png)

### その他いろいろ

私は毎週、東京都の新型コロナ感染者数をメールで自分に通知しています。やりかたは東京都の感染状況ページをスクレイピングし、感染者数を取得しています。

このような事を書かなくても、browser-useを使えばわかるのでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/82348272-472e-9df7-3443-2794e0e4591a.png)

素晴らしいです！

ただ、結果はスクレイピングしたものと変わらないですし、browser-useの方が遅く、LLMのAPI使用料がかかります。取得するソースが特定されている場合、スクレイピングの方がいいですね。

### 注意点

browser-useもスクレイピングの1種なので、スクレイピングが禁止されているサイトに対して使うことは(技術的に可能でも)規約違反となります。

例えば、以下で挙げられている例は規約違反のものが多いです。

https://qiita.com/Nicola_GenAI/items/f8585cbc4266656cdbb8
MUIのuseTheme()の戻り値を、カスタマイズした型に推論させる

# はじめに

MUIでは [Theme provider](https://mui.com/material-ui/customization/theming/#theme-provider) を利用して、MUIから提供されている[デフォルトのtheme object](https://mui.com/material-ui/customization/default-theme/)をカスタマイズすることができます。
しかし、型推論では、カラーコードなど具体的な設定値が取得されません。この記事では、`useTheme()` の戻り値をカスタマイズした型に推論させる方法を紹介します。

:::note info
theme object にオリジナルのプロパティを追加したい場合、[モジュール拡張 (module augmentation)](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation)を行う必要があります。
詳細は以下の公式ドキュメントをご確認ください。  
https://mui.com/material-ui/customization/theming/#typescript
:::

# コード例

以下は、`useTheme()` の型をカスタマイズするコード例です。

```typescript
import { createTheme, type Theme } from "@mui/material/styles";

type CreateThemeOptions = Parameters<typeof createTheme>[0];

// theme variables をカスタマイズする
const themeOptions = {
  palette: {
    text: {
      primary: "#1A1A1C",
      secondary: "#626264",
      disabled: "#949497",
    },
  },
  typography: {
    fontFamily: [
      '"Noto Sans JP Variable"',
      "-apple-system",
    ].join(","),
  },
} as const satisfies CreateThemeOptions;

export const theme = createTheme(themeOptions);

/**
 * カスタマイズされた theme のリテラルを含む型
 */
type CustomizedTheme = typeof themeOptions & Theme;

// モジュール拡張
declare module "@mui/material/styles" {
  /**
   * `useTheme` のジェネリクス型を上書きする。
   * @example
   * ```ts
   * import { useTheme } from "@mui/material/styles";
   * const theme = useTheme();
   * // `theme` は `CustomizedTheme` に推論される
   * ```
   */
  export function useTheme<T = CustomizedTheme>(): T;
}
```

## 補足

- `themeOptions` はカスタマイズされたオプションを保持するオブジェクトであり、その型情報がリテラル型として保持されます。
- `CustomizedTheme` により、MUIの `Theme` 型と `themeOptions` のリテラル型を結合します。
- `useTheme` を上書きすることで、`themeOptions` の型が推論されるようになります。

## 型推論の動作確認

`const theme = useTheme();` を利用すると、`themeOptions` で定義したカラーコードなどが型推論されることを確認できます。

![カラーコードが型推論されている画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/9f95d4d0-8f9d-876a-5e2e-551eb3c197db.png)

また、[ThemeProviderコンポーネント](https://mui.com/material-ui/customization/theming/#themeprovider)で正しく設定したthemeを渡すことで、UI描画にも正しく反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/03d9feba-c789-555b-d64c-5fb7826f78d6.png)

# 参照資料

https://mui.com/material-ui/customization/default-theme/

https://mui.com/material-ui/customization/theming/

https://zenn.dev/qnighy/articles/9c4ce0f1b68350#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E6%8B%A1%E5%BC%B5
circuitjsの作法 その31

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレーで、「Zuseの全加算器」を作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a70910cc-3ba5-a70b-70d7-e3bc8837aefd.png)

# ネットリスト

```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
178 448 336 448 432 6 1 0.2 0.24999999999997224 0.05 1000000 0.02 20 0.015 0.005 1
178 560 336 560 432 6 1 0.2 0.2499999999992563 0.05 1000000 0.02 20 0.015 0.005 1
R 304 96 240 96 0 0 40 5 0 0 0.5
g 416 432 416 448 0 0
g 528 432 528 448 0 0
g 640 432 640 448 0 0
g 768 432 768 448 0 0
w 304 96 320 96 0
w 320 96 320 160 0
w 320 160 352 160 0
w 320 160 320 192 0
w 320 192 352 192 0
w 432 192 432 240 0
w 432 240 416 240 0
w 416 240 416 336 0
w 528 336 528 160 0
w 432 160 528 160 0
w 448 336 448 96 0
w 320 96 448 96 0
w 560 336 560 96 0
w 448 96 560 96 0
w 672 336 672 304 0
w 640 272 640 336 0
s 352 160 432 160 0 0 false
s 352 192 432 192 0 0 false
178 800 336 800 432 6 4 0.2 0.2493765586022455 0.05 1000000 0.02 20 0.015 0.005 1
w 288 192 320 192 0
w 224 192 208 192 0
x 253 155 269 158 4 24 C
x 358 133 374 136 4 24 A
x 360 226 376 229 4 24 B
162 1008 208 1008 256 2 default-led 1 0 0 0.01
w 672 304 672 96 0
w 560 96 672 96 0
w 672 96 848 96 0
s 224 192 288 192 0 0 false
178 672 336 672 432 6 1 0.2 0.24999999999997224 0.05 1000000 0.02 20 0.015 0.005 1
w 736 480 736 320 0
w 736 320 768 320 0
w 768 320 768 336 0
178 1104 336 1104 432 6 4 0.2 0.24937655860346353 0.05 1000000 0.02 20 0.015 0.005 1
w 1072 336 1040 336 0
w 1040 336 1040 512 0
w 432 432 432 480 0
w 544 432 544 480 0
w 544 480 736 480 0
w 432 480 432 512 0
w 432 512 1040 512 0
w 656 432 656 448 0
w 656 448 704 448 0
w 704 448 704 304 0
w 704 304 800 304 0
w 800 304 800 336 0
w 688 432 688 464 0
w 688 464 720 464 0
w 720 464 720 288 0
w 720 288 848 288 0
w 848 288 848 336 0
w 896 96 896 336 0
w 848 96 896 96 0
g 1008 256 1008 272 0 0
w 944 336 944 176 0
w 944 176 1008 176 0
w 1008 176 1008 208 0
w 848 288 1104 288 0
w 1104 288 1104 336 0
w 960 432 960 448 0
w 1088 432 1088 448 0
w 960 448 1088 448 0
w 784 432 784 480 0
w 800 304 1152 304 0
w 1152 304 1152 336 0
w 1200 288 1200 336 0
w 1248 288 1248 336 0
g 1312 256 1312 272 0 0
162 1312 208 1312 256 2 default-led 1 0 0 0.01
w 1248 288 1248 176 0
w 1248 176 1312 176 0
w 1312 176 1312 208 0
x 1157 143 1288 146 4 24 _Cout\sCout
x 973 123 1024 126 4 24 A\pB
g 1072 432 1072 448 0 0
w 1184 432 1184 544 0
w 912 544 1184 544 0
w 864 432 864 544 0
w 864 544 912 544 0
w 832 432 832 576 0
w 1216 432 1216 576 0
w 912 432 912 576 0
w 832 576 912 576 0
w 912 576 1216 576 0
w 816 432 816 448 0
w 880 432 880 448 0
w 1232 432 1232 480 0
w 1168 432 1168 448 0
w 1168 448 1088 448 0
w 1120 432 1136 432 0
w 928 432 928 464 0
w 928 464 1120 464 0
w 1120 464 1120 432 0
w 880 608 1264 608 0
w 1264 432 1264 608 0
w 208 192 208 272 0
w 208 272 336 272 0
w 336 272 640 272 0
x 973 75 1011 78 4 24 out
w 784 480 784 608 0
w 784 608 880 608 0
w 816 448 816 480 0
w 880 448 880 480 0
w 816 480 880 480 0
w 880 480 1232 480 0

```

以上。
「必ず見てもらえるSNS」をコンセプトにしたサービス "Spotlight"について

## はじめに
こんにちは。個人でWEBサービスを作っている千葉県在住の菅原拓真です。
Qiita初投稿になりますが、技術的な話ではなく、個人開発したサービスの紹介をさせてください。

※クラウドワークスでテストユーザーを募集しているので、その宣伝を兼ねています。

https://crowdworks.jp/public/jobs/11621656?ref=my_job_offers#confirm


## Spotlight（スポットライト）とは？
![thumbnail.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967721/2004a0cf-3578-7492-a1be-c7c1c9b0a802.jpeg)

「1日100人のみが投稿できるX（旧Twitter）」をイメージしてください。
既存SNSだと、フォロワーが少ないユーザーは投稿をなかなか見てもらえませんが、Spotlightでは投稿数を制限することで、誰でも確実に注目される仕組みになっています。

※「好きな時に自由に投稿できる」「タイムラインがパーソナライズされていて無限に楽しめる」といった既存SNSとは明確に役割や使い方が異なり、あくまで「投稿が確実に見てもらえること」を重視した、補完的なサービスです。

詳しい機能や使い方は下記の記事で紹介しています。

https://note.com/lush_kudu6766/n/n80829e53c073

## Spotlightを作った背景
「個人開発者が作ったサービスを宣伝できる場所を作りたい」と思ったのがきっかけでした。

皆さんの中でも個人開発者としてサービスを作っている方がたくさんいると思いますが、個人開発の場合、開発自体よりも宣伝・プロモーションで苦労するパターンが多くありませんか？

僕も去年の春くらいに初めて個人開発したサービスをリリースしたんですが、全くダメでした。

https://my-site-49105.web.app/

↑その時のサービスです。
AIで作った画像を使って、ビジュアルノベル形式で物語を投稿できるサービスです。

![scenario.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967721/c7410d5c-e06e-2cf8-8ea8-488e3e524d51.png)

Midjourneyなどを使えば、数秒でプロ級の画像を誰でも生成できる時代なので、「これは流行るに違いない！」と本気で思っていましたし、「コンセプトが刺さるサービスを作れたら、フォロワーが少ないSNSアカウントで発信しても自然と広まっていくだろう」と完全に舐めていました。

この失敗から、海外でいう「Product Hunt」のようなサービスを作ろうかと思ったんですが、個人開発者のサービスだけが掲載されていたら多くの人は興味を持ちにくいので、SNS形式で好きなことを投稿でき、その投稿の一部に個人開発者のサービスの宣伝があるという形にしようと思いました。ただし、Xやインスタグラムとは違い、投稿するのに多少のハードルがあるが、投稿できたらその内容が確実に見てもらえるSNSです。

## Spotlightの現状
リリースは昨年末にしたんですが、Spotlightもご多分に漏れず無名の個人開発者が作ったサービスなので、苦労している最中です。

なかなか突破口が見えないので、クラウドワークスでSpotlightについてのアンケートを実施してみました。そこで貴重な意見をいただき、それを元に少し改良を加えて、現在1週間のテストユーザーを募集している最中です。

**依頼内容**
・毎日サービスにログインして各機能を利用していただく（投稿、リアクションなど）。
・バグや不具合を見つけた際は、サービス内に専用ページがあるので報告していただく。
・テスト期間終了後、簡単なアンケートに回答していただく（5分程度）。

**契約金額**：1名あたり500円
**募集人数** ：50人〜75人
**スケジュール** ：1月13日（月）または1月20日（月）から1週間

https://crowdworks.jp/public/jobs/11621656?ref=my_job_offers#confirm

ぜひSpotlightを使って、あなたの発信を多くの人に届けてください！ご参加お待ちしております。

長くなりましたが、ここまでお読みいただきありがとうございました。

↓ Spotlightのベータ版を公開中です。

https://thespotlight-app.com/top.php