OmniAICreator/Qiita-1.07M huggingface dataset:
式「3x2x5=30」をsympyでastモジュールを使って。  

・??? 「astモジュール」のインストールは、不要でした。
・**パイソニスタの方へ**
　**ページ後半で勉強中**、何となりますか？
　**正規表現**を探しています。　
　よろしくお願いします。
```python
sin(A)*sin(B)*cos(C) をastモジュールを使ってリスト[sin(A),sin(B),cos(C)]に変換する関数
```
 
# sympyで
```python
# 式「3x2x5=30」をsympyでastモジュールを使って。  
import ast
from sympy import Mul

def expr_to_list(expr):
    # 式をASTノードに変換する
    node = ast.parse(expr, mode='eval')
    
    # ASTノードをリストに変換する関数
    def ast_to_list(node):
        if isinstance(node, ast.BinOp):
            return ast_to_list(node.left) + ast_to_list(node.right)
        elif isinstance(node, ast.Num):
            return [node.n]
        else:
            raise ValueError("Unsupported AST node type")

    # ASTノードからリストを取得する
    try:
        result = ast_to_list(node.body)
        return result
    except Exception as e:
        print(f"Error: {e}")
        return None

# テスト
expr = "3*2*5"
print("#",                  expr  ) 
print("#",Mul(*expr_to_list(expr)))
# 3*2*5
# 30

```
# ChatGPT-3.5先生より
・print文は、私が修正しています。
(1)
:User
**式expr=3*2*5をastモジュールを使ってリスト[3,2,5]に変換する関数**
:ChatGPT
```python
import ast

def expr_to_list(expr):
    # 式をASTノードに変換する
    node = ast.parse(expr, mode='eval')
    
    # ASTノードをリストに変換する関数
    def ast_to_list(node):
        if isinstance(node, ast.BinOp):
            return ast_to_list(node.left) + ast_to_list(node.right)
        elif isinstance(node, ast.Num):
            return [node.n]
        else:
            raise ValueError("Unsupported AST node type")

    # ASTノードからリストを取得する
    try:
        result = ast_to_list(node.body)
        return result
    except Exception as e:
        print(f"Error: {e}")
        return None

# テスト
expr = "3*2*5"
result = expr_to_list(expr)
print("#",result) 
# [3, 2, 5]
```
(1)
:User
**(省略、色々やっていたら。)**
**(???sympyでリストMul([3, 2, 5])をMulの繰り返し)**
:ChatGPT
...申し訳ありませんが、前回のコードに誤りがありました。正しい方法で計算した結果をお伝えします。
```python
from sympy import Mul
numbers = [3, 2, 5]
result = Mul(*numbers)
print("#",result)
# 30
```

# 勉強中
:User
```python
sin(A)*sin(B)*cos(C) をastモジュールを使ってリスト[sin(A),sin(B),cos(C)]に変換する関数
```
:ChatGPT

**???エラー**
```
["Name(id='sin', ctx=Load())(Name(id='A', ctx=Load()))", "Name(id='sin', ctx=Load())(Name(id='B', ctx=Load()))", "Name(id='cos', ctx=Load())(Name(id='C', ctx=Load()))"]
```

https://qiita.com/mrrclb48z/items/62a90fce3dc5aef2fa16

# いつもの? sympyの実行環境と 参考のおすすめです。
(テンプレート)

https://qiita.com/mrrclb48z/items/00dd08b0317069be9342

# いつもと違うおすすめです。

https://docs.python.org/ja/3/library/ast.html

＞Qiitaで直近の正規表現の投稿です。ガンバリマス。

https://qiita.com/MhalTeddy/items/f801f01b05bf6d2feaab
【Playwright 】for .NETで非対応の機能を確認する

## あらすじ
Playwright for .NETにて使用方法を確認したが、
Python版・Java版を含め非対応の機能がある。

https://qiita.com/noritama08/items/1d6006d2ec33d16038cd

→ Node.jsは、以下に対応している。
・レポート作成機能 https://playwright.dev/docs/intro#html-test-reports
・画像比較 https://playwright.dev/docs/api/class-snapshotassertions
・単体テスト https://playwright.dev/docs/test-components

チームで主に使っている言語がJavaScript(TypeScript)以外の場合、
言語学習コストをかけてまで上記の機能が必要か。
実際に使用してみる。

## 準備
最新版のPlaywright(Node.JS)を導入する。
```cmd.exe
npm init playwright@latest
```
この時点で以下のサンプルが生成されるので、
```tests-examples\demo-todo-app.spec.js
// @ts-check
const { test, expect } = require('@playwright/test');

test('has title', async ({ page }) => {
  await page.goto('https://playwright.dev/');

  // Expect a title "to contain" a substring.
  await expect(page).toHaveTitle(/Playwright/);
});

test('get started link', async ({ page }) => {
  await page.goto('https://playwright.dev/');

  // Click the get started link.
  await page.getByRole('link', { name: 'Get started' }).click();

  // Expects page to have a heading with the name of Installation.
  await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
});
```
コマンドで実行する。
```cmd.exe
npx playwright test
```
## レポート機能
驚く事に、何も手を加えずこの時点でレポートが生成された。(え、こんな事ある？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/f0b5c2db-77ee-2d94-c9b9-4fef942a6048.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/7d300b73-5441-8e08-ed64-9ef2217d0e27.png)
## 画像比較
検証の為、適当な環境を用意する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/aacc3468-7da3-ee8f-c945-bf18a07c5933.png)

環境に合わせてテストコードを編集する。
```tests-examples\demo-todo-app.spec.js
// @ts-check
const { test, expect } = require('@playwright/test');

test('has title', async ({ page }) => {
  await page.goto('http://localhost:49155/');

  // Expect a title "to contain" a substring.
  await expect(page).toHaveTitle(/Welcome to WildFly/);

  // キャプチャ撮影
  await expect(page).toHaveScreenshot();
});

test('get started link', async ({ page }) => {
  await page.goto('http://localhost:49155/');

  // Click the get started link.
  await page.getByRole('link', { name: 'Documentation' }).click();
});
```
1回目は怒られるが、比較対象の画像をまだ取得していない為(めげない、しょげない、泣いちゃダメ。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/dd21343e-4469-2285-8449-11deb36933ac.png)

WEBページの内容を一部書き換えてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/ef66e83e-f264-6e61-57ef-768216d3f7bc.png)

### エビデンス
画像差分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/1a76b028-fb74-6eef-04a9-309662071a73.png)

レポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/03857992-01af-fffc-78da-97e4d33b8ab7.png)

## 単体テスト
言語の知識が求められそうなのでスキップする

## 後書き
手軽で便利な事がわかった。
画面操作コードは自動生成してアサート処理を1行書き加えるだけ...
と考えるとプロジェクトの走り始めは言語の理解も不要なので採用の価値ありです。
【Drupal】さくっとLocal環境つくろ

## はじめに
今回は音速でDrupal環境を立ち上げる方法について記事にしてみました。
正直Drupalの環境構築はかなり楽です。

3分かかんないです。
**多分記事読むほうが時間かかります。**

Drupalを知らない方・毛嫌いされてる方、この機会にでもDrupalを触っていただけると幸いです。

## 前提
### [Lando](https://docs.lando.dev/)
最近、メジャーバージョン4系リリースを視野に迎えて勢いのあるDockerベースの開発ツールです。
インストールも簡単です。
```bash
// MacOSの場合
/bin/bash -c "$(curl -fsSL https://get.lando.dev/setup-lando.sh)"
```
（ちょっとバージョンが上がってからどうなったか曖昧ですが、たしかDockerがOSに入ってない場合は勝手にインストールまでしてくれます）
なんとこれだけ!!

### [Composer](https://getcomposer.org/)
言わずもがなPHPでのプロジェクトでは必須ですよね。
インストールについては以下記事を参照ください。

https://qiita.com/umekikazuya/items/841e28180472a7da7959

事前準備はこれだけです。

## 手順
一瞬で終わるので手順を先にまとめます。
**ここからは 3分 でいけます。**

1. Composer経由でDrupalのソースコードを取得
2. Landoを使ってアプリの設定
3. GUIで初期設定

## ではさっそく...。
それでは、Drupalインストールスタートです。
### 001. Composer経由でDrupalのソースコードを取得
まずはソースコードを取得します。
```bash
composer create-project drupal/recommended-project "app"
```
`app`はアプリ名を指定してください。

```bash
cd ./app
tree -L 1
.
├── composer.json
├── composer.lock
├── vendor
└── web
```
プロジェクトディレクトリ直下が上記のようになってたらOKです。

