OmniAICreator/Qiita-1.07M huggingface dataset:
【メモ】Apacheの「406 Not Acceptable」のエラーについて


　Apacheの「406 Not Acceptable」のエラーについて。
　このエラーは情報が少なく、遭遇して調べたいときにど忘れしていると調べる事に時間がかかって困るので備忘録的なメモです。

## 目次

[1.406エラーとは](#406エラーとは)
[2.406エラーが発生する条件](#406エラーが発生する条件)
[3.他に406になる状況](#他に406になる状況)
[4.406を回避しつつ拡張子無しで実行したい場合](#406を回避しつつ拡張子無しで実行したい場合)

## 406エラーとは
　リクエストを受けたサーバーがコンテンツネゴシエーションをうまく行えず、どのコンテンツを処理するかがURIから判断できなかった時に発生。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/406

## 406エラーが発生する条件
　Apacheの`Options`の値を変えてphpやhtmlを拡張子無しで実行できる設定にすると、コンテンツネゴシエーションのエラーが出る様になります。
　`.httacess`を使う設定とは別の方です。

**●再現方法**
1.Apacheの設定の`Options`に`MultiViews`を追加し、リクエストに対して扱うメディア種類の判断を自動で行うようにする
```コマンド
Options Indexes FollowSymLinks MultiViews
```
2.Apacheの設定の`AddType`でメディア種別と実際に扱うファイル拡張子を紐づける
 （これで拡張子を省略したURLで動くようになる）
```コマンド
AddType text/html .php
```
3.**`AddType`の設定を無視したMIMEタイプをHTTPヘッダの`Accept`に設定し、拡張子を省略したURLで**上記の設定をしたサーバーにリクエストをする
 ```コマンド
 curl -i -H 'Content-Type: html/text' -H 'Accept: application/zip' 'http://localhost/php_index'
 ```
4.コンテンツネゴシエーションのエラーになる
※この時、リクエストはApacheで止められてURLで指定したファイルは実行されない
 ```コマンド
HTTP/1.1 406 Not Acceptable
Date: Mon, 11 Mar 2024 04:06:30 GMT
Server: Apache/2.4.58 (Fedora Linux)
Alternates: {"php_index.php" 1 {type text/html}}
Vary: negotiate
TCN: list
Content-Length: 350
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource could not be found on this server.</p>
Available variants:
<ul>
<li><a href="php_index.php">php_index.php</a> , type text/html</li>
</ul>
</body></html>
```

　だいたい上記の設定とリクエストの組み合わせで発生します。
　そのため、406エラーが発生した時は発生したリクエストのhttpヘッダの内容とURL、そしてApacheの設定を確認する流れになります。

## 他に406になる状況
　ModSecurityというオープンソースのファイアウォールを導入している場合も、設定ルールに反するリクエストで発生することがある様です。
 （ModSecurityはあまり詳しくないので省略…）

## 406を回避しつつ拡張子無しで実行したい場合
　どうしても拡張子無しでApacheに処理させたい場合は`.htaccess`が有効です。
　ただし、この方法は複雑な事をしたい場合`RewriteRule`の書き方を工夫する必要があり、複雑になりがちです。
　また、すでにApacheの`Options`に`MultiViews`が設定されていたら干渉するのでApacheの設定から`MultiViews`を削除する必要があります。

### htaccessの例

**●一番シンプルなもの**
```コマンド
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
```
`/xxxxx` を `/xxxxx.php`に置き換えます。

**●`/`で区切った値をパラメータとして受け取りたい場合**
```コマンド
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^\/]*)/?(.*)? $1.php [L]
```
　`/xxxxx`または`/xxxxx/`を`/xxxxx.php`に置き換えつつ以降のパスは捨てます。
　捨てた部分はリクエストパラメータとは別で取得します。
　サーバーにURI情報が残るので、例えば、PHPなら`$_SERVER['REQUEST_URI']`或いは`filter_input(INPUT_SERVER, 'REQUEST_URI')`で取得してパラメータとして利用します。
Wear OS アプリの審査を通すために対応したこと 2024

## はじめに
Wear OS アプリの審査を通すために対応したことをまとめる

## 対応したこと
### スクリーンショットから透過色の削除

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/9ab51b63-c489-d22d-1c2a-db4e3cb4bd59.png" width="600">

ストアに提出するスクリーンショットの背景に透過色が含まれているとリジェクトされる。Android Studio でスクリーンショットを撮影すると背景に透過色が含まれてしまうので、手動で透過色を塗り潰して再提出する必要がある

### スクロールバーの追加

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/3d8b4dc5-3bef-dda3-7753-32200feb1c1d.png" width="600">

`ScrollView` や `RecyclerView` などを使用してスクロールできる画面を作成した場合は、スクロールバーを表示しないとリジェクトされる

### スプラッシュ画面の追加

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/9d99faac-cc91-e4c1-6f6b-f8237c553684.png" width="600">

アプリ起動時にスプラッシュスクリーンを表示しないとリジェクトされる

参考: https://developer.android.com/training/wearables/apps/splash-screen?hl=ja

### ストアの掲載文に Wear OS に関する記述を追加

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/5a37d6e3-1ee4-204e-0b38-b2172931d3b6.png" width="600">

Google Play Store の掲載文に `Wear OS` のセクションタイトルで説明文を追加しないとリジェクトされる。セクションタイトルは `Wear` や `Android Wear` では駄目で、`Wear OS` の文字列にしないと審査が通らなかった


### 進行中のアクティビティ表示の追加

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/942623c8-e4f6-22a7-4e54-abd5af5725b0.png" width="600">

進行中のアクティビティ（Wear OS 用の通知のようなもの）を表示しないとリジェクトされた。これは作成するアプリによっては免除されると思われる

参考: https://developer.android.com/training/wearables/notifications/ongoing-activity?hl=ja

### フォントサイズの調整

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/20a5b609-8dc6-33a6-5015-d6b3130d8da1.png" width="600">

テキストやボタンなどの UI が画面の端で切れているとリジェクトされる

### Wear OS のオプトイン
Wear OS のアプリ本体を審査に提出する前に、Wear OS 用のスクリーンショットを提出してオプトインのチェックを入れる必要がある。その際にカスタムの掲載情報が作られていると、メインの掲載情報にスクリーンショットをアップロードしただけではオプトインのチェックが押せるようにならないので、その場合は一旦カスタムの掲載情報を削除するか、カスタムの掲載情報の方にもスクリーンショットをアップロードしないとオプトインのチェックが押せないので注意

## まとめ
色々頑張って審査は通った :ok_woman:
C++ NTLライブラリの導入方法(Visual Studio,Windows)

# はじめに
C++でNTLライブラリを導入するのに手こずったため、本記事にまとめます。筆者はC++に関しては初心者であるため、何か間違っていたりアドバイス等あればコメントにて教えてください。

# Visual Studioの導入
今回の導入方法ではVisual Studioを用います。
以下のURLからインストールをお願いします。
(筆者は無料のCommunity版を使用しました。)

https://visualstudio.microsoft.com/downloads/

# NTLの導入
## NTLダウンロード
以下のURLからNTLをダウンロードします。
使用したいバージョンのWindows版(WinNTL-xx x x.zip)をダウンロードしてください。(本記事では最新版である11.5.1を使用します。)

https://libntl.org/download.html

ダウンロードしたら解凍してください。

## NTLコンパイル
次にNTLのコンパイルを行います。
以下のYoutubeに沿って進めていきます。

https://www.youtube.com/watch?v=2xijP2xATPI

---
- Visual Studio を起動し、新しいプロジェクトの作成→空のプロジェクトを作成します。

- 左上のファイルから新規作成→既存のコードからプロジェクトを作成を選択します。


![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/ce35da24-a8a0-ab8c-2a98-3b5e21d3366a.png)

- 新規プロジェクト作成ウィザードが立ち上がったら、プロジェクトの種類をVisual C++に、次へ

- プロジェクトファイルの場所で、先ほどダウンロードしたNTLのsrcフォルダを参照します。プロジェクト名はNTLにし、次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/17ee09ad-cbe0-08b6-d382-735d168625ab.png)


- プロジェクトの種類をスタティックライブライ(LIB)プロジェクトに設定し次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/f8bab328-0392-b610-a345-2d2b5767a7f5.png)

- インクルード検索パスでNTLのincludeフォルダを参照し、次へを押し完了


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/2fffe1ee-88e9-60b3-4695-d4862a3fc096.png)

- ビルドからソリューションのビルドを選択し、コンパイル開始

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/1ba092d0-206f-b119-d339-0d447baf514c.png)


これでNTLのコンパイルは完了です。

## NTLの使用
NTLを使用したいプロジェクトを開き(作成し)ます。
プロジェクト内のソースファイルにNTLを使用したいcppファイルを用意します(テストファイルでいいです)

- プロジェクトのプロパティを開き、左上をすべての構成にします。
- リンカの入力から追加の依存ファイルを編集し、NTL内のsrc/x64の中にあるNTL.libファイルのパスを追加し、右下の適用ボタンを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/91066b29-a9eb-60d9-65a2-cc1e312ce65a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/495541fb-cd9f-1d0d-5511-154ec16e5015.png)

- C/C++ 全般から追加のインクルードディレクトリにNTLのincludeフォルダのパスを貼り付け適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/a1eb3f2e-a13e-25fb-028e-c5d723b13d68.png)

- C/C++のSDLチェックをいいえ(/sdl)に変更し適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/d901ad12-c001-dac5-9514-dd313e431a1e.png)


