OmniAICreator/Qiita-1.07M huggingface dataset:
ラーメン店で考えるドメイン駆動設計

ドメイン駆動設計（DDD）は、システム開発において重要な考え方ですが、すべての問題を解決する「万能薬」ではありません。ではなぜDDDが多くの支持を集めているのか、ラーメン店を例に考えていきます。

#### **1. ドメインとは？**
ドメインとは、ラーメン店で言うところの「ラーメンを作り、お客様に提供するための全ての活動」を指します。スープの仕込み、麺の茹で方、トッピングの準備といった、ラーメンを作るためのあらゆるプロセスがこのドメインに含まれます。

ラーメン店のマニュアルは、このドメインをカバーしていると考えてください。マニュアルには、どの材料を使い、どのように調理すれば美味しいラーメンができるかが詳しく書かれています。さらに、工程とそれに紐ずくマニュアルがモジュール化されている場合、各プロセスが独立したセクションとして整理されており、必要な部分だけを更新することが可能です。これにより、業務の一部に変更があった際にも、他の部分に影響を与えずに対応できます。

システム開発においても、ドメインを深く理解し、それを基にシステムを設計することが基本です。ドメインをモジュール化することで、システム全体が柔軟かつ効率的に機能し、現実の業務に即した対応が可能になります。

#### **2. ドメインエキスパートの役割**
ラーメン店では、店主やベテランのラーメン職人がドメインエキスパートです。美味しいラーメンを作るための秘訣を知っており、その知識を基にマニュアルが作成されます。麺の茹で時間を季節や湿度によって調整するなどの重要なポイントは、ドメインエキスパートの経験に基づいています。

システム開発においても、ドメインエキスパートの知識は非常に重要です。例えばゲーム開発の場合、ドメインエキスパートとはゲームデザイナーや経験豊富なプログラマー等を指します。彼らはゲームのバランス調整やプレイヤーの体験を向上させるための知識を持っています。開発者は、こうしたエキスパートから得た知識を基にして、ゲームシステムの設計や調整を行います。例えば「プレイヤーのレベルアップが早すぎるとゲームが簡単になりすぎる」という意見を反映させ、ゲームの難易度を調整する機能を設計に組み込みます。これにより、ゲーム全体がプレイヤーにとって適切な難易度を提供できるようになります。

#### **3. ユビキタス言語：共通の理解を持たせる言葉**
ユビキタス言語は、チーム全員が共通して使う言葉です。「マシマシ」「バリカタ」等といった言葉の意味と必要な作業がマニュアルに書かれていれば、スタッフ全員がその意味を理解し、同じ方法で調理を進めます。また「多め」「固め」といった別の言葉を用いず区別することで、混乱を減らすことができます。

システム開発でも、チーム全員が共通の言葉を使うことが非常に重要です。ゲーム開発を例にとると、「ヒットポイント」「ボス」「レベルアップ」といった用語が全員に共通の意味で理解されていることで、開発チーム内でのコミュニケーションが円滑になります。これにより、ゲームの設計や開発がスムーズに進行しやすくなり、結果的に一貫したプレイヤー体験が提供されます。

---

### なぜDDDが評価されているのか

#### **1. 一貫性のあるサービス提供が可能**
DDD的アプローチの採用により、どのスタッフが作っても統一された味のラーメンを提供できるようになり、システムや業務プロセスの一貫性が確保されます。これが重要なのは、現場での対応がバラバラだと顧客が期待するサービスを受けられず、不満が生じる可能性があるからです。

ゲーム開発でも同様に、各開発者がバラバラに機能を実装するのではなく、統一された方針に基づいて開発を進めることで、一貫したプレイヤー体験を提供できます。これによりゲームが不整合なく動作し、プレイヤーが期待する遊びやすさが実現します。例えば異なるチームが開発した機能が互いに矛盾することを防ぐため、DDDは全体の統一感を維持する役割を果たします。

#### **2. 変化に強い柔軟な運営**
ビジネスやゲームの環境は常に変化しますが、従来のシステム設計では対応が難しいことが多いです。DDDは、柔軟に対応できるよう設計されており、システムや業務プロセスが簡単に更新できます。

例えばラーメン店で新メニューを追加する際、全てのセクションが依存し合うマニュアルでは全体の手順を修正し、全スタッフに再教育が必要になるかもしれません。しかし適切な範囲で区切られた独立したマニュアルなら、影響を受ける「トッピングの準備」や「スープの仕込み」のセクションだけを更新すれば済みます。他の作業には影響がなく、変更の範囲を限定できるためリスクとコストを最小限に抑えられます。

ゲーム開発でも、新キャラクターの追加やバランス調整を行う際、基盤がしっかりしていれば、混乱なく対応できます。

#### **3. 複雑なビジネス要件に対応可能**
システムが複雑になると、全体像を把握するのが難しくなりがちです。DDDはビジネスロジックを明確に分離し、複雑さを管理するのに役立ちます。

ラーメン店で考えると、複数の店舗で異なるメニューやサービスを提供している場合、全体を一つのシステムやマニュアルで管理しようとすると混乱が生じやすくなります。DDDを採用すれば、各店舗やメニューごとに分離されたモデルを作成し、全体を見渡しやすくすることができます。

ゲーム開発においても、複数のゲームモードやキャラクターが存在する場合、それぞれの要件を明確に分けて管理することで、開発がスムーズに進むとともにバグや予期せぬ不具合の発生を減らすことができます。

---

### **まとめ**

ラーメン店を例に、なぜDDDが多くの支持を集めているのかを考えました。DDDは、業務知識をマニュアルやシステムに反映させることで、複雑なビジネス要件に対応しつつ、一貫した品質を保ち、柔軟で保守性の高いシステムを実現するためのアプローチです。

DDDは適切な場面で非常に有効ですが、すべてのプロジェクトに最適ではありません。例えばメニューが少なく、手順が簡素である小規模なラーメン店では、複雑な設計やモジュール化が過剰であり、DDDを採用することで逆に運営が煩雑になる可能性があります。こうしたケースでは、シンプルなマニュアルや直感的な運営方法の方が効果的です。

適切に導入されたDDDは、ビジネスの継続的な成長を支える強力なツールとなりますが、その効果を最大限に引き出すためには、状況に応じた柔軟なアプローチが求められます。DDDを採用するかどうかは、プロジェクトの特性やチームのリソースを考慮した上で慎重に判断することが重要です。
☑️総務省の消費者物価指数レポートを取得する

総務省は下記のページで消費者物価指数に関するレポートを毎月掲載しています。
この記事では総務省の消費者物価指数レポートを全て取得するpythonコードを記載します。

https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200573&tstat=000001150147&cycle=1&tclass1=000001150149&tclass2val=0&metadata=1&data=1

## ステップ1.メインページの内容を取得
上記のページはメインページになり各月ごとのページリンクがあります。そして各月ごとのリンク先にpdfが掲載されています。

select()メソッドを使って、a.stat-item_childというCSSセレクタを指定して、すべての月のリンクを取得します。


## ステップ2.PDFリンクと公開日を取得
取得した各月のリンクをたどり、そのページからPDFリンクと公開日を取得します。link['href']でリンクのhref属性（相対URL）を取得し、ベースURLと組み合わせて完全なURLを作成します。

公開日はfind_next_sibling(text=True)を使って抽出します

PDFリンクはクラス名"stat-dl_icon stat-icon_2 stat-icon_format js-dl stat-download_icon_left"を持つ＜a＞タグを探し、そのhref属性を取得します。

## コード
```
import requests
from bs4 import BeautifulSoup

# メインページのURL
main_url = 'https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200573&tstat=000001150147&cycle=1&tclass1=000001150149&tclass2val=0'

# ページの内容を取得
response = requests.get(main_url)
response.raise_for_status()

# BeautifulSoupでHTMLを解析
soup = BeautifulSoup(response.content, 'lxml')

# 全ての月リンクを取得
month_links = soup.select('a.stat-item_child')

# ベースURL
base_url = 'https://www.e-stat.go.jp'

# 各月のページに移動してPDFリンクと公開日を取得
for link in month_links:
    month_url = base_url + link['href']
    
    month_response = requests.get(month_url)
    month_response.raise_for_status()

    # 月ごとのページを解析
    month_soup = BeautifulSoup(month_response.content, 'lxml')

    # 公開日を探す
    publish_date_tag = month_soup.find('span', class_='stat-sp', text='公開（更新）日  ')
    if publish_date_tag:
        publish_date = publish_date_tag.find_next_sibling(text=True).strip()
    else:
        publish_date = "公開日が見つかりませんでした"

    # PDFリンクを探す
    pdf_link_tag = month_soup.find('a', class_='stat-dl_icon stat-icon_2 stat-icon_format js-dl stat-download_icon_left')
    
    if pdf_link_tag:
        pdf_url = base_url + pdf_link_tag['href']
        print(f"公開日: {publish_date}, PDF URL: {pdf_url}")
    else:
        print(f"公開日: {publish_date}, No PDF found")
```
[JavaScript][Jest] インスタンスを用いたテストコード 

# 環境
MacBook Pro (2.3 GHz 8コアIntel Core i9)
macOS 14.0（23A344）
Homebrew 4.3.8
gh 2.52.0


# 活用例1
## テスト対象クラス
- クラス: `Person`
- プロパティ: `name`（名前を格納する文字列）、`age`（年齢を格納する数値）
- メソッド: `greet()`（挨拶のメッセージを返す）
~~~ts:person.ts
class Person {
    constructor(public name: string, public age: number) {}

