OmniAICreator/Qiita-1.07M huggingface dataset:
モバイルアプリについて学ぼう（ネイティブアプリ）

さて、前回モバイルアプリには大きく分けて４種類あることが発覚しました。

- ネイティブアプリ
- PWA（プログレッシブウェブアプリ）
- ハイブリッドアプリ
- Webアプリ

https://qiita.com/masumi-s/items/6f56b9810c04f87fd947

これから数回に分けて、それらの違いについて学んでいきたいと思います。
今回はその中の「ネイティブアプリ」について学んでいきます。

# ネイティブアプリとは
特定のプラットフォーム（OS）向けに開発されたアプリケーションで、スマートフォンやタブレットなどの端末にインストールして利用するアプリです。
App StoreやGoogle Playなどのアプリケーションストアからインストールできるアプリがほとんどで、一般的に「アプリ」と呼ばれるものを指すことが多いです。

:::note info
OSとは
OSは「Operating System（オペレーティングシステム）」の略で、コンピューターを動作させるための基本ソフトウェアの事です。
OSの役割は管理や制御をすることで、ディスプレイやマウス・キーボードなどの機器を使用可能にしたり、プログラムを管理、制御を行い、人間がコンピューターを使えるようにする役割もあり、コンピューター自体を動かすのに必要不可欠な基本ソフトウェアです。

OSの代表的な例としては、下記があります。
- Windows
- MacOS
- iOS
- Android
:::

# ネイティブアプリの特徴
- <strong>カメラ機能</strong>
- <strong>プッシュ通知機能</strong>
- <strong>位置情報機能</strong>

カメラ機能の活用例：YouTubeやインスタなどの録画・撮影機能など
位置情報機能（GPS）の活用例：見守りアプリ、フィットネスアプリなど

ネイティブアプリはゲームや写真・画像の加工といったスマホやタブレットならではの機能を使ったサービスに適しています。

# 主な言語
ネイティブアプリの開発で使われている主な言語はこちらです。
使用した事ないので、言語についての説明は出来ませんが、それぞれの端末によって言語が異なる事がわかります。

- iOS    ：Swift、Objective-C、React Native、Flutter
- Android：Java、Kotlin、React Native、Flutter
- Windows：C言語、 C#、 C++、 Visual Basic.NET、Java﻿
- Mac    ：Objective-C、Swift、Java﻿

# メリット
- <strong>オフラインでも利用できる</strong>
一度端末にインストールされれば、オフライン環境でも利用可能です。
アプリケーションによってはオンラインでなければ利用できない物もありますが、必ずしもインターネット接続を行わなければ動作しないというわけではないので、インターネット環境が不安定な状態でも利用できるのが特徴です。

- <strong>動作が軽く、起動がスムーズ</strong>
- <strong>継続的な利用を促進できる</strong>
端末のホーム画面からワンタッチで起動できるため、手間や心理的なストレスがかからず、ユーザーに継続的な利用を促しやすいのです。
また、端末にインストールされるとユーザーが意図的に削除するまで画面に残り続けるので、利用頻度が高くなりやすいのも特徴です。

- <strong>端末の機能を使える</strong>
端末のOSに合わせてさまざまな機能を実装できるため、表現や利用の幅が広がりやすいです。
具体的には、自動でお知らせをしてくれるプッシュ通知や、位置情報・連絡先の反映など、端末本体に実装されている機能をそのまま利用できるので活用出来ます。

- <strong>アプリ内課金が利用可能</strong>
有料設定にするとストアを介して、課金による収益化が簡単に行えます。

# デメリット
- <strong>ユーザーが獲得しにくい</strong>
アプリケーションストアで検索してもらい、ダウンロード・インストールしてからようやく使えるようになるため、初回利用までのハードルが高くなり、新規ユーザーを取り込みにくいです。

- <strong>端末の性能によって機能やスピードに影響が出る</strong>
OSは定期的にアップデートされていくため、新しいバージョンに合わせることで、古いバージョンには対応できなくなってしまう場合があります。
そのため、端末の性能によって十分な機能を発揮することができず、本来の目的を果たせなくなってしまうケースもあります。

- <strong>開発コストや期間がかかる</strong>
iOS・Android OSの2つの環境に対応した専用アプリを開発しなければならないため、開発コストが高くなます。
また、各OSに適したプログラミング言語で開発するため言語を学ぶのに時間がかかります。

# 最後に
今回、「ネイティブアプリ」について調べることで、特定のデバイスで高速に動くように最適化されており、カメラやGPSのようなデバイス固有の機能を存分に活用している物だと知ることが出来ました。
次回は他のモバイルアプリについて調べてみたいと思います。
【学習】作成日時の表示について

## はじめに
アドベンドカレンダーの下記企画に参加したので、開発過程で成功したことを、一部紹介する形で記事を書きたいと思います。

https://qiita.com/advent-calendar/2024/engineering-careers-1

## 環境
Windows, WSL
Docker
Ruby 3.2.3
Rails 7.1.3
**認証機能にdevseを使用**

## どんな状態？
```
<div class="text-sm">作成日：<%= l post.created_at, format: :short %></div>
```
もともとはこのようなコードを入力していました。
ローカルでは「作成日：10/23 15:02」というような表示でした

## やりたかったこと
「作成日：2024/10/23 15:02」というように
年を入れたい！！**プチチャレンジスタート！！**


## やったこと
`config/locales/ja.yml`で以下追記
```
ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M"  # デフォルトのフォーマット
```

はじめ、これだけ追加して満足していました。
ですが、ローカルで確認したところ相変わらず変化なし

## なぜ？？
完全に見落としていた**format: :short**
これは短縮形のフォーマットになるそうで
改めて`config/locales/ja.yml`で以下追記
```
ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M"  # デフォルトのフォーマット
      short: "%m/%d %H:%M"        # 短縮フォーマット
      long: "%Y/%m/%d %H:%M"      # 長いフォーマット      
```
👆一応わかりやすいように全て追記。
やっとなぜダメだったのか理解した

そしてビューファイルの方も修正します

```app/views/posts/_post.html.erb
<div class="text-sm">作成日：<%= l post.created_at, format: :long %></div>
```

で「作成日：2024/10/23 15:02」という表示に！！



## さいごにまとめ
このコード何だろう。と思ったらすぐ調べるべし。
直ぐ違和感に気づけるようになりたいです。
今回の記事が何か参考になれば幸いです。
ラズパイからnode.jsでＰＣ起動

１．etherwakeでラズパイからＰＣ起動に成功しました。以下で問題無
https://qiita.com/m_sunafukin77/items/50a055ae0c99dfb8b6f8

２．node.jsのコマンド変わっている。
ていうか　導入の仕方が違う？　動けばいいか。
参考サイトから　導入しなおす。
https://zenn.dev/jun_eg/articles/b9b38239dfb841
```
#ダウンロード
wget https://nodejs.org/dist/v22.12.0/node-v22.12.0-linux-arm64.tar.xz
# 展開
tar xJvf node-v22.12.0-linux-arm64.tar.xz
#展開したファイルをコピー
sudo cp -r node-v22.12.0-linux-arm64/* /usr/local/
#不要なファイルの消去
rm node-v22.12.0-linux-arm64.tar.xz
rm -r node-v22.12.0-linux-arm64/
# 以下のコマンドでバージョンが表示されたらダウンロード完了！
node -v
npm -v
```
３．それでは　etherwakeのjsを作って動かしてみる。
```
sudo vim etherwake.js
```
内容は以下 これで2台のＰＣ(Windows、Linux Mint)が立ち上がる。
```js
const exec1 = require('child_process').exec;
exec1('sudo etherwake xx:xx:xx:xx:xx:xx', (err, stdout, stderr) =>{
  if (err) { console.log(err); }
  console.log(stdout);
});

const exec2 = require('child_process').exec;
exec2('sudo etherwake xx:xx:xx:xx:xx:xx', (err, stdout, stderr) => {
  if (err) { console.log(err); }
  console.log(stdout);
});
```
４．パスの確認
```
which node
which npm
```
５．実行
```
sudo node etherwake.js
```
６．ちなみにパスの全体確認は以下
```
echo $PATH
```
７．パスの追加は
```
export PATH=”$PATH:/home/pi”
```
８．全体を置き換える場合は。　
```
export path="/home/pi/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games"
```
共有ファイルに入れないを解決

今日の解決できたことは以下のこと

<img width=550 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/8b488cbe-7a05-df1b-2dc4-d241630d70e2.png">

※上記イメージはネットに落ちていたもの

<font color="red">**同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。サーバーまたは共有リソースへの以前の接続をすべて切断してから、再試行してください。**</font>

こちらに関する回答で参考にしたのが、

>「同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。」と表示される
>https://www.iodata.jp/support/qanda/answer/s30379.htm

**「注意事項は上から順番に行ってください。」です**

### ●対処1　Windows 資格情報を削除する

Windowsに記憶された資格情報を削除することで、共有フォルダーへ自動的にログオンされることがなくなります。

【資格情報とは？】
共有フォルダーに接続する際のユーザー名とパスワードを記憶した情報です。
資格情報が登録されていることで、指定の共有フォルダーにアクセスする際のユーザー名とパスワードの入力を省略することができます。

1.キーボードの［Windows］キーと［R］キーを同時に押して［ファイル名を指定して実行］画面を起動します。
2.名前欄に「control」と入力して［OK］をクリックし、「コントロールパネル」を開きます。
3.［ユーザーアカウント］→［Windows 資格情報の管理］の順にクリックします。
4.［Windows 資格情報］以下の表示を確認します。
　「192.168.0.200」や「landisk-xxxxxx」といった表記があった場合、クリックし、［削除］をクリックします。
　削除の確認画面が表示されますので、［はい］をクリックします。
5.ウィンドウをすべて閉じ、パソコンを再起動します。

### ●対処2　ネットワークドライブを切断する

Windowsに割り当てされたネットワークドライブを切断することで、共有フォルダーへ自動的にログオンされることがなくなります。

