OmniAICreator/Qiita-1.07M huggingface dataset:
【システムプロパティ】システムプロパティを使ってみる

Sharperlight には **システムプロパティ** というアプリケーションがあり、今回はそれを使用してみます。
**システムプロパティ**で定数を定義し、ソリューションを構成する`クエリビルダー`、`公開レポート`、`スケジュールタスク`などの Sharperlightオブジェクトからその定数を使用できます。
## システムプロパティを定義する ##
[Sharperlight](https://sharperlight.jp/) アプリケーションメニューを開きます。
メニューより`システムのプロパティ`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0d1d5aca-37cb-edd2-74fa-697d9eb0d41d.png)
`新規`ボタンで作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/232db31b-55af-3be7-1268-565a962c6870.png)
ユニークコードを入力します。
データ型を選びます。今回は**Date Time**型を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7df3d62d-7c8a-2227-ed3e-bcbeb0e7087b.png)
値を入力します。**2013-01-01**を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/853a676f-e223-bd74-4b53-075c00f1b39b.png)
最後に`保存`ボタンを押します。
## クエリビルダでシステムプロパティを使用する ##
[Sharperlight](https://sharperlight.jp/) アプリケーションメニューを開きます。
メニューより`クエリビルダ`を選択します。
製品には**SAP Business One**、Companyには**OEC Computers Australia**、そしてテーブルには**A/R Sales Invoice**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7c626e1a-56f4-f7c8-f529-5c940a6b8d2b.png)
四つの必須ファイルターが表示されます。既定の設定のままにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3b6755ee-1b2d-62e1-f1cd-56a340ddffac.png)
**Document Date**をフィルターに設定します。
選択領域の検索フィールドに**date**と入力し、**Document Date**フィールドを探します。
見つかればドラッグ＆ドロップでフィルター領域に設定します。
**以上 (>=)** 演算子を`From値`に設定します。
システムプロパティから値を取得する関数を拡張表現式を用いて`To値`に設定します。
関数の2番目の引数は、既定値です。
```
_Expression( SystemPropertyGet( "DateFilter","2010-01-01" ) )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bb02e104-0ed0-f9a8-7849-0209356a6e22.png)
出力アイテムをこのように選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9ce0af7f-cc0a-9eba-34b8-c997d843ca50.png)
これでクエリは完成です。
## クエリの検証 ##
`プレビュー`ボタンでクエリを走らせてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e9a64c55-7164-261a-70b6-7dd9eb0bfdf1.png)
**2013-01-01以降**のドキュメントがクエリ結果として返されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1ed77816-8062-9717-225c-ed2b612da4dc.png)
Sharperlightエンジンによって作成されたSQL文のWHERE句は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d48c438f-1503-490c-e0cc-424c4a1dab86.png)

この日付値がソリューション全体の重要な日付になる場合、日付値をシステム プロパティで 1 か所に定義し、他のすべてのオブジェクトから参照されるようにすると、メンテナンスなどが容易になります。

では、失礼します。
2023年5月9日に行われるApp Storeの価格改定について

## 今回の改定について
正直なところApp Store Connectでも記事を読んでもわかりづらいです。
間違えていたら教えて下さい。

https://developer.apple.com/jp/news/

## 何が起こる？
**App Store Connectで価格の設定を更新しないと自動的に価格が変わるみたい**

5月9日までにデベロッパが既存のAppおよび1回限りのApp内課金の価格を更新しない場合、Appleは、現在米国を基準に設定されているデベロッパの現在の価格をもとに更新が行われる。2,000円までは10円刻み、2,000円から1万5,000円までは100円刻みの設定ができたり、地域によって柔軟な価格設定ができるようになるようです。

## どうすればいい？
既存の価格設定にする場合は5/9までに設定が必要です。
どのように設定するかは下記の手順でできると思われます。

1, AppStoreConnectのApp内課金やAppの価格設定画面を開き、今後予定されている変更の金額を確認します。変更後の金額のままでよければ自動的に5/9に切り替わると思われます。
![０.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/a67d690c-99ad-a60e-2a55-924804345c45.png)

2, 既存の金額設定を続ける場合や修正したい場合は価格表の＋ボタンを押下します
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/044cbaa9-2c29-8bad-4639-467af48fe78c.png)

3, カスタム価格変更を選択
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/38a47b35-acfc-5de2-c868-4d3bce17dd1a.png)

4, 適用開始日を選択し、価格管理は適当な項目を選択してください。日本の金額の設定のみであればと「特定の国または地域において価格を手動で管理する」にチェックをいれてください
![３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/ed1b6b95-af37-c1b4-ad40-73dceeb83acc.png)

5, 日本を選択します。価格を下までスクロールし「他の価格を確認」を選択します
![４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/4f98fe4b-596a-1912-54b7-498495a2f8f2.png)

６, より細かいtierが選択できます
![５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/209cfd50-7438-6ea0-d794-ac5a12e16c1c.png)

7, 現在の価格と変更予定の金額が表示されます
![６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/68777ed8-c091-9278-6245-1f1f092f783c.png)

8, 1の画像の画面に新たな項目が追加されました
![７.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/5299e568-b555-9e87-9a0b-1859c8d4f09f.png)

9, これで既存の価格のまま運用できるかと思います。間違いあればご教示ください。


## 公式の説明会もあるよ

4/12に公式のオンラインセッションがあります！
私も参加してみようかと思います。

![８.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/59e29b16-b542-1b79-d67c-112d44be4262.png)

App Store Connectへログインするとアクセスできます
https://developer.apple.com/events/view/SF7ZAYP3GY/dashboard

## 終わりに
細かい値段設定ができるのはいいですね！
DockerでNginx+uWSGI+Flask環境を作る

取り急ぎ必要だったため作りました。
# 環境
OS：Windows 11 Pro
Docker Desktopインストール済み

# Flaskアプリ
最低限表示されるようにしておきます

```python:app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
	return "Hello World!"

if __name__ == "__main__":
	app.run(debug=True)
```

# Nginx
```conf:web/nginx.conf
server {
	listen 5000;
	server_name  localhost;

	location / {
		include uwsgi_params;
		uwsgi_pass unix:///tmp/uwsgi.sock;
	}
}
```

# uWSGI
```ini:uwsgi.ini
[uwsgi]
module = app
callable = app
master = true
processes = 1
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
wsgi-file = /app.py
```

# Docker
```text:.env
HOME_PATH = './'
ROOT_PATH = '/var/www/html/'
```

```text:requirements.txt
flask
uwsgi
```

```Dockerfile:Dockerfile
FROM python:3.11

RUN mkdir -p /var/www/html/
COPY requirements.txt /var/www/html/
COPY uwsgi.ini /var/www/html/
COPY .env /var/www/html/
COPY const.py /var/www/html/
COPY app.py /var/www/html/
COPY /data/ /var/www/html/
WORKDIR /var/www/html/

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install -r requirements.txt
```

```yml:docker-compose.yml
version: '3'

services:
  app:
    image: python:3.11
    build: ${HOME_PATH}
    container_name: app
    working_dir: ${ROOT_PATH}
    volumes:
      - ${HOME_PATH}:${ROOT_PATH}
      - socket:/tmp
    command: uwsgi --ini ${ROOT_PATH}uwsgi.ini
    restart: always
    tty: true

  nginx:
    image: nginx:latest
    ports:
      - "5000:5000"
    volumes:
      - ${HOME_PATH}web/nginx.conf:/etc/nginx/conf.d/default.conf
      - socket:/tmp

volumes:
  socket:
```

# 構成
こんな感じになります。
ちゃんと分けるべきなんですが取り急ぎ...

```
app/
 ├── web/
 │    └── nginx.conf
 ├── .env
 ├── app.py
 ├── docker-compose.yml
 ├── Dockerfile
 ├── requirements.txt
 └── uwsgi.ini
```

# 実行
```shell
docker compose up --build
```

http://localhost:5000 にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308640/75430c4a-eafa-bfd4-90e4-9b0e48ebbcdd.png)
表示されました！

一応、何をやっているかというと、NginxとuWSGI間で疎通するようソケットファイル等を設定しています。
Docker起動時、実行用ファイルをNginxの公開ディレクトリ（/var/www/html）にコピーし、コマンド「uwsgi --ini /var/www/html/uwsgi.ini」を実行しています。

# 参考
参考にさせていただきました。ありがとうございます。

[Flask+uWSGI+NginxでWSGIを試してみる](https://amateur-engineer-blog.com/flask-uwsgi-nginx/)
[Flask + uWSGI + Nginx でハローワールドするまで @ さくらのVPS (CentOS 6.6)](https://qiita.com/morinokami/items/e0efb2ae2aa04a1b148b)
[Flask + uwsgi + NginxでAPIを実行する](https://qiita.com/Jazuma/items/521cf31538cb618d285a)
LightGBM：Training APIとScikit-learn APIの違い

# はじめに
LightGBMで初めてモデル作成するときに、APIが2種類あって混乱することがあると思います。本記事で実装の差異に注目してモデルを作成しようと思います。

:::note info 
**こんな方におすすめ**
・データ分析初心者
・とりあえずLightGBM使ってコンペに参加しようと考えている人
:::

# 1. データ準備
Breast Cancer Wisconsin (Diagnostic) Data Setという乳がんの診断結果をもとに、患者が良性か悪性かを分類する二値分類のデータセットを用います。また、評価指標にはAccuracyを用います。

```py
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import lightgbm as lgb

