OmniAICreator/Qiita-1.07M huggingface dataset:
IPv6 MAP-E対策 エフェメラルポート（ダイナミックポート）の確認及び変更する方法


Nuroも「デュアルスタック方式」から「MAP-E方式」へ移行が決まってしまったため対応を余儀なくされています。ちなみにドコモ光ではMAP-Eを用いたIPoE IPv4 over IPv6通信ですが、ここまで酷くありません。

#この記事は現在進行形です。

https://www.nuro.jp/ipv6.html

迂回するには、ネットワーク業者を乗り換えるか、条件を飲むしかありません。他記事にもある通り、Snapshotでの計測は問題ないのに途切れてしまうことがあるという情報を見かけておりました。

2022/9に以下記事が記憶に新しく、この際に大多数のユーザが離れたそうです。

https://xtech.nikkei.com/atcl/nxt/news/18/13919/


本題に入ります。

「MAP-E」以降後のNURO回線で、弊社で発生した現象はクラウドバックアップのアップロード処理が終わらなくなった現象に尽きます。ポート制限を設けることで、１つのIPv4アドレスを共有して利用し、割り当てられたIPv6のアドレスを元にユーザが利用可能なポートの一部を分割して貸し出す仕組みとなります。加えてこの制約は上り・下りそれぞれに加わります。（確認中）

対応策は、ポート調整とVPNによる回避が考えられます。

（１）ポート調整
■接続先（サーバ）
    アプリケーション調整
■接続元（クライアント）
　　OS調整。動的ポートによって自動設定されてます。正確にはエフェメラルポート（ダイナミックポート）と呼ばれ、以下コマンドで確認・設定できます。この調整によって、接続元のポートを制御します。足りなくなる恐れはありますので、元に戻せる準備は必要かと思います。
  
```
・参照    
　netsh int ipv4 show dynamicport tcp
```
　　複数の範囲設定はできないのですが、以下除外については可能です。 少し、癖のある設定方法です。
```
・参照
  netsh int ipv4 show excludedportrange protocol=tcp
```
```
・追加
  netsh int ipv4 add excludedportrange protocol=tcp startport=XXX numberofports=YYY
```
```
・削除
  netsh int ipv4 delete excludedportrange protocol=tcp startport=XXX numberofports=YYY
```
（２）VPN
GlobalIPアドレスを利用したVPNを利用することでポート制限の影響を排除する（後日記載予定）

参考：安い提供先はこちら
https://www.interlink.or.jp/service/myip/

# 1. MAP-Eとは？

MAP-EとはIPv6とIPv4が共存するために開発された技術の1つです。名称のMAPは「Mapping of Address and Port(アドレスとポートのマッピング)」の略称で、Eは「Encapsulation(カプセル化)」を意味しています。

IPv6とIPv4の「IP」とはインターネットプロトコル(通信方式、通信規格)のことで、インターネットに接続されたパソコンやスマホがデータをやりとりするためのルールです。

IPv4はIPのバージョン4のことで、現在の主流です。一方、IPv6はIPのバージョン6のことで、IPv4の次に使われるプロトコルです。IPv4はアドレス（固有の番号）が将来的に枯渇する問題があるので、インターネットの通信方式はIPv4からIPv6への移行が必要です。

しかし、インターネットのルールをすぐにIPv4からIPv6に切り替えることはできないので、現在は段階的に変更しています。

MAP-EはインターネットのルールがIPv6へ完全に切り替わるまで、IPv4を利用できるように考えられた技術の1つです。

（引用：https://nttdocomo-ssw.com/nssw/dhkr/ouchinetpress/communication/article039/）

# 2. MAP-eの「不完全なIPv4アドレス」とは？

ひとつのIPアドレスには0番から65534番までの全65535個のポート番号が紐づいています。

NURO光の従来の通信方式であるデュアルスタック方式(完全なIPv4)では、一つの契約(1台のONU)にこの1個のIPv4アドレスと全65535個のポートが付与され、利用者はすべてのポート番号を自由に使うことができます。

MAP-e通信方式は1個のIPv4アドレスを複数の契約者(複数のONU)で共有し、全65535個のポートを共有するONUへ分割して付与します。

MAP-eの実装(サービス商品)によってさまざまですが、一般的にMAP-eでは1個のIPv4アドレスを128人から256人程度で共有するようです。

この場合、一つの契約(1台のONU)には全65535個のポートのうち120個から240個程度のポートしか付与されません。

また、自分のONUへ割り当てるポート番号を選ぶことはできません。

つまり、MAP-e方式では一つの契約(1台のONU)に対して「1個のIPv4アドレスと120～240程度のポートが割り当てられる」という仕様になります。

これを本記事では「不完全なIPv4アドレス」と表現します。

※なお、多くの場合(使い方)ではポートが制限されていても通信に支障はありません。

（引用：https://internet-manual.net/nuro-hikari-transition-to-mape/）

# 3. エフェメラルポート（ダイナミックポート）とは？
エフェメラルポート（ダイナミックポート）とは、インターネットプロトコル(IP)を用いた通信を行うため、TCP/IPプロトコルスタックが事前に定義されている範囲内から自動的に割り当てるポートです。
主に、サーバ側のポートはあらかじめ決められているウェルノウンポートが使用されますが、クライアント側のポートは、一時的に使用するポートとして、エフェメラルポートの中から動的に選択されます。
例えば、クライアントからサーバーにHTTPS通信する場合、クライアントは宛先ポートとして「443」のポート、送信元ポートとしてエフェメラルポートの中から動的に１つのポートを選択します。サーバーはHTTPS通信の応答を送信元ポート宛てに返します。
（引用：https://qiita.com/yasushi-jp/items/29bba4503c33a8c8df02）

以上
【Windows】ドメイン参加アカウント上でワークグループに参加した時の話

初投稿です。

失敗談になります。

Windows環境下でドメインに参加しているアカウント上でワークグループに参加してしまった結果プロファイルが破損

再起動やら試したがだめそう😭

ローカルアカウントがあるのに、焦って入り直さなかったことが、原因の原因ですね

次回繰り返さないように、必ずに入ってから作業をします。

改善したらまた続き書きますね

お終い
プロデル、調査 その18

# 概要
プロデルが、CLRらしいので、調べて見た。
ツリー、見つけたのでやってみた。

# 参考にしたページ

https://produire-voice.blogspot.com/2022/04/blog-post_73.html


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/94387df2-ddd4-4e1a-8074-c6983e719f85.png)

# サンプルコード

```
ウィンドウ1を表示する
待機する

ウィンドウ1とは
	ウィンドウを継承する
	はじめの手順
		初期化する
	終わり
	初期化する手順
		この内部領域大きさを｛345、364｝に変える
		この内容を「フォルダビュー」に変える
		ラベル1というラベルを作る
			その内容を「フォルダ」に変える
			その位置と大きさを｛13、5、60、18｝に変える
		ツリー1というツリーを作る
			その項目高さを14に変える
			その位置と大きさを｛13、29、319、278｝に変える
		選択ボタンというボタンを作る
			その内容を「選択」に変える
			その位置と大きさを｛13、329、65、23｝に変える
		開くボタンというボタンを作る
			その内容を「開く」に変える
			その位置と大きさを｛87、329、65、23｝に変える
		閉じるボタンというボタンを作る
			その内容を「閉じる」に変える
			その位置と大きさを｛163、329、65、23｝に変える
	終わり
	選択ボタンがクリックされた時の手順
		フォルダ選択画面を表示する
		もしフォルダ選択画面のキャンセルなら、手順から抜ける
		フォルダ名は、フォルダ選択画面のフォルダ名
		ツリー1をクリアする
		ツリー1を更新開始する
		ツリー1に「［フォルダ名］」をフォルダ追加する
		ツリー1を更新終了する
		ツリー1にフォーカスする
	終わり
	［ノード］に、［パス］を、フォルダ追加する手順
		フォルダ名たちは、パスのフォルダの一覧
		フォルダ名たちをフォルダ名にそれぞれ繰り返す
			子ノードは、ノード：フォルダ名を「image\folder_close.ico」で追加したもの
			子ノードに、パス＆「\」＆フォルダ名をフォルダ追加する
		繰り返し終わり
		ファイル名たちは、(パス＆「\*.txt;*.doc」)のファイルの一覧
		ファイル名たちをファイル名にそれぞれ繰り返す
			ノード：ファイル名を「image\document.ico」で追加する
		繰り返し終わり
	終わり
	ツリー１が折りたたみ後時の手順
		イベントの対象のアイコンを「image\folder_close.ico」に変える
	終わり
	ツリー１が展開後時の手順
		イベントの対象のアイコンを「image\folder_open.ico」に変える
	終わり
	開くボタンがクリックされた時の手順
		判定は、［正規表現：ツリー1の選択内容から「.*\.txt」を取り出したもの］
		もし、判定が「{}」でないなら
			一覧は、［フルパスで「［フォルダ名］」のファイルの全一覧］
			配列は、一覧から「［ツリー1の選択内容］」を探す
			番号は、配列（１）
			パス名は、一覧（［番号］）
			ファイル名は、「"［パス名］"」
			ファイル名を起動する
		もし終わり
	終わり
	閉じるボタンがクリックされた時の手順
		自分を閉じる
	終わり
終わり




```

以上。
【JavaScript×MathJax】一次方程式ランダム出題ツールを作ってみた📐

## はじめに
一次方程式のランダム出題ツールを作ってみました。
$ ax + b = cx + d $ の形の方程式を生成し、解答も表示します。

できたものは以下↓（htmlをクリックでコードも見れます）