1.デスクトップ画面左下の［Windowsアイコン］上で右クリックし、［エクスプローラー］をクリックします。
2.左ペインより［PC］を探し、クリックします。
3.［ネットワークの場所］以下に表示されたネットワークドライブ上で右クリック後、［切断］をクリックします。
　※ネットワークドライブは、「disk1 (\\192.168.0.200) (Z:)」のような形式で表示されています。
4.ウィンドウをすべて閉じ、パソコンを再起動します。


以上で設定は完了です。



### ●対処3　パソコンの完全シャットダウンを行う

OSによっては、通常の再起動だけでは接続情報が残ってしまう場合があります。
以下手順で完全シャットダウンを行ってください。

1.[スタート]メニューを開き、[電源]をクリックします。
2.キーボードの［Shift］キーを押した状態で［再起動］をクリックします。
3.[オプションの選択]画面が開くので、[PCの電源を切る]をクリックします。（完全シャットダウン）
4.PCの電源が落ちたら、再度PCを起動します。

以上で完了です。
再度LAN DISKにアクセスし、ネットワーク資格情報画面が表示されるかご確認ください。
表示された場合は、アクセス権のあるユーザー情報を入力しアクセスしてください。


●対処4　Windows 資格情報を追加する

Windows資格情報を追加し、共有フォルダーへアクセスできるかお試しください。

1.キーボードの［Windows］キーと［R］キーを同時に押して［ファイル名を指定して実行］画面を起動します。
2.名前欄に「control」と入力して［OK］をクリックし、「コントロールパネル」を開きます。
3.［ユーザーアカウント］→［Windows 資格情報の管理］の順にクリックします。
4.［Windows 資格情報の追加］をクリックします。
5.情報を入力します。
　[インターネットまたはネットワークのアドレス]：LAN DISKのIPアドレス
　[ユーザー名][パスワード]：共有フォルダーにアクセスする際のユーザー情報

（例）LAN DISKのIPアドレスが「192.168.0.200」、ユーザー名が「abc」の場合

![スクリーンショット 2024-12-03 142703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/06304671-5bde-39b0-957a-6dcfb8cfc97c.png)


6.「OK」をクリックします。
7.ウィンドウをすべて閉じ、パソコンを再起動します。

以上で設定は完了です。

今回は３までやってつながりました。
特徴量エンジニアリング３日目

今日は下のurl部分を進めて行きます。

https://www.kaggle.com/code/ryanholbrook/clustering-with-k-means

教師なしアルゴリズムのクラスタリングについてのtutorialです。簡単に述べると、データ点を、その点が互いにどれだけ似ているかに基づいてグループに割り当てることです。多くの分析において地域別・年齢別・・・というようにセグメントに分けて分析していることを考えると直感的な理解ができるとおもいます。

tutorial上にある
![sr3pdYI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627091/a20cd10c-1dbd-1708-fed7-821701bbeb12.png)

が最もビジュアライゼーションされたものでしょう。図上で近い地点にあるデータ点を同じグループにまとめる(クラスタリングする)ことができれば非常にデータを分析するのに効果的です。
この先のtutorial部分でも言及されますが実際にはN次元のデータであったりすると図示するのが困難であったり、いくつのグループに分けるのがよいかという点で苦労があります。

（tutorialでも述べられているとおり、）一般にクラスタリングアルゴリズムであったり、ハイパーパラメータ（例：先程のグループ数のようなもの）をどのようにするのかがたくさんあります。tutorialではK-means法以外は登場しませんが、クラスタリングの一覧は次のscikit-learnの一次資料を確認してください。

https://scikit-learn.org/1.5/modules/clustering.html

scikit-learnではクラスタリング法が違っていても関数呼び出しの名前部分を少し変えるだけで統一的に取り扱うことができます。データによって最適なアルゴリズムは代わり、汎用的なアルゴリズムは存在しませんので、複数の方法を試してみましょう。

クラスタリングの一般的な使用方法を下に載せると、

```
# Xは何らかの元データ
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

# そのほかのクラスター法の例；階層的クラスタリングモデル
model = AgglomerativeClustering(n_clusters=3)

#dataは予測したいデータ
labels = kmeans.predict(data)
print(labels) 
```
となります。
find/grepコマンド

いつも忘れるのでfind/grepコマンドの使い方をメモ
筆者の環境は、Mac/Ubuntu

# find

例においてはfindについてはGNU（GNUはPOSIXと結構異なるので移植性を意識するならPOSIXの方がいいらしい）

```sh
echo $SHELL # /bin/zsh
type -p find # find is /usr/bin/find (シェル組み込みでない）
```

filename(つまり、pathの終端)で探す場合
```sh
find . -type f -name '*.c'
```
これだと、ファイル名でしか探せない

pathで探す場合(VSCodeのMacのcmd+p(search files by name)の挙動に近くなる)
最初の ./ と 最後の * が面倒だが、仕方ない
```sh
find . -type f -path '*hoge*'
```

regexでも同じくpathで探すが、こちらはregexなので、regexで書く
```sh
find . -type f -regex '.*/hoge/.*'
```

注意点
なお、シングルクォートで括らないと、SHELLが*を展開しようとして、マッチせずにエラーになる（ならない場合でも意図しない挙動になる）

```sh
find . -type f -regex .*/build/.*
zsh: no matches found: .*/build/.*
```

また、execオプションも使って、各pathに対してコマンドを実行できる(個人的には、execせずに結果を変数に入れたりして新しいコマンドをトップレベルで行いたいと思ってしまう)
```sh
find . -name "*.txt" -exec cat {} \;
```

なお、最後の\;は、必須らしい。;が必要で、このセミコロンはシェルの特殊文字なので、エスケープするためにバックスラッシュをいれる。

-ctime 作成日
-mtime 編集日
-atime 最終アクセス日

-1 1日前..現在
-2 2日前..現在
+1 過去永遠..1日前
```sh
find <path> -ctime -1
```

-cmin 作成分
-mmin 編集分
-amin 最終アクセス分
```sh
find <path> -cmin -30 # 30分前から現在
```

# grep
```sh
grep [オプション] '検索文字列' ファイル
grep -r "search_string" /path/to/directory
```

オプション
-i: ケースインセンシティブ
-r: 再帰
-E: regex
JS　2つ配列を結合し、重複を削除する方法

2パターンあります
2つの配列変数array1,array2を展開、重複削除、配列にまとめ直しを行います

①concatで配列を結合、new Setで重複削除、...スプレッド構文でまとめ直し
```
const combinedStores = [...new Set(array1.concat(array2))];
```

②...スプレッド構文と[]で配列を展開結合、new Setで重複削除、Array.fromでまとめ直し
```
const combinedStores = Array.from(new Set([...array1, ...array2]));
```
PgAdminでPostgreSQLを操作するために知っておきたいこと

# PostgreSQLでは大文字と小文字を区別する
データベース名、カラム名は大文字と小文字を区別します。

たとえば次のSQLを使った場合、

```
SELECT Name FROM Users WHERE Id = 1
```
実際は次のクエリを実行したことになります。
```
SELECT name FROM users WHERE id = 1
```

もし、大文字でUSERSを定義している場合、結果は実行エラーになります。

大文字と小文字を区別したい場合はダブルクオーテーションを使います。
```
SELECT "Name" FROM "Users" WHERE "Id" = 1
```

検索条件が文字列や日付の場合にはシングルクオーテーションを使います。
```
SELECT "Name" FROM "Users" WHERE "Name" = 'Taro'
```
```
SELECT "Name" FROM "Users" WHERE "CreateDate" > '2024-12-03'
```
ダブルクオーテーションを使うと列名と判断され、実行エラーになります。
エンジニア目線でStripe使いやすいなと思うところ、使いにくいなと思うところ

## 概要

1年前位にStripeを使ったプロダクトの作成に携わった。
その際に使いやすいなあと思ったところと若干わかりにくかったところを簡単にまとめてみる。

※1年経過しているので現状は変わっている可能性はあります。
※「使いにくいなと思うところ」は筆者の勉強不足の可能性があります。

## 使いやすいなと思うところ

### 主要な言語ごとにSDKが用意されている

Ruby、Python、PHP、Java、Node.js、Go、.NetでそれぞれSDKのパッケージがオフィシャルで用意されている。筆者はPHPのSDKを使って実装を行った。API提供だけではなくSDKが用意されていることで比較的自然に、気軽に実装する事ができる。
完全に全ての機能がSDKで担保されているわけではなかった気がするが、主要な機能はSDKが用意するメソッドで使うことができる。

### 決済処理で複雑なことをしなくていいならほぼノーコードで実装できる

Stripeには多様な決済フローに対応するため、色々な仕組みがある。
その中でいくつか制約はあるものの単純なものならノーコードで実装できる

https://docs.stripe.com/no-code

また、Stripe Checkoutという機能を使うとローコード（Stripeが発行する決済画面のURLを自アプリケーションに記載 + 決済完了後に戻って来る画面のURLの指定は必要）で支払い処理を実装する事ができる。

https://docs.stripe.com/payments/checkout

### SDKのドキュメントが見やすい

多分エンジニアが一番気にする部分だと思う。
かなりドキュメントは見やすいほうだと思う。

https://docs.stripe.com/api?lang=php

SDKパッケージの導入方法から、SDKをどうやってインスタンス化して、どのメソッドを呼び出せばどの処理を実行できるかが明確にかかれている。
コードも簡単にコピペできるようになっている。

### テスト環境が使いやすい

Stripeの管理画面側のアカウントを作るとテスト環境を使う事ができる。
もちろんテスト環境なのである程度の制約はあるが、本番環境にかなり近い状態でSDK・管理画面の機能を使うことができる。

### サポートチャットが使いやすい

実はこれを最も推したい
細かいことは下記の記事で記載させていただいた。

https://qiita.com/miriwo/items/bc9c2dc7ef39b9d14ad0

窓口の時間の制約はあるもの、サポートチャットが非常に使いやすい。
筆者が利用した時期は日本語によるカスタマーサポートチャット対応は平日日中時間帯のみだった覚えがある。
Stripeの日本語対応カスタマーサポートさんは日本人で非常にコミュニケーションが取りやすい。（海外の方が良くない言いたいわけでは一切ないです。あくまでもコミュニケーションの取りやすさでの比較。）