### 002. Landoを使ってアプリの設定
#### 1. `lando init`実行
```bash
lando init

Q. From where should we get your app's codebase?
A. current working directory
Q. What recipe do you want to use?
A. drupal10
Q. Where is your webroot relative to the init destination?
A. web
Q. What do you want to call this app?
A. app
```

こんな感じになればOKです。
![lando init 成功画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/51bb3b40-2f75-9936-e853-0387b9e144df.png)

#### 2. `lando start`実行
コンテナ・イメージ等のビルドが始まり、しばらくするとLocal環境が立ち上がります。

### 003. GUIで初期設定
`lando start`に成功したら、`APPSERVER URLS`にアクセス可能なURLが表示されるのでアクセスしてください。

#### 1. 言語の選択
慣れてる言語を選択してください。（初期値は「Japanese」なはず）
#### 2. プロフィールの選択
さくっと検証環境立てるレベルならStandard（初期値）でいいと思います。
#### 3. 必要条件の検証
PCの状況に応じてひっかかります。
(私はLocalでひっかかった経験はあまりないです。)
#### 4. データベースのセットアップ
ちょっとだけ設定必要です。
- MySQLを選択
- DB名・DBPassWord・DBUser名 を入力
（キャプチャに赤マークつけています）
- DBの`host`と`port`を入力（キャプチャに赤マークつけています）

Databaseの情報を見るにはCLIにて以下のコマンドを実行すると確認できます。
```bash
lando info
```
![lando info 実行画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/ca6a8276-72f7-caa5-6b11-3565354300cf.png)

入力し、設定にミスがなければ、「5.サイトのインストール」と「6.翻訳のセットアップ」が実行されます。

#### 7. サイトの環境設定
サイト名はユーザー名などを入力します。
ここはもうお任せです。

入力を終えたら、 「8.翻訳の完了」が実行されて以下のような画面が表示されるはずです。

![インストール完了画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/74f780c7-1281-a3b2-acc0-c847d3c9e7e4.png)

## まとめ
PCのスペックにもよりますが、叩くコマンドは最低2つ。
入力5箇所程度のMultiStepFormに従うだけ。

めっちゃ簡単ですよね。

環境構築お疲れ様でした。

## ちなみに...。
音速はいいすぎですが、筆者は巻きまくって2分で行けました。

![タイムアタック結果画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334980/8e129c1b-37b3-bbaf-8527-ac38b94965e2.png)
任意のシェル(shell)スクリプトをsystemdで管理する

## 目的
ubuntu上で作成したpythonプログラムをシェルスクリプトから呼び出して、systemdで管理する必要が出た。


## 方法
`/etc/systemd/system/`配下に以下のファイルを設置する

```
$ vi mon.service
```

```mon.service
[Unit]
Description = テストファイル

[Service]
Type=simple
User=root
Group=root
TimeoutStartSec=0
Restart=on-failure
RestartSec=30s

ExecStart   = /home/shoma/mon/mon.sh

[Install]
WantedBy    = multi-user.target
```
`/home/shoma/mon/mon.sh`ファイルが今回管理したいスクリプトである。


サービス起動
```bash
systemctl daemon-reload
systemctl start mon
systemctl enable mon
```


### 参考文献

https://genzouw.com/entry/2021/07/05/154156/2701/
Next.js14でBasic認証をかける

Next14でBasic認証をかける方法の備忘

# 結論
```
"next": "14.2.3",
"react": "^18",
"react-dom": "^18",
```

```:ディレクトリ
src/
 |- app/
 |- middleware.js
.env.local
```
```middleware.js
import { NextRequest, NextResponse } from "next/server";

export const config = {
  matcher: ["/"],
};

export function middleware(req) {
  // 開発時では認証をスキップ
  if (process.env.NODE_ENV === "development") {
    return NextResponse.next();
  }

  // 環境変数が設定されていない場合は認証をスキップ
  if (!process.env.BASIC_AUTH_PASSWORD) {
    return NextResponse.next();
  }

  const basicAuth = req.headers.get("authorization");

  if (basicAuth) {
    const authValue = basicAuth.split(" ")[1] ?? "";
    const [user, pwd] = atob(authValue).split(":");

    if (
      user === process.env.BASIC_AUTH_USER &&
      pwd === process.env.BASIC_AUTH_PASSWORD
    ) {
      return NextResponse.next();
    }
  }

  return new Response("401 Unauthorized", {
    status: 401,
    headers: {
      "WWW-Authenticate": 'Basic realm="Secure Area"',
    },
  });
}
```
```.env.local
# Basic認証
BASIC_AUTH_USER=username 
BASIC_AUTH_PASSWORD=password
```

# Vercel側での環境変数の設定方法

Vercel側の環境設定
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1263973/6f408bce-27ea-aacc-0e0f-8cb79748395a.png)

再デプロイしたらBasic認証が使えるようになった！

# 参考サイト
https://zenn.dev/rabbit/articles/b7d712a2f1287f#approuter%E3%81%AE%E5%A0%B4%E5%90%88

https://blog.kimizuka.org/entry/2023/04/07/190722

https://note.com/plusjam/n/n4ce2f7fbbc36#c22dde25-27a3-4a03-97fe-0237cb39f11f
Splideでスライドの高さをコンテンツごとに可変させる

今までスライダーにはSwiperを使用していましたが、Swiperよりも軽量ということで『Splide』へ変更することになりました。

https://ja.splidejs.com/

特に問題なく置き換えられたんですが、Splideで１つ出来ないことが『スライドの高さに合わせて、全体の高さを自動調整する』です。
Swiperでいうところの『autoHeight』がないのです。

オプションに一応あるんですが、trueにしてもSwiperのような動きはしません（使用目的が多分違うのだと思います）。

## やりたいこと

Splideでもスライドの高さに合わせて全体の高さを自動調整するようにしたい。

## 原因

そもそも、スライドを並べてるエリアは``display:flex``で横に並べており、全体の高さはコンテンツ内で一番高いものに揃うのが当たり前なんですよね。

では、Swiperはどうやっているのか？
『autoHeight』をtrueにすると、アクティブになっているスライドの高さを取得→スライドを囲むdivに高さを指定、ということで自動調整するようになっていました。

これと同じことをSplideでもやればいいのでは？　というわけでやってみました。

## Splideでも自動調整をさせる方法

