OmniAICreator/Qiita-1.07M huggingface dataset:
SvelteKitのルーティングとローディング

# SvelteKitの役割
1. ルーティング
1. ローディング
1. レンダリング
# ルーティング
`src/routes`ディレクトリ内に新規ディレクトリと、**+page.svelte**ファイルを作ると新しいページが作成される。
ディレクトリ名がそのままページのパスになる。
![Group 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/826688fc-7ad1-8af1-99ac-2a333ad4b959.png)
例えば上記の場合、`/`のほか、`/about`、`/edit`というページが存在する。

## パスをidに応じて変えたい
たとえば、商品詳細ページで、商品カテゴリごとにパスを変えたい場合
（products/pastaや、products/breadみたいな）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/eef7b125-7fb7-9329-3efe-8c4a5e695636.png)
`[]`をつかう。
```html
<li>
	<a href="products/bread">パン</a>
</li>
<li>
	<a href="products/pasta">パスタ</a>
</li>
```
他のページからリンクできる。
# 共通パーツ
ヘッダーやフッターなどの、共通したコンテンツを表示したい場合、`src/routes`ディレクトリ直下に`+layout.svelte`ファイルを作成して、ここに共通パーツを入れておく。
共通のcssやJavaScriptはここで読むと良い。

:::note warn
`<slot />`を忘れるとコンテンツが表示されなくなってしまうので注意
:::

```:src/routes+layout.svelte
<script>
	import '../app.css';
</script>

<slot />
```
routes直下の+layout.svelteファイルは全ページで適用される（サブディレクトリ内のものにも適用）。

ページごとに特定のレイアウトを適用したい場合は、サブディレクトリ内にも+layout.svelteファイルを作成することができる。
サブディレクトリ内のレイアウト設定は、親ディレクトリには影響しない。
# ローディング
各ページ用のディレクトリに`+page.server.js`を作成する。
## load関数
load関数は**サーバーサイド**で、ページにアクセスするたびに実行される。
クライアントサイドにJavaScriptが読まれる前にデータを取得できる。
サーバーサイドでフェッチ→データを確認→クライアントサイドにデータを渡す
ができるようになる。
## 実際に使ってみる
サーバーサイドでランダムな整数を作る処理を作成
```js:+page.server.ts
// minとmaxの間でランダムな整数を返す関数
const random = (min: number, max: number) => {
	return Math.floor(Math.random() * (max - min + 1)) + min;
};

// load関数は非同期である必要がある
export async function load() {
	// ランダムな数を生成
	const randomNumber = random(1, 151);
	// 生成された数をpropsとして返す
	return {
		props: {
			randomNumber
		}
	};
}
```

## クライアントサイドで受け取る
`+page.server.ts`で渡したデータは、`data`に入っている。
`export let data;`で受け取ることができる
```html:+page.svelte
<script>
	export let data;
	console.log(JSON.stringify({ data }, null, 2));
</script>
```
▼ 受け取ったdata
```:console
{
  "data": {
    "props": {
      "randomNumber": 64
    }
  }
}
```
`+page.server.js`のデータは、同じディレクトリ内でしか利用できないが、`+layout.server.js`に書くと、そのディレクトリ下すべてで使える様になる。

# いろんなファイルまとめ
たくさん似たような名前のファイルが出てきましたね。。。
| ファイル | 説明 |
|:-:|:-:|
|  +page.svelte | クライアントサイドで表示されるページを定義できる |
| +page.server.js  |  同じディレクトリ内で定義したページが表示されるときにサーバーサイドで毎回実行される | 
| +layout.svelte  |  サブディレクトリも含めたレイアウトを定義できる | +layout.server.js  | サブディレクトリでも使えるデータをロードしておくことができる  |
| src/lib  | このディレクトリは、すべてのルートからアクセスできる場所で、複数の場所からコードが使われる場合はここにファイルを置く。<br/>`$lib`でアクセス可能になる。例→`'$lib/images/svelte-logo.svg';`  |
【ハンズオン】POSTGRES-WASMを触ってみる。

## はじめに
表題通り、「POSTGRES-WASM」を触っていきます。つい最近、indexedDBを利用する機会があったんですが、Filter機能、Sort機能共に利用しづらいというのが正直な感想でした。ObjectStoreのため、RDBと比べると痒い所に手が届かずきめの細かいシステムには向かないなという印象でした。最近、SQLiteやPostgresがWebAssemblyで利用できるとのことだったので、ちょっと触ってみました。

## ハンズオン
まずはイメージを掴むところから。

https://github.com/snaplet/postgres-wasm

上記`github Repository`をcloneし動かす。

![スクリーンショット 2023-07-22 15.22.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/fff5c308-b56d-a76a-7459-78741e1dfb63.png)

![スクリーンショット 2023-07-22 15.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/28805c17-b919-3b89-03cc-22d4af750e26.png)

確かにWeb上で動いている様だ。

## Web-Assemblyとは
Webブラウザ上でプログラムを高速に動かすための「ブラウザ上で動くバイナリコード」です。
活用事例的には、AmazonPrimeVideoやFigma等で利用されているようです。意外と身近で使われているんですね。

https://www.amazon.science/blog/how-prime-video-updates-its-app-for-more-than-8-000-device-types

https://www.figma.com/ja/blog/webassembly-cut-figmas-load-time-by-3x/

## POSTGRES-WASMとは
Supabaseが中心となりOSS化に向けて動いています。RDBのWeb-AssemblyではSQLiteが有名でしたが、POSTGRESも開発ができているようです。普段サーバがPOSTGRESという人も多いと思うので、これは朗報ですね。

https://www.publickey1.jp/blog/22/sqlitewebassemblysqlite3_wasmjs.html

https://supabase.com/blog/postgres-wasm
_VariadicView を使ったアプリをリリースした話

# はじめに
_VariadicView のリジェクト事例、検索してみるとほとんど引っかからないですよね。