<p class="codepen" data-height="800" data-theme-id="dark" data-default-tab="result" data-slug-hash="OPVyGEz" data-pen-title="Untitled" data-user="8787kazuye" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/8787kazuye/pen/OPVyGEz">
  Untitled</a> by ken1math (<a href="https://codepen.io/8787kazuye">@8787kazuye</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

（CSSやJavaScriptを分けてません。CodePenの使い方としてよくないかも。というか、これでも動くんですね）

## こだわりポイント

### 解を小数ではなく分数にした
一般的な数学の授業に合わせて解を分数にしました。
整数の場合は整数、分数の場合は最大公約数を計算して既約分数にしています。

### 表示をきれいに
数式はMathJaxを使ってキレイに表示するようにしました。
また、出題部分については、0の場合に表示しなかったり$x$の前の1は省略したりしています。

### 問題が成り立つように生成
$a=c$ の場合に1次方程式として成り立たないので、$a=c$ とならないように生成しています。

### 途中計算の表示
解だけでなく途中計算も表示するようにしました。
また、解は四角で囲って目立たせています。

## おわりに
このコードはChatGPTにかかせました。いい感じです。
たんに「一次方程式のランダム出題をつくって！」だけではこうはなりませんでした。作る側のこだわりや目的をうまく伝えるといいものができますね。
ゲームばかりだった息子が…？スポーツ教室の体験を検討中

こんにちは。
小学生の息子を育てる、どこにでもいる普通の母親です。

今日は、ちょっとワクワクしている私の気持ちを、少しだけ綴らせてください。

## ゲームばかりの日々に、もやもやしていました
うちの息子、ゲームがとにかく大好きなんです。
学校から帰ってきたら、ランドセルを放り投げてすぐにコントローラー。
土日もほぼ外に出ず、ずっと家の中。

楽しそうではあるんですが、外で体を動かす姿を見たことがほとんどなくて…。
「このままで大丈夫かな？」
「運動って、やっぱり子どもの成長に必要なんじゃないかな？」

そんなふうに、漠然とした不安を感じていました。

## 出会ったのは、「JPCスポーツ教室」
そんな時、偶然ネットで見つけたのが 「JPCスポーツ教室」 でした。

JPCでは「コーチ」が 子どもの目線に寄り添った指導 をしてくれるとのこと。
上から押さえつけるようなやり方ではなく、「あくまできっかけを与える存在」として、子ども自身の「やってみたい！」を引き出してくれるそうです。

それを知って、正直ちょっとホッとしました。
「運動嫌いになったらどうしよう」という心配もあったので…。

## 「ちょっと行ってみたいかも」――息子の変化
試しに息子に「こんなスポーツ教室があるんだけど、どう？」と聞いてみたら、
いつもなら「やだ」「めんどくさい」と言うところが、
なんと今回は「うーん…ちょっと行ってみてもいいかも」と！

私は内心、ガッツポーズです（笑）

無理に引っ張っていくのではなく、本人の中に少しでも「やってみようかな」という気持ちが芽生えたことが、本当に嬉しくて。

## コーチという存在に期待して
JPCでは、「指導者」のことを「コーチ」と呼ぶそうです。

その言葉には、「目標とするところまで共に行く、大切な物を運ぶ」 という意味があるとのこと。
なんだかとても温かくて、安心できる響きですよね。

私も、息子にとってそんな存在と出会ってほしい。
ただ運動をするだけじゃなく、「やればできるんだ」「自分にもできることがあるんだ」って思えるきっかけを掴んでくれたらと願っています。

## まずは体験から、一歩踏み出してみます
ということで、近々、JPCスポーツ教室の体験に行ってみる予定です！

息子がどう感じるかは正直まだわかりません。
でも、本人が少しでも前向きになっている今がチャンスだと思って、背中をそっと押してあげたいなと。

また実際に体験に行ってみたら、ぜひその様子もここでシェアしたいと思っています。

もし、私と同じように
「ゲームばかりで心配」
「運動に苦手意識がある」
そんな悩みを感じている方がいたら、ぜひ一度JPCのサイトを見てみてくださいね😊

👉 [JPCスポーツ教室公式サイト]（https://jpc-sports.com/feature/）
Microsoft EditをUbuntuに入れてみた

新型コロナ禍以降は在宅勤務で、そもそも我が家の電気料金は増加気味なのですが、それにも増しての最近の電気料金の高騰を鑑みて、家庭内の省電力化のために消費電力の大きい「Intel入ってる」なマシンに代えて、しばらく前に購入はしたもののあまり稼働していなかったMicrosoftのWindows Dev Kit 2023にUbuntuを入れて使い始めました。
そんな訳で、メインの開発環境をこのWindows Dev Kit 2023で動くUbuntuに以降しようとゴニョゴニョと画策しているのですが、その際の作業の過程を自分のためにもメモしていこうかな？と…

まずはMicrosoft Edit (Microsoft Text Editor)
最近オープンソースでリリースされたMicrosoft謹製の軽量テキストエディターです。
リポジトリの名前が`edit.git`で、出来上がった実行ファイルも`edit`になっちゃう辺りが実にMicrosoftらしいですが、これもこの際だからインストールしてみました。

```shell
git clone https://github.com/microsoft/edit.git microsoft_edit
```
う〜ん、やっぱりリポジトリの格納ディレクトリが`edit`なのはちょっと…と言うことで、ファイルは`microsoft_edit`に展開しましたw

Nodeならnvm、PythonだとPyEnvやAnacondaなどと同じようにRustのバージョン管理や環境構築をサポートしてくれるツールRustupが入っていないなら以下のようにしてまずは`apt`で`rustup`をインストールします。
```shell
sudo apt install rustup
```

続いて、インストールされた`rustup`を使いRustの最新バージョン`nightly`ビルドをインストールします。
※ドキュメント`README.md`でそのように支持されていたので素直に従いましたが、安定ばんのRustでビルド可能かどうか？は未確認です。
```shell
rustup install nightly
```

続いて、同じく`rustup`を使いARM64 Linux向けのツールチェイン`nightly-aarch64-unknown-linux-gnu`をインストールします。
```shell
rustup component add rust-src --toolchain nightly-aarch64-unknown-linux-gnu
```

ここまででRustを使っての`edit`のビルド準備は整ったので、さっそくRustのビルドシステム`cargo`でのビルドのためのコマンドを入力します。
```shell
cargo build --config .cargo/release.toml --release
```

いくつかの警告は出ると思いますが、エラーが起きずに最後に以下のような表示が出ればビルドは成功していると思われます。
```console
    Finished `release` profile [optimized + debuginfo] target(s) in 0.05s
```

試しに出来上がった実行ファイルを起動してみましょう。
```shell
./target/release/edit
```

自分もこれで「お、出来上がったじゃん！」と思ったのですが、すぐに足りない機能があったのに気がつきました。
ここでキーボードの`Ctrl-F`(`Ctrl`キー＋`F`キー)を押して文字検索を行おうとしたら、以下のようなエラーが出てしまいまいた。

![スクリーンショット 2025-06-03 11.36.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148717/725282e2-98bd-4388-9d7e-528bbf1d8662.png)


これは、どうやら`edit`では編集中のテキスト内で文字列の検索を行おうとする場合、Unicodeでの様々な文字操作をサポートしてくれるライブラリ`ICU`(International Components for Unicode)が必要になるのですが、これがインストールされていない状態で`edit`をビルドしてしまうとこのエラーが起きるようです。

Ubuntuでこの`ICU`をインストールするには`apt`の場合には以下のようになります。
```shell
sudo apt-get install libicu-dev
```

`ICU`のインストールが終わったならば、もう一度先ほどの`cargo`でのビルドのためのコマンドを入力します。
```shell
cargo build --config .cargo/release.toml --release
```

もし、ここで以下のように`cc`(Cコンパイラー、リンカー)コマンドが無いよ的なエラーが出たら、以下のようにアプリビルドのための一連のパッケージをインストールしておきます。
※でも、大抵の場合はもう入っていると思うけど…
```console
   Compiling edit v1.1.0 (/Users/Shared/Develop/Rust/microsoft_edit)
error: linker `cc` not found
```

ビルドに必要なツール類の一括インストール
```shell
sudo apt install build-essential
```

その後、もう一度`cargo`でのインストールを行えば今度は文字列検索も機能するはずです。
【rails】devise 日本語対応


## はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
現在、Rails チュートリアルのアウトプットとしてアプリを製作しています。
devise の実装も順調に進んだのですが、アプリの言語をどうにかして日本語にできないかと悩んでいましたが、意外と簡単にできることが発覚しました。
今回はその方法について記事にしようと思います。

開発環境

- rails 8.0.3
- docker/devcontainer

### 1. devise-i18n をインストール

Devise の日本語化には `devise-i18n` という gem を使うのが一般的です。

もし devise 以外も日本語対応させたい場合は一緒に`rails-i18n`  という gem を追加しましょう

#### Gemfile に追加

```ruby
gem 'devise-i18n'
gem "rails-i18n" # rails の機能を日本語にしたい場合
```

#### bundle install

```bash
bundle install
```

---

### 2. 日本語の言語ファイルを確認

`devise-i18n` を入れると、日本語の翻訳ファイルが自動的に使われるようになります。

私は以下より日本語対応の devise 用の devise.ja.yml をコピーしました。

[https://gist.github.com/satour/6c15f27211fdc0de58b4](https://gist.github.com/satour/6c15f27211fdc0de58b4)

---

### 3. Rails のデフォルトロケールを日本語に設定

#### config/application.rb

```ruby
module YourAppName
  class Application < Rails::Application
    config.i18n.default_locale = :ja
  end
end
```

---

### まとめ

- `devise-i18n` を入れるだけで多くの部分が日本語化される
- 必要に応じて翻訳ファイルを編集し、柔軟にカスタマイズ可能
- メールテンプレートも日本語化すれば、より丁寧な印象に
PlantUMLでnoteを使った際に発生する点線を消す方法

## 解決したいこと

```plantuml
@startuml
!define RECTANGLE class

skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle
skinparam rectangle {
    BackgroundColor #E6F3FF
    BorderColor #0066CC
}

package "開発環境" as Development {
    actor User
    database "Redis" as Redis {
        frame "value1" as value1 {
            note right : これはvalue1です
        }
    }
    database "MySQL" as MySQL {
        frame "テーブル1"
    }
}

note right of User
Userに関する説明
end note

@enduml
```

「これはvalue1です」からUserに意図しない点線が出てしまっているので削除したい

:::note info
PlantUMLのソースがみたい方は「Markdownで本文を見る」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/0c860eac-f945-4952-9e6a-837cd5d3ae04.png)
:::

---

## 暫定対応

noteを使うのをやめて`[]`で囲むことにした。
デフォルトだと灰色なので，`#FFFFE0`を指定している。

```plantuml
@startuml
!define RECTANGLE class

skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle
skinparam rectangle {
    BackgroundColor #E6F3FF
    BorderColor #0066CC
}

package "開発環境" as Development {
    actor User
    database "Redis" as Redis {
        frame "value1" as value1 {
            [これはvalue1です] #FFFFE0
        }
    }
    database "MySQL" as MySQL {
        frame "テーブル1"
    }
}

note right of User
Userに関する説明
end note

@enduml
```

---

## 試したこと

### △noteの配置位置を変える

`right`を`top`に変えると吹き出しにはなったが，別にこれもいらない

```
        frame "value1" as value1 {
            note top : これはvalue1です
        }
```

```plantuml
@startuml
!define RECTANGLE class

skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle
skinparam rectangle {
    BackgroundColor #E6F3FF
    BorderColor #0066CC
}

package "開発環境" as Development {
    actor User
    database "Redis" as Redis {
        frame "value1" as value1 {
            note top : これはvalue1です
        }
    }
    database "MySQL" as MySQL {
        frame "テーブル1"
    }
}

note right of User
Userに関する説明
end note

@enduml
```

### ✖点線を透明にしてみる

```
skinparam noteConnectionColor transparent
```
上記を追加するも透明にならず。
TODO: 他の指定方法なら消えるかも?

```plantuml
@startuml
!define RECTANGLE class

skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle
skinparam rectangle {
    BackgroundColor #E6F3FF
    BorderColor #0066CC
}
skinparam noteConnectionColor transparent

package "開発環境" as Development {
    actor User
    database "Redis" as Redis {
        frame "value1" as value1 {
            note right : これはvalue1です
        }
    }
    database "MySQL" as MySQL {
        frame "テーブル1"
    }
}

note right of User
Userに関する説明
end note

@enduml
```

### ✖`right`等の場所指定表記を消す

試したが，構文エラーになった。

---
猿でもわかるAIプログラミングシリーズ 🐵💻 Pythonで簡単な時系列予測をやってみよう



## Pythonで簡単な時系列予測をやってみよう

こんにちは！今回は、\*\*「時系列予測」\*\*というAIの中でも業務応用が多いテーマについて、Pythonを使って簡単に体験してみましょう。

業務で「売上の予測」や「在庫の見積もり」「トラフィックの変動」など、時間に沿ったデータを扱う場面はよくありますよね。本記事では、そういったケースに使える**時系列予測の基本**を、理論＋コードでやさしく解説します。

---

## 1. なぜ時系列予測が必要なのか？

時系列予測とは、**時間の流れに沿って記録されたデータ（時系列データ）をもとに、将来の値を予測する技術**です。

例えば、以下のような場面で活用されます：

* 👔 小売業：売上数の予測
* 🏭 製造業：需要の変動による生産調整
* 🌤 気象庁：天気予報
* 💰 金融業：株価・為替レートの変動予測

近年では、これらを**AIや機械学習を活用して自動化する動き**が加速しています。

---

## 2. 時系列予測の技術概要（やさしく解説）

時系列予測にはさまざまな手法がありますが、今回は以下のような流れで進めます：

1. データの前処理
2. モデルの構築（ARIMAや線形回帰などの古典的手法ではなく、まずはシンプルに）
3. モデルによる予測
4. 結果の可視化と評価

今回は機械学習モデルよりも手軽に試せる**シンプルな移動平均法と線形回帰**を使います。

---

## 3. 実装：Pythonでシンプルな時系列予測をやってみよう

### 使用ライブラリ

```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
```

### サンプルデータの準備（ダミーの売上データ）

```python
# ダミーデータの作成（1日ごとの売上）
np.random.seed(42)
days = pd.date_range(start="2023-01-01", periods=60)
sales = 100 + np.cumsum(np.random.randn(60))  # ランダムウォーク

df = pd.DataFrame({"date": days, "sales": sales})
df.set_index("date", inplace=True)
df.plot(title="売上の推移", figsize=(10, 4))
plt.show()
```

### 移動平均法で平滑化＆予測

```python
df["moving_avg"] = df["sales"].rolling(window=7).mean()
df[["sales", "moving_avg"]].plot(title="移動平均", figsize=(10, 4))
plt.show()
```

この移動平均は「未来を予測する」というより「現在のトレンドを平滑に見る」方法です。

### 線形回帰による未来予測（10日先まで）

```python
# データの整形
df = df.reset_index()
df["day_num"] = np.arange(len(df))  # 時系列を数値に変換

X = df[["day_num"]]
y = df["sales"]

# 線形回帰モデル
model = LinearRegression()
model.fit(X, y)

# 未来の10日間を予測
future_days = 10
future_X = np.arange(len(df), len(df) + future_days).reshape(-1, 1)
future_preds = model.predict(future_X)

# 結果の表示
plt.figure(figsize=(10, 4))
plt.plot(df["day_num"], df["sales"], label="実データ")
plt.plot(future_X, future_preds, label="予測", linestyle="--")
plt.legend()
plt.title("売上の予測（線形回帰）")
plt.xlabel("日数")
plt.ylabel("売上")
plt.show()
```

---

## 4. 実務で役立つTips & よくある落とし穴

### ✅ 実務Tips

* **日付の扱い**はなるべく `pandas.DatetimeIndex` を使いましょう（集計や欠損補完が楽）
* **可視化は必須！** チームで議論するためにも、予測結果のグラフは簡潔に見せる
* **モデルの選択はシンプルでOK**：まずは移動平均や線形回帰、その後 ARIMA や LSTM へ進む

### ❌ よくあるミス

* データに**季節性やトレンドがあるのに無視**すると、モデルが当てにならない
* **直近のデータに過剰適合**すると、未来の予測がブレる（過学習の一種）
* **未来のデータを学習に使ってしまう**（時系列では情報の順序が重要！）

---

## 5. 応用：ProphetやLSTMで高度な予測を！

簡単な線形回帰に慣れてきたら、以下の手法も検討してみましょう：

* **Facebook Prophet**：ビジネス向け時系列予測ライブラリ。休日や季節性も扱える
* **ARIMA / SARIMA**：古典的統計モデル。金融データなどに強い
* **LSTM（Long Short-Term Memory）**：ディープラーニングによる時系列予測。精度は高いが学習が重い

例：Prophetの実装も10行程度でできるので、次の記事で詳しく紹介予定です 👇

---

## 6. まとめ

### ✅ 本記事でやったこと：

* 時系列予測の基本的な考え方を紹介
* Pythonとpandas、scikit-learnで**簡単な売上予測モデル**を実装
* 実務で使える**Tips**や**注意点**を紹介

### 🔍 今後の展望：

* より高度なモデル（LSTM, Prophet）を使えば、**休日やイベントによる影響も予測可能**
* モデルの精度評価（MSE, MAEなど）を取り入れることで、**より信頼性の高い予測**ができる

---

## おまけ：コード一式（Google Colabで試せます）

```python
# リンク例（自作のColabノートブックがあれば）
# https://colab.research.google.com/drive/1xyzABC...
```

---

次回は「**転移学習って何？画像認識AIで試してみよう**」を予定しています。
ぜひコメント・いいねで応援してください😊

---

執筆者：@あなたの名前（機械学習・クラウド大好きエンジニア）
Qiitaで「#猿でもわかるAIプログラミングシリーズ」配信中！
学生起業家に向けたアドバイス

### はじめに

私自身は以前の記事でも書いたとおり、やむなく起業（フリーランス）したので、最近のスタートアップ起業家を目指している学生さんとは歩みが全然違います（私の場合は、スモースビジネス）。

そんな私ですが、INSEAD卒の起業家のメンターをしたり、ここ最近スタートアップ企業家の学生さんからアドバイスを求められ、来月には大学でお話しをしてくる機会にも恵まれたので、講演前に少し私の経験から今のうちに身に付けておいた方が良い考え方や価値観を共有します。

### 自分を信じるな。でも渇望には従え

### 他人を信じるな。でも耳を傾けろ

### 言葉を信じるな。でも前提を確かめろ

### データを信じるな。でも条件は確かめろ

### 型にハマれ。でも型を破れ

### 他人に迷惑を掛けろ。でも恩は返すな

### 仲間を集めるな。でも同志は集え 

### 目を信じるな、でも視点を変えて見ろ

### Don't think , Don't feel , take logs

### G:Q -> f(x) -> y

最後はよく分からないような記号になりましたが、これから１０日間に分けて  
私なりの解説をしていきます。
New Relic、『ニュースレター』はじめました。

# New Relic News始動！
機能アップデート情報やおすすめコンテンツをまとめたニュースレターである**New Relic News**のメール配信が始まっています！！

**注目Blog・Qiitaコンテンツやイベント情報**に加えて、**オリジナルTシャツがあたる今月のクイズ**なども掲載されているので、ぜひNew Relic Newsにご登録ください:raised_hands:


# New Relic Newsの新規購読
[こちらのフォーム](https://docs.google.com/forms/d/e/1FAIpQLSfVeizAJO2Ftqh6pef8043ibNVGGZR5737KYdRuCydtLkjx6A/viewform)からご登録ください！

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/3d12c097-5b89-4ff1-bdde-344929ebc052.png)](https://docs.google.com/forms/d/e/1FAIpQLSfVeizAJO2Ftqh6pef8043ibNVGGZR5737KYdRuCydtLkjx6A/viewform)

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info

無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/66d6a010-e4fe-4004-a09b-c01eaad5a614.png)](https://newrelic.com/jp/contact-sales)
猿でもわかるAIプログラミングシリーズ 🐵💻 無料で使えるAIツール一覧（非エンジニア向け）


## 無料で使えるAIツール特集：非エンジニア向けツールを技術者目線で活用してみた

---

## 🧩 1. はじめに：AIツールの“民主化”が進む今、エンジニアにできることとは？

近年、**ChatGPT**や**Notion AI**など、非エンジニアでも手軽に使えるAIツールが爆発的に増えています。これらのツールは一見「非エンジニア向け」とされますが、**我々エンジニアが使うことで、より高度で生産的な業務活用**が可能になります。

本記事では、無料で使える代表的なAIツールをいくつかピックアップし、\*\*「エンジニアならではの活用術」や「API連携・自動化のアイデア」\*\*を交えつつご紹介します。最後には実際にPythonからAPIを叩いて業務に使えそうなミニアプリも構築します。

---

## 🔍 2. 無料で使える注目のAIツール概要

| ツール名                    | 用途          | 特徴                       |
| ----------------------- | ----------- | ------------------------ |
| **ChatGPT (Free tier)** | チャット型AI     | コード生成、仕様相談など多用途に対応       |
| **Notion AI**           | ドキュメント生成・要約 | 会議メモ、提案書の下書きに最適          |
| **Perplexity AI**       | 検索補助型AI     | 最新情報の調査に強い               |
| **Hugging Face Spaces** | オープンソースAIデモ | モデルの即時体験・API利用可          |
| **Poe by Quora**        | 複数モデルのチャット  | Claude・GPT-4などを同時に使い分け可能 |

これらのツールは基本的にブラウザ上で利用できますが、**APIやブラウザ自動操作と組み合わせることで業務への組み込みも可能**です。

---

## 💻 3. 実践：ChatGPTとPythonで議事録の自動要約システムを作ってみた

### 3.1 背景とユースケース

会議が終わった後の議事録整理、めんどくさいですよね？
でも、ChatGPTと少しのPythonコードがあれば、**録音 → 文字起こし → 要約**まで一気通貫で自動化できます。

ここでは、次のステップで処理を行います：

1. 録音ファイルを文字起こし（Whisper API）
2. ChatGPTで要約
3. Markdownで整形・保存

### 3.2 コード例（OpenAI API使用）

```python
import openai

openai.api_key = "sk-xxxxxxxx"  # 自分のAPIキーを使用

# 1. Whisperで文字起こし
def transcribe_audio(file_path):
    with open(file_path, "rb") as f:
        transcript = openai.Audio.transcribe("whisper-1", f)
    return transcript['text']

# 2. ChatGPTで要約
def summarize_text(text):
    prompt = f"以下の議事録を簡潔に要約してください：\n{text}"
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message["content"]

# 実行例
raw_text = transcribe_audio("meeting.mp3")
summary = summarize_text(raw_text)

with open("summary.md", "w") as f:
    f.write(summary)
```

> 💡 注意：Whisper APIは音声認識用、ChatGPTはテキスト処理用。用途に応じてモデルを使い分けましょう。

---

## 🛠 4. 現場で使えるTips & よくある落とし穴

### 🔹 実務でのTips

* **長文は分割して送る**：APIにはトークン制限があるため、1万字超える議事録は分割推奨。
* **プロンプト設計**：要約の品質はプロンプト次第。業界用語などは事前に定義しておくと精度UP。
* **JSON形式で返すよう指示**すれば、プログラム処理がしやすくなる。

### 🔹 よくある失敗

* 「API呼び出しすぎでエラーになる」→ 再試行ロジックやレート制限の対応が必要。
* 「要約があいまいすぎる」→ 明確な出力フォーマットをプロンプトに含める。

---

## 🚀 5. 応用：社内ツールとの連携でAI秘書を作る

上記のコードを少し発展させて、以下のような連携が可能です：

* **Slack通知**：要約をSlack APIでメンション付き送信
* **Google Calendar連携**：会議ごとに自動処理トリガー設定
* **社内Wiki（Notion等）への自動投稿**

例：Slack通知用スニペット

```python
import requests

def notify_slack(message):
    webhook_url = "https://hooks.slack.com/services/..."
    payload = {"text": message}
    requests.post(webhook_url, json=payload)
```

---

## 🧠 6. まとめ：無料AIツール × 技術力で業務が進化する

### ✅ メリット

* 非エンジニア向けツールでも**技術者が使えば爆発力が出る**
* 自動化・API連携で**ルーティン業務を大幅削減**
* コーディングによって**既存ツールの可能性を拡張**

### ❌ 注意点

* 無料枠には**制限あり（速度・トークン）**
* プライバシー・社内データの扱いには注意

### 🔮 今後の展望

* ノーコード×コードのハイブリッド開発
* LLMによる「自然言語で業務自動化」が当たり前に？

---

## 👋 最後に

「非エンジニア向けAIツール」こそ、**エンジニアが本気で活用すべき時代**です。
ぜひ、今回のスクリプトを参考に、自分の業務に応じた**AI秘書ツール**を作ってみてください！

---

📌 コード一式はGitHubにもアップ予定です。
💬 コメントやフィードバックもお待ちしています！
PlantUMLの要素を無理やり縦並びにする方法

## 解決したいこと

図が横長になってしまい，視認性が悪いため，要素を縦並びにしたい。

例

```plantuml
@startuml
!define RECTANGLE class

skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle
skinparam rectangle {
    BackgroundColor #E6F3FF
    BorderColor #0066CC
}

package "DBが入ったインスタンス" {
    database "MySQL" as MySQL {
        frame "テーブル1"
        frame "テーブル2"
    }
    database "Redis" as Redis {
        frame "value1"
        frame "value2"
    }
    database "PostgreSQL" as PostgreSQL {
        frame "テーブルα"
        frame "テーブルβ"
    }
}

@enduml
```

:::note info
PlantUMLのソースがみたい方は「Markdownで本文を見る」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/0c860eac-f945-4952-9e6a-837cd5d3ae04.png)
:::
---

