OmniAICreator/Qiita-1.07M huggingface dataset:
【Chakra UI】ChakraProviderを使用したときにvalueやchildrenに関するエラーが出るとき

# 事象
Chakra UIのInstallation通りにセットアップを進めていたが、
ChakraProviderで子コンポーネントを囲ったときにvalue属性とchildren属性を指定しろというエラーが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/80ff8650-6f15-ea7d-b2df-9084a8ace32d.png)

```typescript:index.tsx
import { ChakraProvider } from '@chakra-ui/react';

// 省略

const RootLayout:FC<Props> = memo((props) => {
    const {children} = props;

    return (
        <html lang="en">
            <head />
            <body>
                <ChakraProvider>
                    <Header />
                    {children}
                    <Footer />
                </ChakraProvider>
            </body>
        </html>
    );
});
```

## 環境
Chakra UI v2.10.4

# 原因
当該バージョンではChakraProviderコンポーネントにvalue属性を指定する必要がある

# 対応後
```typescript:index.tsx
import { ChakraProvider } from '@chakra-ui/react';
import { defaultSystem } from "@chakra-ui/react"; // これを追加

// 省略

const RootLayout:FC<Props> = memo((props) => {
    const {children} = props;

    return (
        <html lang="en">
            <head />
            <body>
                /* value属性を追加 */
                <ChakraProvider value={defaultSystem}>
                    <Header />
                    {children}
                    <Footer />
                </ChakraProvider>
            </body>
        </html>
    );
});
```
Vitest UI を導入して ブラウザからテストの実行結果やカバレッジを確認する


## はじめに

Vitest には Vitest UI と呼ばれるテスト実行をサポートしてくれるツールが存在します。
今回 Vitest UI のセットアップから実際に利用している状態までを簡単にまとめます。

## Vitest UI とは

Vitest 用のブラウザでテストの実行結果等を確認できるツールです。
通常コンソールで確認するテスト結果をブラウザ上で確認することができることはもちろん、テストが失敗した場合はスタックトーレス等も確認することができます。

## Vitest UI のセットアップ

### インストール

`@vitest/ui` を devDependencies に追加します。

```sh
npm install --save-dev @vitest/ui
```

### 設定の追加

Vitest UI で結果を確認するには `html` を追加してください。
`default` は記載する必要はありませんが、 コンソールでも確認したい場合は `default` も追加することを推奨します。

```ts:vitest.config.ts
export default {
  test: {
    reporters: ['default', 'html'],
  }
}
```

## Vitest UI の起動

Vitest を実行する際に `--ui` オプションを付与して起動します。

```sh
vitest --ui
```

実行するとブラウザが自動的に立ち上がりテスト結果を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/4ef1d617-bda9-9b42-f4a9-0fad559e8aa2.png)

また、ブラウザ上から実行対象のテストをフィルターすることも可能です。
加えて、テストの再実行も行うことができます。

## Ref

https://vitest.dev/guide/ui.html
競プロ日記#24/12/02

# ABC074 B - Collecting Balls (Easy Version) 

- ノートとペンでイメージを掴む。特にこの場合はとりあえずy = xの単純な一次関数でイメージするとどうすれば良いか簡単にイメージができた。
- 問題文をちゃんと解釈する。y軸に平行な2直線(1つはy軸)にロボットがあることをイメージすれば簡単な

# QBC090 B - Palindromic Numbers

シンプルな回文判定の問題
C++における回文判定のポイント
- 文字列はstr1.compare(str2)で比較（一致の場合はreturn 0）
- 回文判定はreverse()を使うがvoid返しの関数であることに気を付ける。つまり参照渡しになるので引数に与えたstringの変数がそのまま変更される
PHPで実行したSQLを見る方法