ちなみにググった中で一番明確に審査について言及していたのは[こちら](https://www.reddit.com/r/SwiftUI/comments/z2i02d/introducing_engine_a_powerful_swiftui_framework/)でした。

>Yes apps will be approved. It just means they are not part of the documented public API which means they could change without any deprication warning. But _VariadicView is commonly used in SwiftUI, such as in VStack/HStack (See the .swiftinterface of SwiftUI) so it is quite safe to use.

でも、ここでも「審査に通った」と明言しているわけではないんですよね :thinking:
本当に大丈夫なのかな？とずっと疑問でした。

というわけで試しに個人開発アプリで申請してみました💪


# 結果

なんと無事通りました🎉🎉🎉
意外といけるものですね。

:::note alert
プライベート API を使用する場合、リジェクトされる可能性は常にあります。
この記事は審査が通ることを確約しているわけではないということはご承知おきください。
:::

ちなみに業務で開発しているアプリは当たり前ですがリスクが大きすぎるので諦めました。

使おうか迷っている人の参考になれば幸いです :bow: 


# _VariadicView を知らない人向け

_VariadicView は SwiftUI の内部で使用されているプライベート API です。
ViewBuilder のスコープに含まれる複数の子 View を取り出すことができます。

- リストの行と行の間にセパレータを表示したい
- 最後の行にはセパレータを表示したくない

みたいな時に使うと便利です。

ちなみに、_VariadicView を使うと List もどき (UITableView ベースの一覧コンポーネント) も作ることができます。
UITableView の機能が欲しいけど List だとカスタマイズできなくて微妙　みたいな時に欲しくなるやつです。
Slack WorkflowからSheetsにSlack URLを入れる方法

SlackのWorkflowを使って他部署からのお問い合わせフォームを作ることがよくあります。

![スクリーンショット 2023-11-28 19.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/7223a4cb-1923-c1b5-c326-262cb01e88ee.png)

この時にGoogle Sheetsと連携させて問い合わせ内容を集約すると便利です。
![スクリーンショット 2023-11-28 19.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/b7a8add4-5fb5-68d8-831a-8b4f0c7e5b78.png)

問い合わせがあった時刻や、問い合わせ内容や、問い合わせた人などはシートに出力できますが、問い合わせのやり取りをしているURLはSlack Workflowの機能では出力できないです。
そのため、頑張ってURLを作ってみます。

# Slack URLの構造
まず、Slack URLを眺めることで、以下のような構造であることがわかります。

```
https://<Workspace名>.slack.com/archives/<チャンネルID>/p<UNIX timestampをusで表記したもの>
```

Workspace名やチャンネルIDはチャンネル毎に固定値を埋め込めばよいので、最終パラメータのUNIX timestampをいい感じに生成できれば良さそうです。
Workflowが起動したタイミングは上のスクショで分かるように簡単に取得できるので、生成してみます。

# UNIX timestampを生成
ちょうどよい関数がなかったので、AppScriptで関数を作成します。Extensions　→ AppsScriptからエディタ画面を開いて、以下の関数を保存します。

![スクリーンショット 2023-11-28 19.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/a621b62a-a7f7-78ec-733f-46e55ef5fd11.png)

```js
function to_unixtime(utc_str){
  jst_format = Utilities.formatDate(new Date(utc_str), "GMT+0900", "dd MMM yyyy HH:mm:ss z")
  unix_time = Date.parse(jst_format)/1000
  return unix_time
}
```

そして、ここに以下の数式を入力します。

```
=CONCAT(CONCAT("https://<Workspace名>.slack.com/archives/<チャンネルID>/p",to_unixtime(CONCAT(OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())), 0, -2),"Z"))),"000000")
```

![スクリーンショット_2023-11-28_20_00_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/186820ba-41f7-211e-e232-cc6e7f5597e3.png)

`OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())), 0, -2)` という呪文の正体は以下の記事を参照ください。

https://qiita.com/shiozaki/items/dd9ac6d5971e577fbde1

これで、「概ね」問い合わせのあった場所に飛べるURLを生成できました。
「概ね」という表現をしているのは秒未満の情報を取得出来ないのでその部分を `000000` にしているためです。
Slackの仕様（？）では、その時刻に送られたメッセージがなくても、概ねその近くの場所に飛んでくれるようです。


# 記事書いた後に気づいたこと
SlackのWorkflow機能が新しくなり、標準機能でできるようになっていました。この記事に書かれているような面倒なことをしなくても良くなったので、良かったですね！

![スクリーンショット 2023-11-28 19.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/038fed17-c3c5-a982-696c-f6546461ce48.png)


![スクリーンショット_2023-11-28_20_07_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/da8f4955-817f-0609-b862-855ea036433a.png)
Cookie の HttpOnly 属性について勘違いしていたこと

追記
コメントありがとうございます、ご指摘を参考に読みやすくなるように修正しました！

# はじめに
(本記事は初歩的な内容ですが、少なくとも僕は引っかかったので記事化したものです)

[Cookie](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies) に HttpOnly という属性があります。
この HttpOnly を設定することで JavaScript からの直接の参照・操作を禁止することによって、XSS などの手法によって悪意のある第三者から Cookie の内容を見られるのを防止することができます。

ここまでは多くの記事に書いてあるのですが、私は一点ずっと勘違いしていました。

### いや、直接値を読み取れないってだけで、API呼び出しとかの時に使えないってわけじゃないんかーーーーーーーーーーい！！！

いや、まあそれすらできなかったら何のための Cookie なんですかという話なのでそりゃそうなんですが...

ということで見ていきます。

# 実装例(Nuxt3)と出力
まず、次のコードで HttpOnly の Cookie をサーバーサイドで付与します。
```typescript:serverside_Login
...

const tokenStr : string = uuidv4();

const expiresIn = 60 * 60 * 24 * 5 * 1000;
const options = {
  httpOnly: true,
  //secure: true,
  maxAge: expiresIn,
};

// Cookie 付与
setCookie(event, 'loginToken', tokenStr, options);

...
```

次に、この付与してもらった Cookie を以下のコードでフロント側で Console.log で見てみましょう。

```javascript:frontend(script)
...

const loginToken = useCookie('loginToken');
console.log(loginToken.value)

...
```

##### ブラウザの検証から見た console.log(loginToken.value) の結果
見えないですね！
![スクリーンショット 2023-11-28 19.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629296/48933c16-b269-aa11-f2ab-407b56772ddc.png)

---

では、このコードに次のような「値を受け取り、それが null や undefind であるかの結果を返す」API に対してフロント側から Cookie の値を送ってみましょう。

```typescript:serverside_Verify
...

interface IRequestBody {
  loginToken: string | null | undefined;
}

export default defineEventHandler(async (event) => { 
  console.log("POST /api/users/tokenLogin");

  const { loginToken } = await readBody<IRequestBody>(event);
  if(loginToken === null || loginToken === undefined){
      return {
        status: "error",
        message: "False login.",
    };
  }

  console.log(`token login success ${loginToken}`);
  
...
```

```javascript:frontend(script)
...

const loginToken = useCookie('loginToken');
console.log(loginToken.value)

const {data, status} = await useLazyFetch('/api/users/tokenLogin', {
    method: "POST",
    body: JSON.stringify({
        loginToken: loginToken.value
    })
});

...
```

##### Verify時の出力
ちゃんと渡された値が取れてるのがわかりますね！
![スクリーンショット 2023-11-28 19.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629296/264ecb22-116f-cb85-bcb7-2d31d4d67f1a.png)

# まとめ
目に見えるものが真実とは限らない！(ゴミまとめ)
コードエディタ Cursorをターミナルから起動する方法。cursor .


AIを活用したコードエディタ Cursor
流行ってますね。

ターミナルからVisual Studio Codeは `code .`で開けますが
Cursorも同じ様に開きたいと思い、調べたら参照元と同じ方法で行けました。

## Macでコードエディタ Cursorをターミナルから起動する方法。

1. Command + Shift + Pでコマンドパレット開く。
2. Shellで検索
3. インストール

<img width="400" alt="cursor" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8691/8eb050a7-972d-03b2-3509-cf942222bef7.jpeg">

## サンプル
起動
```bash
cursor
```

カレントディレクトリをプロジェクトとして開いて起動
```bash
cursor .
```

```pagesディレクトリ内のhoge.tsxを開く
cursor pages/hoge.tsx
```

参考
https://qiita.com/naru0504/items/c2ed8869ffbf7682cf5c

CUI版も出してください><
Reactアプリ100本ノックやってみた 「02 Counter」

# はじめに
フロントエンドに苦手意識のある私が、@Sicut_studyさんの【Reactアプリ100本ノック】をやってみました。
変なところがあれば教えていただきたいです。


今回の課題

https://qiita.com/Sicut_study/items/82059f9cbb5b2996e5b3

# やってみる
```App.tsx
import { Box, Button } from "@mui/material";
import { useState } from "react";



const App = () => {
  const [count, setcount] = useState(0);

  return (
    <div>
      <Box>{count}</Box>
      <Button variant="contained" onClick={()=>setcount(count + 1)}>+</Button>
      <Button variant="contained" onClick={()=>setcount(count - 1)}>-</Button>
    </div>
  );
};

export default App;
```



# 完成
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621123/f59193bb-65c3-286e-f0a8-a248fa691562.gif)




# おわりに
useState()を使用したことが過去にあったので苦戦しませんでした。次のお題は難しそうですが頑張ります。。
【Laravel勉強中】MAMPにLaravel環境を構築してみる


# はじめに
今回は、DokerではなくMAMPにLaravel環境を構築してみる。


# 事前準備
今回Laravel環境を構築するディレクトリをMAMPフォルダ内に作成する。

```
cd /Applications/MAMP/htdocs/
mkdir test-app
cd test-app
```

# Composerをインストール
ComposerはPHPのパッケージ管理ツールで、必要なものをいろいろインストールしたり環境構築するときに使う。
作業ディレクトリに移動したらComposerの公式サイトのコードをコピペして実行する。

https://getcomposer.org/download/

**注意**
必ず公式サイトのコードをコピーすること（ネットに落ちてるやつは最新じゃない可能性あり）
 