# データセットをロードする
data = load_breast_cancer()

# シード
seed = 42

# 説明変数をXに、目的変数をyに格納する
X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=seed)
```
ちなみにseedに42がよく使われる理由は下の記事を参考に

https://qiita.com/ofutonton/items/8cb88b34375bf473e45e

# 2. Training APIで実装
大まかには、Datasetオブジェクトの作成 -> パラメータ辞書の作成 -> train()で学習といった流れになります。
**Datasetオブジェクトの作成**と**trainで学習**するところがScikit-learn APIと異なる点です。
```py
# Datasetオブジェクトの作成 (異なるポイント①)
d_train = lgb.Dataset(data=X_train,label=y_train)
d_test = lgb.Dataset(data=X_test,label=y_test)

# パラメータ設定
params = {
    'objective':'binary', # 二値分類タスク(回帰であればregression)
    'metric':'binary_logloss', # objectiveを定義しているので自動入力されるが、明示しておく
    'n_estimators':10000, # early_stopping使用時は大きな値
    'verbosity': -1, # コマンドライン出力しない設定
    'random_state':seed
}

# モデルの構築・学習 (異なるポイント②)
gbm = lgb.train(params, d_train, valid_sets=[d_test], # early_stoppingの評価用データ
                callbacks=[lgb.early_stopping(stopping_rounds=10, verbose=True)] # early_stopping用コールバック関数
               )

# テストデータで予測
y_pred = gbm.predict(X_test)
y_pred = y_pred.round(0) # 丸め込み

# テストデータの評価
accuracy = accuracy_score(y_pred,y_test)
print(accuracy)
# 0.9736842105263158
```
※ early_stoppingを指定することで、過学習の防止や時間の短縮に繋がります。
設定できるパラメータについて知りたい方は、以下の記事やドキュメントを参考に

https://qiita.com/nabenabe0928/items/6b9772131ba89da00354

https://lightgbm.readthedocs.io/en/latest/Parameters.html


# 3. Scikit-learn APIで実装
大まかにはパラメータ辞書の作成 -> LGBMモデルのインスタンス作成 -> fit()で学習といった流れになります。
**LGBMモデルのインスタンス作成**と**fitで学習**するところがTraining APIと異なる点です
```py
# パラメータ設定
params = {
    'objective':'binary',
    'metric':'binary_logloss',
    'n_estimators':10000,
    'verbosity': -1,
    'random_state':seed
}

# インスタンスの作成 (異なるポイント①)
gbm = lgb.LGBMClassifier(**params)  # 回帰であればlgb.LGBMRegressor()

# モデルの学習 (異なるポイント②)
gbm.fit(X_train, y_train, eval_metric='bainry_logloss', eval_set=[(X_test, y_test)],
        callbacks=[lgb.early_stopping(stopping_rounds=10, verbose=True)]
       )

# テストデータで予測
y_pred = gbm.predict(X_test)
y_pred = y_pred.round(0) # 丸め込み