## 解決策

非表示の矢印をつけることで縦並びを強制することができる。

```
    MySQL -[hidden]up- Redis
    Redis -[hidden]up- PostgreSQL
```

```plantuml
@startuml
!define RECTANGLE class

skinparam backgroundColor #FFFFFF
skinparam componentStyle rectangle
skinparam rectangle {
    BackgroundColor #E6F3FF
    BorderColor #0066CC
}

package "DBが入ったインスタンス" {
    database "MySQL" as MySQL {
        frame "テーブル1"
        frame "テーブル2"
    }
    database "Redis" as Redis {
        frame "value1"
        frame "value2"
    }
    database "PostgreSQL" as PostgreSQL {
        frame "テーブルα"
        frame "テーブルβ"
    }
    MySQL -[hidden]up- Redis
    Redis -[hidden]up- PostgreSQL
}

@enduml
```
初めまして、yoshi.usa4423です🙇（自己紹介）


## みなさん初めまして！！！
yoshi.usa4423です🐇

今回が初投稿となりますので、とっても緊張しております💦
温かい目で見守っていただけますと幸いです🙇‍♂️

### 自己紹介 
#### 経歴📚 
2024年10月：HAL東京（2年制課程）卒業

2025年4月：都内のIT企業にインフラエンジニアとして入社