```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

このままだとインストールしたディレクトリでしかcomposerが使えないので、global（どこのディレクトリでも使える）で使えるようにする。
ダウンロードされたcomposer.pharを/usr/local/bin/composerに置くだけ。
```
mv composer.phar /usr/local/bin/composer
```

composerでLaravelアプリを作成する。

```
composer create-project --prefer-dist laravel/laravel 
```

localhostへアクセスしてスタートページが立ち上がったらOK！
http://localhost:8000/
SQLの基礎：WHEREとHAVINGの使い分けについて

# はじめに
同じような機能を持っているけど使い分けをしっかりしていく必要があるWHERE句とHAVING句の使い分け方についてまとめてみました。

# 結論
結論からいうと、
WHERE句はテーブルにある行に対して「ある列の値がこの数値以上」などといった条件を指定し、HAVING句は集約関数などを使って集約したテーブルのデータに対しての条件を指定します。
つまり、WHERE句には「行に対する指定」 
HAVING句には「グループに対する指定」
を行うというのが原則になります。
ここでいう「グループ」とは集約関数などによって集約された行の集まりという意味です。
つまり
WHERE句は「集約前のデータに対する指定」
HAVING句は「集約後のデータに対する指定」
に適用されます。
# 具体例
### WHERE句の例
シナリオ: 社員データベースに、各社員の部署と給与が記録されています。部署ごとに給与が50,000円以上の社員のみを選択したい場合。

```sql:SQL
SELECT 部署, 名前, 給与
FROM 社員
WHERE 給与 >= 50000;
```
このクエリでは、WHERE句を使用して、給与が50,000円以上の各社員のデータを選択しています。WHERE句は各行に個別に適用され、指定された条件に一致する行のみが結果に含まれます。

### HAVING句の例
シナリオ: 同じ社員データベースを使用し、部署ごとに平均給与が60,000円以上の部署のみを選択したい場合

```sql:SQL
SELECT 部署, AVG(給与) as 平均給与
FROM 社員
GROUP BY 部署
HAVING AVG(給与) >= 60000;
```
このクエリでは、まず社員を部署ごとにグループ化し、それぞれの平均給与を計算しています。HAVING句は、これらのグループに適用され、平均給与が60,000円以上の部署のみを結果として表示します。HAVING句は集約後のデータに対して条件を適用するために使用されます。



# どちらにも書ける要素
集約キー(GROUP BY句で指定された列)に対する条件はHAVING句とWHERE句のどちらにも書くことができ、どちらに書いても同じ機能を持ちます。しかしながら集約キーに対する条件はWHERE句に書くべきであるという考え方があります。理由は２つあります。
1. 集約キーに対する条件は「行に対する指定」なのでWHERE文に書くべき
2. WHERE文に書いた方が処理速度が速くなる

1に関しては前述の役割の違いが理由です。

2に関してはまず、COUNT関数などの集約関数はテーブルのデータに対してソートをしていますが、このソート処理は比較的重い処理になります。WHERE句でデータに対して先にフィルタリングをしてあげると、処理が行われるデータ量が減少し、結果として集約処理が速くなります。

# まとめ
・WHERE句は「行に対する条件」を書く
・HAVING句は「グループに対する条件」を書く
・集約キーに対する条件はWHERE句に書く

# 参考にしたもの
・[翔泳社　「SQL 第2版　ゼロからはじめるデータベース操作」](https://www.seshop.com/product/detail/19054)
bluestacksの.vhd(x)ファイルをマウントする

## 概要
大した内容ではないです
windowsのGUI上でできるマウントの機能ではできなかったのと、調べ方が悪くて変に時間を取ったのでメモ

## やり方
1. WSL上にマウントする方法
    この方法だとMicrosoft Storeから入手したWSLである必要があるみたいです[^1]

    ```shell
    wsl --mount /path/to/vhdfile --name android --vhd --partition 1
    ```

    <br>

2. Windows上にmountする方法(wslを使わない方法)
    まず以下をPowerShellで実行します
    bing aiに書いてもらっただけなのでスクリプトの内容は理解してないです
    ```PowerShell
    $vhdxPath = "\path\to\vhdfile"
    $driveLetter = "X"
    
    Mount-DiskImage -ImagePath $vhdxPath
    $disk = (Get-DiskImage -ImagePath $vhdxPath | Get-Disk)
    $partition = ($disk | Get-Partition | Where-Object PartitionNumber -eq 1)
    $partition | Set-Partition -NewDriveLetter $driveLetter
    ```
    
    マウントしてもwindowsはext4のファイルシステムを扱えないので、そのままでは中身を見れません
    ext2fsdなどを使う必要がありますが、ここではやり方は省略します

## その他
Mount-VHDを使ってマウントする方法もあるみたいですが、こちらはwindows homeでは対応していないみたいです
Windows 11 Homeであれば非公式(?)でインストールする方法はあるみたいです
[https://qiita.com/masatonasou/items/7c5ca7be6f6b519f3d4b](https://qiita.com/masatonasou/items/7c5ca7be6f6b519f3d4b)

[^1]: [https://qiita.com/tamanobi/items/2883b8fbcee84a17a462](https://qiita.com/tamanobi/items/2883b8fbcee84a17a462)
vMotionについて

## はじめに
この投稿はアイスタイル Advent Calendar 2023の16日目の記事です。


アイスタイルでインフラ業務をやっている片桐です。

アイスタイルでは、主にAWSを使用したオートスケール環境でシステムが運用されていますが、まだ一部のシステムはオンプレミス環境で動作しています。
今回はオンプレミス環境で稼働しているサーバーが、物理サーバ間で移設する際に利用している「vMotion」についてお話させていただこうと思います。


## vMotionって何？
VMware vSphere3.5以降の機能で、仮想環境上で稼働中のOSやユーザセッションを停止させることなく、複数の物理サーバ間で仮想マシンを移動させる機能です。 
この機能により、システムを停止させる事なく物理サーバをメンテナンスすることが可能になります。

本番環境など稼働している仮想マシンの移設の場合、連携している他の仮想マシンにエラー通知されてしまうなどの影響があることから、なるべく仮想マシンのシャットダウンはしたくないところだと思います。
vMotionを初めて知ったとき、仮想マシンを停止せずに物理サーバ間で移設できることが便利だと感じました。
便利ではありますが、何でも移設できるというわけではありません。



## vMotionで仮想マシンの要件および注意事項

vMotion を使用して仮想マシンを移行するには、様々な条件を満たしている必要があります。
いくつか紹介します。

* ソースとターゲットの管理ネットワーク IP アドレス ファミリが一致する必要があります。
　移設先に同じアドレス帯の設定が無いと移設できません。
　（移設メニュー選択時の互換性チェックで警告が出ます）
* 冗長構成を組む場合には同一の筐体への仮想マシンの移設は推奨できません。
　せっかく冗長構成を組んでも、筐体が故障した場合に一度に故障となるので別筐体が望ましいです。
* 仮想マシンが、クライアント コンピューターのデバイスで補助されている仮想デバイスを使用している場合、vMotion で移行することはできません。
　（仮想マシンのCD/DVDのドライブが接続されていると移設メニュー選択時の互換性チェックで警告が出ます）

自分でvMotionを操作してみて引っかかった箇所は上記になります。
このほかにも以下のような要件、制限事項があるようです。
今後、新たに移設先の物理サーバを用意する際にはこれらの要件も気にするようにしたいと思います。

* vMotion ネットワークに 1 GbE ネットワーク アダプタを使用すると、vGPU プロファイルが大きい仮想マシンを移行する場合に移行に失敗することがあります。
* 仮想 CPU パフォーマンス カウンタが有効になっている場合、移行できるのは、互換性のある CPU パフォーマンス カウンタを持つホストのみです。
* vMotion は、ターゲット ホストからアクセスできないデバイスで補助されている仮想デバイスを使う仮想マシンの移行には使用できません。
* 特定のネットワーク、ホスト、およびデータストアのリソース コストで、複数の仮想マシンを同時に移行できます。




## vMotionはどんな処理をしているのか？
vMotionでの移行は次の3段階の処理で実行されます。

1. vMotion での移行が要求されると、vCenter Server は既存の仮想マシンが現在のホストで安定状態にあることを確認します。
2. 仮想マシンの状態情報 （メモリ、レジスタ、ネットワーク接続） がターゲット ホストにコピーされます。
3. 新しいホスト上で仮想マシンがアクティビティをレジュームします。
※移行中にエラーが発生した場合、仮想マシンは元の状態および場所に戻されます。

移設元の仮想マシンのメモリやシステム状態すべてを移設先の仮想マシンにコピーし、移設先の仮想マシンでレジュームしているんですね。



## vMotionを扱ってみて
これまでの自分の経験上、稼働しているサービスを停止することなくサーバを移設するには冗長化した環境で、縮退運転にした状態でサーバを移設するのが当たり前だと思っていました。
vMotionできる条件さえ整えておけば特に難しい操作を必要とせず、移設したい仮想マシンと移設先サーバを選択することで無停止で移設できるのは利便性が高いと思いました。
実際に移設作業を行った際、本当に通信断が発生していないか？pingコマンドで通信断がないか確認しましたが、途切れることはありませんでした。



## 最後に
vMotionについて簡単ではありますが書き綴ってみました。
興味を惹く内容であれば幸いです。


## 参考
[vmware vMotionでの移行](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vcenterhost.doc/GUID-D19EA1CB-5222-49F9-A002-4F8692B92D63.html)
[vmware vMotionの仮想マシンの要件および制限事項](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vcenterhost.doc/GUID-0540DF43-9963-4AF9-A4DB-254414DC00DA.html)
[NETWORLD vMotion](https://www.networld.co.jp/product/vmware/pro_info/vsphere/function.html)
Workato：関数で日付計算する

# 日の計算
## 現在日時から1日前

```ruby
(now - 1.day).in_time_zone("Asia/Tokyo")
```
または

```ruby
1.day.ago.in_time_zone("Asia/Tokyo")
```

## 現在日時から2日前

```ruby
(now - 2.days).in_time_zone("Asia/Tokyo")
```
または

```ruby
2.days.ago.in_time_zone("Asia/Tokyo")
```

## 現在日時から1日後

```ruby
(now + 1.day).in_time_zone("Asia/Tokyo")
```

## 現在日時から2日後

```ruby
(now + 2.days).in_time_zone("Asia/Tokyo")
```

# 2022-06-20から1日前

```ruby
"2022-06-20".to_date - 1.day
```

# 2022-06-20から1日後

```ruby
"2022-06-20".to_date + 1.day
```

## 週初めの日時

```ruby
now.in_time_zone("Asia/Tokyo").beginning_of_week
```

# 月の計算

## 現在日時から2か月前

```ruby
(now - 2.months).in_time_zone("Asia/Tokyo")
```

または

```ruby
2.months.ago.in_time_zone("Asia/Tokyo")
```

## 現在日時から2か月後

```ruby
(now + 2.months).in_time_zone("Asia/Tokyo")
```

## 月初めの日時

```ruby
now.in_time_zone("Asia/Tokyo").beginning_of_month
```

## 年初めの日時

```ruby
now.in_time_zone("Asia/Tokyo").beginning_of_month
```

# 年の計算

## 現在日時から2年前

```ruby
(now - 2.years).in_time_zone("Asia/Tokyo")
```

または

```ruby
2.years.ago.in_time_zone("Asia/Tokyo")
```

## 現在日時から2年後

```ruby
(now + 2.years).in_time_zone("Asia/Tokyo")
```

# 時刻の計算

## 現在日時

```ruby
now.in_time_zone("Asia/Tokyo")
```


## 現在時刻から30秒前

```ruby
(now - 30.seconds).in_time_zone("Asia/Tokyo")
```

または

```ruby
30.seconds.ago.in_time_zone("Asia/Tokyo")
```

## 現在時刻から30秒後

```ruby
(now + 30.seconds).in_time_zone("Asia/Tokyo")
```

または

```ruby
30.seconds.from_now.in_time_zone("Asia/Tokyo")
```

## 現在時刻から30分前

```ruby
(now - 30.minutes).in_time_zone("Asia/Tokyo")
```

または

```ruby
30.minutes.ago.in_time_zone("Asia/Tokyo")
```

## 現在時刻から30分後

```ruby
(now + 30.minutes).in_time_zone("Asia/Tokyo")
```


## 現在時刻から2時間前

```ruby
(now - 2.hours).in_time_zone("Asia/Tokyo")
```

または

```ruby
2.hours.ago.in_time_zone("Asia/Tokyo")
```

## 現在時刻から2時間後

```ruby
(now + 2.hours).in_time_zone("Asia/Tokyo")
```

## 当日の0:00の日時

```ruby
now.in_time_zone("Asia/Tokyo").beginning_of_day
```

## 現在時刻の00分の日時

```ruby
now.in_time_zone("Asia/Tokyo").beginning_of_hour
```
SwiftUI + SwiftData で ToDo リスト を作ってみる

Swift 系でなんか作ってみたかったので。


![sc 2023-11-29 at 15.47.24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/a37c09be-7c56-968e-19c1-1ed9be95fb1d.gif)


```ToDo.swift
import Foundation
import SwiftData