# テストデータの評価
accuracy = accuracy_score(y_pred,y_test)
print(accuracy)
# 0.9736842105263158
```

# 4. まとめ
今回はLightGBMの分類モデルの作成方法を、APIに着目してシンプルにまとめてみました。今回はホールドアウトで評価していますが、クロスバリデーションを行う場合もTraining APIとScikit-learn APIで異なります。下の記事が参考になります。

https://qiita.com/c60evaporator/items/2b7a2820d575e212bcf4#%E7%8F%BE%E5%9C%A8%E3%81%AE%E6%8E%A8%E5%A5%A8%E6%96%B9%E6%B3%95-%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0early_stopping-1

最後までご覧いただきありがとうございました！
Macで使いたい便利ソフトまとめ

# Macで使いたい便利ソフトまとめ

* 1Password
パスワード管理はこれですね。

* Google日本語入力
ことえりが標準で入っているのですが、イマイチ馴染めず、こちらおすすめです。

* Visual Studio Code
エディターはこれだな

* Transmit
使いやすいFTPソフト
(Forkliftというソフトもあるみたいです)

* FireAlpaca
イラレもXDもないけど、なんか編集したいときに使えます

* Skitch
スクショに説明書きとか入れたいときに使えます

* ImageOptime
webサイト用に画像圧縮したい人向け

* iTerm
ターミナルはこれ

* Local
ローカルでWordPress開発するならこれ
[公式サイト](https://localwp.com/)

* MAMP
ローカルでさくさくPHP使いたいならこれ

* Prepros
scssをコンパイルできる

* Sequel Pro
DBの中身を見れる

* SourceTree
とりあえずgit使いたいならこれ

* Virtualbox + Vagrant
ローカルで仮想マシン立てたい人向け
（2023年3月では、M1のmacでは使えない模様）

* WOFFコンバーター
フォントのサブセット化できます

# Visual Studio Codeの拡張機能
* Auto Close Tag
タグ勝手に閉じてくれる

* Japanese Language Pack for Visual Studio Code
日本語にしたい人向け

* Laravel Extra Intellisense
Laravel使う人向け

* Output Colorizer
なにに使ったんだろう

* Path Intellisense
パス自動補完。ディレクトリとファイル名覚えられない人向け

* PHP Intelephense
php使う人向け。とりあえず、エラーのところ表示されるので助かる。
使ってない変数も分かりやすい。

* Prettier - Code formatter
なんか入ってた

* Vetur
Vuejs使う人向け

* vscode-icons
ファイルのアイコン表示したい人向け
Googleデジタルマーケティング＆Eコマース：Eコマースプラットフォーム

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8957baaf-ce73-a2a4-19cd-72db89b6874f.png" width="800">

# Eコマースプラットフォーム

代表的なプラットフォームとしては

- Wix
- Shopify
- BigCommerce
- Squarespace
- WooCommerce
- Magento

などが挙げられます。

プラットフォームの基本的な違いとして、オープンソースのソフトウェアを使用しているか、Software-as-a-Serviceの略であるSaaSを使用しているかという点が挙げられます。

# オープンソースのソフトウェア

オープンソースのソフトウェアは、ユーザーがオリジナルのソースコードにアクセスし、編集することができます。つまり、企業は自社のEコマースサイトを自由にカスタマイズすることができます。

小売業者が完全に所有する建物の中にある実店舗を想像してください。小売業者は、店舗を完全に改装することができます。これは、フルカスタマイズが可能なオープンソース・プラットフォームと同様です。

オープンソースプラットフォームの場合、企業はEコマースストアの外観や機能を完全にコントロールすることができますが、コード内で変更を加える方法を知っているか、Web開発の専門家を雇うことができる必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc13ab99-c281-e9ff-0fa0-198e2e5c1a0c.png" width="600">

- WooCommerceは、その使いやすさから業界のエキスパートの間で人気があります。
- CubeCartは、他のプラットフォームよりも強固なテクニカルサポートを提供しています。

# SaaS

SaaSは、サブスクリプション・ベースで利用可能なウェブベースのソフトウェアを指します。ユーザーは、利用するためにサブスクリプションを購入する必要があります。SaaS型ECプラットフォームは、ある程度のカスタマイズは可能ですが、ソースコードにアクセスすることはできません。ほとんどのSaaS型Eコマースプラットフォームは、企業がその規模、予算、必要なサポートのレベルに基づいて選択できるさまざまなプランを提供しています。ShopifyとBigCommerceは、SaaSプラットフォームの2つの例です。

先ほどの例で言えば、SaaSプラットフォームは、店舗スペースをリースしている実店舗と似ています。建物の維持管理を行うのは大家さんです。テナントは建物に一定の変更を加えることができますが、その変更は家主が許可する範囲内である必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1ee84ed2-0a29-c341-0cea-a833998902e0.png" width="600">

- Shopifyは、最も信頼されているSaaSプラットフォームの一つです。
- Squarespaceは、最もユーザーフレンドリーなオプションの1つと考えられており、Wixはデザインとカスタマイズを重要視しています。

# オープンソースのメリット・デメリット

#### メリット

- ECショップのデザインや機能を完全にコントロールできることです。Webサイト上で利用可能な機能、または技術的な特徴や機能に変更を加えることができるため、企業は顧客体験を向上させるために無制限にアクセスすることができます。カスタマイズの選択肢は無限大です

#### デメリット

- Eコマースストアを作成・維持するために必要なコーディングや技術的なスキルが必要であることが挙げられます。
- 企業がインターネット上にウェブサイトを公開するためのサービスであるWebホスティングサービスも別途支払う必要があります。オープンソースのプラットフォームは、それ自体では無料または低価格であっても、Webホスティング、Webデザイン、Web開発、セキュリティ、ITメンテナンスなどの追加コストを考慮する必要があるのです。

# SaaSのメリット・デメリット

#### メリット

- ホスティング、セキュリティ、顧客サービスを提供するオールインワンソリューションであることです。SaaSプラットフォームは、ビルトインのテンプレートとユーザーフレンドリーなソフトウェアを提供しており、コーディングのスキルがなくても、企業が迅速に店舗を立ち上げることができます。

#### デメリット

- カスタマイズには限界があり、高度なカスタマイズにはコーディングスキルが必要な場合もあります。
- 特定のサードパーティアプリやショッピングチャネルとしか統合できない場合もあります。また、特定の支払い方法しか利用できない場合もある。
- プラットフォーム内のいくつかの機能には追加料金がかかる場合があります。

# 全てのタイプのプラットフォームに適用される考慮すべきこと

- Eコマース・ストアにおけるWebページの読み込み速度です。遅いサイトは、顧客をイライラさせ、離脱の原因になります。調査によると、遅すぎると最大90％のお客様がサイトを放棄するそうです。さらに、モバイルの読み込み時間が1秒遅れると、コンバージョン率に最大20％の影響を与える可能性があります。
- 検索エンジンの検索結果で上位に表示される可能性です。プラットフォームの検索エンジン最適化（SEO）機能は、オンライン検索でのストアのパフォーマンスに影響を与えます。さらに、サイト上で使用されるSEOキーワードやフレーズも違いになります。
- プラットフォームには、成長の余地があるかどうかの違いがあります。

:::note info
企業が拡大するにつれ、プラットフォームはトラフィックの増加に対応し、多数の商品を扱うことができ、成長企業のマーケティングニーズに対応するためにより柔軟でオプションの多いものにする必要があります。
:::
Windows10でリモートデスクトップ接続先の音が鳴らないように

# 要件

1. パソコンA ⇒ パソコンB　へリモートデスクトップして使っている。
1. パソコンBの音（キー操作とかのピロンピロン音）がパソコンA側で鳴ってうるさいので、パソコンBのリモートオーディオの音量を0%にしてる。
（パソコンBの音は一切鳴らなくてよい）
1. リモートデスクトップ終了 ⇒ 再度リモートデスクトップ　をするとパソコンBのリモートオーディオの音量が100%にリセットされる。
1. リモートデスクトップするたび、 **毎回** パソコンBのリモートオーディオの音量調整するの面倒くさい。

# 対応

『リモートデスクトップショートカット（rdpファイル）』作ればいい。
そこに『接続先の音が鳴らないように』という設定を仕込んでおく。
リモートデスクトップする時はrdpファイルを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d4b7edd2-b8a5-24f1-bcf6-7fa141deca38.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9e9650b1-76d4-007b-0eac-2c7595bc6a78.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b34e469a-da43-ab56-86b4-40b885fce905.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4f690b97-33ca-7e31-7c86-b6d9937c80cc.png)

# 参考サイトさん

https://zenn.dev/kittybbit/articles/d4bb282bd87244

# バージョン

Windows 10 Pro 22H2 OSビルド 19045.2788
git pullして WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! が表示されたら

## git pullに失敗

GitHubで管理しているリポジトリで`git pull`したところ次のメッセージが表示され、`git pull`が中止されました。

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/ac377816-3567-8b11-23e3-a712893b6caf.png)

これはどういう意味のメッセージで、どういう対応をしたらいいのでしょうか？
順を追って理解していきたいと思います。

## ChatGPを使ってエラーメッセージを読む

まず最初にこのエラーメッセージ全文をChatGPTに貼り付けます。
すると、英語でエラーメッセージの意味を解説してくれます。

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/c5b86cf8-68e3-3b1d-e574-eca74282065b.png)

このまま読んでもいいのですが、日本語で説明してもらいます。

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/e4b06905-9989-138f-4d4b-44fcce0c7297.png)

GitHubのSSHキーが交換されたためこのメッセージが表示されたことがわかります。

## fingerprintsの確認


ChatGPTの説明にしたがって https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints を開きます。

![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/d8b3b0fc-6b1b-dde0-3353-a6c3b4d48f75.png)

ここに表示されているfingerprintsの値を確認します。後ろに`(RSA)`がついている値を確認します。

> SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.

この値が最初のメッセージに含まれる値と同じかどうかを確認します。

![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/9f3086c3-da9c-e3bf-a307-f38adc126226.png)

青線とで囲んだ部分の値を見ます。
同じです。なぜ、この確認が必要なのでしょうか？

ChatGPTの説明にある

> 中間者攻撃の兆候である可能性もあります。

かどうか確認するためです。

中間者攻撃とは、SSHでgithub.comと通信する経路の途中に偽の通信相手が割り込む攻撃です。
SSHで経路を暗号化しても、間に偽の通信相手が入ると、暗号化した通信内容を偽の通信相手に見られてしまいます。
これを防ぐ為に通信相手を確認する必要があります。

今回はGitHubが公式ページで公開しているfingerprintsと、SSHの通信相手が送ってくるfingerprintsを目で見比べて確認しました。

## 古いfingerprintsを削除

確認が出来たら、github.com用の古いfingerprintsを削除します。
fingerprintsは通常、ユーザーディレクトリの`.ssh/known_hosts`に保存されています。
エラーメッセージやChatGPTの説明通りつぎのコマンドで削除できます。
`ssh-keygen -f "/home/ledsun/.ssh/known_hosts" -R "github.com"`



![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/eaf53251-ea57-ab80-af90-cd967f75b3e3.png)


## ふたたびgit pull

古いfingerprintsを削除できたら、もういちど`git pull`します。

![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/a0dae627-e6fc-3607-8c1d-21b8687da7c3.png)

ここでもfingerprintsが正しい相手のものか確認します。
よく見ると、最初のエラーメッセージとは別の値になっています。
`SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU`です。
これはSSHの暗号化に使う鍵の方式がRSAとEd25519でちがうために起きています。

fingerprintsを確認できたら`yes`と入力します。
`git pull`が実行されます。

このときよく見ていると次のようなメッセージが表示されます。

> Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.

新しいfingerprintsが保存されたことがわかります。
次の`git pull`ではfingerprintsの確認はもとめられません。

## 参考

- https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/ にGitHub公式の説明があります。
androidでelixir その2

# 概要
androidでelixirやってみる。
インストールまで

# 手順

# androidを購入。

# userlandをインストール。

スペックを確認。

- ubuntuバージョン　22.04
- os android9
- cpu        ARMv7 4 core
- memory     2GB


![Screenshot_20230327-090059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c2ff21a8-303b-b73b-4d4b-a0901fc77e78.png)

# elixirインストール。

```
$ sudo apt install erlang elixir

