OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellでQiitaAPI入門（ステップ２ 指定タグ全記事取得）

# はじめに
PowerShellでQiitaAPI入門のステップ２です。今回は指定タグの全記事取得です。既に高度に使いこなされている方にはあたりまえすぎる話ですが、公式解説はチームに関連した機能が詳しく解説されていて、基本的な使用例とかはすっとばされている感じがしたので、このあたりわかりにくくて手が出せにくかった方を対象にしつつ自分用のメモを兼ねます。

https://qiita.com/api/v2/docs


# 前提条件
Windows11 Pro 22H2 22621.4169
PowerShell psversion 5.1.22621.4249
QiitaAPI 2.0

# 実行例（ステップ２）
PowerShellではInvoke-RestMethodを使ってQiitaAPIにアクセスします。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-5.1


## 指定タグの基本情報取得
タグの基本情報取得です。

### コマンド文
```powershell:
Invoke-RestMethod "https://qiita.com/api/v2/tags/(タグ名)"
```

### 実行結果

例として筆者がよく投稿しているmindタグに対して実行します。
```powershell:
PS C:\pmind> Invoke-RestMethod "https://qiita.com/api/v2/tags/mind"

followers_count icon_url
--------------- --------
             19 https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/4d747b01209ee0bbead2d9fc33274fe065fcd38a/med...
```

フォロワー数とイメージのURLが返ります。

## 指定タグの記事取得（ページネーション指定無）
記事取得をデフォルトの件数で取得すると大量の記事テキストが受信されますので、いったん変数に結果を格納するとします。のちにこの変数を使っていろいろ操作します。

### コマンド文
```powershell:
$res = Invoke-RestMethod "https://qiita.com/api/v2/tags/(タグ名)/items"
```

### 実行結果
```powershell:
PS C:\pmind> $rest = Invoke-RestMethod "https://qiita.com/api/v2/tags/mind/items"
PS C:\pmind> $rest.count
20
```
20記事返っています。$restを出力すると大量のテキストでコンソールが流れます。ここでは割愛します。

## 記事取得（記事ID指定）
特定の記事の内容を取得するには記事IDを指定します。（ステップ１と重複します。）

### コマンド文
```powershell:
$res = Invoke-RestMethod "https://qiita.com/api/v2/items/(記事ID)"
```

### 実行結果
```powershell:
PS C:\pmind> $rest = Invoke-RestMethod "https://qiita.com/api/v2/items/bd97e56fdfef2b293828"
```