@Model
final class Todo {
  var id: String
  var text: String
  var date: Date

  init(id: String = UUID().uuidString, text: String = "", date: Date = Date()) {
    self.id = id
    self.text = text
    self.date = date
  }
}

extension Date {
  func string(format: String = "yyyy-MM-dd HH:mm:ss") -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = format
    return formatter.string(from: self)
  }
}
```

Jetpack Comopse より軽快に作れます。

# 🧑🏻‍💻 詳細

https://android.benigumo.com/20231128/swiftui-swiftdata-todo/

https://android.benigumo.com/20231211/modelactor/
Spigotローカルサーバーの立て方

# 目次

[1.初めに](#初めに)
[2. 準備](#準備)
[3. サーバー起動](#サーバー起動)
[4. 補足](#補足)
[5. 最後に](#最後に)


# 初めに

初めて記事を書いてみました。至らないところが多くあると思いますが、よろしくお願いします

今回は、Minecraft Java版で自作プラグインを導入するために、ローカルでSpigotサーバーを起動までの手順を紹介したいと思います。

- 必要なもの
    - Java
    - Docker
    - マイクラ

それぞれのインストールについては、調べてみてください。

JavaとSpigotのバージョンについて

| Spigot | Java |
| --- | --- |
| 1.6,1.7 | Java7 |
| 1.8 ~ 1.16 | Java8 ~ Java15 |
| 1.17  + | Java16 + |

Spigotのバージョンに応じて使うJavaのバージョンは異なりますので注意してください

## 準備

フォルダーを作って、docker-compose.ymlというファイルを作成します

docker-compose.ymlに起動構成を記入して、作成していきます。

```yaml
version: '3'

services:
  mc:
    image: itzg/minecraft-server:java11
    ports:
      - 25565:25565
    volumes:
      - ./data:/data
    environment:
      TYPE: "SPIGOT"
      EULA: "TRUE"
      MEMORY: "2G"
      VERSION: "1.16.5"
      MODE: "creative"
    tty: true
    stdin_open: true
    restart: always
```

ここでは、サーバーに関する様々な設定をすることができます

特に、environmentには書ける項目が他にもあるので調べてみてください

## サーバー起動

docker-compose.ymlがある階層でコマンドを実行します

```bash
/docker compose up
```

このコマンドを実行するとサーバーが作成したymlファイルを元に構成されていくログが見れると思います。

最後まで行くと、doneみたいなログが見れると思います。(なんらかのエラーが出たら出力されないと思います)

一度、ctrl+cを入力してサーバーを落としましょう。

基本的に自分はバックグラウンドでサーバーを起動することが多いです。なので、次のコマンドを実行。

```bash
/docker compose up -d
```

-dオプションを付けるとバックグラウンドで実行することができます。

少々、待つとサーバーが起動します。起動を待つ間に、Minecraftを起動しましょう。

使用するMinecraftのバージョンは、1.16.5なので起動構成を作って起動しましょう

マインクラフトが起動したら、マルチプレイをクリックして外部接続を選択。

そして、入力欄に**localhost**と入力します

そして、マインクラフトの世界に入れたら成功です！

## 補足

よく使うコマンド

dockerで起動されているコンテナの確認

```bash
/docker ps
```

指定したコンテナ内に入って、ログだったりコマンドを実行できます。マイクラ内の権限を渡すときに使います

```bash
/docker attach コンテナ名
```

# 最後に

今回は、プラグインを導入するためのSpigotサーバーをローカルに立てる説明をしました。

Dockerを用いた説明をしたんですけど、他にも起動する方法はあるので気になる方は調べてやってみてください。

思いつきで、書き殴ったものなので言葉足らずな部分もあると思うので優しい目で見守ってください 🥹

次は、簡単なプラグインの作成と導入をしたいと思います。
RGB画像を輝度画像に変換してみたよ

# RGBから輝度への変換
jpg画像をなどの一般のカラー画像は二次元の各ピクセルにRGBのベクトルが指定された三次元配列です。で、画像解析をするときはRGBではなく各ピクセルがどれくらいの強度の明るさを有しているか知りたい時があります。RGBの平均値を取るなど、適切でない手法でグレースケールにしてしまうと各ピクセルでの明るさとは対応していません。画像の各ピクセルに入射した光の明るさを示す値が輝度になります。今回はpythonを使って、RGB画像から輝度画像に変換しようという内容です。

具体的な変換式はRGB色空間からNTSC色空間に変換するときの輝度(Y)のみを計算しています。したがって、今回"輝度"と言っているのは"NTSC色空間のY"です。RGBが$(R, G, B)$で表される時、輝度$Y$は次式で求められます。

$$Y = 0.299 R + 0.587 G + 0.114 B$$

# プログラム

```python
import cv2
import numpy as np

def int_from_img(filename):
    img = cv2.imread(filename)
    
    with open(filename, 'rb') as f:
        binary = f.read()

    arr = np.asarray(bytearray(binary), dtype=np.uint8)
    img = cv2.imdecode(arr, -1)
    
    Luminance = 0.299*img[:,:,2] + 0.587*img[:,:,1] + 0.114*img[:,:,0]
    
    return Luminance

Luminance = int_from_img("imege_file_path")
```

プログラム最終行の"imege_file_path"に画像のpathを入力するとLuminanceに輝度画像が格納されます。

# 実行結果
例として化学っぽい画像を変換してみました。
元画像[^1]

![pexels-kindel-media-8325710.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/f56aef1c-a4f4-beff-2562-85e2d4139d4e.jpeg)

プログラムの変換後

![y_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/488142e6-1ba4-f551-04bf-0411cc440a4b.png)

以上です。

[^1]:https://www.pexels.com/ja-jp/
からダウンロードしたフリー画像。
1分ナレッジ（2023/11/28 18時現在）ー X（旧Twitter）のシェアリンクバグについて

## 何が起こったか？

2023/11/28、X（旧Twitter）の一部のシェアリンクが動かなくなりました。

一例として以下のリンクをXログイン済みのブラウザで開いてみてください。

`https://twitter.com/share?text=helloworld&url=https%3A%2F%2Fgoogle.com`

https://twitter.com/share?text=helloworld&url=https%3A%2F%2Fgoogle.com

すると以下のような画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10943/17dffb94-026e-5ddd-59e2-9a0a6ed48270.png)

謎のCSSが文字として表示されてしまっている上、テキストが空の投稿画面が出てきてしまいました。

## 原因

先ほどのページのURLは以下のようになっています。

`https://twitter.com/intent/tweet?text&#x3D;helloworld&amp;url&%23x3D;https%3A%2F%2Fgoogle.com`

https://twitter.com/intent/tweet?text&#x3D;helloworld&amp;url&%23x3D;https%3A%2F%2Fgoogle.com

このように/shareに飛ぶと、/intent/tweetにリダイレクトで飛ばすという処理がX（旧Twitter）側でなされているようです。今まではここが正しく動いていたはずなのですが、少なくとも本日2023/11/28時点では本来エンコードされるべきでない=や&などもエンコードされてしまい、正しいシェアページに飛べなくなってしまいました。

## 直し方

リダイレクトが壊れているので、リダイレクトさせない（直接リダイレクト先に飛ばす）ようにすれば治ります。

`https://twitter.com/intent/tweet?text=helloworld&url=https%3A%2F%2Fgoogle.com`

https://twitter.com/intent/tweet?text=helloworld&url=https%3A%2F%2Fgoogle.com

以上です。無事正しく内容が入力された状態で開きました🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10943/4e9f43a1-90d6-dcb4-9738-22d11909e474.png)

## まとめ

明らかにX（旧Twitter）の落ち度ですが、影響範囲がかなり大きいのでみなさん注意しましょう。
なお主要メディアのシェアボタンはすでに正しく飛ぶ方のリンクになるようになっているようでした。

もし過去にTwitterシェアボタンを実装したなぁという方がいれば一度コードでtwitter.com/shareを検索してみることをおすすめします。

## p.s.

Twitterの方が呼びやすいのでいつか戻って欲しいです笑
STM32G031とMCP3425で電圧を測る(今、ふう20231128)(MCP3425A0T-E/CH 16bitADC)


STM32G031とMCP3425で電圧を測る(今、ふう20231128)(MCP3425A0T-E/CH 16bitADC)


参考


https://qiita.com/caa45040/items/ced19570460bd5a3f64d



x 4PINをOBでGPIOにする。わかる人むけ


目的
シンプルにリッチに作る
なぜかStringが容量不足で動かない


```c++

Serial.println(String(Volts,5));


```



![o_cop814.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d89fa219-3f7b-b68e-dd0c-a2ece9df4965.jpeg)


![o_cop815.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2dca4dbd-5402-d402-58ab-021e1dfa7d06.jpeg)



プログラム