```

elixir v1.12.2


以上。
開発時に使うwebサイトまとめ

# アイコン
* [ICON BOX](https://iconbox.fun/)
* [Boxicons](https://boxicons.com/)
* [MingCute Icon](https://www.mingcute.com/)
* [IconScout](https://iconscout.com/unicons/explore/line)
* [Potlab Icons](https://www.potlabicons.com/)

本当はイラレなど使えて、自分でアイコン作れれば一番なんですけどね...


# イラスト・写真
* [unDraw](https://undraw.co/illustrations)
* [Unsplash](https://unsplash.com/ja)
* [pixabay](https://pixabay.com/ja/)
* [商用利用無料、国内のフリーイラスト素材の総まとめ](https://coliss.com/articles/freebies/freebies-illustrations.html)
* [チェックしておきたい無料素材サイト](https://pulpxstyle.com/post-192/)


# htmlとcss
[HTML5 入れ子チートシート](https://yoshikawaweb.com/element/)

[colorate](https://colorate.azurewebsites.net/ja)
メインカラーから薄くした色とか出すときに、結局これに落ち着いた

[CSS Gradient](https://cssgradient.io/)


[これだけは押さえよう！住所フォームの作り方](https://blog.kenall.jp/entry/address-form-best-practice)
住所入力欄について毎回考えるのめんどくさい人向け


# webFont
[2022年に最適なfont-familyの書き方](https://ics.media/entry/200317/)
フォントなににするか自分で考えるのめんどくさい人向け

# JavaScriptライブラリ
[slick](https://kenwheeler.github.io/slick/)

[budoux](https://github.com/google/budoux)
[超簡単に自動で改行を調整してくれるBudouXを使ってみた](https://evoworx.dev/blog/budoux/)
日本語のwebサイトでの改行位置が気になっちゃう人向け

[YubinBango](https://github.com/yubinbango/yubinbango)
[WEBページで郵便番号から住所を自動入力するライブラリ「YubinBango」](https://www.id-frontier.jp/blog/tech/web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%A7%E9%83%B5%E4%BE%BF%E7%95%AA%E5%8F%B7%E3%81%8B%E3%82%89%E4%BD%8F%E6%89%80%E3%82%92%E8%87%AA%E5%8B%95%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%83%A9%E3%82%A4/)
住所を郵便番号から自動補完してくれる


# Google構造化データ
[構造化データテスト](https://developers.google.com/search/docs/appearance/structured-data?hl=ja)

# たまに見る
* [Pulp Note](https://pulpxstyle.com/)
* [ICS MEDIA](https://ics.media/)
Maltego Transform Serverの構築中にApacheが起動しないトラブル


以下のMaltegoのページに記載されている手順に従って、Transform Serverを構築した。

環境：Ubuntu 22.10

[Production Transform Server using Apache2](https://docs.maltego.com/support/solutions/articles/15000034509-production-transform-server-using-apache2#apache-server-0-1)

ApacheをRestartするコマンド実行時にApacheが起動せず、以下のエラーが出た。
```
░░ Subject: A start job for unit apache2.service has begun execution
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░ 
░░ A start job for unit apache2.service has begun execution.
░░ 
░░ The job identifier is 7809.
Mar 27 05:02:17 ubuntu-s-2vcpu-4gb-sgp1-01 apachectl[69575]: AH00526: Syntax error on line 2 of /etc/apache2/sites-enabled/TRX.conf:
Mar 27 05:02:17 ubuntu-s-2vcpu-4gb-sgp1-01 apachectl[69575]: Invalid command 'WSGIDaemonProcess', perhaps misspelled or defined by a module not incl>
Mar 27 05:02:17 ubuntu-s-2vcpu-4gb-sgp1-01 apachectl[69571]: Action 'start' failed.
Mar 27 05:02:17 ubuntu-s-2vcpu-4gb-sgp1-01 apachectl[69571]: The Apache error log may have more information.
Mar 27 05:02:17 ubuntu-s-2vcpu-4gb-sgp1-01 systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
```

` Invalid command 'WSGIDaemonProcess'`が出ており、これが原因と分かった。ググった結果、Apacheにwsgiのmodが有効化されていないとわかり、以下のコマンドを実行した。

`a2enmod wsgi`

Apacheが正常に立ち上がった。
git ignoreやり方　初級者編

# 対象者

* git初学者.  

# 目次

1. git ignoreとは

1. なぜgit ignoreは必要なのか.  

1. git ignoreの使い方

# git ignoreとは
⇨一部のファイルやフォルダーをgitの管理から外す機能.  
⚠️ちなみにignoreは無視するという意味
基本的にデータベースファイルをgithubにはあげない。

# なぜgit ignoreは必要なのか.  
→個人情報を不特定多数の誰かに悪用されないようにするため.  
もしgit ignoreを使わずgithubにpushすると誰にでも個人情報が盗まれる
![スクリーンショット 2023-03-27 14.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/ce08797c-3cf4-18e8-d9e2-ab7ffda077e3.png)

git ignoreを使うと

特定のファイルやフォルダーの情報を第三者に悪用されなくなる。
![スクリーンショット 2023-03-27 14.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/24983136-0278-ffd1-971d-65a7999aeb12.png)

#git ignoreの使い方
①まずgitで管理して欲しくないフォルダーやファイルを作成。
例　私の場合narutoのファイルを作成しました。
![スクリーンショット 2023-03-27 14.02.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/f0484075-8a3e-7b92-c395-44ea3eb86acf.png)

git statusで状況確認してみると
![スクリーンショット 2023-03-27 14.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/895980d0-b441-f047-1ac3-c60e3290fe53.png)


Untracked fileから、この時点ではまだgitはnaruto.html.erbを管理していないことがわかる。
注意:git ignoreはgitに管理していないファイルをgitで管理しないようにする方法なので、もしすでにgit で管理されているファイルをgit ignoreで管理しないようにするのはできない。

②.gitignoreというファイルを一番上の階層のディレクトの中に作成する。↓の場合cat_findディレクトリの中に作成する。

![スクリーンショット 2023-03-27 14.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/08423d81-dd78-bfbe-edac-f98f9787bcd9.png)

③.gitignoreの中にgitで管理して欲しくないファイル名を記載する。このように.gitignoreファイル内にファイル名を記載
![スクリーンショット 2023-03-27 13.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/2aff3838-4589-a9e2-b150-7f48e673f32f.png)

終わり。
3/27 Linux コマンド操作part1

# 個人的リマインド用
ディレクトリ操作

## 基本コマンド
cd / → / ディレクトリに移動(cd)
pwd → 今いるディレクトリを表示
ls → 今いるディレクトリの中にあるものを表示
mkdir → ディレクトリを作成
rmdir → からのディレクトリを削除するコマンド

## ディレクトリの構造
**ディレクトリとは** ファイルが保存されている場所 いわゆるフォルダ
→入れ子構造になっている(親ディレクトリ, 子ディレクトリ)
→ルートディレクトリを頂点とした階層構造(ディレクトリーツリー)

**windowsとの違い** ウィンドウズは複数のドライブから階層が始まる
**マウント** Linux…複数ディスクがあると、ルートディレクトリ配下にディレクトリとしてくっつける。

**主要なディレクトリ**
**/bin** 一般、管理料ユーザーが使用するコマンドの実行ファイルを格納、特に重要度の高いもの
**/dev** デバイスファイル(ハードウェアをファイルとして扱えるようにしたファイル)を格納
**/etc** 設定ファイルを格納 Linuxで動作するアプリケーションの設定ファイルや、Linux自体の設定に関わるファイルが置かれている
**/home** ホームディレクトリ(Linuxのユーザーごとに割り当てられる個人用ディレクトリ) が配置される。ユーザーはホームディレクトリ内に自由にファイルやディレクトリを作成できる
**/sbin** 管理者ユーザー向けのコマンドの実行ファイルを格納
**/tmp** 一時的なファイルを格納。アプリケーションの実行中に、結果を一時的にファイルとして保存する場合に使用。定期的に削除される。
**/usr** 追加した各種アプリケーションと、それに付随するファイルを格納
**/var** 変化するデータを格納。アプリケーションを動作する上で作成されたログなどを格納

## 各コマンドの詳細
**cd**
```
cd /home/tanaka/(ディレクトリ)

カレントディレクトリ　現在自分がいるディレクトリ 「.」
親ディレクトリ 1つ上の階層のディレクトリ 「..」
ホームディレクトリ /home/ユーザー名 ディレクトリ 「~」
ルートディレクトリ 「/」ディレクトリ 「/」
```

**pwd**
```
pwd [オプション]
```

**ls**
```
ls [オプション][ディレクトリ・ファイル名]

パス名展開を使うと複数のファイルを1度に指定できる
* 任意の文字列 ls *.html(拡張子がhtmlのファイルの一覧を表示できる)
? 任意の1文字 ls /bin/z???(zから始まり4文字で終わるファイルを表示)
```
**オプション**
ハイフンに何かの記号をつづける形の引数をオプションと呼ぶ
コマンドにオプションを与えることで、コマンドの動作を変えることができる
```
ls -l(ファイルの詳細情報を表示する)
ls -a(隠しファイル含めた全てのファイルを表示する)
ls -F(ファイル種別を表示する)(/(ディレクトリ), @, *(実行ファイル), 記号なし)
```
**mkdir**
```
mkdir [オプション] <作成するディレクトリ名>

mkdir -p test/2023/02 一気に複数の構造を作れる 
```

**rmdir**
```
rmdir <ディレクトリ名> ※空でないディレクトリを削除するとエラーになる
```

## パスとは
パスはディレクトリやファイルの住所情報
絶対パス(/ディレクトリから始まる) or 相対パス(カレントディレクトリから始まる)
「.」はカレントディレクトリ、「..」は親ディレクトリを表す

## コマンドの使い方を調べる
--helpで、コマンドのヘルプメッセージを表示する
```
<コマンド>  --help
ls [オプション]... [ファイル]...
使用方法、コマンドの概要、利用可能なオプション一覧を教えてくれる
```
```
man <調べたいコマンド名>