### 実行結果（取得内容）
テキスト量が多いため割愛しますが、出力イメージを確認したい方は[ステップ１](https://qiita.com/mylifewithviolin/items/7f38beacb069ade3db8e)を参照してください。

## 指定タグの記事取得（ページネーション指定有）
### コマンド文
```powershell:
$rest =Invoke-RestMethod "https://qiita.com/api/v2/tags/(タグ名)/items?page=(ページ位置)&per_page=(1ページあたりの記事数)"
```

### 実行結果
```powershell:
PS C:\pmind> $rest = Invoke-RestMethod "https://qiita.com/api/v2/users/mylifewithviolin/items?page=1&per_page=10"
PS C:\pmind> $rest.count
10
```

10記事返っています。$restを出力すると大量のテキストでコンソールが流れます。ここでは割愛します。


## 指定タグの記事取得（ページネーション指定してループ）

### コマンド文
```powershell:
# 特定のタグ名 
$tag_name = (タグ名)
# ページネーション設定 
$page = (ページ位置初期値)
$per_page = (1ページあたりの記事数)
$all_articles = @() 

# 〇ループ開始
# APIエンドポイントのURL(ページネーションのページ位置変化)
# APIリクエストを送信 
# レスポンスを配列に追加 
# 次のページへ (ページネーションのページ位置カウントアップ)
# 〇ループ終端◇最後のページに到達したかを確認 

do { 
$apiUrl = "https://qiita.com/api/v2/tags/$tag_name/items?page=$page&per_page=$per_page" 
$res = Invoke-RestMethod -Uri $apiUrl -Method Get 
$all_articles += $res 
$page++ 
} while($res.Count -eq $per_page)
```

### 実行結果
```powershell:
PS C:\pmind> $tag_name = "mind"
PS C:\pmind> $page = 1
PS C:\pmind> $per_page = 100
PS C:\pmind> $all_articles = @()
PS C:\pmind> do {
>> $apiUrl = "https://qiita.com/api/v2/tags/$tag_name/items?page=$page&per_page=$per_page"
>> $res = Invoke-RestMethod -Uri $apiUrl -Method Get
>> $all_articles += $res
>> $page++ 
>> } while ($res.Count -eq $per_page)
PS C:\pmind>
PS C:\pmind> $all_articles.count
299
```
mindタグのページに公開されている記事数より＋１となってしまいましたが、近い数字にはなっています。

# おわりに
いかがでしたか？参考になれば幸いです。
確率過程のModificationとIndistinguishable

日本語でなんて言うのかはわからないのですが、確率解析をするうえで個人的に重要だと思うので自分用に書いておきます。

# 定義
二つの過程
```math
X=\left(X_t\right)_{t \in \mathbb{R}_+} \text{ と } X'=\left(X'_t\right)_{t\in \mathbb{R}_+}
```
がそれぞれ $\left(\Omega, \mathcal{F}, \mathbb{P}\right)$ と $\left(\Omega ' , \mathcal{F}', \mathbb{P}'\right)$ 上で定義されていて $\left(E,\mathcal{E}\right)$ における値がすべての $t_1,...,t_n \in \mathbb{R}_+$ に対して同じかつ $A_1,...,A_n\in \mathcal{E}$ に対して
```math
\mathbb{P}\left(X_{t_1}\in A_1,...,X_{t_n}\in A_n\right) =\mathbb{P}'\left(X'_{t_1}\in A_1,...,X'_{t_n}\in A_n\right)
```
とする。今、$X$と$X'$がどちらも確率空間$\left(\Omega, \mathcal{F}, \mathbb{P}\right)$上に定義されていて、
```math
    \text{ for every }t, \ \ X_t'=X_t \ a.s.
```
を満たすとき$X'$は$X$のmodificationであるという。また、
```math
    a.s. \ X_t'=X_t \ \text{ for every }t
```
のとき、$X'$と$X$はindistinguishableという。

# 例1
$\Omega = \lfloor 0, 1\rfloor, \mathcal{F}=\mathcal{B}\left(\lfloor 0, 1\rfloor\right)$で$\mathbb{P}$をルベーグ測度とする。$t \in \left[0,1\right]$に対して
```math
    \begin{aligned}
        X_t\left(\omega\right)&=\mathbb{1}_{\left\{t\right\}}\left(\omega\right) \\
        X'_t\left(\omega\right)&=0
\end{aligned}
```
とする。ならばすべての固定された$t$に対して
```math
    \mathbb{P}\left(X_t\neq X'_t\right)=\mathbb{P}\left(\left\{t\right\}\right)=0
```
よって$X'_t$は$X_t$のmodificationであるが
```math
    \bigcup_{t\in \left[0,1\right]}\left\{\omega \ | \ X'_t\neq X_t\right\}=\bigcup_{t\in\left[0,1\right]}\left\{t\right\}=\left[0,1\right]
```
より$X_t$と$X'_t$はindistinguishableではない。

以下の例のようにindistinguishableと二つの確率過程が完全に一致することは別物である。

# 例2

$\{0.123456...\}=N \in \Omega$といった一点集合とする。そして$\mathbb{P}\left(N\right)=0$である。ここで
```math
    
    \begin{aligned}
        &X_t\left(\omega\right)=t \ \text{ for } \ \omega \in [0,1] \backslash N \\
    &Y_t\left(\omega\right)=t \ \text{ for } \ \omega \in [0,1] \backslash N \ \text{ and } Y_t\left(N\right)=-t
\end{aligned}
```
とする。このとき、これはindistinguishableであり、よってmodificationでもあるが、完全一致なサンプルパスを持たない。

# まとめ

これらの例からわかるようにmodificationでは時刻$t$ごとに零集合の取り方を変えてもいいが、indistinguishableであるためにはすべての$t$に対して共通の零集合で一致する必要がある。

例えばindistinguishableの概念は確率解析の花形である(と私が勝手に思っている)確率微分方程式においてpathwise uniquenessの概念につながる。個人的には例を構成しないとなかなか違いが分かりづらい概念だと思うので自分で見返すように記事を書いた。
【Web】インターネットとWebの違い

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。

インターネットやWebという言葉を普段何気なく使っていますが、この二つがどう違うかを聞かれたら、即答できるでしょうか？
「インターネットの中にWebがある」と漠然としたイメージを持つ方も多いかもしれませんが、実はそれぞれの役割や仕組みは全く異なります。

この記事では、インターネットとWebの違いを具体的に解説し、どちらがどんな場面で使われるのかを解説していきたいと思います。

# インターネットとは？
インターネットは、世界中のコンピュータやネットワークをつなぐための「通信基盤」のことです。
イメージとしては、国や地域をまたいで張り巡らされた巨大な道路網のようなもので、データは、この道路網を通じて目的地（他のコンピュータやサーバー）へ届けられます。

インターネットの基盤を支えているのが IP（Internet Protocol） アドレスというものです。
IPアドレスはそれぞれのデバイスに割り当てられる「住所」のようなものです。
データ通信をする際には、情報（データ）を小さなパケットに分割し、IPアドレスを頼りに送受信します。

インターネット自体は「単なる通信手段」であり、具体的なサービス（Web、メール、通話など）を提供するわけではありません。それぞれのサービスは、この基盤を利用して動作します。

# Webとは？
Web（正式には World Wide Web）は、インターネット上で動作するサービスの一つです。
HTML（Webページの構造を記述した言語）で記述された情報を表示する仕組みで、主に HTTP（HyperText Transfer Protocol）という通信規則を使います。

Webを利用する際の代表的なツールが ブラウザ です。
Google ChromeやSafariなどを使ってWebページを閲覧するとき、背後では以下のような流れが発生しています。

1. ブラウザにURLを入力する（例：https://example.com）。
2. HTTPプロトコルがサーバーと通信し、必要なデータ（HTML、CSS、画像など）を取得する。
3. ブラウザがそれらを解析して画面に表示する。

Webは、あくまでインターネットを利用するサービスの一部に過ぎません。
メールや通話と同様に、インターネット上で動作する「一つの用途」と言えます。

# インターネットとWebの違い
両者の違いをより明確にするため、図で整理してみましょう。
```scss
       [インターネット]
          (通信基盤)
 ┌─────────┬─────────┬─────────┐
 │   Web   │  Eメール │   VoIP  │
 │ (HTTP)  │  (SMTP) │  (RTP)  │
 └─────────┴─────────┴─────────┘
               その他のサービス
                  (FTP、DNSなど)
```

インターネット

* データを届けるための通信インフラ。
* 各サービスが通信する基盤として利用される。

Web
* HTTPを利用して情報を閲覧するための仕組み。
* インターネット上で動作する「サービス」の一つ。

# 実際の例をみてみる
### Web（HTTPを使用）
Google Chromeでニュース記事を読む、YouTubeで動画を視聴するのが当てはまります。
### Eメール（SMTPを使用）
GmailやYahooメールでの送受信します。
### 通話サービス（VoIP：RTPを使用）
SkypeやZoomを使った音声通話。
特徴: 音声や映像をリアルタイムでやり取りします

これらはすべてインターネットを基盤に動作していますが、利用するプロトコル（HTTP、SMTP、RTPなど）が異なります。

# まとめ
Webとインターネットは似て非なるものです。

* インターネット
世界中のコンピュータやネットワークをつなぐ「通信基盤」。
* Web
その上で動作し、情報を閲覧可能にする「サービス」の一つ。

これで何となくの理解から、説明できるようになったのではないでしょうか。
次回はTCP/IPについて解説していきたいと思います。
【SoftEther VPN】通信速度が遅い問題を解決した話 ｜ Debian 10

SoftEther VPNで通信速度が極端に遅い問題を解決したので、メモがてら書いていきます。

## 概要
急遽VPNサーバーをたてる必要があり、miniPC(OS:debian 10)にSoftEtherをインストールした。
クライアント側(OS:Windows 10 pro)からVPN接続後、RDPがぷつぷつと切れる・下りの速度が200kbpsしか出ていないという問題があった。
サーバー・クライアント共に下り400Mbps以上でており、サーバー側のCPU使用率も10%ほどだったので、インターネットの情報をみつつ設定変更してみたが解決せず。
と、こんな感じで1週間ほど行き詰ってました。

## 解決
インターネット上にある"速度が遅い"系の記事は全て見尽くし、何もできる事がなくなったので、ChatGPTくんに聞いてみることに。
何度か聞いていると、【NIC オフロード機能】が原因なんじゃないかとのこと。
物は試しということで一度設定を変更(オンからオフ)してみる。
#### なんか解決したわ！
設定をオフにすることで速度が出るようになりました；；
下り200"K"bps ⇒ 下り400"M"bps
CPU使用率も気持ち増えてるかも？...わからんけど。
ということで変更した設定を以下に記載します。

## 設定の変更方法
__※設定はサーバー側で行います。__

##### １．ネットワークインターフェースを確認する
SoftEtherで使用中のLANカードがあるか確認します。
```bash
$ ip link show
```
```bash:出力例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: <ネットワークインターフェース1>: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 10:05:01:91:a0:06 brd ff:ff:ff:ff:ff:ff
3: <ネットワークインターフェース2>: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether ba:2e:13:53:48:83 brd ff:ff:ff:ff:ff:ff
```

##### ２．オフロード設定の確認
```bash
# <ネットワークインターフェース> の部分は、(1)で確認したものに変更してください。
$ sudo ethtool -k <ネットワークインターフェース>
```
長いので確認項目だけまとめます
```bash:出力例/確認項目

#TSO
tcp-segmentation-offload: on
#GSO
generic-segmentation-offload: on
#GRO
generic-receive-offload: on
#LRO
large-receive-offload: off [fixed]
```

オフロードの確認でエラーが発生する場合
```bash:1
<ユーザー名> は sudoers ファイル内にありません。この事象は記録・報告されます。
```
→ルート権限で再実行してみてください。

```bash:2
コマンド 'ethtool' が見つかりません。次の方法でインストールできます:
apt install ethtool
```
→apt install ethtoolを入力してインストールしてください。

##### ３．オフロード機能の一時的な無効化
上記確認項目で1つでも "on" がある場合は実行してください。
全て "off" の場合は、こちらが問題ではないようです。
```bash
$ sudo ethtool -K <ネットワークインターフェース> tso off gso off gro off lro off
```
※この時「Cannot change large-receive-offload」という結果が返ってくる場合は無視でOK

##### ４．スピードテスト
クライアント側でVPNを接続後、インターネット速度計測で確認します。
※スマホからでも確認できました（モバイル通信）
CPU使用率が気になる場合は、htop等で確認できます。

##### ５．オフロード設定を永続化
```bash
#vimやnano エディタツールならなんでもOK
$ vim /etc/network/interfaces
```

以下内容を記載し、保存します。
vimの使い方がわからない方は調べてください。
```bash:/etc/network/interfaces
auto <ネットワークインターフェース>
iface <ネットワークインターフェース> inet dhcp
    pre-up /sbin/ethtool -K <ネットワークインターフェース> tso off gso off gro off lro off
```
VPNサーバーを再起動
```bash
$ sudo reboot
```

これで設定の変更は完了です。
お疲れさまでした。
結局、プログラミングってどうやって学習すべきなの？

## はじめに

プログラミング学習にはさまざまな方法がありますが、自分に合った方法を選べていないと、時間を無駄にしたり挫折したりすることがあります。  
私自身、学習初期には「チュートリアル型学習法」に集中しすぎて、効率が悪く感じたこともありました。その後、「リファレンス型学習法」の考え方を取り入れることで、効率よく知識を吸収できるようになりました。この記事では、それぞれの学習法について定義、メリット・デメリット、参考資料を踏まえて解説し、効果的な活用方法をご紹介します。

## チュートリアル型学習法

### 定義
チュートリアル型学習法は、教科書やオンライン教材などを**順序通りに進めていく方法**です。全体を体系的に学ぶことを重視しており、初心者が全貌を把握するのに適した学習法です。

### メリット
- **体系的に学べる**  
  基礎から応用まで、順序立てて知識を習得できます。特に、全体の流れを把握するための第一歩として有用です。

- **初心者でも取り組みやすい**  
  準備されたカリキュラムに沿って進められるため、迷うことなく学習を進められます。

### デメリット
- **時間がかかる**  
  一から順番に学ぶため、効率を求めると進捗が遅く感じられることがあります。

- **応用しづらい**  
  理解は深まるものの、実践の場で活用できる知識が限られる場合もあります。

### 参考文献
以下は、チュートリアル型学習法で役立つ教材の一例です。

- [Progate](https://prog-8.com/)  
  初心者向けのスライド形式教材で、基礎を身につけるのに最適です。

- [Railsチュートリアル](https://railstutorial.jp/)  
  Webアプリケーション開発の流れを体験しながら学べる教材です。

- [React公式チュートリアル](https://react.dev/learn/tutorial-tic-tac-toe)  
  Reactの基本をコンポーネントや状態管理の実例で学べます。



## リファレンス型学習法

### 定義
リファレンス型学習法は、必要になったときに必要な知識を調べて学ぶ方法です。辞書やドキュメントを引くような感覚で、**実際の課題を解決しながら進めるアウトプット駆動型**の学習スタイルです。

### メリット
- **効率的に学べる**  
  必要な知識だけを重点的に学べるため、時間を効率よく使えます。

- **実践的なスキルが身につく**  
  調べた内容を即座に活用することで、学習とアウトプットが結びつきやすくなります。

### デメリット
- **体系的な理解が不足しやすい**  
  必要な部分だけを学ぶため、全体像を把握するには別途工夫が必要です。

- **知識が断片化する**  
  深掘りする範囲が限定されがちで、後から振り返りにくい点があります。

### 参考文献
リファレンス型学習法に関連する参考資料をいくつか挙げます。

- [プログラミング学習効率化の秘訣 | Qiita](https://qiita.com/Sicut_study/items/79838a4b8ec36bc3a961)  
  必要な知識を効率よく習得する方法が具体的に解説されています。

- [「Railsチュートリアルは1周でいい」という話 | YouTube](https://www.youtube.com/watch?v=ZJqVQJwvwNI)  
  繰り返し学習せず、実践を重視すべき理由を説明した動画です。

- [最速のプログラミング学習法（ちょっと毒あり） | YouTube](https://youtu.be/UuAW9yIRHmU?si=bjaE7y_DxXoEQ8ud)  
  手を動かしながら効率よく知識を得るためのアプローチが紹介されています。



## 最適な学習法

チュートリアル型学習法とリファレンス型学習法は、それぞれ異なる目的や特徴を持っています。そのため、学習のフェーズや目的に応じて使い分けることが重要です。

### 初心者フェーズ
初心者の段階では、**チュートリアル型学習法**を活用して、基礎的な内容を体系的に学ぶことを優先します。ただし、すべてを完璧に理解しようとせず、「全体像をつかむ」ことを目標に進めましょう。

### 中級者フェーズ
基礎を押さえた後は、**リファレンス型学習法**に切り替えて、必要に応じて知識を補いながらアウトプットを重視します。実際に手を動かしながら学ぶことで、実践的なスキルが自然と身につきます。


## おわりに

プログラミング学習を効率的に進めるためには、「チュートリアル型学習法」と「リファレンス型学習法」の両方を適切に使い分けることが鍵です。それぞれのメリットを最大限に活かし、学習フェーズに応じて柔軟に切り替えていきましょう。
半年で作ったポートフォリオを丁寧に読み直す②　Ruby on Rails

【Rails基本理念】
　※基本理念を学ぶことは各種言語の学ぶ際に特徴を捉え、記述や仕組み理解の助けになる。これは他の言語を学ぶ上で非常に重要になるため、基本的に多言語を扱うことになるだろう将来のため、また一つの言語を集中的に学習するにしてもやはり理解しておかなければないない重要事項



 Railsとは、Rubyというプログラミング言語を使用して、Webアプリケーションを作成するための枠組み(フレームワーク)で、Webアプリケーションのための標準的な機能の枠組みを準備してあり、その枠組みを活用することを想定している 
　　・同じことを繰り返さない　同じコードの繰り返しを避け、保守しやすくする
　　・設定より規約を優先する　Webアプリケーションで行われる最善の方法を規約として設定している

つまり、レゴブロックのように規格に沿いハメこむことができる部品をいくつか準備しているため、それを組み合わせてWebアプリを作ってとのこと。




【ベースとなる考え方】
・リソースフルルーティング
　処理の対象となる、目的を持った情報のかたまりをリソースとし、あらゆる作業をリソースに対する操作と見なします
・オブジェクト指向
　別途参照してください。簡潔には工業製品のように指令をひとまとめにしよりエンジニアが概念やモノをプログラミングで扱えるようにし、ユーザーがコードに干渉できないようにしたもの。カプセル化・継承・ポリモーフィズムの三本柱。
・MVCモデル
アプリケーション内部の処理が、モデル、ビュー、コントローラーから構成される。それぞれ、データをオブジェクトとして振舞わせる、見せ方や表現、要求に対する処理、という役割を担っている。
Python in Excelで表からJSON出力をやってみた

__2024年11月現在の情報です。__
最初に断っておきたいのが、それほど深く調べ上げていないので、生暖かく見ていただきたいです。

Excelの表データをJSONに出力するという課題があり、解決のためにPython in Excelを試しました。
今回書いたプログラムは以下のとおりです。
表自体に名前をつけて絶対参照しやすいようにしています。

```python
import json

list = xl("list")
result = []
for i in range(0, len(list)):
    prefecture = list[0][i]
    city = list[1][i]
    
    if prefecture is None or city is None:
        break

    result.append({
        'prefecture': prefecture,
        'city': city
    })

json_str = json.dumps(result, indent=2, ensure_ascii=False)
print(json_str)
```
![Screenshot 2024-11-17 034902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/d5399463-d19f-d2b6-62c9-e9cbcff16e8a.png)

# 触ってみた感じ

## Pythonは書けるのだけど・・・

実態は`=PY()`の関数の引数にプログラムを書いているということらしいです。
数式バーでの編集はおすすめしません。
いろんな意味で使いにくくて、Visual Basicエディタのように常に書き方を矯正してきたり、行番号もなく、Ctrl+Zは1回までとなっています。
致命的なのが、入力中に表示されるフォントが等幅フォントとプロポーショナルフォントが入り交ざることがあり、インデントが重要なPythonのコーディングには向きません。

Excelに内蔵のエディタはそのようなことがないので、そちらを使いましょう。

## 列→行で見ていく表データの走査

多次元配列の1次元目は列になっています。
Google App Scriptとかだと`getValues()`で取得したデータは行→列の順で2次元配列担っていますが、Python in Excelでは列→行で見ていくっぽい。
これに気づくのにちょっと時間がかかりました。

```
list[0][0] == '北海道' | list[1][0] == '札幌市'
list[0][1] == '宮城県' | list[1][1] == '仙台市'
list[0][2] == '千葉県' | list[1][2] == '千葉市'
```

## 実行タイミングがよくわからない

プログラムを書き換えて、Ctrl+Enterをしても、プログラムが再実行されない。
よくわかっていないのですが、プログラムを書き換えるたびにPythonランタイムを再起動する必要があるみたいです。
「実行時刻のリセット」をすることで再度実行結果が得られます。
今回の「表データからJSONを出力する」という処理の場合、表にデータを追加しても即時反映されるわけではなく、この「実行時刻のリセット」をしなければ動きませんでした。
![スクリーンショット 2024-11-17 025237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/e6b90ca6-c2af-93dd-bda1-2cc1626b01d8.png)

もちろんボタンを押して実行ということもできなさそうなので、マクロの代替とはならなさそうです。

## 実行環境が限られすぎている

2024年11月現在、ウェブ版、Mac版のExcelでは動かせません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/905ae98f-22de-ed64-6da4-51f5756ffd54.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/aff8e22e-1cfa-8127-8662-5d1c0948fb22.png)
https://support.microsoft.com/ja-jp/office/python-in-excel-%E3%81%AE%E6%A6%82%E8%A6%81-55643c2e-ff56-4168-b1ce-9428c8308545

ウェブ版で動かせないならデスクトップアプリを入れていない人はPython in Excelの実行結果を得られない。
組織内でMacを使っている人もデスクトップアプリを入れていてもPython in Excelの実行結果を得られない。
個人用の365プランではプレビュー版になっています。
この時点で選択肢から外れてしまします。

## 情報が少ない印象

リファレンスがほしい。`import excel`で何ができるのかとか。

# まとめ

Python自体は仕事でも使うのですが、Python in Excelが役に立つ場面はあるかなぁという感じです。
2024年11月現在では制約が多すぎて使う場面はかなり限られそうというのが印象でした。
XFSファイルシステムを修復する

EC2をスナップショットでバックアップしていました。バックアップから復旧するときにxfsファイルシステムの破損が発生したので、ファイルの修復を行いました。

## 1レスキューインスタンスにアタッチする
![2024-11-17_03h11_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622891/19efd73e-40d2-d9ba-455e-b8bc120643ef.png)
今回はxfsファイルシステムの破損が発生していたので、xfs_repairコマンドで修復します。xfs_repairコマンドはマウントしているファイルには実行できません。

そのためレスキューインスタンスを起動して破損しているファイル(EBSボリューム)をアタッチします。EBSボリュームをアタッチ、デタッチするときはEC2を停止しておく必要があります。

## 2ファイルシステムの確認
EBSボリュームを障害復旧のためにレスキュー用のEC2インスタンスにアタッチし、修復が必要なパーティションを確認します。EBSはブロックデバイスであるため、確認にはlsblkコマンドを使用します。lsblkは、システムに認識されているブロックデバイス（SSDやHDDなど）とその構成を表示するためのコマンドです。

```
sh-5.2$ lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
xvda      202:0    0   8G  0 disk
├─xvda1   202:1    0   8G  0 part /
├─xvda127 259:0    0   1M  0 part
└─xvda128 259:1    0  10M  0 part /boot/efi
xvdb      202:16   0   8G  0 disk
├─xvdb1   202:17   0   8G  0 part
└─xvdb128 259:2    0   1M  0 part
```
デバイス名はNAME 列のデバイス名は、Linuxカーネルがデバイスを認識した際に割り当てた名前です。ここでは、新たにアタッチしたEBSボリュームがxvdbとして認識され、その中のxvdb1パーティションが修復対象であることがわかります。修復対象のデバイスファイルは/dev/xvdb1となります。



## 3対象ファイルの修復
2で対象のデバイスファイルがわかったのでxfs_repairコマンドを実行します。
```
sudo xfs_repair /dev/xvdb1
```
XFSファイルシステムを修復するプロセスが出力されます。修理が無事に完了したので元のインスタンスへEBSをアタッチします。

## 4インスタンスが正常に起動しているか確認
インスタンスが正常に起動しているかはステータスチェックや
![2024-11-17_03h49_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622891/7252803e-e7fc-d983-c54d-b173d24f86f5.png)

システムログを確認します。
![2024-11-17_03h50_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622891/50b905af-705f-35c5-03c3-cd9da4d254c4.png)

SSHで接続できればファイルは問題なく修復されたと判断していいと思います。
半年で作ったポートフォリオを丁寧に読み直す①　はじめに

【　ー目的ー　】
　自身の公開したWebアプリケーションを解きなおし、プログラミング全体の知識の定着と成長のため

【　ー目標ー　】
　商業用としての使用に耐えうる品質までポートフォリオを改良する
 
【　ー前提ー　】
　・学習期間半年のプログラミングスクールを通じて自身がとりあえずリリースしたWebアプリケーションを修正・再構築していく過程を記載します。
　・正しい用語や用法が曖昧なため、表記についてはご指摘いただくか、初学者が参考にする場合は必ず自身で別途参考文献などを参照してください。


【　ー経緯ー　】
　自身の転職活動用に作成していたポートフォリオを知人プログラマーに利用してもらった結果、エラーが吐き出されたが、その修正の手伝いをしてもらえる程の理解が自身にはなかったから。知識不足の痛感と、仕事にする上での不安解消のため。

【　ー環境説明ー　】
　プロジェクト管理
　　WBS管理、GitHub
　フロントエンド
　　HTML/CSS、Bootstrap、Javascript/JQuery/Ajax
　バックエンド
　　Ruby/Ruby on Rails、利用ライブラリ(devise、kaminari)
　インフラ
　　AWS(EC2、RDS、ELB、Cloud9)
　その他
　　CI/CD（GitHubActionsCI/CD（GitHubActions）

【　ーポートフォリオー　】
　サイト名
　　become creater

　GitHubURL
　　https://github.com/ichikawaMaMe/becomecreater2

【　ー目次ー　】
　以下は題名以降のナンバリングと題の初期案です。指導者いる環境ではないため、アプリケーションの作成手順を追いながら、自身の気になっている点に重きを置きながら修正していきます。そのため、体系立てた修正ではないことをご認識ください。

 1.はじめに
 2.Ruby on Rails
 3.さいしょのおまじない
 4.app/assets~
 5.app/channels
 ・
 ・
 ・
 n.yarn.lock
 n+1.AWSの使用環境とその他仕組みについて
 n+2.現状できている機能の棚卸と機能追加したいものの追加
 n+3.機能追加
 n+4.まとめ
DBProjext_備忘録_0

```README:README.md
## 大臣が多少サポートするbotを作成する
ほか、作業報告に適した環境づくり

なお、コードの大部分は作成済み(2024-11-16 時点)
```

## 2024-11-16
- githubリポジトリの作成
    - 先にgithubのリポジトリの整理（なにその勉強しようと思ったら部屋の掃除したくなっちゃうみたいな。でもまじで、掃除しろとタスクメモしてるくらい、重要なので実施。）
状態を保存する

Conposeで状態を保存する方法のメモ

ただ変数に値を設定しただけではComposeによってトラッキングされていないため、下記コードのクリックイベントを動かすことはできない。Sampleが呼び出されるたびにexpanded変数はfalseにリセットされる。
再コンポジションされない内部状態を追加するには`mutableStateOf` 関数を使用する。これは、Composeが状態を読み取り関数を再コンポーズするようになる。さらに状態を保持するrememberと合わせて使うことコンポーズを超えて状態が保持されるようになるので、値が初期化(false)されることはなくなる。


``` kotlin
@Composable
fun Sample() {
var expanded = false
    // var expanded = false 
    // 内部状態を保存していないため、関すが呼び出されるたびにリセットされる

    // var expanded = mutableStateOf(false) 
    // 内部状態を追加できる。しかし再コンポジションが発生した場合、値がリセット(false)される

    val expanded = remember { mutableStateOf(false) }
    // 再Composeを超えて状態が保持されるようになるので、初期化されることはない
    
    Surface(
        color = MaterialTheme.colorScheme.primary,
        modifier = Modifier.fillMaxSize()
    ) {
        Row {
            ElevatedButton(onClick = { expanded.value = !expanded.value }) {
                Text(if (expanded.value) "Show less" else "Show more")
            }
        }
    }
}
```

#### 参考
https://developer.android.com/codelabs/jetpack-compose-basics
DJProject_備忘録_5

## 2024-11-16
- 変換の続き
    - QRCodeAlignmentPatternPlayer
    テキトーに作らせた(いつかこれでぐぇぇ、ってなればこーゆーことへるはず、、。)

    - QRCodeMarkingPlayer
    テキトー

    - WriteMainDataPatternPlayer
    中

    あー、1つ前のプレイヤーのアタッチじゃない形で作られちゃってる、、直さなきゃ。ほかのプレイヤーもそうかな。

    - QRCodeMaskApplicatorPlayer
    んあれ、備忘録し忘れたプレイヤー
    - QRCodeErrorCorrectionAndMaskPlayer
    - QRCodeFormatInfoInserterPlayer

- 二次元コードジェネレータのプレイヤーがひとまず作った。
- プレイヤーの確認をしていこう。
    - 確認のやり方
        - Pythonのプレイヤーを見る
        何のプレイヤーを取得しているか
        確認をする。
        - UdonSharpのプレイヤーを見る。
        なんのプレイヤーをアタッチしているか
        確認をする


        
## 2024-11-18
- PythonとUdonSharpの比較
    - a問題なし
    - QRCodeModePlayerの確認完了
    - QRCodeCharacterCountPlayerの確認
    🦌

## 2024-11-20
編集において
アプリ：サーバー用
サファリ：インスタンス用
これで進めましょう。
  
- QRCodeCharacterCountPlayerの確認
    - 1つ前のプレイヤーから受けとったint型変数を、暗黙的にstringに変換してしまっている箇所がかるので正す。
    あ、RinaNumpyにint_to_strとstr_to_intを加えよう。
    
目視でデバッグするのバカバカしくなってきたので、ほかのことをしよう。
…そうですね…時系列ニューラルネットワークをUdonSharpバージョンのBallPassSchedulePatternで組み込み始めましょうか…。

- ニューラルネットワークのプレイヤー構成を考えなくちゃ
その前に、簡単なにSGDを作らなきゃ
でもたしか幾らかレイヤーは作たんだよね…昔に。どこだ、、、
あーった。
![IMG_0076.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910368/f879b4f6-8ffe-f7d4-c003-1f21b45def41.png)
これは全てオブジェクトなのでー、、(プレイヤーでは無いので、、)
でも、わざわざ各レイヤーをプレイヤーに上書き変換するようなことはせずに、
このオブジェクトを利用する形(アタッチする形)でコーディングを進めていこうと思う。
うーん、各プレイヤーのコードを眺めてみたが、Updateメソッドも含まれていない。
どうやら過去の自分は、
重みなどの更新が必要なものは
```
public DataHolder weightsHolder; // 重みを保持するDataHolder
public DataHolder biasHolder; // バイアスを保持するDataHolder
```
の様に、データ保持ようのオブジェクトを別で管理する手法を取ったようだ。
なるほど。うーん、、メモリの無駄遣い…やだな…。
…まぁいいや、後からでもこの部分は "簡単に" 変更出来るように上手く組み込もう。

とりあえず、このオブジェクトを使ってSGDを組もう。
しかし、書籍である
- ゼロから作るDeepLearning①
- ゼロから作るDeepLearning②
このふたつで学習した知識では
私のデザインパターンであるBallPassSchedulePatternと化学反応を起こすには少し考えなければならない。

AffinePlayerとして実装したとすると、メソッドは何を持たせる？

- AffinePlayer(仮)
    - this.ModeIsForward (純伝播時Trueにする)
    - this.ModeIsBackward (逆伝播時True)
    - Backwardメソッド
    - Forwardメソッド
    - ExecuteMaknメソッド
    ここで、純or逆のif分岐

でいいかしら。作ろう。

## 2024-11-21
- AffinePlayerの作成
    あでも、サーバーディレクトリの中に、あるなぁ、、Layer、、。これU#化した方が安全かも、、自分にとってこれ最新レイヤー群だし。
    ![IMG_0078.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910368/c146debe-b6bf-0f05-ec73-70323b9861f6.png)
    でもAffineとか基礎がのlayerがないや、、。どこだろう、


    
って思ったけどアレじゃん。QRcodeのリーダーまだU#化してないじゃん。
する。
- 二次元コードリーダーのU#化
    - ReplacePatternPlayerの作成        - 確認
          うーん、二次元コードはオブジェクトに表示されるので、そのオブジェクトをアタッチして、そのオブジェクトからマテリアル、画像を取得し、2次元のジャグ配列に変換するプレイヤーを作ろう。

## 2024-11-28
- U#化の続き
    - cの作成
    - dの作成
    - eの作成
    - f、g,hの作成
    - Initの作成
    - Scan_a,b,c
Readerの一時完了
しっかり対応させていないので、Unity上であとは調節する。
シルベスター数列

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。

## はじめに
シルベスターシーケンスという数列をご存知でしょうか。シルベスタースタローンでもシルバニアファミリーでもジルベスターコンサートでもありません（寒ッ）。Wikipediaにも日本語の頁[^wiki-sylv]がありますので、名前のついた数列としてはそこまでマイナーな数列ではないようです。
本稿では、このシルベスター数列について紹介します。

## シルベスター数列（Sylvester's sequence）
Wikipedia[^wiki-sylv]によると、その名称は1880年にこの数列を最初に調査したジェームス・ジョセフ・シルベスターに由来しています。各項が、その前項までの項の総積に1を足した数である数列で、数式で書くと次のようになります。

:::note info
$$\begin{flalign}
s_n &= 1 + \prod _{i=0} ^{n-1} s_i \\qquad (s_0 = 2) & \tag{A}
\end{flalign}$$
:::

$0$個の項の積 (空積) は $1$ であるため、初項である$s_0 = 2$ でとなります。また、この定義から容易に次の漸化式が導けます。

:::note info
$$\begin{flalign}
s_n &= s_{n-1} (s_{n-1} - 1) + 1 \\qquad (s_0 = 2) & \tag{B}
\end{flalign}$$
:::

漸化式（B）から`iterate`を使うとHaskellでは簡単に処理がかけます。

```haskell: シルベスター数列
sylv = iterate (\x -> x*(x-1)+1) 2
```

そしてこの計算式で最初の10個を計算で求めて出力してみましょう。
数列の最初のリストは、オンライン整数列大辞典の数列 [A000058](https://oeis.org/A000058) を参照して、出力と比較してみてください。

```haskell:
ghci> take 10 sylv
[2,3,7,43,1807,3263443,10650056950807,
113423713055421844361000443,
12864938683278671740537145998360961546653259485195807,
165506647324519964198468195444439180017513152706377497841851388766535868639572406808911988131737645185443]
```

この数列は急激に大きな桁数の数になっていきます。漸化式から想定されるように、桁数がおおよそ倍々に増えていきます。$s_{30}$ では次に示すとおり、2.1億桁の数になります。（その数を表示するのは、時間とメモリを浪費しますので避けておきましょう）

```haskell:
ghci> length . show $ sylv !! 30
218562698
```


## エジプト分数（Egyptian fraction）
分数をいくつかの異なる単位分数（分子が $1$ の分数）の和で表す方式を『エジプト分数』（エジプト式分数、とも呼ぶ）[^wiki-ef]といいます。
シルベスター数列にまつわる話題として、エジプト分数に関わる性質があり、WikiPedia[^wiki-sylv]と以下のサイトで紹介されています。

https://manabitimes.jp/math/743

シルベスター数列の逆数和による無限級数 $\displaystyle \sum _{n=0} ^{\infty} \frac{1}{s_n} $を考えると、この級数全体が $1$ に収束します。
つまり、この無限級数は $1$ を無限長で表したエジプト分数表示と考えられます。すなわち、
$$\begin{flalign}
\sum _{n=0} ^{\infty} \frac{1}{s_n} &= \frac{1}{2} + \frac{1}{3} + \frac{1}{7} + \frac{1}{43} + \frac{1}{1807} + \cdots = 1&
\end{flalign}$$となります。


### エルデシュ・シュトラウス予想
また、余談としてシルベスター数列とは関係がありませんが、エジプト分数に関連して次のような予想が知られています。[^wiki_esc]

:::note info
<dl><dt>エルデシュ・シュトラウス予想</dt>
<dd>
$2$ 以上の全ての整数 n に対し，
$$\begin{flalign}
\frac{4}{n} &= \frac{1}{x} + \frac{1}{y} + \frac{1}{z} &
\end{flalign}$$を満たす正の整数 $x, y, z$ が必ず存在する．という予想
</dd></dl>
:::

計算機を用いた探索により、少なくとも $n \le 10^{17}$ までは予想が成り立つことが知られているそうですが、厳密な証明は与えられておらず、未解決問題の１つです。


## おわりに
ご一読いただきまして有り難うございます。

最後に、本稿を記載するために検証したHaskell環境を記しておきます。お手元の環境で検証する際に、動作が異なるときには参考になるかもしれません。

<details><summary>本稿の環境</summary>

本稿のために使用した環境は以下となります。

* macOS: Sonoma 14.6.1 (chip: Apple M1)
* GHCup: 0.1.30.0
* GHC: 9.6.6

</details>

（●）（●） Happy Hacking!
/""　＿＿""＼





[^wiki-sylv]: [Wikipedia: シルベスター数列](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AB%E3%83%99%E3%82%B9%E3%82%BF%E3%83%BC%E6%95%B0%E5%88%97)

[^wiki-ef]: [Wikipedia: エジプト式分数](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%B8%E3%83%97%E3%83%88%E5%BC%8F%E5%88%86%E6%95%B0)

[^wiki_esc]: [Wikipedia: エルデシュ・シュトラウス予想](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AB%E3%83%87%E3%82%B7%E3%83%A5%EF%BC%9D%E3%82%B7%E3%83%A5%E3%83%88%E3%83%A9%E3%82%A6%E3%82%B9%E4%BA%88%E6%83%B3)
renderSetupで困った

renderSetupですね。
renderLayerの頃に比べて、シーンを開いたらシーンがどんどん崩壊していくとかそういうのが無くなって
あぁこれで安定してレンダリングを回せるなぁって思ってた時期が僕にもありました。

実際に起きた状況をまとめるとこんな感じです。

- キャラなどのアセットデータをリファレンスしてシーンを構築
- 構築したシーンで renderSetupでレイヤーを構築
- アセットデータに不備があったので、元データの方でマテリアルのアサイン情報を修正
- レンダリングシーンを再度開いて確認する
- マテリアルの更新が反映されない

という状況ですねー。

あれー？更新したよなー？直ってないなー
という感じでデータを数往復し、色々調べてみた結果

**renderSetupがなんかしてるわ**

という結論に至りました。

再現
--

こんな感じでリファレンスしたシーンを用意しますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/65048b89-332e-c3ba-5a6a-897f72f49cdf.png)

このシーン内でマテリアルOverrideをrenderSetupで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/1ac88599-6cf0-6416-67b0-a353abec16a5.png)


元データのマテリアルをこのようにアサイン変えますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/8a40b9e8-7a7d-730b-8713-2f61f912ba28.png)

リファレンス先のシーンで更新してみると～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/b0f8950c-1639-f12d-956c-0babcab2c618.png)

アサインが変わってないですね。

お約束のmaデータ解読してみると、なにか記載されてますねstringで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f74b357d-b511-83b7-42a7-61bd2cf2cf58.png)


詳しく
--

先述のサンプルシーンを元に詳しく挙動を確認しました。

- マテリアルoverrideが設定されているレイヤーに、カレントレイヤーを変更する。  
- マテリアルoverride前の状態を再現する為に、ノードが作成され復元用情報が書き込まれる。  
- デフォルトレイヤーに戻す。  
- ノードに書き込まれた情報を元に状態を再現。  

そして最後の挙動がreferenceEditに記載されています。
その為、リファレンスデータを切り替えても　このreferenceEditの内容によってアサインが更新されてない様に見えてるようです。

かと言って、
レイヤーを切り替えた状態で　リファレンスデータを切り替えたとしても、デフォルトレイヤーに戻した時点でノードから復元情報が呼び出されるのでやはり更新が反映されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/04822b42-69db-0668-0ac1-da9469a79ea6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/d2ac3fae-b9b2-a9cf-618c-5551df28e34b.png)

無理やり
--
無理やりやるとしたら

- referenceEditの除去
- 復元用ノードの削除

のどちらかかなと思います。

- referenceEditの除去

該当行を選択し、removeを実行してみると

```
// Error: file: C:/Program Files/Autodesk/Maya2022/scripts/others/referenceEditsWindow.mel line 56: Cannot find the scene file.
```

うーん、一旦もう一個の方法を試してみます。

- 復元用ノードの削除

レイヤーを切り替えて、ノードを削除してみます。

```
cmds.delete(cmds.ls(type = "applyConnectionOverride"))
```

この状態でデフォルトレイヤーに戻してみると、
復元情報が呼び出されないのでオーバーライドの状態のままですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/7df713b2-edd1-9b0f-79dd-64dbd38fa7c3.png)

リファレンスとリロードしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0eabecca-7b76-625f-d130-860a804e772e.png)

