OmniAICreator/Qiita-1.07M huggingface dataset:
Git入門：より高度な機能と具体的なワークフロー

Gitには、基本的な機能に加えて、より高度な機能や特定のワークフローに適したツールが豊富に揃っています。この記事では、Gitの高度な機能と具体的なワークフローについて記述します。

### 目次

1. Gitフロー
2. インタラクティブリベース
3. Gitフック
4. サブモジュールの使い方

### 1. Gitフロー

Gitフローは、複雑な開発プロジェクトを管理するためのブランチングモデルです。以下のようなブランチを使用します。

- **mainブランチ**: 常に安定したコードを保持する。
- **developブランチ**: 開発中のコードを保持する。
- **featureブランチ**: 新機能の開発を行う。
- **releaseブランチ**: 次のリリース準備を行う。
- **hotfixブランチ**: リリース後の緊急修正を行う。

### Gitフローの基本コマンド

Gitフローのツールをインストールするには、以下のコマンドを使用します。

```bash
brew install git-flow
```

Gitフローを初期化するには、以下のコマンドを使用します。

```bash
git flow init
```

新しいフィーチャーブランチを開始するには、以下のコマンドを使用します。

```bash
git flow feature start <フィーチャー名>
```

フィーチャーブランチを終了するには、以下のコマンドを使用します。

```bash
git flow feature finish <フィーチャー名>
```

### 2. インタラクティブリベース

インタラクティブリベースは、コミット履歴を再構成するための強力なツールです。コミットをまとめたり、分割したり、順序を変更したりできます。

### インタラクティブリベースの使用方法

以下のコマンドを使用してインタラクティブリベースを開始します。

```bash
git rebase -i HEAD~<コミット数>
```

エディタが開き、コミットのリストが表示されます。ここで、各コミットの前にあるキーワードを編集して操作を指定します。

- **pick**: コミットをそのまま適用する。
- **reword**: コミットメッセージを変更する。
- **edit**: コミット内容を編集する。
- **squash**: 前のコミットに統合する。
- **fixup**: 前のコミットに統合し、メッセージを破棄する。
- **drop**: コミットを削除する。

### 3. Gitフック

Gitフックは、特定のGitイベントが発生したときに自動的にスクリプトを実行する機能です。これにより、コミットメッセージの形式を強制したり、コードのスタイルチェックを行ったりできます。

### Gitフックの使用方法

Gitフックは、リポジトリの`.git/hooks`ディレクトリに配置されます。以下は、`pre-commit`フックの例です。

`pre-commit`ファイルを作成し、以下の内容を記述します。

```bash
#!/bin/sh
# スタイルチェックを実行
./run_style_check.sh

# スタイルチェックが成功しなかった場合、コミットを中止
if [ $? -ne 0 ]; then
  echo "Style check failed. Aborting commit."
  exit 1
fi
```

フックファイルに実行権限を与えます。

```bash
chmod +x .git/hooks/pre-commit
```

### 4. サブモジュールの使い方

サブモジュールを使用することで、外部リポジトリをプロジェクトに統合できます。サブモジュールを使用すると、複数のプロジェクト間でコードを再利用しやすくなります。

### サブモジュールの追加

サブモジュールを追加するには、以下のコマンドを使用します。

```bash
git submodule add <リポジトリURL> <ディレクトリ>
```

### サブモジュールの初期化と更新

サブモジュールを初期化し、最新の状態に更新するには、以下のコマンドを使用します。

```bash
git submodule init
git submodule update
```

### まとめ

この記事では、Gitの高度な機能と具体的なワークフローについて記述しました。Gitフローを使用して開発プロジェクトを管理し、インタラクティブリベースでコミット履歴を再構成し、Gitフックで自動化タスクを設定し、サブモジュールでコードを再利用する方法を学びました。これらのツールとテクニックを駆使して、効率的なバージョン管理と開発フローの実現を目指します。
Git入門：リモートリポジトリ管理とチーム開発のベストプラクティス

Gitのリモートリポジトリ管理は、チーム開発において重要な役割を果たします。また、効率的なチーム開発のためのベストプラクティスも理解しておく必要があります。この記事では、リモートリポジトリ管理の基本と、チーム開発でのベストプラクティスについて記述します。

### 目次

1. リモートリポジトリの基本
2. リモートリポジトリの設定と使用
3. チーム開発のベストプラクティス

### 1. リモートリポジトリの基本

リモートリポジトリは、インターネット上にホスティングされたGitリポジトリであり、チームメンバーが共同で作業するために使用します。GitHubやGitLab、Bitbucketなどが代表的なホスティングサービスです。

### 2. リモートリポジトリの設定と使用

### リモートリポジトリの追加

リモートリポジトリを追加するには、以下のコマンドを使用します。

```bash
git remote add origin <リモートリポジトリのURL>
```

例：

```bash
git remote add origin https://github.com/user/repo.git
```

### リモートリポジトリの確認

リモートリポジトリを確認するには、以下のコマンドを使用します。

```bash
git remote -v
```

### リモートリポジトリからのプル

リモートリポジトリから最新の変更を取得するには、以下のコマンドを使用します。

```bash
git pull origin main
```

### リモートリポジトリへのプッシュ

ローカルリポジトリの変更をリモートリポジトリにプッシュするには、以下のコマンドを使用します。

```bash
git push origin main
```

### 3. チーム開発のベストプラクティス

### ブランチ戦略

チーム開発においては、ブランチ戦略を明確にしておくことが重要です。以下のようなブランチ戦略を採用すると良いでしょう。

- **mainブランチ**: 常に安定したコードを保持するブランチ。リリース可能な状態を維持します。
- **developブランチ**: 次のリリースのための開発を行うブランチ。新しい機能や修正を統合します。
- **featureブランチ**: 新しい機能を開発するためのブランチ。開発が完了したらdevelopブランチにマージします。
- **hotfixブランチ**: リリース後の緊急修正を行うためのブランチ。修正が完了したらmainブランチとdevelopブランチにマージします。

### コードレビュー

コードレビューは、品質を保つために重要なプロセスです。Pull Request（PR）を使用して、チームメンバーにコードをレビューしてもらいましょう。

### 定期的なプルとマージ

チームメンバー全員が最新のコードを持つように、定期的にリモートリポジトリからプルして、変更をローカルに取り込みます。また、マージコンフリクトを防ぐために、頻繁にマージを行いましょう。

### コミットメッセージの書き方

コミットメッセージは、変更内容を明確に伝えるために重要です。以下のようなフォーマットを採用すると良いでしょう。

- **短く明確な概要**: 変更内容の概要を50文字以内で記述。
- **詳細な説明（オプション）**: 変更理由や詳細な内容を説明する場合、空行を挟んで記述。

例：

```sql
Add user authentication feature

- Implement login and registration forms
- Add user authentication middleware
- Update database schema for user accounts
```

### まとめ

この記事では、Gitのリモートリポジトリ管理とチーム開発のベストプラクティスについて記述しました。リモートリポジトリを使用してチームで効率的に作業を進めるためには、ブランチ戦略の明確化、コードレビューの実施、定期的なプルとマージ、適切なコミットメッセージの記述が重要です。これらのベストプラクティスを活用して、効果的なチーム開発を行いましょう。
pytorchで空配列を作る。Appendする

* tensor.emptyで空のtensorを作れます。
空のtensorでもshapeをもちます。
```python
q0 = torch.empty(1,0)
print(q0)
q0 = torch.empty(1,0,2,3)
print(q0)
```

* 以下のようにappendできます。
```python
q0 = torch.empty(0)             #.unsqueeze(0)
qr = torch.tensor([-1,-2,-3,-4])#.unsqueeze(0)
qt = torch.tensor([1,2,3])      #.unsqueeze(0)
qrr= torch.cat((q0,qr,qt),dim=0)
#qrr= torch.cat((q0,qr,qt),dim=1).squeeze(0)

print(q0)
print(qr)
print(qrr)
print(qr.shape,qt.shape,qrr.shape)

#連続的につなぐ。これで速度が出るのかどうか
qt=torch.cat(tuple(qt for _ in range(3)))
print(qt)
```

torch.catは配列(m,n,n1)と配列(m,n,n2)をつなげて配列(m,n,n1+n2)を作れる。
Astro.propsの理解

## はじめに
```react:Layout.astro
---
const title = Astro.props;
---

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width" />
    <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
    <meta name="generator" content={Astro.generator} />
    <title>{title}</title>
  </head>
  <body>
    <header id="header"></header>
    <main id="main">
      <slot />
    </main>
    <footer id="footer"></footer>
  </body>
</html>

```
Astroでは、こんな感じで作成したコンポーネントを

```react:index.astro
---
import Layout from '@/layouts/Layout.astro';
---

<Layout title="hoge" />
```
別のファイルでimportして呼び出すことができます。

ところで、何故にAstroでは
```react:Layout.astro
---
const title = Astro.props;
---

```
という変数定義の仕方をとるのでしょう？
Astroを触り始めてからしばらく「そういうもの」として深く考えずに書いてきましたが、やはりちゃんと知っておいた方がいいと思い、また、私のように何となくで「Astro.props」と書いているAstro初学者の方もいるのではないかと考えたため、本記事の作成に至りました。