man -k move キーワードから検索もできる
```
Spring bootで簡単なWebアプリを作ってみる(総集編)

こんにちは。船井総研デジタルのいっちーです。

今回は、全7回に渡って執筆させて頂いた「Spring bootで簡単なWebアプリを作ってみる」の総集編です。

# 対象読者
この記事は、Spring bootを使ってこれからシステム開発を学んでいこうとしている人を対象として書きました。「筆者自身が若かりし頃に、こういった資料があれば良かったなぁ。」と思った考えを元に、画面遷移と一通りのCRUDがある簡単なシステムを作るという想定で書いてみましたが、この記事が何らかの形で読者様のお役に立てていれば幸いです。

# 記事

業務でシステム開発をしていく流れをできるだけ意識して、要件定義から設計、実装と書き進めていきました。

## 要件定義

https://qiita.com/fsd_itchy/items/384f05225e83f2705cf4

## 環境構築～画面設計

https://qiita.com/fsd_itchy/items/368d0424ba4de12eed61

https://qiita.com/fsd_itchy/items/fe27a217f5398c09febd

https://qiita.com/fsd_itchy/items/b85a52a28fd925027791

## ロジック設計、実装

https://qiita.com/fsd_itchy/items/271d1d6778f8f9591ee4

https://qiita.com/fsd_itchy/items/d03dbf9af769c7281196

https://qiita.com/fsd_itchy/items/07219321c7c18cd295b8

システムの素材(画像・ねぎ投稿のテキスト)は、船井総研デジタルの同僚@fsd-jume氏に提供頂きました。氏の記事もご愛読いただければ幸いです。

# 反省点
記事の中盤で、DBコンテナの設定ミスがあることに気が付き、設定ファイルの修正を行いました。他にも気付いてないやらかしがあるかも知れませんが、コメント等でご指摘いただければ幸いです。
開発環境からソースを書き写す際にコピペミスとかもしてるかも知れません。見つければその都度直してますが、直しきれてないものがあったらごめんなさい。

# 次回の記事

案件の都合で、今までやったことなかったGoやVueを使う必要が出てきたので、そのあたりの学習記事を書いていければと思います。
また、技術そのものとは関係ないコラム的な記事も気が向いたら書くかも知れません。

それではまた。
【備忘録】AutopilotとGNSSモジュールの配置について

## はじめに
ArdupilotでROVER作る際に覚えておくべき配置の基本について記載します。
車体の重心付近にAutopilotを配置できない車体の場合、向きやオフセット位置の設定が必要となります。
これらを設定しないとちゃんと動かないので合わせてください。

:::note
注意
RCカーをベースとした車体ではこの設定は不要（ほとんどの部品が重視付近におけるため）ですが
大きめの車体を作成するような場合、重心からズレた位置に部品を配置する場合がありますので、オフセットの設定が必要となります。
:::

## 対象
|項目|値|
|-|-|
|ファーム|Ardupilot Rover 4.2|
|Autopilot|CubePilot（Phixhawk2）|

## 基本
基本は車体の重心付近に配置する

https://ardupilot.org/rover/docs/common-mounting-the-flight-controller.html

## オフセット設定
Autopilotが重心付近に配置できない場合はオフセット方向の指示が必要です。
GPSに関してはGPSでYAWを取得する場合、GNSSモジュールは水平方向に30cm以上離す必要がありますのでオフセットの設定が必要となります。

https://ardupilot.org/rover/docs/common-sensor-offset-compensation.html#common-sensor-offset-compensation

https://ardupilot.org/rover/docs/common-gps-for-yaw.html

設定が必要なパラメータ
・　INS_POS1_X、 INS_POS1_Y、 INS_POS1_Z ：　車両重心からIMU までの位置
・　GPS_POS1_X、 GPS_POS1_Y、 GPS_POS1_Z ：　車両重心からGNSSモジュール1 までの位置
・　GPS_POS2_X、 GPS_POS2_Y、 GPS_POS2_Z ：　車両重心からGNSSモジュール2 までの位置

## 車体の中心をどこに置くか？
Autopilotの場所はパラメータを設定することで指示できますが、車体の中心に関しては操舵方式によって異なりますので注意が必要です。
アッカーマン方式の場合、駆動輪を中心に車体が旋回しますので駆動輪間に重心を指定することでスムーズな動きが得られます。

|操舵方式|車体重心（中心）|備考|
|-|-|-|
|アッカーマン|駆動輪の軸間|キャスターも含む|
|スキッドステア|車体中心|旋回軸が車体中心にある物すべてが対象|

イメージしにくいので図を添付します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064722/373c0b38-745d-ab10-0446-7dbdc6b45578.png)


## Autopilotの方向を変える場合
ボードが非標準の向き (つまり、矢印が前を向いていない) で取り付ける場合は、 ジャイロのキャリブレーションを行う前にAHRS_ORIENTATIONの設定を行ってください。

#### 設定が必要なパラメータ
・AHRS_ORIENTATION ： [詳細](https://ardupilot.org/rover/docs/parameters.html#ahrs-orientation)

#### 回転方向のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064722/fe04d61c-66d8-6284-a06f-e8bf66eb74f1.png)

## 参考
https://ardupilot.org/rover/docs/common-mounting-the-flight-controller.html

https://docs.px4.io/main/en/config/flight_controller_orientation.html
グラデーションカラー + SVG アイコン付きのボタンをじわっと変化させる

デザイナーさんがグラデーションのついたボタンの色をマウスホバー時に変化させる(しかもSVGのアイコン付きなのでさらに面倒さが倍増)という案を出してきて、実装に苦労したので備忘録として残しておきます。

background: linear-gradient には transition が効かないので、じわっと変化させようとしても背景色だけ一瞬で切り替わってしまいます。
そこで before 疑似要素を重ねて opacity を変化させることで transition を実現しています(JavaScript は使いたくなかった)。

# デモ

まずはデモ。
ソースコード見ればすぐに真似できると思います。

https://codepen.io/amkt/pen/bGxzOzq

# コード

JavaScript は使わず CSS のみで実現しています。

## html

```html
<div class="container">
  <button class="button">
    <div class="text">ボタン</div>
    <div class="icon">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
        <path class="icon-path" d="M0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM294.6 135.1l99.9 107.1c3.5 3.8 5.5 8.7 5.5 13.8s-2 10.1-5.5 13.8L294.6 376.9c-4.2 4.5-10.1 7.1-16.3 7.1C266 384 256 374 256 361.7l0-57.7-96 0c-17.7 0-32-14.3-32-32l0-32c0-17.7 14.3-32 32-32l96 0 0-57.7c0-12.3 10-22.3 22.3-22.3c6.2 0 12.1 2.6 16.3 7.1z"/>
      </svg>
    </div>
  </button>
</div>
```

## SCSS

```scss
$primary-color: #066435;
$light-color: #0bb660;
$text-color: #fff;
$transition-time: 1s;

.container {
  display: inline-block;
}

.text {
  position: relative;
}

.button {
  position: relative;
  width: 300px;
  color: $text-color;
  border: solid 1px $primary-color;
  height: 36px;
  border-radius: 18px;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: all $transition-time;

  &::before {
    content: '';
    background: linear-gradient(90deg, $light-color, $primary-color);
    border-radius: 18px;
    position: absolute;
    width: 100%;
    height: 100%;
    transition: all $transition-time;
  }

  path {
    transition: all $transition-time;
    &.icon-path {
      fill: $text-color;
    }
  }

  &:hover {
    color: $primary-color;
    &::before {
      opacity: 0;
    }
    path.icon-path {
      fill: $primary-color;
    }
  }

  .icon {
    position: absolute;
    top: 8px;
    right: 9px;
    width: 18px;
    height: 18px;
  }
}
```

# 解説

まず hover したときの状態のスタイルを定義しておきます。
background-color は transparent なので省いています。

```scss
.button {
  border: solid 1px $primary-color;
}
```

次にその上に before 疑似要素をかぶせます。
これが hover していないときの表示なるので、ここにグラデーションの背景を設定します。

```scss
&::before {
  background: linear-gradient(90deg, $light-color, $main-color);
}
```

あとは hover 時に before 疑似要素を消すようにします。

```scss
&:hover {
  &::before {
    opacity: 0;
  }
}
```

ボタン内に配置した SVG の色も同時に変化させるために、path 要素の fill も CSS で設定します。
アイコンは配色がボタンと逆になるので、一見クラス名と色名が一致していないように見えますが、これで合っています。
```scss
path {
  &.icon-path {
    fill: $text-color;
  }
}
```
【jQuery】特定の位置から特定の位置まで要素を表示させる

こんにちは。E-kan株式会社の岡田です。

既存ページのABテストのため、外部ツールにjQueryでテストしたい要素を書き込んでページを上書きするという業務をよくやるのですが、この間またしても地味に苦労したので備忘録。
ざっくり必要なところだけ抜き出すとこんな感じです。

#### やりたいこと

- スクロールして最初のCTAボタンが画面上から消えたらフッターにフロートボタンを表示させる
- スクロールして最後のCTAボタンが画面上に表示されたらフッターのフロートボタンを非表示にする

```html
<html>
  <body>

    <section>
      <a id="ctabutton_01" href="form.html">CTAボタン01</a>

      （本文省略。それなりに長いし途中にCTAボタン02〜04がある。）

      <a id="ctabutton_05" href="form.html">CTAボタン05</a>
    </section>

    <footer>フッター</footer>

    <a class="floatBtn" href="form.html">フロートボタン</a>

  </body>