リファレンスデータの更新内容が無事反映されました。

もやもや
--

一応対応は出来たものの、別のバグを誘発しそうな気がしてもう少し良いやり方があるといいなぁ。

しかし、この仕様？は把握していないとレンダリング時の事故にもつながるので地味ですが怖いですね。



**続きはこちら**

https://qiita.com/9boz/items/ac70b5f557a7236bbdc2
Salesforceの数式を整える

たまたまQiitaをサーフィンしてて出会ったこちらの記事。
[salesforce　日付　数式でハマったこと](https://qiita.com/tabeitakaaki/items/679c4718a35fb8759a2f)

ちょっと頭の体操がてら、数式を整えてみました。
元はフローの中で使用するコードということですが、一部表記を簡略化したり
手元のメモ帳で書いただけで検証していないので、そもそも動かない可能性も
高いんですがざっくり方向性だけでも。

早速、元の数式がこちら。

~~~apex
IF(
  OR(
  AND(OR(MONTH(Today())=4,MONTH(Today())=6,MONTH(Today())=9,MONTH(Today())=11), TEXT({!$Record.SpecifiedDate__c}) = '31')
  , AND(MONTH(Today())=2, OR(TEXT({!$Record.SpecifiedDate__c}) = '29', TEXT({!$Record.SpecifiedDate__c}) = '30',TEXT({!$Record.SpecifiedDate__c}) = '31'))
  )
    , DATE(YEAR(Today() ),MONTH(Today() ) + 1,1)-1

  , IF(AND(TEXT({!$Record.SpecifiedDate__c} ) = "末",MONTH(Today() )=12)
    , DATE(Year(Today() ) + 1, 1, 1) - 1
    , IF (AND(TEXT({!$Record.SpecifiedDate__c} ) != "末", TEXT({!$Record.SpecifiedDate__c} ) != null)
      , DATE(YEAR(Today() ),MONTH(Today() ),VALUE(TEXT({!$Record.SpecifiedDate__c} )))
      , DATE(YEAR(Today() ),MONTH(Today() ) + 1,1)-1
    )
  )

)
~~~


この課題について整理すると、
①SpecifiedDate__cに不正な値が入っているかどうかで処理を分岐する
②SpecifiedDate__cの値が正常／不正かは、処理を実行している月によって決まる

ということで、今月の末日を表す数式があったら便利そうなので用意します。

~~~apex:今月の末日を取得する数式項目
// ThisMonthLastDate__c（数値）
case(month(today())
    , 4 , 30
    , 6 , 30
    , 9 , 30
    , 11, 30
    
    , 2 ,if( year(today()) % 4 != 0  // 2100年までシステムが続くと問題になるので注意
            , 28
            , 29
        )

    // 1,3,5,7,8,10,12月
    , 31
)

~~~

次に、それを使ってメインロジックを整理します。
①SpecifiedDate__cがブランクならnullを返す
②SpecifiedDate__cが正当な日付の場合はそれを使ってdate値を返す
③SpecifiedDate__cに月末が指定されていたり、不正な日付だった場合は
　ThisMonthLastDate__cを使ってdate値を返す


~~~apex:フローで自動作成するレコードの日付
if( isBlank(SpecifiedDate__c)
    , null

    , date(
        year(today()) , month(today())
        
        , if( text(SpecifiedDate__c) == "末"
           || ThisMonthLastDate__c < value(text(SpecifiedDate__c))
            // 末日が指定されている・不正な日付が設定されている場合
            ,  ThisMonthLastDate__c
            // 正常パターン
            ,  value(text(SpecifiedDate__c))
        )
    )
)
~~~


こんな感じで書いても動くんじゃないかなと思いました。
AtCoder ABC380 振り返り (Python A~C)

今回からAIが原則禁止になりました。AIに頼ることが多かったので今回の改定は個人的に嬉しいです。さて、本番ではA,Bの2完でしたが、Cまで書きます。Cはコンテスト中の考察をコンテスト後にACしたコードです。


# A問題
###  問題概要
6桁の正整数が与えられる。各桁の1,2,3がそれぞれ1,2,3個ずつあるか判定しなさい。

### 解答
正整数を文字列のリストで受け取りソート、これが"122333"と同じか判定
```python
n = list(input())
n.sort()
print("Yes" if "".join(n) == "122333" else "No")
```
[ABC377のA問題](https://atcoder.jp/contests/abc377/tasks/abc377_a)でほぼ同じ問題が出ました。


# B問題
### 問題概要
`|`と`|`の間の`-`数を数える

### 解答
最初の文字は`|`固定なので、次の文字からカウントする。`|`が来たらカウントをリストに追加して、カウントを0にする
```python
s = input()

ans = []
count = 0
for i in range(1, len(s)):
    if s[i] == "|":
        ans.append(count)
        count = 0
    else:
        count += 1

print(*ans)
```


# C問題
### 問題概要
文字列の中で1が連続している塊を見つける。K-1個目の塊の直後にK個目の塊を移動させる。

### 解答
1. それぞれの数字を数えていき、連続する1が終わったとき次の処理
1. 最終文字のみ次の0がないため別の処理をする
1. 塊がK個目でなければそのままリストに追加
1. 塊がK個目の場合は1を先に持っていき、0を後にしてリストに追加(1の塊の移動)
1. 塊を移動後、文字が続いている場合は、塊以降をそのままリストに追加。ループを抜ける
```python
# K番目の直前の0の塊とK番目の１の塊を調べ、入れ替える
n, k = map(int, input().split())
s = list(input())

count_zero = 0
count_one = 0
count_block = 0
is_start = False
is_stop = False
t = []  # 変更後の文字列
for i in range(n):
    # 1の塊
    if s[i] == "1":
        is_start = True
        count_one += 1
        # 最終文字のみ別処理
        if i == n - 1:
            count_block += 1
            is_stop = True
    else:
        # 1の塊終了
        if is_start:
            is_stop = True
            count_block += 1
        else:
            # 0の塊
            count_zero += 1
    # 関係ない区間
    if is_stop and count_block != k:
        t.extend(s[i - (count_zero + count_one) : i])
        is_start = False
        is_stop = False
        count_one = 0
        count_zero = 1
    # 交換する場合
    elif is_stop and count_block == k:
        t.extend(["1"] * count_one)
        t.extend(["0"] * count_zero)
        if i != n - 1:
            t.extend(s[i:])
        break

# print(len(t))
print("".join(t))
```
### 反省
Kが存在する塊の数と誤解し、すべての塊を移動するものだと思っていた。
入力例1が明らかに考察と異なるも、焦りから頭が働かずこの思考から抜け出せなかった。


# 感想
AIが禁止になった嬉しさと、少し精進したため、良いパフォーマンスを出したいという焦りから結果的にレートを下げてしまった点は反省しなければならない。
また、今後はコンテストの結果にかかわらずCまでの記事は書くようにする。
オブジェクト指向Cコンパイラcomelangにgoのような並列処理が入りました。

```C
#include <comelang.h>
#include <comelang-pthread.h>

int fun(int a, int b)
{
    printf("%d %d\n", a, b);
    
    return 3;
}

struct sData
{
    int@ a;
};

int main(int argc, char** argv)
{
    sData data;
    int@ a = __channel__;
    int@ b = __channel__;
    
    var thread = come {
        fun(1, 2);
        a <- 111;
        a <- 222;
    }
    
    b <- 222;
    
    come_join(thread);
    
    come_poll {
        a {
            printf("a %d\n", <-a);
            printf("a %d\n", <-a);
        }
        
        b {
            printf("b %d\n", <-b);
        }
    }
    
    return 0;
}
```

come { } で並列処理に入ります。come fun(1,2);なども可能です。
{}内では親の関数の変数にもアクセスできます。
come_joinで後片付けします。

come_pollはチャネルの入力待ちを行います。
aに入力があれば<-aでチャネルへの入力が出力されます。
基本的に並列で動いている処理はチャネルを使ってデータの受け渡したほうがいいと思います。
入力があるまで、チャネルはブロックするためタイミングを考えやすいからです。
ただし、ポインタはポインタ自体が渡されます。Seriallizeされているわけではありません。
まあ、同じプロセス間なので問題ないでしょう。
PyPIへのアップロード

```
rm -rf dist/ build/ *.egg-info

# ビルドツールのインストール
pip install build twine

# パッケージのビルド
python -m build

# TestPyPIへのアップロード（オプション）
python -m twine upload --repository testpypi dist/*

# 本番PyPIへのアップロード
python -m twine upload dist/*
```
AWS EC2でのSSH接続トラブルシューティング【Windows10環境】

## 概要  
  - AWS EC2インスタンスへのSSH接続中に発生したエラーと、その解決手順をまとめました。
  - どこかのサイトで改行コードがCRLFである問題と.pem内の記述の最終行に空行を入れたら直ったとありましたが、今回はその両者を試し

## 環境
- **ローカル環境**: Windows 10
- **エディタ**: SAKURAエディタ
- **AWS CLI**: CloudShell

---

## 発生した問題とエラー内容

### **エラー1: Load key "xxxxkey.pem": error in libcrypto**
SSH接続時に以下のエラーが表示されました。
```bash
Load key "xxxxkey.pem": error in libcrypto
ubuntu@<インスタンスのIPアドレス>: Permission denied (publickey).
```

**原因**:
- SSHキー（`.pem` ファイル）の文字コードが不正（**UTF-8 BOM付き**）。
- 改行コードがWindows形式（CRLF）になっていた。

---

## 解決手順

### **1. キーファイルの確認**
- キーファイルは **UTF-8 (BOMなし)** で保存します。
- 改行コードは **LF** に統一します。

### **2. キーファイルを修正**
Windowsでの修正手順を以下に記載します。

#### **SAKURAエディタを使用した修正**
1. `.pem` ファイルを SAKURAエディタで開きます。
2. **文字コードを変更**:
   - メニューから「ファイル」→「名前を付けて保存」を選択。
   - 「文字コード」のドロップダウンから **UTF-8 (BOMなし)** を選択。
3. **改行コードを変更**:
   - メニューから「設定」→「ファイルの設定」→「改行コード」で **LF** を選択。
4. 保存して終了します。

### **3. 修正後のファイルをCloudShellにアップロード**
CloudShellでファイルを削除して、修正済みのキーファイルを再アップロードします。

#### **CloudShellでの操作**
```bash
rm xxxxkey.pem
```
アップロード後、適切な権限を設定します：
```bash
chmod 600 xxxxkey.pem
```

---

### **4. SSH接続の再試行**
以下のコマンドで接続を試みます：
```bash
ssh -i "xxxxkey.pem" ubuntu@<インスタンスのIPアドレス>
```

**成功時のログ例**:
```plaintext
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 6.2.0-1012-aws x86_64)
```

---

## トラブルの原因と回避策
### **原因**
1. キーファイルの文字コードが **UTF-8 BOM付き**。
2. 改行コードがWindows形式（CRLF）。

### **回避策**
- キーファイルを作成・編集する際、以下の設定を使用します：
  - **文字コード**: UTF-8 (BOMなし)
  - **改行コード**: LF
- 修正後は適切なファイル権限を設定します：
  ```bash
  chmod 600 xxxxkey.pem
  ```
SQL Serverの内部構造を理解してみた

お久しぶりの投稿でございます。kitonです。
SQL Serverについて勉強する機会があったので、アウトプット兼ねて記事を書いてみようと思います。
まずはSQL Serverの内部構造を理解しようと思いまして、今回はこちらの本を先輩様からお借りして完読させていただきました。
↓↓

~絵で見てわかるSQL Serverの仕組み〜
著者：平山　理

https://amzn.asia/d/aJyrXy2

# 読んでみた感想
本のタイトル記載通り「絵でみてわかる」これです！
私自身アプリケーションでSQLクエリやインデックスは意識して開発していましたが、内部構造やデータ構造のような基礎的なことがあまりわかっていなかったのでとても勉強になりました。

スループットを上げる、効率良くデータを取得・保存する仕組みはアプリケーションでも当然意識しますが、SQL Serverでも様々な工夫がされているんだなと発見がありました。

SQLクエリの書き方やインデックスのベストプラクティス的なことは触れておりませんが、SQL Serverの基本的な構造を理解したい方にはおすすめ本の１つです！

---

下記はこの本を読んでみて私なりに気づきや理解した内容を一部抜粋して記載しております。
※ほぼ個人的な備忘的な内容となっておりますので、本の内容を全て網羅できているわけではないのでご了承ください。

# 内部構造
## CPUを効率的にする仕組み
- マルチスレッド処理：CPUを並列で処理させて処理効率を上げる
- コンテキストスイッチ：CPUの使用時間（タイムスライス）を設けて、別の処理をCPUに割り当てる
※ただし、割り当て回数が多くなるほど負荷は高くなる。
- SQL OSスケジューラ：CPU管理はWindowsスケジューラで行っているが、SQL Server内の処理（クエリのロック獲得・解放）までは管理できないので、独自のコンポーネントを開発した（とわいえ、SQL ServerのプロセスはWindowsスケジューラの支配下であることは忘れてはいけない。）

## ディスクI/O
### データベース
- トランザクションログファイル
    - データに対して実行した更新内容を記録
    - 先行書き込みログ：データファイル操作前にログファイルを書き込んでいる
    → クエリ実行途中で障害発生してもデータの状態がわかるようになっている。
- データファイル：その名の通りCRUDするためのデータ本体を格納

### I/O操作
- 先行読み取り：クエリ実行プランに必要なデータページとインデックスページを予想　→バッファキャッシュに保存することで実際の読み込み時のI/Oを軽減

https://learn.microsoft.com/ja-jp/sql/relational-databases/reading-pages?view=sql-server-ver16

- チェックポイント
    - 論理書き込み：バッファキャッシュのデータ更新（物理データは更新されていない状態）
    - 物理書き込み：物理ディスク上のデータ更新
    - ダーティページ：論理書き込みはできていて、物理書き込みはまだできていないデータ
    - チェックポイントとは、ダーティページに対して物理書き込みする手段の１つ
    ※物理ディスクのデータを直接更新するのではなく、バッファキャッシュに更新することでI/O操作を抑える

- 集中書き込み
    - チェックポイント同様ダーティページの物理書き込み手段
    - トランザクションログの大量書き込みはスループット低下、ディスク容量肥大化する問題がある
    →一括操作のトランザクションログの書き込みだけ行われるので上記問題の解決案の１つ

## メモリ
- ページング：仮想記憶領域と物理メモリのサイズのギャップを埋めるための手段
- ページアウトされたデータ取得を繰り返すことはパフォーマンスの低下になる
→Lock Page in Memory特権をSQL Serverのアカウントに付与するとページアウト対象外になる
- バッファキャッシュ：SQL Serverがデータ操作する場合にバッファキャッシュからデータを使う
- プランキャッシュ：クエリのコンパイル回数を減らしてパフォーマンスを向上させる
- ガベージコレクションメインスレッド：不要メモリ領域を自動的に解放する機能

## ネットワーク
- SNI(SQL Server Network Interface)：クライアントと通信する際にSNI層各プロトコルを抽象化している
※クライアントもSNIを使うのでインストール必要
※ ググると、「SQL Network Interfaces, error: 26」：接続エラー系が結構ヒットしますね。
- 送信フォーマットはTDS(Tubular Data Stream)形式でSNIに受け渡す
※TDSはアプリケーションレベルのプロトコル
- SQL Serverは複数のプロトコルを待ち受けできる
- SQL Server Browserサービス：クライアントが名前付きインスタンスのSQL Serverに接続するための必要な情報の問合せ先
- 接続情報キャッシュ：接続情報をキャッシュすることで、SQL Server Browserサービスへの問合せ回数を減らす

## 最後に
上記以外の内容の他にもデータ構造の原理や、バックアップ・復元や、トラブルシューティングもわかりやすく書かれておりました。
SQL Server2016から実装された「クエリストア」は実際の運用でも使ってみて記事にしたいと思います。

１つ１つの絵がわかりやすい本となっておりましたので、興味のある方はぜひ一読してみてください！
ここまで読んでいただいてありがとうございました！
安価に開発合宿(ワーケーション)に行く方法5選

## はじめに

こんにちは！Webとネイティブのエンジニアをしている中嶋です。  

開発合宿に魅了され、知らないエンジニアと一緒に何か面白いものを作り上げる時間を楽しみたいと思い、 **[一緒に開発合宿へ行く仲間を募集](https://workcation.connpass.com/event/336720/)** しています！

https://workcation.connpass.com/event/336720/

**4泊、観光は少しになるかも、各々の仕事をやることが中心の開発合宿**ですが、

「これなら行けるかも？」
「もうちょっと詳しく聞きたい」
「話だけしてみたい」


と思ったら、ぜひお問い合わせください!! 普通なら交わることのなかったエンジニア同士で、楽しく開発しつつ楽しくお話しできればと思います！

なお、現在の参加メンバーは以下の2名です：

- **中嶋 (27歳)**：Web/ネイティブアプリエンジニア (フリーランス)  
- **参加者1 (26歳)**：AIエンジニア (会社員)

---

## 今回の記事について

開発合宿の魅力といえば、**集中した環境で作業が進むだけでなく、新しい知見やアイデアが得られること**。ですが、「高額な宿泊費がネックで企画しづらい」という声もよく耳にします。そこで今回は、**「安価な開発合宿」** をテーマに、予算を抑えつつも快適に過ごせる宿泊サービスを5つご紹介します。

---

## 1. **Address**  
**住居のサブスクとして有名なサービス**
[クラウドファンディングで史上最高額を集めた実績](https://prtimes.jp/main/html/rd/p/000000092.000054017.html)もあります。僕が今まで開催した開発合宿は基本ADDressを利用していました。

- **ポイント**：紹介キャンペーンや同伴者制度を活用すれば、1泊 **700円/人** 程度で利用可能。一軒家をまるごと借りられるケースもあり、快適な作業環境が整っています。  
- **おすすめ理由**：Wi-Fi速度が公開されている施設も多く、エンジニアにとって安心です

https://address.love/

紹介キャンペーン利用して入会してみたい！という方、連絡くれれば紹介します...!
僕に入ってくる紹介料はそのままお渡しするので、非常にお得に入会できるかなと思います。

---

## 2. **Sanu**  
**おしゃれな別荘のサブスクサービス**。内装が非常にきれいで、リラックスしながら作業できるのが魅力です。[今回開催する開発合宿](https://workcation.connpass.com/event/336720/)はこのサービスを利用しています。

- **ポイント**：最低利用額は **5万円/月で7泊分**。最大4人で利用可能なので、分割すれば1人あたりのコストを抑えられます
- **おすすめタイミング**：休前日の宿泊は料金が上がるので、日曜夜～木曜朝のスケジュールで4泊するのがお得。**タイミングにより初月無料キャンペーン(最低契約3ヶ月)** もあるので要チェック
- **注意点**: 人気のサービスになってきたのか、なかなか予約が取りづらかったりします。ただ、千葉県近郊の方は、[常に空いていてコワーキングスペースが併設されている拠点](https://2ndhome.sa-nu.com/facility/sanuapartment)があるので、より一層お勧めです...!

https://2ndhome.sa-nu.com/2ndhome

---

## 3. **Tocoo!**  
1泊単位で**とにかく安く泊まりたいならココ**。年会費が必要ですが、ウルトラトクー市というものを利用すると、破格の料金で宿泊できます。

- **ポイント**：例えば、片品温泉は **1人363円/泊 (5名利用時)**。驚くほど安い！  
- **注意点**：ウルトラトクー市では、基本一泊のみの予約で可能日程も結構限られています。和室が多いので、座って作業できる人におすすめ。ロビーがある宿なら作業環境も確保しやすいです。  
- **裏技の可能性**：複数人が契約を、1泊ずつ連続で予約すれば4泊程度の合宿も実現できるかもしれません。詳しい方、ぜひコメントください！

https://www.tocoo.jp/

---

## 4. **Agoda / Booking.com**  
**有名な宿泊施設検索サービス**ですが、意外と掘り出し物も見つかります。

- **ポイント**：ゲストハウスやホステルを上手に選べば、十分リーズナブル。特に短期間の滞在におすすめです。  
- **注意点**：施設によっては作業環境が整っていない場合もあるので、事前の確認をお忘れなく

https://www.agoda.com/ja-jp/

---

## 5. **Airbnb**  
言わずと知れた民泊プラットフォーム。コストを抑えつつ、ユニークな宿泊体験が可能です。

- **ポイント**：利用人数を増やせば1人あたりのコストが下がります。作業環境を確保するため、宿泊施設の写真やレビューをよく確認することが重要です

https://www.airbnb.jp/

---

## まとめ

開発合宿を安価に実現するためには、利用するサービスや日程を工夫するのがポイントです。今回ご紹介したサービスは、どれも魅力的な特徴を持っています。ぜひ自分たちのスタイルに合った選択肢を見つけて、気軽に開発合宿を楽しんでみてください！  

また、「コストを抑えた合宿の具体例を試してみたい」「一回開発合宿を経験してみたい」という方は、ぜひ [こちら](https://workcation.connpass.com/event/336720/) の募集ページもチェックしてみてくださいね。一緒に楽しく開発しましょう！
ISE 14.7 を Linux (Mint 22, Ubuntu 24ベース) 上で動かす

## Xilinx ISE が Linux Mint22 上で動かない

今さらですけど、Xilinx(AMD) ISE を Linux (Mint22) 上で動かしたくなって、インストールを試みたんですが、なんとかプログラムの起動はできるようですが、Xilinx Platform Cable USB のドライバがどうしても動かない.  
論理合成はできても、FPGAへの書き込みができなきゃどうしようもない、というか、むしろそっちがメインの目的だったりしたので、どうしたものかと...  
まあ、ISE 自体 2020年の 14.7 を最後のリリースとして、すでにメンテされてないですし、仕方ないです... 対応 OS は RHEL5/6 系らしいんですが、手持ちのマシンは Ubuntu / Debian 系にしてるんで、ドライバ周りが動かないとなると、自力での対応は私には無理っぽい.　とはいうものの、今更 RHEL6 で新しいマシンを用意するわけにもいかず、せめて仮想環境に RHEL6 系 OS 立てて動かしてみるか... と考えたところで、ふと気がついた.  

そうだ、ISE 14.7 の Windows 版は、そもそも仮想環境で動いてるんじゃなかったっけ？

## Windows 版 ISE 14.7 で配布されている OVA ファイルから VirtualBox の仮想環境を作ればいい

まずは Xilinx(AMD) のサイトから Xilinx_ISE_14.7_Win10_14.7_VM_0231_1.zip をダウンロードしてきます. VirtualBox は普通に apt-get でインストールしたものを使います.  
Xilinx_ISE_14.7_Win10_14.7_VM_0231_1.zip を解凍すると、ova フォルダができて、そこに 14.7_VM.ova という名前のファイルができます. これを使えば、わざわざ RHEL6 の仮想環境を一から作る必要がない、というわけです.

具体的な手順としては、VirtualBox を立ち上げて、メニューから "仮想アプライアンスのインポート" を選択します.

![1o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455249/b32f1fed-b50e-6602-be81-c7430c41ba50.png)

先程の 14.7_VM.ova を選択.

![2p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455249/b413372f-d7b0-0638-5509-bc80b091136e.png)

Oracle Linux 6 の環境が作られるみたい. メモリの割り振り等はここで変えてもOK.

![3p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455249/aefb0836-0be5-6abf-eb1e-a349ff0a20d6.png)

これで仮想環境の作成が完了. 一から作ることを考えると楽勝.

![4o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455249/d6b511d9-19fd-3bca-cc3f-98e4e1f667b6.png)

私の環境では、USB の設定で、コントローラーを 3.0 にしとかないと、不安定で使えなかった...(この辺は個別の環境によると思う. VirtualBox あるあるかもしれないですけど.)

![6o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455249/6c409656-d8a1-b5a5-0435-6ba0a38f13bd.png)

それほどストレスなく使えて、Platform Cable USB の認識も問題ありませんでした.

![5o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455249/4c80cdc4-63a5-d2fb-3fbe-2a5cdf6896d6.png)
OpenWrtでDHCPv4だけなぜか動かない場合の対処法🤔

# 状況
DHCPv6は動くのにDHCPv4だけ払い出されず、IPv4ネットワークの通信ができない…
Androidの場合はIPv4のリースがないとWi-Fiの接続すらできない…

# 解決方法
## 対象のインターフェイスのDHCPを無視していないか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/d2efee61-c860-1db3-319c-aa2e704b641d.png)

:::note warn
ここにチェックが入っていると、DHCPは動作しません。
:::

## `DHCPおよびDNS`設定で、DNSサーバーポートが53以外を指定していないか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/bab68e70-5ba4-de3d-c91f-a8b1798d38ff.png)

:::note warn
空白または`53`以外を指定すると、DHCPでOption 6(DNSサーバ)の広報が無効になります。
:::

:::note info
OpenWrt上でAdGuard Homeを同時に稼働させるなどの理由でDnsmasqが53番以外のポートで稼働する場合は、画像のように明示的にDHCPオプションを指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/9cd2c0c6-4314-e7af-e7b1-a6b6968c4dec.png)
:::


## 他にDHCPサーバが稼働していないか確認する

:::note warn
当たり前ですが、DHCPサーバが他に稼働しているとリクエストを横取りされたり衝突したりして不具合の原因になります。
:::

:::note info
意図的に待機系としてもう一台DHCPを動かす場合は、遅延させるオプションを設定することで擬似的にプライマリ・セカンダリ運用が可能です。
`/etc/dnsmasq.conf`に`dhcp-reply-delay=10`のように、遅延させたい秒数を追記してからサービスをリロードすることでDHCPオファーを遅延させることが可能です。
:::

## それでも治らん！どないすりゃええねん！！🤬
`nano /etc/config/dhcp`を叩いて`config dhcp 'lan'`と書かれたブロックをすべて削除して保存しましょう。
保存後に再起動やサービスのリロードは不要です。
luciでlanを編集するとDHCPを初期設定することが可能になり、殆どの場合の設定ミスを修正できます。
ちなみに`dnsmasq`と`dnsmasq-full`はどちらを使用していても問題ありません。(基本的に排他なので同時インストールはできません)
第1回：Pythonの基礎用語と文法

この回では、Pythonの基本的な書き方を学びます。初心者がつまずきやすい変数やデータ型について丁寧に解説し、簡単な計算や条件分岐、繰り返し構文を使った例を紹介します。

目次
1.Pythonの概要とインタプリタの説明
2.基本構文
　コメント：#を使ったコメントの書き方
　変数と定数：変数の定義と使い方、定数の役割
3.データ型
　int（整数）とfloat（小数）
　str（文字列）
　bool（ブール型）
4.演算子
　算術演算子（+, -, *, /, //, %）
　比較演算子（==, !=, >, <）
　論理演算子（and, or, not）
　制御構造
　条件分岐（if, elif, else）
　繰り返し構文（forループ, whileループ）


1.Pythonの概要とインタプリタの説明
-
<strong>Pythonとは？</strong>
Pythonは、読みやすく、習得しやすい構文を持つプログラミング言語です。初心者からプロフェッショナルまで幅広い用途で使用されています。

<strong>インタプリタとは？</strong>
Pythonはインタプリタ型の言語です。コードを1行ずつ解釈して実行するため、エラーが発生した時にすぐに原因が特定しやすい特徴があります。
Pythonの実行：Pythonのコードはpython ファイル名.pyのように実行するか、インタプリタを直接起動して実行できます。

2.基本構文
-
<strong>コメント</strong>
#を使ってコメントを追加します。コメントはコードのメモ書きとして活用され、プログラムの実行には影響しません。

```python:example.py
# これはコメントです
print("Hello, World!")  # 出力: Hello, World!
```

<strong>変数と定数</strong>
変数：データを格納するために名前を付けたものです。= を使って値を代入します。
```python:example.py
name = "Alice"
age = 25
```

定数：変えたくない値には定数を使うのが一般的ですが、Pythonには定数専用の構文はありません。大文字で記述し、変更しないことを示します。
```python:example.py
PI = 3.14159
```

3.データ型
-
データ型とは、値の種類を表します。基本的なデータ型は以下の通りです。

int（整数型）：整数を扱います。
```python:example.py
number = 10
```

float（浮動小数点数型）：小数を含む数値を扱います。
```python:example.py
pi = 3.14
```

str（文字列型）：文字列を扱います。クォート（'または")で囲んで表します。
```python:example.py
greeting = "Hello"
```

bool（ブール型）：True または False の二択です。主に条件判定で使用します。
```python:example.py
is_active = True
```

4.演算子
-
演算子は、変数や値に対して操作を行うための記号です。

算術演算子
+（足し算）、-（引き算）、*（掛け算）、/（割り算）、//（切り捨て除算）、%（余り）
```python:example.py
result = 10 + 5  # 出力: 15
```

比較演算子
==（等しい）、!=（等しくない）、>（より大きい）、<（より小さい）
```python:example.py
10 == 10  # 出力: True
```

論理演算子
and（かつ）、or（または）、not（否定）
```python:example.py
True and False  # 出力: False
```

5.制御構造
-
プログラムの実行順序や繰り返し処理を制御するための構文です。

条件分岐：
if、elif、else文を使って条件ごとに異なる処理を実行します。
```python:example.py
age = 20
if age >= 18:
    print("成人です")
else:
    print("未成年です")
```

繰り返し構文：
forループ：指定した回数だけ繰り返します。例えば、リスト内のすべての要素に対して処理を行いたい場合に使います。
```python:example.py
for i in range(5):
    print(i)  # 0から4まで出力
```

whileループ：
条件が満たされている限り繰り返し処理を行います。
```python:example.py
count = 0
while count < 5:
    print(count)
    count += 1
```

6.まとめ
-
第1回では、Pythonの基本的な構文やデータ型、演算子、制御構造について書いてみました。
次回はデータ構造や関数について書く予定。
画像処理検定の過去問をChatGPTに教えてもらう

## はじめに
この記事は[ChatGPTにやらせ隊]アドベントカレンダー5日目の記事です。
(https://adventar.org/calendars/10145)
画像処理検定試験の問題をChatGPTに教えてもらう内容になっています。

### 画像処理検定試験って？
画像処理検定（CG-ARTS協会が主催）は、画像処理技術に関する知識とスキルを問う資格試験で画像の変換やAIなど幅広い知識を評価します。

### 過去問題
試験の過去問題は、Webで解答と合わせて公開されています。
https://www.cgarts.or.jp/v1/kentei/past/index.html

しかし回答が選択肢のみの記載で解説がない為、学習する際に少々手間取ります。
ですので過去問題をChatGPTに解説してもらいました。

#### 2023年の問5-dを聞いてみる

画像関係の問題を図形と問題文ごと張り付けて、ChatGPTに解説をお願いしてみます。
まずは、下図の問題を試してみます。ピンホールカメラの問題ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/81919bfb-e3e6-8ec7-b506-33fb11eb675b.png)
まずは簡単に「この問題の解説をしてください」と聞いてみます。
ChatGPTの応答は以下の通りでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/734e260e-529b-8c4a-d5c4-12f5fa124cd1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/360e62aa-9cfa-ac53-dfa0-27e9a178a000.png)

プラノプティック関数の簡単な説明もしつつ、選択肢毎に正誤の解説もしてくれました。思ったより気が利いていて好感度UPです。


#### 2023年の問6-bを聞いてみる
先ほどと同じように、別の質問をしてみます。
今度は座標を計算して画像を変形させる問題を試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/9408e0eb-fe69-ba2f-c5b1-e6d5069d7589.png)

先ほどと同じようにGTPに解説をお願いしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/55a47869-2c15-9f5d-7f20-5efdc333cd92.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/a6068022-973c-31a2-08d4-2963e07cb245.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/22959499-cce5-9cbd-1f47-48bcebdf0cf7.png)

それらしく解説をしてくれましたが、6-bは「ウ」が正解なのですが、「エ」と回答してしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/a57ca907-3e59-9166-3589-cf94d6aa3d5c.png)
この後再度質問を試みてみましたが、多少解説文が異なるだけでした。

この問題は座標計算の問題ですので、座標の変換結果が選択肢毎に代わるような座標の(1,1)と(1､0)を指定して、聞き直してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/e8fb3b18-3ca1-7949-6c15-dbcd81e123df.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/8f0e78cf-8e1e-1587-e7a1-e0a2d86bb255.png)

座標を指定することにより、回答が「ウ」に修正されました。
画像系の問題は図の理解も必要なため、正答率が６０～７０％ほどでした。今回はよく見ると行列の内容も2か所読み間違えています。
解説が正しいかから確認する必要がありますが、ちょっとした追加情報で正しい回答にすぐたどり着くので私より頭いいですねｗ


最期に、間違った理由を聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594551/ead8a679-6210-265a-2aee-b691376dc7e4.png)