    greet(): string {
        return `Hello, my name is ${this.name} and I am ${this.age} years old.`;
    }
}
~~~
または（上記は**可読性が高い**、下記は**冗長**とされる）
~~~ts:person.ts
class Person {
    public name: string;
    public age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
}
~~~

## テストコード
- インスタンス: `person`（`Person`クラスのインスタンス）
- 生成されたオブジェクト: `Person`クラスのインスタンス（`name`プロパティが「Alice」、`age`プロパティが「30」となっている。）
~~~ts:person.test.ts
import { Person } from './person';

describe('Person Class', () => {
    let person: Person;

    beforeEach(() => {
        // Personクラスのインスタンスを生成
        person = new Person('Alice', 30);
    });

    it('should store name and age', () => {
        // プロパティを確認
        expect(person.name).toBe('Alice');
        expect(person.age).toBe(30);
    });

    it('should return a greeting message', () => {
        // メソッドの動作を確認
        expect(person.greet()).toBe('Hello, my name is Alice and I am 30 years old.');
    });
});

~~~



# 活用例2
## テスト対象クラス
- クラス: `Calculator`
- プロパティ: 特になし（この例ではプロパティを使用していません）
- メソッド: `add(a: number, b: number): number`（2つの数値を加算）、`subtract(a: number, b: number): number`（2つの数値を減算）
~~~ts:calculator.ts
class Calculator {
    add(a: number, b: number): number {
        return a + b;
    }

    subtract(a: number, b: number): number {
        return a - b;
    }
}
~~~

## テストコード
- インスタンス: `calculator`（Calculatorクラスのインスタンス）
- 生成されたオブジェクト: `Calculator`クラスのインスタンスで、メソッドとして`add`と`subtract`を持つ。
~~~calculator.test.ts
import { Calculator } from './calculator';

describe('Calculator Class', () => {
    let calculator: Calculator;

    beforeEach(() => {
        // Calculatorクラスのインスタンスを生成
        calculator = new Calculator();
    });

    it('should add two numbers correctly', () => {
        // addメソッドの動作を確認
        expect(calculator.add(2, 3)).toBe(5);
    });

    it('should subtract two numbers correctly', () => {
        // subtractメソッドの動作を確認
        expect(calculator.subtract(5, 3)).toBe(2);
    });
});
~~~

# 参考リンク
- [JavaScript資料解説】インスタンス化とは？なぜインスタンス化するのか/インスタンスの生成方法](https://takahide-program.com/about-instance/)
- [new 演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/new)
- [[JavaScript] オブジェクト、プロパティ、メソッドについて](https://qiita.com/Jochun/items/2ec3d6d933f7509b5adf)
【豆知識とError】Google認証周り。APIキーを含む秘匿情報について

# はじめに
今回はAPIキーを含む秘匿情報の管理方法について。様々な記事を参考にしたりGPTで質問したりすることで、言ってることは分かるけど実際にやってみると本当にあってるのかが不安になり、余計なことをしたり、でだいぶ時間がかかってしまいました。
なので次回はさっと進めることができるようにするためにも記事にまとめてみたいと思います。

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


## 先に正解？から
私がつまずいた部分については後回しで先に秘匿情報をどうやって管理することができたのかについて。
- docker環境、rails、Vscode使用
- credentials.yml.encで管理することを選びました
- ローカルでの構築段階です

```ruby
コンテナに入る
$ docker exec コンテナ名 /bin/bash

vimでconfig/credentials.yml.encファイルを開く
# EDITOR="vim" bin/rails credentials:edit
```
- 編集をするために「i」を入力
- 『　----挿入（INSERT）---- 』と表示されるので、入力が可能となる（インサートモード）
- 先頭の行当たりをクリックして選択しておき以下入力
```ruby
google:
  google_client_id: 取得したclient_id
  google_client_secret: 取得したclient_secret
```
- 保存するときは、『　esc 』キーを押してから、『　:wq 』を押して保存。で終了


### config/initializers/sorcery.rbで環境変数を設定する
```ruby
  config.google.key = Rails.application.credentials.dig(:google, :google_client_id)
  config.google.secret = Rails.application.credentials.dig(:google, :google_client_secret)
  config.google.callback_url = Settings.sorcery[:google_callback_url]
  config.google.callback_url = "http://localhost:3000/oauth/callback?provider=google"
  config.google.user_info_mapping = { email: 'email', name: 'name' }
```

- **config配下のファイルをいじった後は必ずサーバーを立ち上げ直してください！！**


### 参考記事+後のもろもろの設定について

https://qiita.com/okada84108983/items/0c84c01b88072c004873

https://zenn.dev/kame0707/articles/ef2453f31fe236

- API設定については下記記事を参考にしました
※注意としては「認証済みのリダイレクトURL」は`http://localhost:3000/oauth/callback?provider=google`で。

https://zenn.dev/yoiyoicho/articles/c44a80e4bb4515


## 私の間違い
ここからは興味のある方だけ。「何をそんなに迷ったの？」かについて。

- APIの設定が完了したら、生成されたclient ID, client secretをcredentials.ymlに追加する時
```ruby
EDITOR="vim" bin/rails credentials:edit
```
- 上記コードを入力するもターミナルでそもそも実行していたためうまくいかない

```ruby
Your Ruby version is 3.0.2, but your Gemfile specified 3.2.3

ターミナルで実行したから上記のようなログになる
Rubyのバージョンを切り替えようとする

ruby-build のアップデートやrbenのインストール等いろいろ試す
```
```ruby
1：GPTにききコンテナ内で次のコマンドを実行するもエディタが開かない
# rails credentials:edit

2：nano、vim、code（VS Code）などエディタを環境変数として設定してみる
# export EDITOR="code --wait"

3：再度1のコマンドを実行するもやはりうまくいかない
```
- そして人に助けを求め、翌日リフレッシュした頭で挑んだら解決しました。以上です。
- ついでに、助けを求める前に`EDITOR="vim" bin/rails credentials:edit`をコンテナ内で実行してファイルの中に入れてはいましたが、操作方法がよくわかっていなくてvimから何とかして出るだけで手いっぱいでした💦


## さいごに
私のような？の行動をする人は多分いないかと思いますが、落ち着けばみんなできます。今回の記事が何か参考になれば幸いです。
解いてみた。「Sランク：mod7占い」

# 問題
[「Sランク：mod7占い」](https://paiza.jp/works/mondai/s_rank_skillcheck_sample/mod7)

# コード
Javaで解いてみました。

``` Java
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int nN = sc.nextInt();
        
        // カード読み込み
        int[] anA = new int[nN];
        for (int i = 0; i < nN; i++) {
            anA[i] = (int)(sc.nextLong() % 7);
        }

        // カード検索
        int nCount = 0;
        for (int i = 0; i < (nN - 2); i++) {
            int a = anA[i];
            for (int j = (i + 1); j < (nN - 1); j++) {
                int b = anA[j];
                for (int k = (j + 1); k < nN; k++) {
                    int c = anA[k];
                    if (((a + b + c) % 7) == 0) {
                        nCount++;
                    }
                }
            }
        }

        // 結果出力
        System.out.println(nCount);
    }
}
```

# 解説
## 標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。

## カード読み込み
配列 anA[] にカードの番号を入れますが、
+ そのまま足して、7で割った余りを求める
+ あらかじめ7で割った余りを足して、7で割った余りを求める

の結果は同じになるので、あらかじめ7で割った余りを格納しています。

## カード検索
まず、０ 〜 (N-1)-2（2枚選べるように残す為2を引く）番目のカードから、i番目のカードを1枚目として選びます。
次に、i+1 〜 (N-1)-1（1枚選べるように残す為1を引く）番目のカードから、j番目のカードを2枚目として選びます。
最後に、j+1 〜 N-1 番目のカードから、k番目のカードを3枚目として選びます。
すると、重複しない3枚組のカードを全て選ぶことができます。

あとは、3枚のカード anA[i], anA[j], anA[k]の数を足し、7で割った余りが０ならば、nCount を１増やしていきます。
データガード構成時のRMAN削除ポリシーの指定

プライマリサイト側でのバックアップを実施する時の設定


CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;


●次の条件が両方とも満たされている場合に、アーカイブREDOログが削除可能であることを指定する

1)そのアーカイブREDOログが、必要なスタンバイ・データベースに適用済であること。
2)そのアーカイブREDOログが、BACKED UP …TIMES TO DEVICE TYPE削除方針で不要とされていること。BACKED UP方針が設定されていない場合、この条件が常に満たされる。


●ALLオプションの意味合い

1)ALLを指定しなかった場合は、必須であるすべてのリモートの宛先に適用した後、アーカイブ・ログは削除可能になる。
2)ALLを指定した場合、アーカイブ・ログは、すべてのリモートの宛先で適用済または消費済であれば削除可能になる。



参考サイト
http://oracle-pub.wikidot.com/11g-ocm-dg-arch-del-policy
【paiza×Qiita】JavaScriptで最小文字数での解答を目指す【Dランク編】