チャットだけではなく電話や、メールでもサポートしてくれる。
エンジニア的目線での質問にもかなり答えてくださったイメージがある。（「SDKのこのメソッドって〇〇の値を更新することってできますか？」などの質問にも、即返答は無いにしてもStripeのエンジニアさんに確認して返事をしてくれた。）

さらにStripeの管理画面側のアカウントにログインした状態でサポートチャットを利用すると固有の情報ベースで問い合わせする事もできる。これはテスト環境でも例外ではなく「決済ID」や「アカウントID」を伝えて状況把握や調査・アドバイスをくれる。
チャットでのやり取りもやり取り終了後にメールで送ってくれる。
本当に使いやすいので絶対に利用すべきだと感じた。

## 使いにくいなと思うところ

### ドキュメントの和訳や細かい情報の更新が間に合っていない

API・SDKのドキュメントは英語のみなのでまだ良いのだが、機能系のドキュメントは一部が日本語対応、一部が英語からの機械翻訳となっている。
機能系ドキュメントは仕様を固める段階でかなりお世話になることが多い。自身の理解能力が引くいことは否めないが、取っ掛かりの段階で難しさを感じてしまうと心理的障壁が上がる。
この辺はサポートチャットを積極的に活用することで解消しそう。
さらに、本当に細かい仕様でドキュメントの反映が間に合っていないところがあった。
この辺もサポートに問い合わせ無事解決できたのでちょっとでも疑問があったらすぐに問い合わせよう。

### 機能の熟知とAPI・SDKのリンクが最初はちょっと難しい

そもそもStripeにはかなり多くの機能がある。
やりたい決済方法が分かっていざ実装しようとしたときにどのSDKのメソッドをどの順番で実行すればいいかが若干わかりにくい。
一部は機能側のドキュメントにSDKドキュメントへのリンクがあるが全ての機能側のドキュメントをSDK側ドキュメントのメソッドレベルで記載するわけにもいかないはずなのでこのへんもサポートを活用して解決に至ろう。

### 複雑なことをやろうとするとロールバックが難しい

一度のトリガーで複雑な処理が行われる場合、ソースコード側はもちろんトランザクションを用い、全ての処理が1シーケンスで完了できるように担保する。
もちろんこのトランザクション処理の中にStripeの処理が挟まる。Stripeが用意した単一の決済処理をエンジニアが勝手にトランザクションで束ねているだけである。もちろんトランザクションを用いることはあまり考えられていない。
こうなると、ソースコード側でStirpeのどこまでの処理を実行して、どこで失敗したのかを保持し、Stripeの処理キャンセルのSDKを実行する必要がある。
単純なトランザクションではなく入れ子になったり、処理ステータスをコード側で担保する必要がある程度あるので若干の難しさがある。
更にちゃんと実装するならキャンセルのSDKの実行が失敗したときにどうするのかを考える必要もあり難しさもある。


## 参考文献

https://docs.stripe.com/api?lang=php

https://qiita.com/miriwo/items/bc9c2dc7ef39b9d14ad0
アクセシビリティにまつわるエトセトラ