## そもそも「Astroオブジェクト」が何なのか分からない

Astro.propsは、「Astroオブジェクトのpropsというプロパティ」ということを意味しています。
しかし私にはこの「Astroオブジェクト」の正体が何なのか、どこでどういう働きをしているのか、そして何よりconstとの関係性がどういうものなのかが不透明でした。

結論から言うと、この「Astroオブジェクト」は、Astroのどこからでもアクセス可能な様々なプロパティを保有したグローバルなオブジェクトです。そのうち「props」と言うプロパティは、親コンポーネントから受け取ったプロパティの値を一旦保持し、子コンポーネントに受け渡すという、いわば仲介業者のような役割を果たします。


## Astro.propsが具体的にどのように機能するのか
```react:index.astro
---
import Layout from '@/layouts/Layout.astro';
---

<Layout title="hoge" />
```
先ほどのこのコードを例に取って、詳しい流れを見ていきましょう。
親コンポーネントindex.astroで、Layoutと言う子コンポーネントを呼び出しています。その際、titleプロパティに"hoge"と言う値を指定しました。
ここで指定した"hoge"が、Astro.props、つまりAstroオブジェクトのpropsというプロパティに一旦格納されます。まず、ここに私の勘違いがありました。**title="hoge"は、直接Layoutコンポーネントに伝えられるわけではない**のです。

それから、一旦Astro.propsに保有された"hoge"は、子コンポーネントLayout.astro内で、ある方法で呼び出されます。
そう、その方法が
```react:Layout.astro
---
const title = Astro.props;
---

```
というわけです！

コードを書くとき、基本的に子コンポーネント側で、**titleなどのプロパティを定義してから、親コンポーネントで呼び出すときにプロパティの値を指定する、という流れになるため、勘違いが生じてしまっていた**のですが、実際の処理の流れは逆で、親コンポーネントで属性に指定した値が、Astro.propsを経由して、子コンポーネントでプロパティを定義した際に格納される、という風になっているのです。

![Group 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571075/25e89d22-fe0b-0666-7454-23ee1d303ceb.png)
↑こんなイメージ

## おわりに
AstroどころかJSの知識もほとんどない初学者のため、他にこんなところで躓く人がいるのか疑問ではありますが、使いながらうっすらと感じていたモヤモヤを解消することができたので、著者としてはこの記事を書いて良かったと思っております。ご感想やご指摘などあれば、コメント欄にお書きいただけますと幸いです🙇
ブロック要素とインライン要素の違いと使い分け方：超基本編

# はじめに
ブロック要素とインライン要素。
CSSを書いていて初学者が沼るポイントの一つではないでしょうか。
私はこの要素の違いがよく分からず、毎回なんとなくやっていていました。
なんとなくなので、入れ込んでは、できない。あれ、今回はいけた。と、効率が悪かったので今回まとめることにしました。


# ? : ブッロク要素ってなに
**「常に新しい行から始まり、幅が親コンテナの全体を占める要素」**

◼︎ブロック要素の特徴
・新しい行から始まる: ブロック要素は他の要素とは別の行に配置されます。
・幅を全て占める: デフォルトでは、親要素の幅全体を占めます。
・高さと幅を設定可能: width や height プロパティを使って明示的に高さや幅を設定できます。

## ◾︎ブロック要素はこれ ⬇️
`<div>`
`<p>`
`<h1> ～ <h6>`
`<ul> と <ol>`
`<li>`
`<section>`
`<article>`
`<header>`
`<footer>`

レイアウトの**主要な構造を作るため**に使われる。

# ？ : インライン要素とは
**「他のインライン要素と同じ行に並び、内容に応じた幅を持つ要素」**

◼︎インライン要素の特徴
・同じ行に並ぶ: 他のインライン要素と同じ行に並んで表示されます。
・幅が内容に応じて決まる: 親要素の幅全体を占めるのではなく、その内容に応じた幅を持ちます。
**・高さと幅を設定できない: width や height プロパティが無視されます。**


## ◾︎インライン要素はこれ ⬇️
**「上記のブロック要素以外」**
（少し雑かもしれませんが、覚えやすくするために手っ取り早くいきます。）
具体例として、

`<span>`
`<a>`
`<img>`
`<em>`
`<strong>`
`<i>`
`<b>`
`<u>`
`<code>`
`<label>`
`<abbr>`
`<cite>`

ページの主要な構造ではなく、**内容の一部を細かく装飾する**ために使用される。

## ？ : インライン要素の大きさ調整はどうやってするん
インライン要素は、
"高さと幅を設定できない: width や height プロパティが無視される”
インライン要素こそ、高さと幅設定をしたい。

### **→【結論】paddingとmarginを駆使する。**

![スクリーンショット 2024-07-11 14.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830302/0107fda6-a6d3-f1bb-d929-b6d028fc9084.png)

**1. padding**
インライン要素の周囲にパディングを設定することで、コンテンツの周囲に空白を追加できる。
パディングはコンテンツの外側に適用されるため、要素自体のサイズには影響しませんが、見た目のサイズを調整するのに役立つ。

**2. margin**
インライン要素の周囲にマージンを設定することもできる。マージンは要素とその周囲の要素との間のスペースを指定するが、インライン要素自体のサイズには影響しない。

**3. インライン要素の外側にブロック要素を配置する（奥の手？）**
インライン要素のサイズ調整が難しい場合、そのインライン要素を含むブロック要素を使用して、ブロック要素のサイズを調整する方法もある。この場合、ブロック要素にはサイズ（高さ・幅）を指定できるため、その中にインライン要素を配置し、必要に応じてサイズやスタイルを調整することができる。









# まとめ
ブロック要素とインライン要素を使い分けることで、効果的なページレイアウトを作成することができる。

・ブロック要素は、
　L ページの大きな構造を作るのに使われ
　L 新しい行に表示され
　L 幅全体を占める。
　例:`<div>, <header>, <section>`

・インライン要素は、
　L テキストの一部や小さな部分の装飾に使われ
　L 同じ行に表示され
　L 内容に応じた幅を持つ。
　例:`<span>, <a>, <em>`

# おわりに
インライン要素を制するものがCSSを制する。
インライン要素は種類がありすぎてよく分からんので、ブロック要素以外と覚えるといいというのは新しい発見でした。
そして、今までインライン要素にheight,widthをあてては、なんで反映されないんだろう。と首を捻っていた原因が判明してすっきりしました。
基本のキを理解することの大切さを改めて感じました。

と、思っていたら、インライン要素をブロック要素にするには、

display:block;
display: inline-block;
float: left; もしくは float: right;

などの3つの選択肢があることを忘れてました。なんなら上記３つの方がよく使うやり方、、。
今度は、上記について深掘りしたいと思います。
そして、インラインブロック要素という要素もありました。
いろんな要素がありますね、一つずついきます。
と思ったら、インラインブロック要素というHTMLタグ（`<>`）は存在せず、CSSのプロパティの一つなんですね、なんで要素っていうんだろう。ややこしい。
PHPでデータベース操作の基本

<h1>はじめに</h1>
基本的なデータベース操作（select, insert ,delete）についてまとめました。
<br>

<h2>データベース接続</h2>
PHPからデータベース（MySQL）を操作するために、まずデータベースに対して接続を確立させます。

```php:db.php
$usr = 'user'; // 接続ユーザー名
$pw = 'password'; // 接続時のパスワード
$dsn = 'mysql:host=localhost; dbname=test; charset=utf8';

$pdo = new PDO($dsn, $usr, $pw);
```
①$dsnはデータベース接続文字列で、データベースに接続するための情報（ホスト名やデータベース名など）をまとめたものです。
※接続先のデータベースによって異なるので注意。今回はMySQL

②PDOクラスをインスタンス化します。

<h2>SELECT</h2>
データベース接続ができたら、テーブルからデータを取得していきます。<br>
今回取得元のテーブルはこんな感じ<br>
<caption>テーブル名：member</caption><br>

| id | nam | age | password |
|:-:|:-:|:-:|:-:|
| 1 | 江戸川コナン | 7 | baro |
| 2 | 西条大河 | 35 | yoshitsune |
| 3 | 山倉多恵 | 52 | ookini |
| 4 | 綾小路文麿 | 28 | ojaru |

memberテーブルからidが「1」の行を取得するには
```php:db.php
$spl = $pdo -> prepare('select * from member where id = 1');
$spl->execute();
```
①`$pdo->prepare(~)`　発行したいSQL命令文を指定します。
②`select * from member where id = 1`　memberテーブルの「id = 1」でマッチする行を取得します。
③`$spl->execute();`　executeメソッドによってデータベースに命令が送信/実行されます。

下記で取得結果を出力します。
```php:db.php
$row = $spl -> fetch(PDO::FETCH_ASSOC);
print_r($row);
// 出力結果：Array ([id] => 1, [nam] => 江戸川コナン, [age] => 7, [pw] => 7)
```