# はじめに
こちらの[paiza×Qiita記事投稿キャンペーン](https://qiita.com/official-events/9ab96aa95d62fe3cbdd7)のDランク問題を、コードゴルフの要領で最小文字数で解答することを目指しました。
言語はJavaScriptです。

他のランクはこちら

- [Cランク](https://qiita.com/TD12734/items/746336ad4f7ffc38d989)
- [Bランク](https://qiita.com/TD12734/items/5e36081d58f0ee5cf97b)
- [Aランク](https://qiita.com/TD12734/items/bfded9d604d71554eb19)

# 多分これが一番短いと思います
## 文字の一致
<!--
```js
process.stdin.on("data",i=>[a,b]=(i+"").split("\n")).on('end',_=>console.log(a==b?"OK":"NG"))
```
-->

```js
process.stdin.some(i=>{[a,b]=(i+"").split`
`;console.log(a==b?"OK":"NG")})
```

74文字

分割代入を使うことで文字数を削れました。

## 一番小さい値

<!--
```js
l=100;process.stdin.on("data",i=>{for(j of (i+"").split("\n"))if(l>j&&j)l=+j}).on('end',_=>console.log(l))
```
-->
```js
a=100;process.stdin.some(i=>console.log((0+i).split`
`.map(j=>a=a>j&&j?+j:a)&&a))
```

81文字

(文字数削減の観点で)一番難しかったです。
詳しい解説は後述。

## 足し算
```js
process.stdin.some(i=>{[a,b]=(0+i).split` `;console.log(a- -b)})
```

64文字

~~aとbは文字列ですが、前に+を付けることで数値に変換しています。~~

コメントで教えてもらった `a- -b` でも文字列同士の足し算を実現できました。

文字列としての数字同士の引き算は普通に動くのを利用し、a-(-b)=a+bをしています。

## Eメールアドレス
```js
process.stdin.some(i=>{[a,b]=(i+"").split`
`;console.log(a+"@"+b)})
```

67文字

joinやtrimを使うよりも上記の方が短くできました。

## N倍の文字列
```js
process.stdin.some(i=>console.log("*".repeat(i)))
```

49文字

最も美しく書けたと思います。
repeatのカッコの中身は末尾に改行がある文字列でも大丈夫なようです。

# 解説
## 標準入力について
paizaではNode.jsの標準入力を使っているようですが、標準入力のコードがまず長いのでここも削りました。
`process.stdin.some(i=>{})`だけを使用することで文字数削減を実現しました。
iは入力された値のバッファーで、`i+""`で文字列に変換しています。
最初の値が数値の場合は`0+i`でも変換できるっぽいです。
文字列にした後はsplit\`
`で各行の値を取り出しています。

これは本来は `split("\n")`をしているのですが、文字を削減したらこうなりました(改行コードの\nではなくて実際の改行を入れている)
なお、splitした場合は配列の最後に空白文字列が追加されるので注意が必要です。
stdin.on('end',()=>{})すらも削ったので環境によってはエラーが出るかもしれませんが、 **paiza環境で動けばヨシ!** のノリですので気にするな!

## 一番小さい値について
```js
a=100;
process.stdin.some(i=>
  console.log((0+i).split`
`.map(j=>
a=a>j&&j?+j:a)&&a))
```

以下のような処理をしています。

1. 最小の値(a)の初期値を100に設定
1. 入力された値(i)はバッファーなので、`0+i`をして文字列に変換
1. **split\`
`** で改行ごとに区切られた配列に変換
1. map関数を使用し、aが各行の値(j)よりも大きければaをjにする
   - jは文字列なので、代入時は`+j`で数値に変換しています
   - jsでは`50>"40"`のように、数値と文字列の比較がちゃんと動くので、`a>j`はそのまま比較しています
   - 仕様上、splitされた最後の値としてjの最後の値は`""`になります。+""は0になってしまうため、""を弾くためにjもif条件に含めています(jsでは""はfalse扱いになります)
   - mapの方がfor-ofよりも一文字短くできます

# おわりに
普通に解くと簡単な問題ばかりでしたが、コードゴルフの観点では結構歯応えがありました。
とりあえず、全て100文字以下にできたので満足です。

## 追記
コメントから~~案の定~~さらに短くできるテクニックを教わりました。
どの問題も10文字ほど削減できましたのでこの場を借りて感謝致します。
そして、今度こそ**多分これが一番短いと思います**。
【朗報】AIが自分でAI進化させる時代キターーー！！人類の可能性爆上がりやで【ADAS】

## 論文情報

https://github.com/ShengranHu/ADAS

https://arxiv.org/abs/2408.08435

## 解説スレ

**1 名前：AI研究者J (新人) ：2024/08/20(火) 12:34:56.78 ID:aIr3S3rCh**
ワイ、この論文読んだんやけど、AIが自分でAIエージェント設計するって凄くね？

**2 名前：機械学習エンジニアK：2024/08/20(火) 12:35:23.45 ID:mLe4rN3r**
＞＞1
そうやな。Meta Agent Searchってのが面白いわ。AIが自分でコード書いて新しいAIエージェント作るんや。

**3 名前：哲学者P：2024/08/20(火) 12:36:12.34 ID:pH1L0s0ph**
人工知能が自己改良を行うという点で、これは哲学的にも興味深い現象やな。人間の知性の本質とは何かという問いにも繋がるで。

**4 名前：プログラマーC：2024/08/20(火) 12:37:01.23 ID:c0d3rPr0**
コードで全てのエージェントシステムを定義できるってのが革新的やわ。Turing完全な言語使えば理論的には何でも作れるからな。

**5 名前：大学生S (初心者) ：2024/08/20(火) 12:38:45.67 ID:sTud3nT5**
ちょっと待って、AIが自分でAI作るってどういうこと？人間要らなくなるんじゃない？

**6 名前：AI倫理学者E：2024/08/20(火) 12:39:34.56 ID:3Th1cAl3**
＞＞5
そこは慎重に考える必要があるな。AIの自己改良には確かに懸念もあるが、人間の監督下で行われる限り、むしろ人間の能力を拡張する道具になり得る。ただし、安全性の確保は重要な課題や。

**7 名前：認知科学者N：2024/08/20(火) 12:40:23.45 ID:c0gN1t1v3**
この研究、人間の学習プロセスとの類似点が興味深いわ。メタ認知能力を持つAIが自己改良するってことは、人間の学習メカニズムの解明にも繋がるかもしれんな。

**8 名前：数学者M：2024/08/20(火) 12:41:12.34 ID:m4Th3m4t1**
理論的には面白いアプローチやな。でも、探索空間が膨大すぎて効率的に最適解見つけられるんかな？数学的に証明できる部分はあるんか？

**9 名前：AI研究者J (新人) ：2024/08/20(火) 12:42:01.23 ID:aIr3S3rCh**
＞＞8
探索空間の話、確かに気になるわ。論文では何か言及あったっけ？

**10 名前：機械学習エンジニアK：2024/08/20(火) 12:43:45.67 ID:mLe4rN3r**
＞＞9
論文では、Foundation Model (FM) の事前知識を利用してるから、完全にランダムな探索じゃなくて、ある程度効率的に探索できるって書いてあったで。でも、最適解の保証はないな。

**11 名前：ロボット工学者R：2024/08/20(火) 12:44:34.56 ID:r0B0t1cs**
これ、物理的なロボットの制御システムにも応用できそうやな。自己改良するAIエージェントがロボットの動きを最適化していく…未来感あるわ。

**12 名前：心理学者H：2024/08/20(火) 12:45:23.45 ID:pSyCh0l0g**
人工知能の「創造性」って人間のそれとどう違うんやろ。この研究、AIの創造プロセスの解明にも役立ちそうやな。

**13 名前：大学生S (初心者) ：2024/08/20(火) 12:46:12.34 ID:sTud3nT5**
＞＞6
なるほど…でも、AIが勝手に暴走したりしないの？

**14 名前：AI倫理学者E：2024/08/20(火) 12:47:01.23 ID:3Th1cAl3**
＞＞13
その懸念はもっともや。論文でも安全性については言及されてる。サンドボックス環境での実行や、人間の監視下での運用が提案されてるな。完全な安全性の保証は難しいが、リスク軽減の努力は必要やな。

**15 名前：言語学者L：2024/08/20(火) 12:48:45.67 ID:l1nGu1st**
AIエージェントが自然言語を介して設計されるって点が面白いわ。言語と思考のインターフェースとしての役割を果たしてるんやな。これ、言語学的にも示唆に富むで。

**16 名前：経済学者F：2024/08/20(火) 12:49:34.56 ID:3c0n0m1st**
この技術、経済に与える影響でかそうやな。AIの自動設計が進めば、ソフトウェア開発のコストが大幅に下がる可能性があるで。産業構造にも影響しそう。

**17 名前：AI研究者J (新人) ：2024/08/20(火) 12:50:23.45 ID:aIr3S3rCh**
みんなの意見聞いてると、この研究すごい広範囲に影響及ぼしそうやな。でも、実際の性能はどうなんやろ？既存の手法より本当に優れてるんか？

**18 名前：機械学習エンジニアK：2024/08/20(火) 12:51:12.34 ID:mLe4rN3r**
＞＞17
論文の実験結果見ると、既存の手動設計されたエージェントより高性能らしいで。特に、読解力テストのDROPでは13.6ポイント、数学テストのMGSMでは14.4%も性能が向上してるんや。

**19 名前：科学哲学者S：2024/08/20(火) 12:52:01.23 ID:sC1pHiL0**
この研究、科学的発見のプロセス自体を自動化する可能性を示唆してるな。人間の科学者の役割が変わるかもしれん。科学哲学的に見ても、知識生成のパラダイムシフトが起きる可能性があるわ。

**20 名前：社会学者G：2024/08/20(火) 12:53:45.67 ID:s0c10L0g**
AIの自己改良が進むと、人間社会にどんな影響があるんやろ。技術の進歩と社会の適応のスピードの差が開きそうで、そこが課題になりそうやな。

**21 名前：まとめ屋Y：2024/08/20(火) 12:54:34.56 ID:suMm4rY**
おっ、まとめるで：

- AIが自身でAIエージェントを設計・改良する「Automated Design of Agentic Systems (ADAS)」という新しい研究分野が登場
- Meta Agent Searchという手法で、AIがコードを書いて新しいAIエージェントを作成
- 既存の手動設計されたエージェントより高性能（読解力で13.6ポイント、数学で14.4%向上）
- 哲学、認知科学、言語学、経済学など多分野に影響を与える可能性
- 安全性や倫理面での課題も指摘されている
- 科学的発見プロセスの自動化など、知識生成のパラダイムシフトの可能性も
vercel dev コマンドで出た謎の Cannot find module エラー対処備忘録

# 前提
vercel serverless functions として 　`api/a.ts` が用意してあり、ローカルで起動するために [`vercel dev` コマンド](https://vercel.com/docs/cli/dev) を使う
next.jsは使っていない

# 発生したこと
ローカルで起動して `http://localhost/a` にアクセスすると、
`502: BAD_GATE_WAY` になり、以下のような謎のエラーが発生

```
Error: Function `api/a.ts` failed with exit code 1
node:internal/modules/cjs/loader:1148
  throw err;
  ^

Error: Cannot find module '/Users/me/Library/Application'
Require stack:
- internal/preload
    at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
    at Module._load (node:internal/modules/cjs/loader:986:27)
    at internalRequire (node:internal/modules/cjs/loader:176:19)
    at Module._preloadModules (node:internal/modules/cjs/loader:1563:5)
    at loadPreloadModules (node:internal/process/pre_execution:730:5)
    at setupUserModules (node:internal/process/pre_execution:206:5)
    at prepareExecution (node:internal/process/pre_execution:159:5)
    at prepareMainThreadExecution (node:internal/process/pre_execution:54:10)
    at node:internal/main/run_main_module:11:19 {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ 'internal/preload' ]
}

Node.js v20.14.0
Error: Function `api/a.ts` failed with exit code 1
```

なぜか `Error: Cannot find module '/Users/me/Library/Application'` という変な場所を見に行っているが、そのようなモジュールはない

# 原因不明だが直せた方法
package.jsonのdevDependenciesにvercelを追加したら直った
```
    "vercel": "^36.0.0",
```

社内で他の方はglobal installで問題なく、自分だけ発生したので根本的な原因はわからない
Javaで「COMMENTSフラグ(パターンの中にコメントを記述する)」の動作を確認してみた

# 概要

Javaで「COMMENTSフラグ(パターンの中にコメントを記述する)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index21.html

# 実装

以下のファイルを作成しました。
```JSample21_1.java
import java.util.regex.*;

class JSample21_1{
  public static void main(String[] args){
    String target = "AZ-243";
    String regex = "[a-zA-Z]{2}  # 製品名" + 
                   "-            # ハイフン" + 
                   "[0-9]{3}     # 製品コード";
    Pattern p = Pattern.compile(regex, Pattern.COMMENTS);

    Matcher m = p.matcher(target);
    System.out.println(target + ":" + m.find());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample21_1.java 
$ java JSample21_1 
AZ-243:true
```

# まとめ

何かの役に立てばと。
第二回: WEBサイトが表示される仕組み

こんにちは、[株式会社カスタマトリックス](https://www.customatrix.co.jp/)の寺尾です。

こちらは **新卒社員と学ぶWEBプログラミング** 企画になります。
可能な限り毎日更新していくのでご期待ください。

本日は第二回、「**WEBサイトが表示される仕組み**」を説明していきます。

第一回はこちら
https://qiita.com/r-terao/items/e6237c4dc59db9e96ec6

# WEBサイト
普段調べ事や買い物をする際、様々なサイトに訪問していますよね？
現実のお店のように足を運んで実際に目で見ているわけではないにも関わらず、インターネットの力と工夫で多くの情報が手元の画面にあっという間に表示されています。
その仕組みを今回は学んでいきましょう。

# 二つの軸
WEBサイトを語るにあたり、二つの軸が存在します

```WEBサイトの軸.
1. 「クライアント」「サーバ」などの立場を中心とした捉え方
2. 「フロントエンド」「バックエンド」などの役割を中心とした捉え方
```

これらは雰囲気が近いので混同されがちですが、それぞれ別のモノを指しています。
一つずつ見ていきましょう

# クライアントとサーバ
この軸は立場中心の見方をした時のシステムの説明になります。

```クライアント.
WEBサイトを欲しがる側の立場
・PCのブラウザ
・スマホのブラウザ
```
```サーバ.
WEBサイトを渡す側の立場
```
基本的には
1. クライアントが特定のURLにアクセスする
2. クライアントがブラウザの機能でサーバにWEBサイトをリクエストする
3. サーバがリクエストを受け取る
4. サーバがリクエストに合うWEBサイトのデータを返却する
5. クライアントが受け取ったWEBサイトのデータを表示する

以上がWEBサイト表示までの流れになります。
どんなサービスか、どんな仕組みのWEBサイトか、どんなプログラミング言語を使っているか、これらに左右されないWEBサイトの表示に関わる仕組みの説明がクライアントとサーバの関係になります。

WEBサイト以外だと、印刷なんかでは似たような動きが起きていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273193/f7341021-e98f-1250-e692-495645f7b78d.png)

# フロントエンド、バックエンド、インフラ
この軸は役割中心の見方をした時のシステムの説明になります。

```フロントエンド.
画面の見た目に関わる動作をする領域
WEBサイトの最終成果物
・HTML
・CSS
・JavaScript/TypeScript
```
```バックエンド.
データベースとのやり取りや計算をする領域
・Java
・PHP
```
```インフラ.
データベースやファイルそのものを管理する領域
・サーバマシン
・AWS
・Azure
```

この分類の難しい点は必ずしも「`クライアント=フロントエンド`」「`サーバ=バックエンド`」とはならない点です。
例えばPHPという言語はバックエンドを主に扱う言語ですが、クライアント側の仕事もする事ができます。同じようにJavaScriptもクライアント・サーバ両方での仕事が可能です。
サーバ上でも画面デザインは作成できるし、クライアント側でも計算は可能だからです。

先ほどの印刷に照らし合わせて考えてみましょう。

クライアントとサーバで作業を分担しているパターン、負担を分けることで一定の速さがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273193/9ea01d42-2670-e20c-d612-7cdf4e302a99.png)

サーバ側に寄せて完成品を表示する処理だけクライアントに任せるパターン、サーバの方が強いマシンを使っていることが多いのでサイトの表示をとても速くできる特徴があります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273193/69676c15-0e69-de3a-105c-967a84fa97c5.png)

サーバ側にはデータだけ渡してもらって細かいことはクライアント側で行うパターンです。
あまり見ないパターンですが、状況次第では通信料の削減が可能なことがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273193/49733dd7-520c-aa1b-9df5-e7e38afed116.png)

# まとめ
- WEBサイトはサーバが持っていて、それをクライアントがお願いして表示する
- フロントとかバックというのはあくまで仕事内容が違うだけで、仕事場所に左右されるとは限らない

多少はイメージがついたでしょうか？
本当はもっとクライアントとサーバの間に色々挟まっていたりするのですがそれは次回以降とします。

特に「フロントエンドエンジニアだからサーバ知識がゼロ」みたいな謎の偏見がたまにあるので、そういう事が減っていくと嬉しいです。

二回目にして突然難しめな内容になってしまいましたがいかがでしょうか？
次回はインフラ関連として、データベースやCDNなどを触れていこうかと思います。

# おまけ
株式会社カスタマトリックスはエンジニアを募集しています！
完全未経験でも可！

- 新卒の方
https://www.customatrix.co.jp/newgrads/index.html

- 中途の方
https://customatrix.co.jp/career/index.html

https://www.instagram.com/cmx_pr/
社内勉強会の発信ネタがないときに見てほしいはなし 

# はじめに
[AXLBIT株式会社](https://axlbit.com/)では毎月1~2回の社内勉強会を開催しています。
新卒からベテランまで年次や部署を問わず参加できる社内で人気の企画です。

本記事はこんな方にお勧めです。
* 社内勉強会の運用ご担当
* 社内勉強会を開催したいけどネタに枯渇してしまったご担当
* 社内勉強会の当番が回ってきたけど何を話せばいいか困っているご担当

### AXLBIT株式会社、17期を迎えました
AXLBITは2024年8月で17期を迎えました。17期初の開催となる今回の勉強会は
「17期、どんな勉強会したい？大討論会！」というテーマのもと、スタッフ主導でどんな勉強会であればもっと参加したくなるかについてアイデアを出し合いました。

今回はそこで出たアイデアを述べていきます。

# 昨期の振り返り　16期の勉強会はどうだったか
**よかったこと**
* **過去最多の開催数**
前年比でも1.5倍の開催数となり、16期は過去最多の勉強会を開催することができました。
* **フォーマットの作成**
イベントレポート、輪読会の開催、新卒発表会など今後も継続して開催できるフォーマットを作ることができました。

**困ったこと**
* <font color="Red">**ネタが枯渇**</font>
日々の業務と並行しながら、登壇者が勉強会のネタを準備するのはそれなりにハード。
参加をしたいスタッフがいる一方で、登壇者がいなくて開催できないタイミングもあった。

# 17期の勉強会はどんな勉強会にしたいか。
さて、ここからが本題です。前述したとおり、
<font color="Red">**「ネタが枯渇することによって勉強会を開催できない！」**</font>
という問題を解決するために参加者を募り、ざっくばらんにアイデアを出し合いました。非常に活発なディスカッションとなり、多くの建設的な意見が飛び出しました。
![IMG_2964.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953187/79936966-3a2f-686f-cd57-e481a080ac0b.jpeg)

### ディスカッションの概要
今回の議論では、以下のテーマが中心に挙げられました。

1. **実務的な内容に関する勉強会**
2. **他部署の業務理解を深める勉強会**
3. **生成AIなど勉強会を通して最新のトレンドをインプットする**
4. **その他**

### 1.**実務的な内容に関する勉強会**
これまでの勉強会のネタと同様に、業務で使用している技術の共有する勉強会やすぐにでも使えるTipsの共有会など、参加してみたいという声が上がりました。
- 特に聞いてみたいと好評だったテーマ
    - 普段使っている解発ツールのtips共有会
    - タスク管理の方法やベストプラクティスの共有会
    - 当社製品の開発に関するディスカッション

### 2. **他部署の業務理解を深める勉強会**
他部署がどのように製品を開発しているか、開発された製品がどのように販売されているか、販売された製品がどのように顧客に運用されているか。など、他部署が普段行っている業務内容の共有会に参加してみたいと声が上がりました。
- 特に聞いてみたいと好評だったテーマ
    - 利用ユーザーの環境ごとのインフラ構成について
    - 営業部登壇！当社製品がどのように販売されているかセールストークを聞いてみよう
    - 事例から読み解く当社製品のユーザーの利用実態

### 3. **生成AIなど勉強会を通して最新のトレンドをインプットする**
AIブームの中でも生成AIについて、各個人ノウハウがバラバラになっているので、参加者の生成AIの活用事例やオリジナルな活用法を共有し、社内の生産性向上につなげる勉強会に参加してみたいという声が上がりました。
- 特に聞いてみたいと好評だったテーマ
    - chatGPTの上手な使い方
    - 生成AIのプロンプトエンジニアリング

### 4. **その他**
- その他、以下のようなアイデアも上がりました。
    - 社外コンペ、ハッカソンへの参加
    - 有名なエンジニアを招待して、お話を聞いてみたい
    - 「勉強会」を「キャッチーな名称」にリネームして、もっとカジュアルに盛り上げたい
    - 枕投げ大会に参加したい

# おわりに
いかがでしたでしょうか。社内勉強会のネタ出しの参考になれば幸いです。また、もし勉強会のネタに困っているご担当がいらっしゃったら今回のケースのように人を集めてブレストベースで話し合ってみると意外と簡単に発信ネタが見つかると思いますのでおススメです！
AXLBITでは今回の議論を基に、より充実した勉強会の運営を目指していく予定です。皆さんの意見を反映し、勉強会の内容を進化させることで、参加者全員のスキル向上と会社全体の成長を目指します。今回勉強会で共有されたアイデアや意見が、今後の勉強会のテーマとして積極的に取り入れていき、17期も勉強会の開催を続けてまいります。
[解決済み]SQLSTATE[HY000]: General error: 1364 Field '---' doesn't have a default value

**[解決しました](#解決20240823)**

```:環境
Laravel 11.6.0
PHP 8.3.10
MySQL 8.4.0
```

# 目的
ユーザー登録フォームを作りたい。
WEBアプリケーションからデータベースに値を正常に挿入したい。

# 何が起きた？
![CleanShot 2024-08-20 at 17.18.17@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/1d1a067d-b986-6d66-1cbf-898e2bda2289.png)
「'email'ってフィールドが空っぽだしデフォルト値を入れようにも無いから困っちゃった」というエラー。
Emailは使わないのでマイグレーションを使ってemailカラムを削除したがこのようなエラーが出ている。

フォームにはEmail入力フィールドを作っていないし、SQL GUIツールでemailカラムが削除されていることを目視で確認。

# migrations
### 作成
```:0001_01_01_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->string('belongs');
    $table->timestamps();
});
```

### カラム削除
```:2024_08_19_171010_remove_email_from_users_table.php
Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('email');
    $table->dropColumn('email_verified_at');
});
```
```:2024_08_19_165549_remove_belongs_from_users_table.php
Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('belongs');
});
```

### カラム名変更
```:2024_08_20_160912_change_column_users_table.php
Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('name', 'username');
});
```
ちなみに`belongs`というカラムはユーザー登録機能を作ろうとした時に参考にしていた記事を真似たもの。
後々必要ないと思い削除した。

# 試み
- 関係しそうなファイルにemailが残っていないか確認
`register.blade.php`, `UserController.php`, `Models/User.php`, `UserFactory.php`, `DatabaseSeeder.php`, `config/auth.php`
- エラーログ確認→[これ](#何が起きた)と同じ内容のエラーしか確認できず。
- キャッシュ削除、Laravel, MySQLの再起動
- `php artisan migrate:fresh`実行
- 誤字脱字確認
- `php artisan db:seed`実行→正常にサンプルが挿入された。

# わからん
俺1人のユーザー登録さえできたら良いので いっそSQL GUIツールで直接データ追加しようとも思いましたが、これも良い機会なのでどうにか解決して身につけたい。

# 解決(2024/08/23)
**[結論]`.env.local`の`DB_DATABASE`項目が間違えていただけだった。**

プロジェクト内の全ての`email`を検索し、削除またはコメントアウトしたものの[これ](#何が起きた)は解決せず、怒ったので別のテーブルを作り直した。
しかし今度は違うエラーが発生…。
`SQLSTATE[42S02]: Base table or view not found: 1146 Table 'ourlaravelapp.admin' doesn't exist`
とりあえずググるも解決には至らず、ログも同じことが書いてあるので堂々巡り。
エラー文と睨めっこ………あれ…？

`ourlaravelapp`…？この文字どこかで…。

_**ア！**_

これ！Udemyの教材で学習してた時に使ってたデータベース名だ！！
検索してみると`.env.local`に`DB_DATABASE=ourlaravelapp`の文字
なぜこちらのプロジェクトに前使っていたデータベースがあるのかは謎なものの、とりあえず現在使っているデータベース名に変更。
![CleanShot 2024-08-23 at 17.15.48@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/edbc5c44-f86c-ad1e-7dd2-9280142e4596.png)
![CleanShot 2024-08-23 at 17.16.56@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798584/df9e515c-bc62-4a2a-6004-89bc342a6177.png)

ｷﾀ━━━(ﾟ∀ﾟ)━━━!!
やりました！これにて解決です！！
また一歩進みました！
もはやググる必要なし！？オススメ次世代AI「perplexity」のご紹介！

## はじめに
皆さんは普段の開発において生成AIは活用されるでしょうか。
私はもう生成AIが無い生活は送っていけないと断言出来るほど生成AIを活用しています（業務でもそれ以外でも）。
今日は、個人的に割と使ってみて感動した生成AIを新たに発見しましたので記事にしてみます！その名も「Perplexity AI(パープレキシティAI)」です！

## Perplexity AIとは？
Perplexity AIは、以前Google AIで活動していた個人のチームによって開発された、AIを搭載した対話型検索エンジンです。
`インターネット上の複数のソースを参照`し、引用リンクを含む正確な回答を生成します。これにより、情報の信頼性が高まり、検索時間を短縮できます。

### 主な特徴
- **情報の透明性**: Perplexity AIは、提供された回答の情報源を明示します。これにより、ユーザーは回答の信頼性を確認し、情報の出典を理解することができます。
- **多様なAIモデルの使用**: OpenAIのGPT-4やAnthropicのClaude、Mistralなど、さまざまなAIモデルをサポートしており、ユーザーのニーズに応じて最適なモデルを選択できます。
- **リアルタイム検索能力**: インターネット上の最新情報をリアルタイムで検索し、ユーザーに提供します。
- **アカウント登録不要**: アカウント登録やログインの手続きが不要で、誰でもすぐに利用を開始できます。

## Perplexity AIの利点
まあよくある生成AIといった感じですが、このAIがほかと違うのは↑にもある通り、<font color="red">**回答する際に出典が明示されること**</font>です！
これの何が嬉しいかというと、`情報の信頼性が確認しやすい`ということですね！
そもそも生成AIというのは、インターネットなどから収集した大量のデータでモデルを学習するため、そのデータ内に偏りや誤った情報が含まれてしまい、結果として誤情報を生成してしまうことがあります。これを「`ハルシネーション`」と言いますが、Perplexity AIの場合は出典が明記されるため、ユーザーは`生成された情報がどのソースに基づいているかを確認でき、誤情報を避けること`ができます！！

## 実際の使用例
試しにJavaScriptのアロー関数と通常の関数の違いを聞いてみましょう！↓
![FireShot Capture 001 - Perplexity - www.perplexity.ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832049/d6bd8e7f-5378-099e-23d2-91ce27f722db.png)

↑の「ソース」の部分を見ていただくと、回答の参考にした記事が表示されていますね！回答内容も見た感じしっかりしてそうです。
もし回答が怪しければ、「ソース」の元記事を見ることで信頼できるかどうか判断できます。
これは自分でググるよりも断然便利なのでは…？

## まとめ
Perplexity AIは、次世代の情報検索を体験できる優れたツールです。
情報の透明性が高く、最新情報へのアクセスも容易であるため、個人の作業効率を大幅に向上させることができます。
ぜひ、業務や研究にPerplexity AIを活用してみてください！！

# 参考

https://www.perplexity.ai/

## JISOUのメンバー募集中🔥
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
気になる方はぜひHPからライン登録お願いします！👇

https://projisou.jp/
Paiza×Qiitaキャンペーン Javaで解説してみた【D N倍の文字列 編】

# 問題へのリンク

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/leftover

# 解答コード

<details><summary>詳細</summary>

~~~

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		final int M = scanner.nextInt();
		final int P = scanner.nextInt();
		final int Q = scanner.nextInt();

		double answer = M * (100 - P) * (100 - Q);
		answer /= 100.0 * 100.0;

		System.out.println(answer);
		scanner.close();
	}
}


~~~

</details>

<details><summary>10進数計算</summary>

~~~

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		final BigDecimal M = BigDecimal.valueOf(scanner.nextLong());
		final BigDecimal P = BigDecimal.valueOf(scanner.nextLong());
		final BigDecimal Q = BigDecimal.valueOf(scanner.nextLong());

		BigDecimal unsolded = sold(M, P);
		BigDecimal answer = sold(unsolded, Q);

		System.out.println(answer);
		scanner.close();
	}

	private static final BigDecimal HUNDRED = BigDecimal.valueOf(100);

	private static BigDecimal sold(BigDecimal food, BigDecimal salePercentage) {
		BigDecimal remainingPercentage = HUNDRED.subtract(salePercentage);
		BigDecimal unsolded = food.multiply(remainingPercentage).divide(HUNDRED,4,RoundingMode.HALF_UP);
		return unsolded;
	}
}

}


~~~

</details>
# 解説

<details><summary>詳細</summary>

人間はこじらせている人以外は10進数で計算を行いますが、コンピュータは2進数で計算を行います。循環小数になる条件が10進数と2進数で異なる為、基本的に整数計算で行い、最後に除算を行うと誤差が最小限に抑えられます。
具体的には、分母・分子が整数かつ約分済み分数表記を行った際に、分母が2の乗数で表記できるならば誤差は出ません。10進数の場合は、分母が2の乗数と5の乗数の

</details>

<details><summary>10進数計算</summary>

</details>
【Revit】DockablePaneとは

# 概要
Revitアドイン開発で使用する可能性がある、DockablePaneについて纏めました。

# DockablePaneとは
RevitAPI側が用意している、画面を埋め込めるウィンドウみたいなもの。Revitが用意しているものなので、Revitの上下左右にドッキングされた状態で表示することができる。また、通常のウィンドウのようにフロート状態で表示することも可能。

# 設定方法
Revit起動時に走る、`OnStartup()`の引数`UIControlledApplication`を使用して設定できる。
RevitAPIに定義されている`IDockablePaneProvider`というインターフェースをもつクラスの作成が必要。
以下は、WPFのウィンドウをセットしているところ。
```C#
pulic class Sample : IExternalApplication
{
    public Result OnStartup(UIControlledApplication uicapp)
    {
        var host = new host();
        var guid = new Guid("{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}");
        var dockablePaneId = new DockablePaneId(guid);
        uicapp.RegisterDockablePane(dockablePaneId, "タイトル名", host);
    }
}
```
```C#
    public class host : IDockablePaneProvider
    {
        public SampleView Content = new SampleView();  // WPFのviewのクラス
        public object DataContext => Content.DataContext;

        public void SetupDockablePane(DockablePaneProviderData data)
        {
            data.FrameworkElement = Content;
            data.InitialState.DockPosition = DockPosition.Tabbed;  // どの部分にドッキングするか
        }
    }
```

# DockablePaneが開かれたり、閉じられる際の処理
DockablePaneが開閉時に特定の処理を行いたい場合は、下記のように行う。

```C#
public Result OnStartup(UIControlledApplication uicapp)
{
    uicapp.DockableFrameVisibilityChanged += new EventHandler<DockableFrameVisibilityChangedEventArgs>(DockablePane_Changed);
}

private void DockablePane_Changed(object obj, DockableFrameVisibilityChangedEventArgs args)
{
    if (args.DockableFrameShown)
    {
        // 開かれるときの処理
    }
    else
    {
        // 閉じられるときの処理
    }
}
```

# 注意点
DockablePaneの開閉状態は、Revit終了時にRevit自体の設定として保存されているようです。
※参考文献があるわけではなく、挙動からの私の推測です。DockablePaneが開いた状態でRevitを終了し、再度起動して物件ファイルを開くと、DockablePaneが開いた状態のままでした。

なので、もし物件ファイルが開かれた後は、必ずDockablePaneは閉じていないといけない場合は、例えば`UIControlledApplication`の`ViewActivated`に、`DockablePane`が開いていたら閉じる、という処理を接続しておく形もよさそうかと思いました。

```C#
    private void ViewActivated(object sender, ViewActivatedEventArgs e)
    {
        uicapp.GetDockablePane(dockablePaneId).Hide();
    }

```

:::note
`uicapp`は`OnStartup`の引数である`UIControlledApplication`、`dockablePaneId`はDockablePaneを追加するときに使用したクラスです。どちらも`OnStartup`の処理中にプロパティとして保持しておくと良いかもしれません。
:::
3Dスキャナーをスマートフォンに接続する方法

近年、3Dスキャナーは急速に進化し、プロの現場だけでなく一般ユーザーにも使いやすくなりました。特にスマートフォンと接続することで、いつでもどこでも簡単に3Dデータを取り込むことができるようになりました。この便利なツールを最大限に活用するために、3Dスキャナーとスマートフォンの接続方法を詳しく説明します。

1. 適切な 3D スキャナーを選択する
まず、スマートフォンに接続できる3Dスキャナーを選ぶことが重要です。たとえば、POP 3 Plus 3D スキャナーや iSense などの多くのスキャナーは、Wi-Fi または USB Type-C を使用してスマートフォンに簡単に接続できます。どのスキャナーを選択するかは、用途やスキャンしたい内容によって異なるため、事前に十分な調査を行うことをお勧めします。

https://www.revopoint3d.jp/products/portable-3d-scanner-pop3

2.専用アプリをインストールする
次に、専用の3Dスキャナーアプリをスマートフォンにインストールします。これらのアプリは、App Store または Google Play から無料でダウンロードできます。例えば「Revo Scan」や「3D Scanner App」といったアプリが一般的です。アプリを使用すると、スキャンデータを表示、編集し、クラウドにアップロードすることもできます。

3. スキャナーとスマートフォンを接続する
スキャナーの電源をオンにし、Wi-Fi 経由で接続している場合は、スマートフォンの設定画面からスキャナーのネットワークを選択します。 USB Type-C接続の場合は、ケーブルを使用してスマートフォンに直接接続します。接続が完了すると、アプリケーションは自動的にスキャナを認識し、準備完了のメッセージを表示します。

4. スキャンを開始します
スキャナーとスマートフォンが正常に接続されたら、スキャンを開始できます。アプリでスキャンモードを選択し、オブジェクトをゆっくりスキャンします。スキャンすると、スマートフォンの画面にライブプレビューが表示されるので、微調整が簡単になります。スキャンが完了すると、データはすぐに表示され、必要に応じてその場で編集できます。

5. データの保存と共有
スキャンが完了したら、データを携帯電話に保存するか、クラウドにアップロードします。また、ソーシャル メディアで友人と簡単に共有したり、3D 印刷用ファイル形式 (STL ファイルなど) に変換して 3D プリンターで印刷したりすることもできます。

結論は
スマートフォンと3Dスキャナーの組み合わせは、創作活動をより簡単に、より楽しくするツールになりました。以下の手順で誰でも簡単に3Dスキャンを楽しむことができます。ぜひ試してみてください。
Webフロントエンド開発環境構築

## nvm のインストール

### 1. インストール
https://github.com/coreybutler/nvm-windows/releases
↑ここから任意のバージョンの nvm-setup.zip をダウンロード

### 2. コマンドプロンプトを開き、インストールしたバージョンが表示されることを確認
```
nvm version
```

### 3. 最新版 Node.js のインストール
```
nvm install latest
```

### 4. 使用する Node.js のバージョンを指定
```
nvm use 20.16
```

### 5. インストール済みのバージョンを表示し、指定したバージョンが既定のバージョンになっているか確認
```
nvm list
```

### 6. node.js と npm のバージョンを確認
```
node -v
npm -v
```

#### 参考サイト
https://qiita.com/akipon0821/items/eaeffe79221cfcd4d258

## WSL のインストール

以下 PowerShell で ・・・

### 1. インストール
```
wsl --install
```

### 2. 使用可能な Linux ディストリビューションを一覧表示
```
wsl --list --online
```

####  3. 指定ディストリビューションをインストール
```
wsl --install [ ディストリビューション名 ]
　　　　　　　　　　　　　　↑ 「 Ubuntu 」 など
```

#### 4. インストールされている Linux ディストリビューションを一覧表示
```
wsl --list --verbose
```

#### 5. ディレクトリをホームに変更
```
wsl ~
```

#### 6. Linux ディストリビューションを実行
```
wsl --distribution [ ディストリビューション名 ] --user [ ユーザ名 ]
```

#### 7. WSL を更新
```
wsl --update
```

#### 8. WSL の状態を確認
```
wsl --status
```

#### 9. WSL のバージョンを確認
```
wsl --version
```

#### 10. ヘルプ コマンド
```
wsl --help
```

#### 11. 特定のユーザーとして実行
```
wsl --user [ ユーザ名 ]
```

#### 12. Terminate ( 削除 )
```
wsl --terminate [ ディストリビューション名 ]
```

#### 13. ディストリビューションの既定ユーザーを変更
```
[ ディストリビューション名 ] config --default-user [ ユーザ名 ]
```

#### 14. シャットダウン
```
wsl --shutdown
```

参考サイト
https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands

## Next.js プロジェクトをビルド

以下 コマンドプロンプトで ・・・

#### 1. プロジェクト作成
```
npx create-next-app@latest [ App Name ]
```

#### 2. プロジェクトディレクトリ内へ移動
```
cd [ App Name ]
```

#### 3. プロジェクトをビルド
```
npx next build
```

#### 4. プロジェクトを実行
```
npm start
```

#### 参考サイト
https://zenn.dev/naoji/articles/nextjs-10minitues-installation-0010
【Power Automate Desktop】ChatworkにPDFを自動アップロードする

### 概要

PowerAutomateを介してAPIを使用し、Chatworkの任意のルームにPDFファイルを自動送信するアクションを作成しました。

APIを用いてメッセージのみのPOSTに関しては既に別記事で紹介されていましたが、ファイル送信を行おうとした際、躓いたのでここに共有します。

(Chatwork関連の文献が少ないということと、自分自身PowerShellの経験が少なく、自分用というのも兼ねて記事に起こしてみた次第です)

### 手順

フロー内に"PowerShell スクリプトを実行"アクションを用意し、以下のコードを貼り付けます。

```rb
# ファイルパスを指定
$filePath = "C:\Users\sample\sample.pdf" 


# メッセージを指定
$message =  "ファイルがアップロードされました。" 
#メッセージは必要に合わせて変更してください

# API URLを指定
$url = "https://api.chatwork.com/v2/rooms/00000000/files"  # 00000000の部分を実際のルームIDに置き換える

# ヘッダーの設定
$headers = @{
    "X-ChatWorkToken" = "ChatWorkToken"  # 実際のトークンに置き換える
    "Accept" = "application/json"
}

# フォームデータ作成
$boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"

# ファイルのバイナリデータを読み込み
$fileBytes = [System.IO.File]::ReadAllBytes($filePath)
$fileContent = [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($fileBytes)


# 日本語メッセージのUTF-8エンコード
$messageBytes = [System.Text.Encoding]::UTF8.GetBytes($message)
$messageContent = [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($messageBytes)

# 日本語ファイル名のUTF-8エンコード
$fileName = [System.IO.Path]::GetFileName($filePath)
$fileNameEncoded = [System.Text.Encoding]::UTF8.GetBytes($fileName)
$fileNameUtf8 = [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($fileNameEncoded)

$formData = @"
--$boundary
Content-Disposition: form-data; name="message"

$messageContent

--$boundary
Content-Disposition: form-data; name="file"; filename*="utf-8''$fileNameUtf8"
Content-Type: application/pdf

$fileContent

--$boundary--
"@

# HTTPリクエストの送信
$response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $formData -ContentType "multipart/form-data; boundary=$boundary"

# レスポンスの出力
$response | ConvertTo-Json

```
:::note warn
躓いた点

* ヘッダーの境界は2本のダッシュで始まり、最後の境界には最後にも2本のダッシュが入る

* 改行を余分に挟むと上手く送信できない
* 日本語を扱うときは適切にエンコードを行うこと

:::

お役に立てたら幸いです。
??null;って何よ。三項演算子も一緒に　備忘録

chatgptさんにいつもの如く質問してたら、回答の一部にこんなのが…
```
$edit_id = $_POST["edit_id"] ?? null;
```
何言ってんだかよくわからなかったので再度chatgptさんに聞き直したら、
「PHP 7.0 で導入された null 合体演算子（null coalescing operator）」
と言われました。簡単に言っちゃば、三項演算子をもっと簡略化したやつ(?)みたい。

## 三項演算子
構文: 条件式 ? trueで出力される値 : falseで出力される値;

例：
```
echo isset($edit_comment) ? $edit_comment : ""; 
```

## NULL合体演算子
構文: 値1 ?? 値2;
動作: 左側の値が null または未定義であれば、右側の値を返します。左側の値が null でなければ、その値を返す。
例：
```
$edit_id = $_POST["edit_id"] ?? null;
```
That's all.
Amazon Route 53 ResolverでわかるDNSの仕組み

## はじめに

この記事は、AWSを初めて触る方向けに、Amazon Route 53 Resolverというサービスを通して、DNSの仕組みを分かりやすく解説します。DNSは、ウェブサイトやアプリケーションへのアクセスを管理する重要な役割を担っています。

### Amazon Route 53 Resolverとは？

Amazon Route 53 Resolverは、AWSが提供するDNSサービスです。DNSとは、インターネット上のウェブサイトやサービスの住所録のようなものです。例えば、"www.amazon.com"という文字列を、実際にアクセスするためのIPアドレスに変換する役割を担っています。
![AWS-Black-Belt_2023_Amazon-Route53-Resolver_0530_v1-09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102361/776853c0-613e-7a34-38b6-584183945b96.jpeg)


###  Amazon Route 53 Resolverの3つのサービス

Amazon Route 53 Resolverには、以下の3つの主要なサービスがあります。

1. **Amazon Route 53 Hosted Zone**:  ウェブサイトやアプリケーションのDNSレコードを管理する場所です。
2. **Amazon Route 53 Resolver**:  AWS環境内で、DNSの問い合わせを処理するサービスです。
3. **Amazon Route 53 Resolver for Hybrid Cloud**:  AWS環境とオンプレミス環境を連携し、DNSの問い合わせを統合的に管理するサービスです。
![AWS-Black-Belt_2023_Amazon-Route53-Resolver_0530_v1-22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102361/8692e02a-f613-e352-bca7-ba0482f9c36b.jpeg)

###  3つのゾーンと名前解決の仕組み

DNSは、大きく3つのゾーンで構成されています。

1. **インターネット向けのゾーン**:  インターネット上で公開されているウェブサイトやサービスのDNSレコードを管理します。
2. **AWS環境向けのゾーン**:  AWSの仮想ネットワーク(VPC)内のサービスのDNSレコードを管理します。
3. **オンプレミス環境向けのゾーン**:  企業の自社ネットワーク内のサービスのDNSレコードを管理します。
![AWS-Black-Belt_2023_Amazon-Route53-Resolver_0530_v1-07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102361/ffad8a7d-7d67-e065-576a-de918448d05b.jpeg)

Amazon Route 53 Resolverは、これらの3つのゾーン全てに対応し、効率的に名前解決を行うことができます。

### ハイブリッドクラウド環境におけるDNS管理

Amazon Route 53 Resolver for Hybrid Cloudは、AWS環境とオンプレミス環境を連携し、DNSの問い合わせを統合的に管理します。これにより、オンプレミスのサーバーからAWS環境内のサービスへのアクセスをスムーズに行うことが可能になります。
![AWS-Black-Belt_2023_Amazon-Route53-Resolver_0530_v1-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102361/d564ed4a-be21-230e-b169-b4dbdaaeeb89.jpeg)

###  Amazon Route 53 Resolverの利点

- **高可用性**:  AWSのインフラストラクチャを利用することで、高い信頼性と安定性を確保できます。
- **セキュリティ**:  DNSセキュリティ対策機能を提供し、不正なアクセスからネットワークを保護します。
- **コスト効率**:  マネージドサービスであるため、自社でDNSサーバーを構築・運用する必要がなく、コスト削減に貢献します。

###  まとめ

Amazon Route 53 Resolverは、AWS環境におけるDNS管理を効率化し、セキュリティ対策も強化するサービスです。ハイブリッドクラウド環境にも対応することで、オンプレミスとの連携をスムーズに行うことができます。
AWSの導入や運用を検討する際には、Amazon Route 53 Resolverを活用することで、ビジネスの安定性とセキュリティを向上させることが期待できます。

### 参考
[Amazon Route 53 Resolver【AWS Black Belt】](https://www.youtube.com/watch?v=6nf6vIQha1g)
[Amazon Route 53 Resolver【AWS Black Belt】/PDF](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbUMtU2hPd2tndGJvUVJmNE5Ea1JVQmpQU290QXxBQ3Jtc0ttTFEybTVzUDZUQm5HOVZqY3FiTmg5WW8wUkt6QmpzMWg3V3doUXZwdTBmQ01yNEtSdVZyblp3ejBlQXBZN2k5N3Bfa3FTdTN1WkxOQmkyeEJKSjBYcEpqSXNhMmMxSHpmRUZKX3Z2WDJmMG9BM0wxRQ&q=https%3A%2F%2Fpages.awscloud.com%2Frs%2F112-TZM-766%2Fimages%2FAWS-Black-Belt_2023_Amazon-Route53-Resolver_0530_v1.pdf&v=6nf6vIQha1g)
Azure OpenAIからセキュアにAzureAISearchにアクセスする

# はじめに
* 以前投稿した、[Azure OpenAIのデータ ソース機能を検証した（APIバージョン. 2024-02-01）](https://qiita.com/tuneyukkie/items/1f362a9ff76b2bdf3db2) では、Azure AI Searchにはアクセス制限をかけていなかったため、AI SearchのAPIKeyが漏れた場合に、不正アクセスがなされるリスクがあった
* 今回、APIKeyを使わずに、「システム割り当てマネージドID」を使った認証に切り替えることで、OpenAI以外からのアクセスを完全に防御し、リスクを排除した
* 備忘録として記事に残しておく。APIバージョンは前回と同じ、2024-02-01を使用している

実施前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/4e6c8369-733a-cd04-7515-3509ff3a8a16.png)

実施後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/cd2a0ab1-dea9-1870-0b3a-6c4e056dcd0c.png)


# 手順
## OpenAIの「システム割り当てマネージドID」を有効化する
* OpenAIのリソースを開き、Identity > System assignedと進み、初期値はOFFになっているので、ONにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/210e8b5e-3457-37dc-a469-c5d4a1904bb3.png)