```c++



//mcp3425_to_volts_031_1


//インクルド
#include <Wire.h>


//定義
//MCP3425A0T-E/CHのアドレス
#define ADD 0x68

float Volts;
float Vref = 2.048 ;

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5


//初期化
void setup() {

  delay(3000); //do not delete

  //シリアルの初期化
  Serial.setTx(PA2_ALT1);
  Serial.setHalfDuplex();
  Serial.begin(9600);

  //i2cの初期化
  Wire.setSDA(sdaPin);
  Wire.setSCL(sclPin);
  Wire.begin(); //pa12 pa11

  // 7 *(1)待ち
  // 6 *(0)
  // 5 *(0)
  // 4 (0)ワンショット,*(1)連続
  // 3 | (00)12ビット,(01)14ビット
  // 2 | *(10)16ビット
  // 1 I *(00)x1,(01)x2
  // 0 I (10)x4,(11)x8

  //初期値の書き込み
  Wire.beginTransmission(ADD);
  Wire.write(0b10011000); //16bit 15sps PGA x1
  Wire.endTransmission();
}


//i2cの読み出し 出力は、16BIT
int read_data() {

  //2文字の読み込み
  Wire.requestFrom(ADD, 2);

  //戻し
  return ( (Wire.read() << 8 ) + Wire.read() );
}


//メインルーチン
void loop() {
  Volts = read_data() * Vref / 32767.0 ;

  //変換、表示
  int d1 = (int)Volts;
  Serial.print(d1);
  Serial.print(".");
  int d01 = (int)((Volts - ((float)d1)) * 10000.0);
  if (d01 <=  999 & d01 >= 100) {Serial.print("0");}
  if (d01 <=   99 & d01 >=  10) {Serial.print("00");}
  if (d01 <=    9 & d01 >=   0) {Serial.print("000");}
  Serial.println(d01);
  //Serial.println(String(Volts,5));
  delay(1000); //1秒待つ
}




```
Python 【概要】

# Python とは
Pythonは30年以上の歴史を持ちながら、今だに国内外で高い人気を誇っている言語。
汎用性が高く、主に以下のような用途に使われる。
- AI（人工知能）・機械学習の開発
- Webアプリの開発
- 組み込みシステム開発（電子機器の制御プログラム）
- スクレイピング（Webデータの抽出）
- IoTの開発

先端技術の開発で人気が高いく、AIや機械学習、電子機器をインターネットに接続する ***「IoT」*** の分野の開発でもPythonが使われる。

# Pythonの特徴
1. 初学者でも比較的簡単に習得できる
2. 求人数が多く需要が高い
3. 優れたライブラリが豊富にある

## 1. 初学者でも比較的簡単に習得できる
Pythonの文法はシンプルで記述量が少なく理解しやすい。

Pythonの場合
~~~Python
for i inrange(0,5,1):
 print(i)
~~~
C言語の場合
~~~C
int main(void)
 {
  int i=0;
  for(i=0; i<5; i++){
   printf("%d\n",i);
 }
 return 0;
}
~~~

## 2. 求人数が多く需要が高い
Pythonの求人数は多く、正社員、フリーランス共に引く手あまた。
リモート案件も多数。

## 3. 優れたフレームワークやライブラリが豊富にある

### 代表的なフレームワーク
- Django ：小規模アプリから大規模アプリまで、どんなアプリでも作りやすい機能が豊富。
- Bottle ：シンプルで手軽に開発ができる。
- Flask ：軽量で開発しやすい。

### 代表的なライブラリ
- scikit-learn ：機械学習全般のアルゴリズムを簡単に実装できる
- TensorFlow：深層学習（ディープラーニング）のアルゴリズムを簡単に実装できる

# Pythonでできること
1. Webアプリの開発
2. AIや機械学習の開発

## 1. Webアプリの開発
Webアプリ開発における、バックエンドとして使われる。
## 2. AIや機械学習の開発
PythonはAIや機械学習の ***「モデル」***   を構築するときに使われる言語。
モデルとは、与えられた入力データから、何らかの結論を出力するプログラムのこと。

たとえば顔認証のモデルは、入力された顔の画像から特徴的な部分を探したり、これまでの顔パターンと照らし合わせたりする。

このとき、画像処理や統計分析といった高度な処理をプログラムで行う必要がある。こうした処理をモデル内で実現するときに、Pythonの優れたライブラリが役に立つ。

また、モデルを構築する前段階でもデータ分析が欠かせず、すっきりしたコードが書けるPythonは、効率的にデータ分析する上でも有用だと言える。

# まとめ
- Pythonは、Webアプリ開発やAIをはじめとする幅広い開発分野で使われるプログラミング言語
- Pythonの特徴
  1. 初学者でも比較的簡単に習得できる
  2. 求人数が多く需要が高い
  3. 優れたライブラリが豊富にある
- Pythonで実現できること
  1. Webアプリの開発
  2. AIや機械学習の開発
BigQuery で bq コマンドを使ってテーブルを別 Project にコピーする

# はじめに
- やりたいのは、 bq cp foo-project.abc-dataset.table1 bar-project.abc-dataset.table1 的な、テーブルを別プロジェクトにコピーしたい
- ただ、これはできないので、コマンド3回叩いてなんとかするということです。


# 前提

- コピー元
  - foo-project.abc-dataset.table1
- コピー先
  - bar-project.abc-dataset.table1

プロジェクトが異なる場合、素直にコピーはできない


# 3つのコマンドでやる

```bash

## コピー元テーブルのスキーマファイルを生成
$ bq show -schema \
  --project_id foo-project \
  abc-dataset.table1 > schema.json

## コピー先テーブルに、空のテーブルを作成（データセットは既にあるものとしている）
$ bq mk --project_id bar-project \
--table abc-dataset.table1 \
schema.json

## 実データをselectして、コピー先テーブルにload
$ bq query --project_id bar-project \
  --destination_table abc-dataset.table1 \
  --use_legacy_sql=false "
select * from foo-project.abc-dataset.table1
;
"


```
:hasの備考　孫要素指定の仕方

### 結論
孫要素の指定も:has()のみでいい
***
### 記事を書いた理由
:has()について勘違いしていました。
同じ人のために記事を書きます。
***
次のような構造の時、
```
　クラスA
 　　クラスB
   　　クラスC
         <タグF　クラスD　id="1234">
```
『タグFにid=1234を持つクラスA』を指定したいとします。

その場合:hasを使いますが、自分の間違った書き方がこちらです。
```
.A:has(.B:has(.C:has(F[id="1234"])))
```
正しい書き方はこちら
```
.A:has(F[id="1234"])
```

Javaの癖でなんでもかんでも入れ子にすればいいと思っていました。
便利なネットワークコマンド

# よく使うネットワークコマンド

<table border="1" cellpadding="2" cellspacing="2" bgcolor="#ccffff" style="border:5px outset;">
    <tbody>
        <tr>
            <td nowrap>コマンド</td>
            <td>内容</td>
        </tr>
        <tr>
            <td>exit</td>
            <td>シェルを終了する</td>
        </tr>
        <tr>
            <td>ftp</td>
            <td>ファイルを転送する</td>
        </tr>
        <tr>
            <td>hostname</td>
            <td>ホスト名を表示する</td>
        </tr>
        <tr>
            <td>ipconfig</td>
            <td>ネットワークインターフェースの表示・設定を行う
                <br>ホスト名、MACアドレス、IPアドレス、サブネットマスク、デフォールトゲートウェイ、DHCP有効/無効、ネットワークカード(NIC)名</td>
        </tr>
        <tr>
            <td>nbtstat</td>
            <td>NETBIOS情報を表示、更新する</td>
        </tr>
        <tr>
            <td>net config</td>
            <td>ServerまたはWorkstationサービスに関する情報を表示、設定する
                <br>コンピュータ名、ドメイン</td>
        </tr>
        <tr>
            <td>net share</td>
            <td>共有リゾースを表示する</td>
        </tr>
        <tr>
            <td nowrap>net statistics</td>
            <td>サービスのの統計情報を表示する
                <br>送受信バイト数、送受信ブロック数、ネットワークエラー、セッション数</td>
        </tr>
        <tr>
            <td>nslokup</td>
            <td>NS(DNS)の情報を確認する</td>
        </tr>
        <tr>
            <td>pathping</td>
            <td>ネットワーク経路情報を表示する</td>
        </tr>
        <tr>
            <td>ping</td>
            <td>ネットワークでの接続を確認する</td>
        </tr>
        <tr>
            <td>telnet</td>
            <td>telnetでリモート接続する</td>
        </tr>
        <tr>
            <td>tracert</td>
            <td>ネットワーク経路を表示する</td>
        </tr>
    </tbody>
</table>

#  ネットワークコマンド使い方(参考サイト)

https://atmarkit.itmedia.co.jp/ait/series/2071/

https://xtech.nikkei.com/it/article/COLUMN/20060125/227900/
Workato：ExcelのLeft, Right, Mid関数のように文字列を抜き出したい

いずれもFormulaモードに切り替えて対応します。

# 左からn文字分の文字列を抜き出す（Excelにおける `Left`関数に相当）
左から3文字分抜き出す
```ruby
"あいうえお".slice(0,3)
# ==> "あいう"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6f9d0c99-0e98-360d-47dc-5697308ee615.png)


# 右からn文字分の文字列を抜き出す（Excelにおける `Right`関数に相当）
右から2文字分抜き出す
```ruby
"あいうえお".slice(-2,2)
# ==> "えお"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f790486a-5a0a-a603-53cf-14bd443d03a6.png)