以上で設定はおわりです。
テストコードを実行すると無事NTL使用できると思います。

# 参考文献
https://qiita.com/TatuTatu/items/978f3636f83d76f55bea

https://libntl.org/doc/tour-win.html
cscの作法 その469

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
QiitaのuserのContributionを取れ。

# サンプルコード

```
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;

namespace App 
{
	class test {
		static void Scraping(string url) {
			ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
			Encoding enc = Encoding.GetEncoding("UTF-8");
			WebRequest req = WebRequest.Create(url);
			WebResponse res = req.GetResponse();
			Stream st = res.GetResponseStream();
			StreamReader sr = new StreamReader(st, enc);
			string txt = sr.ReadToEnd();
			sr.Close();
			st.Close();
			Regex re0 = new Regex("Contribution: ([0-9].+[0-9]) ");
			Match m = re0.Match(txt);
			if (m.Success)
			{
				Console.WriteLine(m.Groups[1].Value);
			}
		}
		static void Main() {
			Scraping("https://qiita.com/ohisama@github");
		}
	}
}





```

# 実行結果

```
6533
```

以上。
Cursor プライバシーモードをONにする方法

## 概要

CursorというエディタでプライバシーモードをONにする方法を簡単にまとめる。

## 付加情報

CursorはどうやらプライバシーモードがデフォルトでOFFになっているらしく、プロンプトが保存される。
プロンプトの保存・利用を防ぐためにはプライバシーモードをOFFにする事で解決する事ができる。

## 方法

- Cursorを開く。
- 右上の歯車マークをクリックする。

    ![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b858b54a-b6f1-4241-87a8-e96289dfa8b9.png)

- 「Privacy mode」のプルダウンをクリックする。

    ![Untitled-1_と_デスクトップ_—_ローカル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6603fe8a-7bbc-b4ab-1e70-ac4dd8b0868e.png)

- 「enabled」に変更し、設定ウインドウを✕で閉じる。

    ![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1a394a18-e001-55d2-05ae-0f054fdefb18.png)

- もう一度右上の歯車マークをクリックし、「Privacy mode」の設定がenabledになっていることを確認する。

## 参考文献

https://cursor.sh/privacy
ARC173 A問題 を9進法の亜種で計算

https://atcoder.jp/contests/arc173/tasks/arc173_a

上の問題の解き方を考えていたら、昨年学習したことを利用して解けたのでメモ。
[ABC285 C問題：ゼロを使わないN進法についてのメモ - Qiita](/HMMNRST/items/e9e68d58de3a1d1d7c85)

## 解答
K を "bijective base-N numeration" という記数法（の N = 9）で表してから、各桁で用いる数字を「 0 〜 9 のうち一つ上の桁と被らないもの」に変える。テストケース毎の時間計算量は O(log K) 。

普段は Ruby を使っているが、最近勉強している Python で書いてみる。

```python:Python
def num2str(num):
    digits = []
    while num > 0:
        num, d = divmod(num - 1, 9)
        digits.append(d + 1)
    digits.reverse()

    # bijective base-9 --> Neq Number
    for i in range(1, len(digits)):
        if digits[i] <= digits[i-1]:
            digits[i] -= 1

    return ''.join(map(str, digits))

t = int(input())
for i in range(t):
    k = int(input())
    print(num2str(k))
```

<details><summary>Ruby 版</summary><div>

```ruby:Ruby
def num2str(num)
	digits = []
	while num > 0
		num, d = (num - 1).divmod(9)
		digits << d + 1
	end
	digits.reverse!

	# bijective base-9 --> Neq Number
	prev = 0
	digits.map! { |d| prev = (d > prev ? d : d - 1) }

	digits.join
end

t = gets.to_i
t.times do
	k = gets.to_i
	puts num2str(k)
end
```

</div></details>

## 発想の流れ
正整数 X ("Neq Number") の各桁の数字は、「最上位は1〜9」「他の桁は0〜9のうち一つ上の位のもの以外」であり、結局**どの桁も9種類しか使えない**。 d 桁の数なら 9<sup>d</sup> 個だけ存在する。

どの桁も N 種類、かつ桁数によっても区別する（ゼロ埋めができない）という規則は、 [bijective base-N numeration](https://en.wikipedia.org/wiki/Bijective_numeration) という記数法と一致する。これは、通常の位取り記数法は各桁で 0 〜 N-1 を使うのに対し、 1 〜 N を使うというもの。

今回の問題では N = 9 であり、 bijective base-9 numeration と X の違いは各桁に用いる数字だけと考えられる。

ひとまず色々な K 番目の数をこの記数法に直して X と比較してみる。問題文の入出力例やその説明にある数を試すと、以下の表のようになる。

| K 番目 | bijective | X |
|-:|-:|-:|
| 1 | 1 | 1 |
| … | … | … |
| 9 | 9 | 9 |
| 10 | 11 | 10 |
| 11 | 12 | 12 |
| … | … | … |
| 18 | 19 | 19 |
| 19 | 21 | 20 |
| 20 | 22 | 21 |
| 21 | 23 | 23 |
| … | … | … |
| 25 | 27 | 27 |
| … | … | … |
| 148 | 174 | 173 |
| … | … | … |
| 998244353 | 2516331732 | 2506230721 |
| … | … | … |

最後の複雑な例に関しても、 bijective base-9 numeration と X とでかなり似た値になっている。桁ごとに見ると、一致しているものと1だけ大きいものがある。どうも一つ上の桁より小さい数字については、1を減らす補正が必要らしい？

この補正は、**各桁で使える9種類の数字が何か**ということに起因する。 bijective base-9 numeration では単純に 1〜9 を使う。一方で X では、例えば一つ上の位が 5 なら 0〜4 と 6〜9 を使う。素直に最上位の桁から順番に補正する~~こともできるし、先ほどの予想のように各桁で並行して補正することもできる~~。
（訂正：最上位から始めずいきなり下の桁を補正することはできない。例えば bijective base-9 で `777` なら X は `767` というように、一見同じ数字の並びでも異なる補正になることがある。）

---

以上をまとめると解法は、 K を bijective base-9 numeration で表してから、各桁で用いる数字を「 0 〜 9 のうち一つ上の桁と被らないもの」に変える、ということになる。
AstroでWikipediaのSummaryを表示する

# AstroでWikipediaのSummaryを表示する

最近Astroでサイトを作ることにハマっています。

作成する記事の中でWikipediaへのリンクを張る際にSummaryとか表示できたら便利かなと思い、コンポーネントを作成しました。

と言ってもfetchして表示するだけの単純なものですが・・・。

これからAstroを触ってみようかと思っている方の参考になれば幸いです。

## コンポーネントのソース

```jsx:Wikipedia.astro
---
interface Props {
    keyword: string;
}
const { keyword } = Astro.props;

let res = await fetch(
    `https://ja.wikipedia.org/api/rest_v1/page/summary/${keyword}`,
);
let summary = await res.json();
---

<div class="wikipedia">
    <Fragment set:html={summary.extract_html} />
    <a class="go-wikipedia" href=`${summary.content_urls.desktop.page}` target="_blank">ja.wikipedia</a>
</div>

<style lang="scss">
    div.wikipedia {
        padding: 0 1em;
        border: 1px #2d2d2d solid;
        border-radius: 8px;

        &::before {
            content: 'Wikipedia';
            display: block;
            margin: 0 -1em;
            padding-left: 1em;
            background-color: #2d2d2d;
            color: #cfcfcf;
            font-weight: 700;
        }
        a.go-wikipedia {
            display: block;
            text-decoration: none;
            text-align: right;

            &::before {
                content: '›';
                margin-right: 0.5em;
            }
        }
    }
</style>
```

## 使い方

使う時はコンポーネントをimportして引用したいキーワードを指定するだけです。

```jsx:index.astro
---
import Wikipedia from 'src/components/Wikipedia.astro';
---

<article>
    <Wikipedia keyword="Qiita" />
</article>
```

## 表示イメージ

プレビューのスクリーショットはこんな感じです。取得したサマリーが表示され、右下に当該記事へのリンクが張ってあります。

スクリーンショットのページにはコンポーネント以外のスタイルも適用されているため、上記のソースだけでは同じにはならないかもしれませんが、あくまでイメージということでよろしくお願いします。

![2024.03.11_01430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120649/d1825a2f-746e-94f2-13de-4db27b631f7e.png)

## 参考資料

- [REST API Documentation](https://en.wikipedia.org/api/rest_v1/)
laravel で cebemarkdown (今さら)

laravel で マークダウンを導入しようぜ


さっと調べた感じ
http://markdown.cebe.cc/
が一番良い感じかな古いけど


インスコ

```
composer require cebe/markdown
```




# 使い方

```
use cebe\markdown\Markdown as Markdown;

//略

public static function test(request $request)
{
    $body = "# おいしいラーメン";
    $parser = new Markdown();
    $res = $parser->parse($body);
    pr($res);
}

```


はい、たったこれだけ。

# 改行バグ？

```
$body = "# おいしいラーメン";

$parser = new Markdown();
$tmp = $parser->parse($body);