## Azure AI SearchでマネージドID認証を有効化する
* AI Searchのリソースを開き、Keysより、「API Access control」を、「Role-based access control」か「Both」にする
    * 従来のAPIKeyでのアクセス手段も残しておく必要のある場合はBothにしておこう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/c832219c-1f3c-deb8-dcda-2e9d8e666d26.png)

## Azure AI SearchのIAMで、OpenAIにアクセス権を付与する
* Azure AI SearchのIAMを開き、以下の2つのRoleを、OpenAIのマネージドIDに付与する
    * Search Service Contributor
    * Search Index Data Reader

「Managed Identity」を選択し、メンバーに該当のOpenAIを選択しよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/1ddc235d-9b5a-f4aa-ff6c-e3f48b68d614.png)

## Azure AI SearchのFirewallを有効化し、パブリックアクセスを禁止する
* Azure AI Searchを開き、Networking > Firewalls and virtual networks より、「Public network access」を「Disabled」にし、Exceptionsにチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/c829d64d-2a82-d413-8c19-7cfbd1e2f878.png)

# 参考：マネージドID認証の場合のリクエストBody
* 以下のようになる。
```
{
    "messages": [
        {
            "role": "user",
            "content": "ペット連れだけど大丈夫？"
        }
    ],
    "data_sources": [
        {
            "type": "azure_search",
            "parameters": {
                "endpoint": "https://{AI Searchサブドメイン}.search.windows.net",
                "index_name": "{インデックス名}",
                "authentication": {
                    "type": "system_assigned_managed_identity"
                }
            }
        }
    ],
    "max_tokens": 200,
    "stream": false
}
```
* 以前のAPI Keyの場合（↓）は、キーをBodyに埋め込んでいたが、それも不要になった