本記事は、 [mediba Advent Calender2024](https://qiita.com/advent-calendar/2024/mediba) の5日目の記事になります。


令和6年（2024年）4月1日から、障害者差別解消法（障害を理由とする差別の解消の推進に関する法律）の改正により、国や地方公共団体などに義務付けられている合理的配慮の提供が、民間事業者にも義務化されました。
ウェブサイトの場合、JIS X 8341-3:2016に準拠したウェブサイトを構築し、ウェブアクセシビリティを確保することが求められます。

これまでテキストのコントラストや画像のalt属性には気を配っていましたが、改めてデジタル庁の「[ウェブアクセシビリティ導入ガイドブック](https://www.digital.go.jp/resources/introduction-to-web-accessibility-guidebook)」を読んだり、JIS X 8341-3:2016の達成基準を確認したところ、新たな気づきや初めて知ったことがありました。以下にいくつか挙げてみます。

## アクセシビリティは万人のためのもの

> アクセシビリティというと、障害者向けの対応というイメージを持つ人が多いかもしれません。

私自身、これまでは「障害を持つ人のためのもの」という認識がありましたが、「万人のためのもの」という考え方に目からウロコでした。アクセシビリティは「障害を持つ人でも利用できる」という付加価値ではなく、「誰もがアクセスできる」という基本的な前提であることに気付かされました。

## よくある誤解

> 文字サイズ拡大ボタンやカラーテーマ変更ボタンのような補助のための機能を設置すれば、アクセシビリティが向上できると誤解すること

> 機能自体は有用な場合もありますが、実際に文字を大きくしてサイトを閲覧する必要がある利用者や、色を変更してサイトを閲覧する利用者は、特定のサイトだけではなくすべてのサイトで同じ状態になっていることを望みます。そのため、利用者が使っているパソコンやスマートフォンなど、デバイス（そのOS）が提供している設定項目を自身の状況に応じて調整していることが多く、特定のサイトに付加された機能を積極的に使いたいわけではないのです。

私もこの点についてまんまと誤解していました。言われてみれば確かに、サイトごとに設定をしなければならないのでは、利用者にとって非常に手間がかかり鬱陶しいですよね。

## 音声・映像コンテンツに代替コンテンツを付与する

> 音声だけ及び映像だけ（収録済み）の達成基準（適合レベルA）
>
> 音声または映像コンテンツに、音声または映像以外の代替手段で理解できるコンテンツがある。たとえば、収録済みの音声のみの場合はテキストによる書き起こしが提供されている。収録済みの映像の場合は、テキストによる書き起こしか、映像の内容を説明する音声が提供されている。

> キャプション（収録済み）の達成基準（適合レベルA）
>
> 収録済みの音声コンテンツに字幕があり、聴覚障害のある人も内容を理解できる。

これまで音声や映像コンテンツをあまり扱う機会がなく、意識していませんでしたが、画像と同様に代替コンテンツを用意することは、確かに当然のことだと感じました。

## テキストのサイズ変更の達成基準（適合レベルAA）

> ブラウザの機能だけを用いて文字を200%まで拡大でき、文字が重なったり画面から見切れたりしない。

この200%という具体的な基準があることを初めて知りました。

## コントラスト(最低限レベル)の達成基準（適合レベルAA）

> テキストのコントラスト比を4.5:1以上にする。大きなテキスト（22ポイント(29px)以上、太字かつ18ポイント(24px)以上）の場合は、コントラスト比を3:1以上にする。

この点については以前から知っていましたが、当初はptとpxを同じものと誤解していました。29pxや24pxというと、かなり大きめの文字サイズですね。


---
アクセシビリティを正しく理解し、誰もがアクセスしやすいウェブサイトを作っていきたいですね。



---
現在medibaでは、メンバーを大募集しています。

[募集・応募ページ](https://www.mediba.jp/recruit)
medibaってどんな会社だろう？ と興味を持っていただいた方は、
カジュアル面談もやっておりますので、お気軽にお申込み頂ければと思います。
Cmake 文字化けが原因でerror C3688が出たときの対処法

whisper-rsをWindows環境のRust(MSVC)でビルドしようとしたらcmake中に以下のエラーが出た。

```bash
error C3688: invalid literal suffix '縲・'; literal operator or literal operator template 'operator ""縲・' not found
```

UTF-8を指定してcmakeしたいが、cmake自体がcargoで呼ばれているので、外から指定する必要がある。

# 直った

以下のようにしたら直った。

```powershell
$env:CMAKE_CXX_FLAGS = "/utf-8"
cargo run
```
CodeMirrorのlintパッケージの使い方

# 概要

CodeMirrorのlintパッケージの使い方です。サーバサイドでチェックした結果を表示する際の参考にどうぞ。

# package.json

```
"dependencies": {
  "codemirror": "^6.0.1",
  "@codemirror/commands": "^6.5.0",
  "@codemirror/legacy-modes": "^6.4.0",
  "@codemirror/lint": "^6.7.0",
  "@codemirror/state": "^6.4.1"
},
```

# 実装

`basicSetup`を指定しておくと行番号表示など基本的な拡張が使えます。

``` JavaScript
import { EditorState } from "@codemirror/state";
import { EditorView, basicSetup } from "codemirror";
import { keymap } from "@codemirror/view"
import { linter, forceLinting } from "@codemirror/lint";
import { indentUnit } from "@codemirror/language";
import { indentWithTab } from "@codemirror/commands";

const lintExtention = linter(view => {
  return /* ここでAPIで取得したlint結果を返す */;
});

const editorState = EditorState.create({
  doc: '',
  extensions: [
    updateListener,
    basicSetup,
    lintExtention,
    keymap.of([indentWithTab]),
    indentUnit.of("    "),
  ],
});

const editor = document.querySelector('#editor');
const editorView = new EditorView({
  state: editorState,
  parent: editor,
});
```

# 変更の検知

`docChanged`が`true`の場合にテキストが変更されています。

``` JavaScript
const updateListener = EditorView.updateListener.of((update) => {
  if (!update.docChanged) {
    return;
  }
  const newDocument = update.state.doc.toString();
  // ここでAPI呼出すればOK
  return;
});
```

# linterに指定した関数で返す内容

以下のようなオブジェクトの配列をreturnで返します。

``` JavaScript
{
  from: /* 開始位置 */,
  to: /* 終了位置 */,
  message: 'メッセージ',
  severity : /* "error", "hint", "info", "warning"のどれかを指定 */,
}
```

行番号から位置を取得するのは[Textクラスのline関数](https://codemirror.net/docs/ref/#state.Text.line)を使えばできます。

``` JavaScript
editorView.state.doc.line(/* 行番号を指定 */);
```

# 更新する

以下のようにforceLintingを呼び出すことで表示を更新できます。

``` JavaScript
forceLinting(editorView);
```
Shell ScriptにおけるSignal Handlerの書き方

ShellスクリプトでSignal Handlerを実装することで、スクリプトの実行中に特定のシグナルを受信した際の動作を制御できます。
例えば、`Ctrl+C`による割り込み (SIGINT) を処理してクリーンアップ処理を実行したり、スクリプトを安全に終了させたりすることができます。

この記事では、`trap`コマンドを使ってSignal Handlerを定義する方法と、
具体的な例をいくつか紹介します。

## `trap` コマンドの基本

`trap`コマンドは、シグナルを受信した際に実行するコマンドを指定するために使用します。基本的な構文は以下の通りです。

```bash
trap 'command' signal
```

* `command`: シグナルを受信した際に実行されるコマンド。クォートで囲む必要があります。
* `signal`: 処理対象のシグナルの名前または番号。複数のシグナルをスペース区切りで指定することも可能です。

## シグナルの例

よく使われるシグナルには以下のようなものがあります。

* **SIGINT (2):** Ctrl+Cによる割り込み。
* **SIGTERM (15):** `kill`コマンドによる終了要求 (デフォルト)。
* **SIGHUP (1):** 制御端末の切断。
* **SIGUSR1 (10):** ユーザー定義シグナル1。
* **SIGUSR2 (11):** ユーザー定義シグナル2。
* **EXIT (0):** スクリプトの終了時。


## 使用例

### 1. Ctrl+Cによる割り込みを処理する

```bash
#!/bin/bash

trap 'echo "Ctrl+Cが押されました。クリーンアップ処理を実行..."; exit 1' INT

# 時間のかかる処理
for i in {1..10}; do
  sleep 1
  echo "処理中... $i"
done

echo "処理完了"
```

このスクリプトでは、`Ctrl+C (SIGINT)` を受信すると、`"Ctrl+Cが押されました。クリーンアップ処理を実行..."` が出力され、スクリプトは終了コード1で終了します。 `sleep`コマンドで模擬された時間のかかる処理中でも、`Ctrl+C`で中断できます。

### 2. 複数のシグナルを処理する

```bash
#!/bin/bash

cleanup() {
  echo "クリーンアップ処理を実行..."
  rm -f /tmp/tempfile.txt
}

trap cleanup INT TERM EXIT

touch /tmp/tempfile.txt

# 時間のかかる処理
for i in {1..10}; do
  sleep 1
  echo "処理中... $i"
done

echo "処理完了"
```

この例では、`cleanup`という関数を定義し、SIGINT、SIGTERM、EXITの3つのシグナルに対して同じ処理を実行するように設定しています。 これにより、`Ctrl+C`、`kill`コマンド、通常のスクリプト終了時にクリーンアップ処理が実行されます。

### 3. シグナルを無視する

```bash
#!/bin/bash

trap '' INT

# Ctrl+Cを無視する
while true; do
  sleep 1
  echo "処理中..."
done
```

この例では、`trap '' INT`とすることで、SIGINTを無視するように設定しています。 このスクリプトは`Ctrl+C`では停止できません。別のシグナル（例: `kill -9 <PID>`) を送る必要があります。


### 4. デフォルトの動作に戻す

```bash
#!/bin/bash

trap 'echo "SIGINT received"' INT

sleep 5  # 最初はハンドラが実行される

trap - INT # デフォルトの動作に戻す

sleep 5 # 次のSIGINTはスクリプトを終了させる
```

`trap - シグナル` とすることで、指定したシグナルに対するハンドラを解除し、デフォルトの動作に戻すことができます。

これらの例を参考に、`trap`コマンドを使ってスクリプトの挙動をカスタマイズし、より堅牢なスクリプトを作成しましょう。 シグナルハンドラは、一時ファイルの削除、リソースの解放、ログの書き込みなど、様々なクリーンアップ処理に活用できます。


## まとめ

`trap`コマンドを使用することで、Shellスクリプトでシグナルを処理し、予期せぬイベントに対する適切な対応が可能になります。 シグナルハンドラを適切に実装することで、スクリプトの安定性と信頼性を向上させることができます。
ChatGPTで学ぶデザインパターン（目次）

### はじめに
この記事は目次的な投稿になります。

- きっかけ
    新卒入社した会社で、主にJavaを中心に開発をしてきました。新しいプロジェクトへ参画した際に、テックリーダーと、メンバーが**デザインパターンを通して会話をしている**のを見て、「あうんの呼吸」のようなものを感じました。
    自分も開発者としてこのコミュニケーションに参加したいと思いデザインパターンを勉強することにしました。
    
    
- ChatGPT
    ChatGPTの回答には間違いもあるという前提です。ですが、何よりサンプルコードを気兼ねなく量産させることができること、いくらでも深堀できること、という点で学習ツールとして優れていると感じています。
    
- 進め方    
    ChatGPTにおすすめのデザインパターンを相談し、その一覧を順に学習していきます。連載形式で学習したことを投稿することで、アウトプットの練習もできたら、と考えています。
    
今年の目標が、「Qiitaに最低1回でも投稿する」ことでした。12月になってしまいましたが、目標の達成もかねてまずは１デザインパターンずつ投稿していこうと思います。

### 環境
以下の環境で、サンプルコードを実際に動かしながら学習します。
- ChatGPT：無料アカウント
- OS：Windows11
- エディタ：VSCode
    - 拡張機能：[Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)
- JDK：OpenJDK "11.0.11”

### ChatGPTに相談

#### 相談内容
> Java言語でデザインパターンを学びたいです。
よく使われるものを、簡単なものから徐々にレベルを上げる形で学びたいです。
以下のような内容で授業をしてもらえませんか？
・デザインパターンの名前
・概要の説明
・ユースケースや、例え話（こんなときに利用する）
・サンプルコード
まずは上記内容に即した対象となるデザインパターンの一覧を示せますか？
> 

#### ChatGPTの回答
> Javaで学ぶおすすめのデザインパターン一覧（難易度順）
>
>【初級編】基礎から学べるシンプルなパターン
Singleton（シングルトンパターン）
Factory Method（ファクトリーメソッドパターン）
Builder（ビルダーパターン）
Prototype（プロトタイプパターン）
Adapter（アダプタパターン）
>
>【中級編】少し複雑なパターンで応用力をつける
Observer（オブザーバーパターン）
Decorator（デコレータパターン）
Strategy（ストラテジーパターン）
Command（コマンドパターン）
Facade（ファサードパターン）
>
>【上級編】システム全体を考慮するパターン
Composite（コンポジットパターン）
Proxy（プロキシパターン）
Mediator（メディエータパターン）
State（ステートパターン）
Visitor（ビジターパターン）
>
>次に、これらのパターンを1つずつ学ぶ形で進めますが、まずSingletonパターンから始めましょうか？
>

ChatGPT先生はもうやる気十分。頑張ろう！

### デザインパターン
デザインパターンごとの投稿を、リンクしていきます。
[1. シングルトンパターン](https://qiita.com/oqnoqn/items/91414dd25803747456cf)
Openshift Lightspeedを試してみた

# 初めに
この記事の投稿時点(2024/12/03現在）、Openshift LightspeedはTechnology Previewの段階のため、正式版がリリースされた場合に、下記で記載した内容が合わなくなる可能性がございます。

# 1. Openshift Lightspeedとは
OpenShift Lightspeed は、OpenShift Web コンソールに統合された生成 AI ベースの仮想アシスタントです。使用できるLLMの環境としては以下のものがあります。
・IBM WatsonX
・Microsoft Azure OpenAI
・OpenAI

# 2. 画面紹介（デモ）
1. Openshift Lightspeedを導入すると、WEBコンソールの右下に、「Lightspeed」のアイコンが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/613163d5-069d-f42d-89cb-936eabd2c2fe.png)

2. そのアイコンをクリックすると、チャットボットの画面が開きます。テキストボックスにプロンプトを入力するとその回答が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/b6e85c80-400d-10dc-e7b9-fe8762cf2511.png)
下記画面では、「What is Openshift imagestream used for ?」とプロンプトに入力した結果を表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/b7ccedf3-1453-28df-5316-4aec4a7c214e.png)

3. 一部のリソース（Deployment,Pod,Service等々）の詳細画面で、チャット画面を開くと、プロンプトにそのリソースに関するコンテキストを追加することができます。
テキストボックスの左の「＋」ボタンを押すと、いくつかのリストが出てくるので、その中から選択すると、質問のコンテキスト情報として追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/c82a316c-2187-b62a-1865-871f85f81c6f.png)


# 3. 導入手順（概要）
1. OperatorHUbから「OpenShift Lightspeed Operator」を導入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/41af07af-218d-87f4-5f8a-aba141ead3f6.png)