//改行がバグるのでおまじない
$body = nl2br($tmp);
$res = preg_replace("/><br \/>/",">",$body);
echo h($res);//<h1>おいしいラーメン</h1>
```

これで改行もバグらなくなる。

以上でございまぁす
SQLの性能調査と運用面での対策

# これはなんですか
アプリから出している変更不可能なSQLの性能調査の例
大したことはしていない。

# 主文
運用君「どんどん実行時間が長くなっていくSQLがあるんです！助けて！」
ワイ「わかった！」

# 対象となるテーブルの関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/a7c6f13a-349c-65f5-8c3a-9129d292c388.png)

ただ、これらのテーブルは厳密にRelationalなDBではなくて（FKとか貼られているわけではなく）、廃棄となった行を理論削除で保持するなど効率的ではない運用が見られる。

# 経緯と所感
どうも時間がたつにつれ集計用SQLが時間を食うようになっているらしい。
先日アプリ側で設定したSQL実行時間(30秒)を超過したらしい。

SQLの構成には一部WHERE句で演算すんなと文句いいたいところはあるが、おおむね問題はないように見える。
EXPLAIN ANALYZEを見ても使ってるfunctionの数が多いことが気になるけどSEC SCANはしていない集計もスムーズに行われているように見える。

しかしこのSQL、４テーブルしか関わってない割には複雑な処理をしている。
マテリアライズド・ビュー使うとか、中間テーブルみたいなのに中間集計結果をputすることでもっと実行時間を短くできそうだなあという感触があった。

だが、ベンダーが渋るためアプリの改修ができないためこの先の見通しと、改善について考える。

# 課題となる点
このSQLの実行時間はこの先どんな増加の仕方をするのか

まず、キーとなるテーブルを探す・・この場合は「購買履歴」のテーブルに応じて他のテーブルの行数が変化する。

キャンセルや変更の履歴は他のテーブルに比べて少ししかないため無視する。
商品マスタも購買系のテーブルに対して少数である上にPKでの参照であるためこれも無視する。

となると、純粋に購買履歴と明細ですよね・・

# 実験する
対象の４テーブルだけを別な実験用DBに移して試験を行う。

まず、諸元について、2023年３月１日時点で下記の行数である。

購買履歴テーブル:   310,000 行
購買明細テーブル： 2,320,000 行
実行時間: 32秒

過去を見てみよう。

`created_at` というカラムが行の挿入時にタイムスタンプを記録しているため、これを使って去年の３月１日の状態を作り出す。

```
DELETE FROM 購買履歴 WHERE created_at >= '2022-03-02';
DELETE FROM 購買明細 WHERE created_at >= '2022-03-02';
```

購買履歴テーブル:  220,000 行
購買明細テーブル： ... 行
実行時間: 24秒

なるほど、

おっとここで性能試験の資料がでてきました。
（ダミーデータであることに留意）

購買履歴テーブル:  100,000 行
購買明細テーブル： 8,00,000 行
実行時間: 5秒

ちょっと購買明細のテーブル・・行が多すぎないかな？と思うけど、参考にさせてもらおう・・

グラフどん
青い線が実行時間、オレンジの線が１行あたりの処理時間。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/2ce0adb8-3001-d391-17f5-414bcb3dd496.png)

オレンジの線が下がっているのが性能的によいSQLで、上がっているとてのつけられないクソSQLになります。

データベースにはB-treeによるindexという仕組みがあるため、検索対象となる行数が増えても、１行あたりの検索にかかる時間はどんどん小さくなるようになっているんですよね。

それを踏まえるとこのSQLは複雑な処理をやってるので・・まー及第点かな・・
購買履歴の増加に伴って一次曲線で実行時間が増えていく・・と。

この事実を踏まえて対策として下記を打ちます

# 対策
## やる対策
* 使わなくなった購買履歴は消すか別なテーブルに移しましょう
* この先実行時間が長くなることが予想されるため、後続のバッチの実行時刻を調整しましょう
* 実行時間に我慢できなくなる限界点を決めておきましょう（１０分までは許すとのこと）
* バッチの実行時間を観察しましょう

## やらない対策
* ベンダーに金積んでSQLをなおしてもらう

この先はかすれていて読めない。
JuliaでDeep Learningを理解する: 3.1 Shallow neural networks I

[Understanding Deep Learning](https://udlbook.github.io/udlbook/)の[ノートブック](https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap03/3_1_Shallow_Networks_I.ipynb)をJuliaで確認する。

# 3.1 Shallow neural networks I
ニューラルネットワークを深くする前に、浅いニューラルネットワークモデルに関して理解を深めておく。浅いニューラルネットワークモデルは以下のような式で表される。
```math
\begin{align*}
y &= f[x, \phi] \\
&= \phi_0 + \phi_1a[\theta_{10} + \theta_{11}x] + \phi_2a[\theta_{20} + \theta_{21}x] + \phi_3a[\theta_{30} + \theta_{31}x].
\end{align*}
```
モデルパラメータ$\phi$は
```math
\phi = \{\phi_0, \phi_1, \phi_2, \phi_3, \theta_{10}, \theta_{11}, \theta_{20}, \theta_{21}, \theta_{30}, \theta_{31}\}
```
で、aは活性化関数である。
## ReLU
活性化関数はReLUを使う。ReLUは以下のように定義される。
```math
a[z] = \text{ReLU}[z] = \begin{cases} 
0 & \text{if } z < 0 \\
z & \text{if } z \geq 0 
\end{cases}
```
Juliaで書くと
```julia
ReLU(z) = ifelse(z < 0, zero(z), z)
```
とできる。
```julia
ReLU(z) = ifelse(z < 0, 0, z)
```
としないのは、型安定性を考慮したためである。0の型はInt64なので、zがFloat64の時、ReLU関数はInt64とFloat64のどちらかを返すかコンパイル時に決定できない。
この場合、ReLU関数はInt64とFloat64の共通の抽象型であるReal型を返す関数と解釈される。zero関数は引数の型の0を返す関数である(zがFloat64ならFloat64の0.0を返す)。
zとzero(z)は必ず同じ型を返すので、コンパイラは型を推論でき、型安定性が得られる。
私は怠惰なプログラマーなので、何がなんでも型安定にすることはない。常にコード容易性、速度の必要性と天秤に掛けている(今回は容易に型安定が得られるのでそうしている)。
```julia
using CairoMakie
z = -5:0.1:5
lines(z, ReLU.(z))
```
![ReLU.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2279125/1deba8b3-0723-4474-8b3a-907e5173e781.png)

## 浅いニューラルネットワークモデル
```math
\begin{align*}
y &= f[x, \phi] \\
&= \phi_0 + \phi_1a[\theta_{10} + \theta_{11}x] + \phi_2a[\theta_{20} + \theta_{21}x] + \phi_3a[\theta_{30} + \theta_{31}x].
\end{align*}
```
をJuliaで実装する。
```julia
function shallow(x, activation_fn, phi, theta)
    pre = theta * [1; x]
    act = activation_fn.(pre)
    w_act = phi .* [1; act]
    y = sum(w_act)
    y, pre, act, w_act