<h2>INSERT</h2>
テーブルに新しく行を追加する場合はinsert文を使用します。

```php:dp.php
$sql = $pdo -> ('insert into member (nam, age, passowrd) values(?,?,?)');
$sql -> bindValue(1, '竜円');
$sql -> bindValue(2, '34');
$sql -> bindValue(3, 'tera');
$spl->execute();
```
insert文の```values(?,?,?)```の箇所はプレイスホルダーを表し、```bindValue```でプレイスホルダーに値を設定してから実行しています。
結果は以下のように一番下の行に新しく追加されます。

| id | nam | age | password |
|:-:|:-:|:-:|:-:|
| 1 | 江戸川コナン | 7 | baro |
| 2 | 西条大河 | 35 | yoshitsune |
| 3 | 山倉多恵 | 52 | ookini |
| 4 | 綾小路文麿 | 28 | ojaru |
| 5 | 竜円 | 34 | tera |

<h2>DELETE</h2>
テーブルから特定の行ごと削除する場合はdelete文を使用します。<br>
以下はidが「2」の行を削除

```php:db.php
$sql = $pdo -> prepare('delete from member where id = ?');
$sql -> bindValue(1, '2');
$sql -> execute();
```

これで「id=2」でマッチする行を削除することができます。
| id | nam | age | password |
|:-:|:-:|:-:|:-:|
| 1 | 江戸川コナン | 7 | baro |
| 3 | 山倉多恵 | 52 | ookini |
| 4 | 綾小路文麿 | 28 | ojaru |
| 5 | 竜円 | 34 | tera |
【python】乃木坂46の3期生メンバーで配列の要素をシャッフルしてみる

# はじめに
配列の要素をシャッフルして並び替えたら面白そうということで、配列の要素をシャッフルした処理を実装してみることにしました。

## どういうツールか?
コマンドプロンプトで人数を入力し、乃木坂46の3期生メンバー12人なので、1から12までの数字を入力したら、配列の要素をシャッフルし、0番目から指定された人数分、標準出力に出力されます。

## ソースコード
```Python
# 乃木坂3期生メンバーシャッフル
# 好きな順にメンバーを出力する

# 配列の要素出力関数
def output_answer_member(w_array,count):
    print("--------ここから下に乃木坂3期生メンバーを好きな順に出力されます---------")
    for i in range(count):
        print(w_array[i])

# メイン関数
def main():
    # ライブラリを読み込む
    import random
    # 乃木坂46の3期メンバー配列
    nogizaka_member3 = ["梅澤美波","与田祐希","久保史緒里","岩本蓮加",
                    "佐藤楓","大園桃子","山下美月","阪口珠美",
                    "向井葉月","中村麗乃","吉田綾乃クリスティー","伊藤理々杏"] 
    
    # 要素数変数
    n = 0
    # 配列の要素をシャッフルする
    random.shuffle(nogizaka_member3)

    while True:
        print("乃木坂3期生メンバーを好きな順に何人表示するか人数を入力してください")
        print(f"1から{len(nogizaka_member3)}までの数で入力してください")
        # 数値以外が入力されたら例外処理
        try:
            num = int(input())
        except:
            print("文字列を入力しないでください")
        #　指定された人数が要素数より少ない、及び多いチェック 
        if num < 1 or num > len(nogizaka_member3):
            print(f"1人以上{len(nogizaka_member3)}人以下で設定してください")
        else:
            n = num
            break
    # 結果関数を呼び出す
    output_answer_member(nogizaka_member3,n)
# メイン関数を呼び出す 
main()
```

## 実行結果
![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/56036ff3-2c39-e3af-9e8c-27dd5240057e.jpeg)


# 最後に
実装してみたら意外と面白かったです。
SDK does not contain 'libarclite' at the path...の対処法

# 問題の特定

iOSアプリのバージョンを引き上げようとしたら以下のようなエラーが発生した。

```
SDK does not contain 'libarclite' at the path '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a'; try increasing the minimum deployment target
```

## 開発環境
-  Xcode15.4
- Swift 5.10
- CocoaPods 1.13.0

# 問題解決の解説
エラー文で検索すると以下のような質問が StackOverflow にあった。

https://stackoverflow.com/a/77513296/20267915

また、回答内で言っている Apple Staff の回答はこちら：

https://developer.apple.com/forums/thread/728021?answerId=752314022#752314022

Xcode14以降から、iOS 11以上のデプロイメント・ターゲットでのビルドしかサポートしておらず、libarclite は過去、古いOSには必要だったが、現在は廃止されている。

つまり、ライブラリで deployment target が11未満のものを使うには、引き上げ11以上に引き上げる必要がある。

# 問題の解決方法
上記のことから、StackOverflow の回答にもある通り、以下のコードを Podfile 内部に書く必要がある。

```ruby
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = "11.0"
    end
  end
end
```

 `"IPHONEOS_DEPLOYMENT_TARGET"` は 11.0 以上なら通ると思うので、自分のプロジェクトファイルと合わせるのが良さそう。
 
 # わからないこと
 Apple Staff が言っていた **libarclite** が一体どういう役割をしているのか調べてもわからなかったので、これを読んでいる人がいて、知っていたらコメントして欲しいです :pray:
PHPのセッションを安全に破棄する方法(超個人用覚書)

#### 最初に結論のスクリプト
※あくまでも個人用覚書。環境によっては条件やパラメータ等を追加したほうがよい(解説参照)。
```deleteSession.php
<?php
session_start();
$_SESSION = [];
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() - 86400, '/');
}
session_destroy();
```