2. LLMサービス(プロバイダー）に接続するためのAPIキー情報を記載したSecretを作成します。ここではIBM WatsonXの例を示します。
```apikey-secret.yaml
apiVersion: v1
data:
  apitoken: <your_api_token>
kind: Secret
metadata:
  name: watsonx-api-keys
  namespace: openshift-lightspeed
type: Opaque
```
※<yout_api_token>はIBM Cloud上で取得したAPIキーをbase64エンコード化したものを指定してください。

3.LLMサービス（プロバイダー）の情報と使用するモデルを指定した、OLSConfigというカスタマーリソースを作成します。ここではIBM WatsonXのgraniteモデルを使用した例を示します。
```config-cr.yaml
apiVersion: ols.openshift.io/v1alpha1
kind: OLSConfig
metadata:
  name: cluster
spec:
  llm:
    providers:
      - credentialsSecretRef:
          name: watsonx-api-keys
        models:
          - name: ibm/granite-13b-chat-v2
        name: myWatsonx
        type: watsonx
        url: 'https://jp-tok.ml.cloud.ibm.com'
        projectID: a285d952-2107-4cef-ad20-606ef8f21871
  ols:
    defaultModel: ibm/granite-13b-chat-v2
    defaultProvider: myWatsonx
---
Pythonの文書画像解析・OCRライブラリ，YomiTokuを試してみる

## はじめに
Pythonで利用できるKotaro Kinoshita氏開発のOCRライブラリ，「YomiToku」が公開されていたので軽く触りつつ使い方をまとめてみます．

## YomiTokuとは
### 簡単な説明
- 日本語の文書画像解析に特化したPyhonのOCRライブラリ
- ローカルサーバーでPDFや文書画像の解析・表の構造解析・レイアウト解析が可能
- 解析結果はHTML・CSV・JSON・Markdownといった形式でエクスポート可能
- 2024年12月3日現在，非商用での個人利用・研究目的の利用は自由（商用利用は別ライセンスのため要相談）

### GitHubリポジトリ
https://github.com/kotaro-kinoshita/yomitoku

## 実際に使ってみる
Google Colabで実行します

### YomiTokuのインストール
```shell-session
!pip install yomitoku
```

### 文書画像の準備
適当な文書画像を準備し，`sample.jpg`という名前でGoogle Colabにアップロードします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619955/b9a4b1cb-3e50-0f21-4ad2-bfa4607bbff1.png)

- **sample.jpg**
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619955/56276fca-0530-0df2-9f8b-9447e45e8bf3.jpeg)

### 実行方法
公式ドキュメントによると，以下のコマンドで実行できるようです．
```shell
yomitoku ${path_data} -f md -o results -v --figure
```

- `${path_data}` 解析対象の画像が含まれたディレクトリか画像ファイルのパスを指定．
- `-f`, `--format` 出力形式のファイルフォーマットを指定．(対応フォーマット：json・csv・html・md)
- `-o`, `--outdir` 出力先のディレクトリ名を指定．存在しない場合は新規で作成される．
- `-v`, `--vis` 解析結果を可視化した画像を出力．
- `-d`, `--device` モデルを実行するためのデバイスを指定．gpu が利用できない場合は cpu で推論が実行される．(デフォルト：cuda)
- `--ignore_line_break` 画像の改行位置を無視し，段落内の文章を連結して返す．（デフォルト：画像通りの改行位置位置で改行）
- `--figure_letter` 検出した図表に含まれる文字も出力ファイルにエクスポート．
- `--figure` 検出した図・画像を出力ファイルにエクスポート．(html と markdown のみ)

### OCRの実行
今回はMarkDownファイルで出力してみます．
```shell
!yomitoku /content/sample.jpg -f md -o results -v --figure
```
```shell
2024-12-03 03:14:55,710 - yomitoku.base - INFO - Initialize TextDetector
2024-12-03 03:14:56,470 - yomitoku.base - WARNING - CUDA is not available. Use CPU instead.
・
・
・
2024-12-03 03:16:19,539 - yomitoku.cli.main - INFO - Output file: results/content_sample_p1.md
2024-12-03 03:16:19,541 - yomitoku.cli.main - INFO - Total Processing time: 79.42 sec
```
大体80秒ほどかかりました．

### 実行結果
- ```md:content_sample_p1.md
    ·土·日曜日·夏休みは遅休です。
    
    |元 地||||||||||
    |-|-|-|-|-|-|-|-|-|-|
    |||7:17||9:12|11:22|||15:45|17:30|
    |病院 前||7:26||9:21|11:31|||15:54|17:39|
    |フェリーターミナル着||7:27||9:22|11:32|||15:55|17:40|
    
    |香深~桃岩登山口~香深 5/1~9/15まで||||
    |-|-|-|-|
    |停\便|1|2|3|
    |フェリーターミナル発|8:40|11:34|13:25|
    |病 院 前|8:41|11:35|13:26|
    |着発<br>桃岩登山口|8:48|11:42|13:33|
    ||8:50|11:44|13:35|
    |病院 前|8:57|11:51|13:42|
    |フェリーターミナル着|8:58|11:52|13:43|
    
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619955/4ef0cfff-3fb8-b8ab-df4e-3537659c3595.png)


- **content_sample_p1_layout.jpg**
    ![content_sample_p1_layout.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619955/60ebbb67-1e59-2769-4ad1-d4ac374263ad.jpeg)

- **content_sample_p1_ocr.jpg**
    ![content_sample_p1_ocr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619955/cd3ccc9a-519a-6a35-83c7-468fe954c0ad.jpeg)


「香深〜桃岩登山口〜香深」の「〜」を半角チルダと認識したことでマークダウンのレイアウトが若干崩れてしまっていますが，かなり高い精度で文字の認識ができています．

特に「フェリーターミナル」は半角に近いサイズの文字であるにもかかわらず問題なく認識できています．すごい．

## おわりに
今回そこそこトリッキーなレイアウトの文書の解析を行いましたが，かなり精度良く文字の認識ができていました．今後はPDF出力された文書ファイルのレイアウト解析なんかで積極的に使ってみようと思います．
Cloud DNS でサブドメインを委任してみた

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki)です。

弊社では検証作業などを目的にドメインを取得して検証環境として利用したりする文化？があります。

といっても新規ドメインが取りたいわけではなく、どちらかと言うと検証に使えて**煩雑な手続きが不要**で**DNSレコードもセルフで設定できる**ドメインが欲しいわけです。

サブドメインで事足りるなら委任されたゾーンを一度作れればその後は容易に作成できるのでその内容を記事にしてみます。

:::note warn
本記事は2024年11月29日ごろに作成しております。引用している内容は執筆時点のものとなります。
:::

:::note warn
本記事でのドメインは架空のものです。
:::

## お困りごと

- 検証用にドメインを取得したりするケースがあるが、新規ドメインが必要な要件ではない
- ドメイン取得のコストも減らせるなら減らしたい
- どこかの部門管理のドメインに間借りさせてもらうのも有りだけど、めんどうなら積極的に頼みたいわけでもない

## イメージ

そんなわけで以下のようなものをイメージしました。

- 親ドメインから委任してもらうサブドメイン
  ```gc.hoge.com```
- サンドボックス環境管理用
  ```sandbox.gc.hoge.com```
- 検証環境
  ```xyz.sandbox.gc.hoge.com```

検証環境のゾーンおよびリソースレコードを検証を行う部門側で管理する形です。

## つくってみた構成

できたのがこちら。

![Cloud DNSでサブドメを利用した検証環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/46edfa3f-a05e-672e-e298-8bc7f37b8aea.png)

**この構成のポイント**

- （図右の）Your Project が検証者が使用するプロジェクトです
- Cloud DNS でゾーンを作成すると NS レコードが自動的に作成されます（図右の紫のレコード）
- 作成された NS レコードを上位階層のゾーン（図中央下段）に追加することでサブドメインを委任しています

実施したこと具体的に記載すると以下になります。

  1. xyz.sandbox.gc.hoge.com ゾーンを作成 [検証者]
  2. sandbox.gc.hoge.com ゾーンに生成された NS レコードを反映する [サンドボックス環境管理者]
  3. 委任完了

他のサブドメインで検証をする場合は同様に行えばOKです。

2 のレコード反映がめんどうなやり取りになったら本末転倒ですが、Terraform などで反映する NS レコードをプルリクもらう形にしたりすればよりよい感じに運用できそうですね。

※ 図中央の上・下段のゾーン作成とオレンジと青色のレコード追加は初回のみ設定します。行っていることは前述の内容と同様にサブドメインを委任しています。

## 動作確認

:::note warn
本記事でのドメインは架空のものです。応答の例としてお読みください。
:::

```
ishizeki (arm64):~$% dig xyz.sandbox.gc.hoge.com. NS

; <<>> DiG 9.10.6 <<>> xyz.sandbox.gc.hoge.com. NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25113
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;xyz.sandbox.gc.hoge.com.	IN	NS

;; ANSWER SECTION:
xyz.sandbox.gc.hoge.com.	21600 IN NS	ns-cloud-d4.googledomains.com.
xyz.sandbox.gc.hoge.com.	21600 IN NS	ns-cloud-d1.googledomains.com.
xyz.sandbox.gc.hoge.com.	21600 IN NS	ns-cloud-d2.googledomains.com.
xyz.sandbox.gc.hoge.com.	21600 IN NS	ns-cloud-d3.googledomains.com.

;; ADDITIONAL SECTION:
ns-cloud-d4.googledomains.com. 15732 IN	A	216.239.38.109
ns-cloud-d1.googledomains.com. 15732 IN	A	216.239.32.109
ns-cloud-d2.googledomains.com. 15732 IN	A	216.239.34.109
ns-cloud-d3.googledomains.com. 15731 IN	A	216.239.36.109

;; Query time: 165 msec
;; SERVER: 10.150.253.201#53(10.150.253.201)
;; WHEN: Mon Sep 30 10:52:22 JST 2024
;; MSG SIZE  rcvd: 244

ishizeki (arm64):~$%
```

HEADER の status が NOERROR で正常な応答であることが確認できました。
また ANSWER SECTION で NS レコードの名前解決がされていることが確認できました。

## この構成の利点と気になるところ

- ゾーンの管理を検証者が行えるためレコード追加などセルフで対応できる
- 検証に利用するゾーンを作成し、ネームサーバーの委任を依頼をするだけ
- 委任する分ドメイン名が長くなる

## まとめ

思いつきで作ってみたので運用していく中で課題もでてくるかもしれませんが、1 つのアイデアとして役に立つことがあれば幸いです。

## 留意事項

Cloud DNS へ親ドメインを移行しようとした際、サブドメインで5つのシャードが割り当て済み（使用中）だと、親ドメインのゾーンが作成できません。その場合はシャードの解放が必要になります。
回避するには Cloud DNS に親ドメインのゾーンを作成しておく必要があります。
詳細についてはドキュメントをご確認ください。