</html>
```

## jQuery
```javascript
//フロートボタンを特定の位置から特定の位置まで表示させる
$(window).on('load',function(){//頁内の全ての要素が読み込まれてから実行
  //ドキュメント全体の高さ
  var pageHeight = $(document).height();
  //頁上部から最初のCTAボタンまでの距離 ＋ CTAボタンの高さ(outerHeight:ボーダーの外側の高さ)
  var ctaFirst = $('#ctabutton_01').offset().top + $('#ctabutton_01').outerHeight();
  //ドキュメント全体の高さ - 頁上部から最後のCTAボタンまでの距離
  var ctaLast = pageHeight - $('#ctabutton_05').offset().top;

  $(window).on('scroll',function(){//スクロールすると実行される
    //現在のトップからの位置 ＝ ウィンドウの高さ ＋ スクロールした高さ
    var scrollPosition = $(window).height() + $(window).scrollTop();
    //スクロールが最初のCTAボタンを超える＆最後のCTAボタンを超えない場合
    if ($(window).scrollTop() > ctaFirst && pageHeight - scrollPosition  >= ctaLast) {
      $('.floatBtn').fadeIn(100);//0.1秒で出現
    } else {//最初のCTAボタンを超えない＆最後のCTAボタンを超えた場合
      $('.floatBtn').fadeOut(100);//0.1秒で消える
    }
  });
});
```

ちなみにこのテスト案は、ABテストで負けて本番環境へはリリースされませんでした。
悲しいのでここで供養。
Rubyにおいてのirbの基本的な使い方

## 概要
Rubyにおいてのirbについてと大まかな使い方をまとめました。

## irbとは

irb (Interactive Ruby) は、Rubyの対話式シェルです。irbを使用すると、Rubyコードを試し、実行する事が出来ます。irbを使用すると、Rubyの構文を試し、簡単なスクリプトを作成し、Rubyのライブラリを試し、実行する事が出来ます。

## 起動方法

irbを起動するには、ターミナルまたはコマンドプロンプトで `irb` と入力します。

```shell
$ irb
```

これでirbが起動されます。

## 終了方法

irbを終了するには、 `exit` コマンドを使用するか、 `Ctrl + D` キーを押します。

```shell
rb(main):001:0> exit
```
または`^D`
これでirbを終了できます。

## 使い方

irbを起動したら、次のようにRubyコードを入力する事が出来ます。
```shell
irb(main):001:0> puts "Hello, World!"
Hello, World!
=> nil
```

`puts` コマンドが実行され、文字列 `"Hello, World!"` が出力されます。 `=> nil` は、Rubyが返される値を示しています。この場合、 `puts` コマンドの返り値は `nil` です。

Rubyの変数を定義する事も出来ます。

```shell
irb(main):002:0> x = 10
=> 10
irb(main):003:0> puts x
10
=> nil
```

`x` という変数を定義し、値 `10` を代入しています。 `puts` コマンドを使用して、 `x` の値を出力します。

Rubyの式を評価する事も出来ます。

```shell
irb(main):004:0> 3 + 5
=> 8
irb(main):005:0> "Hello" + "World"
=> "HelloWorld"
```

`3 + 5` という式を評価して、 `8` が返されます。同様に、 `"Hello" + "World"` という式を評価して、 `"HelloWorld"` が返されます。

また、irbではRubyのコードを読み込むこともできます。例えば、以下のようにRubyのスクリプトを読み込む事が出来ます。

```shell
irb(main):006:0> load 'test.rb'
```
これで、カレントディレクトリにある `test.rb` ファイルのコードが実行されます。

以上が、irbの基本的な使い方になります。
Falco Ruleを紹介するシリーズ - Secret pushed into a public repository

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Secret pushed into a public repository」</b>です。
# Rule記述
```
- rule: Secret pushed into a public repository
  desc: A secret (AWS keys, github token...) was committed into a public repository
  condition: github.type=push and github.diff.has_secrets = true and github.repo.public=true
  output: One or more secrets were pushed into a public repository (repository=%github.repo repo_owner=%github.owner org=%github.org user=%github.user secret_types=%github.diff.committed_secrets.desc file=%github.diff.committed_secrets.files line=%github.diff.committed_secrets.lines url=%github.diff.committed_secrets.links) 
  priority: CRITICAL
  source: github
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/github" target=new>GitHub Plugin for Falco</a>をインストールすることで使用可能になるルールです。
本ルールは、パブリックリポジトリにSecretがプッシュされたことを検知します。
Secretは、パスワードやアクセスキーなど、環境内で使用される機密情報です
Secretを不適切に管理すると、セキュリティ侵害が発生する可能性があります。
KubernetesのSecretを安全に管理する方法については、<a href="https://sysdig.jp/learn-cloud-native/kubernetes-101/how-to-create-and-use-kubernetes-secrets/" target=new>こちらのサイト</a>をご参照ください。

# Condition（条件）
`github.type=push and`
githubのメッセージタイプが push で、

`github.diff.has_secrets = true and`
コミットのうちの１つのdiffがSecretを含む場合で、

`github.repo.public=true`
githubがpublic（公開されている）の場合

# Output（出力）
1つ以上のSecretがパブリックリポジトリにプッシュされました

`%github.repo`
リポジトリ名

`%github.owner`
リポジトリのオーナー名

`%github.org`
リポジトリが所属する組織名

`%github.user`
イベントをトリガーしたユーザー名

`%github.diff.committed_secrets.desc`
コミットされたそれぞれのSecretの説明

`%github.diff.committed_secrets.files`
コミットされたそれぞれのSecretのファイル名

`%github.diff.committed_secrets.lines`
コミットされたそれぞれのSecretの行ポジション

`%github.diff.committed_secrets.links`
コミットされたそれぞれのSecretのソースコードリンク
lockerService


# Action failed: ltng:require$controller$init [$A.lockerService.isLockerNextEnabledForComponent is not a function. (In '$A.lockerService.isLockerNextEnabledForComponent(c)', '$A.lockerService.isLockerNextEnabledForComponent' is undefined)]

+ [Salesforceアプリ内でのコンポーネントエラーについて](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000OrPNHSA3)

:::note

前にも同じエラーメッセージの質問があったので、回答したことがあるのですが何にも返答がなかったので機能するかは分かりませんが...

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000O7riISAR

https://docs.sharinpix.com/m/FAQ/l/1652944-i-got-a-locker-service-error-message-on-sharinpix-components-what-should-i-do
:::

バージョンを下げたら機能したようです。
ChatGPTで始めるJavaScript入門②～変数宣言と配列について～

# 概要
　今回は3.JavaScriptの文法と構文について、の上からなので、
　変数宣言から確認していきます。

　**※無料版なので、誤っている情報もあると思いますが、アウトプットできれば良しとします。**


# 変数宣言
　1つ目の変数宣言について、記述方法や注意点を聞いてみます。

　【質問】
　JavaScriptの文法と構文について、変数宣言の記述方法や注意点を教えてください。

　【回答】
　JavaScriptの変数宣言には、以下の3つのキーワードがあります。

　**1. var
　2. let
　3. const**

　varは古いバージョンのJavaScriptで使用されるキーワードで、
　現在はletやconstに置き換えられることが多くなっています。
　letは再代入が可能な変数を宣言するために使用され、
　constは再代入ができない定数を宣言するために使用されます。

　変数宣言には以下のような注意点があります。

　　1. 変数名は英数字とアンダースコア(_)で構成されます。ただし、数字で始めることはできません。
　　2. 大文字と小文字は区別されます。
　　3. 変数名は意味のある名前をつけるようにしましょう。
　　4. 変数を宣言する際には、必ず初期値を設定するようにしましょう。
　　　 初期値がない場合、変数はundefinedとなります。
　　5. letやconstを使用する場合、宣言した変数は宣言したブロック内でのみ有効となります。
　　　 ブロック外からアクセスできなくなります。
　　6. constを使用して定数を宣言した場合、その値は再代入できません。
　　　 ただし、オブジェクトや配列などの場合、プロパティの値は変更可能です。