<p class="codepen" data-height="500" data-default-tab="html,result" data-slug-hash="PovbOvE" data-pen-title="autoHeight with Splide " data-user="mei331" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mei331/pen/PovbOvE">
  autoHeight with Splide </a> by Mei Koutsuki (<a href="https://codepen.io/mei331">@mei331</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

codepenを見てもらえば早いですが、簡単に解説を。

``` javascript
var mySlide = new Splide( '.splide', {
  type   : 'slide',
  focus  : 'center',
  gap    : '5%',
  start  : 0,
  perPage: 1,
  padding: '8%',
  updateOnMove: true,
});
```
普通のセンターフォーカスのスライドで、1枚表示。
自動調整で必要なオプションは、``updateOnMove: true``です。

これは「is-activeクラスを移動前に更新するかどうかを決定」するオプションで、これをtrueにしておきます。

``` javascript
mySlide.on( 'mounted', function () {
  const setNum = 1; // start の数字+1を指定
  const slideEle = document.querySelector('.splide .splide__slide:nth-child('+setNum+')');
  const visHeight = slideEle.offsetHeight;
  const wrapEle = document.querySelector('.splide .splide__list');
  wrapEle.style.height = visHeight+'px';
});

mySlide.mount();
```
``mySlide.on( 'mounted', function () {});``は「すべてのコンポーネントがマウントされた直後に発生」するイベントで、``mount()``の前に書く必要があります。
詳しくは、[イベントリファレンス](https://ja.splidejs.com/guides/events/)を見てください。

ここで、読み込まれた時のスライドの高さをスライドに合わせています。
動きとしては、スライドが表示された（マウントされた）とき、最初に表示するスライドの高さを取得→スライドを囲んでいる``.splide__list``に高さを指定、という感じです。

``` javascript
mySlide.on('move', function () {
    const actEle = document.querySelector('.splide .splide__slide.is-active');
	const actHeight = actEle.offsetHeight;
    const wrapEle = document.querySelector('.splide .splide__list');
    wrapEle.style.height = actHeight+'px';
});
```

``mySlide.on( 'move', function () {});``は「スライダーが動く直前に発生」するイベントです。

スライダーが動く前に、is-activeのスライダーの高さを取得→スライドを囲んでいる``.splide__list``に高さを指定しています。
ここできちんとスライダーの高さを取得するために、``updateOnMove: true``しておく必要があったわけです。

``'move'``ではなく、アクティブスライドが変わったときに発生するイベントの``'active'``でもいいと思います。
ただその場合、``updateOnMove: true``になってないと、スライドが切り替わってから高さが変化するので、動きがちょっとワンテンポ遅れます。

## ページがカクカクするので

今回は必要があって実装したんですが、この自動調整は、全体の表示がカクカクしてしまうので、使い所は注意したほうがいいと思います。
（これはswiperのautoHeightにも言えることではありますが）

必要な方の参考になれば幸いです。
【Typescript】イミュータブルオブジェクトの不変性の担保範囲

# すべてImmutableなフィールドの場合
```typescript
class AllImmutable {

    constructor(
        public readonly num: number,
        public readonly bool: boolean
    ) {

    }

}
```
これは、すべてImmutableであることは自明

# 子オブジェクトまでImmutableな場合
```typescript
class Parents {

    constructor(
        public readonly num: number,
        public readonly child1: Child1,
    ) {

    }

}

class Child1 {
    constructor(
        public readonly num: number,
    ) {

    }
}
```
子オブジェクトがすべてImmutableなフィールドであるため、
子オブジェクトはImmutableであると言える。

また、親オブジェクトは、子オブジェクトがImmutableであるため、
フィールドnumとchild1、すべてがImmutableである。
よって、親オブジェクトもImmutableであるといえる。

また、これは再帰的に適用できる。

```typescript
class Parents {

    constructor(
        public readonly child1: Child1,
    ) {

    }

}

class Child1 {
    constructor(
        public readonly child2: Child2,
    ) {

    }
}

class Child2 {
    constructor(
        public readonly num: number,
    ) {

    }
}

```

Child2はImmutableであるから、Child1の持つフィールドはすべてImmutableである。
-> Child1はImmutableである。
Child1はImmutableであるから、Parentsの持つフィールドはすべてImmutableである。
-> ParentsはImmutableである。
の論法が成り立つ。
このように、自身がImmutableである場合、
Immutableの保証はまた親方向に伝播させることができる。
Databricks Vector Searchでハイブリッド検索？

:::note warn

免責：
この記事の内容は、2024/5/28時点でDatabricks社の公式ドキュメントに記載されておらず(たぶん)、ただの一般ユーザの実験記録です。公式な内容ではありませんのでご注意ください。
:::


# 導入

Databricks Vector Searchについて、```help```でPython APIの使い方を確認していたのですが。(```databricks_vectorsearch```のバージョンは0.36です)

```python
from databricks.vector_search.client import VectorSearchIndex
help(VectorSearchIndex.similarity_search)
```

```:出力
Help on function similarity_search in module databricks.vector_search.index:

similarity_search(self, columns, query_text=None, query_vector=None, filters=None, num_results=5, debug_level=1, score_threshold=None, use_hybrid=False)
    Perform a similarity search on the index. This returns the top K results that are most similar to the query.
    
    :param columns: List of column names to return in the results.
    :param query_text: Query text to search for.
    :param query_vector: Query vector to search for.
    :param filters: Filters to apply to the query.
    :param num_results: Number of results to return.
    :param debug_level: Debug level to use for the query.
    :param score_threshold: Score threshold to use for the query.
    :param use_hybrid: Whether to use hybrid search or not.
```

**ん？最後に```use_hybrid```のパラメータが追加されてる？**

名前だけ見ると、Databricks Vector Searchでハイブリッド検索を実施するフラグに見えます。
Databricks Vector Searchは通常のベクトル検索のみ(Dense Vectorを使った検索のみ)という理解をしていたのですが、キーワード検索(Sparse Vectorを使った検索)といった別種の検索も追加された・・・？

2024/5/28時点で[Python APIのドキュメント](https://api-docs.databricks.com/python/vector-search/databricks.vector_search.html#databricks.vector_search.index.VectorSearchIndex.similarity_search)にもまだ記載がなく、正直挙動がわからず。

現時点で将来的な拡張を見越したパラメータ拡張だけの可能性もあるので、ひとまず試すだけ試してみました。

# 検索してみる

以下の記事で作成したVector Search EndpointとIndex(通常のテーブルから作成)を使って、```use_hybrid```をTrue/Falseで切り替えた場合の挙動を確認してみます。

https://qiita.com/isanakamishiro2/items/af4ee111d68d10aa37b0

## use_hybrid=Falseの場合

従来通りのベクトル検索（のはず）。

```python
import pandas as pd

# 結果をPandas DFへ変換
def conv_related_docs_to_pdf(result):
    cols = [c["name"] for c in result["manifest"]["columns"]]
    return pd.DataFrame(result["result"]["data_array"], columns=cols)

result = index.similarity_search(
    query_text="Unity Catalogとはどのような機能なのか？",
    columns=["id", "context"],
    num_results=5,
    use_hybrid=False,
)

display(conv_related_docs_to_pdf(result))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/edeaac12-1c64-8091-1dd8-61171881748f.png)

類似文書を取得できました。

## use_hybrid=Trueの場合

ハイブリッドサーチ？

```python
result = index.similarity_search(
    query_text="Unity Catalogとはどのような機能なのか？",
    columns=["id", "context"],
    num_results=5,
    use_hybrid=True,
)

display(conv_related_docs_to_pdf(result))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/f5860193-11a5-9e63-3095-85b7f09d754f.png)


```use_hybrid=False```のときと結果が異なっていますね。
特にスコアのつけ方が大きく変わっています。
ダミーのパラメータというわけではないようです。

検索性能の良し悪しを評価はしていませんが、なんらか新たな検索オプションが追加された？ということでいいのかな？

# まとめ

今後オフィシャルに発表があるのだと思いますが、ますます利便性が高くなりそうですね。
詳細は公式アナウンスを待ちたいと思います。
スワップ

# OOMを回避する
物理メモリがなくなるとOOMという状態にあると説明しました。しかし「スワップ」という機能を使えば、メモリが枯渇してもすぐに`OOMが発生しない`ようにできます。
スワップは、ストレージデバイスの一部を、`一時的にメモリの代わりとして使う`仕組みです。具体的には、システムの物理メモリが枯渇した状態でさらにメモリを獲得しようとすると、使用中の物理メモリの一部を`ストレージデバイスに退避して空きメモリを作ります`。この時の退避領域を`スワップ領域`と呼びます。
...
物理メモリの中でしばらく使わないであろうとカーネルが判断したメモリを`スワップ領域に書き増し`ます。この処理を`ページアウト（あるいはスワップアウト）`と呼びます
...
ページフォールトのうち、ページインによって`ストレージデバイスへのアクセスが発生したものを「メジャーフォールト」`、`そうで無いものを「マイナーフォールト」`と呼びます。
...
スラッシングは発生しているようなシステムは、`メモリ使用量を減らすためにワークロードを減らしたり`、あるいは単にメモリを増強する、という対策を取る必要があります。

### 気づき
ストレージデバイスにアクセスするから遅くなるからしかないか。

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
このときにページイン、ページアウトが出てくるのか。
メジャーフォールトは性能が落ちる。
【備忘録】CentOSのIPアドレスとドメインとOSバージョンの確認方法

# IPアドレスはこれ
`ifconfig`を入力

# ドメインはこれ
`cat /etc/resolv.conf`を入力

# OSバージョンはこれ
`at /etc/redhat-release`を入力

# 環境
- ホストOS：Windows Server 2012 R2
- ゲストOS：CentOS 6.7

# 以上！
いつも忘れちゃうのでメモとして残しました。
ご参考になれば幸いです。
Informatica IDMCの始め方 接続定義の作成 ②AWS S3編

# はじめに
株式会社ジールの@Seiken-Saiです。
前回のSnowflakeに引き続き、Informatica社のSaaS製品であるIntelligent Data Management Cloud（以下IDMC）のデータ統合サービス「Cloud Data Integration（以下CDI）」で、AWS S3に接続する手順を発信します。
IDMCでは、Informatica社より提供されるコネクタを使用して、簡単にAWS S3に接続することが出来ます。
本手順の前提条件は下記です。
・ランタイム環境(SecureAgentサーバ)が構築されていること
・IDMCのDeveloper権限を持つユーザーが使用できること
・接続先のAWS S3が準備されていること

# 接続定義の作成手順
### 1.IDMCポータルにログインし、管理者画面を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/31c06933-b401-66f5-108e-5f89e1092339.png)

### 2.管理者画面の左ペインより、接続を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/1fa3a263-07d4-b046-7767-f46ff44f2f11.png)

### 3.接続画面より、新しい接続を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/3abaa202-76f2-cf43-0258-f4292d55638e.png)

### 4.接続の詳細に、必要な情報を入力します　※キャプチャの*は必須項目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/56413ae8-e992-a145-a9a2-9bb425f1af35.png)


接続先のS3の情報を入力
【接続名】
　接続の名前を定義　
  ※各接続名は組織内で一意である必要あり
【説明】
　任意
【タイプ】
　Amazon S3 v2
【ランタイム環境】
　構築済のランタイム環境を選択
【Access Key】
　Amazon S3バケットにアクセスするためのアクセスキー
　※認証方法に基づいて入力
【Secret Key】
　Amazon S3バケットにアクセスするためのシークレットアクセスキー
　※認証方法に基づいて入力
【IAM Role ARN】
　一時的なセキュリティ資格情報を使用してAWSリソースにアクセスする場合はこのプロパティの値を入力
【External ID】
　Amazon S3バケットが別のAWSアカウントにある場合は指定
【Use EC2 Role to Assume Role】
　Assume Roleを使用する場合チェック
【Folder Path】
　接続対象のS3バケットパスまたはフォルダパスを入力
　※フォルダパス末尾にスラッシュは使用しない
【Master Symmetric Key】
　クライアントサイド暗号化を使用する場合、Base64形式で示す256ビットのAES暗号化キーを入力
【Customer Master Key ID】
　AWS Key Management Service（AWS KMS）による認証を使用する場合、AWS KMSによって生成された顧客マスタキーIDまたはエイリアス名、またはアカウント間アクセス用のカスタムキーのAmazonリソース名（ARN）を入力
【Region Name】
　アクセス先のバケットのAWSリージョンを選択
【Federated SSO IdP】
　統合ユーザーシングルサインオンを使用する場合、AWSアカウントで使用する、統合ユーザーシングルサインオンのSAML 2.0対応IDプロバイダを選択
【Other Authentication Type】
　認証情報プロファイルファイルの認証を使用する場合は選択
 
### 5.接続テストを実施します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/f4f1f6fc-1b84-6611-868e-a8a33918d72a.png)

接続に成功した場合、「この接続のテストに成功しました」と表示されます。
接続に成功したことを確認して保存します。
これで、IDMCでS3の接続定義の作成は完了です。

# おわりに
IDMCでは、S3に限らずOracle、Amazon Redshift、Snowflake等の様々なデータベース/サービスと接続をすることが出来ます。また、複雑なETL処理もGUIで簡単に作成することが出来ます。

株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
Rails7以前と以降でwhereなどで取得したクエリ結果を任意の順序にする方法


Rails7からクエリ結果を任意の順序にする便利なメソッドが追加されていることに気づいたので、Rails7以前と以後での方法をまとめました.


## 結論
* Rails7以降 - 新たに追加された[`in_order_of`](https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-in_order_of)を使用.
* Rails7以前 -  gem ['order_as_specified'](https://github.com/panorama-ed/order_as_specified)の`order_as_specified`を使用.


## 問題
Active Recordを用いて、以下のようにidの配列の順番にソートしたいケースがある.

```rb
users_id = [2, 4, 6, 3, 1]
User.where(id: users_id)
```

しかし、これでは配列に格納された順番に関係なく、自動的にソートされてしまう.

## 解決方法

### Rails7 以前
gem ['order_as_specified'](https://github.com/panorama-ed/order_as_specified)の`order_as_specified`を使用.

```rb
users_id = [2, 4, 6, 3, 1]
User.order_as_specified(id: users_id)
```

以下のように`Arel`などを使ってSQLを記述する方法もあるが、brakemanなどで 'Possible SQL injection' と転けてしまう.

```rb
users_id = [2, 4, 6, 3, 1]

order_by = 'CASE '
users_id.each_with_index do |id, index|
  order_by << "WHEN id = #{id} THEN #{index} "
end
order_by << 'END'

User.where(id: users_id).order(Arel.sql(order_by))
```

### Rails7 以降
Rails7で新たに追加された`in_order_of`を使用.

```rb
users_id = [2, 4, 6, 3, 1]
User.in_order_of(:id, users_id)
```

これでgemを入れる必要はなくなりました.
シェル(shell)スクリプトで並列処理をする

## 目的
pythonで作成したプログラムをシェルから実行する事でsystemd管理をしている。この呼び出しを複数を行いたい場合にシェルスクリプトで並列処理を行う必要が出てきた。


## TL;DR

```bash
#!/bin/bash

process1(){
    /home/shoma/money/mon2.py
}

process2(){
    /home/shoma/money/mon2.py
}

# 各プロセスをバックグラウンドで起動する
process1 &
pid1=$!
process2 &
pid2=$!

# 各プロセスの終了を待つ
wait $pid1
wait $pid2

echo "全てのプロセスが完了しました。"
```

## 確認

```bash
#!/bin/bash

process1(){
    /home/shoma/money/mon2.py
}

process2(){
    /home/shoma/money/mon2.py
}

# 各プロセスをバックグラウンドで起動する
process1 &
pid1=$!
process2 &
pid2=$!

# 各プロセスの終了を待つ
wait $pid1
wait $pid2

echo "全てのプロセスが完了しました。"
```

並列処理が行われているはずならば、20秒で実行が完了するはず

```bash
root@raspberrypi:/home/shoma# time ./kami.sh
全てのプロセスが完了しました。

real    0m20.015s
user    0m0.005s
sys     0m0.016s
```

おおすごいちゃんと出来ている。
SAP Analytics Cloud（SAC）のストーリー内のモデル置換機能について

# はじめに
　2024年5月17日にSAP Analytics Cloud（以下SAC）でストーリー内のモデル置換の機能が追加されました。今までは「従来のデザインエクスペリエンス」のみ使用可能でしたが「最適化されたデザインエクスペリエンス」でも利用可能となりました。インポート接続モデル、ライブデータ接続モデル、両方可能となっています。今回はその新しい機能について紹介したいと思います。
※補足：異なるデータソースの置換はできません。例としてライブデータ接続モデル→インポート接続モデルへの置換はできません。

■モデル置換機能　使用可否一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/8b34b9ca-0571-c7b4-906c-b605a90f4780.png)
※SAP Datasphere 分析データセットはサポートされておらず、SAP Datasphere 分析モデルであれば置換可能です。

# 操作方法
①モデルのアイコンをクリックし「置換」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/7a17b366-3773-d343-715f-98a931f72aba.png)

②「続行」をクリックします。表示不要の場合はチェックしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/a83028be-08de-dc66-8c75-ffbee11f69a9.png)

③置換対象となるモデルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/92292748-5cc1-33ee-b442-e5c492d65aab.png)