end
```
図で確認してみる。
```julia
x = 0:0.01:1
phi = [-0.3, 2.0, -1.0, 7.0]
theta = [
    0.3 -1.0
    -1.0 2.0
    -0.5 0.65
]
results = shallow.(x, ReLU, phi |> Ref, theta |> Ref)
ys = getindex.(results, 1)
lines(x, ys)
```
![shallow_y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2279125/9dc20691-0c4a-90f9-73ba-dff078d2a338.png)
活性化関数にReLUを用いたニューラルネットワークは1階微分不連続点が活性化関数を適用したユニット数(この例では3)存在する連続関数となる。
[JuliaでDeep Learningを理解する: 1.1 -- Background Mathematics](https://qiita.com/dokudo9191/items/0a0fa879b58d6c4a8a22#linear-functions)で言及した線形関数の単純さを殺さずにモデルの表現力が向上している。(活性化関数にsigmoid、tanhを使っていた初期はそこまで性能は出せなかった。)
VMware代替製品を本格的に比較してみた

以前の記事では、VMwareの代替製品はどんなものがあるかについて書いてみましたが、内容がすこしシンプルでしたので、今回は詳細の機能を比較してみました。

### エンタープライズ向けの有償製品の機能比較

| 機能 | [Hyper-v](https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/get-started/get-started-with-hyper-v-on-windows)  | [Nutanix](https://www.nutanix.com/jp) | [Virtuozzo](https://www.virtuozzo.com/jp/) | [Proxmox](https://www.proxmox.com/en/) |
|:-:|:-:|:-:|:-:|:-:|
| Hypervisor  |  Hyper-v | Nutanix AHV | Virtuozzo KVM  |  KVM |
|  Kubernetes | なし | はい  | はい  | なし  |
|  ロードバランサー |  なし | はい  |  はい |  なし |
|  VPN | なし | はい  | はい  | なし  |
|  ネットワーク | Virtual Switch、SCVMM+NVGRE/VXLAN、Windows RRAS | AHV Virtual Switch、Nutanix Flow  | Open vSwitch (OVS)、Neutron VLAN/VXLAN  |   Bridge, Open vSwitch、VLAN |
|  VDI | はい | Ctrix VDI  | はい  |  なし |
|  vGPU | はい | はい  |  はい | はい  |
|  PCIデバイスパススルー（GPUなど） |  はい |  はい |  はい | なし  |
| ホスト間のライブ移行  | はい | はい  | はい  |  はい |
|  HA | はい |  はい | はい  | はい  |
|  マルチテナント | はい（制限あり）| はい  |　はい   | はい  |
|  Backup |  はい | はい  | はい  |はい（有償オプション）   |
|  外部ストレージ | iSCSI、NFS, FC, vSAN, DAS | なし  | iSCSI、NFS、FC   |  iSCSI、NFS、SMB/CIFS |
|  ストレージサービス | 別途必要 | Block、ファイル、S3オブジェクト  | Block、ファイル、S3オブジェクト   |  Block、ファイル（Ceph） |
|  HCI | SMB |  Built-in | Built-in  | サポートなし（Ceph）  |
|  管理者画面 | はい |  はい | はい  | はい  |
|  ユーザー画面 | はい | はい  | はい  | 管理者UI  |
|  Billing&Metering | なし | はい  | はい  | なし  |
|  日本語ドキュメンテーション | はい | はい  | はい  | なし  |
|  日本語UI | はい | はい  | はい  | なし  |
|  365*24サポート | はい | はい  |  はい | なし  |
|  日本法人 | はい | はい  |  はい | なし  |
| ユースケース  | 小規模、Windows系メインの環境 | コスト気にしないが、運用負荷を減らしたい大手金融企業  |  サービスプロバイダー、SMB | SMBの検証・テスト環境  |
| 注意点  | LinuxOSや大規模なクラスター管理に意外に大変 | 安くならない可能性がある、外部ストレージ再利用不可  | セキュリティ認証に厳しい大手金融に不向き  | 運用・学習コストも含めるとトータルコストが高くなる可能性がある  |



（注：上記の情報は各社のウェブサイトから確認できたもので、人的なミスや古い情報の可能性があるので、詳細について各社に直接確認してください。内容間違っていたら、コメント欄にてご指摘いただけると嬉しいです。）
PHPerKaigi 2024でレギュラーセッション登壇してきました！

## はじめに

>PHPerKaigi（ペチパーカイギ）は、PHPer、つまり、現在PHPを使用している方、過去にPHPを使用していた方、これからPHPを使いたいと思っている方、そしてPHPが大好きな方たちが、技術的なノウハウとPHP愛を共有するためのイベントです。

2024年3月7日（木）〜 3月9日（土）開催でした。

https://phperkaigi.jp/2024/

## 登壇セッション

https://fortee.jp/phperkaigi-2024/proposal/939533ae-f26a-4bd3-a8e4-c88d820943c6

https://speakerdeck.com/yamamotohiroya/pahuomansuwogai-shan-surunihashi-yang-bian-geng-ga1fan-hayai

去年に引き続きプロポーザル採択での登壇となりました。
（[去年の記事](https://qiita.com/yamamoto_hiroya/items/5e3780f163093176f34e)）
トーク聞いていただいた方、反応していただいた方、現地でコメントいただいた方
全ての方に感謝です。
ありがとうございます！
本質的にはやくしてパフォーマンスを改善していきましょう！っていう話をしました。
そのために大事なのはコミュニケーションですね、という話もしました。

またトラックDにてアンカンファレンスがあり、そちらのLTも飛び込みで登壇しました。
「どうにかする力の正体とは？」というテーマでお話させていただきました。
こちらは飛び込みLT用に作ってあったやつを話したもので、完成度が低いので資料をアップしていないです。
要望あれば考えます。
今のところアップ予定なし。

## コードゴルフ

https://t.nil.ninja/phperkaigi/2024/golf/

今年はコードゴルフが企画されていました。
与えられたお題を満たすコードをできるだけ短く書け、という競技です。
時間がなくてあまりできなかったですが
問1: 9位
問2: 8位
問3: 6位
という結果でした。
こちらはどういった回答をしたのか、別記事にしたいと思っています。→しました。

https://qiita.com/yamamoto_hiroya/items/65b893419584e784025d

## 気になった講演

### マイクロサービスがほしいと思ったときに本当に必要だったもの〜なぜ人は共通基盤の夢を見るのか〜

「同じような処理」は本当に「共通処理」なんだろうかっていう視点は常に持ちたい。
あとマイクロサービス、最近の逆風すごいなーを感じている。

### 履歴データテーブルとの向き合い方

レコードをまたがるバリデーションめんどくさいの、過去に似たような経験をしたので分かりみしかなかった。
この設計バグりそうだな、っていう感覚大事。
確かにありそうでなかった部分のお話だったので大変おもしろかった。

### 帰ってきた「完成度低いの歓迎LT大会」（PHPerKaigi出張版）

ハードルを下げること、失敗を許容すること、を見事に実現されており、取り組み自体が素晴らしいなと思っています。
登壇する人だいたい同じ問題は分かりみがありました。
すぎやまさんとは個人的にお話して、これの後にトラックDのアンカンファレンスの方のLTに参加させてもらいました。
この場を借りてお礼を申し上げたいと思います。
ありがとうございました！

### キャッシュと向き合う、キャッシュと共に生きる

安定のそーだいさんでした。
キャッシュってひとことで言ってもいろんな考え方があり、使い方を誤ると大変なことになる。
イージーとシンプルのお話、失敗できる環境が大事
などこのあたりが特に印象に残っています。

### はじめてのメンバー育成。マネージャーとメンバー視点で振り返る1年間

マネジメントや育成の話ということで聞きに行った。
分かりみが深い話ばかりで大変おもしろかった。
やっぱりマネージャーはマネージャー特有の悩みやノウハウがあり、そういったもののシェアは大事なんだなーって感じました。
EMカンファレンスあればいきたいなと思いました。
期待を伝える。
与える課題はサポートしてギリできるくらいのサイズと難易度。
このあたりが成長させる秘訣なのかなと個人的には思っている。

### privateメソッドのテストって書かない方がいいんだっけ？

弊社NE株式会社のエンジニアのセッションでした。
privateメソッドはテストを書かない方が良いというお話。
またmockやstubを多用すると本当にテストしたいものができていない可能性がある、といった話でした。
テスト不要なほど小さな塊（もしくはテストがめっちゃ簡単なくらい小さな塊）に分けていき、それの組み合わせによって処理を作っていくのが良さそうに思いました。

### その他

今回弊社NEはスポンサー&僕含めて2名の登壇がありました。
ご興味ありましたらご覧ください！

https://fortee.jp/phperkaigi-2024/proposal/f23f927e-2ac8-498e-a047-6376831cbd07

https://fortee.jp/phperkaigi-2024/proposal/1be00d06-afa8-4ba9-a49b-9118c782f8e3

## まとめ

今回も非常に楽しめました。
ランチは大体ぼっち飯をきめるんですが、今回は運営さん側でマッチングして野良でランチにいける企画があり、1日目2日目ともに参加し知らないPHPerの皆様とコミュニケーションを取れて大変良かったです。
またコインロッカーの用意があり、荷物を入れて身軽に動けたのが非常に嬉しかったですね。

今年も小桜エツコさんに名前を呼ばれてハッピーな気持ちになりました。
運営の皆様・スピーカーの皆様・参加者の皆様、本当にありがとうございました！
またらいねーん！

https://x.com/phperkaigi/status/1766470916610113971?s=20

https://x.com/HiroyaYamamoto1/status/1766420471472689181?s=20

![IMG_2392.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/7b7fc517-06ca-d655-a715-f4ca2a7e75da.jpeg)
基本情報技術者試験の勉強法

# 基本情報技術者試験に合格した勉強法
3月9日に基本情報技術者試験を初めて受験し合格しました。
 
 ![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741338/89d2d3f5-2631-f6b3-58f9-f72a2d50de84.png)
※著者スペック
  　社会人3年目（製造業での情シス担当）
   　文系大学出身
    　プログラミングは出来ない

勉強時間は平日2～3時間を20日くらい、合計50時間くらいでした。
その割には科目Aで良い点が取れたので勉強法を記録しておきます。

## 使用したテキスト、サイト
①[栢木先生の基本情報技術者教室（科目Aのインプット用）](https://gihyo.jp/book/2022/978-4-297-13130-2)
②[出るとこだけ！基本情報技術者［科目B］（インプット＋アウトプット用）](https://www.shoeisha.co.jp/book/detail/9784798182520)
③[うかる！ 基本情報技術者　[科目B・アルゴリズム編]（インプット＋アウトプット用）](https://bookplus.nikkei.com/atcl/catalog/23/12/06/01151/)
④[基本情報技術者試験　過去問道場](https://www.fe-siken.com/)
⑤[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/)
    
### 選定理由
①：これかキタミ式を選んでおけば間違いないはずです。
②③：科目Bの対策として②を購入しましたが、アルゴリズム編にあるオブジェクト指向の記述が良く理解できず、③を購入しました。が結局、オブジェクト指向はよくわからないままでした。
③のほうが、アルゴリズム編とセキュリティ編を分けている分問題演習が充実しているので、これとセキュリティ編を買ったほうが良いと思います。
④⑤定番サイトです。

## 勉強方法
### 1.科目Aのインプットを行う。
科目Aの教科書を読み、章ごとに過去問道場で問題演習をします。
過去問道場では、分野＋年度ごとに問題数を絞れるのでインプットした内容と同じ分野を5年分くらいで絞ると効率的です。
問題演習で分からない単語、忘れてしまっている単語が出てきたら教科書の索引から単語を探し解説を読みます。
もし索引にその単語が無ければ重要度がそこまで高くないので飛ばします。索引にある単語であれば、該当ページで解説を読み、それでも分からなければIT用語辞典を参照してください。
教科書の解説はあまり詳しく書かれていないので、教科書で重要度と概要を確認し、詳細はIT用語辞典などのサイトで調べて具体的なイメージを持つと良いです。
### 2.科目Aのアウトプットを行う。
過去問道場で1年ずつ過去問を解きます。10年分くらい解けば十分です。
### 3.科目Bのインプットとアウトプットを行う。
うかる！基本情報技術者 を読み、LESSONごとの練習問題と巻末のサンプル問題を解きます。

科目A・B共にインプット→アウトプットのサイクルを短くする、あるいは同時に行うのが効率的だと感じました。筆者は上記の勉強法を1サイクル行い合格しました。科目Bはギリギリ合格だったのでもう少し勉強しても良いかもしれませんが、科目A対策は上記で十分かなと思います。

## 所感
科目Bのオブジェクト指向が終始分からず不安でしたが、試験本番でもそこまでオブジェクト指向の知識を要求されませんでした。素早く正確にトレースする力が試されているように感じました。

基本情報技術者を受験したきっかけは、会社で褒賞金が貰えると聞いたからでした。次は10月にある応用情報技術者を受験予定ですが、それまでに時間があるので、セキュリティマネジメントや簿記、MOS等を取って褒賞金を荒稼ぎしようと考えています。
Autodesk Fusion 長穴のパッド

　ネットではMillingレイヤを使う方法とかいろいろ触れられているが、今は一発でできるようになっている。DCジャックとか用の穴を開ける際の参考になれば幸い。
 
# 方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735823/e7125e76-f52e-162e-a751-252e5a9e0937.png)

　パッドを選択して、形状は「スロット」を選択。ドリルで穴の幅、Slotの長さで穴の長さ、直径でパッド部分の大きさを設定できる。

 　おしまい。
Wraptasで特定のブロックを公開しない方法

# 概要
弊社の製品のFAQをnotionで作成し、製品と同じドメインで公開しています。notionの公開にWraptasを利用しています。
notionは社員であればだれでも編集できる権限にしている関係上、個人情報や秘匿情報を誤って公開しないように注意書きを設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/80427aa6-61a4-59cb-97bb-73770e944f93.png)

ですが、これは本番のFAQサイトには公開したくありません。したがってこのブロックを非表示にします。

# 結論
Wraptasのサイトデザイン設定を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/39a22634-c935-3b11-d5ef-3e05929ec578.png)

追加CSSにdisplay: noneを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/c406d671-b7e6-f24f-a8c1-93a8eefefa33.png)

# IDを見つける方法
公開ページ（notionではなく公開後のページ）にアクセスし、F12キーを押して開発者ツールを開きます。
そして、非表示にしたいブロックを選択すると `id="block-xxxxxxxxxxxxxxxxxxx"` を見つけることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/6daad8ea-d316-8fb4-921f-82c771ab442b.png)
私たち「ネットワーク屋」はどこへ行く？（早速「Free沼」にハマった編　スピンオフ・ストーリー　その１）

今回は、前回の記事で話題に上った

<b>『プロトコル屋としては、ネットワークミドルウェアは仕様通りに作ってあって正常に動いて当たり前で、その先に、相手の癖だったり使う環境だったりそういった「耐性」が重要だったりすると思っています。』</b>

というところについて、前回までの記事とは別の「Centeの中の人」である私、菅野からスピンオフ・ストーリーをお届けします。

前記事の中でISDNルータ「MN128-SOHO」が話題に出ていましたが、当時はインターネットやWWWというものが一般家庭に降りてきて、回線はアナログからデジタルに、プロバイダも増え、そこにつなぐ機器も次々に新発売された時代でした。家庭向けISDNルータで言うとNTT-ME MN128-SOHOの他に、YAMAHA NetVolante、NEC Aterm、富士通 NetVehicleなどの名機がしのぎを削っていたことを思い出します。
私は実は、このMN128-SOHOのネットワーク部分のファームウェア開発の真っただ中に居ました。

さてさて、少し話を戻します。
組込機器のネットワーク部分のファームウェアを作っている会社（人）がそれぞれ違うのに、どうして「つなげる」「通信する」ことができるかというと、（当然ながら）みんな同じ仕様書を読んで実装しているからですね。PPP(Point to Point Protocol)にしろTCPにしろHTTPにしろ、ちゃんとIETFが公開しているRFCという文書シリーズにプロトコル仕様が規定されています。

RFC例）PPP　 https://datatracker.ietf.org/doc/html/rfc1661

　脱線話：　PPPプロトコルとか、HTTPプロトコルとか言っちゃう事ある人いませんか？最後のPはプロトコルですから、＊＊＊プロトコル・プロトコルって事ですからね！(笑)
 
最低限RFCで「MUST」（実装しなければならない）と記述されている仕様を実装しておけば「つなげる」「通信する」ことができます。。。できるはずです！
でも、昔は発表されたばかりのRFCでこんなことが起きました。

1.	RFCの解釈に幅があり、解釈の違いで問題発生！
2.	RFCに記述されていない部分の実装の違いで問題発生！
3.	「SHOULD」（実装すべき）「MAY」（実装してもよい）の実装の有無で問題発生！

これが外から見ると機器の癖とか機器同士の相性として見える現象で、どちらが正しいということではありません。ただ、「こっちは悪くない」と突っ張っても機器を使いたいお客様が困るだけなので、我々としてはとにかくいろんな相手と接続試験を行って相手の癖を吸収するよう努力しました。ISDNルータの新製品が出たと聞けばすぐに購入・試験していたあの頃の社内は、さながらISDNルータ新製品の展示会場でした…

そんなバックグラウンドがあるためか、その後「ミドルウェア屋」となった我々は、自分たちが提供したプロトコルスタックが、それまで経験のない相手、新しい環境で「つながらない」という報告を受けた場合もすぐに調査・修正する体制をとっています。こういった継続メンテナンスや新環境対応がミドルウェアを提供する側の責務（我々の顧客の重要な目線）だと思っていて、もし、「Free沼」と言いつつも、Free環境でこれらが実現できているのであれば、例えばFreeRTOSがそこまで無償提供しており、相互接続性や不具合に対する対応がなされているのであれば、ミドルウェア屋としてその存在意義は薄くなってきたのかな、とあきらめかけていました。
しかし、実際にFreeRTOS環境を使って見えてきたことは、別の「Centeの中の人」が書いている記事の通り、顧客が開発したい組込機器とFreeRTOSが提供する環境の間には相当のギャップ（我々の言うFree沼）がある、ということの片鱗でした。なんとなく、AWSは同等以上の開発力を持っているエンジニアに向けて「こういうものをつくってみたので、あなたの開発に役に立つ部分があればご自由にご利用ください。」と言っている「だけ」なのではと感じます。

<h3>今日の閑話</h3>
RFCについて、一旦採番・公開された後も前述のような問題点を修正して新しい番号として採番・公開されていますし、最近のものは過去の経験から最初から十分留意されているので今は問題ないのかもしれません。私が必死に読んでいたRFCは20年以上前の1000番台、今はもう9000番台超えていますね…

そういえば、RFCの中には「ジョークRFC」と呼ばれる毎年4/1に発表される楽しいものもあります。伝書鳩にメモをつけて相手に届けるプロトコルRFC1149は最も有名かもしれません。Qiitaに解説記事を投稿している方がいらっしゃいますのでどうぞ。

https://qiita.com/yoshi389111/items/a7ba3d66bb775bafeb6e
Dummy Outputしかなくて音が出ない

## 問題
新しいThinkpad X1 CarbonにLinux（ArchLinux？）をインストールしたときに、デフォルトで音が鳴らない。ハードウェアデバイスのリストにDummy Outputしか出ない。

## 調査結果
Redditにsof-firmware入れたら直るんじゃね、って話が載っていたので試したら直った
https://www.reddit.com/r/archlinux/comments/k1dtbo/pulseaudio_shows_dummy_output_only_need_help/

デフォルトでインストールしておいて欲しいけど無理なのかな？
Lightning スレッドへの切り替え

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [Replace formula used for Ref Id with Thread token](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZC7asSAD)


+ [ヘルプ: 参照 ID の無効化および Lightning スレッドへの切り替え](https://help.salesforce.com/s/articleView?id=000389648&type=1)
+ [ヘルプ: メール-to-ケースの参照 ID 形式の変更](https://help.salesforce.com/s/articleView?id=release-notes.rn_service_email_refid_format.htm&release=244&type=5)

|古い形式	|新しい形式 (WINTER '24)|
|:----------|:---------------------|
|ref:_00Dxx1gEW._500xxYktl:ref	|ref:!00Dxx01gEW.!500xx0Yktl:ref|

+ [Email-to-CaseでRef IdからThread tokenに乗り換えてみた](https://qiita.com/masahiro_sf/items/298c7803d8e62425cd61)

# Summer 24

+ [参照 ID の無効化および Lightning スレッドへの切り替え](https://qiita.com/Keiji_otsubo/items/a2bd176d0b2f07504d87)

# フローからは使えない？

+ [New Lightning Thread Token unavailable in Flows](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cm9eE)
ファビコン

# ファビコンとは？

ファビコン(favicon)とは、Webブラウザで新規タブを開いた
ときにタブに表示される画像またはWebページをブックマーク
した際に表示される画像。

# ファビコンを作る

### ①画像を用意する

256*256程度のサイズの画像を用意するが、今回はicooonから好きなPNG画像をダウンロード。
#### icooon-mono

https://icooon-mono.com/


![ファビコンicoon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/cf70a882-a75d-e7b0-6f82-4b3d7cc689f9.png)


### ②変換サービスを使って.icoのファイルに変換

#### ファビコンジェネレーター

https://favicon-generator.mintsu-dev.com/

![ファビコンジェネレーター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/1c4d408f-e0a4-21e3-7a9e-892798a253a3.png)

今回は64*64に画像を変換。

ダウンロードをして使いたいファイルにファビコンを追加する。
![スクリーンショット (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/7c6e576b-2d5f-3b46-024b-028aad8cdaa4.png)
※画像フォルダなどに入れておくとサーバーによってはうまく表示できないらしいのでindex.htmlと同じ階層に入れておく。


### ③headにlinkを追加

```html
 <link rel="shortcut icon" href="favicon.ico" type="image/x-
