OmniAICreator/Qiita-1.07M huggingface dataset:
TryHackMe Writeup：Basic Malware RE

# 最初に

今回はTryHackMeのBasic Malware REに挑戦します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/77d96e99-9611-0c77-4dec-546140ec15bc.png)

実行ファイルを静的解析するのですが、完全にGhidra祭りです笑


# Task1

Ghidraをインストールしておきます。
いろいろな記事がありますが、Qiitaだと以下の記事があります

https://qiita.com/nanbuwks/items/50a04425cbd64ad71fea

## Strings :: Challenge 1


Ghidraでデコンパイルすると、すでにFLAGの文字が、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/3d4ea355-b583-4ba1-49b9-3026d9742ef6.png)

設定値を変えながら、キーワードから検索すると、見つかりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/437dc69d-3711-8a4a-ecfc-296e4a02442e.png)

## Strings :: Challenge 2

Ghidraで逆解析すると、もう答えが(;^ω^)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/d5b2cbd3-1389-ae82-d14b-290fcb93b872.png)


## Strings 3 :: Challenge 3


Ghidraで解析したら、最初にこの画面が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/360af728-4b00-3651-1c93-109bbe82c5dc.png)

デコンパイルされたコードを見てみると、`local_a0`や`0x30`が怪しいので、これに関連する変数・アドレスをみていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/40dc22a8-37a8-454b-8eff-2917b4d88d22.png)

そうすると、薄い文字で、`FLAG{...}`と記載されていたので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/2d995173-2bcd-a6d4-008e-7b65305b7e28.png)

検索をしてみたら、みつかりました！
Fieldsはあまりわからなかったので、全部試しました笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/0bd7ebc1-392f-3f2e-b6e1-4e7e9fab12dd.png)



# 最後に

Ghidra最強

以上です。笑
[Perplexity AI の 活用 法律問題解決編: 日常生活の法律問題、 AI回答エンジンで解決]

日常生活で直面する法律問題、もはやAIで簡単に解決できる時代が到来しました。本書「Perplexity AIの活用 法律問題解決編」は、AI回答エンジンPerplexity AIと検証AIエージェントGenspark AIを活用し、身近な法律トラブルを手軽に解決する方法を丁寧に解説します。離婚、相続、賃貸借契約など、私たちの生活に密接に関わる法律問題を、AIを使ってどのように対処できるのかを具体的な事例とともに学ぶことができます。

本書の大きな特徴は、AIによる回答の信頼性を高めるために、ファクトチェックAIエージェントを併用している点です。Perplexity AIが提供する法律情報を、Genspark AIが複数の信頼できる情報源と照合し、その正確性を検証します。これにより、読者は安心して法律問題の解決に取り組むことができます。AIと人間の協働により、より確かな法的判断が可能になるのです。

「Perplexity AIの活用 法律問題解決編」は、現代社会を生きる私たち全てに役立つ1冊です。このデジタル時代に、AIを上手に活用して法的リスクに備えることは、スマートな生活者の必須スキルと言えるでしょう。本書を手に取れば、身近な法律問題に対する理解が深まり、AIを味方につけた賢明な問題解決力が身につくはずです。法律トラブルに悩まされる前に、ぜひ本書でAIを使った法律問題解決の基本を学んでみてください。

https://amzn.to/3Uamhx2
homebrew+postgresql@16+postgis

homebrewのpostgisはpostgres@14とリンクされているようなので、postgresql@16で使いたい場合は、postgisをソースからビルドする必要があるらしい。

https://stackoverflow.com/questions/77149123/enable-postgis-extension-for-postgresql-16-on-mac-m2

以下、ここに書かれている手順と同じことをしてるが、オプションを少し変えてます。

```sh
brew install postgresql@16
brew install postgis

brew info postgis
==> postgis: stable 3.5.0 (bottled), HEAD

# homebrewはpostgis3.5.0が入ったので、ソースも3.5のものを取得
wget https://download.osgeo.org/postgis/source/postgis-3.5.0.tar.gz

# 適当にソースをビルドする場所を用意
cd /opt/hogehoge/src/postgis-3.5.0

./configure \
  --prefix=/opt/hogehoge \
  --with-pgconfig=/opt/homebrew/Cellar/postgresql@16/16.4_1/bin/pg_config \
  --with-gettext=/opt/homebrew/Cellar/gettext/0.22.5/

make
===> ld: library '/opt/hogehoge/bin/postgres' not found
===> clang: error: linker command failed with exit code 1 (use -v to see invocation)
===> make[1]: *** [postgis_topology-3.dylib] Error 1
===> make: *** [all] Error 1

# makeでエラーが出たので処置
ln -s /opt/homebrew/Cellar/postgresql@16/16.4_1/bin/postgres /opt/hogehoge/bin/postgres

make
make install

```

postgisを手動でビルドしているのに `brew install postgis` もしているのは、手動ビルドに必要なパッケージを手っ取り早く入れて置きたいからだと思います。たぶん。

## Homebrewの更新
homebrew で何かを入れた拍子に、postgresql16.3 → 16.4_1に更新されてしまい次のエラー出るようになった。

```
ERROR:  could not access file "$libdir/postgis-3": No such file or directory
```

ここに書いている手順でインストールしていたので、homebrewの更新で環境が壊れてしまったらしい。セットアップの履歴が残ってなく再構築に手間取ったので備忘録に残しておきます。
【備忘録】Raspberry Pi　syslogの代わり

最近ラズベリーパイ 5を買ったが、syslogを確認しようとしてもどこにもない...

~~~bash
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm
~~~

<h2>結論</h2>