④モデルを選択すると「モデルの置換」画面が表示されるのでメジャー・ディメンションをマッピングし、問題ない事を確認して「モデルの置換」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/5c481bdd-bb87-f1e8-6786-13ed5cbfc19a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/dbf793c5-ac94-ca1f-947f-4a4420ba0741.png)

⑤置換前と置換後の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/0ffa2ded-f399-fd80-4082-d54854951db5.png)
メンバー値は更新されていますが、レイアウトや計算メジャーはクリアされずに保持された状態となります。

# モデル置換機能のメリット
　今回のモデル置換機能の追加により、開発と本番の管理方法の選択肢が増えたのではないかと感じています。
　今まで、ライブデータ接続モデルやデザインモードタイプによってはインポート接続モデルもモデルの置換はできませんでした（※1）。その為、1テナントでの開発環境と本番環境に分けて管理する事が難しかったと思います。今回、ストーリーの再設定の手間（下図③参照）がなくなった事でそのハードルが少し下がったのかなと思っています。 
（※1）参照モデルの変更は可能ですが、変更するとレイアウトや計算メジャー等は全てクリアされるので結局、最初から設定し直す必要があり現実的ではありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/55d93bbb-5691-68a8-6466-256da6ade98a.png)

# おわりに
　本来は開発と本番でテナントを分ける方が良いかと思いますが、一つの方法として参考にして頂ければと思います。
　また、デザインモードタイプですが「従来のデザインエクスペリエンス」では出来ることが「最適化されたデザインエクスペリエンス」では出来ないケースはありますが、バージョンアップにより徐々に解消されている感じです。これから作成するストーリーについては「最適化されたデザインエクスペリエンス」で作成する方が良いのかなと個人的には思います。「従来のデザインエクスペリエンス」は非推奨の警告が表示されていますので。
楽観排他制御と悲観排他制御とは