icon">
```
Webページを開いて表示されていたらOK！！

![ファビコン反映.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/8c2a961d-9e38-3eef-872e-66da1325bfa7.png)
MYSQLで大量の値をWHERE INで指定したらエラーが出た

## 事象
MYSQLでWHERE INで値を大量に指定した際(10万個くらい)以下のエラーが発生した
```
SELECT * FROM user WHERE name IN ('tanaka','suzuki','kato'...)
```
```
Prepared statement contains too many placeholder
```

## 原因
MYSQLのプリペアードステートメントのプレースホルダーの上限は65,535までらしい

## 対応
IN句に渡す値を上限に行かない数に分割して、複数回SQLを実行する形式に変更
```
-- 60000件
SELECT * FROM user WHERE name IN ('tanaka','suzuki','kato'...)
-- 40000件
SELECT * FROM user WHERE name IN ('ishida','mori','saito'...)
```

## 参考

[MySQL] too many placeholders の解消
https://qiita.com/idek/items/80ffb8e4ffe99e28caed

MySQL: プリペアドステートメントのプレースホルダーの数は65535まで。
https://cufl.hateblo.jp/entry/2021/08/25/215402
バッチファイル作成とショートカットで実行するまで

以下の記事と関連しています

https://qiita.com/umashikate/items/ae2b33ffdcd7615abc0d

https://qiita.com/umashikate/items/ba4867ff068bb23429a6

---
バッチファイルを作成する手順は非常に簡単です。
環境：Windows10

**1 テキストエディタを開く：**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/42bed6f3-7f49-f424-1b12-8cf759a9d038.png)

   - バッチファイルはテキスト形式のスクリプトですので、テキストエディタを使用します。
   - Windows 10には、メモ帳（Notepad）が標準で搭載されています。スタートメニューから「メモ帳」と入力して起動できます。

**2 スクリプトを入力する：**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/939e9bc2-2d73-d02a-f14d-f5121aa872c8.png)

   - テキストエディタで、バッチファイルに実行したいコマンドを入力します。例えば、前述のファイアウォールのスクリプトのようなものです。

   ```batch
   @echo off
   color 2f
   netsh advfirewall set allprofiles state on
   echo Windows Firewall "Status OFF"
   netsh firewall show config
   pause
   ```

**3 保存：**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/39496665-5c5b-a762-f952-00595ded8f00.png)

   - スクリプトを入力したら、ファイルを保存します。
   - ファイルの拡張子を`.bat`にすることで、それがバッチファイルであることを示します。例えば、`FirewallOn.bat`など。

**4 ファイルの保存場所：**
   - ファイルはどこでも保存できますが、使いやすい場所に保存すると良いでしょう。
   - デスクトップやドキュメントフォルダなどが一般的です。

**5 ショートカットキーの作成：**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/d9fa52f2-b915-4dd1-5dd9-dc85a3562b28.png)

   - 作成したバッチファイルのショートカットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/529b40c0-ae9c-680a-fc1d-7d30b65e50d1.png)

   - ショートカットを使いやすい場所に移動させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/97207e68-e881-0a1f-7dec-c636aca831b5.png)

   - ショートカットの「プロパティ > ショートカット > 詳細設定」と進み、管理者として実行にチェックを付けます。OKを押下した後、適用、OKの順で押下します。

※今回の例で作成したバッチファイルがFirewallを操作する処理だったため、この管理者として実行のチェックを付ける手順がありました。もしチェックしなかった場合はうまく動作しない可能性がありますので、作成するバッチファイルに合わせて設定を行ってください。

**5 実行：**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/fe3d217b-1afa-9623-7871-c24c3cbc1ad3.png)

   - 保存したバッチファイルをダブルクリックすると、バッチファイルが実行されます。
   - ユーザーアカウント制御からこのアプリがデバイスに変更を加えることを許可しますか？と聞かれるので「はい」を選択します。
   - コマンドプロンプトが開いて実行結果が表示されます。

これで、基本的なバッチファイルを作成して実行する手順が完了しました。バッチファイルは、簡単に実行でき、同じ手順を何度も繰り返す際に便利です。
Makeコマンドでハイフンに続く文字列を引数的に認識する

# Makefile


Makefileに 以下のように書くと

```makefile
hello-%:
	@echo "hello ${@:hello-%=%}"