[クォータと制限  |  Cloud DNS  |  Google Cloud](https://cloud.google.com/dns/quotas?hl=ja#name-server-limits)
if文、case文の戻り値について

## はじめに
if文、case文の戻り値について、いろいろ。

## 環境
Ubuntu20.4
Ruby3.3.5

## 内容

三項演算子の戻り値をif文の戻り値にすることもできます。

```hoge.rb
def test_if(kbn, cnt)
    res = if kbn == 1
        (cnt == 0) ? "hoge1" : "hoge2"
    end
    puts res
end

test_if(1, 0)               # hoge1
test_if(1, 1)               # hoge2
```

三項演算子の戻り値をcase文の戻り値にすることもできます。

```hoge.rb
def test_case(kbn, cnt)
    res = case kbn
        when 1 then (cnt == 0) ? "hoge1" : "hoge2"
    end
    puts res
end

test_case(1, 0)　　　　　　　　# hoge1

test_case(1, 1)　　　　　　　　# hoge2
```

複数の値を戻り値にしたい場合は配列で渡せばOK。

```hoge.rb
def test_if(kbn)
    res1, res2 = if kbn == 1
        ["hoge1", "hoge2"]
    end
    puts res1 + res2
end

test_if(1)　　　　　　　　　　　# hoge1hoge2
```

配列で渡して配列で受け取ることもできます。

```hoge.rb
def test_if(kbn)
    res = []
    res = if kbn == 1
        ["hoge1", "hoge2"]
    end
    puts "#{res}"
end

test_if(1)　　　　　　　　　　　# ["hoge1", "hoge2"]
```

ハッシュで渡すこともできます。

```hoge.rb
def test_if(kbn)
    res = {}
    res = if kbn == 1
        {hoge1: "hoge1", hoge2: "hoge2"}
    end
    puts "#{res[:hoge1]}"
    puts "#{res[:hoge2]}"
end

test_if(1)　　　　　　　　　　　　# hoge1
　　　　　　　　　　　　　　　　　 # hoge2
```

三項演算子の前後に固定の文字列を追加することもできます。

```hoge.rb
def test_sannkou(kbn)
    puts "先頭に追加 " + "#{(kbn == 1) ? "hoge1" : "hoge2"}" + " 行末に追加"
end
test_sannkou(1)                 # 先頭に追加 hoge1 行末に追加
test_sannkou(2)                 # 先頭に追加 hoge2 行末に追加
```
OSSなBPMSツールCamundaをローカル起動しAPI疎通確認まで試してみた

## はじめに
参画中のプロジェクトでCamundaを利用する可能性があるので、触りながら理解を深めるためにまずは、簡単な動作確認まで行いました。

## 環境構築

まずは、Dockerを用意します。手順は以下を参照。（バージョンだけ最新に読み替えてください）

https://qiita.com/ryotaro76/items/fa65d5bb9eab800a662f

Docker imageをpullします。

```terminal
docker pull camunda/camunda-bpm-platform:latest
```

imageを立ちあげます。

```terminal
docker run -d --name camunda -p 8080:8080 camunda/camunda-bpm-platform:latest
```

以下にアクセスする。

http://localhost:8080/camunda-welcome/index.html

以下画像のように表示されればここまでは問題なしです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/b7ded03d-c6e6-eebf-d33b-3da07bcbd95c.png)

アカウント名：demo
パスワード:demo
が初期で用意してありますので、「Tasklist」をクリックしてログインしてみましょう。

テストデータとして既にタスクが登録されていたりして大まかな操作はキャッチアップ出来ますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/60329003-8f55-82b1-6a33-74267961590c.png)

## REST APIを試してみる

エンドポイントは以下

```terminal
http://localhost:8080/engine-rest
```

以下公式リファレンス参考

https://docs.camunda.org/manual/7.3/api-references/rest/#overview

ユーザの数を取得するuser/count を呼び出してみます。

```terminal
curl http://localhost:8080/engine-rest/user/count

// {"count":4}
```

うん。疎通確認もOKですね。

## おわりに
次回以降、BPMN作成してデプロイしたり。フロントアプリと連携してみたり。色々と触っていこうと思います。
🎉 Exciting News! The AWS Certified AI Practitioner (AIF-C01) Exam is Now Available on Our Website! 🎉

![AWS Certified AI Practitioner AIF-C01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442951/5d7d66e8-0b08-1a44-0f34-6d05844ec6f8.jpeg)

Source: https://awslagi.com/course/aif-c01/

🚀 Stay Ahead in the World of AI with AWS Certification!
We’re thrilled to announce that the AWS Certified AI Practitioner AIF-C01 exam resources are now live on our platform. This is your chance to elevate your career in Artificial Intelligence and Machine Learning, leveraging AWS's cutting-edge tools and services.

🌟 What You’ll Gain:

Master AI and ML Concepts: Build a strong foundation in AI and machine learning, specifically tailored for AWS services.
Get Recognized Globally: Stand out in the tech industry with a globally recognized AWS certification.
Open Career Opportunities: Gain credibility to land high-demand roles in AI/ML development.
📝 What’s Included in Our Resources?

Comprehensive practice questions.
Up-to-date exam materials.
Detailed explanations verified by AWS experts.
📚 Why Choose Us?

High-quality content curated by IT professionals.
Free access to exam materials for a limited time.
Continuous updates to align with the latest AWS standards.
👉 Get Started Today!
Visit our website now to access the new AWS Certified AI Practitioner AIF-C01 exam materials and prepare to ace your certification!

📌 Don’t miss this opportunity to accelerate your journey in the AI world. Share this post to spread the word and invite your friends to join the learning revolution!

#AWS #AIFC01 #AWSAIPractitioner #Certification #AI #MachineLearning #TechCareer
AKS or Container Apps