　変数宣言の例を示します。

```javascript:variable.js
// varを使用した変数宣言
var x = 1;

　// letを使用した変数宣言
let y = "hello";

// constを使用した定数宣言
const PI = 3.14;
```

変数はlet、定数はconst　って感じですね。

# 複数の代入や配列宣言

他言語でよく使用される、複数の変数を１行で定義したり、
配列の宣言はどうするのか、聞いてみました。

　【質問】
　JavaScriptの文法と構文について、変数宣言の記述方法や注意点を教えてください。

　【回答】
　　はい、JavaScriptでは複数の変数を1行で代入することができます。
　　以下のように、複数の変数をカンマで区切って宣言し、それぞれに対して初期値を代入することができます。

```javascript:variable.js
　let x = 10, y = 20, z = 30;
```

また、配列を使用して複数の値を1つの変数に格納することもできます。
配列は、角括弧[ ]で囲んで、コンマで区切った複数の値を要素として持ちます。

```javascript:array.js
let numbers = [10, 20, 30];
```

配列の要素には、インデックス番号を使ってアクセスすることができます。

```javascript:array.js
console.log(numbers[0]); // 10
console.log(numbers[1]); // 20
console.log(numbers[2]); // 30
```

また、配列に新しい要素を追加する場合は、push()メソッドを使用します。

```javascript:array.js
numbers.push(40);
console.log(numbers); // [10, 20, 30, 40]
```

配列の要素を変更する場合は、インデックス番号を指定して新しい値を代入します。

```javascript:array.js
numbers[1] = 50;
console.log(numbers); // [10, 50, 30, 40]
```

以上が、JavaScriptで複数の変数を1行で代入したり、配列を使用する方法です。


構文の作りとしては多言語と同様で、そこまで困らなそうです。
slycotをpipでインストールする際のエラー

# 症状

`pip install slycot`した際にエラーが出て，正常にインストールできない．

# 環境

- `Ubuntu=20.04`
- `Python=3.10.5`
- `pip=23.0.1`

# 対処法