```

以下のようにコマンドを実行できる

```
make hello-foo
```

```
make hello-bar
```

ハイフンでつないだ末尾の文字列を引数的に扱える

# 詳細

`@:` の中身はMakeのサブコマンド ( `hell-foo` とか `hello-bar` とか ) のようだ

`:hello-%=%` がどんな文法なのはいまいち分からないが、この場合でいうと先頭の `hello-` を除去してくれているらしい

```
${@:hello-%=%}
```



# 参考

https://qiita.com/algas/items/499d0d69d51a1cc7639f


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
【スクラム入門】アジャイル開発、スクラム開発とは？

# アジャイル開発とは？メリット・デメリット
アジャイル開発は、ソフトウェア開発プロセスの一つで、柔軟性と効率性を重視します。
計画性よりも変化への対応を優先し、顧客のフィードバックを継続的に取り入れることで、ユーザーにとって本当に価値のある製品を創り出すことを目指します。

主なメリットには、
迅速な対応、顧客満足度の向上、生産性の向上が挙げられますが、
デメリットとしては、
未経験者には取り組みにくいこと、計画の見直しが頻繁に必要となることにあるようです。

# スクラム開発とは？
スクラム開発はアジャイル開発の一種で、より具体的なフレームワークを提供します。

小さなチームが短いサイクル（**スプリント**と呼ばれる）で作業を進め、定期的に製品の進捗をレビューし、改善点を特定して次のサイクルへと継続的に改善を重ねていく手法です。

# スクラム開発の重要用語。とりあえずこれだけ押さえておきたい
- **スプリント:**
スクラム開発の基本的な単位で、通常2週間から4週間の期間で特定のタスクを完了させます。
- **プロダクトバックログ:**
製品に追加される機能や要件のリスト。優先順位に従って整理されます。
- **スプリントバックログ:**
現在のスプリントで取り組むタスクのリスト。
- **デイリースクラム:**
毎日行われる短いミーティングで、チームの進捗状況を共有し、問題点を把握します。
- **スプリントレビュー:**
スプリントの終わりに行われるミーティングで、スプリント中に完成した作業をレビューします。
- **スプリントレトロスペクティブ:**
スプリントレビュー後に行われ、次のスプリントを改善するためのフィードバックを共有します。

# スクラム開発の全体の流れ
スクラム開発は以下のステップで進行します：

1. **プロダクトバックログの作成**
1. **スプリント計画ミーティング:**
スプリントバックログを作成し、スプリントの目標を定めます。
1. **スプリントの実施:**
定められた期間内でタスクを完了させます。
1. **デイリースクラムを行う:**
日々の進捗を共有し、問題点を特定します。
1. **スプリントレビューをする:**
スプリントの成果をレビューします。
1. **スプリントレトロスペクティブをする:**
スプリントの運営を振り返り、改善点を特定します。

# まとめ
- スクラム開発は、アジャイル開発の原則を具体的なフレームワークに落とし込んだもの
- 迅速なフィードバックの取り入れと継続的な改善を通じて、効率的なソフトウェア開発を目指す
- スクラムは特に変化が激しいプロジェクトや、顧客の要求が頻繁に変わる環境に適している

# 参考文献（公式サイト）
- スクラム公式サイト：https://www.scrum.org/
- [SCRUM BOOT CAMP THE BOOK](https://www.amazon.co.jp/SCRUM-BOOT-CAMP-BOOK%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA/dp/4798163686)

現在スクラムブートキャンプという本で勉強中。
こちらの書籍は2020年に発売され、私の手持ちだと2022年に初版第5刷発行のようなので、
もしかしたら情報古いかもしれません。
英語に抵抗なければ公式サイトを参照すると良いでしょう。

今後実務でもスクラム挑戦する予定なので、定期的に記事を作成、更新していきたいと思います。
無知が1から最小二乗法のパラメータチューニングについて考える。

# 【注意】
著者は数理を教育機関等で学んでおらず、独学で統計、データ解析などを会得しています。間違いや気になる点がありましたらご気軽にご質問ください。

# はじめに
理系の大学生なら一度は回帰分析をしたことがあるのではないでしょうか。そして、モデル作って最小二乗法やってみようとしたけど最小化するところでつまずく人は多いと思います。少なくとも私はそうでした。私は数理の専門家でもないし、教育機関で数理を学んでいるわけではないですが、直感的にこういうことか！とわかる解き方を思いついたので紹介します。

# 最小二乗法
モデルは大抵

```math
    \hat{y}=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_nx_n
```

のような線形回帰を仮定する場合が多いです。各説明変数$x$に対して重み$\beta$がついています。説明変数が少ない場合とかはたまに

```math
    \hat{y}=\beta_0+\beta_1x+\beta_2x^2+\beta_3x^3