- [1.楽観排他制御と悲観排他制御とは](#楽観排他制御と悲観排他制御とは)
    - [1.1両者の違いと特徴](#基本概念の定義)
    - [1.2両者の違いと特徴](#両者の違いと特徴)
- [2.日常生活における楽観排他制御と悲観排他制御の例](#日常生活における楽観排他制御と悲観排他制御の例)
    - [2.1生活の中での具体的な例](#生活の中での具体的な例)
- [3.楽観排他制御の技術的な詳細](#楽観排他制御の技術的な詳細)
    - [3.1楽観排他制御の基本原理](#楽観排他制御の基本原理)
    - [3.2楽観排他制御の基本原理](#楽観排他制御の基本原理)
    - [3.3具体的な実装例](#具体的な実装例)
- [4.悲観排他制御の技術的な詳細](#悲観排他制御の技術的な詳細)
    - [4.1悲観排他制御の基本原理](#悲観排他制御の基本原理)
    - [4.2ロック機構とその管理](#ロック機構とその管理)
    - [4.3具体的な実装例](#具体的な実装例)
- [5.楽観排他制御と悲観排他制御の比較](#楽観排他制御と悲観排他制御の比較)
    - [5.1利点と欠点](#利点と欠点)
    - [5.2適用シナリオと選択基準](#適用シナリオと選択基準)

# 楽観排他制御と悲観排他制御とは
## 基本概念の定義
- 楽観排他制御
楽観排他制御はデータ競合の発生頻度が低いと仮定し、最初にデータのロックを取らずに操作を行い、競合が発生した場合にのみ対応する手法です
- 悲観排他制御
悲観排他制御はデータ競合の発生頻度が高いと仮定し、最初にデータのロックを取得してから操作を行う方法です。これにより、データの一貫性を保証します

## 両者の違いと特徴
楽観排他制御
- 特徴：高速な読み取りが可能で、書き込み時にのみ競合検出を行います
- メリット：データやリソースの使用が高効率的であり、競合が少ない場合にパフォマンスは良いです
- デメリット：競合が多発する環境では、再試行が頻繁に発生し、パフォマンスが低下します

悲観排他制御
- 特徴：データの一貫性を重視し、操作する前にデータのロックを取得します
- メリット：競合が多い環境でも、データの整合性が保たれます
- デメリット：ロックによるリソースの占有が発生し、待機時間が長くなることがあります

# 日常生活における楽観排他制御と悲観排他制御の例
## 生活の中での具体的な例
- 楽観排他制御の例
    - オンラインショップのカート：ECサイトでは、複数のユーザーが同じ商品をカートに追加しても、システムはすぐに在庫をロックしません。ユーザーが最終的に注文を確定するときに、システムは在庫が十分かどうかを確認します。在庫が不足している場合は、ユーザーに再選択または注文のキャンセルを促します。これは典型的な楽観排他制御
- 悲観排他制御の例
    - 銀行の貸金庫：貸金庫を使う前に、必ずロック権限を取らなくてはいけない。使用中は他の人はアクセスできないようにします。これは典型的な悲観排他制御

# 楽観排他制御の技術的な詳細

## 楽観排他制御の基本原理
楽観排他制御は、トランザクションの開始時にデータのロックを取得せずに処理を行い、最終的にコミット時に競合が発生していないを確認します

## バージョン管理と競合検出
各データ項目にバージョン番号を持たせ、トランザクションが開始ときにバージョン番号を記録します。コミット時に変更していない場合にのみコミットを成功させます。バージョンが変更されている場合、再試行が必要です

## 具体的な実装例
- データベース：SQLデータベースにおける MVCC（Multi-Version Concurrency Control）は、楽観排他制御の一例です。各トランザクションが開始時にスナップショットを取得し、競合検出を行います

# 悲観排他制御の技術的な詳細

## 悲観排他制御の基本原理
悲観排他制御は、トランザクションの開始時にデータのロックを取得し、操作が完了するまでロックを保持します。これにより、他のトランザクションが同じデータにアクセスできないようにします。

## ロック機構とその管理
- 排他ロック（Exclusive Lock）：データに対する完全なロックであり、他のトランザクションからの読み取りも禁止します
- 共有ロック（Shared Lock）：データの読み取りを許可し、他のトランザクションが同時に読み取りを行うことができますが、書き込みは禁止します
## 具体的な実装例
- データベース：多くのSQLデータベースシステムが悲観排他制御を採用しており、トランザクションの開始時にロックを取得します

# 楽観排他制御と悲観排他制御の比較
## 利点と欠点
- 楽観排他制御：
    - 利点：高いスループットを提供し、ロックのオーバーヘッドが少ない
    - 欠点：競合が多発する場合、再試行が多くなり、パフォーマンスが低下する

- 悲観排他制御：
    - 利点：データの整合性を確保し、競合が発生する環境で有効
    - 欠点：ロックのオーバーヘッドが高く、リソースの競合が発生しやすい

## 適用シナリオと選択基準
- 楽観排他制御：競合が少ない環境、読み取りが多く書き込みが少ないシナリオに適しています
- 悲観排他制御：競合が多い環境、データの整合性が重要なシナリオに適しています。
robloxでassistant その87

# 概要
robloxでassistantやってみた。
動画見つけたので、やってみた。

# 参考にした動画

https://www.youtube.com/watch?v=OlZk66luZYo&list=PLbar9g_csd57fT1C-2k1wqcXR94M-hf0q&index=15

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```


local partA = Instance.new("Part")
local partB = Instance.new("Part")
partA.Position = Vector3.new(-30, 1, -20)
partA.Parent = workspace
partB.Position = Vector3.new(30, 1, -20)
partB.Anchored = false
partB.Parent = workspace
local Clone = Instance.new("Part")
Clone.Shape = Enum.PartType.Ball
Clone.BrickColor = BrickColor.Red()
Clone.Position = Vector3.new(-30, 2, -20)
Clone.Parent = workspace
local Position1 = partA.Position 
local Position2 = partB.Position
local Direction = Position2 - Position1
local Duration = math.log(1.001 + Direction.Magnitude * 0.01)
Position2 = partB.Position + partB.AssemblyLinearVelocity * Duration
Direction = Position2 - Position1
local force = Direction / Duration + Vector3.new(0, game.Workspace.Gravity * Duration * 0.5, 0)
wait(5)
Clone:ApplyImpulse(force * Clone.AssemblyMass)
Clone:SetNetworkOwner(nil)



``` 


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a7f327ac-4771-4671-2173-dc017c1451f5.png)


以上。
MongoDBのaggregateでフィールド同士を比較

調べてもすぐに分からなかったので残しておきます。

[fieldA]の値と[fieldB]の値が一致するデータのみを取得する場合の例。
```javascript:
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $eq: ['$fieldA', '$fieldB']
      }
    }
  },
]);
```
Python初学者の学習環境メモ

## 目次
[はじめに](#はじめに)
[環境メモ](#環境メモ)
[今日からPythonを触りたい人向け](#今日からpythonを触りたい人向け)
[年単位でPythonを学びたい人向け](#年単位でpythonを学びたい人向け)
[困ったとき](#困ったとき)

　
## はじめに
Pythonを触り始め１ヶ月程経過した。
環境構築で手間取るのは最初の難関と思うが、自身へのメモ且つ
これから始める方々の労力を最小にすることを目的に書く。

　
## 環境メモ

MacBook Air (2015)
macOS Monterey
Ver. 12.7.5
シェル zsh

使用中のエディタ
VScode
Cursor

　
## 今日からPythonを触りたい人向け

・VScodeかCusorをインストール

・拡張機能でPythonを追加

・『とほほのPython入門』など無料公開の記事を教科書として使う

[VScodeのインストール](https://code.visualstudio.com/download)
[Cursorのインストール](https://cursor.sh/)
[とほほのPython入門](https://www.tohoho-web.com/python/index.html)

### 理由
・手軽に始められ、休める。
エディタが入っているだけなので、ゲームのように起動・終了が簡単。

・不明点をコピペして調べられる
紙の教科書を否定する意図は無いが、タイピングが遅い初学者としては
大変ありがたい。またスペルミスの確認も楽。

・教科書があると段階的に学べる
四則演算から始まるため、Pythonを「電卓の延長」として使える。
初学者にとってこうした感覚は、プログラミングが身近に感じられて大切だと思う。

　
## 年単位でPythonを学びたい人向け

・VScodeかCusorをインストール

・拡張機能でPythonを追加

・『Think Python2』,『とほほのPython入門』など無料公開の記事を教科書として使う

・ターミナルにPythonのパスを通す

[VScodeのインストール](https://code.visualstudio.com/download)
[Cursorのインストール](https://cursor.sh/)
[とほほのPython入門](https://www.tohoho-web.com/python/index.html)
[Think Python2](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://cauldron.sakura.ne.jp/thinkpython/thinkpython/ThinkPython2.pdf)

### 理由
・手軽に始められる、休める。

・不明点をコピペして調べられる

・教科書があると段階的に学べる、且つ不明点の特定が楽。
特に長期で学習する場合は、「言語がPC上でどう処理されるか」など
仕組みを理解している方が後学のためにもいい。
※『Think Python2』は個人的におすすめ。

・モジュールのパス通しなどでターミナルを使う頻度が増えるため
※2020年以降のMacでは、Pythonが標準搭載のため割愛。

　
### 困ったとき

・PCから離れる時間を作る
定期的に思考や目的の整理、体を休ませる。

・現状把握とタスク管理のためにメモをとる
紙とペンがおすすめ
下記のようなリストを書くと楽。
- [x] Homebrewをインストール
- [x] python3.x.xをインストール
- [ ] パスの確認


・不明点はググるか次回に持ち越し
ググれば一定の理解度まで到達する。
しかし体は一つしか無い。タスクを次回に持ち越す判断も大切。

・Qiitaやpythonjpで質問
自身のPC,エディタなどの環境+言語の不明点(関数,構文etc.)
可能な限り具体的に問題点を明記する。質問者・回答者共に楽できる。


#### 最後に
間違いや改善点などあれば、コメントにてご指摘いただけますと幸いです。
また学習方法などは現時点での私の見解です。
尺取り法ってなあに？O(n^2)をO(n)に高速計算する方法！

# 尺取り法（しゃくとりほう）

ABC353のC問題にて，計算速度を高速化するために用いられており，復習を兼ねてあげています．

## 尺取り法とは？

部分配列の和や積，部分文字列や連続する要素の組み合わせに関する問題に用いられる．

通常計算をすると二重ループを使うことになり，計算量がO(n^2)となる．

しかし，尺取り法では，2つのポインタを使って，部分配列の範囲を動的に調整するため，一重ループとインナーループを使って効率的に部分配列の計算ができる．その結果，計算量がO(n)となる．

## 実際のコード

### 例1）部分配列ABC353-C

問題
![スクリーンショット 2024-05-20 13.37.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/44e53cde-1b1b-1f65-f8a6-3823d349c7c6.png)

**尺取り法を使わないコード**

```cpp
#include <iostream>
#include <vector>
using namespace std;

#define rep(i, n) for (int i = 0; i < (n); i++)

int main() {
    // Input
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i, n) cin >> a[i];

    long long ans = 0;
    for(int i = 0; i < n; i++) {
        for(int j = i + 1; j < n; j++) {
            ans += (a[i] + a[j]) % 100000000;
        }
    }

    // Output result
    cout << ans << endl;
    return 0;
}
```

尺取り法を用いたコード

```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define rep(i, n) for(int i = 0; i < (n); i++)

int main() {
    //mod
    long long mod = 100000000;

    // Input
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i, n) cin >> a[i];

    // Sort
    sort(a.begin(), a.end());

    int r = n;
    long long cnt = 0, ans = 0;
    rep(i, n) {
        r = max(r, i + 1);
        while(r - 1 > i && a[r - 1] + a[i] >= mod) {
            r--;
        }
        cnt += n - r;
    }

    rep(i, n) ans += (long long)(a[i]) * (n - 1);
    ans -= cnt * mod;

    // Output
    cout << ans << endl;
    return 0;
}
```

2つのポイントで計算が速くなっている．

1. modより大きくなる時をカウントし，後で全ての和からcnt*mod引いている．
2. カウントの仕方が，どの点以上でmodより大きくなるか判断して，その時点でループを抜ける．最大のカウントから，そのポイントまでの距離を引くことで，modより大きくなる数を求めている．

ポインタを求めてそれ以上は計算していないから計算が速い！！
Vulkan Tutorial (Drawing a triangle/Graphics pipeline basics/Introduction) 日本語訳

この記事は [Introduction - Vulkan Tutorial](https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Introduction) の日本語訳です。

# Introduction

ここからの数章を通して、三角形を描画するように設定されたグラフィックスパイプラインをセットアップしていきます。グラフィックスパイプラインとは、メッシュの頂点とテクスチャを、最終的にレンダーターゲットのピクセルに変換するまでの一連の操作のことです。単純化した概要を以下に示します。
![](https://vulkan-tutorial.com/images/vulkan_simplified_pipeline.svg)

インプットアセンブラ(*input assembler*)は、あなたが指定したバッファから生の頂点データを収集します。また、頂点データ自体を複製することなく、いくつかの要素をリピートするために、インデックスバッファを使うこともあります。

頂点シェーダ(*vertex shader*)は全ての頂点に対して実行され、一般的に、頂点位置をモデル座標からスクリーン座標に変更するような変換を適用します。また、頂点ごとのデータをパイプラインに伝えます。

テッセレーションシェーダ(*tessellation shaders*)では、メッシュのクオリティを向上するために、特定のルールに従ってジオメトリを分割できます。これは、レンガの壁や階段などに近づいたときに、平坦でないように見せるためによく使われます。

ジオメトリシェーダ(*geometry shader*)は全てのプリミティブ(三角形、直線、点)に対して実行され、それを破棄したり、さらに追加のプリミティブを出力したりできます。これはテッセレーションシェーダと似ていますが、よりフレキシブルです。しかし、Intelの統合GPUを除く、ほとんどのグラフィックスカードにおいてあまり良いパフォーマンスを発揮しないため、こんにちのアプリケーションではあまり使われていません。

ラスタライゼーション(*rasterization*)ステージはプリミティブをフラグメント(*fragments*)に離散化します。これはフレームバッファを満たすピクセル要素です。スクリーン外のフラグメントは破棄され、頂点シェーダから出力されたアトリビュートは、図のように、フラグメント間で補間されます。通常、他のプリミティブのフラグメントの後ろにあるフラグメントは、デプステストによって破棄されます。

フラグメントシェーダ(*fragment shader*)は生き残ったフラグメント全てに対して呼び出され、どのフレームバッファに、どの色とデプス値でフラグメントが書き込まれるかを決定します。これには頂点シェーダから補間されたデータを使うことができ、テクスチャ座標やライティングのための法線などを含みます。

カラーブレンド(*color blending*)ステージは、フレームバッファの同じピクセルにマッピングされる、異なるフラグメントをミックスする操作を適用します。フラグメントは単純に上書きすることも、加算することも、透明度に基づいて混合することもできます。

緑色のステージは固定機能ステージと呼ばれます。これらのステージは、パラメータによって動作を微調整することができますが、動作方法はあらかじめ決められています。

いっぽう、オレンジ色のステージはプログラマブル(`programmable`)で、あなたが行いたい操作をそのまま適用するために、あなた自身のコードをグラフィックスカードにアップロードすることができます。これによって、例えばテクスチャリングやライティングからレイトレースまで、フラグメントシェーダで何でも実装することができます。これらのプログラムはたくさんのGPUコアで同時に実行され、頂点やフラグメントといった多くのオブジェクトを並列に処理します。

もしあなたが以前にOpenGLやDirect3Dといった古いAPIを使ったことがあるなら、`glBlendFunc`や`OMSetBlendState`などを呼び出すことによって、パイプラインの設定を自由に変更できるのに慣れていることだろうと思います。Vulkanのグラフィックスパイプラインはほぼ完全に変更不可ですので、シェーダ、フレームバッファのバインド、ブレンド関数などを変更したいときには、スクラッチからパイプラインを再作成しないといけません。これの欠点は、あなたがレンダリング処理で使いたいステートの全ての組み合わせを表す、多数のパイプラインを作成する必要があることです[^1]。しかし、パイプラインで行われる処理のすべてがあらかじめわかることによって、ドライバはより最適化を行うことができます。

[^1]:訳注：[Vulkan 1.3](https://www.khronos.org/blog/vulkan-1.3-and-roadmap-2022)で動的に設定できるステートが追加され、以前よりはパイプラインの数を抑えることが可能になりました。

いくつかのプログラマブルステージはオプションで、何を行いたいかによって使用するかどうかを切り替えることができます。例えば、テッセレーションステージとジオメトリステージは、シンプルなジオメトリを描画するだけなら無効にすることができます。もしデプス値にしか興味がないのであれば、フラグメントシェーダステージをオフにすることができ、これは[シャドウマップ](https://en.wikipedia.org/wiki/Shadow_mapping)を生成するときに有効です。

次の章では、三角形を画面に描画するために必要な2つのプログラマブルステージ、頂点シェーダとフラグメントシェーダを作成します。ブレンドモード、ビューポート、ラスタライゼーションといったような固定機能の設定は、その次の章でセットアップします。Vulkanのグラフィックスパイプラインのセットアップの最後は、入力と出力のフレームバッファの設定です。

`createGraphicsPipeline`関数を追加して、`initVulkan`の`createImageViews`のすぐ後に呼び出すようにします。私たちは、続く章でこの関数を作成していきます。

```cpp
void initVulkan() {
    createInstance();
    setupDebugMessenger();
    createSurface();
    pickPhysicalDevice();
    createLogicalDevice();
    createSwapChain();
    createImageViews();
    createGraphicsPipeline();
}

...

void createGraphicsPipeline() {

}
```

[C++ code](https://vulkan-tutorial.com/code/08_graphics_pipeline.cpp)

前の記事
次の記事
GitHubチーム開発まとめ

# チーム開発を始める前に…
### ■ GitHubのトップページから「New」ボタンでプロジェクトを作成。
###
### ■ mainブランチにコードを初Pushする
#### 1.Pushしたいフォルダー（ワークツリー）まで移動し、Gitリポジトリに変換する
```git.
git init
```

#### 2.ファイルやディレクトリの追加・変更をインデックスに登録する。
```git.
git add .　　　　　　　 //すべてのファイルを登録
   or
git add <ファイル指定>　//指定したファイルを登録
```

#### 3.ファイルやディレクトリの追加・変更を、リポジトリにコミット（登録）する。
```git.
git commit 　           //コミットする
    or
git commit -m"コメント"　//コメントを同時にセットしながらコミット
```
#### 4.mainブランチをきる（作る）
```git.
git branch -M main
```
#### 5.リモートレポジトリを作る
```git.
git remote add origin <URL>
```
#### 6.GitHubのmainブランチへPush
```git.
git push origin main
```
→ユーザー名とパスワードの入力が求められた場合パスワードには自身のアクセストークンを入力すること

# チーム開発の開始
###
### ■　コード改修前にやること

#### 1.準備：ローカル環境にリモートリポジトリからソースを持ってくる
```git.
git clone <GitHubで取得したリポジトリのURL>
cd <cloneで生成されたディレクトリ>
```
#### 2.自分のローカルのブランチを確認する
```git.
git branch
```
#### 3.GitHubでissue（課題）を作成
issueタブ移動後「New issue」からissueを作成
#### 4.issue用のブランチをきる（作る）
```git.
git branch <ブランチ名>
```
#### 5.ブランチに移動
```git.
git checkout <ブランチ名>
```
###
### 　　　　　　　　　　----ソースを改修する----
###

#### option
```git.
git status //変更したファイルの一覧を確認
git diff   //変更したファイルのソースコードを確認
```
→変更点に問題がなければコミットします。

### ■　改修したソースをコミット

#### 1.ファイルやディレクトリの追加・変更をインデックスに登録する。
```git.
git add .　　　　　　　 //すべてのファイルを登録
   or
git add <ファイル指定>　//指定したファイルを登録
```

#### 2.ファイルやディレクトリの追加・変更を、リポジトリにコミット（登録）する。
```git.
git commit 　           //コミットする
    or
git commit -m"コメント"　//コメントを同時にセットしながらコミット
```
#### 3.GitHubへPush
```git.
git push origin <ブランチ名>
```
Next.js × Docker　開発環境作成

## はじめに
これからNext.jsにチャレンジしていく過程をメモ/備忘録として記録していきます。
同じようにこれから始める方の参考となればと思います。

## やりたいこと
Next.jsの開発環境をDockerで構築したい

## フォルダ準備
今回は最低限の環境として、Dockerfileは作らず公式イメージを利用します。

src配下にアプリのソースコードを置く構成にします。
```terminal:
.
├── docker-compose.yml
├── .env
└── src
    ├── .next
    ├── app
    ・
    ・
```

## docker-compose.yml と　.envを準備
``` yml:docker-compose.yml
services:
  next:
    image: ${NODE_IMAGE:-node:20-alpine}
    working_dir: /usr/src
    volumes:
      - ${HOST_DIR:-./src}:/usr/src
    command: npm run dev
    ports:
      - "${HOST_PORT:-3000}:3000"
```

```shell:.env
NODE_IMAGE=node:20-alpine
HOST_PORT=3000
HOST_DIR=./src
```

## プロジェクト作成
### 1. コンテナを作成しておく
```shell:
docker compose up -d
```

### 2. アプリインストール
```shell:
docker compose run --rm next sh -c 'npx create-next-app@latest .'
```
最後に``` . ```を付けておくとカレントディレクトリにアプリを展開できます。

いくつか選択肢が出てくるので、好みに合わせて選択。詳しくは公式を参照。
（とりあえず全てデフォルトにしました）

https://nextjs.org/docs/getting-started/installation

```shell:
Ok to proceed? (y) 
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
```
Success!と出てくれば成功！
```shell:
added 359 packages, and audited 360 packages in 19s

133 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Success! Created src at /usr/src
```

### ３. コンテナを起動
```shell:
docker compose up -d
```

### 4. アクセスしてみる
``` localhost:3000 ```にアクセスしてみます。
Next.jsのページが出てくれば成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680973/b0050015-e17b-29b9-b522-5b67efa87e71.png)

## ホットリロードについて
docker desktop for windowsを使っている場合（WSLを使っていると）、
docker-compose.yml　に```WATCHPACK_POLLING=true```を書いたり、
Next.config.js に設定を追加したり必要な模様。
Macだったのでホットリロードはデフォルトで有効になってました。

https://qiita.com/KMNMKT/items/4837f123b30bcf7003c7

https://qiita.com/SDTakeuchi/items/694fe7545396246da573



## コンポーネントライブラリ追加

フロントエンド開発に慣れていないため、簡単にコンポーネントを使えるライブラリを導入することにします。

https://daisyui.com/

```shell:
docker compose exec -it next sh
```
```terminal:
/usr/src # npm i -D daisyui@latest
```

インストール完了したら、```tailwind.config.js```に設定を追加
```javascript:tailwind.config.js
  plugins: [
    require('daisyui'),
  ],
```

公式に使い方が載っていますが、bootstrapのようにclassNameを書くだけでオシャレなコンポーネントが利用できます。
```jsx
<div className="flex space-x-4">
    <button className="btn btn-info">Info</button>
    <button className="btn btn-success">Success</button>
    <button className="btn btn-warning">Warning</button>
    <button className="btn btn-error">Error</button>
</div>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680973/95a50f11-398a-6f40-ee29-85c37d41b3e8.png)



## おわりに
ホットリロード最高です。
これからアプリ作成の過程も少しずつ残していこうと思います。

## 参考

https://qiita.com/Keichan_15/items/4fc605895fef2a33b629
【LaTeX】wrapfigureで本文・図・キャプションの位置を細かく微調整

LaTeXで以下のように、wrapfigureで図にテキストを回り込ませる際に、細かく微調整する方法を解説します。
本文と図とキャプションの間隔を微調整します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340883/1f5d0a94-cba4-5f71-b048-b20b9efcbf3d.png)


<details>
<summary>上記のコード</summary>

``` tex
\documentclass[11pt,a4j,dvipdfmx]{jarticle} 			
\usepackage{graphicx}
\usepackage{wrapfig}

\begin{document}

\section{Introduction}

foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar. 
\begin{wrapfigure}[14]{r}[-2zh]{12zh}
    \centering\vspace{0.5zw}
    \begin{tabular}{@{\hskip -1.5zh}c}
        \includegraphics[keepaspectratio,width=50mm]{money_bitcoin_whale.png}\\
        [0.5 zh]
        \centering
        \parbox{10zw}{\caption{仮想通貨を持つクジラのイラスト}}
    \end{tabular}
\end{wrapfigure}
 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar
 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar.
\end{document}

```

</details>





### 解説 [^1]

__調整のコツは、文章に対しての枠を wrapfigure で外枠として調整し、その外枠の中に tabular で内枠（図の枠）を作り、外枠に対する相対位置として調整することです。__

</details>

#### コード
``` tex
\begin{wrapfigure}[lineheight:行数]{position:図の左右}[overhang:外枠のはみ出し]{width:外枠の横幅}
    \centering\vspace{(外枠と内枠の縦方向の間隔)}
    \begin{tabular}{@{\hskip (外枠と内枠の横方向の間隔)}c}
        \includegraphics[keepaspectratio,width=(内枠・図の横幅)]{figure.png}\\
        \\[キャプションとの間隔]
        \centering
        \parbox{キャプションの箱の横幅}{\caption{キャプション本文}}
    \end{tabular}
\end{wrapfigure}
```
プリアンブルに`\usepackage{graphicx}\usepackage{wrapfig}`が必要です。

#### 図解
![図解.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340883/ea460043-da94-17d5-d826-ccc426a61bbb.jpeg)

#### 引数の説明
上記のコードに出てくる順に引数を説明します。

* lineheight:行数
wrapfigure（外枠）の縦の長さを、行数で指定します。
* position:図の左右
本文の左側・右側に寄せるかを、l or r で指定します。
* overhang:外枠のはみ出し
本文が収まっている枠から、外側（or 内側）にはみ出す長さを指定します。
* width:外枠の横幅
外枠の横幅を指定します。
* \vspace{(外枠と内枠の縦方向の間隔)}
外枠と内枠の縦方向の間隔をvspaceで指定します。
* \hskip (外枠と内枠の横方向の間隔)
外枠と内枠の横方向の間隔をhskipで指定します。
* \includegraphics[keepaspectratio,width=(内枠・図の横幅)]
内枠・図 のサイズを指定します。
内枠・図の横幅を基準にして、keepaspectratioで図の縦横比を固定し、
外枠も横幅で調整する方が扱いやすいです。
* \parbox{キャプションの箱の横幅}
キャプションの箱の横幅を指定します。
一行に収まる場合は、\parbox は必要ありません。








### 参考文献
https://ja.overleaf.com/learn/latex/Wrapping_text_around_figures

[^1]: 本記事及びコードは、北九州市立大学 藤田慎之輔研究室 HP の内容を参考にさせていただいております。
http://esd.env.kitakyu-u.ac.jp/fujita/texnique.html
To use retry middleware with Faraday v2.0+, install `faraday-retry` gem というエラーの対応

##  エラーが出ている状態
```.github/workflows/git-pr-release.yml
name: git-pr-release

on:
  push:
    branches:
      - develop

jobs:
  git-pr-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # git-pr-release needs the git histories
      - uses: actions/setup-ruby@v1
        with:
          ruby-version: 3.1
      - run: gem install --no-document git-pr-release -v "2.2.0"
      - run: git-pr-release --no-fetch
        env:
          TZ: Asia/Tokyo
          GIT_PR_RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GIT_PR_RELEASE_BRANCH_PRODUCTION: main # 本番ブランチをを指定
          GIT_PR_RELEASE_BRANCH_STAGING: develop # ステージングのブランチを指定
          GIT_PR_RELEASE_TEMPLATE: .github/.git-pr-release
```

## 対応
以下を追加した
```
permissions:
  id-token: write
  contents: read
  pull-requests: write
```

## 動くやつ
```.github/workflows/git-pr-release.yml
name: git-pr-release

on:
  push:
    branches:
      - develop

permissions:
  id-token: write
  contents: read
  pull-requests: write

jobs:
  git-pr-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # git-pr-release needs the git histories
      - uses: actions/setup-ruby@v1
        with:
          ruby-version: 3.1
      - run: gem install --no-document git-pr-release -v "2.2.0"
      - run: git-pr-release --no-fetch
        env:
          TZ: Asia/Tokyo
          GIT_PR_RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GIT_PR_RELEASE_BRANCH_PRODUCTION: main # 本番ブランチをを指定
          GIT_PR_RELEASE_BRANCH_STAGING: develop # ステージングのブランチを指定
          GIT_PR_RELEASE_TEMPLATE: .github/.git-pr-release

```

これで動くことは動く
robloxでassistant その86

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
Trailを使え。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```

local TweenService = game:GetService("TweenService")
local part = Instance.new("Part")
part.Material = Enum.Material.Neon
part.Size = Vector3.new(1, 1, 1)
part.Shape = Enum.PartType.Ball
part.Position = Vector3.new(0, 5, 0)
part.Anchored = true
part.Parent = workspace
local attachment0 = Instance.new("Attachment")
attachment0.Name = "Attachment0"
attachment0.Position = Vector3.new(0, -0.5, 0)
attachment0.Parent = part
local attachment1 = Instance.new("Attachment")
attachment1.Name = "Attachment1"
attachment1.Position = Vector3.new(0, 0.5, 0)
attachment1.Parent = part
local trail = Instance.new("Trail")
trail.Attachment0 = attachment0
trail.Attachment1 = attachment1
local color1 = Color3.fromRGB(255, 255, 255)
local color2 = Color3.fromRGB(255, 255, 255)
trail.Color = ColorSequence.new(color1, color2)
trail.Parent = part
local dir = 15
while true do
	dir *= -1
	local goal = {
		Position = part.Position + Vector3.new(0, 0, dir)
	}
	local tweenInfo = TweenInfo.new(3)
	local tween = TweenService:Create(part, tweenInfo, goal)
	tween:Play()
	task.wait(4)
end


```


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8e8d96d0-213f-8009-ea00-b8dd998c804a.png)

以上。
バッファキャッシュ

バッファキャッシュは、ディスクのデータのうち、ファイルデータ以外のものをキャッシュする仕組みです。バッファキャッシュは次のようなときに使います。
* ファイルシステムを使わずに、デバイスファイルを用いてストレージデバイスに直接アクセスするとき。
* ファイルのサイズやパーミッションなどのメタデータにアクセスするとき。

バッファキャッシュもページキャッシュと同様、バッファキャッシュに書かれたデータが、まだディスクに反映されていないダーティな状態になり得ます。
あるデバイス上にファイルシステムが存在して、かつ、そのファイルシステムをマウントした状態を反映した状態と仮定します。この時、デバイスのバッファキャッシュとファイルシステムのページキャッシュは別々に存在していて、かつ、`お互いの同期はとっていません`。
...
`ファイルシステムのダーティページの内容はバックアップファイルに反映されません`。

### 気づき
キャッシュメモリと同じようにダーティの状態のものは書き戻さなければ反映されない。

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
バッファキャッシュはこれから実践するうちに理解しよう。
使ってみたい。
stylelintをv13からv16にアップデート


## BeforeAfter
```
    "stylelint": "^13.13.1",
    "stylelint-config-prettier": "^8.0.2",
    "stylelint-config-recess-order": "^2.6.0",
    "stylelint-config-standard": "^22.0.0",
    "stylelint-prettier": "^1.2.0",
    "stylelint-scss": "^3.21.0",
    "lint-staged": ">=11",
```

```
    "stylelint": "^16.5.0",
    "stylelint-config-recess-order": "^5.0.1",
    "stylelint-config-standard-scss": "^13.1.0",
    "stylelint-scss": "^6.3.0",
    "postcss": "^8.4.38",
    "lint-staged": "^15.2.2",
```

## v14

https://stylelint.io/migration-guide/to-14


### デフォルトでscssはlintできなくなった

stylelint-config-standard-scssを導入
stylelint-config-standardも含まれているので削除


https://github.com/stylelint-scss/stylelint-config-standard-scss


### yarn stylelintできない

```
TypeError: Class extends value undefined is not a constructor or null
```
postcssv7を見ちゃう？ので上位側にpostcssv８を導入


https://stackoverflow.com/questions/72272219/stylelint-gives-error-class-extends-value-undefined-is-not-a-constructor-or-nul



https://github.com/stylelint-scss/stylelint-config-standard-scss/issues/5


### kebab-case以外エラーになるのでその辺りのルール追加

参考：https://flex-box.net/stylelint-v14/#co-index-2

## v15


https://stylelint.io/migration-guide/to-15


### スタイル関連のルールが含まれなくなった
stylelint-config-prettierとstylelint-prettierを削除


https://github.com/prettier/stylelint-prettier?tab=readme-ov-file#disabling-rules-that-may-conflict-with-prettier



https://github.com/prettier/stylelint-config-prettier



## v16


https://stylelint.io/migration-guide/to-16


特に変更なくてOKだった