フリーランスエンジニアの[東](https://x.com/roulgonzaress)と申します。
現在は、[株式会社ギブリー様](https://note.com/givery_saiyo/n/neb40f30dc4f2)でお仕事を頂いております。
ここ、4年程は、Kubernetes を活用したプロジェクトに携わらせて頂いております。
※本記事は、MS Copilot で下書きしています。

Kubernetesを利用するには、
kubeadm等を利用してオンプレで構築
EKS、AKS、GKEなどのKubernetes as a Serviceの利用
ECS、Container Apps などのKubernetes as a Serviceをラップしたサービス
があると思います。

AKSとContainer Appsの比較図
![ca_aks.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/8575d2f1-6c3d-6c3c-1f6a-9ae69238d09a.jpeg)

## AKS
Azure 上で Kubernetes を簡単にデプロイ、管理できるサービス
- 高い柔軟性: Kubernetes のすべての機能を利用できるため、複雑なワークロードに対応可能
  - Istio、AlgoCDなどの拡張アドオン的なものを自由にインストール出来ます。
- セキュリティ: EntraID と統合されており、セキュリティが強化
  - Kubernetes RBACをEntraIDで認証・認可に利用することができます。
- 管理: KubeAPIなどの管理が不要に
  - バージョン管理、ノードOSへのパッチの適用有無などは判断する必要はありますが、KubeAPIなどの管理は不要のためオンプレに比べると運用負荷は低いと考えております。

## Container Apps
Container Apps は、Azure 上でコンテナアプリケーションを簡単にデプロイ、スケーリングできるサービス
- シンプルさ: コンテナ化されたアプリケーションを簡単にデプロイできるため、初心者にも使いやすい
- スケーラビリティ: 自動的にスケーリングし、負荷に応じてリソースを調整
- コスト効率: リソースの使用を最適化し、コストを削減

## 比較ポイント
| 特徴            | AKS        | Container Apps |
|-----------------|------------|----------------|
| 柔軟性　　　　　 | 高い        | 中      　　　 |  
| 管理の容易さ　　 | 中　        | 高い           |
| セキュリティ　　 | 高い        | 中             |
| スケーラビリティ | 高い        | 高い           |
| コスト　　　　　 | 高い        | 高い           |

## Container Apps の構成
- Container Apps は依存関係として Container Apps Enviroment があります。
- Container Apps Enviroment がKubernetesでのマスターノード、ワーカーノードを提供するような形
- Container Apps が KubernetesのDeployment, Service に該当するような形
- シークレットをKey Vault に格納することが可能
  - AKSに比べて、Secret Manager, CSIドライバーを気にしなくても格納出来るので、管理面が簡略化されています。

Container Apps 設定画面
![ca_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/41d38fee-4100-9767-bd53-6e28b20830e0.png)
![ca_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/b10c693f-1670-4502-bd1a-19a73973b456.png)


どちらを選ぶべきか？\
AKS は、高い柔軟性とセキュリティが求められる複雑なワークロードに適しています。
一方、Container Apps は、シンプルでコスト効率の良いスケーラブルなアプリケーションに適しています。
また、バージョンアップの時期などをコントロール出来るのはAKSになります。

## 結論
どちらのサービスも優れた選択肢ですが、プロジェクトの要件に応じて選ぶことが重要です。
AKS は高度な機能が必要な場合に、Container Apps はシンプルでコスト効率の良い場合に適しています。

個人的には、AKSを利用していた環境ではアップグレード戦略、夜間にアップグレード作業を行ったりが必要だったので
要件が満たせるのであれば Container Apps の法が運用負荷も低くて良いかなと思っております。

## 参考
[https://learn.microsoft.com/ja-jp/azure/container-apps/compare-options](https://learn.microsoft.com/ja-jp/azure/container-apps/compare-options)\
[Container AppsでGPUが利用可能になりました。](https://learn.microsoft.com/ja-jp/azure/container-apps/gpu-image-generation)
X（Twitter）で似た内容（同じ意見）ばかりが目に付く様になったが。。

## Xに投稿すると似たポストやユーザばかりが表示されてしまう。


:::note info
原因：<br>これはXに実装されたGrokという対話型AIの学習効果によるものです。<br>またこのGrokはデフォルトで機能しています。
:::

:::note info
Grokとは：<br>イーロンマスクによって設立されたxAIによって開発された、大規模言語モデル（LLM）の対話型人工知能チャットボットであり<br>全投稿データをリアルタイムに学習して関連する投稿をサーチしています。
:::
## でもたまには違う意見やアンチな情報も一応読んでみたいし、誹謗中傷者がいるか気になるのでこの機能を外したい。

:::note info
解除：<br>このGrokの機能をオフって投稿の範疇を広めたい時は以下の手順で可能です。<br>メニューから<br>[プライバシーと安全] → [データ共有とカスタマイズ] → [Grokとサードパーティコラボレーター]のチェックを外す。
:::
今日は何の日？（wiki調べ）

## 1. 概要
　javascript,html,cssを使って入力欄から日付を取得し、
 その日付のwikipediaに移動させるプログラムを作ってみました。
## 2. プログラム
```html:index.html
<!DOCTYPE html>
<html lang='ja'>
  <head>
    <meta charset='utf-8'>
    <title>今日は何の日？</title>
    <style>
        body {
            font-size:30px;
            text-align: center;
        }
    </style>
  </head>
  <body>
    <h1>今日は何の日？</h1>
    <p>
        朝礼、ラジオ、会話のネタなどにおすすめです！
    </p>
    
    <p>今日は、、、</p>
    <input type="date" id="all">
    <!--
    <input type="text" id="month">月
    <br>
    <input type="text" id="day">日
  -->
    <button id="writen">調べる</button>
    </div>
    <script>
        let button = document.getElementById("writen");

        button.addEventListener("click",function(){
        var alldate = document.getElementById("all");

        var tuki = alldate.value.slice(5,7);
        var hi = alldate.value.slice(8,10);
        if(hi[0] == "0"){
            hi = alldate.value.slice(9,10);
        }
        //var monthinput = document.getElementById("month");
        //var dayinput = document.getElementById("day");
        window.open('https://ja.wikipedia.org/wiki/' +`${tuki}月`+`${hi}日`, '_blank');
        })
    </script>
  </body>
</html>
```
## 3. 完成図
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943857/6b888ccf-688a-c38d-78d0-b749666f36c0.jpeg)
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943857/841e3b3c-f665-36ee-3bfe-667c940d8cfb.png)

## 4. 感想
　私は授業でjavascriptについて学んでいるのですが、練習問題として作成した、文字列をスライスするプログラムや、DOMの応用など、実際に考えて打つことで、内容を身に着けることができました。
 　プログラミング初心者のため、改良点などがあればぜひコメントしていってください！
永続的オンボーディング　インタラクティブな組織づくり　前編

この記事は[Hacobu Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hacobu)の3日目の記事です。

# はじめに

こんにちは、Hacobuで組織開発室の室長をしているAKITO([@3otika](https://x.com/3otika))です。

今回は、オンボーディングについての当社の取り組みとその効果について深掘りしていきます。

# 隣の人がわからない

ある日同僚との何気ない会話の中で、

「○○さんって何している人なんですか？」

「AKITOさん、あのチームのXXできる人って誰なんですか・・・？」

ということを聞かれることが度々ありました。

深掘りすると、各チームの細分化が進んだ結果、隣のチームの人が何をやっているのかがわからない、アイコンはわかるけどリアルで会っても誰が誰だかわからないということが起きていました。

この組織内部のコミュニケーション不足は組織の力に直結します。

例えば、皆さんもどこかのチームで障害が起きたときに

「あのプロダクトはよく分からないし自分が行っても仕方ないな・・・」

「あの人よく知らないから、自分が声かけていいのかな・・・」

等思ったことはありませんか？正直、私はあります。

いくら障害が起きていたとしても、知らない人に声かけたり、知らないプロダクトを触るのは、

「自分が参加して平気かな？」

「むしろ邪魔にならないかな？」

と心配が出てきて、非常に心理的なコストがかかります。


![スクリーンショット 2024-12-02 16.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623146/3442696b-0ab6-efe1-88ec-5ab9ac0ff34c.png)

一方で、障害で困っている人からすれば、

「自分しかこのプロダクトに触れないから、遅い時間でもやり切らないと・・・」

「誰も助けてくれない、寂しい・・・」


![pose_atama_kakaeru_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623146/b39b5621-78f3-dc27-6440-ffaf42c6d5a5.png)


となってしまいます。

これは担当者にとって、肉体的にも心理的にも負荷の高い状況です。

当然、これが続けば、社員は疲弊し、最悪の場合組織にいることに不満や不信感を感じ、退職に繋がってしまいます。

# **オンボーディングの4C**

ところで、皆さんは、**オンボーディングの4C**という言葉をご存知でしょうか

**オンボーディングの4C**、おもに新入社員が組織にスムーズに適応するためのフレームワークになります。

4Cは以下の要素を指します。

### Compliance　法令遵守

- 会社の基本的なルールや規則、手続きについての理解を深める段階です。例えば、会社のポリシーやセキュリティ手順などが含まれます。組織の基本的なルールとポリシーを学習します。

### Clarification　役割と期待値

- 新入社員が自分の役割や責任を明確に理解することを目的としています。これには、業務内容や期待される成果についての説明が含まれます。新入社員の役割と期待値を明確化にすることで適切に組織に貢献してもらうことを促します。

### Culture　文化適合

- 会社の文化や価値観を理解し、組織の一員としての意識を高めることを目指します。これには、会社のビジョンやミッション、行動規範などが含まれます。会社全体での取り組みやエンジニア組織全体での取り組みを説明し、どのような意図、効果があるかを伝えて、組織の文化を浸透させます。

### Connection　つながり

- 同僚や他の部門との関係を築くことを支援します。これにより、社内ネットワークを構築し、協力しやすい環境を作ることができます。チーム・他チームのメンバーとの交流を通して新入社員が組織の一員であることを実感することができます。

この4つのCを意識して、オンボーディングを設計することで、新入社員がより定着しやすい環境が作られていきます。

そして、これに照らし合わせた際に、先ほどの隣の人がわからないという課題は、「Connection　つながり」の設計不足であると考え、一番に課題解決に動くことに決めました。

次回具体的な、つながりの改善施策についてお話しします！


[永続的オンボーディング　インタラクティブな組織づくり　後編](https://qiita.com/3otika/items/58c99545dbf53001fe04)
更新頻度の異なるファイルをIaC管理する際の注意点

# はじめに

こんにちは、TIGの森です。

IaCを使うにあたって重要なのは、単に各言語を使いこなしてインフラ環境をプロビジョニングするだけでなく、使用するIaCがどのような設計思想・指導原理を持っているかを把握し、明確な目的意識を持って実装する事です。
今回はインフラエンジニアとして経験したAnsibleを用いたアプリ関連の設定ファイル管理における問題点と、その解決方針について詳述します。

# 背景
Futureのあるプロジェクトではサーバの設定管理はAnsibleでほぼ実装していました。
それまではネットワークやOSなどの基本的なサーバのプロビジョニングはインフラチームがAnsibleで独自に実施しており、アプリチームは基本的にIaCはいじれないようにしていました。
ある日、一部のアプリの設定もAnsibleに埋め込んでほしいとの依頼を受け、特に何も考えずにインフラ側のサーバの管理設定のAnsibleの中に安請け合いして組み込んでしまいました。

# 問題発生

結論をいうと、これは対応としてはいまいちでした。
デプロイの際に問題が出たとかではないのですが、アプリ側の設定変更の頻度はインフラ側のそれと比べて遥かに多く、インフラ側の対応が高頻度で必要となり、結果としてオペレーションコストが高くついてしまったのです。

Ansibleの実行権限を不用意にインフラ以外のチームに移譲するのはリスクが大きいですし、結局少ないインフラチームがアプリ側の設定変更の依頼を受けて毎回Ansibleを流す、という非効率なオペレーションを脱却しきれないまま開発が進んでしまいました。

# 問題になっているのはなにか

なぜこのアプローチがうまく機能しなかったかというと、**それまでAnsibleを利用する目的はプロビジョニングがメイン(更新頻度低)であったのにもかかわらず、アプリの設定ファイル(更新度高)もAnsible管理に入れてしまったため、従来の目的とずれるIaC運用を実施してしまったから**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719944/65cb8e34-0e2f-817b-ccde-89d39f1e0d2f.png)

この状態が続くと、インフラチームのオペレーションだけでなくアプリチームの気軽に設定を変えたいという要望が満たせずアプリチーム側も開発へのストレスが溜まってしまいます。

# 解決案検討

問題は特定できたのであとは解決策を考えます。
やはりアプリチームにも設定が変更出来るようにはしたいですが、過剰な権限を移譲するのはリスクの観点から好ましくないです。したがって、**あくまでアプリ関連の設定だけ操作できて、それ以外のサーバ内の操作はさせない**という方向性で考えていきます。

### 案1: アプリ設定のみ操作可能なAnsibleサーバとリポジトリを作成する
簡単な解決策として、アプリ設定の箇所のみアプリチームが操作できるAnsibleを別途用意して、アプリチームが簡単にデプロイをできるようにする、というのがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719944/579ba86e-0966-18e0-1985-ed0c88f4f263.png)

* メリット: 既存のコードの使い回しが可能なので、実装が簡単。
* デメリット: アプリチーム側でAnsibleの環境構築の工数や学習が必要になるなど、アプリチーム側での作業・学習コストが必要。


### 案2: アプリ設定更新向けジョブの作成
もう一つ考えられるのが、アプリケーション設定の更新が出来るジョブを作成するアプローチです。
変更頻度の高い設定箇所はいっそのこと別途ジョブで管理してしまうようにすれば、アプリチームもサクッといじれるような柔軟性が確保できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719944/b3c499e9-7c08-488c-8039-c2d4851b4be4.png)

* メリット: Ansibleに比べて学習コストが少なく済む場合が多い。
* デメリット: 別途ジョブの準備・メンテナンスの工数がかかる。サーバの設定が一括で管理できなくなる。

以上の2案が考えられると思うのですが、それぞれメリットとデメリットもあるので、ケースバイケースで検討するのがよいかと思います。

# 学びと今後の展望

特にインフラチームとアプリチームが分かれている大規模案件だと、どうしてもサーバ関連の設定ファイルはインフラチームのみが管理すべき必要があると思われがちで、私も基本はそれに賛成です。
しかし、アプリ側の要求に従って頻繁にアプリ向け設定を更新する必要があったり、パラメータを変えてテストがしたいなどという場合があれば例外的に一部アプリチームに設定ファイル更新の権限を移譲する、というのも手ではあるかと考えています。

このあたりの構成の検討は難しいですが、判断基準の一つとして念頭に置きたいのはやはり多くのIaCの教科書でも言及されているとおり、まずはIaCを用いる目的に立ち返ってみることです。
現在触れているIaCの主目的はプロビジョニングなのか、運用なのか、復旧なのか、etc..を明確にしつつ、その目的のために変更される余地のある箇所とない箇所、更新される箇所があるとしたらどのくらいの頻度かなどの一連の流れまで予め考えておくとそれ以降の開発が楽になるかと思います。


# さいごに
単にオペレーションの関係上、他のチームもサーバの設定変更ができる柔軟性のある構成にしたい、というだけのシンプルな話で閉じられそうではありますが、普段あるチームが管理している箇所を他チームが更新したい要望は他のケースでもあると思います。
その際に全体として最適な構成は何だろう？と立ち止まって一旦考えるプロセスを挟むのは重要で、今後色々と応用は効くのでないかと思います。
Next.jsのはじめかた【基礎】

<h1>はじめに</h1>

以前NextとReactについて触っていたが、３ヶ月ぶりに学習を再開するので復習を兼ねて学習していく。
執筆開始時点で最新のNext.js 15を用いて学習していく。

追記:メモに時間かけすぎてめっちゃ効率悪い笑　ただめっちゃ理解できるけどね

<h1>App作成

まずはアプリの作成からだ。
<h4>1. Next.jsのインストール

わからなくなったら適宜調べてね。

<h4>2. アプリ作成コマンド

```bash:Terminal
npx create-next-app@latest
```
`@latest`をつけると、<strong>リリースされている最新の安定版</strong>のNextを自動でインストールしアプリに使うことができる。
これを応用して、ここでバージョンを指定して作成することもできる
その後自動でアプリ名の入力を要求されたり、Typescriptを使うか、テイルウィンドを使うかなど聞かれる。
ここで聞かれる内容は今後まとめようと思ってる

<h4>3. サーバーの起動

```bash:Terminal
npm run dev
```
これで開発サーバーが建てられる。

<h1>ファイルディレクトリの解説

ここで、新たに作成されたアプリにいくつかフォルダがあるので紹介していく。
<h2>node_modules</h2>
これは自動生成されるフォルダ。構わなくていい
<h2>public

静的なファイルを置くところ。画像など

<h2>src/app

ここがメインコードを書くところ。
このフォルダに有るものはすべてサーバーサイドレンダリング(ユーザーのpcではなく、サーバー側でレンダリング処理を行うこと)になる
<h4>layout.js

全ページで共通するところ(ヘッダー、フッター等)を記述する
<h4>page.js

app直下のこれは、最初に開かれるページ。またapp配下の名前付きフォルダの中にpage.jsを入れると、そのフォルダの名前をルーティングとして使える。

<h4>疑問

わたしはここで疑問に思った。例えばHeader.jsというファイルを作成し、page.jsの中で読み込ませれば、わざわざlayout.jsなんて使う必要がないのではないかと。

いつものようにChatGPT先生にお世話になり回答してもらった。

<h5>1.ページごとに同じコードを書く手間がなくなる。

まずHeaderを使う場合、それをimportするコードが必要になり、さらに複数ページに同じように書かなくてはならなくなる。
小規模なアプリならまだいいが、多くのページを用意するアプリではすべてのページにそれを書かなくてはならず面倒

<h5>2.共通部分のレイアウトを変えたくなった場合に楽

layout.jsを編集するだけで全てのページに反映される。Headerを使う場合はすべてのページで編集しなくてはならなくなる

<h5>3.レンダリングの効率化

Next.jsでは同一のコンポーネントはレンダリングしないようになっている。そのためlayout内で共通する部分は変更がない限り再レンダリングされないのでパフォーマンスアップ。

せっかくNext.jsを学習してるんだし、使わない手はないよね。ありがとうChatGPT.

残りはあまり頻繁に使わないものらしいので、必要なものは後で追記する

<h1>コンポーネント作成と呼び出し

Next.jsというものは、コンポーネント管理が非常に重要である。
ページ内の様々な部分をパーツとして分ける<strong>(=コンポーネント)</strong>ことによって、効率的に使い回すかつレンダリングできるのだ。

<h3>作り方

まずapp配下にcompornentsフォルダを作成する。
使用するコンポーネントはすべてこの中に名前付きで格納する。

今回はTodoリストを作っているので、タスクを追加する部分を"AddTask"と名前をつけて管理したい。

その場合、AddTask.jsというファイルをcompornentsフォルダ内に作成し、任意にコードを記述する。

以上

<h3>呼び出し方

作成しただけでは表示はされない。
なので呼び出す必要があるが、呼び出し方は

```js:page.js
<AddTask />
```
このような記述をpage内で記述することにより、この記述した部分に呼び出すことができる。
(スペースは開けなくてもいいよ)

もちろんこれだけではダメで、コンポーネントを呼び出す宣言をする必要がある。

```js:page.js
import AddTask from "./compornents/AddTask";
```

この記述を一番初めにすることにより初めて呼び出す事ができる
これはタブ補完できるから覚えなくてもヨシ
【ChatGPT】サム・アルトマン氏のメモ術をもとに思考方法のPromptを作成しました。


　どうも、カーブミラーです。

　今回は、サム・アルトマン氏のメモ術をもとに思考方法のPromptを作成しました。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　まずは、ニュース。

　[国産フルスクラッチLLM「PLaMo」に新モデル ～サイズを抑え、世界トップクラスの日本語性能を実現](https://forest.watch.impress.co.jp/docs/news/1644122.html)

　PLaMoは、こちらから。
　　[PLaMo サイト](https://plamo.preferredai.jp/)

　主要な日本語ベンチマークに
　　おいて、GPT-４を超える精度を
　　　記録している。

　また日本語応答だけでなく、
　　日英の翻訳性能にも優れています。

　だそうです。

　チャットボットを
　　少し試してみましたが、
　　　出力速度は、トロトロ😅

　でも、日本語としての
　　破綻は少ない気がします。

　今後に期待、かな😸
***
　さて、本題です。

　今回は、
　　サム・アルトマン氏のメモ術を
　　　もとに、思考方法のPromptを
　　　　作成しました。ChatGPTが😅

　「私は大量のメモをとって、
　　そして破り捨てるというやり方を
　　　信条にしています。

　　一度に複数のページを見れるし、
　　　最後はくしゃくしゃにして
　　　　投げ捨てて、
　　　　　それで終わりにできます」

　これは、
　　OpenAI CEOの
　　　サム・アルトマン氏が
　　　　あちこちで言っている
　　　　　メモ術です。

　まずは、メリットデメリットを
　　ChatGPTに聞きました。
```Text:このメモ術のメリットとデメリット
このメモ術のメリットとデメリットについて考えてみましょう。

---
メリット

1. 記憶の定着が高まる
手を動かしてメモを取ることで、考えを整理しやすくなり、記憶にも定着しやすくなります。一度「書き出す」というプロセスが重要です。

2. 気軽に試行錯誤できる
メモを破り捨てられるという前提があるため、「間違えてはいけない」「キレイにまとめなければいけない」というプレッシャーがなく、自由な発想が可能です。

3. ストレス発散効果
最後にメモをくしゃくしゃにして捨てる行為は、気持ちの切り替えを促し、達成感やリフレッシュ効果が得られます。

4. 整理整頓が容易
不要になったメモを破棄することで、溜まった情報を物理的に整理でき、机の上や作業環境がすっきり保たれます。

5. 多角的な視点を得やすい
複数ページを広げて比較したり、思考の流れを同時に俯瞰できる点は、紙ならではの利点です。
---

デメリット

1. 情報の持続性が低い
破り捨てるため、後から見返したい情報や大事な内容を失うリスクがあります。長期的に活用する情報には不向きです。

2. 紙の消費
紙を大量に使い捨てるため、環境負荷やコストが懸念されます。特に頻繁にメモを取る場合には、大量の紙を消費することになります。

3. 再現性が低い
メモを捨ててしまった後で必要な情報が再び必要になると、もう一度考え直したり、調べ直したりする手間が発生します。

4. 整理が苦手な場合は非効率
破棄する前に情報をまとめたり、デジタル化する習慣がない場合、重要な情報が埋もれてしまう可能性があります。

5. 周囲の理解が必要
破った紙を捨てる行為が、周囲から「無駄遣い」「乱雑」と見られる可能性があります。
---

どのような人に向いているか

一時的なアイデアや発想の整理が必要な人
ストレスを発散しつつ効率的に考えをまとめたい人
過程を重視し、結果は後で仕上げるタイプの人

このメモ術は、短期的な発想整理や感情の切り替えに向いていますが、長期的な記録が必要な場面では補助的なツールとして活用するのが良いでしょう。
```

　私もアイディアや得た知識を
　　メモしています。

　しかし、
　　メモを破り捨てて
　　　ポイッはできませんねぇ😅

　そこが
　　彼と私の違いなのでしょうね。
　　　頭の中身も？w
***
　それはともかく、
　　ChatGPTに指示して
　　　このメモ術を思考方法として
　　　　Prompt作成を依頼しました。

　こちらが
　　そのPromptになります。
　　　＊＊＊に課題を書き入れて
　　　　送信してください。
```Text:サム・アルトマンメモ術思考方法Prompt
# Prompt: サイクル思考法のプロセス

1. 課題設定
「＊＊＊」

2. アイデアの爆発
制限時間内で自由にアイデアを書き出してください。順序や正解を気にせず思いつくままに記録します。

3. 選別と破棄
書き出したアイデアを見渡し、実現可能性や重要性の基準で選別し、不要なものは破棄してください。

4. 再構築
残ったアイデアをグループ化し、新たな視点で発展させてください。

5. 結論のアウトプット
再構築した結果を整理し、実行可能な形に記録した後、すべてのメモを破棄してください。
```

　いくつか試してみましたが
　　「画像生成AIへの指示の
　　　アイディアが欲しい」というのが
　　　　自分的には良かった。
```Text:画像生成AIへの指示のアイディアが欲しいの結果
夢の世界
「雲と虹で構成された世界、空には泳ぐ魚、奇妙な形の建物が立ち並ぶ。」

カオスと秩序
「画面の左半分は混沌とした暗闇、右半分は光と秩序が広がる対比的な構図。」

時間の流れ
「砂時計の中に広がる宇宙、星々が砂のように落ちる幻想的な描写。」
```

　ここには出しませんが、
　　ちゃんと描画して
　　　どれも夢や幻想の世界に
　　　　なりました。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。