```

とかになります。また、最小二乗法とは各観測値と予測値の残差2乗和を最小化することでした。
 
```math
     \min_{\beta_0,\beta_1,\beta_2,...}{L}=\sum^{I}_{i=1}{(y_i-\hat{y}_i)^2}
```

**最小値とかどーやってわかんねん**
って過去の私はなったわけです。

# Lはどんな関数か
ここから私独自の見解です。まず$L$を$\beta_1$で微分してみます。

```math
    \frac{d}{d\beta_1}L=-2\sum^{I}_{i=1}{x_{1i}(y_i-\hat{y}_i)}
```

さらに微分すると

```math
    \frac{d^2}{d\beta_1^2}{L}=2\sum^{I}_{i=1}{x_{1i}^2}
```

となり、二回微分が常に正となります。$\beta_1$に関して解きましたが、他の$\beta$でも同じような解になりそうですよね。つまりまとめると

**各$\beta$に対して$L$は下に1つの峰しか持たない関数**

と言うことができます。$\min{L}$は局所解を持ちません。

# パラメータチューニング
さて、$L$は$\beta$に対して下に1つの山がある関数であることを示しました。このことから$L$が全ての$\beta$に対して微分値0である時最小値を取ることが言えます。

...とはいえ、常に$\hat{y}$の値って変わり続けるから無理じゃね...ってなると思います。

もうちょっと現実の問題として考えましょう。谷にボール落とすと絶対一つの場所で止まります。それっぽいことをすれば解が求まると思いませんか？ボールって谷に置いた時、その地点での勾配が一番強いところに転がっていきます。つまり、**勾配を辿っていけば解に巡り会う**ってことですよね！

勾配が負の時は正の方向に進んで、勾配が正の時は負の方向に進むような探索方法を考えます。以下のような更新則を考えました。

```math
     \beta_{1_{new}}=\beta_{1_{old}}-\alpha{\frac{d}{d\beta_1}{L(\beta_{1_{old}})}}
```

$\alpha$はどのくらい勾配方向を進むかの程度を表す任意の定数です。収束するまで更新し続けることによって解を得ることができそうです。例として$\beta_1$の時の例を出しましたが、他の$\beta$も同じように更新していけば解に辿りつけそうですよね。

# Rで実装
この理屈が合ってるかRで実装+確認をします。今回のモデルはこちらです。

```math
    \hat{y}=\beta_0+\beta_1x+\beta_2x^2
```

正解値は$[\beta_0,\beta_1,\beta_2]=[3,-6,2]$とします。それにノイズを入れて擬似的な観測値にしました。

```math
    y=3+(-6)x+2x^2+\epsilon
```

予測した各$\beta$が$[3,-6,2]$になれば理論を証明できますね。

コードはこちら。

```R:main.R
sample = 10 #観測値の数
x = seq(-10, 10, length.out=sample) 
y = 3 + (-6)*x + 2*x^2 + rnorm(sample, 0, 10) #擬似観測値

data_frame = data.frame(x, y)

trial = 100000 #試行回数
alpha = 0.000001

#初期値は0にした
beta_0 = 0
beta_1 = 0
beta_2 = 0
for (t in 1:trial){
  L_diff_b0 = 0
  L_diff_b1 = 0
  L_diff_b2 = 0
  for (i in 1:sample){
    L_diff_b0 = L_diff_b0 + 1*(data_frame$y[i] - (beta_0 + beta_1*data_frame$x[i] + beta_2*data_frame$x[i]^2))
    L_diff_b1 = L_diff_b1 + data_frame$x[i]*(data_frame$y[i] - (beta_0 + beta_1*data_frame$x[i] + beta_2*data_frame$x[i]^2))
    L_diff_b2 = L_diff_b2 + data_frame$x[i]^2*(data_frame$y[i] - (beta_0 + beta_1*data_frame$x[i] + beta_2*data_frame$x[i]^2))
  }
  #各微分値を計算
  L_diff_b0 = (-2)*L_diff_b0
  L_diff_b1 = (-2)*L_diff_b1
  L_diff_b2 = (-2)*L_diff_b2
  #ベータを更新
  beta_0 = beta_0 - alpha*L_diff_b0
  beta_1 = beta_1 - alpha*L_diff_b1
  beta_2 = beta_2 - alpha*L_diff_b2
}

#最終的なベータを表示
print(beta_0)
print(beta_1)
print(beta_2)
```
結果は下記のようになりました。

![スクリーンショット 2024-03-11 12.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740696/99eb4daf-9539-538e-fb3e-36f867c6f00b.png)

大体理論値と同じです。理屈は通ってそうですね。

# さいごに
おそらくもっと簡潔で綺麗な解き方というのはあると思います。しかしながら、愚直であっても自分で解いてみることによって理解はより深まると思っています。愚直に解いた後回答を見た方が、どういったプロセスで解を得ているのかをインプットさせやすいです。これからも愚直に解いていきます。
wsl2+docker ping 8.8.8.8/google.com が通らなかったとき

wsl2+dockerで突然名前解決できない場合がある。その時に行った対処法をまとめた。（dockerを先週から使い始めまだまだ分からないことが多いです。説明等の拙さご了承ください。）
結論、ping 8.8.8.8はつながったがgoogle.comがつながっていない。あと少しで解決できそう。

対応したことは以下４つ。

1./etc/wsl.conf　追記
2./etc/resolv.conf　記述
3.powershell7 wsl関連サービス再度立ち上げ
4.cmd wsl --shutdown
5. windows11　再起動

generateResolvConfがtrueだとresolv.confが作られる。
自分は他の対応されてるブログを参考にfalseにし、resolv.confファイルを自分で作成した。

```
cat /etc/wsl.conf
#上2行追記
[network]
generateResolvConf = false
[boot]
systemd=true
```

以下、２行付け足すことでDNS名前解決できると散見し、実行。
```
root@HA000144876:~# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
```

WSLが再起動するたびに内部のIPアドレスが変わることが関係してるのではと考え、
powershell 7 で以下コマンド三つ打った。
LxssManagerはWindows Subsystem for Linux 関連サービス。Linuxでよく使用されるバイナリのフォーマットである ELF を Windows で動作させる機能に関するものらしい。
hns はコンテナネットワークに関するサービス。Host Network Serviceの略。
その２つをrestartする。
```
Restart-Service LxssManager
Stop-Service -name "hns"
Start-Service -name "hns"
Get-NetAdapter -IncludeHidden | Where-Object `
>>     {$_.InterfaceDescription.StartsWith('Hyper-V Virtual Switch Extension Adapter')} `
>>     | Enable-NetAdapter -Confirm:$False

```
結果は以下のようになった。今まで何も表示されなかったが初めて何か出た。
```
root@HA000144876:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 172.19.149.231 icmp_seq=1 Destination Host Unreachable
From 172.19.149.231 icmp_seq=2 Destination Host Unreachable
```

次に行ったのはwslの再起動
```
wsl --shutdown
```
以下のコマンド打ってから再度立ち上げた。これでも変化がなかったので
いろいろやったが最後にwindows11を再起動した。いろいろなWebサイトではする必要がないとのことだったが結果的にこれでping 8.8.8.8だけ通るようになった。

追記:2024/3/12
vpn4wsl.ps1の起動でvpnとwslのインターフェースを上手く引っ付けてくれた。
そのおかげで全部ネット関係はうまくいった。
Android「このデバイスでは、暗号化されたデータにアクセスできません」の対処

# 問題
Androidで
「このデバイスでは、暗号化されたデータにアクセスできません」
「セキュリティ上、このデバイスでは暗号化されたデータにアクセスできなくなりました。Google アカウントへのログインに最近使用したデバイスを使ってもう一度お試しください。詳しくは、g.co/OnDeviceEncryption をご覧ください。」
と表示されて認証が進まない。
他のアプリはコレに失敗してもSMS認証になるだけだったがメルカリのビットコインはこの認証が必須。

# 解決
日本語でググってもろくな情報がなかったが端末言語設定を英語にしてメッセージを再度表示させググったら一発だった。

1. https://myaccount.google.com/security でバックアップコード発行、再設定用連絡先などを設定する
1. https://takeout.google.com/settings/takeout 及び 
https://passwords.google.com/options でChromeデータやパスワードをエクスポートしておく
1. https://chrome.google.com/sync でサーバーからChromeデータを削除(全てのデバイスからログアウトされるので注意)
1. Android端末から再ログインする(デバイス上に残っていたデータが同期されるのでブックマーク等は戻るハズ)

ref: https://www.reddit.com/r/Passkeys/comments/1azo6a5/android_your_encrypted_data_is_locked_on_this/?rdt=59164
LINQと互換な、高速な集計メソッドを提供するパッケージ

## 参考
この記事は、以下の動画を参考にしています。

https://youtu.be/5JKhNV9TY8k?si=dJ6Bq7BDMwBtjYgz

また、動画の中で紹介しているNuGetパッケージは、以下のものです。

https://github.com/Cysharp/SimdLinq

詳しくは、動画やサイトを参考にしてください。

## SimdLinq
.NET 7のLINQは、CPUのSIMD命令を利用して高速になっていますが、対象が`int[]`か`long[]`のみであり、高速になるメソッドも一部に限らています。

SimdLinqは、`Average`や`Max`といった数値のコレクションに対する集計を行うLINQのメソッドと互換なメソッドを提供するNuGetパッケージです。

### 対象にできるコレクション

- 整数または実数の、配列、`List<T>`、`Span<T>`など

### 用意されているメソッド

- LINQ互換の、`Sum`, `Average`, `Contains`, `SequenceEqual`など
- `int`, `uint`に対する合計が`long`, `Ulong`になる、`LongSum`
- 最小値と最大値の両方を戻す、`MinMax`

### 注意点

- .NET 7以上が必要
- .NET 7のSIMD命令を使ったLINQメソッド、または.NET 6までのLINQメソッドと、動作の異なる部分がある
    - 整数に対する`Sum`のオーバーフローチェック
    - 実数の`NaN`の扱い
    - 実数の`Sum`が、コレクションから要素を取り出す順番
AtCoder Beginner Contest 344参戦記録(A～C問題)

RubyでAtCoderに参戦した記録です。
AB2完で、C問題はコンテスト終了後に解説を見てからコードを書きました。

## [ABC344 A Spoiler](https://atcoder.jp/contests/abc344/tasks/abc344_a)
2つの「|」を含む文字列Sが与えられ、「|」とその間にある文字を削除して出力します。
```Ruby
# 提出コード
a = gets.chomp
pos = a.index("|")
ans = []
ans << a.slice(0...pos)
pos2 = a.index("|", pos+1)
ans << a.slice(pos2+1..-1)
puts ans.join
```
早く解かねばと焦ってしまい、回りくどいことをしてしまいました。
「|」記号でsplitすればシンプルに書けました。。
```Ruby
a = gets.split("|")
puts a[0] + a[2]
```

## [ABC344 B Delimiter](https://atcoder.jp/contests/abc344/tasks/abc344_b)
与えられる個数不明の整数を、逆順に出力する問題です。
IO#readlinesで入力値を受け取れば、行数が不明でも大丈夫です。
```Ruby
line = readlines.map(&:to_i).reverse
line.each do |e|
  puts e