全ケースを計算したわけではないかも？



## 最後に
画像の問題をそのまま張り付けて解説してくれと無茶ぶりをGPTにしてみました。
思ったよりしっかりと解説してくれた印象ですが、間違う事もありますので内容をちゃんと読んでこちらが理解する必要がありますね。

ただ、それはそれでいい訓練になるなという印象です。
夜中でも聞きたい時にすぐ聞ける点も非常にやりやすくていいですね。
@Transactional(readOnly = true)は気を付けてつかう方がよさそう

## `@Transactional`アノテーションの概要

Springなどでトランザクションを張って何か処理をしたい場合、`@Transactional`アノテーションを使用すると思うのですが、`readOnly`というオプションがあり、以下のように使います。

```kotlin
@Repository
open class HogeRepository {

  @Transactional(readOnly = true)
  open fun findAll(): HogeModel{
    return HogeModel()
  }
}
```

## readOnlyなのにコミットできる場合がある

この`@Transactional(readOnly = true)`内で更新処理を行って例外がthrowされると基本的にはロールバックしてくれます。
ただ、`IOException`のような検査例外はスルーされたりするようです。このため、サードパーティーのライブラリなどを使用している場合には上記のロールバックが行われない場合もあります。この場合は`rollbackFor`をうまく指定してあげる必要があります。

## トランザクションが貼られる

`@Transactional`アノテーションの名前の通り、トランザクションを貼ります。なので、要件で不必要なときは非機能的な観点でつけないほうがよいです。
以下4つの場合で、MySQLで`SHOW FULL PROCESSLIST\G`を用いて確認したところ、すべてでトランザクションが貼られていました。トランザクション分離レベルで制御できているなら、基本は使用しないほうがよさそうです。

```kotlin
@Transactional
open fun test() {
    sleep(10000L)
    hogeRepository.findAll()
}

@Transactional
open fun test() {
    hogeRepository.findAll()
    sleep(10000L)
}

@Transactional(readOnly = true)
open fun test() {
    sleep(10000L)
    hogeRepository.findAll()
}

@Transactional(readOnly = true)
open fun test() {
    hogeRepository.findAll()
    sleep(10000L)
}
```