### 一言💬 
「専門学校を出てるから、きっとITの知識が豊富なんでしょ？」とか、
「小さい頃からパソコン触ってたんでしょ？」
……なんて思わないでください！✋

実は、専門学校でITを学び始めたのは23歳からなんです。
しかも、授業中は先生が何を言ってるのか、ほとんど理解できませんでした😓
よくIT企業に就職できたな…！！って、自分でも思ってます

さらに…
コードもまともに書けません！ 資格もゼロです！
すでにエンジニアとしてやっていけるのか、不安です😑😑😑

そんな自分ですが、今まさに現場で学び直している真っ最中です。
Terraform、AWS、Linux……毎日ひたすら手を動かして奮闘中！

Qiitaでの投稿を通して、成長していきたい！！！

### 今後書いていきたい内容（予定）🔥
今後は、以下のような内容を中心に投稿していく予定です！

- Terraformを使ったAWSインフラ構築メモ

- Linux

- ネットワークの知識

- HTML / CSS / javascript を使用したWebサイト制作

- JAVA

- MySql

- Android Studio を使ったアプリケーション開発

- 資格勉強の記録や勉強法の共有

- 使ってよかったツールの紹介

IT分野だけでなく、自分の興味を持ったことについても発信していけたらと思っています。
また、「これ自分も詰まったな…」という部分や、「明日の自分のためのメモ」を中心に投稿していく予定です！
「自分が知りたかったこと」「不安だったこと」を、未来の誰かのために残せたら嬉しいです！

### 最後に
「成長の記録として残す」ことをモットーに、同じような立場の初学者さんの助けになる記事を目指していきます！
つたない部分もあるかと思いますが、よろしくお願いします🙇‍♂️
Qiita アップデートサマリー - 2025年 5月

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/35f155bc-68a7-488a-b8d3-fe030ff993b7.png)


## **はじめに**
Qiitaでは、エンジニアのみなさんからの声をもとに、日々開発を続けています。
この記事では、2025年5月にリリースした機能や最新のお知らせについてご紹介します。