# はじめに
PHPでDBへ書き込みなどをした際に、実行したSQLを見る方法です。
$stmt->debugDumpParams();
[PDOStatement::debugDumpParams](https://www.php.net/manual/ja/pdostatement.debugdumpparams.php)

:::note alert
警告
機密情報が漏れる可能性があるので、本番環境では絶対に使用しないでください。
:::

# 使い方
## 使用DB

| id | name  | email  | age |
|:-:|:-:|:-:|:-:|
| 1  | John Doe  |  john@example.com | 25  |
|  2 | Jane Smith  | jane@example.com   |  30 |

```sql
CREATE DATABASE testdb;

USE testdb;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    age INT NOT NULL
);

INSERT INTO users (name, email, age) VALUES
('John Doe', 'john@example.com', 25),
('Jane Smith', 'jane@example.com', 30);
```

## 使い方

PDOオブジェクトを作成し、プリペアドステートメントに含まれる情報を直接出力させる。

```php:update_db.php
<?php
// データベース接続情報
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$username = 'root';
$password = '';

try {
    // PDOオブジェクトの作成
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SQL文
    $sql = 'SELECT * FROM users WHERE id = :id';
    $stmt = $pdo->prepare($sql);

    // パラメータのバインド
    $id = 1;
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);

    // debugDumpParams()
    echo "クエリの詳細:\n";
    $stmt->debugDumpParams();

    // 実行
    $stmt->execute();

    // 結果
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

} catch (PDOException $e) {
    echo 'エラー: ' . $e->getMessage();
}
```

```:result
SQL: [28] SELECT * FROM users WHERE id = :id
Params:  1
Key: Name: [3] :id
paramno=-1
name=[3] ":id"
is_param=1
param_type=1
```

# おわり
PHPのPDOでどんなSQLが実行されているか見る方法でした。
高専プロコン 競技部門で実装出来たらうれしかったこと

# はじめに
Siv3Dアドベントカレンダー11日目の記事です．今年の高専プロコンでの経験を踏まえ，Siv3Dを用いた高専プロコン競技のビジュアライザで実装するべきだったことを，来年のために書きます．

## procon35について
今年行われたのは第35回で，#procon35というタグがついていました．奈良で行われ，競技部門は画像を色ごとに0～3に割り当て，並べ替えられたものが与えられるので，それを指定の操作により復元するというものでした．

![プロコン柿_倍速_カット.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561448/820e65a2-d96f-b283-bd43-3779ab46df9d.gif)

これは1回戦の柿だったきがします．遠目に見たら皿の上に柿が二つ載っているような写真に見えるような見えないような．．．

## 大会結果

試合はというと，準決勝まで行きましたが，力及ばず敗退してしまいました．
言い訳にはなりますが，ビームサーチを書いていて，十分間に合うと思っていたプログラムが12秒間に合いませんでした．

## Siv3Dの非同期処理について

[公式ドキュメント](https://siv3d.github.io/ja-jp/reference/async/#32-%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E6%AD%A2%E3%82%81%E3%81%9A%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%AB%E6%99%82%E9%96%93%E3%81%AE%E3%81%8B%E3%81%8B%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E5%BE%97%E3%82%8B)
が分かりやすいと思います．
ざっくりいうと，メインループを止めずに重い処理をすることができます．

## 本番当時の実装と新しく実装したこと

本番では，
`Manual`（人力），`Algo`（貪欲，ビムサのどちらか），`Auto`（ビムサ）の三つのモードを用意していました．3人チームで，私はビムサ（一番時間がかかる），他の二人にはパラメータを変えて貪欲と軽いビムサを打ってもらいました．
私が使っていたのはcore i9にRTX4090のモバイルゲーミングPCを使っていて，マシンパワーにより十分ビームサーチが間に合うため，ビムサだけは知らせておけばよいと高を括っていました．しかし，会場のコンセントにつなげてもパフォーマンスが出ずに，間に合いませんでした．本番前にパラメータをいじるために使いすぎて熱暴走したのが今のところ有力です．
こんなイレギュラーが起きたときに，すぐさま軽いアルゴリズムに変更できればよかったものの，当時は実装出来ていませんでした．
そこで，**非同期処理**の出番です．

```cpp:非同期処理.cpp
// 非同期処理の宣言
AsyncTask<実行したい関数の戻り値の型> task;

// Autoモードの非同期処理
AsyncTask<Algorithm::Solution> automatedTask;

// アルゴリズムモードの非同期処理
AsyncTask<Algorithm::Solution> algorithmTask;

// 非同期処理の呼び出し
task = Async(関数名, 引き数1, 引き数2, ...);

// Autoのボタンを押す
automatedTask = Async(Algorithm::solve, Algorithm::Type::BeamSearch, board, patterns);

// アルゴリズムの実行ボタンを押す
algorithmTask = Async(Algorithm::solve, algorithms[currentAlgorithm], board, patterns);
```

引き数が参照渡しのときは`std::ref()`をそれぞれつけなければいけないところにハマりました．
![プロコン非同期処理.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561448/e39a6867-988b-6c8e-1e45-7816afba753f.gif)

分かりにくいですが，`Auto`ボタンを押して，バックでビームサーチを走らせながらも，`Algorithm`ボタンを押してより高速な貪欲法を呼び出して解くことができます．

## まとめ

来年のプロコンには非同期処理を活用したい！！
対面で見てくださったSiv3Dの鈴木さん，ありがとうございました．
サクラエディタから離れられない話

いまや、息をするようにサクラエディタを日常的に使っている。仕事のパソコンでもプライベートのパソコンでも。

:::note info
あくまで一個人の思い出です。
:::

# 経緯

そもそもパソコンを親しむようになったのは、社会人になってから。大学生のころは論文だかレポートだかをわからないなりにWordで必死に書いていた。それが「必ずパソコンを使わなければならない」という環境に身を置くと、いつの間にかブラインドタッチができるようになったり、パソコンそのものも理解できるようになった。と思う。

どんな経緯で教えてもらったのか朧げだが、たぶん、テキスト形式のインターフェースを見たり編集したりするために教えてもらったと思う。インターフェースは行単位でレイアウトが決まっていて、データ部分を見るときにサクラエディタは重宝した。

# 感動したこと①

特に感動したのは、短冊選択。

横＋縦でしか選択できなかった世界から、縦だけをスーッと選択出来るようになる世界へ。一種の快感を覚えた瞬間である。特定の文字数目をピンポイントに修正できる。需要と供給が一致したとはこのことである。

途中からショートカットを駆使してマウスなしで操作できることを覚え、いつしかその操作をすることが当たり前になっていた。もちろんそれ以外のショートカットも最低限使う分くらいは覚えた。どのキーを、というよりはどの位置にあるキーを、という覚え方。使うPCのキーボードに依存する覚え方なのは玉に瑕だが、使えればいいので気にしたら負けである。

サクラエディタを覚えたての時期は、秀丸派とサクラエディタ派がひっそりと二分していた。秀丸派はプライベートでシェアウェアとしてお支払いをしていたのだとか。当時学生上がりの私は、とんでもなくリッチな人もいたもんだと驚いたものである。（今はサブスク使いまくりの私である。）

# 感動したこと②

あとは、サクラエディタが正規表現を気軽に使うツールという認識になってきたとこ。これは言いすぎかもしれないが。

プログラミングの世界では当たり前であろう正規表現。それをプログラミング外で初めて使ったのが、サクラエディタ。正規表現を入れて、思い通りに選択や操作ができたときの快感よ。

業務中にUNIXで「^」とか「$」を覚えて、特定の文字から改行するまでを選択、先頭から特定の文字までを選択、をできたときが一番感動した。

# 若気の至り

だがしかし、無料のテキストエディタは他にもあるやないかいと気付く。

例えばTeraPad。TeraTermの親戚くらいかなと思っている。確か、UNIX系OS本のハンズオン的なページにあったのが最初の出会い。アイコンもシンプルで、サクラエディタ以外のエディタも使いこなしてみたいとソワソワしていた私はトキメイた。

新天地に足を踏み入れる感覚でなんとなく使ってみたが、やはりサクラエディタに戻ってきてしまった。咄嗟にサササッと操作できるのがサクラエディタだったから。慣れとは良し悪しがあるなあと思った。

# 何事も安心感が大事

そんな浮気心を弄びつつ今に至る。配色は初期設定のままだが、それが無性に安心する。
SyntaxError: Cannot use import statement outside a module

# はじめに
Next.jsでJestの環境を構築をしている際にエラーが出たので記事にしておきます。

# 問題
Next.js上でJestの環境構築後テストを実行すると以下のエラーが出る。
```
SyntaxError: Cannot use import statement outside a module
```

# 解決策
jest.config.ts内のコードをデフォルトのものではなく、[Next.jsの公式ドキュメント](https://ja.next-community-docs.dev/docs/app/building-your-application/testing/jest)のものにするとなおりました。

```jest.config.ts
import type {Config} from 'jest';

const config: Config = {
   clearMocks: true,
   collectCoverage: true,
   coverageDirectory: "coverage",
   coverageProvider: "v8",
   testEnvironment: "jsdom",
   setupFilesAfterEnv: ['<rootDir>/jest.setup.ts']
 };

export default config;
```
以下のようにします⬇️
```jest.config.ts
import type { Config } from 'jest'
import nextJest from 'next/jest.js'

const createJestConfig = nextJest({
  // 次のパスをあなたのNext.jsアプリに指定して、テスト環境でnext.config.jsと.envファイルを読み込みます
  dir: './',
})

// Jestに渡されるカスタム設定を追加します
const config: Config = {
  coverageProvider: 'v8',
  testEnvironment: 'jsdom',
  // 各テストが実行される前に、さらに設定オプションを追加します
  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
}

// createJestConfigは、非同期であるnext/jestがNext.jsの設定を読み込めるように、この方法でエクスポートされます
export default createJestConfig(config)
```

# おわりに
公式ドキュメント通り上からやるのが大事ですね。

# 参考

https://ja.next-community-docs.dev/docs/app/building-your-application/testing/jest
SME日記その1: Apple Silicon M4に搭載されたScalable Matrix Extension (SME)のベクトル長(SVL)を取得する

Apple Silicon M4にはScalable Matrix Extension(SME)，すなわち可変長行列演算拡張命令が備わっています．これを探求してみたいと思います．

下記記事を試そうとしたのですが，

https://zenn.dev/mod_poppo/articles/arm-scalable-matrix-extension

下記記事にもあるように，サンプルプログラムがエラーになって動作しませんでした．

https://blog.miz-ar.info/2024/11/m4-mac-mini/

なので，インラインアセンブラで書いてみました．

まず，RDSVL命令を試します．

https://developer.arm.com/documentation/ddi0602/2024-09/SME-Instructions/RDSVL--Read-multiple-of-Streaming-SVE-vector-register-size-to-scalar-register-

> Read multiple of Streaming SVE vector register size to scalar register
> ストリーミングSVEベクトルレジスタサイズの倍数をスカラーレジスタに読み取る

さっそく書いてみました．

```c:rdsvl.c
#include <stdint.h>
#include <stdio.h>

uint64_t rdsvl8()
{
  uint64_t len;
  asm volatile ("rdsvl %0, 8"
                : "=r"(len)
               );
  return len;
}

int main()
{
  printf("%llu\n", rdsvl8());
}
```

コンパイル方法は次のとおりです．

```zsh
clang -march=armv9-a+sme -o rdsvl rdsvl.c
```

実行結果は次のとおりです．

```zsh
% ./rdsvl 
512
```

すなわち，512ビット(64バイト)のレジスタ長を持っていることがわかりました．
Salesforcereレポート登録済みであることの一覧確認方法

Saelsforceレポート登録済みは「すべてのレポート」一覧から「登録済み」のチェックがついているか否かで判断可能です



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a6504340-57f6-81ae-d463-1ebe760f73be.png)


なお、このレポートの項目は以下の設定で対応可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7f6d5411-7adb-8592-2490-feeac991245b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3d1d1b72-8ad7-c942-d5d7-f727b229b5be.png)
ｾﾞﾝﾏｲﾁｬﾝ → Cubeboy for toio → ｾﾞﾝﾏｲtofuﾁｬﾝ

# ｾﾞﾝﾏｲﾁｬﾝって？

ゼンマイチャン([#ｾﾞﾝﾏｲﾁｬﾝ](https://x.com/hashtag/%EF%BD%BE%EF%BE%9E%EF%BE%9D%EF%BE%8F%EF%BD%B2%EF%BE%81%EF%BD%AC%EF%BE%9D))とは、[らて](https://x.com/cofelatte_latte)さんがスーパーカワイイ手乗りロボットの[ｽﾀｯｸﾁｬﾝ](https://protopedia.net/prototype/2345)をモデルにゼンマイ動力ですたすたと歩くおもちゃとして作ったものです。

これをX(twitter)でみかけて、おお、カワイイ！これはいい！と思ってたところ、[はこ](https://twitter.com/Ou0i3)さんがｼﾞｪﾈﾘｯｸｾﾞﾝﾏｲﾁｬﾝの3Dプリント用データを公開してくださったのでプリントして、amazonでゼンマイ歩行メカを取り寄せて合体させてトコトコあるかせて楽しんでいました。

Cubeboy wind-up toy

https://makerworld.com/en/models/69142

Tachiuwa 約15個 時計仕掛けおもちゃ 発条 巻き上げ プラスチック 歩行ロボット 取り替え DIY アクセサリー

https://www.amazon.co.jp/gp/product/B08692CVQR

そしたら、[はこ](https://twitter.com/Ou0i3)さんがゼンマイ動力じゃなくて、toio core cubeを動力としたやつも公開している！

Cubeboy for Toio

https://makerworld.com/en/models/83786

# ｾﾞﾝﾏｲtoioﾁｬﾝ
これもさっそくプリントしてtoio core cubeを中にいれて動かして遊んででいたところ...

ピキーンとなんか変なインスピレーションが下りてきました。

ゼンマイでとことこ動くtoio core cubeはどうだろう！と。

https://x.com/kenichih/status/1735254786507981200

左からｼﾞｪﾈﾘｯｸｾﾞﾝﾏｲﾁｬﾝことCubeboy wind-up toy、ｾﾞﾝﾏｲtoioﾁｬﾝ、Cubeboy for Toio

さて、ｾﾞﾝﾏｲtoioﾁｬﾝの3Dプリント用のSTLデータをthingiverseにおいておこう...と思いましたが、上のXの投稿の写真で写っているやつは、[ここ](https://toio.github.io/toio-spec/docs/hardware_shape)で公開されているtoio core cubeの3Dデータを使ったもの。
確認したところ、この3Dデータは[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0/)なので改変(remix)したものの配布は禁止となっています。(配布しないで個人で改変したものを楽しむぶんには大丈夫なはず)

# そしてｾﾞﾝﾏｲtofuﾁｬﾝ
代わりに以前、自分でモデリングした[こちらの豆腐の3Dデータ](https://qiita.com/kenichih/items/399edeb9758d17f95fb7)を元に作り直した3Dデータをthingiverseに置いておきます。目分量で作ったものなので本物のtoio core cubeと寸法が違うところはありますが、ゼンマイでとことこ歩くtoio core cubeっぽいものが作りたい場合はご利用ください。(誰得)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/41c27e08-790b-d843-8334-f430b67d580d.png" width=40% />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/600a5231-48d4-1383-e93e-f2f075721a64.png" width=40% />

https://www.thingiverse.com/thing:6854197

# 後日

[NT東京](https://nt-tokyo.org/)2024で、~~らてさん~~ スタックさんから元祖？ｾﾞﾝﾏｲﾁｬﾝを頒布いただきました。(喜)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/8bc2468f-64f1-2ff3-f4eb-432db5e63236.jpeg" width=40% />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/0a317c0c-c7ed-7e82-4586-6b1b9dc88982.jpeg" width=40% />
「開発責任者ハンドブック engineering management Vol.0.95」を読んで

# はじめに
「開発責任者ハンドブック engineering management Vol.0.95」（以下、ハンドブック）は、株式会社サイバーエージェント エンジニアリングマネジメントゼミ 著の開発者責任者向けハンドブックです。
開発責任者（エンジニアリングマネジメントを行う役職）がどのようにプロダクト、プロジェクト、そしてチームメンバーをマネジメントしていくのかについて、一部局所最適な内容を含め体系的にまとめてあります。

https://techbookfest.org/product/5678373422497792

本記事では、そのなかから汎用的かつ役に立つエッセンスを取り出して紹介することとします！

# エンジニアマネジメントとは
ときにエンジニアマネジメントは、「なにをすることなの？なにをする人なの？」と質問されることがあります。先日参加した [EMゆるミートアップ](https://em-yuru-meetup.connpass.com/event/333197/) でも同様の疑問が投げかけられ、人・組織・コンテキストによってその答えはさまざまでした。

ハンドブックにおいては、

> 「プロダクトを作ってそれで成果（主に売上）が出ている状態にする」ことが、エンジニアリングマネジメントの目的です。

と冒頭に書かれています。つまり、プロダクトによって成果を最大化するため必要に応じて対象を変えマネジメントすること・人がエンジニアマネジメントです。
（売上にコミットするということが明記されている点は事業会社らしいですね。）

# オンボーディング
本稿では「アジャイルサムライ」の要素を色濃く採用したインセプションデッキの作成を明記しています。

https://www.ohmsha.co.jp/book/9784274068560/

> プロダクト開発を進めるにしたがって「なぜこのプロダクトを作るのか？」という前提は簡単に失われます。“なぜ” を明確にすることにより、チーム全体が自立的に考え、判断できる状態を支援することができます。

と提言しています。同じメンバーでプロダクトの創出から EOL まで面倒を見続けるということは希有でしょう。その点 “なぜ” という目的を共通認識化・言語化することで、加わったタイミングに関わらず成果の最大化のため全員が同じ方向を向けることでしょう。

# プロダクトマネジメント
> 「何をつくるか」を決めること」が役割であるプロダクトマネージャーには広い守備範囲が求められます。中でも特筆すべき能力は次の 3 つとなります。
> - 課題発見と解決能力
> - プロダクトKPIを定義する能力
> - 継続的な開発体制を描く能力

と書かれている通りですが、プロダクトの価値を最大化することを目的にしたプロダクトマネジメントは事業やステークホルダー、技術のすべてに対して広い知識が要求されると感じます。専門職として PdM ロールをおく企業が多いのも、このような理由によるものと思います。
ハンドブックにおいては、さまざまなプロダクト KPI も紹介されています。

https://youtube-creators-jp.googleblog.com/2012/09/youtube-now.html

https://www.advertimes.com/20170619/article252843/

# プロジェクトマネジメント
プロジェクトはプロダクトを作るための時間や作業を指します。換言するとプロダクトマネジメントは「なにを」に着目し、プロジェクトマネジメントは「いつまでに、どのように」に着目していると言えます。

さて、ハンドブックでは一般的な開発手法としてウォーターフォールとアジャイルを紹介するとともに、具体的な Tips になり得る開発のポイントが紹介されています。

> スケジュールの調整
> 一番スケジュールに影響を与えやすい多い差し込み業務は「トラブル対応」でしょう。これはシステム的なトラブルや、ビジネス要件で発生するトラブルなど、様々なものが考えられます。まずはどの程度トラブル対応に時間を使っているか計測してみることが必要です。

私がエンジニアマネジメントしているチームでは、トラブル対応に割かれる人的・時間的リソースを平均化してスケジュールに組み込むような工夫をしています。

> 差し込み要件で開発をした物がどの程度使われるか
> 差し込み要件で急に開発が必要となった場合、技術負債が生まれ易くなります。開発したものが今後継続的に使われていくのであれば、技術負債が産まれないように設計したり、技術負債を後で回収するための工数を予約したりする必要があります。

> 技術負債解消合宿
> イベント的に技術負債を解消することで意欲的に技術負債を解消できます。

# ピープルマネジメント
[EMゆるミートアップ](https://em-yuru-meetup.connpass.com/event/333197/) では、エンジニアマネジメントの大半はピープルマネジメントと捉えている人が多かったように思います。それだけ成果を最大化するうえで集の力を最大化することが重要であり、また反面に課題を感じている人が多いのでしょう。

本稿では「エラスティックリーダーシップ」の考え方を紹介しています。エラスティックリーダーシップに関しては、ぜひこちらをご覧ください。

https://qiita.com/MxShun/items/3d0c57b33d5e48bc57bf

さらに、1on1 に関しても触れられています。

> アクティブリスニングは、特に「メンバーの成長を促す」という文脈で効果を発揮すると言われています。メンバーが自ら自分の考えを話すことで、自らの思考や価値観に気付きが生まれ、より納得感のある形でアクションに繋げることができるという狙いです。
> アクティブリスニングは、よく「傾聴」と訳されますが、黙って聞いていればいいという訳ではなく、やり方には色々と工夫の余地があります。
> - 話を途中で遮らず、最後まで聞く
> - 具体的な内容まで聞く。掘り下げる。
> - 沈黙に耐える

傾聴において「具体的にはこういうこと？」と言ってしまうのではなく、具体的な内容はあくまで本人に考えて語ってもらうことが大切ですね。

# まとめ
さて、本記事ではエンジニアマネジメントとはなにか？から始まり、エンジニアマネジメント形づくる 3 つのマネジメントとその詳細について汎用的かつ役に立つエッセンスを取り出して紹介してみました。

ハンドブックではこの他にピープルマネジメントを掘り下げた目標設定やメンバー育成、テックリードに関しても言及がされています。機会があれば（ないような気がしますが）手にとってみてください。
【Elasticsearch】突然クエリ実行が失敗し始める

## はじめに
Elasticsearchで突然クエリ実行が失敗し始める事象が発生したので、その時の対応をまとめます。

## 問題
エラー文
```
New used memory 933566461 [890.3mb] from field [xxx] would be larger than configured breaker: 933258854 [890mb], breaking
Failed to execute [org.elasticsearch.action.search.SearchRequest@35af27f6] lastShard [true]
org.elasticsearch.ElasticsearchException: org.elasticsearch.common.breaker.CircuitBreakingException: [FIELDDATA] Data too large, data for [xxx] would be larger than limit of [933258854/890mb]
```

## 原因
ElasticsearchにはOutOfMemoryErrorを防ぐために、CircuitBreakerという仕組みがあります。
CircuitBreakerは、設定値(indices.breaker.fielddata.limit)よりメモリを使用した時、その処理を中止します。（デフォルトはJVMヒープサイズの60%）
そして、Elasticsearchのクエリキャッシュの期限や最大サイズはデフォルトで無制限です。
よってキャッシュが無限に溜まっていき、CircuitBreakerの設定値を超えた時にエラーが出て、クエリが失敗するようになります。

## 解決方法
Elasticsearchのクエリキャッシュがメモリを圧迫していることが原因。
### 暫定対応
クエリキャッシュをクリアする。
```
$ curl -XPOST 'http://localhost:9200/_cache/clear' -d '{ "fielddata": "true" }'
```
### 恒久対応
キャッシュの制限と期限をelasticsearch.ymlに設定する。
```
indices.fielddata.cache.size: 30% #default 無制限
indices.fielddata.cache.expire: 5m #default -1
```

ただ、indices.fielddata.cache.expireについては、使わない方が良さそうです。

> There is another setting that you may see online: indices.fielddata.cache.expire.
> We beg that you never use this setting! It will likely be deprecated in the future.
> This setting tells Elasticsearch to evict values from fielddata if they are older than expire, whether the values are being used or not.
> This is terrible for performance. Evictions are costly, and this effectively schedules evictions on purpose, for no real gain.
> There isn’t a good reason to use this setting; we literally cannot theory-craft a hypothetically useful situation. It exists only for backward compatibility at the moment. We mention the setting in this book only since, sadly, it has been recommended in various articles on the Internet as a good performance tip.
> It is not. Never use it!

https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html#fielddata-size

## 参考
https://qiita.com/shnagai/items/87e3f60d1ffbd10ca3e5

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-fielddata.html

https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html
PHPStormで開発速度を10倍速にする「Live Templates」の使い方

# 【保存必須】PHPStorm、便利だよね
皆さんはどんなエディタを使っていますか？:runner_tone3:

私はPHPStormを使っています。PHPStormはPHPの開発に特化したエディタです。

ぺちぱーの僕はこれまでずっとPHPStormを愛用しています。僕はPHPStormに「デコピン」という名前を付けています。かわいいです。6歳になります。:dog:

## PHPStormの便利な機能「Live Templates」
皆さんは「Live Templates」という機能を使っていますか？「Live Templates」は、コードの自動補完機能です。

例えば、`foreach`を入力すると、自動的に`foreach`の構文が補完されます。これにより、コーディングの効率が上がります。

「それ、がーちゃー？」と思ったあなた。:bride_with_veil_tone2:

```php
fore
```

と入力して、tabキーを押すと、以下のように補完されます。

```php
foreach ($array as $value) {
    $value;
}   
```

うーん、めっちゃ便利 (^v^) Settingsで「Live Templates」と検索すれば設定画面が出てきます。

このLive Templatesは、自分でカスタマイズすることもできます。自分の好きなコードを登録しておくと、コーディングがもっと楽になりますよ。

デフォルト搭載のものをいくつか紹介しつつ、オリジナルのLive Templatesを作成する方法を紹介します。


## fori

```php  
for ($INDEX$ = 0; $INDEX$ < $LIMIT$; $INDEX$++) {
  $END$
}
``` 

## pubf

```php
public function $NAME$($PARAMETERS$) {
    $END$
}
```

## prif

```php
private function $NAME$($PARAMETERS$) {
    $END$
}
```

## オリジナル：if

```php
if ($PARAMETERS$) {
    $END$
} elseif ($PARAMETERS$) {
    $END$
} else {
    $END$
}
```

## オリジナル：switch

```php
switch ($PARAMETERS$) {
    case $PARAMETERS$ === true:
        // hogehogeのとき
        break;
    default :
        // fugafugaのとき
        break;
}
```

switch文、忘却しがち

## オリジナル：cm

```html
<?php /* コメントアウト */ ?>
```

phtmlファイルでコメントアウトするときに使うと便利。phpだけじゃなくて、htmlやjsに使えます。

## オリジナル：var

```php
$bt = debug_backtrace();
$file = $bt[0]['file'];
$line = $bt[0]['line'];
echo "$file $line\n";
$args = func_get_args();
call_user_func_array('d', $args);
exit();
```

強化版のvar_dump。バッチ処理のデバッグ時に使うと便利。

## オリジナル：bling

```php
$Rshitei = "Now singin', bling-bang-bang, bling-bang-bang, bling-bang-bang-born (now singin')"
    . PHP_EOL . "Bling-bang-bang, bling-bang-bang, bling-bang-bang-born (now singin')"
    . PHP_EOL . "Bling-bang-bang, bling-bang-bang, bling-bang-bang-born";
```

To the next, to the 1番上:point_up:（アニメ未履修）

## まとめ

PHPStormをご利用の方、是非ご活用ください。

VSCodeユーザーのみなさん、大丈夫です。 メニュー > Code > Preferences > User Snippets から同じことができます。

是非ストックして、チームの新人さんなどにこの記事をみせてあげてください。（ダイマ）
【初心者の覚書】PowerShellとは

「シェル」や「シェルスクリプト」について書いていたところ、別記事で「PowerShell」というワードを見かけ、頭から離れず、ストンと理解もできなかったため忘備録として書き記したい。


# Power Shellとは
わわわIT用語辞典大先生がコマンドプロンプトに毛が生えたやつとおっしゃっているので(毛とは言っていない)、Windowsが出してるコマンドプロンプトである、と言う認識で良さそう。

> コマンドプロンプトのパワーアップ版だよ
[「Windows PowerShellとは」、「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12403.html)

> Windows PowerShell は、Windows ベースのシステムの管理タスクを自動化するための、簡単に使えるコマンド ライン シェルおよびスクリプト環境です。
[「PowerShell の概要」、Microsoft Learn Challenge](https://learn.microsoft.com/ja-jp/powershell/scripting/learn/ps101/01-getting-started?view=powershell-7.4)

# まとめ
Power Shellとは自動化だったり、色々できるコマンドプロンプトである、と言う認識で概ね良さそうでした。

![スライド1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/9f73082f-c69b-67f7-a24a-199ef28e3e71.jpeg)




# 参考にした記事

https://learn.microsoft.com/ja-jp/powershell/scripting/learn/ps101/01-getting-started?view=powershell-7.4

https://wa3.i-3-i.info/word12403.html

https://www.rstone-jp.com/column/110007/




# おまけ〜今日の植物「ワレモコウ」〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/f43cabcd-a2e5-c0ed-1939-c5d97d0d1058.png)

参照：

https://lovegreen.net/library/flower/p123845/

秋冬になるとたまーに見かけるこのいい感じの花。
名前はやっぱりあったんですね。。
平安時代の辞典にも掲載された生薬の一種でもあるらしい。
バラ科でお洒落な外見に相反して名前が覚えにくい残念な植物だなと感じた。

> 平安時代に書かれた日本最古の百科事典と言われる「和名抄」に和名として「割れ木爪（われもこう）」と呼ばれていました。
煎液は止血や下痢止めに用い、火傷、湿疹、皮膚炎には幹部を煎液で洗浄します。打撲や捻挫には生根を擦り潰して塗布します。チユを含有する漢方処方「清肺湯（せいはいとう）」は痔の出血に対して効果があります。
[「ワレモコウ」、公益社団法人日本薬学会](https://www.pharm.or.jp/flowers/post_15.html)

赤い染料としても利用でき、傷薬にも使えると。万能である。

以上、今日の植物でした。
gitのコマンドなど

# 鍵の作成
鍵を作成する
```powershell
ssh-keygen -t ed25519 -C "メールアドレス@gmail.com"
```
公開鍵の内容を確認する
```powershell
cat ~/.ssh/id_ed25519.pub
```
中身をGitHubに登録する

# git初期設定
インストール後の初期設定
```powershell
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
```
## リポジトリの作成
```powershell
git init
```
# .gitignoreの書き方
```powershell
#ファイル名を指定
filename.txt

#特定の拡張子を無視する
#exeファイルは要らない
*.exe

#特定のフォルダの中身全てを無視する
# bin フォルダは要らない
bin/
```
## リポジトリにコミットするファイルの選択（ステージリング）
```powershell
git add "ファイル名"
```
すべて選択する場合
```powershell
git add .
```
変更点だけを追加
```powershell
git add -p
#git add -pを実行すると、Gitが変更箇所ごとに確認を求めるため、以下の操作ができます。
y:#その変更をステージする
n:#その変更をステージしない
s:#その変更を分割してさらに細かくステージするかどうか選べる
q:#この対話的な処理を終了する
d:#ステージせずに残りの変更をスキップ
e:#自分で変更を編集
```
# コミット
コミット
```powershell
git commit -m "コメント"
```
コミット履歴を見る
```powershell
git log

#詳細な履歴
git log -p

#履歴の操作
#次のページに進む:
Space、f

#前のページに戻る:
b

#次の1行に進む:
Enter、j

#前の1行に戻る:
k

#終了する:
q
```

# ブランチの作成
ブランチの作成
```powershell
git checkout -b "作成するブランチ名"
```
今いるブランチの確認
```powershell
git branch
```
ブランチの一覧
```powershell
git branch -a
```
ブランチの作成
```powershell
git checkout "ブランチ名"
```
#　現在の状況確認
```powershell
git status
```

# リモートリポジトリ
リモートリポジトリが登録されているか確認する方法
```powershell
git remote -v
```
リモートリポジトリの登録
```powershell
git remote add origin git@github.com:<ユーザー名>/<リポジトリ名>.git
```
リモートリポジトリにプッシュ
```powershell
#git push <リモート名> <ブランチ名>
git push origin main
```
リモートリポジトリからクローン
```powershell
git clone git@github.com:<ユーザー名>/<リポジトリ名>.git
```
リモートリポジトリの変更をローカルに取り込む
```powershell
#git pull <リモート名> <ブランチ名>
git pull origin main
```
HESAI Pandar 40P をROS2で動かしちゃうよ！(すんなりは動かない編

## はじめに

みんな大好きLiDAR。点群は養分。そんなわけでHESAIのPandar 40Pをポチったので実機レビュー&&動作テストしていきます。

## 買って開封編

今回もまた安心と信頼のeBayで購入しました。$294+送料で6万円くらいしました。1ドル162円換算ですね。やばいですね。

そしてアメリカからはるばる届いたのがこちら。Velodyne VLP-16の大きさに慣れていた身としては40Pはでかい！とにかくでかい！

買ったばかりのLiDARのケーブルを切り配線等々して通電！.....ありえないくらい音が静か。静かな屋内だと微かにわかる程度、屋外だとほぼわからないレベル。あとジャイロ効果もVLP-16比で少ないように感じました。

![IMG_0321 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/ded20e58-8f13-6a84-bea5-a341cd60f3ff.jpeg)


## ROS 2で動かそう

基本的にはこのリポジトリを使って動かしていきます。

https://github.com/HesaiTechnology/HesaiLidar_ROS_2.0

```bash
# 依存関係をインストール
sudo apt update && sudo apt install -y libyaml-cpp-dev libboost-all-dev

# パッケージをクローン
git clone --recurse-submodules https://github.com/HesaiTechnology/HesaiLidar_ROS_2.0.git

# ビルド
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
```

```bash
source ./install/setup.bash
ros2 launch hesai_ros_driver start.py
```

RVizで見る分にはいいけどROSBagをとったりしようとすると全くフレームが出ないトラブル発生！原因を探ると下記のTopicのQoS Depthが深すぎることが原因でした(修正PRを投げてますが相手にされていないはここだけの話)

```diff_c:src/manager/source_driver_ros2.hpp
  node_ptr_.reset(new rclcpp::Node("hesai_ros_driver_node"));
  if (driver_param.input_param.send_point_cloud_ros) {
-    pub_ = node_ptr_->create_publisher<sensor_msgs::msg::PointCloud2>(driver_param.input_param.ros_send_point_topic, 100);
+    pub_ = node_ptr_->create_publisher<sensor_msgs::msg::PointCloud2>(driver_param.input_param.ros_send_point_topic, 10);
  }
```

## 点群を眺める会場

日本国内某所を歩いてみました。車や木がこの密度で取得できるのはすごいですね。これだけでご飯3杯は行けそうです。

![スクリーンショット 2024-12-02 午後9.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/22c1f3c6-b75a-78f5-1db8-f6e7d34d2188.png)

点群マスターの方は気づいたかもしれません40ラインにしては解像度高くないか？と。そうです。高いです。チャンネル6から30までの密度がとても濃い仕様になっています。このような仕様になっているおかげで全体の点群数を抑えながら高い解像度を維持しているんですね。さすが自動運転用と言ったところです。

![スクリーンショット 2024-12-02 午後9.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/ec73be79-6636-12f4-a5a7-1d79ce3de3d9.png)


## 最後に

全体的に満足のいくLiDARでした。ですがセンサードライバがアレなところや縦方向の解像度に若干の癖があることには注意が必要です。LiDAR中級者向けと言ったところでしょうか。単純にSLAMをしたいみたいな人はVLP-16がおすすめです。SLAMだけはなくObjectDetectionやCamera Fusionをしたいという人にはHESAI Pandar 40Pはおすすめの一台です！
OpenAIのライブラリをAWS lamda レイヤーいれるのに手こずった話

## 概要
openaiとpydanticのライブラリを使いたくてレイヤーの設定をしていたら
Unable to import module 'lambda_function': No module named 'jiter.jiter'
Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core
こんなんでてきて困り果てました。
なんとか動くとこまでできたので共有します。

## 解決方法
ランタイムはpython3.9を選択
・https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9
からpypydanticのARNもってくる
・https://github.com/erenyasarkurt/OpenAI-AWS-Lambda-Layer?tab=readme-ov-file
ここからOPENAIのzipフォルダインストールしあとにフォルダ名pythonに変えてレイヤーを作成
以上

注意
・OPENAIのライブラリ古いので，APIの設定や呼び出し方がほんの少し違う
・あくまで自己責任で

### 参考にしたサイト（自分はうまくいかず）
https://zenn.dev/galapagos/articles/a222e38a32f4ba
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14302582744
【NULL合体演算子】??、isset、emptyとの違い

## はじめに
どれもよく見かけるしよく使うけど、混同しやすいと個人的に感じるので違いをまとめたいと思います。

## ??（NULL合体演算子）

 https://www.php.net/manual/ja/migration70.new-features.php#:~:text=%E5%8F%82%E7%85%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,Null%20%E5%90%88%E4%BD%93%E6%BC%94%E7%AE%97%E5%AD%90%20%C2%B6,-null%20%E5%90%88%E4%BD%93%E6%BC%94%E7%AE%97

>この演算子は、もし第一オペランドが非nullの値であればそれを返し、そうでない場合は第二オペランドを返します

非nullとは**nullではないかつ、未定義（Undefined）ではない**という意味です。
「値の存在チェックした上で、値が存在しなければデフォルト値を設定する」
これをたったクエスチョンマーク2つで実現できるのがNULL合体演算子です。
<br>

ポイントは大きく2つです。

①未定義の値もnullと見なされて、右辺が返る
　非nullと聞くと「Undefinedとnullとは違うからUndefinedも非nullだ！」と、思いがちですがUndefinedでも右辺が返ります。
```php
$hoge = "ほげほげ";
$result = $fuga ?? "ぴよぴよ"
echo $result // ぴよぴよ
// $hogeは定義されているが、$fugaは未定義なので右辺の「ぴよぴよ」が返っている。
```
 
 
②Falsyな値も非nullと見なされて左辺が返る
　空文字や0はFalsyですが、非nullなので左辺が返ります。



https://zenn.dev/bugbearr/articles/69e1101ccc676a4b28b6
 
 ```php
$result = 0 ?? "ぴよぴよ"
echo $result // 0
// 左辺は非nullなので、「0」が返っている。
```

## isset
https://www.php.net/manual/ja/function.isset.php

値が非nullであればtrueを返します。
繰り返しですが、つまり**nullではないかつ、未定義（Undefined）ではない**状態です。
nullか未定義（Undefined）であればfalseを返します。

## empty
https://www.php.net/manual/ja/function.empty.php

> 変数が空であるかどうかを検査します。 変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が false に等しい場合です。

空文字や0のようなFalsyな値もemptyと見なされてtrueが返ってくるので注意です。


## 使い分け

null合体演算子
→存在していること期待しているが、存在しない・nullならデフォルト値を用意したい

isset
→存在していること期待している（なんらかの処理を行う前のエラー回避など）

empty
→存在しないことを期待している（エラーハンドリングなど）



## 最初から```if($hoge)```で判定すれば楽では？
$fugaの値が存在しない場合、未定義の値を参照してしまい意図しないエラーが発生してしまいます。
```php
$hoge = "ほげほげ";
if($fuga){

}
// エラー発生！
```


## さいごに
いつも何気なく使っていたものですが、執筆を通して理解が深まりました。
否定論理演算子の```!```があると、issetやemptyは読みづらくなるので目的に応じて適切に使い分けたいです。
また、デフォルト値を用意したい時は積極的にNULL合体演算子を使いたいと思います。



## 参考
早見表を作っていただいていた方がいらっしゃったのでこちらも参考に

https://qiita.com/shinichi-takii/items/00aed26f96cf6bb3fe62
系列データにおける馬蹄効果の確認

ここでは隣り同士で値が似通った系列データを考える。

例えば以下の様なもの（サイズは30×20、横軸は時系列、縦軸は変数をイメージ、ただしDiagonalはネガコン的に入れているだけ）。

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17038/52388305-13d5-d415-0894-e67fda1858d7.png)

このような行列データに対して、**主成分分析**などの次元圧縮を用いてデータを2次元にプロットした際、データ点がU字状に並ぶことがある。これを馬の蹄鉄をもじって**馬蹄効果**という。

このようなパターンは、しかしながら、データに実際に周期性があるかどうかには無関係に現れる見かけの周期性であり、誤った解釈に繋がる危険性があり注意が必要である。

馬蹄効果はこれまでにPCA以外にも、MDS、Isomap、LLE、カーネルPCA、ラプラシアン固有マップ、拡散マップ、SSA、時系列k-means...など、様々な固有値分解ベースの行列分解手法で観測されている。

なぜ馬蹄効果が出てくるのか、数学的な説明は割愛するが、ここでは上記のデータで実際にU字が出るかを確認した。

ソースコードは以下
https://colab.research.google.com/github/kokitsuyuzaki/sequential-experiments/blob/main/sequencial_short.ipynb?hl=ja

# PCA（prcompを利用）
![Unknown-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17038/67a9f480-49a4-c911-cc02-e14be25082ef.png)

確かにU字が現れるようだ。
端が丸まってハート型になったり、円を描いたりしてるものもある。
元の高次元データが周期性があるか否か判断できないような短い時間でサンプリングされたものであっても、隣同士が似ているという特徴を与えるだけで、低次元では曲がるのである。
LinearはPC1は線形にデータを配置しており、正しい構造であるが、PC2で細かく振動している。
Hankel行列だけはなぜかすごくこの2次元空間で回転することがわかった。

# CA（FactoMineR::CAを利用）

対応分析（Correspondence Analysis; CA）の文脈では、U字がやや引き延ばされた結果になりやすいため、**アーチ効果**と呼ばれるらしい。

![Unknown-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17038/790f4bcb-00c3-4bf3-05e3-be71908487c7.png)

確かにアーチ状のものが多い。
Linearは計算が安定せず乱数次第で、色々な見た目になった。
ここでもハンケル行列は激しく回転することがわかった。

# 引用文献
- Shah, N. & Meng, Q. & Zou, Z. & Zhang, X. (2024). Systematic analysis on the horse-shoe-like effect in PCA plots of scRNA-seq data. Bioinform Adv. 4(1), vbae109. 10.1093/bioadv/vbae109
- Morton, J. T. & Toran, L. & Edlund, A. & Metcalf, J. L. & Lauber, C. & Knight, R. (20187). Uncovering the Horseshoe Effect in Microbial Analyses. mSystems. 2(1), e00166-16. 10.1128/mSystems.00166-16
- The Guttman effect: its interpretation and a new redressing method.
- Resemblance Coefficients and the Horseshoe Effect in Principal Coordinates Analysis. Ecology, 83, 3331-3343. 10.1890/0012-9658(2002)083[3331:RCATHE]2.0.CO;2
- Proix, T. & Perich, M. G. & Milekovic, T. (2022). Misinterpreting the horseshoe effect in neuroscience, bioRxiv,  10.1101/2022.03.04.482986
- 井手剛, (2006). 部分時系列クラスタリングの理論的基礎, 2006年度人工知能学会全国大会（第20回）, 2A1-2, 10.11517/pjsai.JSAI06.0.94.0
【Java】varの使い方

## varを使った変数宣言
明示的に型を記述せず、型を推論することを型推論と呼ぶ。Javaではvar(varible type)を使用することで型推論が可能である。以下のようにして宣言する。

```
var num = 10;
```

## varの使い方
メソッドの引数、コンストラクタの引数、メソッドの戻り値、フィールド(メンバ変数)、catchブロックでは使用できない。

```ruby:Java(Main.java)
import java.util.ArrayList;
import java.util.Arrays;

public class Main {
	var a = 100;//エラー①
	static var b = 100;//エラー②
	public static void main(String[] args) {
		var c = "hello";//OK③
		var d = 10;//OK④
		var e;//エラー⑤
		var f = null;//エラー⑥
		final var g = 100;//OK⑦
		var a1 = new int[] {1,2,3};//OK⑧
		var a2 = new int[1];//OK⑨
		var a3 = new int[];//エラー⑩
		var a4 = {1,2,3};//エラー⑪
		var b1 = new ArrayList<>();//OK⑫
		var b2 = new ArrayList<String>();//OK⑫
		var var = 1;//OK⑬
		var b3 = () -> {};//エラー⑭
		public var b4 = "aaa";//エラー⑮	
	}	
	public static int number(var a) {//エラー⑯
		return a;
	}
}
```

①、②メンバ変数(インスタンス変数やクラス変数)にvarは使えない

③、④ローカル変数なのでvarは使用可

⑤初期値未設定だとvarは使えない

⑥初期値nullだとvarは使えない

⑦finalと併用は可能。この時finalが先

⑧，⑨配列の宣言に使用可能

⑩配列の要素または初期値が未設定なのでvarは使えない

⑪配列の初期化式を使うと型推論ができないので、varは使えない

⑫ジェネリクスのダイヤモンド演算子<>では変数宣言時のジェネリクスで指定された型パラメータまたはObject型が型パラメータとして与えられるのでvarは使用可

⑬varは予約語でないので、変数名として使用可

⑭ラムダ式からは型推論ができないので、変数名として使用可

⑮varはfinalのみ修飾子を使うことが可能

⑯メソッドの引数にvarは使えない

## まとめ
varの制約は多いけれども、試験でよく問われるところなので、覚えよう！
storybook8でtailwind cssを利用する。 

## 動作環境
"next": "15.0.3"
"storybook": "8.4.6"
"tailwindcss": "^3.4.1"
"typescript": "^5"

## .storybook/preview.tsを編集する。  
 ```diff_typescript
import type { Preview } from "@storybook/react";
+ import '@/app/globals.css'; //global.cssの相対パスを指定

const preview: Preview = {
  parameters: {
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/i,
      },
    },
  },
};

export default preview;
```

アドオンのインストール(もしかしたらこれはいらないかも？)  
```
npx storybook@latest add @storybook/addon-styling-webpack
```

デフォルトのままだとstyleがおかしくなるのでglobal.cssを修正しておく。  

``` diff_css
@tailwind base;
@tailwind components;
@tailwind utilities;

-:root {
-  --background: #ffffff;
-  --foreground: #171717;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
-    --background: #0a0a0a;
-    --foreground: #ededed;
-  }
-}
-
-body {
-  color: var(--foreground);
-  background: var(--background);
-  font-family: Arial, Helvetica, sans-serif;
-}
```
【AWS】API Gateway + Lambdaで「The adapter was unable to infer a handler to use for the event. 」エラーになった場合

# 概要
AWS API GatewayとLambdaを利用した構成を実装し、API Gatewayのドメインにアクセスすると以下のエラーに遭遇。解決方法を紹介します。

> {"errorMessage": "The adapter was unable to infer a handler to use for the event. This is likely related to how the Lambda function was invoked. (Are you testing locally? Make sure the request payload is valid for a supported handler.)"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/1126e228-adfc-aaba-1406-38deb3945727.png)

`Mangum`というライブラリを使うことで、リクエストとレスポンスをLambdaとAPI Gatewayが扱える形式に変換できるので、そちらを利用してFastAPIのアプリを動かしています。

> Mangum is an adapter for running ASGI applications in AWS Lambda to handle Function URL, API Gateway, ALB, and Lambda@Edge events.
https://pypi.org/project/mangum/

# 解決方法
API Gateway構築時に「Lambdaプロキシ統合」がオフになっているのが原因でした。
オフの場合、`Mangum`のようなアダプターがリクエストを正しく処理する際にエラーが発生してしまいます。

### Lambdaプロキシ統合とは?

設定「Lambdaプロキシ統合」とは、API GatewayとLambda関数の間でリクエストとレスポンスを直接やり取りするための統合方法。

この統合方法をオンにしていると、API GatewayはHTTPリクエストをそのままLambda関数に渡し、Lambda関数のレスポンスをそのままクライアントに返す、という形式を取ります。

> Lambda プロキシ統合を使用すると、API ルートを Lambda 関数と統合できます。クライアントが API を呼び出すと、API Gateway はリクエストを Lambda 関数に送信し、関数のレスポンスをクライアントに返します。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html

これにより標準化された形式でLambda関数に渡されるため、`Mangum`のようなアダプターがリクエストを正しく処理できるのです。

Lambdaプロキシ統合がオフの場合、API Gatewayは`Mangum`のようなアダプターが正しく処理できない形式でLambda関数に送ってしまうようで、上述のエラーが出ます。

ということで、API Gatewayの画面からオンにすれば解決しました。

参考：
- AWS repost

> The issue was with the request mapping. There were none. SInce lambda is expecting a HTTP request mapping is needed before passing to the lambda.
https://repost.aws/ja/questions/QUxHgwh_cIRPuuy_sHav7pnQ/magnum-with-api-gateway


- StackOverflor
> This error occurs when we don't enable below flag in the create method page under any Resource in API gateway.
> Enable this flag
> Lambda proxy integration Send the request to your Lambda function as a structured event. Please click on the below image
https://stackoverflow.com/questions/77562091/mangum-adapter-unable-to-infer-handler-to-use-for-event-on-aws-api-gateway
特徴量エンジニアリング 二日目




この記事は

https://qiita.com/advent-calendar/2024/kagglenoob

３日目の記事です。


https://www.kaggle.com/code/ryanholbrook/creating-features

についての解説を載せて行きます。

このtutorialでは特徴量を自分で計算して作り出し、元の表に横からつけること（特徴量エンジニアリング）を行なっています。


tutorialの初めに


```
np.pi * ((0.5 * autos.bore) ** 2) * autos.stroke * autos.num_of_cylinders
```
という計算式が出てきます。どこからきたのか途方に暮れるかと思いますがこれは調べてみると車のエンジン排気量を計算するコードです。突然出てきたように感じられますが、おそらく自動車業界の方には馴染みがある数式なのでしょう。このようにある業界について特有の知識があるとkaggleで優位に戦えます。ドメイン知識というやつですね。今回我々は自動車エンジン業界に詳しくはなく、この先も同様と考えられますので、とりあえずこの数式を受け入れることで次に進めます。

また、このtutorialからsum(axis=1)というようにaxisを多用しています。この先も出て行きますので、ここで押さえておきましょう。pandas tutorialでも出てきますのでそこで確認するのも良いですね。

日本語の二次元配列は「行列」と言われますが、axisも同様にaxis=0 は行方向を指し、axis=1 は列方向を指しますので行→列となることを理解すると覚えやすいかと思います。
```
roadway_features = ["Amenity", "Bump", "Crossing", "GiveWay",
    "Junction", "NoExit", "Railway", "Roundabout", "Station", "Stop",
    "TrafficCalming", "TrafficSignal"]
accidents["RoadwayFeatures"] = accidents[roadway_features].sum(axis=1)

accidents[roadway_features + ["RoadwayFeatures"]].head(10)
```

はデータの roadway_features ラベルのデータを列方向に合計し、RoadwayFeatures という新しい列を作成する関数になります。


そのほか、
文字列を空白で区切って複数のラベルに変換（strとsplitはpythonの基本文法で学んでおきましょう）
文字列を結合 （+で結合なのはわかりますね）
が出てきます。

Group transformsの解説について
グループ変換は、カテゴリ別にグループ化された複数の行の情報を集計します。
groupby・・ときいて皆さんはDataScienceを連想しますか？
一般に広く使用されるExcelでこの機能は存在しています。
kaggleのtutorialよりExcelの解説ページを読む方がよほどわかりやすいのでそちらをお勧めします。
実際にデータを操作するのもexcel上で操作することのほうが視覚化もされわかりやすいのでまずそちらを試した上でpandasの機能に取り組んでみてください。なお、私もExcelで同じ会計項目のみをまとめる作業をした際に必要性などの納得を得られました。
Drupalのviewsモジュールをもっとカスタマイズしよう

# Drupal viewsモジュールとは
Drupalのviewsモジュールとは、ノードやユーザー、その他、拡張モジュールの独自テーブル(entityにviews_dataキーは必要)など様々なテーブルのデータの取得を管理画面からGUIで管理できるモジュールです。
昔はコントリビュートモジュールだったようですが、その人気の高さから、今ではコアモジュールになっています。


## viewsモジュールを触ってみて
データの取得のクエリをコード上ではなく、管理画面をぽちぽちして、自動的に発行すると聞くと、何か制限があるんじゃないかとか、ベテランのエンジニアほど拒否反応を示す気がしますが...
このviewsモジュールというのは非常によくできていると感じます。

また、このviewsモジュールを活用して、csvとしてデータをダウンロードするモジュールなどもコントリビュートモジュールも存在しています。
もはや、Drupalといえば、viewsモジュールとも言えるぐらい代名詞的なモジュールだと思います。

## 本題
Drupalを触った方ならお馴染みのviewモジュールの設定画面にヘッダーやフッターエリアがあります。
ここに自作モジュールから定義した独自の部品を追加させるカスタマイズのご紹介です。

![KFPUAzZTC0vpou5EQMlBOY03JI1sFp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280639/5fcd56b1-776a-7546-1695-75281c3b78e3.png)


これをどうやって追加するかと言うと、Plugin APIを使います。
Plugin APIで一番有名なもので言えば、カスタムブロックの追加でしょうか。
今回のviewsのエリアに追加する場合は、「ViewsArea」アノテーションを使えばできるようです。
以下、参考コード

```php:CloseButton.php
<?php

namespace Drupal\close_button\Plugin\views\area;

use Drupal\Core\Form\FormStateInterface;
use Drupal\views\Plugin\views\area\AreaPluginBase;

/**
 * CloseButton class.
 *
 * @ingroup views_area_handlers
 *
 * @ViewsArea("close_button")
 */
class CloseButton extends AreaPluginBase {

  /**
   * {@inheritDoc}
   */
  public function render($empty = FALSE) {
    if (!$empty || !empty($this->options['empty'])) {
      $label = !empty($this->options['button_label']) ? $this->options['button_label'] : 'この画面を閉じる';
      return [
        '#type' => 'button',
        '#value' => $label,
        '#attributes' => [
          'class' => ['js-close-button'],
        ],
        '#attached' => [
          'library' => [
            'close_button/close_button',
          ],
        ],
      ];
    }

    return [];
  }

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = parent::defineOptions();
    $options['button_label'] = ['default' => ''];
    return $options;
  }

  /**
   * {@inheritDoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    parent::buildOptionsForm($form, $form_state);

    $form['button_label'] = [
      '#type' => 'textfield',
      '#title' => 'ラベル',
      '#description' => 'リンクの文字列。',
      '#default_value' => $this->options['button_label'],
    ];
  }

}
```


```php:close_button.module
<?php

/**
 * @file
 * Close Button module.
 */

/**
 * Implements hook_views_data().
 */
function close_button_views_data() {
  $data['views']['close_button'] = [
    'title' => '閉じるボタン',
    'help' => '現在開いているページを閉じるボタンを追加します',
    'area' => [
      'id' => 'close_button',
    ],
  ];
  return $data;
}
```

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280639/2d1ec90c-56f3-c609-8eb3-4f06470ccebd.png)


このように、独自モジュールから画面を閉じるボタン(window.close())を追加することができるようになりました。
また、コンテンツ画面のフッターに閉じるボタンを追加しましたが、「ViewsArea」を使う事によって、他のviewsでも再利用が可能になります。

## メモ
個人的な感想ですが、ブロックとの使い分けに関して

* フロントだとブロックを使った方が自由度が高く、積極的に利用する
* ページ上で変更箇所が少ない管理画面上では、ViewsAreaを積極的に利用する

上記が良いのかなと思いました。
起業するならElixirシリーズSTEP7.メディアを狙え

https://qiita.com/Yoosuke/private/2536d27937588bb129bb

前回はこちら

## プロトタイプ販売

さて、前回は言語化してターゲットに届ける所まで実施しました。もちろん、ここまでの仮説検証をしてる中で検証した結果、違ったという事もあるでしょう。その時は仮説を作り検証をしてサイクルを回す事です。そして、顧客が実際に現れた所で、いよいよ提供するフェーズに入っていきます。

提供する際には、完全な製品になっている必要はありません。例えば、Elixirで開発したシステムサービスだったとしても、全ての機能が完璧に揃っている必要はありません。

裏側は手動で連携していても全然構わないわけです。顧客が欲しいのはサービスの結果手に入れることができる結果です。

なので、この段階ですらまだ完璧な製品を作ろうとせずにどのように価値を提供する事が一番、「ありがとう」を集められるかを検証しながら提供する事になります。

お試しで提供してフィードバックを取ったら、今度はさらに少し多くの人に向けてプロトタイプを作成して販売していきます。限定的に先行して利用してもらう施策を行います。
プロトタイプを作成して展開する際には、もちろん理想としている状態の開発をする期間は取れない事が大半です。ですが、ここで確認したいのは最も価値と思われるサービスの確認でもある為、その価値を提供できるミニマムな状態で展開します。

このミニマムな状態が絞れてない場合には、大抵はターゲットがブレているか、提供しようとするソリューションが絞れていないか、もしくは、メンバー間の認識に違いが起きているかなど情報のズレがどこかに存在している状態が考えられます

このプロトタイプを販売する理由はいくつかあります。
１つは、プロトタイプを利用してもらってフィードバックをもらい、提供価値の検証と提供価値をアップデートする為の活動です。そして、もう１つは、私たちのサービスを応援してくれる顧客と繋がり、エンゲージメントを高めて、ユーザーの声をもらう活動です。

## メディアを狙え

ユーザーの声を集めたら、メディアにプレスリリースを出して行きましょう。
メディアへの露出をどう獲得していくか、というのがこの段階から必要になってきます。
メディアと言っても、オウンドメディアと呼ばれる自分達で作り上げていくメディア、それからアーンドメディアと呼ばれるSNS、ペイドメディアと呼ばれるテレビ、ラジオ、新聞、雑誌、広告など様々です。

このメディアを攻略していく材料集めをしていくのですが、ここの話しは、１つとっても数時間の講義ができるボリュームになるのでここでは、それほど触れませんが、メディアの攻略と一口に言ってもいっぺんに全てはできないので、どのメディアから攻略するかの優先順位を自社のやっている事と紐付けて検討する事が重要になります。

## Elixirの課金実装

Elixir言語の特徴はランタイム設計レベルで理解すると違いがわかります。

https://qiita.com/Yoosuke/private/4e29b725b50117bc4616
C++で２次元配列をもっと楽に扱いたい！

## 🎄 Qiita Advent Calendar 2024 🎄

この記事は，[Qiita Advent Calendar 2024](https://qiita.com/advent-calendar/2024) の [ひとりアドベントカレンダー by Hietan](https://qiita.com/advent-calendar/2024/hietan) というカレンダーの２日目の記事です．

https://qiita.com/advent-calendar/2024/hietan

アウトプット力の強化を目的に，25日分すべて１人で書ききるというチャレンジをしています．是非他の記事もご覧ください．

---

:::note warn
注：以下では，`using namespace std;` の記述がある前提でソースコードを記載しています．
:::

みなさん，競技プログラミングはやっていますか？
競技プログラミングでは速度の速さから C++ が使われることが多いですが，vector の記述量が多くて大変です．

特に２次元配列を vector で作成するとき，デフォルトだと次のような記述になります．

```cpp
vector<vector<int>> arr(i, vector<int>(j, 0));
```

なんとも長い...
`vector` と3回も記述しています．

そこで，以下のクラスを作成して記述量を削減します．

```c++
template <typename T>
class V2 : public vector<vector<T>> {
    public:
        V2(int i, int j): vector<vector<T>>(i, vector<T>(j)) {}
        V2(int i, int j, T x): vector<vector<T>>(i, vector<T>(j, x)) {}
};
```

これで，2次元配列を宣言するときは，

```c++
V2<int> arr(i, j, 0);
```

とてもシンプルになりました！

仕組みもコンストラクタを作成しているだけで非常にシンプルです．
これで `vector` と大量に打つ手間を省けますね．
Astro+Contentful+Github Pagesでブログ運営を目指す　〜環境構築編〜

## この記事のゴール・前提条件

- ブログのUIを作成するためのフレームワーク（Astro）の開発環境を構築し、localhostでプロジェクトを起動できること
    - だいぶ今更感はあるが
- Headless CMSおよびAstroに関する説明は割愛する

## 実行環境

### OS

```bash
~ $ sw_vers
ProductName:		macOS
ProductVersion:		15.0.1
BuildVersion:		24A348
```

### git

```bash
~ $ git -v
git version 2.39.5 (Apple Git-154)
```

### docker

```bash
~ $ docker -v
Docker version 27.3.1, build ce1223035a
```

## とりあえず環境構築

### Node.jsのインストール

公式サイトやパッケージ管理ソフト（Homebrewなど）からインストール 
（※筆者は後述するDockerfileを経由したためこちらでの説明は割愛）
    
:::note warn
Node.jsのバージョンは`v18.17.1`か`v20.3.0`以上であること（`v19`はサポート対象外）
:::

### 新規プロジェクト作成

ターミナルやコマンドプロンプトから以下コマンドを実行

```bash
npm create astro@latest
```

実行後、以下について聞かれるので`y`または`n`（もしくはCUI上の選択肢）から回答

1. プロジェクトを作成するディレクトリ（ここだけ任意値）
2. 新規プロジェクト作成時にテーマを使用するか
3. TypeScriptを使用するか
4. 依存関係をインストールするか
5. gitリポジトリとして管理するか（=`git init`）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681125/7adb13bd-d3ed-1006-d4b0-cc154054be85.png)

### プロジェクト起動

上記1で指定したディレクトリへ移動し、以下コマンドを実行

```bash
npm run dev
```

`http://localhost:4321/`にアクセスし、以下のような表示になれば起動OK！  
（※使用したテンプレートや`npm create`実行時のバージョンによって変動あり）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681125/5dcf9dff-5c7d-c72e-3d08-797934464117.png)

ここまでで環境構築は完了！お疲れ様でした。

## ローカルを汚したくないあなたへ

### DockerfileとDocker-compose.ymlの作成

以下コマンドを実行

```bash
touch Dockerfile docker-compose.yml
```

- Dockerfile

    ```Dockerfile
    FROM node:lts-bullseye-slim
    WORKDIR /app
    # COPY {npm create時に指定したdir_name}/ /app  // コンテナ外で資産管理する場合
    EXPOSE 3000
    ```

- docker-compose.yml

    ```yaml
    services:
      {service_name}:
        build:
          context: .
          dockerfile: Dockerfile
        container_name: {container_name}
        ports:
          - "3000:3000"
        volumes:
          - .:/app
        stdin_open: true
        environment:
          - NODE_ENV=development
    ```

### コンテナ起動〜コンテナ内に入る

```bash
// コンテナ起動
docker-compose up -d

// コンテナ内に入る
docker exec -it {container_name} /bin/bash
```
    
※この後の作業は[新規プロジェクト作成](#新規プロジェクト作成)から実施

### 注意点

　Dockerコンテナを立てて構築する場合は、`npm run dev`実行時以下のようにオプションをつけること
　（特にポートはEXPOSEしたものを指定しないとアクセスできないので注意）
　※公式だとポート番号`4321`を指定するように記載されているがなぜか起動できなかった。

```bash
npm run dev -- --host --port 3000
```

## gitで履歴管理をしたいあなたへ

### リポジトリ作成

　githubなどであらかじめリポジトリを作成しておく

### リモートリポジトリにプッシュまで

以下コマンドを実行
※次回以降はDockerfileのCOPYコマンドを有効にすることで最新資産を持ってくるようにする
※docker-compose.ymlのvolumesを指定しているのでコンテナ内外で同期が取れるようになっているので、Gitの操作はコンテナ外からでも実行可。（ただこの辺りの運用は人によりけり）

```bash
git add .
git commit -m "commit comment"
git push (origin {branch_name}
```

## 参考資料

- [公式](https://docs.astro.build/ja/install-and-setup/)
- [ブログ作成チュートリアル](https://docs.astro.build/ja/tutorial/0-introduction/)
エンジニアを説得する技術 その2

# 😍 元ネタ

https://psy.hatenadiary.com/entry/2025/01/27/210452


## 対象者

- 同僚のパーソナリティを理解しようとするエンジニア
- 同僚の一時的な感情を理解しようとするエンジニア
- 信頼関係を構築したいエンジニア
- 同僚に動いてもらえる確率を少しでもあげたいエンジニア

## 🏁 目標

この記事はエンジニアを説得し、前向きに動いてもらう方法を模索する試みです。


## 参考

<img src="https://hondana-image.s3.amazonaws.com/book/image/10031203/normal_5d3d658e-9c48-4c6f-978c-50ce962d448d.jpg">

[コミュニケーションの社会心理学](https://www.nakanishiya.co.jp/book/b10031203.html)





## ネガティブなプロジェクトを進めるときは、成功率を提示せよ

> 癌の外科手術の効果について死亡率の代わりに生存率が示された場合、医師が手術を選択する割合は34%増加した
> McNeil 1982

例えばあなたが管理しているプロジェクトが佳境に差し掛かり、プロジェクトが破綻する寸前まで来たとしましょう。
このような大事な場面で利害関係者に「アクションA」を取らなければならないと説得する必要があるとします。
「アクションA」はとてもリスクのある作業であり、「25%」で失敗するとします。

この事実をそのまま伝えてしまっては、おそらく No と言われるでしょう。

> あなた「このままではプロジェクトが破綻します。アクションAを行えば、何とかなるかもしれませんが、25%の確率で失敗します」

**ネガティブなプロジェクトを進める際には、成功率を提示すると受け入れる可能性が増加します**
ですので、以下のように言い換えを行うことをお勧めします。

> あなた「このままではプロジェクトが破綻します。ですが、アクションAを行うことで、75%の確率でプロジェクトを生存させることができます。」

エンジニアという生き物は「データ」を主眼に生きていますし、そうあるべきだと思います。
ですが数字を見るのも人間であり、「データの伝え方」もデータそのもの以上に影響力があるのです。

### 成功率の提示の逆

逆に、あなたがその「アクションA」を取りたくないとします。
そのアクションを取らせない、つまり **現状維持プランを推し進めたい場合は、失敗率を提示することをお勧めします**

> あなた「たしかに、アクションAが仮に成功すると、プロジェクトは正常に戻りますが、25%の確率で失敗します。代わりに、アクションBのプランもありますし、こちらは75%の成功率です。」

実際には「アクションA」「アクションB」のデータでの違いはないのですが、このセリフだとアクションBが採用されそうですね。



## あいまいさ回避

あいまいさ回避とは **結果がどうなるか見込みがはっきりしない行動を本能的に心地悪く感じること**
べつの言葉を使うと、「結果がはっきりしているものを選択する」という性質であるとも言えます。

> 経済学、または意思決定理論における曖昧さ回避（あいまいさかいひ、英: ambiguity aversion）とは、確率が未知であるような事象を回避しようとする選好。曖昧性忌避（あいまいせいきひ）、不確実性回避（ふかくじつせいかいひ、英: uncertainty aversion）などともいう。曖昧さ回避を持つ選好は後述のように期待効用関数としての表現を持たないことが知られている。古くはフランク・ナイト[1]やジョン・メイナード・ケインズ[2]なども同種の概念を考察しているが、1961年にダニエル・エルズバーグにより曖昧さ回避を持つ選好の具体例が示された[3]。特に1980年代以降、曖昧さ回避を持つ選好の数理モデル化が進んでいる。

https://ja.wikipedia.org/wiki/%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF_(%E7%B5%8C%E6%B8%88%E5%AD%A6)

「エルズバーグのパラドックス」と呼ばれる実験がある。
これは、参加者に対して「どのようなギャンブルを行いたいか?」という確率を選択する実験である。

> 赤玉、黒玉、黄玉が合計90個入っている。このうち赤玉の個数は30個とわかっているが、それ以外の個数はわからない。
> この時、以下の二つのギャンブルを行う
>
> - I. 壺から玉を一つランダムに取り出し、赤玉ならば100ドルが得られ、それ以外の玉ならば何ももらえない。
> - II. 壺から玉を一つランダムに取り出し、黒玉ならば100ドルが得られ、それ以外の玉ならば何ももらえない。
>
> Q1. ギャンブルIとIIのどちらをあなたは好ましいと思うか。

当該論文中で、Q1についてはIをIIより好む傾向があるという結果が見られた。
このように、あいまいさ回避とは **結果がどうなるか見込みがはっきりしない行動を本能的に心地悪く感じること**である。

例えば、あなたがプロジェクトマネージャーで、システムリプレイスを行いたくない（または、やる価値が感じない）とします。
この時に「システムリプレイスは良い案かもしれませんが、**どのくらい時間がかかるかもわかりません**し、新システムの学習コストもかかってしまいます。**これをやるにはあまりにも不確実な要素が多すぎます**。　とにかく調査を行いますので、結論を出すまで少々お待ちください。」
と伝えることで、システムリプレイスを止めることもできるでしょう。





## 大衆心理

大衆心理には、さまざまな別名がつけられます（「ハーディング現象」、「ハンドワゴン効果」「アナウンス効果」などなど... ）

> 大衆心理とは、行動経済学において、個人が自己の合理的な判断を信頼せず、安心感を求めて多数派がとる行動に同調してしまうこと。

https://kotobank.jp/word/%E3%83%8F%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%8F%BE%E8%B1%A1-2119355

この定理も昔から存在する定番中の定番の定理ですが、この効果は絶大です。
例えば、あなたはプロジェクト内のテックリードメンバーであり、数あるオープンソースソフトウェアからどれを取り入れるかの技術選定を行っているとしましょう。
このような場面で、プロジェクトには深くかかわっていない上司から以下のようなセリフでOSS①を推薦されたとします。

> 「この最近作られたOSS試してみたんだけど結構使い勝手よさそうなので、今担当してもらっているプロジェクトで試しに使ってみてくれない?」

多く場合、上司の勢いに押されてしまい、その場では「yes」と答えてしまうでしょう。
そして、そのソフトウェアをあまり使いたくないとします。
このような場合、以下のような形で大衆心理を利用し反論することをお勧めします。

> 「このソフトウェア、最近作られたみたいで、すごいスピードで更新されているみたいです。