end
```

## [ABC344 C A+B+C](https://atcoder.jp/contests/abc344/tasks/abc344_c)
A、B、C、Xと4つの数列が与えられ、数列Xの各値について、A、B、Cの各要素から1つずつ選んだ和で表すことができるかを出力する問題です。
Xの値一つ一つに対し、A、B、Cで実現できるか？を試すとTLEになります。
そこでA、B、Cから1つずつ選んだ和をリストアップし、Xがそのリストに含まれているかどうか？で判定しよう、というところまでは思いついたのですが、これでもTLEとなってしまい、結局解くことができませんでした。。
```Ruby
# TLE解答
n = gets.to_i
arraya = gets.split(" ").map(&:to_i)
m = gets.to_i
arrayb = gets.split(" ").map(&:to_i)
l = gets.to_i
arrayc = gets.split(" ").map(&:to_i)
q = gets.to_i
arrayx = gets.split(" ").map(&:to_i)

result = []
arraya.each do |a|
  arrayb.each do |b|
    arrayc.each do |c|
      result << (a+b+c) if !result.include?(a+b+c)
    end
  end
end

arrayx.each do |x|
  if x < result.min || result.max < x
    puts "No"
  elsif result.include?(x)
    puts "Yes"
  else
    puts "No"
  end
end
```
解説を見ると考え方は合っていたようです。
ACされた方の解答を参考にしながら、上記TLEの解決法を考えました。

### 方針1：和のリストをHashにする
どうやら和のリストを配列にしていたのがまずかったようです。Xの値が和のリストに含まれているかの検索に時間がかかり、TLEになってしまっていました。
検索速度の違いは、
- 配列：O(n)
- ハッシュ：O(1)
ということで、ハッシュでコードを書きなおしてみました。
```Ruby
# 標準入力の受け取りは省略
result = {}
arraya.each do |a|
  arrayb.each do |b|
    arrayc.each do |c|
      result[a+b+c] = true
    end
  end
end

arrayx.each do |x|
  if result[x]
    puts "Yes"
  else
    puts "No"
  end
end
```
こちらでACとなりました。

### 方針2：Setクラスの利用
調べていく中でSetクラスなるものを知りました。Arrayクラスよりも高速に検索できる手法のようです。

【Setクラス概要】
- setライブラリに含まれているので、「require 'set'」で読み込みが必要
- Set.newすると、引数で与えた要素をもとに新しい集合が作られる
- その集合は引数の配列要素をキー、値をtrueとするHashのような形で作成される

つまり、方針1でHashに和の要素を格納したのと同じような形になるので、検索速度が上がりTLEにならずに済むということのようです。
```Ruby
require 'set'
n = gets.to_i
arraya = gets.split(" ").map(&:to_i)
m = gets.to_i
arrayb = gets.split(" ").map(&:to_i)
l = gets.to_i
arrayc = gets.split(" ").map(&:to_i)
q = gets.to_i
arrayx = gets.split(" ").map(&:to_i)

result = []
arraya.each do |a|
  arrayb.each do |b|
    arrayc.each do |c|
      result << a+b+c
    end
  end
end

set = Set.new(result)
arrayx.each do |x|
  if set.include?(x)
    puts "Yes"
  else
    puts "No"
  end
end
```


## おわりに
今回もC問題の配点が低かったので確実に取りたかったのですが、焦りもあり結果を出せませんでした。落ち着いて考えてみればハッシュ化することも気づけたはずなのに…
ただこの問題のおかげでSetクラスの存在を知ることができました。引き続き貪欲に学んでいこうと思います。


## 参考リンク
https://docs.ruby-lang.org/ja/3.2/class/Set.html
https://qiita.com/an_sony/items/708c47d073ad709431d6
https://zenn.dev/hyzsa/articles/20230914-ruby-array-include-vs-set-include
Amazon Aurora MySQL バージョンアップ

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html

URLから日本語対応したものであることが分かります。 24/03/11現在で最新が `バージョン 3.05.2、MySQL 8.0.32 互換` になっていますが、

`ja_jp/` を除いたURL

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html

を見ると、 `version 3.06.0, compatible with MySQL 8.0.34` が最新になっています。

情報が古いことがありますので、注意したいですね。
【Canva】学校でよく使うテンプレートまとめ

# Canvaで使用できるテンプレートまとめ

作ったものをゆるゆるとまとめていきます。
学校で使うデザインが多いと思います。

<br>

#### 1. 原稿用紙
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648082/7fcc1290-471e-48b7-2c85-a662233d5fd2.png)

<a href="https://www.canva.com/design/DAFLU1IShjw/3d1_Vuy4DRawMx0Pa5SR1A/view?utm_content=DAFLU1IShjw&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">200字原稿用紙テンプレート</a>
<a href="https://www.canva.com/design/DAFLVbtMFQA/dfLPBJGlJO5m-J6nXzEjsg/view?utm_content=DAFLVbtMFQA&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">400字原稿用紙テンプレート</a>


初期では<INS>コンテンツの置換のみ許可<INS>にしてあります。

文字をそのままテキストボックスに入れると反映されますが、字下げ・「」等の処理はセルフで行う必要があります。

<br><br><br>
#### 2. 総合新聞

【壁新聞タイプ：A3】
長めの文章が打てる大きめのサイズの新聞です。
個人でも共同編集でもよいかもしれないです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648082/4f8bfdc1-1897-ab3d-fff3-e0a19483737a.png" width=50%>

<a href="https://www.canva.com/design/DAFvf4lcRyg/xc47JXbeOAsOIpfOe0Lmig/view?utm_content=DAFvf4lcRyg&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">壁新聞テンプレート(A3)</a>

<br><br>
【個人新聞タイプ：A4】
文章がすくなめの小さめのサイズの新聞です。
個人新聞に適しているテンプレートです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648082/03b9001e-e089-a736-2b15-c9a83c9fb7f6.png" width=50%>

<a href="https://www.canva.com/design/DAFKOvFNhTo/wqp1g4wiZPmgGsVUdSuAGw/view?utm_content=DAFKOvFNhTo&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">壁新聞テンプレート(A4)</a>


初期では<INS>コンテンツの置換のみ許可<INS>にしてあります。


<br><br><br>
#### 3. 絵日記・観察日記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648082/431fd4f0-b445-64e6-be3c-bf8e2a3e3719.png)

<a href="https://www.canva.com/design/DAFLC7rSBKM/T2eH4RWpnUvIgTy8ZXi3ow/view?utm_content=DAFLC7rSBKM&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">絵日記テンプレート(100字)</a>
<a href="https://www.canva.com/design/DAFLCx544bk/a9QokUHf5fCGbJ8SF0qLHw/view?utm_content=DAFLCx544bk&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">絵日記テンプレート(200字)</a>


初期では<INS>コンテンツの置換のみ許可<INS>にしてあります。


<br><br><br>
#### 4. 短歌テンプレート
3句でA4一枚に収まるようになっています。
1句はA4を縦に3分割する形です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648082/0668f5de-5aca-a6cd-eded-333314f7d291.png)

<a href="https://www.canva.com/design/DAFLVTHEDzQ/uZQh4joK_vdniQzZ38zYYg/view?utm_content=DAFLVTHEDzQ&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">【一句ver】短歌A4・三分割</a>
<a href="https://www.canva.com/design/DAFLVV7_Vrg/6ex9NR7ixNMjxtCkrLAERQ/view?utm_content=DAFLVV7_Vrg&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink&mode=preview">【三句ver】短歌・A4</a>



初期では<INS>コンテンツの置換のみ許可<INS>にしてあります。