```
                "authentication": {
                    "type": "api_key",
                    "key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                },
```

# ハマりどころ
* Azure AI Searchは、設定変更後、反映までに数分ディレイがあるので、それも考慮して確認すること
* 設定がうまくいかずエラーになる場合がある。以下を参考にチェックしよう。
    * 400エラーの場合は、権限（RBACやIAM）まわりに問題
    * 403エラーの場合は、ネットワークアクセス制限まわりに問題

# リファレンス
* [Securely use Azure OpenAI On Your Data](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/use-your-data-securely#role-assignments)
* [データ ソース - Azure AI 検索](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/references/azure-search?tabs=python)
【Flutter】The product is not available for purchase.

# 状況
クローズドテストはすでに開始しており、Google Play Storeからインストールしたアプリだとちゃんとアイテムが表示されるのに、VScodeからdebugで実行するとタイトルのエラーが現れる。
多くの対処法ではクローズドテストの準備が整っていないなどが原因だが、自分の場合、それはありえないという状況だった。
解決にめっちゃ時間かかったので、備忘録として残しておく。

# 解決
RevenuCat Communityで[問い合わせた](https://community.revenuecat.com/general-questions-7/flutter-the-product-is-not-available-for-purchase-4890?postid=15650#post15650)ところ、ユーザがいる国かライセンステストのテスターとして登録されていないユーザかということ原因だといわれた。
Playストアはライセンステストのテスターで登録されているアカウントでログインしていたので、もしかすると、Playストアからインストールした場合は、テスター登録されているアカウントが使用されるが、VSCodeでデバッグする場合は、何か他のアカウントが使われている？？という推測がたった。

## Androidのアカウントって、どれが使われるの？
Androidで設定アプリを開くと上の方に「サインイン」というのがあったため、これでライセンステストのテスターとして登録されているアカウントでサインインしてみたが、結果はダメだった。
え...意味が分からない...と放置して、2週間後。
設定を下の方に行くと「ユーザとアカウント」という設定項目があることに気づいた。おっ！？と思って調べてみると、そこにはアカウントが2つ登録されていた。1つはテスター登録したアカウントでもう一つは登録されていないアカウントである。
テスター登録していないアカウントが上にあった。そこで、上のアカウントで勝手にログインされてるんじゃない？と思って、そのアカウントを削除して、テスターアカウントのみにしたら、VScodeのデバッグで起動しているアプリでもちゃんとアイテムが表示されるようになった。
とりあえず、「ユーザとアカウント」はテスターアカウントのみにしておこう。

# 結論
Androidのアカウントの仕様の知識不足だった...
パワポでプレゼンするときのテクニック（ポインター編）

# はじめに
Web会議などでパワポ資料を使った説明を受けているとき、資料のどこの部分の説明なのか分かりにくいと感じたことはありませんか？

# 概要
頑張ってプレゼンしたけど、資料の内容が相手に上手く伝わらないというのはもったいないので、パワポのスライドショーで使えるプレゼンテーターのちょっとしたテクニック（ポインターオプション）を紹介します。

# 内容
PowerPointのスライドショーにはポインターオプションとして以下の機能が用意されています。
これらを利用することで、表示しているスライド内で見てほしい箇所を指し示したり強調したりすることができます。

|ポインターオプション|説明|
|---|---|
|レーザーポインター|マウスのポインターがレーザーポインターに変わります|
|ペン|マウスの左クリック押下中に線や文字を書くことができます|
|蛍光ペン|マウスの左クリック押下中にマーカーを引くことができます|

それぞれのポインターを利用したときのイメージは以下のとおりです。

<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860061/14b643af-f05f-091b-62d5-97c4bbb19982.png">

# 利用方法
スライドショー実行中に右クリックメニューの「ポインターオプション」から選択可能ですが、
プレゼン中に右クリックメニューを見せたくないという場合は、以下ショートカットキーを利用するとスマートに進行できます。
|機能|ショートカットキー|機能をOFFにするとき<br>(デフォルトのポインターに戻すとき)|書いた内容をクリアするとき|
|---|---|---|---|
|レーザーポインター|「ctrl」 + L|「ctrl」 + L　または<br>「esc」|-|
|ペン|「ctrl」 + P|「ctrl」 + P　または<br>「esc」|E|
|蛍光ペン|「ctrl」 + I|「ctrl」 + I　または<br>「esc」|E|

# おわりに
Web会議ではネットワークの負荷状況等により画面表示と音声でタイムラグが発生する場合もあるため、ポインターの利用は状況判断が必要になりますが、ハマればプレゼンテーションの質が向上すると感じたので投稿してみました。
みなさまのプレゼンテーションの一助になれば幸いです。
Python3: List A から List B の要素を除く

リスト内包表記  を使います。

## プログラム

```py:remove_list.py
#! /usr/bin/python

list_aa = [1, 2, 3, 3, 4, 5, 4, 5, 6]
list_bb = [4,5]
print(list_aa)
print(list_bb)
bb_set = set(list_bb)
new_list = [item for item in list_aa if item not in bb_set]
print(new_list)
```

## 実行結果

```text
$ ./remove_list.py 
[1, 2, 3, 3, 4, 5, 4, 5, 6]
[4, 5]
[1, 2, 3, 3, 6]
```
ps aux でプロセス grep し PID 全 kill する、手間なアレのワンライナー

`pgrep` と `pkill` をご利用ください

下の記事はコマンドを知らない時に書いたものです

----

```bash
ps aux | grep YOUR_COMMAND | grep -v grep | awk '{print $2}' | xargs -I {} kill -9 {}
```

`ps aux | grep YOUR_COMMAND | grep -v grep`　で表示される「プロセス全て」について

* 意味を理解している
* 全キルしても問題ない

上二つが確かならば使う
一時的にキー情報を変更して aws cli コマンドを実行する

```bash
AWS_DEFAULT_REGION=ap-northeast-1 \
  AWS_ACCESS_KEY_ID=xxx \
  AWS_SECRET_ACCESS_KEY=xxx \
    aws s3 cp data.zip s3://my-test-bucket
```

`~/.aws` がない一時テストサーバーでよくやる。

history ファイルに情報が残るので、それを理解の上で使う。



参考：

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html
Proxmox-VE の Qdevice 作成方法

# ラズパイ等
```
# apt install corosync-qnetd
# systemctl enable --now corosync-qnetd.service
```
# ホスト側
```
# apt install corosync-qdevice
# pvecm qdevice setup [Qdevice IP Address]
# pvecm status
Cluster information
-------------------
Name:             Cluster
Config Version:   3
Transport:        knet
Secure auth:      on

Quorum information
------------------
Date:             Tue Apr  2 15:13:20 2024
Quorum provider:  corosync_votequorum
Nodes:            2
Node ID:          0x00000001
Ring ID:          1.52
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   3
Highest expected: 3
Total votes:      3
Quorum:           2
Flags:            Quorate Qdevice

Membership information
----------------------
    Nodeid      Votes    Qdevice Name
0x00000001          1    A,V,NMW 192.168.255.12 (local)
0x00000002          1    A,V,NMW 192.168.255.11
0x00000000          1            Qdevice ★
```
<br>消すとき
```
# pvecm qdevice remove
```