不具合ではなく仕様だったらしい。([Missing syslog file - Raspberry Pi Forums](https://forums.raspberrypi.com/viewtopic.php?t=358028))
代わりに`journalctl`を使って確認できる。
~~~bash
$ journalctl
# logがズラーっと出てくる。Enterキーで次の行を表示。
# ctrl+cで終了。

$journalctl | grep hoge
# 'hoge'が含まれた行を抽出。

$ journalctl -f
# logの出力を追跡する。ctrl+cで終了。
~~~

以上。
TremorxのHello Worldをやってみる

# Phonexのプロジェクト作成

```bash
# Hexのインストール
$ mix local.hex
# phx_newのインストール
$ mix archive.install hex phx_new
# アプリケーション作成
$ mix phx.new hello_tremorx --no-ecto
```

# 一度実行してみる

```
$ cd hello_tremorx
$ mix phx.server
```

ブラウザーで```http://localhost:4000/```を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/43b9a54d-77b3-22cc-0c2a-3afbe27e4e37.png)

# Tremorxのインストール

```
cd assets
npm init -y
```
を実行

https://github.com/briankariuki/tremorx
のInstallationに従って作業する

# 部品の使い方

ドキュメント
https://hexdocs.pm/tremorx

部品のイメージ
https://tremorx.fly.dev

[fly.dev](https://tremorx.fly.dev)のサンプルコートでは、Buttonだと```.button```となっているが、実際のコードでは、```Button.button```と書く必要があった。

# Tremorxを使ったコンテンツを作ってみる

```elixir:lib/hello_tremorx_web/controllers/page_html/home.html.heex
<h1>Welcome to TremorX</h1>

<Layout.flex flex_direction = "row" justify_content = "between">

<Button.button class="">
    <p>Click Me</p>
</Button.button>

<Button.button class="" color="orange">
    <:icon>
      <.icon name="hero-magnifying-glass" />
    </:icon>
    <p>Search now</p>
</Button.button>

<Button.button disabled class="" color="teal">
    <p>Add entry</p>
</Button.button>

<Button.button loading class="" color="indigo">
    <p>Create account</p>
</Button.button>

</Layout.flex>

<Layout.col class="space-y-1.5">
  <label for="name">
    <Text.text class="text-tremor-content">
      Name
    </Text.text>
  </label>

  <Input.text_input
    id="name"
    name="user[name]"
    placeholder="juma tano"
    type="text"
    value=""
    error={false}
    error_message={"Name is required"}
  />
</Layout.col>
```

# 実行結果

```
mix deps.get
mix phx.server
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/77c62c23-b302-9da5-0a80-fab48d09fab6.png)
GASを触っての雑多なまとめ（基礎知識）

# 基本知識関連
GAS (Google Apps Script) について何も知らなかった私が簡単な開発を通してポイントだなと思った点を挙げております。

## 1. GAS の "スプレッドシート" と "シート" という概念
**"スプレッドシート" と "シート" という概念があるが別物**

:::note
* 「スプレッドシート(Spreadsheet)」 == 「Excel における"ブック"」
* 「シート(Sheet)」 == 「Excel における"シート"」
:::

* 私はこの点を把握していなかったため、 `.getActiveSpreadsheet()` のようなメソッドと出会った時に「対象がファイル自体なのかシートなのか」が混乱しました

## 2. Webアプリを公開(デプロイ)できる
こちらの資料が画像が多く分かりやすいです

https://www2.kobe-u.ac.jp/~tnishida/programming/GAS-02.html

* 「GAS でフロントサイド＆バックサイドを実装」「スプレッドシートを DB」として１つの Web アプリとして公開可能

:::note warn
**実行にあたって処理時間やリクエスト数に制限がある**
* Google Workspace の有料版であっても無料版であっても制限あり

https://developers.google.com/apps-script/guides/services/quotas?hl=ja
:::


## 3. 一般的なフロント言語を使用する & フレームワークは不要
> Apps Script を使えば、HTML、CSS、JavaScript を使って開発を行えます。独自のフレームワークの知識を新たに身に付ける必要はありません。
> 
> ( [Google Workspace](https://workspace.google.com/intl/ja/products/apps-script/) より引用)

* 上記の通り、HTML・CSS(Bootstrap)・JavaScript という誰でもある程度は知っているであろう言語で開発可能
    * デザイン面については"Bootstrap"が使用可能
        * ある程度は web アプリのデザインを工夫可能
    * 当然一部は GAS 特有のメソッドなどは存在するが構文は先述の言語と同じ

## 4. 開発は基本ブラウザ上で行う
* [こちらの紹介](https://workspace.google.com/intl/ja/products/apps-script/#:~:text=%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82-,%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E3%82%A6%E3%82%A7%E3%83%96%E8%A8%80%E8%AA%9E%E3%82%92%E4%BD%BF%E7%94%A8,-Apps%20Script%20%E3%82%92)にあるように、ブラウザ上のエディタで開発を進めていく
    * ローカルに環境構築して開発を進めることも可能
    * 開発に際して Chrome の拡張機能に [Google Apps Script GitHub アシスタント](https://chromewebstore.google.com/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja) のような GitHub 連携まで完備されており開発周りも整っている



# 所感
* HTML・CSS・JavaScript なので特段難しい言語を要求されていないのが凄いと感じた
* 開発をサクッっと始められる点は凄く魅力的
* 開発を進めてみて「これブラウザなんだから拡張機能で開発を補助するような拡張機能があったら完璧では？」と考えていた中で本当にそういった拡張機能がサポートされていることに驚いた
* 実質フロントサイドもバックサイドも JavaScript が関わっている点から最近の流行りにあっていると感じた

---
### 関連資料

https://workspace.google.com/intl/ja/products/apps-script/

https://developers.google.com/apps-script/guides/services/quotas?hl=ja

https://www2.kobe-u.ac.jp/~tnishida/programming/GAS-02.html
windowsでchmodができない問題、windowsで不要な権限を削除する方法について

## はじめに
AWSのEC2を用いてwebサイトを作成しようと思い、EC2サーバ(インスタンス)とローカルのSSH接続を行っていた。すると以下のような警告が出た(https://qiita.com/sekkenn1102/items/3f156db39224ae2023f1 から引用)。
~~~
The authenticity of host 'ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com (XX.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is SHA256:5vDb7b5ozqxJ0FbDv9Qao4LYSd5a+Do5p6Ay6/ZNyV0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com,XX.XXX.XXX.XXX' (ECDSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'web-site.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "web-site.pem": bad permissions
ec2-user@ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

~~~
内容はSSH接続に使う秘密鍵の権限がガバガバ過ぎるから、ほかの人からのアクセスできないようにしてくれというものだった。
## やること
権限を自分だけにする。SYSTEMやadministratorの権限を削除する。

## 解決策
#### 継承を無効化する
~~~
PS C:\Users\ユーザ名\.ssh> icacls.exe $path /inheritance:r
処理ファイル: web-app-test-key.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
~~~

#### すべてのユーザの権限を削除
~~~
PS C:\Users\ユーザ名\.ssh> icacls.exe $path /remove *
0 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
~~~
#### 現在のユーザ(自分)に読み取り権限を付与
~~~
PS C:\Users\ユーザ名\.ssh> icacls.exe $path /grant:r "$($env:USERNAME):(R)"
処理ファイル: web-app-test-key.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
~~~

#### 権限の確認
~~~
PS C:\Users\ユーザ名\.ssh> icacls.exe $path
web-app-test-key.pem DESKTOP-EOCTDAN\ats_1:(R)
~~~

## 最後に
Freenove Starter Kitで Arm Cortex-M4 を動かしてみた

届きました。

![PXL_20241016_090727167.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/77ebd8ca-029b-fe56-16d7-8eff249e04ed.jpeg)

開けてみます。

![PXL_20241016_091143083.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/50c74060-8152-5d6e-ffb0-efa09cbe5a0d.jpeg)

とりあえず、いきなりUSBでPCにつないでみます。

![PXL_20241016_091636634.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/e2b0c7ac-5fcd-49a4-8a35-fa2530a9eda9.jpeg)

なんか光りました。

USBを見てみます。

![2024-10-16 18.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/16a1cbca-74c6-90f5-393a-f059881c2722.png)

なるほど。では Arduino IDEを起動してみます。

![2024-10-16 18.21.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/d72d2416-441e-fd01-faa5-06fc81b1f648.png)

認識されてますね。選択してみます。

![2024-10-16 18.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/b4cc7896-2b59-2b7c-ce84-594958462ad8.png)

はい。

![2024-10-16 18.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/11b21dfe-af08-524b-80da-ae66f71c6d55.png)

プラットフォームがインストールできたようです。

では何か動かしてみましょう。やはりまずはLチカですかね。サンプルはあるかな？

![2024-10-16 18.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/8f2a0a1a-db27-d321-d53e-4f99da4fdb30.png)

ありました。`Blink`がそれっぽいです。

![2024-10-16 18.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/d987b735-c132-4d89-7b06-e8742903c3e1.png)

コードが読み込まれました。検証＆書き込み（ビルド＆ロード）してみます。

……無事「L」がゆっくり点滅しました。

コードをちょっとアレンジしてみます。

![2024-10-16 18.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/4f2cdfa2-de23-be89-3ed2-ab5dd67edf19.png)

再び実行してみると、ちゃんとパッパッ……パッパッ……という点滅に変わりました。

とても簡単ですね。

おしまい
個人開発でつまづいたところ DB編

とある日、個人開発をしているととあるバグに遭遇しました。
それは
### 現在時刻(JST)を取得してDBにINSERTするとUTCで時刻がINSERTされてしまう

というものでした。

## 解消のために試したこと
- API側(Go)のロジック内の時間をlogで出力
　→JSTになっている
- DBのTZ設定を`SET timezone TO 'Asia/Tokyo';`で設定
　→変化なし
- ORM(gorm)の設定見直し
　→変化なし
 
なんで直らんねん！！！！！！！！！

と思って2.3日悪戦苦闘してました。

## 解決方法
DBのカラムの型を`timestamp`から`timestamptz(タイムゾーンあり)`に修正したらうまくいった
![お前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815410/55944edb-fd8b-79ae-dfa7-6bc48488481d.png)

## そもそも
そもそもSupabaseのカラム設定のところにtimestampで大丈夫？？？timestampzの方がおすすめだよ！！って懇切丁寧に書いてありました。
![スクリーンショット 2024-10-16 18.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815410/d5eba9d3-4ec4-2468-000a-284393e5dc82.png)

## PostgreSQLの`timestamp`と`timestamptz`
SupabaseはバックエンドにPostgreSQLを使用しており、PostgreSQLのデータ型に関する知識が不足してました。

PostgreSQLでは、時間を保存するために主に次の2つのデータ型があります

### timestamp（タイムスタンプ）
この型はタイムゾーン情報を保持せず、単純に **「日付と時刻」の情報のみ** を格納します。
タイムゾーンに関係なくそのまま保存されるため、取得した時刻がどのタイムゾーンを基準にしているかはデータからは分かりません。
### timestamptz（タイムゾーン付きタイムスタンプ）
この型はタイムゾーンの情報を保持するため、格納された時間は常にUTCに変換されます。
クエリで時刻を取得すると、自動的にクライアントのタイムゾーンに応じて変換された結果を返します。つまり、異なるタイムゾーン間で一貫した時刻データを扱うことが可能です。
<table>
  <caption>timestampとtimestamptzの違い</caption>
  <thead>
    <tr>
      <th>型名</th> <th>保存されるデータ</th> <th>タイムゾーン対応</th> <th>保存時の変換</th> <th>取得時の変換</th>
     </tr>
  </thead>
  <tr>
    <td> timestamp </td> <td>日付と時刻のみ</td> <td> × </td> <td>なし</td> <td> なし </td>
  </tr>
  <tr>
    <td> timestamptz </td> <td>日付と時刻 + タイムゾーン情報</td> <td> ○ </td> <td>UTCに変換される</td> <td> クライアントのタイムゾーンに変換 </td>
  </tr>
</table>

### 参考文献
https://www.postgresql.jp/docs/9.4/datatype-datetime.html
【MySQL Workbench】Authentication plugin '' cannot be loaded

# はじめに
MySQL WorkbenchからDockerコンテナで起動したMySQLサーバーに接続しようとしたところ、以下のエラーが発生。

`
Authentication plugin '' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/.so, 0x0002): tried: '/usr/local/mysql/lib/plugin/.so' (no such file),
`

参考記事も見つけられず、解決まで時間がかかってしまったのでまとめておきたいと思います。

# 解決策
MySQL Workbenchのバージョンを下げたら接続できました...
8.0.33で接続を確認できています。

https://downloads.mysql.com/archives/workbench/


エラーが発生した際の環境情報
- Mac Book Pro M3
- Sonoma 14系
- MySQL Workbench 8.0.38(2024/10/16時点で最新)

# エラー発生時に確認したこと
- 接続情報は正しいか（System Profileなどの設定は行なっていません）
    - 接続方式、ホスト名、ポート、ユーザー名、パスワード、スキーマ
- コンテナは起動できているか
- 接続時の認証プラグインが「mysql_native_password」になっているか
下記コマンドで確認できます。
mysql> `SELECT User, Host, Plugin FROM mysql.user;`
→my.cnfの「mysql_native_password」を「caching_sha2_password」に変更してコンテナを再起動しても状況は変わらなかったです。

# おわりに
認証プラグインを読み込めていなかったようでしたが、
MySQL Workbench側で設定箇所を特定できなかったため、バージョンを変えて再インストールを試したところ接続できました。まさか沼るとは思っていませんでした。
【学習】フッターを固定。fixed

# はじめに
ウェブアプリ制作過程において。
フッターの固定について、今更ですが気づいたことを記事にして残しておきたいと思います

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3


## まずはコードの違いから
```ruby
<footer class="bg-white rounded-lg shadow m-4 dark:bg-gray-800">
```

```ruby
<footer class="fixed bottom-0 left-0 z-20 w-full p-4 bg-white border-t border-gray-200 shadow md:flex md:items-center md:justify-between md:p-6 dark:bg-gray-800 dark:border-gray-600">
```

👆上記2つのコードの違いが何かわかりますか？
私はよくわかっていませんでした💦

**フッターの固定**という観点だけで今回はみていきます。

#### 【1つめ】
- **クラス**: `bg-white`, `rounded-lg`, `shadow`, `m-4`
- **位置**: フッターは通常のフローに従って文書内に表示され、ページの内容がスクロールされるとフッターも一緒にスクロールします。

#### 【2つめ】
- **クラス**: `fixed`, `bottom-0`, `left-0`, `z-20`, `w-full`, `p-4`
- **位置**: フッターは`fixed`クラスによって、画面の下部に固定されます。これにより、ユーザーがページをスクロールしても、フッターは常に画面の下に表示されます。


## つまりこういう事
1つ目は一番下までスクロールしてはじめてフッターが表示されます。
2つ目は`fixed`というクラスを設けることによってLINEなどで文字入力欄が常に下部に表示されているように、このフッターも常に下部に表示されるようになっています。

`fixed`だけでこんな違いが生じるなんて。コードの意味を理解するのがここ最近楽しい。
ただローカル環境だとうまくいっているように見えても、本番環境ではデザインが少しおかしくなることあるので、逐一確認は必須です。
なぜ大規模用フレームワークになるとルーティング設定がいるのか？

# 1. そう思ったきっかけ

初めてプログラミングを学び始めたとき、PHPを使ってウェブサイトを作成することは非常にシンプルでした。
ファイルベースの構造を使い、たとえば `index.php`、`about.php`、`contact.php` などのファイルを作成するだけで、特別なルーティング設定をする必要はありませんでした。URLがそのままファイルの構造に対応していたからです。

このようなファイルベースのルーティングは、小規模なウェブサイトでは非常に便利で直感的ですが、複雑なアプリケーションや大規模なプロジェクトになると、途端に管理が難しくなります。そのときに、フレームワークのルーティング設定がなぜ必要なのかを考えるようになりました。バニラのPHPでは不要だったルーティング設定が、フレームワークになると必須になる理由は何なのでしょうか？

# 2. 詳しい説明

私が調べた結果、大規模なアプリケーションでは、いくつかの要因によりルーティング設定が必要になります。
ここで上げられるのは`laravel`ですが、その他にも`Node.js`、`Java`、`Python`などを使用したフレームワークも含まれます。

## **2 - 1 URLと内部ファイルの分離**
バニラのPHPでは、URLはそのまま物理的なファイル構造に対応していますが、大規模なアプリケーションでは、URLをファイル構造から切り離すことが望ましいです。なぜなら、URLはユーザーにとって直感的であるべきであり、変更されにくい設計が求められるからです。

フレームワークは、URLをコントローラやアクションといった内部ファイル・フォルダにマッピングする役割を果たします。これにより、物理的なファイル構造を意識せずに、自由にURLを設計でき、URLの変更や内部構造の変更にも柔軟に対応できるのです。

## **2 - 2 可読性とメンテナンス性の向上**
数十、数百ものページや機能を持つ大規模なプロジェクトでは、各ページをファイル単位で管理することは煩雑です。ルーティング設定を使うことで、すべてのURLとその処理を一元管理でき、プロジェクトの可読性とメンテナンス性が大幅に向上します。

たとえば、LaravelやRailsといったフレームワークでは、ルートファイルにすべてのルーティングが定義されているため、新しいページを追加したり、URL構造を変更する場合にも、中央集約された場所で管理できるメリットがあります。

## **2 - 3 再利用性と拡張性**
大規模なアプリケーションでは、同じ処理を異なるパスで呼び出したり、特定の条件に応じて異なるビューを表示することが求められます。ルーティング機能は、これを実現するための柔軟性を提供します。たとえば、同じコントローラを複数のURLで再利用できたり、ルートに条件（HTTPメソッドやパラメータの値など）を設定して、動的な振る舞いを実現することができます。

## **2 - 4 セキュリティとアクセス制御**
ルーティング機能が私の中で一番必要としている理由はここです。大規模なアプリケーションでは、ユーザーの認証やアクセス権の管理が必要になります。フレームワークのルーティング機能は、各ルートに対してアクセス制限を設定したり、ミドルウェアを適用してセキュリティを強化することができます。
これにより、ユーザーが特定のページにアクセスする前、認証やアクセス権の確認が簡単に行えるようになります。

# 3. まとめ

小規模なプロジェクトの場合は、シンプルなファイルベースのルーティングで十分な場合もありますが、大規模なプロジェクトになると、ルーティング設定は必須となります。URLと内部ファイル・フォルダの分離、可読性の向上、再利用性や拡張性、セキュリティ面での強化など、さまざまな理由から、フレームワークがルーティング設定を提供しているのです。
大規模プロジェクトでは、ルーティング設定を活用することで、コードベースの管理が容易になり、将来的な拡張や変更にも柔軟に対応できるようになります。

## 読んでくれてありがとう
**この記事を読んでいただき、本当にありがとうございました。** 技術の世界は常に進化していますが、皆さんの理解や意見が共有されることで、より良い未来が築かれると信じています。少しでもお役に立てたなら嬉しいです！ヽ(^o^)丿
【Ruby】初学者向け－言語基礎②

今回は汎用性の高い文法についてまとめていきます。

目次
・三項演算子について
・擬似変数について
・case文について
・ヒアドキュメントについて
・Rangeオブジェクトについて

<h1>【三項演算子について】</h1>
三項演算子とは「条件式？式１：式２」という記述で表される演算子のこと

条件式に一致する場合は「式１」、条件式に一致しない場合は「式２」を結果とします

```ruby:example_1.rb
a = true

# aがtrueである場合は1、そうでない場合は2を結果とする
a = true ? 1 : 2

# aを出力
p a

# aはtrueであるため1が出力される
=> 1
```

<h1>【擬似変数について】</h1>

**擬似変数**
…特定の状況で特別な意味を持つ変数のこと。
|    変数名  |     内容    |
|:-----------|:------------|
| true       | TrueClassのインスタンス        | 
| false     | FalseClassのインスタンス      |
| nil       | NillClassのインスタンス        | 
| self         | 現在のオブジェクト          |
|  \_\_FILE\_\_   | 現在実行しているプログラムのファイル名       |
|  \_\_LINE\_\_   | 現在実行しているプログラムの行番号     |
| \_\_ENCORDING\_\_    | 現在のソースファイルのスクリプトエンコーディング     |

※Rubyにおいては「nil」と「false」のみが「偽」を示す。

<h1>【case文について】</h1>
if文の条件が多くなった場合など、「elsif」を乱用するよりも
case文を用いて記述した方が可読性が高くなる

```ruby:example_2.rb
case <式>
when <条件式１> [then]
when <条件式２> [then]
...
else
end

```

```ruby:example_3.rb
case 1
when 1 then
    p 1
end 
=> 1

-------------------------------
# 先に当てはまった条件文に分岐して実行される
case "abc"
when "abc" 
    p 1 # 実行される
when "abc"
    p 2 # 実行されない
end
=> 1

-------------------------------
# 変数bにcase a の結果を格納して結果を出力する
a = 10
b = case a

when 1 then
    1 # 実行されない
else
    2 # 実行される
end
p b
=> 2
```

<h1>【ヒアドキュメントについて】</h1>

**ヒアドキュメント**
…複数行の文字列を簡単に記述するための構文。
　主にスクリプト言語やプログラミング言語で使用され、
　通常の文字列リテラルと違い、途中で改行や特殊文字を気にせずに
　複数行のテキストをそのまま書くことができる。
 
 　考え方としては「指定した識別子までの文字列を１つのリテラルとして扱う」といったもの。
   SQLなどの直書きが行える。

```ruby:example_4.rb
# ヒアドキュメントは終端を示す識別子の前にはスペースを記述してはいけないため「-」を使用する
query = <<-SQL
    select * 
        from my_table;
SQL
query
=> "select * \n  from my_table;\n"
```


<h1>【Rangeオブジェクトについて】</h1>

**範囲リテラル**
…特定の範囲内の連続した値を表現するために使用される構文で、
　数値や文字列、日付などの範囲を簡潔に表現できる。

```ruby:example_5.rb
# 「..」の場合は「以下」を表す。「...」の場合は「未満」を表す。
    1 .. 10    # 1から10以下の範囲
    "a" .. "z" # aからz以下の範囲
    1 ... 10   # 1から10未満の範囲
```
上記のように生成した値は、範囲オブジェクトと呼ばれる。
範囲オブジェクトはinclude?メソッドを用いて、引数で指定した値が範囲に含まれているかどうかが判定ができる。

範囲オブジェクトでは===演算子も用いることができる。
ただし、「==」は同値判定、「===」は包含判定となる。
WSLにおいてconda activateの際に発生したエラーの解決。conda activateが効かない。

# 問題
`conda activate`コマンドを使ったところ、下記のエラーが発生。
```shell:sh
CondaError: Run 'conda init' before 'conda activate'
```
言う通りに`conda init`を行ったところ
```shell:sh
no change     /home/sophytoeat/anaconda3/condabin/conda
no change     /home/sophytoeat/anaconda3/bin/conda
no change     /home/sophytoeat/anaconda3/bin/conda-env
no change     /home/sophytoeat/anaconda3/bin/activate
no change     /home/sophytoeat/anaconda3/bin/deactivate
no change     /home/sophytoeat/anaconda3/etc/profile.d/conda.sh
no change     /home/sophytoeat/anaconda3/etc/fish/conf.d/conda.fish
no change     /home/sophytoeat/anaconda3/shell/condabin/Conda.psm1
no change     /home/sophytoeat/anaconda3/shell/condabin/conda-hook.ps1
no change     /home/sophytoeat/anaconda3/lib/python3.12/site-packages/xontrib/conda.xsh
no change     /home/sophytoeat/anaconda3/etc/profile.d/conda.csh
no change     /home/sophytoeat/.bashrc
No action taken.
```
というエラーが発生。

# 解決策

この問題は、Anacondaの初期化がうまくいっていない場合に発生することがあるらしいです。下記の通りおこなった

### 1. .bashrc ファイルを確認する
`conda init` コマンドは通常、~/.bashrc ファイルにCondaの設定を追加します。しかし、何らかの理由でその設定が反映されていない可能性があるそうなので。これを確認して、修正します。

ターミナルで次のコマンドを実行して .bashrc ファイルの内容を確認します。

```bash:
nano ~/.bashrc
```
.bashrc の末尾に次のような行があるか確認してください。

```bash
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/sophytoeat/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/sophytoeat/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/home/sophytoeat/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/sophytoeat/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
```
もし上記のような記述が無い場合は、手動で .bashrc に追加して保存します。

### 2. nanoエディタを使った貼り付け
上記のコードをコピーして貼り付けます。貼り付けが終了したら、Ctrl + X を押します。これで終了コマンドを呼び出します。
変更を保存するかどうかを尋ねられるので、保存したい場合は Y （Yes）を押します。保存しない場合は N （No）を押します。
保存する場合、ファイル名を確認するプロンプトが表示されます。変更しない場合はそのまま Enter を押して保存します。

次に、.bashrc の設定を再読み込みします。

```bash
source ~/.bashrc
```
その後、再度Conda環境をアクティベートします。

```bash
conda activate 
```
仮想環境に入れました。
Snowflake オブジェクトへのアクセス制御

# はじめに
Snowflakeアクセス制御のベストプラクティスの一つである、
ファンクショナルロール/アクセスロールによるアクセス制御についてまとめました。

# Snowflakeにおけるアクセス制御
Snowflakeにおけるロールベースアクセスコントロール（RBAC）に
ファンクショナルロール/アクセスロールの2層の概念によるアクセス制御があります。
ファンクショナルロールとアクセスロールという概念を利用し、それらのロールの階層によってアクセス制御を構成します。
（Snowflakeにおけるアクセス制御全般の説明は公式サイトに↓）
アクセス制御の概要：https://docs.snowflake.com/ja/user-guide/security-access-control-overview

## ファンクショナルロール/アクセルロールとは
そもそもファンクショナルロールとアクセルロールとは何でしょうか？
公式の例で見てみると、
上から2段目のACCOUNTANTやANALYSTはファンクショナルロール、
その下段の"DB_"で始まるロールはアクセスロールにあたります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/01292452-f886-ed69-180e-9678bd4ad752.png)
画像引用元：https://docs.snowflake.com/en/user-guide/security-access-control-considerations#aligning-object-access-with-business-functions

### ファンクショナルロール
→あるユーザが何の役割または組織に対応するかを示すロール。
ファンクショナルロールは基本的にはユーザーに割り当てるロールです。
（ユーザーと紐づくロール！）
企業の場合、職位や役職に当てはめて考えるのが一般的。
例：マネージャー、アナリスト、経理課、人事部、etc.

### アクセルロール
→何のオブジェクト(DBやスキーマなど)に対して、何の操作ができるかを示すロール。
アクセスロールはオブジェクトの権限が付与され、ファンクショナルロールに継承するロールです。
（オブジェクトと紐づくロール！）
例：参照、管理、追加および修正、etc.

:::note warn
これらのロールはあくまで概念であり実際に機能として存在するわけではないです。
:::


ファンクショナルロールとアクセルロールのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/9cf46f4f-4ff1-b622-1a00-839f0872f46f.png)


## 利用すると良いこと
ファンクショナルロールとアクセルロールの概念を使うことで以下の良いことがあります。

### 1. ロールと権限を紐づけることで論理的に分けられる
Aスキーマの参照権限がまとまっているロール、Bスキーマの編集権限がまとまっているロール、と人間がわかるように区別しておくことができるのですっきりまとまります。
公式の画像を見ると例えば、
"DB_FIN_RW"というアクセスロールは配下に多くの権限が連なっていますが、ロール名から「データベースFIN（おそらくfinancialの略）の **R** EAD と **W** RITE権限を持つロール」とおおよそわかります。


### 2. 塊にしておくことでロールの付け替えがしやすい
人が増えたとき、役割や部門が変わったときなどの運用イベントに楽に対応できます。
例えば、
USER1と同等の役割のユーザー増えたとします。
ロールがある場合はACCOUNTANTを割り当てるだけなのに対し
ロールがない場合はその下に記載されているDB FINのUSAGE、schemaのUSAGE、tableのSELECT、INSERT、UPDATE、DELETEを一つずつUSER1に付与しなければなりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/01292452-f886-ed69-180e-9678bd4ad752.png)
画像引用元：https://docs.snowflake.com/en/user-guide/security-access-control-considerations#aligning-object-access-with-business-functions



何度も多くの権限を設定することなくシンプルな運用を実現できます。



# まとめ
・ファンクショナルロールはどんな役割/職位かを示す
・アクセルロールは何のオブジェクトにどんな操作ができるかを示す
・使うことで運用の手間を軽減できる

私のSnowflakeを初めて勉強したときの最初のつまづきポイントでした。とてもシンプルですがこの考え方に慣れるまで時間がかかりました。。
この概念を利用してロール設計をしていくのでおさえておくと後々楽です。具体的な例は別の記事で書こうと思います。


# 参考

アクセス制御の概要：
https://docs.snowflake.com/ja/user-guide/security-access-control-overview

オブジェクトアクセスをビジネス機能と整合させる：
https://docs.snowflake.com/en/user-guide/security-access-control-considerations#aligning-object-access-with-business-functions
Flask + SQLAlchemyで音楽共有SNSを作る - アプリケーション初期化編

## はじめに

前回の記事では必要なライブラリとモジュールのインポートについて解説しました。今回は、Flaskアプリケーションの初期化と基本的な設定について説明します。

## Flaskアプリケーションの初期化

まず、Flaskアプリケーションを初期化し、重要な設定を行います。

```python
app = Flask(__name__)

# アプリケーションの設定
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///music_sns.db'
app.config['UPLOAD_FOLDER'] = 'static/uploads'
app.config['ALLOWED_EXTENSIONS'] = {'mp3', 'wav', 'ogg'}
```

## 各設定の説明

### 1. SECRET_KEY

```python
app.config['SECRET_KEY'] = 'your-secret-key'
```

- **用途**: セッションデータの暗号化に使用する秘密鍵
- **重要性**: セッションの安全性を確保するために非常に重要
- **注意点**: 
  - 実際の運用時は、この値を環境変数から読み込むなど、ソースコードに直接書かないようにしましょう
  - 十分に長く、予測困難な文字列を使用してください

### 2. SQLALCHEMY_DATABASE_URI

```python
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///music_sns.db'
```

- **用途**: データベースの場所と種類を指定
- **説明**: この例では、SQLiteデータベースを使用し、`music_sns.db`というファイル名で保存
- **注意点**:
  - 開発時はSQLiteが便利ですが、本番環境では他のデータベース（例：PostgreSQL）の使用を検討してください
  - パスは適切に設定してください。相対パスか絶対パスかに注意

### 3. UPLOAD_FOLDER

```python
app.config['UPLOAD_FOLDER'] = 'static/uploads'
```

- **用途**: ユーザーがアップロードしたファイルの保存先を指定
- **説明**: この例では、`static/uploads`ディレクトリにファイルを保存
- **注意点**:
  - このディレクトリが存在することを確認してください
  - 適切なアクセス権限を設定し、セキュリティに注意してください

### 4. ALLOWED_EXTENSIONS

```python
app.config['ALLOWED_EXTENSIONS'] = {'mp3', 'wav', 'ogg'}
```

- **用途**: アップロードを許可するファイル拡張子を指定
- **説明**: この例では、音楽ファイル（mp3, wav, ogg）のみを許可
- **重要性**: セキュリティ上重要な設定。不正なファイルのアップロードを防ぐ

## まとめ

これらの設定は、Flaskアプリケーションの基本的な動作を定義し、セキュリティと機能の両面で重要な役割を果たします。適切に設定することで、安全で機能的な音楽共有SNSの基盤を作ることができます。

## 参考リンク
- [Flaskの設定ハンドリング](https://flask.palletsprojects.com/en/2.3.x/config/)
- [Flask-SQLAlchemyの設定](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/config/)
「建築士H27構No.3【構造力学】#1 単純ばりの反力」をsympyのBeamでやってみた。

・タイトルを変更予定です。
・同じ？答えがでました。
・専門家様のアドバイスをいただければ幸いです。
・どなたかAIで実行してほしいです。

# オリジナル
【構造力学】#1 単純ばりの反力
スチのり 様(0:00〜12:18)

https://youtu.be/tchxzmi_Hgo

# 普通に？
勉強中

# sympyのBeamで
```python
# H27構No.3
# ver0.1
from sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols, Piecewise
P , E, I = symbols('P,E,I')
VA, VB = symbols('VA, VB')
b = Beam(6, E, I)
b.apply_load(VA,0,-1)
b.apply_load(-P,2,-1)
b.apply_load(VB,6,-1)
b.bc_deflection = [(0, 0), (6, 0)]
b.boundary_conditions
b.load
b.solve_for_reaction_loads(VA, VB)
b.load
b.shear_force()
b.bending_moment()
#b.slope()
#b.deflection()
#b.deflection().rewrite(Piecewise)
#p = b.draw()  
#p
print("#VA=",b.reaction_loads[VA])
print("#VB=",b.reaction_loads[VB])
#VA= 2*P/3
#VB= P/3
```
　
https://live.sympy.org/

# 参考
#### sympyのdoc

https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html

#### Qiita

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

https://qiita.com/mrrclb48z/items/893cb0967e4ddb2945f7
vbsの作法 その93

# 概要
vbsの作法、調べてみた。
練習問題やってみた。

# 練習問題
sin波をIE11で表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4d163d04-2912-8756-1d38-be0c0b635f1d.png)


# サンプルコード

```

Class ohicompo1
	Private objIE
	Private Sub Class_Initialize
		Set objIE = CreateObject("InternetExplorer.Application")
		objIE.Visible = true
		objIE.Top = 100
		objIE.Left = 100
		objIE.Width = 500
		objIE.Height = 600
		objIE.Navigate("about:blank")
		objIE.StatusBar = False
		objIE.ToolBar = 0
		objIE.Document.Write "<html><head><title>ohicompo1</title></head><body>"
		objIE.Document.Write "<canvas id='canvas' width='300' height='300'></canvas>"
		objIE.Document.Write "<input id='btn' type='submit' value='run' onclick='run()'><br>"
		objIE.Document.Write "<textarea id='src'rows='20' cols='30'></textarea>"
		objIE.Document.Write "<script type='text/javascript'>"
		objIE.Document.Write "var src = document.getElementById('src');"
		objIE.Document.Write "var canvas = document.getElementById('canvas');"
		objIE.Document.Write "var ctx = canvas.getContext('2d');"
		objIE.Document.Write "function draw(data) {"
		objIE.Document.Write "    ctx.strokeStyle = '#f0f';"
		objIE.Document.Write "    ctx.lineWidth = 2;"
		objIE.Document.Write "    ctx.moveTo(0, 150);"
		objIE.Document.Write "    for (var i = 1; i < canvas.width; i++)"
		objIE.Document.Write "    {"
		objIE.Document.Write "        ctx.lineTo(i, 150 - data[i] * 30);"
		objIE.Document.Write "    }"
		objIE.Document.Write "    ctx.stroke();"
		objIE.Document.Write "}"
		objIE.Document.Write "function run() {var data = [];var line = src.value.split(' ');for (var i = 0; i < line.length; i++){data.push(line[i]);}draw(data);}"
		objIE.Document.Write "</script></body></html>"
	End Sub
	Private Sub Class_Terminate
	End Sub
	Public Sub text(str)
		objIE.Document.getElementById("src").InnerText = str
	End Sub
	Public Sub run()
		objIE.Document.getElementById("btn").Click()
	End Sub
	Public Sub owari()
		objIE.Quit
	End Sub
End Class

Dim str
str = ""
Dim ds
Dim s
Dim i
ds = 220 * 2 * 3.1415 / 8000
s = 0
for i = 0 to 300
	v = Sin(s)
	str = str + CStr(v) + " "
	s = s + ds
next
Dim w1
Set w1 = new ohicompo1
w1.text str
w1.run







```

以上
【アクセシビリティ】　tabindexを使ってタブキーでフォーカス移動できるようにする方法

こんにちは！
1年目の小川です。

突然ですが、皆さんは**tabindex**を知っていますか？もしくは使っていますか？

今回は、タブキーでのキーボード操作で必要不可欠な**tabindex**についてまとめていきたいと思います。

# こんな人に読んでほしい

* エンジニア
* アクセシビリティに興味がある方
* サイトやアプリのアクセシビリティ対応に重力したい方

# tabindexとは？
**tabindex**とは、タブキーで操作するときに、フォーカスが当たるかどうかを指定するときに使うものです。
パソコンを使う人全員がマウスで操作しているわけではなく、キーボード操作のみで画面の情報を収集している人がいます。
そのような人たちは、タブキーを使って、文章や項目を移動させることがあります。
視覚障害があり、スクリーンリーダー（音声読み上げ）を使う人もその一人です。

# どうやって使うの？
このtabindexは指定する数字によってフォーカスが当たるかどうかが変わってきます。

* tabindex="0" 記載した順番にフォーカスが当たる
* tabindex="1" 数字の順番にフォーカスが当たる。
* tabindex="-1" フォーカスを当てない（記載しないのと同じ）

フォーカス可能な要素（リンク、ボタン、フォームなど）に対して、キーボードでのフォーカスの順序を指定するためのHTML属性です。デフォルトでは、ブラウザはHTML要素を上から下に読み込み、フォーカス可能な要素間をTabキーで移動しますが、tabindexを使うことでこの順序をカスタマイズできます。

# 基本的な使い方

## tabindex="0"：デフォルトのタブ順序
通常のタブ順序の中に要素を追加したい場合、tabindex="0"を使用します。例えば、divやspanなど、フォーカスできない要素に対してこれを指定することで、キーボード操作でもその要素にフォーカスできるようにします。

```html
<div tabindex="0">この要素はTabキーでフォーカス可能です。</div>
```

## tabindex="1"以降：タブ順序のカスタマイズ
タブ順序を指定したい場合、tabindex="1"やそれ以上の値を使用します。例えば、次のようにフォームの要素にカスタム順序を設定できます。

```html
<form>
  <input type="text" placeholder="名前" tabindex="2">
  <input type="text" placeholder="メールアドレス" tabindex="1">
  <button type="submit" tabindex="3">送信</button>
</form>
```

この例では、メールアドレスフィールドが最初にフォーカスされ、その後に名前フィールド、最後に送信ボタンがフォーカスされます。

## tabindex="-1"：フォーカス可能だがタブキーでは移動しない
tabindex="-1"は、要素をTabキーでフォーカスさせたくない場合に使用します。ただし、JavaScriptなどでプログラム的にフォーカスを移動させることは可能です。

```html
<div tabindex="-1" id="modal">この要素はTabキーでフォーカスできません。</div>
<script>
  document.getElementById("modal").focus(); // プログラム的にフォーカスを移動
</script>
```

# 応用的な使い方
## モーダルダイアログでのtabindex
モーダルダイアログの実装時、tabindex="-1"を使って、モーダル外の要素をフォーカスから外し、モーダル内の操作に集中させることができます。

```html
<div class="modal" tabindex="-1" role="dialog">
  <button tabindex="1">閉じる</button>
  <p>ここはモーダルダイアログの内容です。</p>
  <button tabindex="2">保存</button>
</div>
```

このように、ダイアログ内でのみフォーカスを循環させることで、ユーザーが他のページ要素に誤ってフォーカスを移動させることを防ぐことができます。

## アクセシブルなスキップリンク
アクセシビリティを高めるために、スキップリンクを提供するのも一般的です。tabindexを使って、キーボードでのナビゲーションを改善します。

```html
<a href="#main-content" tabindex="1" class="skip-link">メインコンテンツへ移動</a>

<!-- 他のコンテンツ -->

<main id="main-content" tabindex="-1">
  <h1>メインコンテンツ</h1>
  <p>ここがメインのコンテンツです。</p>
</main>
```

スキップリンクを使うことで、画面リーダーやキーボードユーザーが簡単にメインコンテンツにアクセスできるようになります。

# tabindexの注意点
過剰にtabindexを使用すると、かえってフォーカスの順序が混乱し、上の項目から順番に閲覧ができなくなります。通常はtabindex="0"を使い、タブ順序をカスタマイズするのは最小限に抑えるのが適切です。
負の値（tabindex="-1"）を使うと、要素はTabキーでフォーカスされませんが、JavaScriptなどでプログラム的にフォーカスを当てる必要があるモーダル内などで役立ちます。

# 最後に
今回はtabindexについてまとめてきました。
tabindexは、Webページのアクセシビリティを向上させるために重要なツールです。
適切に使用することで、キーボード操作を行うユーザーにとっても、スムーズで直感的な操作が可能になります。
色々なWebサイトを見ていると、まだ、タブキー操作でフォーカスが当たらず、見たいサイトの情報を満足に得られないことも多々あります。
今回の記事を参考にして、開発に組み込めそうな時はぜひ試してみてください。
ここまで読んでいただきありがとうございました。
[最新LTS] Java 21 では何が変わったのか？新機能3つを紹介

<br>

# ■ はじめに
<br>

2023年にJava 21が最新のLTSバージョンとしてリリースされました。
これまで最新バージョンに触れていなかったため、知識のアップデートも兼ねてJava 17からの進化点や
変更、新機能を具体的なコード例を交えながら解説していこうと思います。

本記事では最新バージョンの一部をご紹介しますが、更新内容の全ては [OpenJDK](https://openjdk.org/projects/jdk/21/) より確認できます。

# ■ 目次
<br>

1. [Java 21の概要](#1-java-21の概要)
2. 新機能紹介
   -  新機能1：[仮想スレッドの導入](#新機能1仮想スレッドの導入)
   -  新機能2：[レコードパターン](#新機能2レコードパターン)  
3. [まとめ](#5-まとめ)

# 1. Java 21の概要

<br>

Java 21は2023/9/19にリリースされたJavaプラットフォームの最新[^1]のLTSバージョンです。
LTSバージョンは長期間のサポート版として提供されるため、企業や大規模プロジェクトで安定した開発基盤として重要視されます。


### Java 21の特徴

- **パフォーマンスの最適化**
    - 低レベルの最適化が多数行われ、Javaの実行速度が向上

- **セキュリティの向上**
    - 新しいセキュリティ機能の追加 エンタープライズ向けシステムにおいてより高いセキュリティレベルの提供

- **モダンなコーディングパターンのサポート**
    - 新機能によってプログラマがより直感的にモダンなプログラミング手法を取り入れやすくなっている。

バージョンアップに伴う特徴として挙げられるのは上記となりますが、
細かな新機能も増えているのでこちらでは例として2つご紹介します。

# 新機能1：仮想スレッドの導入

<br>

まずご紹介する新機能は仮想スレッドです。
従来のスレッドと比べたとき仮想スレッドは軽量であり、大量のスレッドを扱う際に効率的です。
これにより並行処理が容易に実現できます。

```java
import java.util.concurrent.Executors;

public class VirtualThreadsExample {
    public static void main(String[] args) throws InterruptedException {
        var executor = Executors.newVirtualThreadPerTaskExecutor();

        for (int i = 0; i < 10; i++) {
            executor.submit(() -> {
                System.out.println("仮想スレッド：" + Thread.currentThread());
            });
        }

        executor.shutdown();
    }
}
```

上記の例では仮想スレッドを使用して10個の並列タスクを実行しています。
`Executors.newVirtualThreadPerTaskExecutor()`では仮想スレッドを生成するExecutorサービスを作成しています。
（各タスクごとに仮想スレッドを作成する`ExecutorService`が返る）

`Thread.currentThread()` は現在実行中のスレッド情報を返すメソッドなので、
for文内のSystem.out.出力には繰り返しの中で仮想スレッドが表示されます。

また、`executor.shutdown();`はExecutorServiceを終了させるメソッドです。
（このメソッドを呼び出すことでリソースの解放やタスクの完了を保証します。）


## 新機能2：レコードパターン

<br>

次に紹介する機能は新たに導入された「レコードパターン」です。
レコードクラスを用いたパターンマッチングが可能になり、簡潔なコードでデータ抽出ができるようになります。

```java
public record Point(int x, int y) {}

public class RecordPatternExample {
    public static void main(String[] args) {
        Object obj = new Point(10, 20);

        if (obj instanceof Point(int x, int y)) {
            System.out.println("X座標: " + x + ", Y座標: " + y);
        }
    }
}
```
この例では、レコードPointを使ったパターンマッチングを行っています。
オブジェクトがPointインスタンスである場合にそのフィールドxとyを簡単に抽出し、処理が行えます。


## 5. まとめ

<br>

 - Java 21は2023年9月に公開された最新のLTSバージョンで、以下のような新規機能がある
     - 仮想スレッドの導入で、大量のスレッド処理が効率化
     - レコードパターンによって、レコードクラスを用いたより簡潔なパターンマッチングが可能に

他にも多数の改善点や新機能が追加されていますが、ここでは代表的なものを2つ紹介しました。

実際のプロジェクトで使用することになるのはまだ先かもしれませんが、
Java 21の新機能を活用することでよりシンプルかつ効率的なコードを書けるようになるのが楽しみですね。


[^1]:2024年10月現在
Japan IT Week秋に参加する韓国スタートアップが参加するピッチデーが日本で開催

![kstartup_banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/049e8bab-1b87-c448-3ebf-c2c7040c8d7b.png)

10月23日から25日に幕張メッセで開催される「Japan IT Week 秋」に合わせ、10月21日から25日までの期間、IBK Changgong日本アクセラレーティングプログラムが実施される。
このプログラムは、韓国の優れたスタートアップ企業が日本市場に進出し、ビジネスチャンスを拡大することを目的としている。

トラベルテック、ヘルスケア、物流DX、AIなど、さまざまな成長産業を代表する9社の韓国スタートアップが参加し、それぞれの分野で革新的な技術やサービスを紹介する予定である。

さらに、プログラムの一環として、10月22日にはJETRO Innovation Gardenにて「韓国スタートアップピッチデー in Tokyo」を開催する。このイベントでは、参加企業が自社の技術やビジネスモデルを発表し、日本の投資家やビジネスパートナーとの交流の場が提供される予定である。

 ![Poster-Korean Startups Pitch Day in Tokyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/2707e5b4-d4ba-f6b6-2542-38afea8910c3.png)

## プログラム概要

韓国スタートアップピッチデーin Tokyo
日時：2024年10月22日（火）10:00~12:00
場所：JETRO　Invest Japan Business Support Center
（東京都港区赤坂1丁目12－32　アーク森ビル7階）

### ▶ 参加方法
下記フォームより参加登録可能：
[韓国スタートアップピッチデー in Tokyo (google.com)](https://docs.google.com/forms/d/e/1FAIpQLScMz-AviuQyG-kgLeFnoG9v0W5U4fYZgS_ArX_JdaqcQJKGFg/viewform)



出典：[NewsTimes](https://newstimes.jp)
「令和4年二級建築士試験学科Ⅲ（建築構造）〔Ｎｏ．３ 〕」張り出し梁 等分布荷重をsympyのBeamでやってみた。

・タイトルを変更予定です。
・同じ？答えがでました。
・専門家様のアドバイスをいただければ幸いです。
・どなたかAIで実行してほしいです。

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

# 普通に？
勉強中

# sympyのBeamで
```python
# 令和4年二級建築士試験学科Ⅲ（建築構造）〔Ｎｏ． ３〕
# ver0.1
from sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols, Piecewise
E, I = symbols('E, I')
R1, R2 = symbols('R1, R2')
b = Beam(11, E, I)
b.apply_load  (4 , 0,-1)
b.apply_load  (R1, 3,-1)
# b.apply_load(6 , 2, 0)
b.apply_load  (3 , 7, 0,11)
b.apply_load  (R2,11,-1)
b.bc_deflection = [(3, 0), (11, 0)]
b.boundary_conditions
b.load
b.solve_for_reaction_loads(R1, R2)
b.load
b.shear_force()
b.bending_moment()
#b.slope()
#b.deflection()
#b.deflection().rewrite(Piecewise)
#p = b.draw()  
#p
print("# MA=",b.bending_moment().subs({x:7}))
# MA= 6
```
　
https://live.sympy.org/

# 参考
#### sympyのdoc

https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html


#### Youtube
二級建築士過去問　令和4年No3を解説 　単純梁の曲げモーメントを求める問題（構造設計一級建築士が分かりやすく解説）
やまもと構造塾+kakeno塾 様

https://youtu.be/oBdx4Rd-qSs?t=

#### Qiita

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

https://qiita.com/mrrclb48z/items/893cb0967e4ddb2945f7
Microsoft Teamsのチャンネルにアプリケーションから通知を投げる

Microsoft Teamsにアプリケーションから通知を投げる方法の概略です。最新の方法に対応した日本語リソースがほぼ見つからなかったので、備忘録的に書いておきます。

## やりたいこと

やりたかったことは以下の2つです。

* 時間がかかるジョブの進行状況を知りたい
* ジョブが異常終了したことを検知できるようにしたい

これを実現するために、アプリケーションからチャットにジョブの進行状況を投げることにしました。Slack使えよって言われそうですけど、もろもろの事情によりMicrosoft Teamsしか使えない状況にあると思ってください。

## Webhookの設定

まずはwebhookのURLを取得します。以下のサイトを参考にしました。

[Create incoming webhooks with Workflows for Microsoft Teams - Microsoft Support (英語)](https://prod.support.services.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498)

ここでは2つの方法が示されています。

1. Set up an incoming webhook workflow from a template
2. Set up an incoming webhook workflow from scratch

今回は後半の方を参考にしました。Teamsの左側にアイコンが縦に並んでいる中で、Workflowsを選択します。もしWorkflowsがない場合は`...`をクリックしてWorkflowsを検索します。

すると「人気の高いTeamsテンプレートで開始する (英語では Start with a popular Teams template)」にいくつかのテンプレートがリストされているはずです。ここに、

* Webhook要求を受信するとチャネルに投稿する (Post to a channel when a webhook request is received)
* Webhook要求を受信したらチャットに投稿する (Post to a chat when a webhook request is received)

があるはずです。通知をチャンネルに投げたい場合は前者を、チャットまたはチャットグループに投げたい場合は後者を選びます。ここではチャンネルに通知を投げたいので、前者を選択します。

設定に迷うことはないと思うので設定を進めてください。POST用の最終的にURLを取得できますのでコピーしておいてください。

## 通知を投げる

POST用URLに向けて通知を投げます。以下のサイトを参考にしました。

[Microsoft Teams Webhook - Microsoft Support (英語)](https://learn.microsoft.com/en-us/connectors/teams/?tabs=text1%2Cdotnet#microsoft-teams-webhook)

POSTするデータの構造はAdaptive Card JSONというものらしく、仕様がかっちり決まっているようです。いくつか固定値等の注意書きがあるので、`"text"`フィールド以外をいじるのは避けたほうがよさそうです。基本 Request Body Example の書式をそのままパクりましょう。また、Example of Sending RequestsにはC#とJavaScriptのサンプルコードがあります。

通知を投げるアプリケーションはPythonだったので、Pythonで同等の処理をコーディングすれば良いはずです。

```python:notify_test.py
import json
import sys

import requests

def notify(message):
    payload = {
        'type': 'message',
        'attachments': [
            {
                'contentType': 'application/vnd.microsoft.card.adaptive',
                'contentUrl': None,
                'content': {
                    '$schema': 'http://adaptivecards.io/schemas/adaptive-card.json',
                    'type': 'AdaptiveCard',
                    'version': '1.2',
                    'body': [
                        {
                            'type': 'TextBlock',
                            'text': message,
                            'wrap': True
                        }
                    ]
                }
            }
        ]
    }

    webhook_url = 'ここにWorkflowsの設定で取得したURLをセット'

    response = requests.post(
        webhook_url,
        headers={'Content-Type': 'application/json'},
        data=json.dumps(payload)
    )

    return response


if __name__ == '__main__':
    notify(sys.argv[1])
```

こんな感じのスクリプトを書いて、

```
python3 notify_test.py "これはテストです"
```

とかすれば、あら不思議、Teamsに通知が飛んでいきます。

なお、`'wrap': True`は上記サイトの例にはありませんが、[こちらのサンプル](https://adaptivecards.io/samples/)によると、カードサイズに収まらないテキストを折り返して表示するオプションぽいです。デフォルトでは省略されてしまうので、つけておいたほうがいいでしょう。
Pleated Filter Bags Manufacturer | cnrfilters

Pleated filter bags and cartridges are designed for industries that require the management of large volumes of air within smaller dust collection spaces. They provide an effective solution by allowing more air to pass in tight areas.![pleated filter bag suppliers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911657/6529b4b9-d335-9ae8-d828-8f7505e18da8.png)

https://cnrfilters.com/pleated-cartridge-bags.html
カメラとCNNでカップ麺を識別して作り方を翻訳するアプリ

# これはいったい何のためのアプリ？

はい、このアプリは来日中の外国人観光客のために、カップ麺の作り方とアレルギー情報の各言語での翻訳文を表示してくれるアプリです。

ご存じかもしれませんが、コンビニやスーパーで売っている日本のカップ麺は、作り方はすべて日本語で書かれています。日本人なら作り方が分からずともなんとなくで食べることができるかもれしれませんが、外国人はそうもいかないでしょう。また、原材料のアレルギー表示が理解できないことは、日本語が分からない外国人にはリスクです。

そこで、外国人観光客が確実・安全に日本のおいしいカップ麺を食べることができるように、情報表示のお手伝いをするのがこのアプリです。

※試作段階のためアプリは公開されていません。

# 使い方

1. スマホでアプリを起動します
1. アプリのカメラでカップ麺のフタを捉え、画面をタップします
1. 識別した候補を選択します
1. 翻訳文が表示されます

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

このアプリではリアルタイムの翻訳は行っていません。あらかじめ翻訳した文をデータベースから読み込んで表示しています。

# 画面遷移

アプリ起動後の画面遷移を図にしました。起動時は `MainCameraView` が表示され、ユーザからの操作を待機します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853810/00b075c0-5ce7-e4a4-d3b8-675833505dea.png)

### MainCameraView
アプリ起動時は `MainCameraView` が表示され、カメラのプレビューが表示されている状態です。このプレビューが表示されている間、リアルタイムでカップ麺の識別が行われいます。このときにカメラのプレビュー表示をタッチすると、カップ麺の識別結果が決定します。決定には直前の10フレームの識別結果をもとに判断されます。

### ItemConfirmationView

識別結果が決定すると、 `ItemConfirmationView` に遷移します。ここでは結果の確認を行います。識別結果に問題がなければ、ユーザはOKボタンを選択します。結果が実際のラベルと異なる場合は、 `OtherCandidatesView` に遷移してほかの識別候補を確認することもできます。

### ItemDetailView

選択されたカップ麺の名称・作り方・アレルギー情報などが表示されます。表示言語は `SettingView` にて英語・韓国語・中国語（繁体・簡体）から選択できます。

# アプリのエコシステム

ユーザに提供されるのは単一のアプリですが、その全体はアプリ本体も含めて、 `DataSetManager` , `MachineLearning` , `App` の3つのモジュールで構成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853810/45b5e6ea-a1cf-945c-1bdb-3756819c620f.png)

## DataSetManager

ECサイトのAPIから市場に販売されているカップ麺の情報（画像・テキスト）を収集し、管理するモジュールです。大きくPythonスクリプト群とDjangoによるWebアプリ部に分かれています。

### Pythonスクリプト群

ECサイトから情報を収集する複数のPythonスクリプトで構成されています。

#### カップ麺収集スクリプト

カップ麺は試験販売なども含めると、年間数百種類の新製品が発売されているといいます。そのすべてを網羅するのは困難なため、消費者が日常で目につきやすい商品を扱っているという判断から、ECサイトに掲載されているカップ麺を対象とすることにしています。ECサイトはAPIの利用のハードルが低い楽天市場を活用しています。
カップ麺収集スクリプトは、楽天API経由で楽天市場に掲載されているすべてのカップ麺の画像とテキストを収集し、収集用DBに保存します。

#### 学習用データ作成スクリプト

収集したカップ麺のフタ ラベルの画像を加工し、正解ラベルとともにCNN学習用のデータセットを作成するスクリプトです。ECサイトに掲載されているフタの画像は1方向（だいたい正面斜め上）のみのため、射影変換などの画像処理を利用して、様々な角度からの画像に変換します。これはユーザがカップ麺のどの方向と角度からアプリを使用しても正しく認識するためのデータ拡張です。

### Django Webアプリ部

ECサイトから収集した画像・テキストを管理・編集するためのWebアプリで、Djangoを利用して構築されています。収集用DBに保存されたデータを参照し、学習データセットに含めるかを管理したり翻訳文の編集を行ったりします。

## MachineLearning

作成したデータセットをもとにカップ麺の識別ができるように、Google Colab上でCNNモデルの学習を行います。フレームワークはKerasを利用し、CNNモデルのアーキテクチャはVGG16です。学習済みモデルからの転移学習は行わず、初期化状態のVGG16モデルから学習しています（ImageNetなど学習済みモデルへ移行予定）。現在はプロトタイプ開発のため、９種類のカップ麺のみ学習しています。
カップ麺のフタでの学習が完了したモデルは、Keras形式のファイルからTensorFlowLite形式のファイルへ変換され、アプリに搭載されます。

## App

スマホアプリ本体です。開発にはiOSとAndroid両方への対応の工数削減のために、Flutterを利用しています。

# 今後の予定

- 対応するカップ麺の追加（数百種類）
- 対応する言語の追加
- 認識精度の向上
駅すぱあと VBA SDKを使って、経路探索の条件を設定する

**本記事はヴァル研究所の支援として作成された記事です**

[駅すぱあとはAPIを公開](https://api-info.ekispert.com/)しており、駅情報や経路探索などをAPI経由で行えます。メソッドはすべてGETメソッドで、情報取得系のみです。レスポンスはJSONまたはXMLで返ってきます。

この駅すぱあと APIを利用しやすくするSDKを開発しはじめました。SDKはVBAで作っており、Excelなどから利用できます（Windowsのみ、macOSでは利用できません）。

今回は、スタンダードプランで提供されている探索条件生成APIに対応しました。

探索条件とは、経路探索において設定する条件のことです。例えば乗り換え時間を「せかせか歩く」と設定したり、会社の交通費精算では「有料特急を使う経路を出さない」など、状況に応じた探索条件を設定できます。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/51c2fa80-4b24-b829-eb2f-8974a5f6dba2.png)


では、使い方を紹介します。

## 必要な情報

SDKを利用する際にはAPIキーが必要です。[無料トライアルがあるので、こちらから取得](https://api-info.ekispert.com/form/trial/)してください。

## 注意点

- SDKはWindowsでのみ動作します
- SDKは非公式です。公式サポートへの問い合わせはご遠慮ください

## ファイルのインポート

[こちらのリポジトリ](https://github.com/EkispertAPIMania/VBA-SDK)にある `*.cls` と `*.bas` ファイルをすべてインポートします。これらは以下のライブラリを含んでいます。

- [VBA-tools/VBA-Dictionary](https://github.com/VBA-tools/VBA-Dictionary)
- [VBA-tools/VBA-Web: VBA-Web](https://github.com/VBA-tools/VBA-Web)
- [VBA-tools/VBA-JSON](https://github.com/VBA-tools/VBA-JSON)

## 初期化

先ほど取得したAPIキーを使ってSDKを初期化します。

```vb
Dim client As Ekispert
Set client = New Ekispert
client.ApiKey = "YOUR_API_KEY"
```

## 探索条件生成の設定

探索条件生成を行う際には、 `ToolboxCourseConditionQuery` を使います。各種探索条件を指定したら、 `Find` メソッドを使って探索条件を取得できます。

この探索条件はテンプレートのように利用でき、さらに別な探索条件を指定して異なる探索条件を生成することもできます。この他の探索条件は[探索条件生成 \- 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/api/toolbox/course/condition.html)を参照してください。条件は文字列、または真偽値で指定します。

```vb
Dim Query As ToolboxCourseConditionQuery
Set Query = Client.ToolboxCourseConditionQuery()

Query.Plane = "normal" ' 飛行機の利用について
Query.Walk = "little" ' 駅間徒歩について
```

## 処理の実行

探索条件を設定したら、条件作成処理を実行します。結果は `ResultSet` クラスになります。処理がうまくいったかどうかは `ResultSet.Success` の値で判定してください。

```vb
Dim Result As ResultSet
Result = Query.Find()

Debug.Print Result.Success ' True または False
```

### エラーだった場合

もし探索がエラーだった場合は `ResultSet.Error` の中にエラー情報があります（駅すぱあと APIからのエラーの場合）。

```vb
If Not Result.Success Then
    MsgBox Result.Error.Message
    Exit Sub
End If
```

### 成功した場合

処理が成功した場合、 `ResultSet.Condition` に探索条件が入っています。

```vb
Debug.Print Result.Condition
```

探索条件は [経路探索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/api/search/course/extreme.html) にて `conditionDetail` へ適用できます。

```vb
Dim Query1 As CourseExtremeQuery
Set Query1 = Client.CourseExtremeQuery()
' 探索条件を設定
Query1.ConditionDetail = Result.Condition
Dim Result1 As ResultSet
' 探索実行
Result1 = Query1.Find()
```
## ソースコード

SDKのコードは以下のリポジトリにて公開しています。ライセンスはMIT Licenseです。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK/tree/main)
## まとめ

探索条件生成はさまざまな条件を指定できます。日付などはないので、汎用的な探索条件を生成して再利用するのに便利です。SDKを使って、Excelなどから駅すぱあと APIを利用してみてください。

何か不具合があれば、Issueにて連絡いただければ対応します（macOSでは動かないので注意してください）。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK)
MAMP Proが急にstartもsaveもできなくなった話

MAMP Proで迷走したので備忘録。 

週明けにMAMP proを使って作業しようとしたところ、startを押しても起動しない...先週何も設定変更してないのに...！

緑色になるはずの左上のマークがオレンジ色になって、apacheにOnがつかない。
startしないので、サイトも開けない上にSaveもグレーアウトして押させてもらえない...どうして...。

【解決】
赤字になっているhostsを削除したら治った

apacheが動かないのってどうやって対処すんだと、ターミナルやらなんやらで色々試す最中、MAMPで以下のエラー文言が。

「Some changes can not be saved. A host name may be missing or a document root folder may be invalid. You can also revert to the saved state before you start the servers.」

（翻訳） 一部の変更は保存できません。 ホスト名が欠落しているか、ドキュメントのルート フォルダーが無効である可能性があります。サーバーを起動する前に保存された状態に戻すこともできます。 

hosts一覧をよく見たら「こいつ赤字だったか...？」というのが1件あるじゃないですか。

Saveできなくてもhostsが増やせる（アクセスできるとは言ってない）のは確認してたので、ドキドキしながら削除 → 動いた！！！ 

設定ファイルとかmysqlの方とか色々手探りで見てたの恥ずかしくなってきた...なんだこのしょうもない話...。 

でも！！！未来の自分といつかの誰かの役に立つと信じて備忘録でした〜〜！！！