Qiitaでアップデートやバグ修正をリリースしたら、[リリースノート](https://qiita.com/release-notes)、[Qiita 公式 Twitter](https://twitter.com/Qiita)、[Qiita Blog](https://blog.qiita.com/)でお知らせしています。

また、Qiitaへの質問や機能の要望などがありましたら、[Qiita Discussions](https://github.com/increments/qiita-discussions) へご投稿ください。

## **Markdown 見出しの読み上げを改善しました**
*2025年5月01日 リリース*
*2025年5月07日 一部記事が正しく表示されなかったため、一時的にリリース前の状態に戻しました*
*2025年5月15日 再度リリース*

アクセシビリティの向上とユーザーエクスペリエンスを改善するため、Markdownの見出しの読み上げを改善しました。

- 変更したこと
    - 見出しへのリンクをデフォルトで非表示に変更
    - ホバー時のみリンクアイコンを表示するように変更
    - リンクアイコンのスタイルを改善


## **通知一覧に「いいね・ストック」カテゴリーを追加しました**
*2025年5月12日 リリース*

Qiita の通知機能がさらに便利になりました。通知一覧で「いいね」と「ストック」に関する通知のみを絞り込んで表示できるようになりました。

通知一覧は[こちら](https://qiita.com/notifications)からアクセスいただけます🔔


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/a7ea0d7c-6666-4e0f-9d41-81cabedd4d63.png)




## **記事編集履歴ページにMarkdownを閲覧、コピーする機能を追加しました**
*2025年5月16日 リリース*

記事編集履歴から記事を復元しやすくするために、Markdownを閲覧、コピーする機能を追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/9af56c45-5ae1-4a96-865e-e8cc22ed923a.png)


「Markdown」タブを押すことによりMarkdownを閲覧することができるようになりました。
「このバージョンのMarkdownをコピーする」ボタンを押すことで表示しているバージョンのMarkdownのコピーができるようになりました。

## **ストックリスト作成・編集フォームでタグ・概要を設定できるようになりました**
*2025年5月30日 リリース*

ストックリストを詳細に説明できるよう、「タグ」と「概要」を設定できるようになりました。

- タグは最大5つまで、1つのタグは最大30文字まで設定できます
- 公開ストックリストの場合はタグの入力が必須です
- 概要は最大200文字まで入力できます

これにより、ストックリストの内容や特徴が他のユーザーに伝わりやすくなります！

ストックのシェア機能はベータ版として提供中です 📣 
ぜひ、ご活用ください ✨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/77b64d54-6894-4613-bb1b-cb3e4b9debc5.png)



## **ストックのシェア機能をベータ版として提供中です**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/df98ac65-6764-40e1-97cd-14b9fd42b36e.png" width="100%" alt=""/>

*2025年3月27日リリース*