#### 以下解説
**ちゃんと**ググればPHPのセッションを廃棄する方法は出てくるけど、不正確なものや明らかに間違ってるものから正しいものを抜き出すのも面倒なので覚書として残しておくことにする。
根本的に[セッション破棄に関するPHPのオンラインマニュアル](https://www.php.net/session_destroy)の記述がわかりにくい(そもそも```session_destroy()```の項にあるのが間違いを増長している気も…)。

```php
session_start();
```
セッション利用の合言葉。
```php.ini```で```session.auto_start```がonになってなければ必要(デフォルトはoff)。

```php
$_SESSION = [];
```
セッション情報をすべて廃棄するために行う。```$_SESSION = array();```でも同じ。個別のセッションデータを削除したい場合は```unset($_SESSION['hoge']);```を使う。
```unset($_SESSION);```はやっちゃダメ!! というのは理由も含めてPHPマニュアルに書いてあるが、その場所が[```session_unset();```の項](https://www.php.net/manual/ja/function.session-unset.php)だったりするから余計に混乱する。また
> session_unset() 関数は、$_SESSION = array()と同等です。

とも書かれてあるが、セッションがアクティブでないと動作しない(セッション情報をクリアしてくれない)ので```$_SESSION = []```のほうが確実。

PHPマニュアルにある続きがこれ。
```php
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}
```
セッション管理にCookieを使用している場合はブラウザ側のCookieを削除しておかないとセッションIDが残ってしまい、セキュリティ上よろしくない。
1行目の```if```が「セッションでCookieを使用している場合」の判定だが、一般的にセキュリティ上の理由で```session.use_cookies```と```session.use_only_cookies```は絶対にonにしろ！と言われてその通りにしてるので、この条件分岐は個人的には不要。
2行目の```session_get_cookie_params()```でセッション管理用Cookieのパラメーター(連想配列のキーと値)を取得しているが、設定値がわかっていれば下の引数に直接入れてもよい。
3行目の```setcookie```でCookieの削除処理をする。
* 引数1: session_name()はデフォルトだとPHPSSIDとなっているセッション名を取得
  これも「セキュリティのため変更することが望ましい」とか書いてあったりする。これもわかっていれば値を直接書いてよい
* 引数2: Cookieにセットする文字列だが、今回はどうせ廃棄するのでなんでもよい
* 引数3: Cookieの有効期限だが、現在時間```time()```より前に設定することでCookieが破棄されるようにする。-42000は負の数ならいくつでもよい[^1]
* 引数4: Cookieを有効にしているパス。```'/'```を指定しておくことでサブドメインの壁を超えてドメイン全部に適用される。初期値は空文字列(発行したドメインのみ有効)。自分はサブドメインを超えて使うことがあるかもしれないので指定しておく
* 引数5: Cookieを有効にしているドメイン。4と5の2つについてはセキュリティ上「ドメインは設定しないほうが安全」「パスは設定してもセキュリティ上意味がない」と[ここ](https://blog.tokumaru.org/2011/10/cookiedomain.html)に書いてあった。初期値は空文字列
* 引数6: CookieをSSLの場合のみ送信する設定。HTTPとHTTPSでセッションを共有してたりしないなら省略可(初期値は```false```)。ここは変更してないので省略
* 引数7: HTTP Only、つまりHTTP(S)以外のスクリプト等からCookieを読ませてよいかどうかのフラグ。デフォルトは```false```でこれも特に変更していないので不要
というわけで、自分が実際に使う際は
```php
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() - 86400, '/');
}
```
だけになる。そして最後が
```php
session_destroy();
```
セッションIDそのものをナシにする。

以上。

[ここ](https://kappuccino-2.hatenadiary.org/entry/20080726/1217049706)の説明がわかりやすかった。
[^1]:なぜ```-42000```なのだろう？　```-86400```辺りのほうが馴染み深いのに。
PowerShell なんちゃってクリックワンス Part2(最終更新日付比較)

## `概要`
##### サーバー上のファイルとローカルのファイルの最終更新日を比較して起動するファイルを選別する
## `要件`
:::note info
①サーバーのファイルが新しいorローカルファイルがない=ダウンロードして起動
②ローカルのファイルが新しい=ローカルファイルを起動
:::
## `実装`
:::note info
①WEBディレクトリに対象のファイルを配置
②テキストファイルに以下コードを貼り付け.ps1で保存
:::


```powershell:ps1

$url = "http:///test.xlsm"
$localFilePath = "C:\test\test.xlsm"

#-- 多重起動防止
if((Get-Process|Where-Object{$_.MainWindowTitle -like '*test.xlsm*'}).Count -gt 0)
{
    Exit
}

#-- サーバーファイルのレスポンスを取得
$response = Invoke-WebRequest -Uri $url

#-- 最終更新日を取得
$lastModified = $response.Headers.'Last-Modified'

#-- 日付型に変換
$lastModifiedDate = [DateTime]::ParseExact($lastModified, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", 
    [System.Globalization.CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::AssumeUniversal)

#-- フォーマットして変数へ格納
$server = $lastModifiedDate.ToString("yyyy-MM-dd HH:mm:ss")

#-- ローカルファイルの存在チェック
$fileExists = (Test-Path $localFilePath)

if($fileExists){
#-- ローカルファイルがある

    #-- フォーマットして変数へ格納
    $local = (Get-ItemProperty $localFilePath).LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")

    if($server -gt $local){
    #-- サーバーのファイルが新しい場合はダウンロード
        
        Invoke-WebRequest -uri $url -outfile .\test.xlsm

        #-- 終了遅延
　　    Start-Sleep -s 2

        #-- 
        Write-Host "最新ファイルをダウンロード中" -ForegroundColor White -BackgroundColor DarkCyan

        #-- Web のマークを削除する
　　    Get-ChildItem -Recurse -File | ?{
　　      $_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
　　      } | Remove-Item -Stream Zone.Identifier;

    }else{
    #-- ローカルのファイルが新しい場合はダウンロードしない

        Write-Host "起動中" -ForegroundColor White -BackgroundColor DarkGreen

        }

}else{

    #-- ローカルのファイルがない場合はダウンロード
    Invoke-WebRequest -uri $url -outfile .\test.xlsm

    #-- 終了遅延
　　Start-Sleep -s 2

    #-- 
    Write-Host "最新ファイルをダウンロード中" -ForegroundColor White -BackgroundColor DarkCyan

    #-- Web のマークを削除する
　　Get-ChildItem -Recurse -File | ?{
　　  $_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
　　  } | Remove-Item -Stream Zone.Identifier;

}

#-- VBA起動
try {
    $excel = New-Object -ComObject Excel.Application
    # 表示する・しない            
    $excel.Visible = $false
    # ブックを開く                                     
    $book = $excel.Workbooks.Open([string](Resolve-Path (Get-ChildItem "test.xlsm")))
}
finally {
    # プロセスを開放する
    $excel = $null
    [GC]::Collect()
Exit
}
```
アドベントカレンダーも終盤！おすすめの記事ネタ3選！

# はじめに
去年の年末にもアドベントカレンダーに参加したのですが、今回は期間も目標記事数も高く、苦戦しています:fearful:

~~アドベントカレンダー前に投稿した記事をそのまま数に加算したい~~

https://qiita.com/does_not_exist/items/a5f79f750c8cfee7723e

# 記事を書くネタがないことはない

日頃のエラー対応や学びをかんたんにまとめれば継続投稿できる！と思っていました。
しかしこの数か月は社内開発しているAPIとの連携周りを対応しており、かんたんにまとめられそうなネタがない…！

記事ネタに困っている人の中で同じような理由の方って結構多いのではないでしょうか。


# それでも記事をかくためには

無理に書く必要はないですがせっかくのイベントです。
アウトプットに対して向き合える良い機会なので、どうすればネタが作りやすいか考えてみました。

# ①体験談
自分の体験談はおすすめです。書きやすいですし、オリジナル性があるので記事に価値も生まれやすいです。
「○○開発をやってみた」「チームメンバーと○○やってみた」「案件でこんな体験をした」などなど。

# ②触ってみた系
気になっているライブラリやツールを使ってみた所感や、そもそもの導入手順をまとめるのもおすすめです。
手順を記載している記事は時間が経つにつれて動かなくなっていたりするので、新しく手順をまとめた記事は有用性があります。

# ③振り返り系
過去に投稿した記事に対して一定期間後にどうなったかを振り返る記事も書きやすいです。
すでにベースとなる記事を自分で投稿しているので、一から何かを学ぶことが少ないのでハードルが低いです。


# おわりに
過去のアドベントカレンダーと比べると目標記事数が多くて私もネタに悩まされています。
Git操作を簡単に！任天堂スイッチ操作で考えてみた

# はじめに
**Git**は一見すると何をやっているのかなかなかイメージがつかず難しく見えます。しかし**Git操作**が何をしてるのか理解せずに使うと、とんでもないことになってしまう可能性もあります。

本記事では、**Git操作**を**任天堂スイッチ操作**で考えてみたことをまとめています。日頃からゲーム感覚で操作しているので共有できたらと思っております。

この記事が皆さんのお役に立てば嬉しいです！

# Git操作基本の流れ

ここからは、私が考える**Git操作**を任天堂スイッチの操作に例えて説明します。

## 1.任天堂スイッチクラウド保存（リポジトリの作成）

ゲームを始めるために、まずはゲームの大元となるセーブデータの保存(バックアップ)が必要です。そして任天堂には「[セーブデータお預かり](https://www.nintendo.com/jp/hardware/switch/onlineservice/savedata/index.html)」というサービスがあります。これのおかげで別の端末やプレイヤーからもセーブデータにアクセスすることができます。

https://www.nintendo.com/jp/hardware/switch/onlineservice/savedata/index.html

Gitでこれに相当するのが**リポジトリ**です。新しいプロジェクトを始めるために、リポジトリを作成して保存先を初期化して、保存されるようにします。

[![Image from Gyazo](https://i.gyazo.com/4e04042d3ddd95454ff0fe7eba298246.png)](https://gyazo.com/4e04042d3。dd95454ff0fe7eba298246)

## 2.ソフト起動、進行データの作成（ブランチの作成と切り替え）

ゲームソフトを起動して、新たなゲームを始めるためのデータを作成します。「データ1」「データ2」「データ3」など色々選択ができます。これがGitでは、**新しいブランチを作成**して、そこに切り替えることに該当すると考えています。

```:コマンド
git checkout -b 新しいブランチ名
```

![Fishing (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/56cfe6a3-1487-57fe-e6a6-7d57432ad256.png)

## 3.ゲームプレイ（実装）

ゲームをプレイして、敵と戦い、クエストを進めます。同じように、コードを書いて機能を実装します。

![Fishing (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/5a2c31c4-ec8e-08ff-5e43-f0836784faf2.png)

## 4.ゲーム進行度確認

ゲームの進行度を確認するように、Gitでは**コードの変更を確認**します。どのファイルが変更されたかを確認し、その変更を**ステージングエリア**に追加します。最後に、その変更を**コミット**して保存します。

```:コマンド
git status
git add .
git commit -m "メッセージ"
```

![Fishing (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/d89c394a-d86c-f4f4-0ead-79436f49ba47.png)

## 5.任天堂スイッチクラウド上に反映(セーブデータお預かり)

ゲームソフト内での進行度保存すれば自動的にクラウド上に保存されるように、Gitでは**リポジトリに変更を反映**させます。これにより、他の端末やプレイヤーとデータを共有できます。

https://www.nintendo.com/jp/hardware/switch/onlineservice/savedata/index.html

```:コマンド
git push origin 新しいブランチ名
```

## 6. ゲームデータ更新（ローカルのリポジトリを更新）

他のプレイヤーとデータを共有するために、最新のゲームデータをクラウドから取得します。Gitでも同じように、最新の変更をリポジトリから取得します。

```:コマンド
git pull
```

## 7.以降繰り返し

### 2〜6の流れを繰り返します。また、別のソフトを遊ぶなら、新しくリポジトリを作成して1〜6の流れを繰り返します。

# まとめ

### 任天堂スイッチ

1.任天堂スイッチクラウド保存(セーブデータお預かり)
2.ソフト起動、進行データの作成
3.ゲームプレイ
4.ゲーム進行度確認
5.任天堂スイッチクラウド上に反映(セーブデータお預かり)
6.ゲームデータ更新
7.以降繰り返し

### 通常

1.リポジトリ作成
2.新しくブランチを作成して切り替え
3.実装
4.変更の確認 (git status)、追加 (git add)、確定 (git commit)
5.リポジトリに反映 (git push)
6.ローカルのリポジトリを更新 (git pull または git fetch)
7.以降繰り返し

# おわりに
いかがだったでしょうか。ところどころ認識がずれていたら恐縮ですが、考え方はかなり近いものになっていると思います。

この記事が、Gitの基本操作を戸惑っている方々の助けになれば幸いです。ゲーム感覚で触りながら、Gitを使いこなしていきましょう！

もし、この記事の内容に不備や改善点などがありましたら、ご指摘いただけると嬉しいです。

# 参考

https://git-scm.com/doc
無料で利用可能なApache SolrのSaaS KandaSearch

皆さん、こんにちは。
私はロンウイットの中の人です。エンジニアではありません。

## 本投稿の概要
当社が提供中の無料で利用可能な **KandaSearch** というサービスのご紹介です。
KandaSearchは、ロンウイット社が提供する、Apache SolrのSaaSです。

[https://kandasearch.com/](https://kandasearch.com/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744637/b0bd71d7-6f97-802c-4923-a0ba0c28d2c4.png)


本投稿は、検索エンジンにこれから触ってみようと思っている方、コストのかからない常時稼働の検索エンジンを探している方に向けたご案内です。
そして、私が今後このOrganizasionで、Apache SolrやKandaSearchの情報を継続してお届けしようという決意表明でもあります。（10本は投稿したいです）

## Apache Solrとは
Apache Solrについてほんの少しだけご紹介します。

> Apache Solrは、Apache Solr プロジェクトが生み出した、人気があり、極めて高速なオープンソースの NoSQL 検索プラットフォームです。その主な機能は強力な全文検索、ヒットハイライト、ファセット検索、動的クラスタリング、データベース統合、高機能な文書ハンドリング、そして地理検索です。Solr はとてもスケーラブルで、耐障害性が高い分散検索とインデクシングを備え、世界中の巨大なインターネットサイトの検索とナビゲーション機能を牽引しています。

Apache Solr
[https://solr.apache.org/](https://solr.apache.org/)

![solr-s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744637/cbc96180-b858-eb07-45fc-ba95312389ef.png)


Apache Solrは、javaで書かれたNoSQLなデータベースの検索プロダクトです。

## KandaSearchとは
そのApache Solrを、管理コンソールからわずか数クリックで、検索エンジンインスタンスとして作成することができてしまうのが KandaSearch です。
作成したインスタンスの管理やバックアップなども、KandaSearchの管理コンソールより簡単に行うことができます。

KandaSearchには、いくつかのプランがありますが、無料で利用できるコミュニティプランについてご紹介します。

コミュニティプランのデータの独立性やセキュリティのレベルは、他の有料プランと比べても遜色ありません。推奨する各リソースの値の範囲内でご使用いただければ、安全で安定して動作します。
そして、商用・非商用を問わず、本番環境としてご利用いただけます。

推奨のリソースにつきましては、以下のページでご確認ください。
[https://kandasearch.com/pricing](https://kandasearch.com/pricing)

その他には、有料のプランとして、スタンドアロン構成で最大500万文書まで対応できるスタンダードプランや、SolrCloudも利用可能なエンタープライズプランをご提供しています。

## Qiitaでお話ししようと思っていること
このOrganizationでは、Apache Solrの基本技術である転置インデックスやスキーマ、検索方法、今話題のベクトル検索（KandaSearchではセマンティック検索と呼んでいます）の基本に触れながら、KandaSearchを使った検索エンジンの利用、KandaSearch内でのベクトル計算等々についてお話ししたいと思っています。

KandaSearchを利用しながら、Apache Solrを使った検索エンジンの重要性や可能性の再発見につながるような、検索エンジンに関する情報提供を行ってゆきます。

## なぜKandaSearchを使うの？
オープンソースであるApache Solrは無料でダウンローすることができ、インストールも簡単で手軽に試すことができます。
しかしながら、それを常時立ち上げておくことや、利用のため外部からの接続を実現するための環境整備には、コストの発生やセキュリティ面でのリスクが伴います。
そこで**KandaSearch**です。
KandaSearchの無料のインスタンスを使えば、自分だけの24時間稼働の検索エンジンを構築できます。
なぜKandaSearchが無無料で利用できるか疑問な方もいらっしゃると思いますが、それについては後の投稿で触れたいと思います。

それでは、次回の投稿をお楽しみに。
Snowflake Cortexを初めて試したよ

# Snowflake Cortexを触ってみよう

AI方面への進出が著しいSnowflake、ちょっと試してみます。
SNOWFLAKEデータベースの下にCORTEXってスキーマができてるんですね。
ちょっと世界の人口でも聞いてみますか。

```
SELECT SNOWFLAKE.CORTEX.COMPLETE('snowflake-arctic', '世界の国で人口の多いTOP10を出してください。') as response;
```
以下のエラーが出ました。

:::note warn
100351 (P0000): Request failed for external function COMPLETE$V2 with remote service error: 400 '"unknown model \"snowflake-arctic\""
:::
snowflake-arcticはunknown modelだそうです。
そうなの？
使うモデルを変えてみましょう。
```
SELECT SNOWFLAKE.CORTEX.COMPLETE('reka-core', '世界の国で人口の多いTOP10を出してください。') as response;
```
:::note warn
100351 (P0000): Request failed for external function COMPLETE$V2 with remote service error: 400 '"unknown model \"reka-core\""
:::
reka-coreもunknown modelだそうです。ぐぬぬ。
もう一個別のモデルで試してみます。
```
SELECT SNOWFLAKE.CORTEX.COMPLETE('llama3-8b', '世界の国で人口の多いTOP10を出してください。') as response;
```

:::note info
RESPONSE
Here are the top 10 countries by population in the world, based on the latest estimates from the United Nations (2020):

1. **China**: 1.439 billion (18.5% of the world's population)
2. **India**: 1.380 billion (17.7% of the world's population)
3. **United States**: 331.4 million (4.3% of the world's population)
4. **Indonesia**: 273.5 million (3.6% of the world's population)
5. **Pakistan**: 216.6 million (2.8% of the world's population)
6. **Brazil**: 212.2 million (2.7% of the world's population)
7. **Nigeria**: 202.9 million (2.6% of the world's population)
8. **Bangladesh**: 166.3 million (2.1% of the world's population)
9. **Russia**: 145.9 million (1.9% of the world's population)
10. **Japan**: 127.1 million (1.6% of the world's population)

Note: These numbers are estimates and may vary slightly depending on the source.
:::
キターーー。
でも英語で回答来るんですね、日本語で回答してくれるようお願いしましょう。
```
SELECT SNOWFLAKE.CORTEX.COMPLETE('llama3-8b', '日本語で回答してください。') as response;
```
:::note info
RESPONSE
日本語で回答します。何質問ですか？
:::
あれ？前の質問は覚えてないんですね。
ブラウザでChatGPTやClaudeに聞くのとは違うようです。

日本語で回答してくれるよう追加します。

```
SELECT SNOWFLAKE.CORTEX.COMPLETE('llama3-8b', '世界の国で人口の多いTOP10を出してください。日本語で回答してください。') as response;
```
:::note info
RESPONSE
以下は、世界の国で人口の多いTOP10です。

1. **中国**：約14億人（2020年推定）
2. **インド**：約13億人（2020年推定）
3. **アメリカ合衆国**：約3億4千万人（2020年推定）
4. **インドネシア**：約2億9千万人（2020年推定）
5. **パキスタン**：約2億6千万人（2020年推定）
6. **ブラジル**：約2億5千万人（2020年推定）
7. **ニガリア**：約2億4千万人（2020年推定）
8. **ベンガルデシ**：約2億3千万人（2020年推定）
9. **ロシア**：約1億9千万人（2020年推定）
10. **メキシコ**：約1億8千万人（2020年推定）

Note: 人口の推定値は2020年現在のものです。
:::
二ガリアというのは英語の方を見るとナイジェリアですね。
同様にベンガルデシはバングラデシュ。
10位がメキシコになってますが、英語の回答ではJapanでしたよ。
英語の回答は何年のものか書いてなくて日本語は2020年現在のものと但し書きがあります。
この違いでしょうか？
とはいえメキシコが1億2700万人の日本に抜かれたとは思えないです。
メキシコで2020年以降に人口の2/3くらいが虐殺されたんでしょうか？そんなニュース聞いたことないです。
ちょっと答えが怪しいですね。
ちなみに「メキシコ 人口」でググったら1.28億人（2022）と出ました。
約1億8千万人（2020年推定）
という回答が間違ってるくさいです。

Cortexを試してみるところはできたのですが、なんか使えるのか微妙な結果となりました。
モデルを他のにしたら精度は変わると思いますが、何となく試したllama3-8bだとこんな感じです。

詳しい方、いろいろ教えてください。
BlendファイルをFBXにすると映らない!?そんなときはソリッド化!!!

# はじめに
blenderで作った3DモデルがFBXにすると映らないってことはありませんか？ぼくはUnityで制作するときによくBlenderでモデリングしたものを利用します．そのときに，blenderでは映っているのに，何も映らなくなってしまうことがあります．そんな時の対処法を記述していきます．

# 対処する対象
上部のタブにある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/d92a8b67-2600-2dbf-bc62-13efff747d0d.png)

このオーバーレイのボタンで↓を押します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/40e05f4f-6355-1af1-d87a-9a2ce0e7116d.png)

そして，面の向きにチェックします．
![スクリーンショット 2024-07-11 13.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/1c586a1e-81ae-d33a-dab5-6aab39223705.png)

すると，通常の白い面と赤い面が存在します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/20320c93-ea53-9926-7a53-92738c6f8a54.png)

白い面：平面の表で表示する方
赤い面：平面の裏で表示されない

こんかいはこの裏面で表示されないという問題を解決します．

# 対処法
1手順で解決します！！
エディターから![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/5a945cd1-a6a1-2243-316d-5df0b28cbbdc.png)　を押し，モディファイアープロパティを開きましょう．
そして，モディファイアーを追加を押し，ソリッド化を選びます．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/4b343752-082b-a48a-afbb-b8b9deabe4b7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/bed695ff-f2b6-13df-c084-43cf37fceda2.png)

すると赤い面が消えます．
| ソリッド化前 | ソリッド化後 |
|:-:|:-:|
|  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/53409675-5b74-4c1e-2e3b-e47a57a7e8cf.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/bcc00fa0-c0db-aa6a-78cb-440266aabf07.png)  |

これは，平面だったものに厚みを出して，立体にしています．
下図の幅が厚みの幅を意味しています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/369cf671-d0f5-7d23-bdb3-992755f9ce76.png)

:::note warn
複雑な形をソリッド化すると，頂点数が急激に増加する可能性があります
:::

# 最後に
今回は，自分がUnityで3Dモデルを使う時に困ったことを記述してみました．私は有識者が近くにいてすぐに解決することができましたが，知らないと何時間も悩んでいたと思います．この記事が誰かの助けになることを祈っています．
それではみなさん良いエンジニアライフを〜👋
図解でわかる世界一簡単なサーバーレス解説

# はじめに
サーバーレスの聞いたことがあるけど、触ったことがない人の中にはこのような疑問を持つ方も多いのではないでしょうか？
今回は図を用いてわかりやすく特徴を3つ説明していきます。

# サーバーレスはサーバーがない？

サーバーレスは**サーバーの存在を意識せずに開発**を行うことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991303/fa87c604-1fc7-329d-dbfb-c73cfc3711d3.png)

# なぜ時間短縮できるか

サーバーの細かい設計や可用性、負荷分散などについて考えることが少なくなるからです。

![スクリーンショット 2024-07-11 13.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991303/c0764b8b-5ffe-5db7-4362-009fe2c70267.png)

# コストが安い理由

**サーバーレスは使った分だけ課金される**ため、無駄なリソースを確保する必要がなく、コストを削減できます。
リソースの効率的な利用が可能なため、全体のコストが安くなります。

![スクリーンショット 2024-07-11 13.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991303/fff67150-8e09-4358-5d09-cff56fa6670b.png)

# まとめ

以下の3つのことを覚えていただけたら嬉しいです！

- サーバーを意識しない
- 時間短縮できる
- コストが安い

# 発展

**【Lambdaの使い方】**

https://qiita.com/kazuya-sugawara/items/803dcbc584be7458ee18

**【サーバーレスベストプラクティス】**

https://qiita.com/kazuya-sugawara/items/e18f6a427622c5e5bf90
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（57/100）

**【お詫び】投稿を飛ばしてしまいました。申し訳ございません。**

【57日目】
トピック 7：SAPS/4HANAにおける拡張計画（3/14）

≪問題57≫
アドバンスト計画でアラートモニタを設定するときに、次のうちどの設定ステップを実行できますか。
（２つ選択）
□生産計画関連のアラートに対してオブジェクト選択バリアントを設定する。
□アラートプロファイルを全体プロファイルに割り当てる。
□優先度カテゴリ関連のアラートに対してオブジェクト選択バリアントを設定する。
□全体プロファイルを権限プロファイルに割り当てる。

≪解答≫
■生産計画関連のアラートに対してオブジェクト選択バリアントを設定する。
■アラートプロファイルを全体プロファイルに割り当てる。
□優先度カテゴリ関連のアラートに対してオブジェクト選択バリアントを設定する。
□全体プロファイルを権限プロファイルに割り当てる。

≪解説≫
アラートモニタは、PP/DSの問題状況に対する一元的なアクセス手段を提供する監視コンポーネントです。アラートモニタを通じて、例外が通知され、計画で調整が必要なすべての状況がアラートとして指定されます。また、計画担当者はアラートプロファイルで受信するアラートを定義することが可能です。
アラートは、関連するすべての選択条件を含む全体プロファイルに基づいて表示されます。以下のデータを入力することにより、全体プロファイルを定義します。
1. アラートタイプの選択（情報、警告、エラー）
2. オブジェクト選択バリアント（製品または生産計画関連のアラートに対して設定）
3. 優先度バリアント（アラートタイプなどに従って優先順位付け）
4. ユーザ固有のアラートプロファイルの割り当て
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（60/100）

【60日目】
トピック 7：SAPS/4HANAにおける拡張計画（6/14）

≪問題60≫
MRP計画ファイルにエントリが登録されることになるプロセスは以下のうちどれですか。
（３つ選択）
□在庫管理で在庫を変更する。
□製品マスタで調達タイプを変更する。
□倉庫管理で棚番を変更する。
□生産データ構造で作業時間を変更する。
□在庫購買管理で購買契約を変更する。

≪解答≫
■在庫管理で在庫を変更する。
■製品マスタで調達タイプを変更する。
□倉庫管理で棚番を変更する。
■生産データ構造で作業時間を変更する。
□在庫購買管理で購買契約を変更する。

≪解説≫
◆計画ファイルには、すべてのMRP関連製品が含まれていますが、計画ファイルエントリ区分が設定されて生産計画実行が開始された場合、計画される製品は、MRP関連の変更が行われた製品のみになります。
◆MRP関連の変更によって、計画ファイルにエントリ（区分）が生成されます。MRP関連の変更には、以下のものが該当します。
（1）受注の登録
（2）従属所要量の登録
（3）在庫の変更
（4）製品マスタでの調達タイプの変更
（5）生産データ構造（PDS）での作業時間の変更
フロントエンドとバックエンドについて

## はじめに
フロントエンドとバックエンドのフレームワークに関する知識が未熟なので調べていくうちに一般的に使用されているものがあることを知ったので、アウトプットしたいと思います。

## フロントエンドとバックエンドの違い
![フロントとバックエンド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/3099f67b-0f10-1b57-b45c-e98734d8d0b3.jpeg)

|  | フロントエンド | バックエンド |
|:-----------:|:------------:|:------------:|
|違い|Webサービスやアプリの操作画面など<br>ユーザーの目に直接触れる領域の開発| ユーザーの目に触れない機<br>能やデータなど裏側の開発|
|プログラミング言語|HTML<br>CSS<br>JavaScript|Java<br>Ruby<br>PHP|
|開発の流れ|画面全体の初期設定<br>共通パーツの定義<br>アクションやレスポンスの定義<br>マークアップの実装<br>JavaScriptなどを用いたパーツ実装<br>検証<br>|要件定義<br>基本設計<br>詳細設計<br>実装<br>テスト<br>|
|需要|基本的な言語で実務に携わることができ、案件も多いため需要は高い<br>参入者は多くライバル多数|より難易度の高い言語を駆使する<br>必要があるのでライバルは少ない|


## フロントエンドフレームワークについて
- [ ] メリット
HTML、CSS、Javascriptに直接記述することで柔軟性とシンプル性があるといえる
- [ ] デメリット
開発ごとに同じ機能を繰り返し実装しなければならず、非効率で、保守性も低くなる

このデメリットを解消するために、多くの開発現場では再利用可能な**フレームワーク**を採用し、開発が大幅に効率化されています

### フレームワークとは
フレームワークは、アプリケーションそのものを構成する「枠組み」の役割になります。そして、ソフトウェアフレームワークとは、ソフトウェア開発によく用いられる汎用的な機能を提供するひな形のようなもので、プログラマーはその骨組みにコードを記述して機能を追加してアプリケーションを開発。
このように、雛形を利用することによって、プロダクトを１から開発せずにすみ、ソフトウェア開発のための時間を大幅に短縮することができます


### フロントエンドの3大フレームワーク
|         | 特徴                                                                                                                       | メリット                                                                                              | デメリット                                                                                                         | 
| ------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | 
| React   | Facebookによって開発<br>現在最も人気                                                                                       | ・独立した再利用可能なコンポーネントで時間とコストが削減<br>・シンプルな仮想DOMでパフォーマンスを向上 | ・初心者には学習必須<br>・UIのレンダリングに特化している分、その他機能は別のツール等を組合わせて使用する必要がある | 
| Angular | ・企業規模の大規模アプリケーションに適している<br>・堅牢な構造を持つ<br>・Googleのサポートがあるため、長期的に信頼性がある | ・高いスピードとパフォーマンス<br>・広大なエコシステム<br>・双方向データバインディング                | ・初心者にとっては複雑<br>・CLIドキュメントが明確に定義されていない                                                | 
| VueJS   | ・ReactとAngularのいくつかのアイデアの組合わせ<br>・学習コストが低い、柔軟で軽量                                           | ・詳細で豊かなドキュメント<br>・再利用性とシンプルな統合                                              | ・過度の柔軟性がプロジェクトの整合性に影響を与える<br>・限られたサポートコミュニティ                               | 

導入の際には次の3点を考えるのがいいとされています。
- プロジェクトの規模
- デザイン重視 or 機能重視
- 開発チームのバックグラウンド

## さいごに
フロントエンドとバックエンドの話から、フレームワークについて簡単にまとめてみました。どのフレームワークを選択するかで開発スピードが変わってくるそうなので、特徴をよく理解したうえで活用できるようになりたいです
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（59/100）

【59日目】
トピック 7：SAPS/4HANAにおける拡張計画（5/14）

≪問題59≫
詳細日程計画で入庫処理時間をモデリングする必要があります。どのモデリングオブジェクトを使用できますか。
（３つ選択）
□ロケーションマスタデータで個別の受信リソースをモデリングする。
□生産データ構造で個別のリソースをモデリングする。
□ロケーションマスタデータで荷役リソースをモデリングする。
□ロケーションマスタデータで輸送レーンと運送業者選択をモデリングする。
□品目マスタで入庫時間をモデリングする。

≪解答≫
□ロケーションマスタデータで個別の受信リソースをモデリングする。
□生産データ構造で個別のリソースをモデリングする。
■ロケーションマスタデータで荷役リソースをモデリングする。
■ロケーションマスタデータで輸送レーンと運送業者選択をモデリングする。
■品目マスタで入庫時間をモデリングする。

≪解説≫
◆PP/DS計画手配は、詳細計画を使用して行われるため、すべての作業日付が含まれます。必要な構成品目の調達を、作業ごとに詳細に計画することも可能です。
◆SAPS/4HANAの品目マスタからPP/DSの製品マスタに入庫処理時間がコピーされます。出庫時刻と入庫処理時間の計画は、ロケーションに格納されている荷役リソースを使用して実行されます。また、カレンダリソースは、荷役リソースとして定義する必要があります。
◆サプライチェーン内の2つのロケーション間（例：生産プラントから流通センター）で製品を転送するには、対応する輸送レーンが存在する必要があります。この輸送レーンはPP/DSで登録され、この目的のために使用されます。
RLHFとDPOの良記事

# はじめに

和地 瞭良さんが良記事を作成されていたのでまとめておきます。

# 和地 瞭良さんの紹介

強化学習の凄い人です。会ったことないので、いつか会ってみたいですね！

https://akifumi-wachi-4.github.io/website/

# YouTube動画での解説

https://www.youtube.com/watch?v=yoH-bPO0vyE

# NeurIPS 2023参加報告　DPO

https://speakerdeck.com/akifumi_wachi/neurips-23-can-jia-bao-gao-plus-dpo-jie-shuo

# RLHF/DPO から始める始める強化学習入門

https://akifumi-wachi-4.github.io/website/column/from_rlhf_to_general_rl.pdf

# RLHF/DPO小話

https://akifumi-wachi-4.github.io/website/column/RLHF_DPO_column_v1.pdf

https://akifumi-wachi-4.github.io/website/column/RLHF_DPO_column_v2.pdf

https://akifumi-wachi-4.github.io/website/column/RLHF_DPO_column_v3.pdf

https://akifumi-wachi-4.github.io/website/column/RLHF_DPO_column_v4.pdf
vue tableau v3 simple

```
<template>
  <div>
    <div>
      <tableau-viz
        id="tableauViz"
      ></tableau-viz>
    </div>
  </div>
</template>

<script>
import { TableauEventType } from '@tableau/embedding-api';
export default {
  name: "TableauVizComponent",
  data() {return {};},
  methods: {
    async handleFirstInteractive() {
      console.log("---handleFirstInteractive---");
    },
    async handleTabSwitch() {
      console.log("---handleTabSwitch---");
    },
    addEventListeners() {
      console.log('----------')
      const tableauViz = this.$el.querySelector("#tableauViz");
      tableauViz.addEventListener(TableauEventType.FirstInteractive, this.handleFirstInteractive);
      tableauViz.addEventListener(TableauEventType.TabSwitched, this.handleTabSwitch);
    },
  },
  mounted() {
    const tableauViz = this.$el.querySelector("#tableauViz");
    tableauViz.src = "https://public.tableau.com/views/RegionalSampleWorkbook/Flights";
    this.addEventListeners();
  },
};
</script>

```
[MySQL]1～XXまでの連番を生成したい

# 普通にrow_number()つかえよ
いやいや、世の中にはrow_numberだけで解決できない情報もあるのよ。。。

# 例えば、以下みたいな問い合わせがあったとして。。。
問い合わせ日と区分と内容がカラムとしてある問い合わせテーブルがあったとして、
◯日～◯日までの集計結果が出したい【ただし、日付の抜けは無しで】

当然、問い合わせが毎日来てるような、ステキなシステムなら単純にSELECTしてあげればいいですが、
土日は絶対来ないとかそもそもそんな使われてないので問い合わせなんか全然来ないみたいなシステムの時に、
【対象期間の全日付を出すって何だよ？？】みたいな感じになるかと。。。

# そんな時に役に立つのが【コロン】ですよ
要は変数を使うということですね。
※前提条件として、レコードがある程度有るテーブルを用意する必要があります（少なくともほしい連番数分ぐらい

# 連番を取ってくるSQL
まずは連番（0️～）を取ってくるやつ
```sql:連番、ゲットだぜ
select
  test.num 
from
  ( 
    select
      0 as num -- 開始番号
    from
      dual 
    where
      @num := -1 -- 開始番号 -1したやつ
    union 
    select
      @num := @num + 1 as num 
    from
      `information_schema`.columns -- ここにレコードの多いテーブルを指定
    where
      @num < 20 -- ここの数字を連番の最後の番号にする（コレだと0～20まで）
  ) test
```
＠numって変数を最初のSQLで生成して、unionしたSQLで＠numをインクリしていくような感じです。
インクリするためにレコードがある程度入ってるテーブルが必要なので、
今回はスキーマ情報が入ってるシステムテーブルを使って取得しました。



## 派生させて〇〇日～〇〇日まで
開始日から終了日までの連番を取得して、その結果をdate_addでドンドン足していくよ
```sql:日付レコード生成だぜ
select
  date_add(str_to_date('20240101', '%Y%m%d'), interval test.num day) -- 開始日
from
  ( 
    select
      0 as num 
    from
      dual 
    where
      @num := -1 
    union 
    select
      @num := @num + 1 as num 
    from
      `information_schema`.columns 
    where
      date_add(str_to_date('20240101', '%Y%m%d'), interval @num day) < -- 開始日
      str_to_date('20240705', '%Y%m%d')                                -- 終了日
  ) test
```
A5M2の結果ではこんな感じに出るよ
![スクリーンショット 2024-07-05 180133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/066df912-949d-668c-4985-8ecc067273fa.png)

# 他に何に使える？
パッと思いついたやつだと、
番号を持つテーブルのデータを物理削除していた場合に、何番のデータが存在しないの？とかの抜け番探しとかに使えるかもね。
EC2上でnginx-proxy-managerを使ってexpressアプリケーションをデプロイした件について

# 前置き
今回はEC2でwebアプリケーションをデプロイするにあたってnginxを入れて対応しようと思いました。
しかし、confファイルの書き方が良くわからず、悪戦苦闘、、、
そのときにnginx-proxy-managerという存在を知りましたので、使ってみようと思います。
クラウドサービスが普及してきた今、例えばAWSではロードバランサーがあるため必要ない技術のように感じるnginxですが、どうなんですかね。
GPTくんと一緒に作成していきます。

# ymlファイルの作成
今回はexpressを用いたwebアプリケーションをデプロイするため、expressのコンテナも書いておきます。

```yml:docker-compose.yml
version: '3.9'
services:
  express:
    image: express
    container_name: express
    build:
      context: .
      dockerfile: ./container/nodejs/Dockerfile
    volumes:
      - ./express:/app
    ports:
      - "8000:8000"
    command: yarn start
    tty: true

  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    ports:
      - '80:80'    # HTTP
      - '81:81'    # Nginx Proxy Manager UI
      - '443:443'  # HTTPS
    environment:
      DB_SQLITE_FILE: '/data/database.sqlite'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
```

こいつで下記コマンドビルドします。
```shell
docker compose up -d
```

EC2のセキュリティーグループのポートを開けるのも忘れずに、、、！
0.0.0.0/0はやめましょうね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833494/83be284a-d95d-3ade-3741-8a06af2d76ba.png)



# nginx-proxy-manager

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833494/b22fd604-749b-5e42-1e06-c9508915f9c8.png)

以下のdefaultのアイパスなので入力
Email: admin@example.com
Password: changeme
そのあとに自分の情報を入力しましょう

ここに入力、expressは8000で開けているのでPortは8000にする

# expressへの実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833494/53492d96-903b-995f-6400-ed3bfcc0e3c1.png)

saveしたら完成！
すごく簡単にデプロイできました！
PostgreSQL: スキーマ内のテーブルのデータを総て削除

## プログラム

```py:truncate_tables.py
#! /usr/bin/python
#
#	truncate_tables.py
#
#				Jul/11/2024
#
# --------------------------------------------------------
import os
import sys
import psycopg2
from dotenv import load_dotenv
#
# --------------------------------------------------------
def get_tables_proc(cursor_aa,schema):
	sql_str = "select table_name from information_schema.tables where table_schema = '" + schema + "'"
	cursor_aa.execute(sql_str)
#	print(sql_str)
	rows = cursor_aa.fetchall()
#	print(rows)
	array_aa = []
	for row in rows:
		array_aa.append(row[0])
#
	return array_aa
# --------------------------------------------------------
def truncate_table(cursor_aa,schema_in,table_in):
	sql_str = "truncate " + schema_in + "." + table_in
	print(sql_str)
	cursor_aa.execute(sql_str)
# --------------------------------------------------------
# sys.stderr.write ("*** 開始 ***\n")
schema_in = sys.argv[1]

dotenv_path = '.env'
load_dotenv(dotenv_path)
USER=os.environ.get("user")
PASSWORD=os.environ.get("password")
DATA_BASE=os.environ.get("data_base")
#
dsn="dbname=" + DATA_BASE + " user=" + USER + " password=" + PASSWORD
conn = psycopg2.connect(dsn)
cursor_aa = conn.cursor()
#
tables = get_tables_proc(cursor_aa,schema_in)
print(len(tables))
# print(tables)
for table in tables:
	truncate_table(cursor_aa,schema_in,table)
#
conn.commit ()
cursor_aa.close ()
conn.close ()
#
# sys.stderr.write ("*** 終了 ***\n")
#
# --------------------------------------------------------
```

```text.env
user='scott'
password='***'
data_base='****'
```

## 実行方法

```bash
./truncate_tables.py sch001
```
ワーシャル・フロイド法の解説

 ワーシャル・フロイド法の主にループの順番にややこしさを感じたので, 整理もかねて, 本稿ではワーシャル・フロイド法について解説していきます.
 
## ワーシャル・フロイド法とは
$n$頂点有向グラフ$G$の全頂点間の最短路の長さを調べるアルゴリズムです.
Pythonで書くと以下のようになります.
```python
for k in range(n):
    for i in range(n):
        for j in range(n):
            dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
```
## 解説
特徴的なのは変数の順番でしょう. 始点$i$, 終点$j$, 経由点$k$からなる三重ループとなっていて, $k$のループが一番最初に来ているのが特徴的です. 
$k$が最後に変動するので, `dist[i][j]`には$\\{ 1, 2, 3, ..., k-1 \\}$の経由点のみを通過していい場合のときの$i$から$j$までの最短路の長さ, `dist[i][k] + dist[j][k]`は$i$から$k$を通り, $j$にまで行くときの最短路の長さとなっています. 後者においても経由点は$\\{1, 2, 3, ..., k-1\\}$までに限定されています. 
よって, この両者のうち小さいほうであるminは$i$から$j$まで, $\\{1, 2, 3, ..., k\\}$の経由点のみを通過していい場合の最短路の長さとなります.

## 変数の順番を変えたとき
```python
for i in range(n):
    for j in range(n):
        for k in range(n):
            dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
```
こちらのほうが変数の順番が自然に見えます. しかし, これで実行しても正しい最短路の長さが求まりません. 
### 理由
コードを以下のように書き直すとわかりやすいかもしれません.
```python
for i in range(n):
    for j in range(n):
        dist[i][j] = min(dist[i][k] + dist[k][j] for k in range(n))
```
すなわち, $i$と$j$の間の最短路はすべての経由点について調べて, その最も短いものとなるものが最短路の長さとなると言っています.
正しく求められた$dist$の上では, 確かにこの主張は正しいといえます. しかし, 今回のコードでは, `k > j`となるような$k$においてはまだ$dist[i][k]$が正しく求められていない状態にあります. もしこのような$k$が最短路に含まれる頂点の一つであったならば, 最短路は正しく求められないでしょう.
一方で, 正しいワーシャル・フロイド法のアルゴリズムについてみてみると, `dist[i][k]`, `dist[k][j]`のどちらについても, 確かに$\\{1, 2, 3, ..., k-1\\}$のみしか経由点としていないことが保証されるので, こちらが正しく作用すると言えます.

## 経路復元
二重リスト`prev`を用意し, $prev[from][to] = k$であるならば, $from \rightarrow ... \rightarrow k \rightarrow to$が最短路となるようにします. `dist[i][j]`を更新するタイミングで`prev`も更新します.
``` python
for k in range(n):
    for i in range(n):
        for j in range(n):
            if dist[i][k] + dist[k][j] < dist[i][j]:
                dist[i][j] = dist[i][k] + dist[k][j]
                prev[i][j] = prev[k][j]
```
実際経路が必要となったときはこの二重リストを逆にたどれば求められるでしょう.

## 終わりに
大学のグループワークで使うことになったので, 誰かに聞かれても説明できるようにと思って書きました. 変数の順番とかすっきりしたのでよかったです.
最近はRustばっか書いてますが, こうしたときにPythonは疑似コードとしても使えるので重宝しています.
【2024年7月】Proxmox Backup Server で subscription なしに apt update する方法【no-subscription】

# はじめに

Proxmox Backup Server をインストールしたけど、`apt update` できない。。。

Failed 401 Unauthorized になる。。。

# 結論

Enterprise の Subscription なしに `apt update` しているからです。
Subscription を登録するか、 `no-subscription` の設定に変更しましょう。

# 環境

Proxmox Backup Server 3.2-2

# やりかた

vimやnanoで、`/etc/apt/sources.list.d/pbs-enterprise.list` を以下のように編集します。

```/etc/apt/sources.list.d/pbs-enterprise.list
#deb http://download.proxmox.com/debian/pbs bookworm pbs-enterprise
deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription
```

編集後、`apt update` すると成功します。

# さいごに

かんたんでしたね

# 参考リンク

[Proxmox Backup Server No Subscription Update Repository](https://www.thomas-krenn.com/de/wiki/Proxmox_Backup_Server_No_Subscription_Update_Repository)
ECMAScriptを読む 第4部 Overview【JavaScript】

# はじめに

https://tc39.es/ecma262/multipage/overview.html#sec-overview

> This section contains a non-normative overview of the ECMAScript language.

Overview・・・和訳すると「概要」ですが、
ここでは "non-normative" ・・・「非規範的な」ものについて書かれているようです。

# non-normative とは

"non-normative" ・・・「非規範的な」とは、何のことでしょうか？

> ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a [host environment](https://tc39.es/ecma262/multipage/overview.html#host-environment). ECMAScript as defined here is not intended to be computationally self-sufficient; indeed, there are no provisions in this specification for input of external data or output of computed results. Instead, it is expected that the computational environment of an ECMAScript program will provide not only the objects and other facilities described in this specification but also certain environment-specific objects, whose description and behaviour are beyond the scope of this specification except to indicate that they may provide certain properties that can be accessed and certain functions that can be called from an ECMAScript program.

ECMAScriptは、計算処理を行うための言語です。
その実行のためには、例えば外部ファイルを読み込んだり、DOM操作をしたり・・・といった機能が必要です。

これらの機能は「ホスト環境」つまりNode.jsや各種ブラウザによって実装が変わります。

「非規範的な」とは、これらの「ホスト環境」によって実装が変わるもの・・・標準化できないものを指してるんですね。サーバーからフロントエンド、幅広く使用されるJavaScriptならではですね。

## ホスト環境によって変わるものの例

https://tc39.es/ecma262/multipage/host-layering-points.html#sec-host-layering-points

いくつかピックアップしてみましょう。

- Host-defined Objects
  - global object：ブラウザの`window`オブジェクトやNode.jsの`global`オブジェクトが該当

- Any built-in objects and methods not defined within this specification
  - 各ホスト環境独自の組み込みオブジェクトやメソッド
    ブラウザの`fetch`やNode.jsの`require`

- HostCallJobCallback
  - ジョブのコールバック関数を呼び出すためのとっかかり
    ブラウザの`setTimeout`など

# おわりに

短いですが、いったんこれにて締めさせていただきます。
ECMAScriptを読むにあたって正体不明だった「ホスト環境」のイメージを掴むことが目的なので。

続きも書く予定です。