# 特定の位置からn文字分の文字列を抜き出す（Excelにおける `Mid`関数に相当）
2文字目から3文字分抜き出す
```ruby
"あいうえお".slice(1,3)
# ==> "いうえ"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/269f65ad-b892-4630-13fa-ec4eb59b1461.png)
GitHubのプロフィールをコード書かずに設定したい

## はじめに
こんにちは。
株式会社HRBrainで内定者インターンをしている若槙です。

この記事はHRBrain Advent Calendar 2023の3日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain

みなさん、GitHubのプロフィールは設定していますか？

設定するの面倒そうだし、優先順位も低いしな〜と思って後回しに来てきた方もいらっしゃるのではないでしょうか！？

本記事では、**コードを書かずに10分程度でプロフィールを設定する方法** を紹介させてください。

## 完成形 （サンプル）

<img alt="README1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/1ab4ef52-5616-8d02-0b53-1f8ad0ca3b22.png">

## プロフィールを作成
PROFILEME.DEVというWEBサービスを利用します。（ユーザー登録などは不要でした）

https://www.profileme.dev/

ProfileMe.devでは、以下の項目を設定できます。
* Introduction
* Skills
* Badges
* Social
* Support

### Step:one:  「CREATE PROFILEをクリック」
![CREATEPROFILE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/c1365ab6-1492-af0f-6389-83c1a8628c88.png)

### Step:two:  「回答を入力」
![回答を入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/667090f6-9649-fbbc-11ca-cbddcfcc6029.png)

画面左側が入力画面、画面右側がプレビュー画面です。

プレビュー画面を見ながら入力できるため、Githubに表示されるプロフィールがイメージしやすく、テンションが上がります:heart_eyes:

### Step:three:  「入力が完了したら」
![入力が完了したら.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/c9e12b0a-9185-23a8-2ea7-ad292619a3ff.png)

コピーボタンを押下して、コピーした内容を、プロフィール用のリポジトリのREAMDE.mdファイルに貼り付けてください。


## 完成:clap::clap::clap:
ProfileMe.devで作成したプロフィールを私のGitHubで公開したので、興味がある方は是非参考にしてください！！

https://github.com/ren7087

## 最後に

株式会社HRBrainでは新しいメンバーを募集中です！

https://www.hrbrain.co.jp/recruit
【Flutter】実機でHiveを使うとエラーになる

# はじめに
iOSの実機でHiveを使うとエラーになり、解決方法調べても記事がヒットしなかったので、記事にします。
どういうエラーが出たかというと、`PathAccessExcepiton`で`Operation not permitted`というエラーになります。
同じようなエラーが出ている人がいればご参考になれば幸いです。

# 解決方法
以下の差分の箇所が修正ポイントです。

```diff_dart
// path_providerパッケージでアプリのドキュメントディレクトリを取得
final dir = await getApplicationDocumentsDirectory();
final path = dir.path;

// 初期化
await Hive.initFlutter(path);

final boxCollection = await BoxCollection.open(
// ボックスの名前の先頭に/をつける
- "myBox",
+ "/myBox",
  {
    dogBox,
    catBox,
  },
  path: path,
);
```

/をつけないと、パスが`xxxxx/DocumentsmyBox`みたいになってしまってエラーになるみたいです。
/をつけると、パスが`xxxxx/Documents/myBox`というパスになります。

*Android側は未確認なので確認次第追記します。*
Pythonで「変数を削除する」の動作を確認してみた

# 概要

Pythonで「変数を削除する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/var/index8.html

# 実装

以下のファイルを作成しました。
```sample.py
num = 10
print(num)

del num
print(num)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
10
Traceback (most recent call last):
  File ".../sample.py", line 5, in <module>
    print(num)