`slycot`の[github](https://github.com/python-control/Slycot)によれば，

>- Python 3.8+
>- NumPy
>- scikit-build
>- CMake
>- C compiler (e.g. gcc, MS Visual C++, clang)
>- FORTRAN compiler (e.g. gfortran, ifort, flang)
>- BLAS/LAPACK (e.g. OpenBLAS, ATLAS, MKL)

に依存しているようなので，これらを全部インストールしてからもう一度`pip install`することで正常にインストールできました．

## 実際にやったこと

### NumPyとscikit-buildのインストール

```bash
$ pip install numpy scikit-build
```

### cmakeのインストール

```bash
$ sudo apt install cmake
```

### OpenBLASのインストール

[こちら](https://www.kkaneko.jp/tools/ubuntu/cblaslinux.html)にしたがってインストール．

### 結果

```bash
$ pip install slycot
（省略）
Successfully installed slycot-0.5.3
```

となりインストールに成功しました．
btrfsのとりあえずの設定

# btrfsのとりあえずの設定

複数のHDDを使用する目的で使用する。
ただし、3TBと6TBのHDDの混在でRAIDが使えない。
一時的なデータ置き場としての用途で他の手段で二重化しているので堅牢性とかは考えていない。

```bash
sudo mkfs.btrfs /dev/sda
```

これで、btrfsのファイルシステムを作成し、HDDを追加して容量を増やしていく。
mountされた状態でないとコマンドが実行できないようだった。

```bash
sudo mount /dev/sda  /mnt/
sudo btrfs device add /dev/sdb /mnt/
sudo btrfs device add /dev/sdc /mnt/
```

これ、sdaがmountできなくなったらどうなるのか？と思って、/dev/sdbをマウントしたら、それでもマウント可能だった。
sdaが故障してもなんとかなりそう。

homeのバックアップとして使用したい。
かつ、snapshotを使いたいのでsubvolumeを作成する。
ディレクトリを作成した後、subvolumeとして指定するのは動かなかった。
最初からsubvolumeを作成する必要があるようだ。
試しに、subvolumeを作成し、スナップショットを取る。

```bash
sudo btrfs subvolume create home
sudo btrfs subvolume snapshot -r home home.snapshot # -r : read onlyのsubvolumeを作成するという意味
ls
sudo btrfs subvolume delete home.snapshot
```

fstabに設定を書き込む

```text
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /mnt/btrfs  btrfs defaults,autodefrag,noatime,lazytime,compress-force=zstd:13 0   2
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /home       btrfs defaults,autodefrag,noatime,lazytime,compress-force=zst:13,subvol=home 0 2
```

/mnt/btrfs以下にhomeのスナップショットを置く予定。autodefrag, noatimeなどは、負荷が少なくなるように、圧縮率は高く設定している。

## スナップショットの設定

`crontab -e`で以下の設定を行う。

```bash
crontab -e

# 以下を記述
59 23 *  * *  /usr/bin/btrfs subvolume snapshot -r /mnt/btrfs/home /mnt/btrfs/home_`date '+\%Y\%m\%d'`_daily
59 23 *  * 5  /usr/bin/btrfs subvolume snapshot -r /mnt/btrfs/home /mnt/btrfs/home_`date '+\%Y\%m\%d'`_weekly
59 23 28 * * /usr/bin/btrfs subvolume snapshot -r /mnt/btrfs/home /mnt/btrfs/home_`date '+\%Y\%m\%d'`_monthly
59 23 28 * * bash -c 'btrfs subvolume delete /mnt/btrfs/home_*_daily'
 0  0  1 * *  btrfs scrub start /mnt/btrfs/
```

これで1日に1回スナップショットが取られる。
念の為、weekly, monthlyを作成して、dailyは月末(28日)に消すなどをする予定。
最後の行は、月1のscrubを行う予定。
スナップショットを削除するときは、以下で可能。

```bash
btrfs subvolume delete /mnt/btrfs/home_XXXXX
```

で可能。
とりあえず、これで運用する。

## ディスクの削除

```bash
btrfs device remove /dev/sdXXXXXX /mnt/btrfs/

btrfs fi show /mnt/btrfs/
sleep 600s
btrfs fi show /mnt/btrfs/
```

みたいな感じで、ディスクを削除するのだがbtrfsは進捗を表示しないので、`btrfs fi show`で表示させている。
ちなみに、600Gのデータで10時間くらいかかる予定で、途中で再起動しても大丈夫だった。

表示としては以下のようになり、device sizeが0になるようだった。

```txt
root@myhost:~/btrfs# btrfs fi show /mnt/btrfs/
Label: none  uuid: b770844b-6cfb-4814-9f47-e7b3ba7eb77c
        Total devices 6 FS bytes used 2.85TiB
        devid    1 size 5.46TiB used 567.03GiB path /dev/sdd
        devid    2 size 2.73TiB used 517.03GiB path /dev/sdc
        (中略)
        devid    5 size 0.00B used 351.00GiB path /dev/sde
```
ChatGPTで始めるJavaScript入門①～学習する項目について～

# 概要
　ChatGPTの流行に影響され、
　これまで携わった経験の少ない言語で開発できないかと思い、
　とりあえずやってみています。
　まずは需要の高そうJavaScriptで始めてみます。

　自分ではコードを書かず、なにかしらのアウトプットをする　ことも目標に
　レッツチャレンジ！

　**※無料版なので、誤っている情報もあると思いますが、アウトプットできれば良しとします。**


# はじめに
　そもそもJavaScriptで開発をするには、どういう知識が必要なのか、
　根本的なところを聞いてみます。

　【質問】
　JavaScriptで開発をするには、どんな知識が必要ですか？

　【回答】
　JavaScriptはWeb開発において非常に重要な言語であり、
　開発をするためには次のような知識が必要になります。


　**1.プログラミングの基本知識**
　　JavaScriptは、他のプログラミング言語と同様に、
　　基本的なプログラミングコンセプトや制御構造、データ型、関数、変数などを
　　理解する必要があります。

　**2.HTMLとCSSの基本知識**
　　JavaScriptは、HTMLとCSSと一緒に使用されることが多く、
　　Webページの構造やスタイリングを理解する必要があります。

　**3.JavaScriptの文法と構文**
　　JavaScriptは、独自の文法と構文を持っており、
　　変数、関数、条件分岐、ループなどの概念を理解する必要があります。

　**4.DOMとjQueryの基本知識**
　　JavaScriptは、ドキュメントオブジェクトモデル（DOM）と
　　jQueryと一緒に使用されることが多く、
　　Webページの要素を操作する方法を理解する必要があります。

　**5.フレームワークの基本知識**
　JavaScriptには、React、Angular、Vueなどのフレームワークがあります。
　これらのフレームワークを使用するためには、それぞれの基本的な概念と使用方法を
　理解する必要があります。

　**6.開発ツールの基本知識**
　　JavaScriptの開発には、IDEやテキストエディタ、デバッグツールなどが必要になる場合があります。
　　これらのツールを使用する方法を理解する必要があります。

　以上の知識があれば、JavaScriptでWebアプリケーションを開発することができます。
　ただし、より高度なアプリケーションを開発する場合には、さらに深い知識が必要になる場合があります。

　ということで、1と2については多少理解しているので飛ばします。
　3以降を進めていきます。


# JavaScriptの文法と構文の種類

　3.JavaScriptの文法と構文について、どのような種類があるのかを聞いてみます。

　【質問】
　JavaScriptの文法と構文の種類にはどのようなものがありますか？

　【回答】
　JavaScriptには、多くの文法と構文があります。
　以下に、JavaScriptの主要な文法と構文の種類をいくつか挙げてみます。

　**変数宣言**
　　JavaScriptでは、変数を宣言する方法がいくつかあります。var、let、constがあります。

　**データ型**
　　JavaScriptには、文字列、数値、真偽値、配列、オブジェクトなど、多くのデータ型があります。

　**関数**
　　JavaScriptの関数は、functionキーワードを使用して宣言することができます。
　　また、アロー関数を使用して宣言することもできます。

　**条件分岐**
　　JavaScriptでは、if-else文を使用して、条件分岐を実装することができます。

　**ループ**
　　JavaScriptには、forループ、whileループ、do-whileループ、for-inループ、for-ofループがあります。

　**オブジェクト**
　　JavaScriptには、オブジェクトを作成するための簡潔な書き方があります。
　　これをオブジェクトリテラルと呼びます。

　**プロトタイプ**
　　JavaScriptには、プロトタイプを使用してオブジェクトを継承する方法があります。

　**クラス**
　　ES6からは、JavaScriptにクラスが導入されました。
　　これにより、よりオブジェクト指向的なコードを書くことができます。

　**イベント処理**
　　JavaScriptでは、イベントを処理するための方法があります。
　　addEventListenerメソッドを使用して、要素に対してイベントを登録することができます。

　**コールバック関数**
　　JavaScriptでは、関数を引数として渡すことができます。これをコールバック関数と呼びます。

　これらの文法と構文を理解することで、JavaScriptで様々な処理を実装することができます。


ということなので、次回以降は上記について確認していきます。
Github でWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED



# 症状

このところ表題のエラーが出て．．．

-   [qiita 記事](https://qiita.com/kuniyonkunisan/items/fbe254ff3150b2ea6d53)

に対処法があるが，


# 原因

原因は，

-   [We updated our RSA SSH host key](https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/)

Gihubのホストkeyがsecurityのために，23/3/24にupdateされた．


# 対処法

    ssh-keygen -R github.com

で.ssh/known\_hostsに登録されているgithub.comのssh-rsa keyが削除(remove)される．

接続すると

    ssh git@github.com

などで

```
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ED25519 key fingerprint is SHA256:+hoge hoge
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
```

となるが，yesと入力し，known\_hostsに登録．

これで，無事ssh接続がスムーズにいく．あ，

```bash
Hi daddygongon! 
You've successfully authenticated, 
but GitHub does not provide shell access.
```

なんで，実際には接続されませんが，git pushとかpullができます．


# 追記 <span class="timestamp-wrapper"><span class="timestamp">&lt;2023-03-27 月&gt;</span></span>

```
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '20.27.177.113'
Offending key for IP in /home/bob/.ssh/known_hosts:25
Matching host key in /home/bob/.ssh/known_hosts:28
```

などのエラーが出る．

これは，knwon\_hostsにgithub.comのIPアドレスが直打ちされているため．

その場合は，

    ssh-keygen -R 20.27.177.113

として削除したのちに，再トライ．



------
 - **source** ~/git_hub/grad_research_23/qiita_items/github_key_update.org
AVFormatIDKeyで指定可能な値 一覧

以下は、AVFormatIDKeyで指定可能な値と、それぞれのフォーマットについての説明、拡張子の一覧です。

kAudioFormatLinearPCM:
説明: リニアPCM形式でのエンコードを指定します。可逆圧縮で、高品質の音声を扱うことができます。
拡張子: .wav、.aiff
kAudioFormatAppleLossless:
説明: Appleの独自形式であるApple Lossless形式でエンコードを指定します。可逆圧縮で、オリジナルに近い音質を保ちながらファイルサイズを減らすことができます。
拡張子: .m4a
kAudioFormatMPEG4AAC:
説明: MPEG-4 AAC形式でエンコードを指定します。可逆圧縮でなく、非可逆圧縮のため、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .m4a、.mp4
kAudioFormatMPEG4CELP:
説明: MPEG-4 CELP形式でエンコードを指定します。圧縮率が高く、ファイルサイズを小さく保つことができます。
拡張子: .m4a、.mp4
kAudioFormatMPEG4HVXC:
説明: MPEG-4 HVXC形式でエンコードを指定します。可逆圧縮でなく、非可逆圧縮のため、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .m4a、.mp4
kAudioFormatMPEG4TwinVQ:
説明: MPEG-4 TwinVQ形式でエンコードを指定します。可逆圧縮でなく、非可逆圧縮のため、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .m4a、.mp4
kAudioFormatMACE3:
説明: MACE 3:1形式でエンコードを指定します。可逆圧縮で、ファイルサイズを削減しつつ音声品質を維持することができます。
拡張子: .wav、.aiff
kAudioFormatMACE6:
説明: MACE 6:1形式でエンコードを指定します。可逆圧縮で、ファイルサイズを削減しつつ音声品質を維持することができます。
拡張子: .wav、.aiff
kAudioFormatULaw:
説明: µ-law形式でエンコードを指定します。非可逆圧縮で、高品質の音声を扱うことができます。
拡張子: .wav、.aiff
kAudioFormatALaw:
説明: A-law形式でエンコードを指定します。非可逆圧縮で、高品質の音声を扱うことができます。
拡張子: .wav、.aiff
kAudioFormatQDesign:
説明: QDesign形式でエンコードを指定します。非可逆圧縮で、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .qdm、.qdm2
kAudioFormatQDesign2:
説明: QDesign2形式でエンコードを指定します。非可逆圧縮で、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .qdm、.qdm2
kAudioFormatQUALCOMM:
説明: QUALCOMM形式でエンコードを指定します。非可逆圧縮で、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .amr
kAudioFormatMPEGLayer1:
説明: MPEG-1 Layer 1形式でエンコードを指定します。非可逆圧縮で、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .mp3
kAudioFormatMPEGLayer2:
説明: MPEG-1 Layer 2形式でエンコードを指定します。非可逆圧縮で、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .mp3
kAudioFormatMPEGLayer3:
説明: MPEG-1 Layer 3形式でエンコードを指定します。非可逆圧縮で、高品質かつ小さなファイルサイズで音声を扱うことができます。
拡張子: .mp3
kAudioFormatTimeCode:
説明: SMPTEタイムコード形式でエンコードを指定します。映像や音声のタイミングを正確に同期させるために用いられます。
拡張子: なし
kAudioFormatMIDIStream:
説明: MIDIデータをストリーム形式でエンコードを指定します。MIDIシーケンスを扱うために用いられます。
拡張子: なし
kAudioFormatParameterValueStream:
説明: パラメータ値をストリーム形式でエンコードを指定します。オーディオプラグインによる音声処理時に用いられます。
拡張子: なし
kAudioFormatAppleLossless_V2:
説明: Apple Lossless形式の改良版であるApple Lossless V2形式でエンコードを指定します。可逆圧縮で、オリジナルに近い音質を保ちながらファイルサイズを減らすことができます。
拡張子: .m4a
kAudioFormatAC3:
説明: Dolby Digital AC-3形式でエンコードを指定します。非可逆圧縮で、高品質のマルチチャンネル音声を扱うことができます。
拡張子: .ac3
kAudioFormat60958AC3:
説明: IEC 60958-3 (S/PDIF) AC-3形式でエンコードを指定します。非可逆圧縮で、高品質のマルチチャンネル音声を扱うことができます。
拡張子: .ac3
kAudioFormatEnhancedAC3:
説明: Dolby Digital Plus形式でエンコードを指定します。非可逆圧縮で、高品質のマルチチャンネル音声を扱うことができます。
拡張子: .eac3
kAudioFormatDSD:
説明: Direct Stream Digital形式でエンコードを指定します。DSDと呼ばれる1bitの高品質オーディオデータを扱うことができます