これまでQiitaのストックは、記事を個人で保存し、活用するための機能として提供してきました。
しかし、「ストックを共有したい」「シリーズものの記事をまとめて紹介したい」 といったご要望を、ユーザーヒアリングや[Qiita Discussions](https://github.com/increments/qiita-discussions) などを通じて多くいただいていました。

そこで今回、ストックした記事を簡単にシェアできる新機能を追加しました！

「**ストックのシェア機能**」を使うことで以下のようなことができます。

- シリーズものの記事や関連記事をまとめて公開
- 役立つ記事をストックし、仲間と共有
- 「これは読んでおくべき！」という記事を、より多くの人に勧められる

新機能を活用すれば、より多くの人に価値ある記事を届けることができます。
Qiitaは、記事がより多くの人に届き、知見が広がることで、技術コミュニティがさらに発展すると考えています。
まずは気になる記事をストックし、シェアしてみてください！✨

ストックのシェア機能の詳しい使い方は、[Qiita Blog](https://blog.qiita.com/stock-share-beta/)で紹介しています。

https://blog.qiita.com/stock-share-beta/


## **Qiita Tech Festa 2025 開催中！**
毎年夏に開催していた「Qiita Engineer Festa」をリニューアルした「Qiita Tech Festa」が開催中 📣

6月17日から、記事投稿キャンペーンが始まります！
様々な記事投稿テーマをご用意しておりますので、まずは参加登録から💁‍♂️
素敵な記事された方にはQiitaグッズをGetできるかも!?





投稿テーマ一覧はこちら 🔽

https://qiita.com/tech-festa/2025/tech-sprint


7月25日に開催する「技術に特化した話が聞けるライブ配信イベント」も参加申し込みを受付中 📣
基調講演、スポンサーセッション、Qiita ユーザーによるセッションなど必聴です！
また、登壇したい方も募集中です！詳細から応募概要をご確認ください♫

詳細はこちら  🔽

https://qiita.com/tech-festa/2025/tech-spark
VBAでアウトライン（グループ化）の操作

私はVBAとJavaの開発を中心に勉強している初心者です。
今回は私がVBAで開発している際に詰まったポイントとして、アウトライン（グループ化）の操作について書いていきます。

## グループ化する
まずはグループ化をする際のVBAです。
例えば、1行目から10行目までのグループ化を行うとすると、
VBAは以下のように記述します。
```
'1行目から10行目までのグループ化を行う
Rows("1:10").Group
```
また、列のグループ化をする際は以下のように記述します。
```
'C列からE列までのグループ化を行う
Columns("C:E").Group
```
## グループ化を解除する
次にグループ化を解除する際のVBAは以下のようになります。
```
'1行目から10行目までのグループ化を解除する
Rows("1:10").ClearOutline
'グループ化をすべて解除する
Selection.Rows.ClearOutline
```
または、以下のように書くこともできます。
```
'1行目から10行目までのグループ化を解除する
Rows("1:10").Ungroup
'グループ化をすべて解除する
Selection.Rows.UnGroup
```
ClearOutlinedではアウトラインが設定されていなくてもエラーなしで実行されますが、UnGroupではアウトラインが設定されていない場合は"Ungroupメソッドが失敗しました"というエラーが表示されます。
この点を考慮して使い分けをする必要があります。

## グループ化部分を閉じる
グループ化部分を閉じる際には以下のように記述します。
```
'行のグループ化を閉じる
Outline.ShowLevels RowLevels:=1
'列のグループ化を閉じる
Outline.ShowLevels ColumnLevels:=1
```
このVBAを実行することで1階層目のみが表示されるようになり、見た目上はグループ化が閉じられています。
ただし、階層単位でのみ実行されているため、もし複数階層のグループ化を作成していた場合、中の階層を閉じる操作は実行されていません。
そのため、厳密にすべてのグループ化を閉じたい場合は以下のようにするとよいと思います。
```
'3層の行のグループ化をすべて閉じる
For i = 3 To 1 Step -1
Outline.ShowLevels RowLevels:=i
Next i
```
このVBAを実行することで中の階層から順番にすべて閉じることができます。

## グループ化部分を開く
グループ化部分を開く際には、グループ化を閉じる際と同じメソッドを使用し、以下のように記述します。
```
'行の2層目のグループ化部分を表示する
Outline.ShowLevels RowLevels:=2
'列の2層目のグループ化部分を表示する
Outline.ShowLevels ColumnLevels:=2
```
複数階層のすべてのグループ化を開きたい場合は以下のように記述します。
```
'3層の行のグループ化をすべて開く
For i = 1 To 3 
Outline.ShowLevels RowLevels:=i
Next i
```
## グループ化が設定されているか判定する
グループ化がされているかを判定する際には以下のコードが使用できます。
```
Dim level As Variant
'列Ｃのアウトラインレベルを取得する
level = Columns(3).OutlineLevel
```
この時取得されるアウトラインレベルはアウトラインが閉じられていた場合1で取得され、シートにグループ化が設定されているか？されていないか？という判定で使用したい場合には、一度グループ化をすべて開く操作を行ってからアウトラインレベルを取得する必要があります。

## まとめ
今回はアウトライン（グループ化）を操作するVBAについて記述しました。
アウトラインの操作では実行される条件などを理解して動作を組み立てる必要があります。
私の記事が参考になれば幸いです。
なにか問題があればお知らせください。
抽象化がよくわからない人へ　〜Flutterでの実例で理解する〜

# はじめに

「抽象化ってなんや？」  
「インターフェースとかファクトリーって、結局どういうこと？」

そんな疑問を持っている方向けに、実例を通して抽象化の考え方を解説します！

## 抽象化とは

抽象化とは、**詳細な実装を隠して、共通の使い方だけを提供する**という考え方です。

コードを書く上で、「呼び出す側が細かい実装を知らなくても済む」ようにするための設計テクニックです。

## Flutterでの具体例

### 目的：環境によって保存処理を切り替えたい

例えば、以下のようなケースを考えます。

- 通常はセキュアなストレージに保存したい
- テスト中はモックを使いたい
- Webでは別のストレージ実装を使いたい

これを毎回 `if` 文で分岐するのではなく、抽象化とファクトリーパターンを使って整理します。

---

### 1. 抽象クラス（共通のインターフェース）

```dart
abstract class AppStorage {
  Future<void> save(String key, String value);
  Future<String?> load(String key);
}
```

---

### 2. 通常時の実装（セキュアストレージ）

```dart
class SecureStorage implements AppStorage {
  @override
  Future<void> save(String key, String value) async {
    // 保存処理
  }

  @override
  Future<String?> load(String key) async {
    // 取得処理
  }
}
```

---

### 3. テスト用のモック実装

```dart
class MockStorage implements AppStorage {
  final Map<String, String> _storage = {};

  @override
  Future<void> save(String key, String value) async {
    _storage[key] = value;
  }

  @override
  Future<String?> load(String key) async {
    return _storage[key];
  }
}
```

---

### 4. ファクトリーで環境ごとに実装を切り替える

```dart
import 'dart:io';
import 'package:flutter/foundation.dart';

class StorageFactory {
  AppStorage create() {
    if (kIsWeb) {
      return WebStorage(); // Web向けの仮実装
    }

    if (Platform.environment.containsKey('FLUTTER_TEST')) {
      return MockStorage();
    }

    return SecureStorage();
  }
}
```

---

## なぜこれが抽象化なのか？

この構成では、呼び出す側（利用側）は `AppStorage` という抽象クラスにしか依存していません。  
そのため、**実際にどのストレージ（セキュア／モック／Web）が使われているかは知らなくてよい**のです。

これが「詳細を隠す」という抽象化の考え方です。

---

## この設計の利点

- **テストしやすい**  
  テスト実行時に自動的にモック実装に切り替わる

- **保守性が高い**  
  新しい実装（たとえばクラウド同期型のストレージなど）を追加しても、利用側を変更する必要がない

- **拡張しやすい**  
  `AppStorage` を実装した新しいクラスを追加するだけで対応可能


## まとめ

抽象化とは、実装の詳細を隠し、共通のインターフェースを通じて使えるようにすること。  
Flutterでは、テストやマルチプラットフォーム対応の際によく使われます。

ポイントは次の3つです

1. 抽象クラス（インターフェース）を作る  
2. 用途に応じた実装クラスを用意する  
3. ファクトリーパターンなどで環境に応じて実装を返す

以上、ご覧いただきありがとうございました！
[wordpress] 固定ページ化したときにcssが崩れちゃう問題

> – `page-xxx.php` ページに直接 HTML を書いていたときは崩れなかったレイアウトが、管理画面からhtmlを編集できるようにテンプレート側を `the_content();` に切り替えて **管理画面から固定ページで HTML を貼り付けた途端にガタガタになっちゃった！**……。
> DevTools を開き確認すると勝手に `<p>` タグや改行が挿入されているのが原因でした。この記事ではその時の解決をメモします。


## 1. 再現した手順

1. `page-happy.php` を作り、ヘッダー・フッターを呼び出しつつ中身は直書き：

   ```php
   <?php /* Template Name: LP (Hard‑coded) */ ?>
   <?php get_header(); ?>
   <section class="kv"><h1>Title</h1></section>
   <section class="features">…</section>
   <?php get_footer(); ?>
   ```

   → **表示 OK**
2. 本文を投稿画面から編集できるようにする。

   ```php
   <?php /* Template Name: LP (Editor) */ ?>
   <?php get_header(); ?>
   <?php the_content(); ?>
   <?php get_footer(); ?>
   ```
3. 固定ページ編集画面に、さきほどの HTML 全文をコピペ → 更新。
4. 表示を確認すると CSS が崩壊。DevTools でみると：

   ```html
   <p><section class="kv"><h1>Title</h1></section></p>
   <p><section class="features">…</section></p>
   ```

   `<p>` ラップ + `<br>` 挿入でセレクタが想定外に。

---

## 2. 原因 – **`wpautop` フィルタ**

WordPress は投稿本文 (`the_content`) を表示する直前に `wpautop()` を走らせ、改行を自動で `<p>` / `<br />` に変換します。

* ブログ記事には便利だが、**HTML をそのまま貼りたい LP には邪魔**。
* `<section>` などブロックレベル要素を `<p>` で包むため、CSS のセレクタ階層が変わり崩れる。

---

## 3. 解決策

### 3‑2. テンプレート側で `wpautop` を無効化（最短）

```php
<?php /* Template Name: LP (No‑autop) */ ?>
<?php
  /* p タグ自動挿入を殺す */
  remove_filter( 'the_content', 'wpautop' );
  remove_filter( 'the_content', 'shortcode_unautop' );
?>
<?php get_header(); ?>
<?php the_content(); ?>
<?php get_footer(); ?>
```

> **ポイント** : 同じテンプレート内で `remove_filter()` → `the_content()` の順に呼ぶ。ほかのページへの影響はない。

## まとめ

| Before | After | 効果 |
|--------|-------|------|
| `the_content()` + `wpautop()` で `<p>` 挿入 | `remove_filter( 'the_content', 'wpautop' )` | 余計なラップを防ぎ、CSS が元どおり |

> **教訓** : LP や静的ページを投稿エディタで管理するときは、まず *wpautop* を疑う！  
> **もうひとこと** : WordPress のエディタは “ページをその場で組み立てる” には便利ですが、**外部ツールで作成したデザインをそのままコピペすると自動整形で `<p>` など余計なタグが入り、レイアウトが崩れやすい**。コピー＆ペースト運用をする場合は、3-0 / 3-1 の対策を必ず入れるようにする！
参照透明性と遅延評価 - Haskellで学ぶ関数型の魅力

関数型プログラミングを学び始めると、よく耳にするキーワードが「参照透明性」と「遅延評価」です。この記事では、これらの概念が何を意味し、Haskellではどのように活用されているのかを、サンプルコードとともに解説します。

## 参照透明性とは？

**参照透明性（Referential Transparency）** とは、同じ式が常に同じ結果を返す性質のことを指します。副作用がなく、関数の出力は入力だけに依存している状態です。

例えば、次のHaskell関数は参照透明です：

```haskell
add :: Int -> Int -> Int
add x y = x + y
```

この `add 2 3` はどこで呼び出しても常に `5` を返します。これが参照透明性の特徴です。

逆に、IO操作を含む関数は参照透明ではありません。

```haskell
getCurrentTime :: IO UTCTime
```

これは呼び出すたびに異なる結果を返します。

## 遅延評価とは？

**遅延評価（Lazy Evaluation）** は、値が必要になるまで計算を行わない評価戦略です。Haskellではデフォルトで遅延評価が採用されています。

これにより、無限リストの定義や、パフォーマンス最適化が可能になります。

```haskell
naturals :: [Integer]
naturals = [0..]  -- 無限リスト

takeFive :: [Integer]
takeFive = take 5 naturals  -- [0,1,2,3,4]
```

このように、`naturals` は無限に続くリストですが、`take 5` により最初の5つだけが評価されます。

## 両者の組み合わせが生む強力さ

参照透明性と遅延評価が組み合わさることで、以下のような利点があります：

* **メモ化（Memoization）** が自然に可能になる
* **安全な並列処理** がしやすい
* **簡潔で効率的なコード** が書ける

### 例：フィボナッチ数列（メモ化あり）

```haskell
fibs :: [Integer]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

take 10 fibs  -- [0,1,1,2,3,5,8,13,21,34]
```

このコードでは、過去の計算結果が自動的に再利用されるため、高速かつメモリ効率の良い実装になります。

## おわりに

Haskellの「参照透明性」と「遅延評価」は、関数型プログラミングの魅力を最大限に引き出す要素です。これらを理解することで、より予測可能で安全なコードを書くことができるようになります。

これを機に、ぜひHaskellの世界に足を踏み入れてみてください！
フリーランスになって考え始めた「タイ移住」──プール付き物件に驚愕！


こんにちは。
40代、子供2人を育てる父親です。最近、フリーランスとして仕事を始めたのですが、それに伴ってふと頭をよぎったのが「海外移住」という選択肢。特に気になり始めたのが タイです。

## 円安時代のライフスタイル再考
ご存じのとおり、最近は円安が続いていて、日本国内での生活コストがじわじわ上がっています。
一方で、海外の物価や住環境を見てみると、驚くほど魅力的な選択肢があることに気づきました。

その中でも目に留まったのが タイ・バンコクなどの都市。
もともと観光地としても人気ですが、実は長期滞在や移住先としてもかなり優秀なんですね。

## タイの物件を調べてみたら…
ちょっと試しにタイの賃貸物件を検索してみたんです。すると、衝撃の事実が…。

なんとプール付き、ジム完備のコンドミニアムが、日本の都会のワンルームより安い家賃で借りられるんです。しかも、内装もおしゃれで、設備も充実。これは本気で引っ越したくなります。

[タイ・バンコクのファミリー向けおすすめ賃貸物件10選](https://www.dlife.co.jp/blog/thailand-bangkok-family-property/)

具体的には、

・セキュリティ完備
・共用プール＆ジム
・駐車場付き
・家具・家電付き

といった物件がゴロゴロ。正直、日本だと考えられないレベルです。

## 子育て環境もチェック中
子供が2人いるので、教育面や治安も気になるところですが、インターナショナルスクールが充実しているエリアもあるし、日本人も多く住んでいるため、そこまで不安はなさそうです。

現地で子育てしながら、リモートで日本の仕事を続ける─
そんなライフスタイルも現実味を帯びてきました。

## 老後もタイで？という選択肢
さらに思ったのが、「老後をタイで過ごす」という可能性。
物価も医療も比較的リーズナブルで、日本からのアクセスも悪くない。
日本の年金だけでも、暮らしやすい環境が整っている印象です。

特に温暖な気候と、ゆったりした生活ペースは、セカンドライフを送るにはぴったりかもしれません。

## まとめ：フリーランスだからこそ、選べる「自由な暮らし」
日本で会社員をしていたときには、こういった選択肢は現実味がありませんでした。
でも、フリーランスになってからは「どこで暮らすか」も、自由に決められる。これが大きなメリットですね。

まだ移住を決めたわけではありませんが、タイという国に大きな魅力を感じています。しばらく情報収集を続けながら、少しずつ準備していこうと思います。
Raspberry Pi用のオーディオあれこれ

## Audio Injector
このHATは初期状態出音が鳴らないのでALSAの設定をいじって鳴るようにする必要がある。
```/etc/rc.local
# exit 0の前に下記を追加

# Ensure Audio Injector is unmuted
amixer -D hw:CARD=audioinjectorpi set 'Output Mixer HiFi' unmute
# Set the master volume as 0.0dB
amixer -D hw:CARD=audioinjectorpi set Master 95%
```

デバイスのボリュームを変える
```xxxxx.cpp
// コンストラクタの中でハードウェアが利用可能か調べる。
int err;
if (err = snd_ctl_open (&aDevice, "hw:0", 0) < 0)   //  TO DO: do not hard cord the device index
{
    fprintf (stderr, "ALSA card open error: %s\n", snd_strerror (err));
    aDeviceEnabled = false;
    sliderDeviceVolume->setVisible (false);
    labelDeviceVolume->setVisible (false);
}
else
{
    aDeviceEnabled = true;
}

// スライダーが動かされたらそれによって音量制御

int intValue = (int)sliderThatWasMoved->getValue();
int err;
snd_ctl_t* ctl_handle = nullptr;
snd_ctl_elem_id_t* aElemID;
snd_ctl_elem_value_t* aValue;

// hw:0デバイスを開く
err = snd_ctl_open(&ctl_handle, "hw:0", 0);
if (err < 0) {
    fprintf(stderr, "ALSA control open error: %s\n", snd_strerror(err));
    return;
}

snd_ctl_elem_id_alloca(&aElemID);
snd_ctl_elem_value_alloca(&aValue);
snd_ctl_elem_id_set_interface(aElemID, SND_CTL_ELEM_IFACE_MIXER);
snd_ctl_elem_id_set_name(aElemID, "Master Playback Volume");
snd_ctl_elem_value_set_id(aValue, aElemID);
snd_ctl_elem_value_set_integer(aValue, 0, intValue);
snd_ctl_elem_value_set_integer(aValue, 1, intValue);

if ((err = snd_ctl_elem_write(ctl_handle, aValue)) < 0)
{
    fprintf(stderr, "ALSA control element write error: %s\n", snd_strerror(err));
}

// コントロールハンドルを閉じる
snd_ctl_close(ctl_handle);

```
[Cloudera] YARN のキューの動的な設定（スケジュールによって設定を変更する）

# この記事について

以下のドキュメントの翻訳です。

https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-dynamic-queue-scheduling.html

# 動的なキューのスケジューリング

動的なキューのスケジューリング機能を使うと、あらかじめ定義された時間にプロパティの値を再設定することで動的にシステムの状態を変更することができます。

動的なキューのスケジューリング機能は、キューレベルでのリソース割り当ての設定のみをサポートします。加えて、この機能は相対的および絶対的なリソース配置モードのみをサポートし、動的なキューを含みません。

動的なキューのスケジューリング機能を使えば、あらかじめ定義された設定をいつYARNキューマネージャのシステムに適用させるか、その時間を設定できます。

以下のシナリオを考えてみましょう。

状態Aと状態B、ふたつのシステムの状態があり、それぞれがシステム上にスケジュールされる必要があります。状態Aは午前8時から午後8時、状態Bは午後8時から午前8時までです。

この場合、以下のようなスケジューリングルールを作る必要があります。

- ルールA：午前8時に発動し、状態Aの動的な設定をシステムに適用する。
- ルールB：午後8時に発動し、状態Bの動的な設定をシステムに適用する。

動的な設定が新たに作成されると、その設定は現在の設定に基づいてデフォルトで有効化されます。

動的な設定は手動、あるいはシステムにより、いつでも無効化できます。

動的な設定が正しくない場合、システムによって自動的に無効化され、正しい設定に直るまで有効化することはできません。

動的な設定には、たとえばキューを追加したり削除するような、構造的な変更は含まれません。さらに、手動で構造的な変更を行なった場合には、既存の動的な設定が無効となる可能性があります。結果として、既存の動的な設定は、（その設定が有効となるような）構造的な変更が行われた際に有効化されます。

以下の表は、システムがいつ、どのように動的な設定や、その検証の結果を


|検証のタイミング|トリガーとなるイベント|何がチェックされるか？|動的なキューが不正だった場合のアクション|動的なキューが正当だった場合のアクション|
|:-|:-|:-|:-|:-|
|設定時|動的な設定を保存したとき|動的な設定が正統で、適用可能か|動的な設定は無効化された状態で保存され、無効(invalid)と表示される|動的な設定は有効化された状態で保存される|
|稼働時|システムが動的な設定を適用し始めるとき|〃|動的な設定は適用されず、無効化される|動的な設定がシステムに適用される|

上記の自動検証に加え、キューの設定の変更後には手動での検証も必要となります。
この検証は自動では起動されませんが、キューの設定を変更した際、UIが動的な設定の再検証を行うようにプロンプトを表示します。詳細は[動的な設定の再検証（英語）](https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-revalidating-dynamic-configurations.html)をご参照ください。

# 関連資料


[動的な設定の新規作成（英語）](https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-creating-dynamic-configuration.html)

[動的な設定の管理（英語）](https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-managing-dynamic-configuration.html)

[設定テーブルの見かた（英語）](https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-reading-schedule-table.html)

[動的な設定の競合に対処する（英語）](https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-handling-dynamic-configuration-conflicts.html)

[動的な設定の再検証（英語）](https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-revalidating-dynamic-configurations.html)

[動的な設定の実行ログ（英語）](https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/yarn-allocate-resources/topics/yarn-dynamic-configuration-execution-log.html)


:::note
配下の資料も翻訳版を作ったら随時リンクします。
:::
OneDriveの容量が足りない！ストレージ管理の方法【記憶域メトリックス】

# はじめに
この記事は
- OneDriveでファイルを管理している
- SharePointのドキュメント(OneDrive)をつかってチームでファイル管理をしている

のどちらか、そして、

- 容量が不足して困っている
- そんなに使っていないはずなのに空き容量が少ない

方が対象です。

保存しているファイルに比べて残りのストレージが少なかったりしませんか？
これは、ファイルのバージョン履歴が自動で保存されているためです。

何かあったときに安心ですが、ストレージを圧迫していきます。
例えば、1GBのPSDファイルなどを10回保存するだけで10GB消費します。


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/3f2ef20c-d659-41ac-bb4a-ea07556e1e29.png">

放っておくとドンドン増える


----
# 容量を食っている原因を探ろう 【記憶域メトリックス】
どのフォルダやファイルがどれくらい容量を食っているかを確認できる機能があります。


**【記憶域メトリックス】**
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/405b7626-c25e-4dad-989f-d801c4ee1403.png">
ここで、どこにどれくらいのストレージを消費しているかが分かります。

この【記憶域メトリックス】へのアクセス方法は、
OneDriveとSharePointで異なる上に、かなり分かりづらいところにあります。

## OneDriveの方
設定(右上の歯車) → OneDriveの設定
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/1be634f9-79ee-41cf-88cb-bcd9399c7871.png">

その他の設定 → 機能とストレージ → ストレージの測定基準
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/cd2f7296-e73a-499b-b620-4dec124176a7.png">

ややこしいですが、【ストレージの測定基準】が、【記憶域メトリックス】のことです。

## SharePointの方
チームを選択して
サイトコンテンツ → サイト設定
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/3aa8a437-1d1d-4002-89aa-aeef70b67c75.png">

サイト コレクションの管理 → 記憶域メトリックス
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/0086f400-6890-4c99-b1d9-f51309094bd7.png">

----
# 【記憶域メトリックス】でできること
ファイルの右側にある、「バージョン履歴」に遷移すると
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/bb921b3a-00fc-4f57-b45d-86b32c1fe617.png">

バージョンの履歴を確認することができます。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/0fd78371-5120-4149-8409-5e23b7f0b356.png">

日付をタッチすると、「表示」「復元」「削除」を選ぶことができます。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/89722e91-d765-47fe-9676-ccf97580d8c9.png">

容量を削減したい場合は、個別で「削除」を選んでも良いですが、
リストの上にある「すべてのバージョンを削除」を押すことで
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/735483c1-9c49-4090-8e82-1d1bb1085d90.png">

最新の1件を除く古いバージョンをすべて削除することができます。


----
# 複数ファイルまたはチーム全体まとめて履歴のみ削除したい
できません。やり方をご存じの方はコメント欄で教えてください。
SharePointは、ターミナルコマンドが使えるので方法はあるかも知れません。
力技で削除したり、自動設定でコントロールすることは可能です。

## 力技で消す
各ファイルの右側にある、「バージョン履歴」を
1. Ctrl+クリックで、すべて別タブで開く
2. タブを切り替える
3. 「すべてのバージョンを削除」をクリック
4. ダイアログを［スペース］or［Enter］キーで［OK］ボタンを押す
5. Ctrl+Wでタブを閉じる
6. 3～5を全タブ繰り返す
7. 最後に、ゴミ箱を空にすればOK
（記憶域メトリックスの反映は時間がかかります）

## 自動設定で消す
- ルールに基づいて古いバージョンを自動で削除したい
- バージョン管理自体不要

という方は、設定やターミナルコマンドから可能です。
詳細は要望があれば別の記事にまとめます。




----
# おまけ
Amazonで検索すると怪しい業者もHITして面倒ですよね？
Ankerやエレコムなどの安全な業者は含めつつ安全に検索できるサイトを作りました。

Amazonのサイトにリダイレクトするだけなので安全です。

【マケプレ除外サーチ】
https://mp-filter.com/

[<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533019/3dfea540-44b3-4dbc-9b48-bbfeed769012.png">](https://mp-filter.com/)
[streamlit×python]文字数カウントwebアプリケーションを作成してみた

# はじめに

Streamlitを使えば、Pythonで簡単にWebアプリケーションを作成できます。今回は「文字数カウント」という実用的なWebアプリをStreamlitで作成し、その作成過程を紹介します。  データサイエンスや機械学習のプロトタイプだけでなく、ちょっとしたツールもすぐにWebアプリ化できるStreamlitの魅力をぜひ体験してみてください。

---

# 利用したツール

- **Python**（バージョン3.7以上推奨）
- **Streamlit**（pip install streamlitでインストール）
- **テキストエディタ**（VSCode、PyCharmなど）

---

# 実際に出来上がったもの

webアプリは[こちら](https://wordcountapp-afappuhncsqcf9tgdatiyjw.streamlit.app/)からご覧いただけます。  

https://wordcountapp-afappuhncsqcf9tgdatiyjw.streamlit.app/

---

## コード解説

```python:word_count.py
import streamlit as st

def main():
    # アプリケーションのタイトルを設定
    st.set_page_config(page_title="文字数カウント", layout="centered")
    st.title("文字数カウントアプリ")

    st.write("テキストを入力し、「カウント」ボタンを押してください。")

    # ユーザーがテキストを入力するためのテキストエリア
    # heightを調整して、より多くのテキストを表示できるようにします
    user_input = st.text_area("ここにテキストを入力...", height=250)

    # カウントを実行するためのボタン
    if st.button("カウント"):
        # 入力されたテキストが空でない場合にのみカウントを表示
        if user_input:
            # 文字数をカウント (スペースや改行も含む)
            char_count = len(user_input)

            # スペースを除いた文字数をカウント
            char_count_no_spaces = len(user_input.replace(" ", "").replace("\n", ""))

            # 単語数をカウント (空白文字で区切る)
            # 空白文字のみの入力に対応するため、strip()で前後の空白を削除してから分割
            word_count = len(user_input.split()) if user_input.strip() else 0

            # 行数をカウント (改行コードで区切る)
            # 最後の行が空の場合でもカウントされるように、splitlines()を使用
            line_count = len(user_input.splitlines())

            st.subheader("カウント結果:")
            st.metric(label="文字数 (スペース・改行含む)", value=char_count)
            st.metric(label="文字数 (スペース・改行除く)", value=char_count_no_spaces)
            st.metric(label="単語数", value=word_count)
            st.metric(label="行数", value=line_count)
        else:
            st.warning("カウントするテキストが入力されていません。")
    else:
        # ボタンが押されていない初期状態、またはテキストが入力されていない場合に表示
        st.info("テキストを入力し、「カウント」ボタンを押してください。")

if __name__ == "__main__":
    main()
```

---
**ポイント解説**

- **st.set_page_config**：ページタイトルやレイアウトを設定します。
- **st.title/st.write**：見出しや説明文を表示します。
- **st.text_area**：テキスト入力エリアを作成します（heightで高さ調整可能）。
- **st.button**：ボタンを作成し、クリック時に処理を実行します。
- **st.metric**：カウント結果をわかりやすく表示します。
- **文字数・単語数・行数のカウント**：Python標準の関数を使って、入力テキストの各種カウントを行います。

---

# まとめ

Streamlitを使えば、**Pythonの知識だけで簡単にWebアプリケーションを作成でき、すぐに公開・共有できる**のが大きな魅力です。  今回作成した「文字数カウントアプリ」は、ブログ記事やレポートの文字数チェックなど、日常のさまざまな場面で活用できます。  Streamlitは他にもデータ可視化や機械学習モデルのデモなど、幅広い用途に応用できるので、ぜひ挑戦してみてください！
PostgreSQLのロケールについて

## 内容

PostgreSQLでロケールを設定するときは、initdbのタイミングで設定します。

initdbのオプションに何も設定しなければ、OSの環境変数で設定されているロケールがPostgreSQLにそのまま引き継がれることになります。

例えば、LANGで、en_US.UTF-8が設定されていれば、PostgreSQLにも同じようにen_US.UTF-8設定されます。

PostgreSQLが環境設定を参照するとき、LC_ALL、LC_COLLATE、LANGの順で参照するようです。

たとえば、LANGにen_US.UTF-8で設定されていても、LC_ALLがCで設定されていれば、PostgreSQLはCを取得します。

OSの環境変数で設定されるロケールはlibcが提供するロケールです。libcが提供するロケールの一覧はこのコマンドで確認することができます。

```
>locale -a
```

同じlibcであっても、ベンダーによって提供するロケールは異なってくるようです。同じ、en_US.UTF-8であっても、Debianが提供するものと、RedHatが提供するものは異なるということです。

つまり、ロケール名が同じであっても、Debianで動かす場合とRedHatで動かす場合とで、照合順序の結果が変わってくるということになります。難儀なものはありますが、この辺は、それほど大袈裟な話ではないだろうと想像されます。

PostgreSQLではバージョン10より、libcが提供するロケール以外に、icuが提供するロケールもサポートするようになりました。

icuはOSが提供するロケールプロバイダではありません。icuを採用すれば、どのOSで動作させても、照合順序の結果を同じにさせることができます。後発でicuが出てきたこともあり、今後はicuがデファクトスタンダードになるのだろうかと推測されますがどうなるかは分かりません。

initdbでロケールをicuから取得したい場合は、オプションでロケールプロバイダを明示的に指定する必要があります。

```
initdb --locale-provider=icu --icu-locale=en
```

libcが提供するロケールとicuが提供するロケールの中に、同名のものが存在するようです。同名であっても提供元が異なるため、当然中身は異なります。照合順序の結果は同じにはなりません。

initdbを流した後にロケールを変更することはできません。createdbを流した後でも設定したロケールは変更できません。どうしても、ロケールを変更したい場合は、照合順序を使用して、クエリ単位で設定することになります。
Rustでcut/awk/grepを再構築：「xcut」というCLIツールを作った話

## はじめに

日常的にログやCSVのテキスト加工を行う中で、「cut」や「awk」「grep」を組み合わせるのが面倒だなと感じることが増えてきました。

- cutは柔軟性に欠ける
- awkは表現力は高いけど記述が複雑
- PowerShellでは思った通り動かない

そこで、Rustで「cutの拡張版」を自作しました。名前は `xcut` です。

---

## xcutとは？

Rust製のCLIツールで、以下の特徴があります：

- 列（カラム）の抽出が簡単
- 正規表現や論理式によるフィルタが書ける
- `--head` / `--tail` で行数制限できる
- 区切り文字を柔軟に指定できる
- 標準入力/標準出力に対応、PowerShellでも動く

---

## インストール（開発版）

### 1. GitHub Releases からダウンロード

1. 以下のリリースページを開きます：

   👉 https://github.com/kyotalab/xcut/releases

2. ご利用の OS に合わせてバイナリをダウンロードします（例：`xcut`）

3. ダウンロードしたバイナリに実行権限を与えます：

   ```sh
   chmod +x xcut
   ```

4. 任意のパスに移動（例：`/usr/local/bin`）：

   ```sh
   sudo mv xcut /usr/local/bin/
   ```

5. 正しくインストールされたか確認します：

   ```sh
   xcut --version
   ```

---

### 2. Homebrew でインストール（macOS / Linux）

Homebrew を使ってインストールすることも可能です。

```sh
brew tap kyotalab/xcut
brew install xcut
```

更新時は以下でアップグレードできます：

```sh
brew upgrade xcut
```
---

## 🧪 動作確認

以下のように実行して、ヘルプが表示されれば成功です：

```sh
xcut --help
```

---

## 使用例

### 1. 列の抽出

```bash
xcut --input file.txt --cols 1,3
```

### 2. フィルタ条件（正規表現 + 論理式）

```bash
xcut --filter 'col(3) == "INFO" && col(4) =~ "CPU"'
```

### 3. 区切り文字や最大分割数を指定して柔軟に加工

```bash
xcut --delim ',' --max-split 4 --cols 1,2
```

### 4. 最初と最後だけ抽出（head/tail）

```bash
xcut --head 5
xcut --tail 10
```

### 5. 出力をファイルに保存

```bash
xcut --output filtered.log
```

---

## 内部構成と工夫した点

- `clap` を使ったわかりやすいCLI引数設計
- `regex` + `evalexpr` による柔軟な条件式評価
- `VecDeque` を使ってtailを効率的に処理
- `anyhow` + `context()` で文脈のあるエラー処理
- `assert_cmd` でCLIテストも完備！

---

## ソースコード

GitHubはこちらです。Star歓迎です！

- GitHub: https://github.com/kyotalab/xcut
- ドキュメント: https://github.com/kyotalab/xcut#readme

---

## まとめ

CLIツールに少しでも触れている人には「cutの上位互換」として便利だと思います。

今後は以下も実装予定です：

- Windows PowerShellでの互換性強化
- `--replace` や `--sort` など加工系の追加
- crates.ioへの登録（`cargo install xcut`）

---

## おわりに

「cutでは物足りない」そんな方はぜひ試してみてください！

QiitaのコメントやGitHub Issueでのフィードバックもお待ちしています 🙏
Managed Microsoft AD 作成時所要時間

- オンプレミスで ActiveDirectory を使用している企業や組織は多いと思う。

**Managed Microsoft ADとは**
AWS Directory Service には、他の AWS サービスで Microsoft Active Directory (AD) を使用する複数の方法が用意されています。ディレクトリには、ユーザー、グループ、デバイスに関する情報が保存され、管理者はそれらを使用して情報とリソースへのアクセスを管理します。 は、クラウド内の既存の Microsoft AD または Lightweight Directory Access Protocol (LDAP) 対応アプリケーションを使用するお客様に、複数のディレクトリの選択肢 AWS Directory Service を提供します。また、ユーザー、グループ、デバイス、アクセスを管理するディレクトリーが必要な開発者に、その選択肢を提供します。

https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/what_is.html

- 実際手を動かしてみた


ディレクトリを作成すると作成に20～40分かかると表示

なぜこれだけの時間が必要とされるか？

Managed Microsoft AD 作成時の内部的な処理。
どのような内部処理を行っているかといった点は公開されていない。

**参考文書**
[1] - Getting started with AWS Managed Microsoft AD
https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html 
//================ (抜粋)
 Creating the directory takes 20 to 40 minutes. 
================//