NameError: name 'num' is not defined. Did you mean: 'sum'?
```

# まとめ

何かの役に立てばと。
年の瀬の現状把握？経産省資料からみるEC市場の動き

　こんにちは。株式会社EC-CUBE Innovationsの石田です。

　少し前になりますが、経済産業省が毎年発表している「電子商取引に関する市場調査の結果（令和4年度）」が8月末に発表されていました。

（経済産業省サイト）
https://www.meti.go.jp/press/2023/08/20230831002/20230831002.html

　こちらは経済産業省が定点的に発表している電子商取引（EC）に関するデータです。年の瀬の現状把握？として、こちらのデータを考察していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630272/241a46f0-7006-e7ce-3fb6-e5b6dc4e6f6f.png)

　令和4年の日本国内のBtoC-EC（消費者向け電子商取引）の市場規模は22.7兆円でした。令和3年（2021年）が20.7兆円、令和2年（2020年）が19.3兆円です。3年続けてBtoC-ECの市場規模が伸びていることになります。

　右肩上がりのBtoC-ECの市場規模ですが、前年割れをした年がありました。2020年です。2018年が18.0兆円、2019年が19.4兆円と成長を続けてきたBtoC-EC市場が前年割れしたのです。理由はコロナ禍です。

　コロナ禍のBtoC-ECは非常に特殊です。実はBtoC-ECの中でも物販系分野は市場が伸びています。コロナ禍による、非対面・ネット活用・巣ごもりが影響しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630272/c7236b76-e939-e4ff-bba6-79bc69e3b541.png)

　逆にコロナ禍によって大きく下落したのがサービス分野です。このサービス分野が何を指すかがポイントです。BtoC-ECサイトでの「旅行の予約」や「イベントチケット」の購入があたります。サービス分野は2019年の7.2兆円から、2020年には4.6兆円まで下がりました。

　実は令和4年の22.7兆円の伸びを牽引しているのは、サービス分野のBtoC-ECなのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630272/c1cfffea-22cc-92cf-fddf-fa1976269fa3.png)

　物販系分野は2021年の13.3兆円に対し、2022年は14.0億円。5.3％程度の伸びです。サービス分野は、2021年の4.6兆円に対し、2022年は6.1兆円と32.4%の伸びです。日本経済状況を考えれば、物販系分野の5％成長も優良と思われますが、サービス分野が戻ってきたのが、令和4年（2022年）ということになります。

　しかし現実的に旅行やイベントが解禁されたのは令和5年（2023年）になってから。2023年のサービス分野はコロナ前の7.2兆円レベルまで戻るかもしれません。反動で物販系分野のBtoC-ECがどうなるのかが注目です。ECに携わっている私の感覚値としては、物販系分野は2022年に対して「横ばい、もしくは減」という印象です。

　資料の中には詳細なデータも存在します。物販系分野のBtoC-ECにおける、各ジャンルのEC化率です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630272/9f3e0bd3-080c-2e86-d7f1-754a571cdfdd.png)

　「すべての商取引において、EC（電子商取引）　の市場規模が占める割合」。これをEC化率といいます。2022年のBtoC-EC物販系分野の市場規模は14.0兆円。これはEC化率だと9.13%でした。日本の物販消費の9.13%はECでおこなわれたわけです。

　物販系分野の各ジャンルのEC化率をみてみます。特にEC化率が高いのが「書籍・映像・音楽ソフト」です。EC化率は52.1%。電子書籍やオンライン配信など、圧倒的にEC化が進んでいます。2021年のEC化率は46.2%ですから、急カーブを描くようにEC化が進んでいると言えそうです。

　他にEC化率が進んだジャンルを上げると「生活家電・AV機器・PC／周辺機器」です。こちらは前年38.1%から、42.0％に成長。家電量販店もECを起点にビジネスを組み立てなければいけない時代がきています。

　様々データが出ていますので、ぜひ自社やお客様に関するデータを見てみてください。

（経済産業省サイト）
https://www.meti.go.jp/press/2023/08/20230831002/20230831002.html
私に関して、これから先の投稿に関して

どうも、皆さんはじめまして。
muts56と申します。

## 簡単な自己紹介
プログラミングに関しては今年独学で学習を始めた初心者です。
作りたいアプリの構想はあるのですが、生憎と浅学なもので、Python3とJavaScript(、react)の学習をしている最中です。
Javaについては10月からスクールのようなものに潜り込みましたが、雰囲気しかわからないまま卒業します。
あと、自分自身いい歳なのですが、現在は休憩と称してバイトをして生き長らえています。そろそろ就活しないとです。

## 投稿方針に関して
自分のわからないこと、わかったこと、躓いたこと、考えたことなどをメモアプリでまとめているのですが、先人に倣い、これから先で同じように悩む人たちの一助になればと思い、こちらにも投稿しようかと思います。

元が完全に自分用のメモなので、ですます調ではないものですが、不快に思われる方が多ければ整形することも考えます。

ということでどうぞよしなに。
若手エンジニア奮闘記⑧ピアノしか弾いてこなかった人間が最高のエンジニアを目指す奮闘記

初めまして！新入社員の古澤です。

今までピアノしか弾いてこなかった音大卒の私が、最高のエンジニアを目指して奮闘する様子を紹介していきたいと思います。

本日は奮闘記とは少しずれますが（初回なので自分のルーツとか書きたい）「なぜ音楽の世界からエンジニアを目指したのか」「入社後の研修内容」の２つについてお話していきます！


# 目次

　　[1. なぜ音楽の世界からエンジニアに？](#なぜ音楽の世界からエンジニアに)
　　　　[1.1   新たな挑戦への憧れ](#新たな挑戦への憧れ)
　　　　[1.2「これ、もっと使いやすくしたい！」](#これもっと使いやすくしたい)
　　[2. 入社後の研修内容](#入社後の研修内容)
　　　　[2.1  マナー研修](#マナー研修)
　　　　[2.2. プログラミング](#プログラミング)
　　[3. まとめ](#まとめ)


# なぜ音楽の世界からエンジニアに？

幼稚園から続けていたピアノを大学でも学びたいと思い、音楽大学へ入学しました。
「大学生活たのしー」とか思って過ごしていたら、もう進路を決めなければならない時期でした。学生生活って時間経つの早いですよね。

## 新たな挑戦への憧れ
「大学でピアノはもうやり切ったし、これから何か新しいことにチャレンジしたいな～」と、漠然と考えていました。
一つの事をひたすらやり続けてきた自分にとって未知の世界というのは、とてつもなく輝いて見えていました。

## 「これ、もっと使いやすくしたい！」
そんな矢先、大学の練習室予約サイトがとても使いにくいことに気が付きました。
「これって、最近よく聞くITが関係しているのでは、、？」
↓
「せっかくなら自分の力でもっと便利にしたいし、新しいことだからチャレンジしてみようかな」
こうして、音楽界からITの世界へ飛び込むことを決意したのでした。


# 入社後の研修内容

未経験のエンジニアとして入社した私は、10人の愉快な同期と共に3ヶ月の研修に臨みました。
ここからは配属までの研修で学んだことについて話していきます。

## マナー研修
専門の講師の方に指導していただき、実践を交えながらビジネスマナーを学びました。
学生時代との違いをひしひしと感じ、正直入社式よりこっちの方が社会人になったんだなあと感じました。

## プログラミング
C#、Java、SQLなどを学び、自分で簡易電卓を作成したり入力内容に基づいた表示がされるようコードを書いたりするなど、基本的な知識を学習しました。
エラー9割成功1割ぐらいの勝率で、「自分落ちこぼれやん、、」とか思っていましたが、この世界はそんなもんなんだというのもこの経験から学べました。
あと、未経験の自分にとって研修内容はほぼ宇宙語で、何度も何度も復習してようやく少しずつわかるようになっていきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552913/4c69ebc0-1f3f-c666-85a6-d137871d2747.png)

# まとめ

今回は、音楽の世界からIT業界へ飛び込んだきっかけや入社後の研修について簡単にお話ししました。
全く違う世界に挑戦することに不安や迷いを持つ人も多いと思いますが、今迷っている人はぜひ勇気を持ってチャレンジしてみてください。
未知の世界へ飛び込んだからこそ見ることができる景色が広がっていますよ！

次回からは路線を奮闘記に戻して、配属されてから自分が担当している業務内容や苦戦していることなど書いていきます！

また次のブログでお会いしましょう！！
[re:Invent2023 ざっくre:Cap]Delivering low-latency applications at the edge

# はじめに
みなさんこんばんは！hiropyです。
今回はre:inventで参加したセッションを、英語できないマンなりにざっくり振り返っていこうと思います！

本記事では「Delivering low-latency applications at the edge」について記載していきます。

翻訳ミス、意図の取り違えがあるかもしれませんが、「こんなことしてたんだ」くらいでご参考にしていただけると幸いです。

#  セッション概要
- セッション名：HYB305-R | Delivering low-latency applications at the edge [REPEAT]
- セッションタイプ：Breakout session
- レベル：300

セッションの概要は以下のとおりです。

> AWSのハイブリッドサービスとエッジサービスは、AWSをリージョンとアベイラビリティゾーンからローカルメトロ、オンプレミス、ファーエッジに拡張し、エンドユーザーとワークロードにAWSを近づけます。本セッションでは、AWS Local Zones、AWS Wavelength Zones、AWS Outposts、AWS Snow Familyを利用して、レイテンシに敏感なアプリケーションを世界中のより多くの場所で実行する方法を学びます。メディアやエンターテインメントのコンテンツ制作、サイバーセキュリティ、デジタル広告、ヘルスケアリサーチ、高頻度株式取引、バーチャルリアリティ技術など、1桁ミリ秒のレイテンシを必要とするアプリケーションをどのように導入しているかをご覧ください。

より低レイテンシのサービスを提供するために、AWSのどのサービスが活用できるのかが、ユースケースごとに紹介されました。


# セッション内容
各サービスごとに、どんなメリットがあるのか、レイテンシの改善効果、具体的な事例を紹介。

## AWS Local Zone
https://aws.amazon.com/jp/about-aws/global-infrastructure/localzones/

AWSサービスのエンドポイントをよりユーザの近くに置くことで低レイテンシを実現するサービス。

主要なサービスは対応しており、ハイブリットクラウド移行にも活用できる。
環境はクラウド上に作成しつつレイテンシを上げたいときに活用できるサービス。



### 紹介された事例
Netflixの事例を紹介（[参考](https://aws.amazon.com/jp/solutions/case-studies/netflix-aws-local-zones-case-study/)）
Netflixはクリエイターのコンテンツ作成用ワークステーションをLocal Zoneを使用して提供することで、環境に5分以下でアクセスできるようなエクスペリエンスを実現。


## どのサービスを使用していたか忘れた(多分outposts系？)
### 事例紹介
金融取引システムをAWS上に移行する際に、outposts系？をマイグレーションのハブにすることで低レイテンシでの移行を実現。
サービス展開だけでなく、移行時のレイテンシ改善でも各サービスが役立つ。


## AWS Outposts Rack
https://aws.amazon.com/jp/outposts/rack/
<img width="400" alt="image.png (342.3 kB)" src="https://img.esa.io/uploads/production/attachments/1854/2023/11/28/141998/553eb2e5-aae5-4a0a-9a11-2f71797fd5db.png">

自社内で物理的なAWS環境を持つことで、独立したクラウド環境を展開できるサービス。
主要なセットアップや管理は全てAWSが行う。
APIのエンドポイントも通常のAWSサービスを使用するときと同じエンドポイントなので使いやすい。

自社内でデータを保管しないといけない、みたいな規約にも対応できる。

### 紹介された事例
RIOT Games([参考](https://aws.amazon.com/solutions/case-studies/riot-games-reinvent/))
特にFPSなど、数ミリ秒の誤差が結果を大きく左右するゲームにおいて、ユーザ全体の70%以上が？msくらい（メモ忘れ）になった。

RIOTがLocal Zonesなどを使用せずoutpostsを選択したのは、巨大なデータ容量が必要だったから。
データ容量の観点でもoutpostsは秀でた点がある。


## AWS Outposts servers
https://aws.amazon.com/jp/outposts/servers/
<img width="899" alt="image.png (321.1 kB)" src="https://img.esa.io/uploads/production/attachments/1854/2023/11/28/141998/fe6308b4-fbf2-4e56-b3c0-93d80451416e.png">


outposts lackの小さい版。
スペースの限られた場所で低レイテンシのサービス提供を実現したいときに最適。
社内ネットワークに組み込むこともできるので、outposts servers同士で通信することも可能。

## まとめ
低レイテンシを実現する方法は色々ある。
- サービスを展開するAWS Regionをユーザに近いところにする
- Local Zonesでエンドポイントをユーザの近くに配置する
- Outpostsでユーザエクスペリエンスが最適になる場所に自由に配置


#  感想
- これはスライド見ながら理解できた
- Outposts触ってみたいなと思った


以上、皆様のご参考になれば幸いです！
[re:Invent2023 ざっくre:Cap]It’s about time: Benefits of microsecond-accurate time on Amazon EC2

# はじめに
こちらは「**Japan AWS Jr. Champions Advent Calendar 2023 2日目**」の記事です。


みなさんこんばんは！hiropyです。
今回はre:inventで参加したセッションを、英語できないマンなりにざっくり振り返っていこうと思います！

本記事では「It’s about time: Benefits of microsecond-accurate time on Amazon EC2」について記載していきます。

翻訳ミス、意図の取り違えがあるかもしれませんが、「こんなことしてたんだ」くらいでご参考にしていただけると幸いです。

# セッション概要
- セッション名：CMP220-NEW | [NEW LAUNCH] It’s about time: Benefits of microsecond-accurate time on Amazon EC2
- セッションタイプ：Chalk Talk
- レベル：200
- サービス：EC2

セッションの概要は以下のとおりです。

> Amazon Time Sync Serviceのグローバルで信頼性の高いマイクロ秒レンジのクロック精度を利用すれば、最も時間に敏感なアプリケーションをクラウドに移行して近代化し、負担の大きいオンプレミスの時間インフラを廃止することができます。このチョークトークでは、オープンソースのデーモンとライブラリであるClockBoundを使用して、Amazon EC2インスタンスの改良されたクロックに接続し、クロックの精度を測定し、Amazon EC2インスタンスからタイムスタンプを生成して比較する方法を学ぶ。時間を回避する代わりに時間を活用する方法を発見し、分散アプリケーションでイベントとトランザクションの順序を決定する方法を学ぶ。

ざっくり書くと、サーバーのクロックの精度についてのお話でした。


# セッション内容
昔から原子時計がある。初めは正確だが、次第にずれが発生する。
ではこのクロックのズレの原因は何か？
- クロック自体の問題 -> 完璧に修正するのが難しい
    - ハードウェアが劣化してドリフトが発生する
    - 温度
        - 温度によって多少クロックの周波数が変化してしまう
- ネットワークの問題
    - 元になるサーバとそれを受け取るサーバ間は必ずネットワークで繋がっているが、多少なりとも遅延が発生してしまう

この２つの問題が重なることで、ずれが発生する。

このクロックの正確性を計測するための新しいOSSライブラリ「Clock Bouns」が出た。
https://github.com/aws/clock-bound

これにより、標準時間と比較したサーバー時間の正確度、が計測できる。
計測のメトリクスは「Clock Error Bouns(CEB)」
<img width="891" alt="image.png (959.6 kB)" src="https://img.esa.io/uploads/production/attachments/1854/2023/11/28/141998/c8a12eec-22f5-4e90-844d-d743a9344822.png">

標準時間から、誤差の波がどれくらい大きいかで判定する。

ちなみにEC2はデフォルトでAmazon Time Sync Serviceを使用している。これによりCEBの値は格段に小さくなっているので、Clock Bounsを使用することでこれを確かめられる。
他のサーバについてもClock Bounsは使用できるので、これでオンプレとの比較を出すとNTPサーバの移行を検討する材料になるかも

GPSの精度については、確かに一定はあるが、サーバが受け取るまでに改竄される可能性やGPS機能が壊れる可能性がある。

# NTPとPTPの違い
基本的には、サーバはNTPにより時刻取得を実施するが、より正確な時刻が必要なサービスに関してはPTPという規格が使用される。([参考](https://network.oreda.net/knowledge/clock))

## NTP
- Network Time Protocolの略
- 同期精度は数ms
- インターネットを経由して時刻を取得
- NTPサーバへの時刻問い合わせが比較的長い
- うるう秒がある

## PTP
- Precision Time Protocolの略
- LAN内での使用を想定されており、同期精度は数サブms
    -  Ethernet経由で使用する場合、ネットワーク機器もPTPに対応している必要がある
- うるう秒がない
- 金融取引や、LTEの携帯キャリア網に使用される


## 補足
時刻取得についてはいずれもGPSを経由している？
https://timemachinescorp.com/2021/01/08/the-differences-between-ntp-and-ptp/


# 感想
- だいぶハード寄りの話で面白かった
- 英語は聞いてて全くわからなかった
- chork talkで質問をガンガンできるセッションだったので、こういう場で質問ができる英語力になりたい
- 大学の授業受けてるみたいだった

以上、ざっくre:Capでした！ご参考になれば幸いです。
映像伝送業界について紹介してみる

NTTテクノクロス松丸です。

　入社9年目の社員となります。
 
　およそ6年ほど高解像度映像の低遅延伝送がメインの業務に携わらせて頂いています。
今回はそれに関連して映像伝送業界について少しご紹介出来たらなと思います。

# はじめに
　私が関わった映像伝送業界のイメージとしては、主にライブ放送やスポーツの中継、またはテレビ放送といった映像コンテンツに関連して技術発展していった業界というイメージを持っています。
　発展内容については規格の変遷や様々な方面での技術革新があるのですが、根底にあるのは「高速」に「大容量」のコンテンツをいかに「低コスト」で伝送するかということを追求してきた結果色々生まれているという認識です。

　今回は、そんな映像伝送業界の最近の動向とこれからのイメージ、そして、映像伝送業界を理解する上で重要な二つのキーワード、について紹介します。

# 最近の映像伝送業界の動向
　映像伝送業界に私が配属された6年ほど前は、まだまだSDI（Serial Digital Interface）という同軸ケーブルを用いた伝送方式が現場で用いられることが多く、映像伝送をIPを用いて伝送することについては、まだまだ課題が多いという状況でした。

　しかし6年経った現在ではIP化の動きが活発化してきた印象があり、プライベートネットワーク環境でのIP化に関しては切り替えが結構進んでいるのではないかという認識です。
   
　幕張メッセにて開催されました音と映像と通信のプロフェッショナル展「INTERBEE」では、すでにIP映像伝送を前提とするソリューションが多く展示されていました。
[Inter BEE 2023](https://www.inter-bee.com/ja/)

　現状はSDIからIPへの切り替えがまだまだ行われている最中ですが、ここ最近はさらにIP化の流れの中でクラウドを活用するという潮流が出てきています。

　クラウドを活用した映像放送を海外ではLCP（Live Cloud Production）と呼びますが、上記の展示会ではまだ「クラウドを活用したIP伝送」というような呼び方をしていることが多かったように思います。
　もしも、この映像伝送のクラウド化が実現するようであれば、従来の方式に比べ、必要な機材の減少や、ネットワーク経由でのデータ伝送が可能になるためコストの削減が期待できます。
　海外ではすでに小規模なスポーツイベントやライブイベントに関してはLCPが活用されているようなのですが、まだ大規模なところはこれからといったところで、日本ではそもそも活用が進んでいないという認識です。今後は、海外での大規模なイベントでの活用や日本での活用の広がりが期待されます。

　このあたりが過去から現在といったところなのですが、今回はこの業界で理解する上で重要なキーワードとなる「SMPTE ST2110」と「SRT」の二つを簡単に紹介させていただきたいと思います。

この二つを比較すると主にSMPTE ST2110では広帯域が使用されるLAN環境で使用されるという特徴があり、SRTは逆に帯域の制限があるWAN環境で使用されるという特徴があります。

## SMPTE ST 2110
　SMPTE ST 2110はSMPTEという組織が出している標準規格になります。
 [SMPTE](https://www.smpte.org/)
 
 SMPTEは「Society of Motion Picture and Television Engineers 」（映画テレビ技術者協会）の略で映像や音声といったメディア情報の取り扱いに関する800 以上の技術標準と関連文書を発行している標準化団体です。

　SMPTE ST2110はIPネットワーク上でメディア情報を伝送する方式を規定していて、現状のIP映像伝送に関する製品は、このST2110に準拠して作られています。

　規格の内容について少しだけ話すとIPネットワークはデータを分割してパケットにして送信することを前提としていることから、ST2110では、そのIP上を伝送するパケットのカプセル化方式について規定されています。そのため現場の開発においては、上記ST2110に準拠した形で映像/音声データの分割やカプセル化といったデータ処理を行うようにプログラムしていくことになります。

 
## SRT「Secure Reliable Transport」
　SRTは「SRT Alliance」という団体が出しているオープンソースの標準規格になります。
[SRT Alliance](https://www.srtalliance.org/)

　SRTは、名称の通りSecure（安全）、Reliable（信頼性）、Transport（伝送）のIPネットワーク上でのメディア情報の伝送プロトコルになります。

　WAN環境はその特性から、遅延が大きくなってしまうことと、パケットロスが発生しやすい特徴があります。SRTプロトコルはこの両方に対して絶妙にバランスよく対処できるプロトコルになっており、このプロトコルを利用することで高品質かつ低遅延な伝送を実現することができます。

# 弊社サービス紹介「ストリームウェイズ」
　最後に紹介させてください。
 弊社では高価な機材を使わずに映像の集配信を実現する「ストリームウェイズ」サービスを提供しております。

 当サービスでは今回紹介したSRTにも対応しており、4K/2Kの画質を低遅延で伝送することができます。

 当サービスについての詳細は以下のページより確認ができます。
 https://www.ntt-tx.co.jp/products/streamways/
過去のGitコミットメッセージから "wip -" を一括削除する方法

プロジェクト開発中に、"Work In Progress"（WIP）としてマークされたコミットがいくつかあるかもしれません。これらのコミットは、開発の途中段階で作成されるもので、しばしば "wip -" というプレフィックスが付けられます。しかし、これらのコミットを本番環境にマージする前に、これらのWIPマークを取り除きたい場合があります。ここでは、これを効率的に行う方法を紹介します。

## **必要なツール**

- Git
- シェル（Bashなど）

## **ステップバイステップガイド**

### **1. 対象のコミットを特定する**

まず、"wip -" プレフィックスを含むコミットを特定します。これには **`git log`** コマンドと **`grep`** を使用します。

```bash
git log --oneline | grep -B1 'wip -'
```

このコマンドは、"wip -" を含む各コミットとその直前のコミットのハッシュとメッセージを表示します。**`-B1`** オプションは、マッチした行の前にある1行（直前のコミット）も表示するように指定します。

### **2. インタラクティブリベースの開始**

次に、リベースを開始します。最初のコミットのハッシュを使用して、インタラクティブリベースを開始します。例えば、最初のコミットが **`abc123`** であれば、次のようにします。

```bash
git rebase -i abc123^
```

### **3. コミットメッセージの編集**

リベース操作が開始されると、テキストエディタが開き、リベースするコミットのリストが表示されます。"wip -" を含む各コミットの前に **`reword`** または **`r`** を設定します。これにより、リベースプロセス中にこれらのコミットメッセージを編集できるようになります。

### **4. コミットメッセージの変更**

各 **`reword`** に設定されたコミットに対して、Gitはメッセージの編集画面を順に表示します。"wip -" プレフィックスを削除または変更し、変更を保存してエディタを閉じます。

### **5. リベースの完了と変更のプッシュ**

全ての編集が完了したら、リベース操作が続行されます。完了すると、変更をリモートリポジトリにプッシュする必要があります。これは通常、**`git push --force`** または **`git push --force-with-lease`** を使用して行います。

```bash
git push --force-with-lease
```

## **注意点**

- この操作は、リモートの履歴をローカルの変更で上書きします。他の開発者の作業に影響を与える可能性があるため、チーム内でコミュニケーションを取りながら慎重に行ってください。
- リベースは履歴を改変する操作です。既に公開されているブランチでこの操作を行う場合は特に注意が必要です。

## **まとめ**

この方法を使えば、過去のコミットメッセージから "wip -" などの不要なプレフィックスを効率的に一括削除できます。Gitの強力なリベース機能を活用して、クリーンで読みやすいコミット履歴を維持しましょう。