OmniAICreator/Qiita-1.07M huggingface dataset:
Databricksの動的ファイルプルーニング

[Dynamic file pruning \| Databricks on AWS](https://docs.databricks.com/optimizations/dynamic-file-pruning.html) [2022/9/8時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

動的ファイルプルーニングによって、Delta Lakeテーブルに対する数多くのクエリーのパフォーマンスを劇的に改善することができます。特に動的ファイルプルーニングは、パーティショニングされていないテーブルや、パーティショニングされていないカラムのjoinにおいて効率的なものとなります。動的ファイルプルーニングのパフォーマンスインパクトは、データのクラスタリングと創刊するので、メリットを最大化するために[Z\-Ordering](https://qiita.com/taka_yayoi/items/a82b0b8fbdc74e6f9f01#z-ordering%E5%A4%9A%E6%AC%A1%E5%85%83%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)を使うことを検討してください。

動的ファイルプルーニングの背景やユースケースに関しては、[動的ファイルプルーニングによるDelta LakeのSQLクエリーの高速化](https://qiita.com/taka_yayoi/items/af8415bc7309c44b0855)をご覧ください。

# 設定

動的ファイルプルーニングは、以下のApache Spark設定のオプションで制御することができます。

- spark.databricks.optimizer.dynamicFilePruning (デフォルトはtrueです): オプティマイザにフィルターをプッシュダウンすることを指示するメインのフラグです。`false`に設定されると、動的ファイルプルーニングは有効化されません。
- `spark.databricks.optimizer.deltaTableSizeThreshold` (デフォルトは10,000,000,000バイト(10 GB)): 動的ファイルプルーニングを起動するのに必要なjoinのプローブ側におけるDeltaテーブルの最小サイズ(バイト)を表現します。プローブ側がそれほど大きくない場合には、フィルターをプッシュダウンする価値は低いので、シンプルにテーブル全体をスキャンしても構いません。`DESCRIBE DETAIL table_name`コマンドを実行し、`sizeInBytes`カラムを参照することで、Deltaテーブルのサイズを確認することができます。
- `spark.databricks.optimizer.deltaTableFilesThreshold` (デフォルトはDatabricksランタイム8.4以降では`10`、Databricksランタイム8.3以前では`1000`です): 動的ファイルプルーニングを起動するのに必要なjoinのプローブ側のDeltaテーブルのファイル数を表現します。プローブ側のテーブルが閾値よりも少ない数のファイルを含んでいる場合には、動的ファイルプルーニングは起動されません。テーブルに数ファイルしかない場合、動的ファイルプルーニングを行う必要性は低くなります。`DESCRIBE DETAIL table_name`コマンドを実行し、`numFiles`カラムを参照することで、Deltaテーブルのファイル数を確認することができます。


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
JWTとは

## はじめに

JWTとは、JSON Web Tokenの略です。Webサービス間で情報を安全に送受信するための仕組みです。

## JSONとは

JSONとは、JavaScript Object Notationの略です。JavaScriptのオブジェクトを文字列に変換したものです。

JavaScriptのオブジェクトは、キーと値のペアで構成されています。JSONも同様に、キーと値のペアで構成されています。

JSONの例

```json
{
  "name": "Taro",
  "age": 20,
  "address": "Tokyo"
}
```

## Tokenとは

Tokenとは、認証情報や権限などの情報を表す文字列です。認証情報や権限などの情報を含んだ文字列をTokenと呼びます。

以下のような暗号化された文字列です。

```text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
```

## JWTの構造

JWTの構造は、以下のようになっています。

```text
header.payload.signature
```

### header

headerは、JWTの情報を表す部分です。この例では、`HS256`というアルゴリズムを使用していることを表しています。

```json
{
  "alg": "HS256",
  "typ": "JWT"
}
```

### payload

payloadは、Tokenに含める情報を記載した部分です。

JWTのpayloadの例

```json
{
  "username": "test",
  "iat": 1594628423,
  "exp": 1594628428
}
```

この例では有効期限の情報を持っています。
`iat`は、Tokenが作成された日時を表します。`exp`は、Tokenの有効期限を表します。

### signature

signatureは、headerとpayloadを組み合わせて、秘密鍵を使ってハッシュ化した部分です。

JWTのsignatureの例

```
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
```

このsignature

## JWTの利用

JWTは、認証情報や権限などの情報を含んだ文字列です。JWTを利用することで、認証情報や権限などの情報を安全に送受信することができます。

## JWTの利用例

JWTの利用例として、以下のようなものがあります。

- セッション管理
- 認証情報の送受信
- 権限の制御

## JWTを使用する流れ

1. ユーザーがログインする
2. ユーザーのログイン情報をJWTに変換する
3. JWTをCookieに保存する
4. ユーザーがログインしているかを確認するたびに、JWTをCookieに保存する
5. JWTの情報を使って何らかの処理を分岐する。

## JWTのメリット

JWTのメリットとして、以下のようなものがあります。

- トークンに認証情報や権限などの情報を持つことができる
- トークンに有効期限を設定することができる
- 公開鍵暗号に基づくメッセージ認証コード（MAC）により、改竄やすり替え（なりすまし）が行われていないことを確認できる。

## JWTのデメリット

JWTのデメリットとして、以下のようなものがあります。

- 一度認可したJWTを無効化扱いすることはできない
- トークンの有効期限が切れてしまうと、再度ログインしなければならない
- 有効期限を短くしたり、即時無効化する必要がある場合は別途仕組みを用意する必要あり

## 参考

[JSON Web Token - Wikipedia](https://ja.wikipedia.org/wiki/JSON_Web_Token)
[JWT（JSON Web Token）とは - 意味をわかりやすく - IT用語辞典 e-Words](https://e-words.jp/w/JWT.html)
[JSON Web Token（JWT）の紹介とYahoo! JAPANにおけるJWTの活用 - Yahoo! JAPAN Tech Blog](https://techblog.yahoo.co.jp/advent-calendar-2017/jwt/)
php-html-parser で スクレイピング

スクレイピングしたい
php-html-parser がいいらしい。
embedというライブラリを使ったがヘッダを抜き出すのは良いが本文を抜き出すのは弱そう。

参考
https://www.utakata.work/entry/php/webscraping-with-php-html-parser

# インスコ♡


```
composer require paquettg/php-html-parser
```

おや？依存性エラー？
(関連も一気にアップデートする -w コマンドを使う)

```
composer require paquettg/php-html-parser -w
```

`OK`


# それでは、ヤフーニュースから タイトル と リンク を抜き出してみよう

```hoge.php
$options = new Options();
//        $options->setEnforceEncoding('utf8');

$url = 'https://news.yahoo.co.jp/search?ei=UTF-8&p=%E5%A9%9A%E6%B4%BB';

$dom = new Dom();
$dom->loadFromUrl($url, $options);

$elements = $dom->find('.newsFeed_list a');

$res = [];
foreach( $elements as $v )
{
    $title = $v->find('.newsFeed_item_title');
    $res[$v->href] = $title->text;
}

print_r($res);
```

aタグの中に .newsFeed_item_title という div が入っているので、$v->text; では文字列を取得できない。

# 結果

一部伏せ字

```
Array
(
    [https://news.yahoo.co.jp/articles/749fd17c64cxxxf77a6119f6afe8fee7cb8] => xxxと不倫…43歳娘が遺品整理で見つけてショックを受けた、不倫日記の「ヤバすぎる中身」
    [https://news.yahoo.co.jp/articles/16e3ce9badxxx274adb474d1af59a4d06d] => 年下の彼xxx、ある日衝撃の告白をされア然
    [https://news.yahoo.co.jp/articles/0d9ec0cxxxd25abac9472b0f9ae3c19877268] => 結婚相xxxマったアラサー女の末路
    [https://news.yahoo.co.jp/articles/bd3b6ebf79cxxe90f35b1b758937db94a14fa] => 「キンプリとか、ジャニーズ級のイケxxxの地獄。
```

以上
【Mac】launchdでスクリプトを定期実行する方法

## 設定方法

用途ごとに設定ファイルを以下の場所に保存します。
| 場所                                   | 用途                                           |
| :------------------------------------- | :--------------------------------------------- |
| `~/Library/LaunchAgents/<Label>.plist` | ユーザー単位のエージェント                     |
| `/Library/LaunchAgents/<Label>.plist`  | 管理者が提供するユーザーごとのエージェント     |
| `/Library/LaunchDaemons/<Label>.plist` | 管理者によって提供されるシステム全体のデーモン |

以下のコマンドを実行すると定期実行されるようになります。

```zsh:ターミナル
launchctl load /path/to/your.plist
```

以下のコマンドを実行すると定期実行されなくなります。

```zsh:ターミナル
launchctl unload /path/to/your.plist
```

## サンプル

### 30秒ごとにsample.shを実行

```xml:~/Library/LaunchAgents/sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>sample</string>
  <key>Program</key>
  <string>/Users/mofu/script/sample.sh</string>
  <key>StartInterval</key>
  <integer>10</integer>
  <key>StandardOutPath</key>
  <string>/Users/user_name/script/sample.out</string>
  <key>StandardErrorPath</key>
  <string>/Users/user_name/script/sample.err</string>
</dict>
</plist>
```

### 毎日3時にsample.shを実行

```xml:~/Library/LaunchAgents/sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>sample</string>
  <key>Program</key>
  <string>/Users/user_name/script/sample.sh</string>
  <key>StartCalendarInterval</key>
  <dict>
      <key>Minute</key>
      <integer>0</integer>
      <key>Hour</key>
      <integer>3</integer>
  </dict>
  <key>StandardOutPath</key>
  <string>/Users/user_name/script/sample.out</string>
  <key>StandardErrorPath</key>
  <string>/Users/user_name/script/sample.err</string>
</dict>
</plist>
```
【 Azure Functions 】リクエスト URI (Path) に含まれる任意の値を関数内で処理する方法

タイトルの通り、Azure Functions の関数リクエスト時の URI (path) に含まれる任意の値を関数内で処理する方法について、調査した内容をまとめています。

# 実現したい内容
以下、5種類のリクエストを同一関数で処理する RESTful API を実装したい。

| HTTP リクエストメソッド | Path | 処理内容 |
| --- | --- | --- |
| GET | /users | ユーザー一覧を取得 |
| POST| /users | ユーザーの新規作成 |
| GET | /users/{id} | ``id`` で指定されたユーザー情報を取得 |
| PATCH | /users/{id} | ``id`` で指定されたユーザー情報を更新 |
| DELETE | /users/{id}  | ``id`` で指定されたユーザー情報を削除 |

# 実装方法
  前段で紹介したリクエスト URI の Path は、``id`` が含まれているものと含まれていないものが存在します。Azure Functions の Route は各関数のルートディレクトリ配下の ``function.json`` によって設定することができます。

```function.json
{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post",
        "patch",
        "delete"
      ],
      "Route": "users/{id:alpha?}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ],
  "scriptFile": "../dist/users/index.js"
}
```

Azure Functions Core Tools を使った関数の開発では、標準で ``function.json`` に ``Route`` プロパティは設定されていません。プロパティが存在しない場合は、関数名のパスが含まれている URL へリクエストが行われた場合に関数が実行されます。( ``HTTPTrigger`` のみ ) 関数のパスをカスタマイズするためには、この ``function.json`` 内の ``bindings.Route`` 設定を正しく行う必要があります。

上記のサンプルの ``function.json`` の場合、``Route`` プロパティが ``"users/{id:alpha?}"`` となっています。``{id:alpha?}`` でパスの制限をかけています。``alpha`` は 大文字または小文字の英字のみ指定可能です。その他、``bool`` や ``float``、``int`` などを設定することが可能です。また、制限の後に ``?`` を追加することで、``id`` がオプション (指定なしでも動作可) であることを示します。このオプション ``?`` が抜けている場合、常に ``id`` がリクエストURI に含まれていないと関数が実行されないので注意が必要です。パスの制限に関しては、[公式ドキュメント](https://learn.microsoft.com/ja-jp/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#route-constraints) に詳細が記載されているので、ご確認ください。

という訳で、Azure Functions の ``Route`` 設定を正しく行うことで、RESTful API の実装が簡単にできることが分かりました。
Macにインストールしたコマンド集

# はじめに
私のMacにインストールしたコマンド達を記録するだけのもの

## wget
Httpアクセスして、コンテンツをダウンロードするコマンド
### インストール目的
wget前提でインストール手順を書いていることがあるので。
### インストール手順
```
$ brew install wget
```
### コマンド例
```
$ wget http://ftp.gnu.org/gnu/wget/wget-1.18.tar.gz
--2022-09-20 21:48:24--  http://ftp.gnu.org/gnu/wget/wget-1.18.tar.gz
ftp.gnu.org (ftp.gnu.org) をDNSに問いあわせています... 2001:470:142:3::b, 209.51.188.20
ftp.gnu.org (ftp.gnu.org)|2001:470:142:3::b|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3865525 (3.7M) [application/x-gzip]
`wget-1.18.tar.gz' に保存中

wget-1.18.tar.gz                 100%[========================================================>]   3.69M  1.14MB/s 時間 3.2s     

2022-09-20 21:48:28 (1.14 MB/s) - `wget-1.18.tar.gz' へ保存完了 [3865525/3865525]
$ ls -l wget-1.18.tar.gz 
-rw-r--r--  1 uedakeisuke  staff  3865525  6 10  2016 wget-1.18.tar.gz
```

## md5sum
ハッシュ値をもとめるコマンド
同じ内容のファイルかどうかを確認するときに便利
### インストール目的
findコマンドと組み合わせて、大量のファイルの中から同一ファイルを導き出す場面があった。
### インストール手順
```
$ brew install md5sha1sum
```
### コマンド例
```
$ md5sum test.html       
9d74162341751b6f6268749a80f7fa4f  test.html
```

## sshpass
パスワードを引数に与え、パスワード認証sshを入力なしに行うコマンド
### インストール目的
スクリプトの一連の中でパスワード認証のsshを行わなければならなかった為
### インストール手順
```
$ wget https://sourceforge.net/projects/sshpass/files/latest/download/sshpass/1.08/sshpass-1.08.tar.gz
$ tar xvf sshpass-1.08.tar.gz
$ cd sshpass-1.08
$ ./configure
$ make
$ make install
```
### コマンド例
```
$ sshpass -p password ssh guest@192.168.56.200
Last login: Mon Sep 12 20:47:59 2022
```

## watch
引数で指定したコマンドの出力をリアルタイムに表示できるもの
### インストール目的
リソースの状況をリアルタイムで確認したりする為
### インストール手順
```
brew install watch
```
### コマンド例
```
$ watch -d df -h

Every 2.0s: df -h          MBP.web.setting: Thu Sep 21 21:29:18 2022

Filesystem       Size   Used  Avail Capacity iused      ifree %iused  Mounted on
/dev/disk1s1s1  466Gi   24Gi  244Gi     9%  577694 2563440440    0%   /
devfs           190Ki  190Ki    0Bi   100%     658          0  100%   /dev
/dev/disk1s5    466Gi   20Ki  244Gi     1%       0 2563440440    0%   /System/Vo
lumes/VM
/dev/disk1s3    466Gi  605Mi  244Gi     1%    1796 2563440440    0%   /System/Vo
lumes/Preboot
/dev/disk1s6    466Gi  106Mi  244Gi     1%     448 2563440440    0%   /System/Vo
lumes/Update
/dev/disk1s2    466Gi  196Gi  244Gi    45% 1630838 2563440440    0%   /System/Vo
lumes/Data
map auto_home     0Bi    0Bi    0Bi   100%       0          0  100%   /System/Vo
lumes/Data/home
/dev/disk1s1    466Gi   24Gi  244Gi     9%  502070 2563440440    0%   /System/Vo
lumes/Update/mnt1
```


## nodejs
サーバサイドjs
### インストール目的
興味があった為
### インストール手順

```
$ brew install node
```


## typescript
型定義ができるjs
### インストール目的
興味があった為
### インストール手順
```
$ sudo npm init -y
$ sudo npm install --save-dev typescript@4.9.4
```


# 参考文献
http://masyumaroking.com/50
yarnのインストール方法

```
Last login: Thu Sep 15 16:46:02 on ttys000
/Users/ys/.zshrc:1: command not found: rbenv
ys@mbp ~ % node -v
v18.9.0
ys@mbp ~ % npm -v
8.19.1
ys@mbp ~ % node -v
v18.9.0
ys@mbp ~ % npx -v
8.19.1
ys@mbp ~ % npm install -g yarn

added 1 package, and audited 2 packages in 2s

found 0 vulnerabilities
npm notice 
npm notice New patch version of npm available! 8.19.1 -> 8.19.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.19.2
npm notice Run npm install -g npm@8.19.2 to update!
npm notice 
ys@mbp ~ % yarn -v
1.22.19
ys@mbp ~ %
```

参考サイト
Mac に yarn をインストールする方法 | ibukish Lab+
https://memoribuka-lab.com/?p=3512
Falco Ruleを紹介するシリーズ - Read sensitive file trusted after startup

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<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>「Read sensitive file trusted after startup」</b>です。
# Rule記述
```
- rule: Read sensitive file trusted after startup
  desc: >
    an attempt to read any sensitive file (e.g. files containing user/password/authentication
    information) by a trusted program after startup. Trusted programs might read these files
    at startup to load initial state, but not afterwards.
  condition: sensitive_files and open_read and server_procs and not proc_is_new and proc.name!="sshd" and not user_known_read_sensitive_files_activities
  output: >
    Sensitive file opened for reading by trusted program after startup (user=%user.name user_loginuid=%user.loginuid
    command=%proc.cmdline parent=%proc.pname file=%fd.name parent=%proc.pname gparent=%proc.aname[2] container_id=%container.id image=%container.image.repository)
  priority: WARNING
  tags: [filesystem, mitre_credential_access]
```
# Rule概要
信頼されたプログラムによって、起動後に認証情報などの機密ファイルがReadされたことを検知します。
信頼されたプログラムが、初期状態のロードのために起動時に機密ファイルを読み込むことは一般的ですが、その後に読み込むことは通常ないため、不審な活動が疑われます。
こういった活動も、このRuleを使うことで検知可能です。

# Condition（条件）
`sensitive_files and open_read and server_procs`
機密ファイルがサーバープロセスによってReadされ、

かつ

`not proc_is_new and`
新規プロセスではなく、

`proc.name!="sshd" and`
sshdプロセスでもなく、

`not user_known_read_sensitive_files_activities`
ユーザーが定義した既知の機密ファイルの読み込みアクティテビティーでもない場合

---

sensitive_filesマクロの内容は以下となります。
```
- macro: sensitive_files
  condition: >
    fd.name startswith /etc and
    (fd.name in (sensitive_file_names)
     or fd.directory in (/etc/sudoers.d, /etc/pam.d))
```

`fd.name startswith /etc and`
ファイル名が /etc で始まり、

`(fd.name in (sensitive_file_names)`
ファイル名がsensitive_file_namesリストに含まれ、

`or fd.directory in (/etc/sudoers.d, /etc/pam.d))`
もしくは、ディレクトリが /etc/sudoers.d か /etc/pam.d の場合

---
sensitive_file_namesリストの内容は以下となります。
```
- list: sensitive_file_names
  items: [/etc/shadow, /etc/sudoers, /etc/pam.conf, /etc/security/pwquality.conf]
```

# Output（出力）
信頼されたプログムによって、起動後に機密ファイルがReadのためにOpenされました。

`%user.name`
ユーザー名

`%user.loginuid`
ユーザーのログインUID

`%proc.cmdline`
コマンドライン

`%proc.pname`
親プロセス名

`%fd.name`
ファイル名

`%proc.pname`
親プロセス名

`%proc.aname[2]`
2世代前の親プロセス名

`%container.id`
コンテナID

`%container.image.repository`
コンテナイメージリポジトリ
セキュリティ考慮で最初に理解する4つの象限

# 「セキュリティが大事」だけでは安全な環境は作れない
みなさん言いますよね **「うち（の会社）はセキュリティが大事。」** その言葉をきいていつも喉から出かかるのが **「セキュリティが大事じゃない会社ないんて無いよ！」** です。コノ言葉を発する人は何もわかってない人が少なくありません。
# 正しく怖がるには脅威を考慮
ICTでは闇雲に怖がってる人少なくないです。というのも、ICTを理解していない人は特にその傾向が強いです。セキュリティは、脅威を想定して、その脅威に対して適切な対策をするのがもっとも重要です。たとえば、ひとことで「自宅のセキュリティ」といったって、都会と田舎では状況が違い、都会なら金銭泥棒対策かもしれませんが、田舎ではイノシシやタヌキの野菜泥棒対策かもしれません。
# ICTの脅威を4つの象限に分類する
様々な脅威には、それぞれの脅威対策が必要ですが、脅威とその対策は大きく4つに分類できます。
## 悪意の有り・無し、ファイアーウォールの外側・内側で分類する
### 悪意有り・ファイアーウォールの外側
多くの企業が時間とお金をそそぐのがコレです。インターネットから社内にむけてアノ手、コノ手で攻撃してくるやつですね。ファイアーウォールを突破しようとしたり、トロイの木馬、フィッシングサイトへの誘導、ランサムウェアなんかがこの分類です。また、ウェブサーバー視点でいえば、DDoS攻撃もこの分類です。
### 悪意無し・ファイアーウォールの外側
企業ウェブサイトや、ECサイトなど、ウェブサイトにおいて、偶発的に大量のトラフィックが流れてきてしまい、ウェブサイトが停止していまうのが、この分類です。大量トラフィックを作っている側は、DDoS攻撃の意図はありません。単純に情報を入手したい！だったり、発売タイミングを狙ってモノ買いたい！みたいなケースです。サーバー運用している側からすると、結果として、DDoS攻撃されているように思えます。
### 悪意有り・ファイアーウォールの内側
社員や元社員が金銭的なメリットを得るためや、会社への恨みにより実施する攻撃で、いわゆる内部犯行ですね。貧困に困って、目の前のデータを売却したり、情報を漏洩させ、その会社の評判をおとしめたりする行為です。
### 悪意無し・ファイアーウォールの内側
社員のミスや情報利用の意識の低さが起因になる脅威です。個人情報を間違った人に送ってしまったり、誰でも閲覧できる状態でインターネットにデータ配置、URLさえ知られなければ、他人が見に来ないと思っているような事象がこの分類です。
# それぞれの事象にあわせてセキュリティ対策する
この4つの事象、それぞれ対策方向が異なります。〇〇を導入すれば、全部OK!みたいな安易な解決はできません。まずは、この4つの分類を意識するのが大事です。
IT未経験　ポートフォリオ体験記




## これまで学習に使っていたアプリ
###### ・Progate
https://prog-8.com

可愛いキャラクターとポップな世界観のもとでプログラミング学習できるアプリ。
私が今回プログラミング言語を学ぶ上では
_①学習の始めはタブレットで基礎を学ぶ_
_②実際にパソコンでコーティングの練習_
という流れでインプットとアウトプットを意識しながら学んだ。

個人的な感想としてはアプリとブラウザで共有して学べるところが魅力的だと感じた。
また、キャラクターが可愛いので学習で辛い時には癒されたり励まされたのでとても良かった。



## ポートフォリオ作成に関して利用したアプリについて

###### ・Sublime Text
###### ・Brackets

どちらもインストール〜実践の段階でどちらも大苦戦。
どちらもgoogle chromeに反映されず、コーティングが見られない状態になってしまう。



## 使用した感想
###### ・Sublime Text
_①シンプルなデザインでわかりやすい_
_②コーティングしやすい感覚_

初めに日本語版インストールで手こずってしまったので、
利便性に気がつかないまま終わってしまい消化不良・・
もっと基礎中の基礎を固めた上で再チャレンジしたい。





###### ・Brackets
_①ファイルを探しやすい_
_②web上の検証のやり方をチュートリアルでできたので使用方法がイメージしやすかった_

・実際に打ち込んでいきながらwebでプレビューが見られることが魅力でインストール。
・個人的にこちらの方が使いやすかったのでBracketsの使用を決意



__頓挫の原因__
・コーティングしたhtmlにcssが反映されない

__Bracketsの利用で今後の改善 および 次回検証すること__       
_① 実際にhtmlを完成させた上でcssの反映すべきか_
_② htmlを入力しながらcssを入力する同時進行すべきか_
_③ 効率の良いやり方を模索する_



## 今後の目標

###### ・Brcketsを用いて実際に運用、スキルの向上
###### ・実際に使える簡単なアプリ（スケジュールと体調を同時に管理ができる）作成
###### ・効率よくコーティングする方法について模索する（メモからコピペ式か、辞書登録式か）



## ポートフォリオの作成の感想

今まで何気なく使っていたwebサイトを作るにはこんなに苦労があるのかと実感した。


やりたいことがあっても実際に1から作ったり、動かしたりすることの大変だったが、
学習の中でうまく行った時の達成感は今までの経験でで上位に入るほどだった。

今後もスキルアップに向けて学習の継続や挑戦していきたいと強く感じた。
WebRTCでボイスチャットルームを作成した時の備忘録

# 概要
業務にてwebrtcを用いたボイスチャットルームを作成する機会があったため、技術的な仕様や概要を記事としてまとめておく

# 前提
- ピュアP2Pで実装
- Skywayやagoreなどの外部SDKは利用しない

# WebRTCとは

[MDN Web Doc](https://developer.mozilla.org/ja/docs/Web/API/WebRTC_API)より

> WebRTC (Web Real-Time Communications、ウェブリアルタイムコミュニケーション) は、ウェブアプリケーションやウェブサイトにて、仲介を必要とせずにブラウザー間で直接、任意のデータの交換や、キャプチャしたオーディオ／ビデオストリームの送受信を可能にする技術です。 WebRTC に関する一連の標準規格は、ユーザーがプラグインやサードパーティ製ソフトウェアをインストールすることなく、ピア・ツー・ピアにて、データ共有や遠隔会議を実現することを可能にします。

要約するとWeb上でメディア(音声や映像)を扱ったり、データをリアルタイムに送受信するためのJavaScriptのAPIのこと。

# WebRTCを利用してどのようにビデオチャットルームを実装するのか
WebRTCではブラウザ上で取得したメディア(マイクからの音声,カメラの映像など)を[MediaStream](https://developer.mozilla.org/ja/docs/Web/API/MediaStream)として他のユーザーにP2P通信で渡すことができる
ルームに存在するユーザー全てと相互に通信を行うことでボイスチャットルームを実装することができる。

# フロー図
デカい上にフローチャートなのかシーケンスなのか分かりずらい謎図形で申し訳ない...(メモ程度のガバ図なので参考までに)
![p2p_voice_room.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617753/36b92de1-c596-80de-8d2b-f6459d794854.png)

# フロー詳細
### 1.ルーム作成フェーズ/ルーム検索フェーズ/ルーム入室リクエスト
WebRTCとしては関連しない処理部分、ルームを作成できる、ルームを検索できる、認証が必須といったドメインをこちらで実装（お好みで）

### 2.SDPの交換
※この段階でホストがルームを立て、ルームIDが採番されている(ルームが特定できるようになっている)前提。
1. 入室しようとしている部屋に属する自分以外のユーザー(ホスト・ゲスト)に対するOfferSDPを作成しWebサーバーへ送信する
2. Webサーバーは2で受け取った人数分のOfferSDPをWebSocketで各ユーザーへ通知(送信)
3. WebSocketサーバーからSDPを通知された各ユーザーは受け取ったSDPをremoteSDPとして保存し、返送用のAnswerSDPを生成する
4. 3で生成したAnswerSDPをOffer元ユーザーに返送する(Webサーバー,WebSocket経由)
5. OfferSDP送信元クライアントは4のAnswerSDPをremoteSDPとして保存する

### 3.ICE Candidateの交換
ICE Candidate(通信経路情報)をPeer同士で交換することでリアルタイムでの音声通信が可能になる
1. GetICECandidateEventからICECandidateを取得し、Room内の他のユーザーにWebサーバー,WebSocket経由で送信
2. ICE Candidateを受け取ったユーザーはICE Candidateとユーザー情報を保存
1,2のステップを通信するPeer同士で行い、通信可能な経路が判明した時点で接続される 

# 基本動作原理
1. SDPに基づいて相手と接続情報(メディアの圧縮方式など)を交換する。
2. 接続情報(通信経路情報)の交換はICEを用いて行う
3. 交換した情報を互いにセットする(local,remoteの接続情報)※接続情報の交換に関する仕様は定義されていない。よってXhrHttpRequest,Email,手紙,口頭何を使って接続情報を交換しても良い。一般的にはシグナリングサーバーが立てられ、peer - signalingServer - peerの通信を行う。
4. SDPとICE Candidateの交換を双方の端末で終え次第P2P通信のための準備が完了する


# WebRTCで使われるプロトコル

- __Session Description Protocol (SDP)__
	- P2P通信を実現する際に交換する端末の接続情報に関するプロトコル
- __Interactive Connectivity Establishment(ICE)__
	- 後述のSTUNやTURNサーバーを利用してブラウザをPeerと接続できるようにするフレームワーク
- __Session Traversal Utilities for NAT (STUN)__
	- パブリックアドレスの発見、ピアとの直接接続を制限するルーターの制限を特定するプロトコル
- __Network Address Translation (NAT)__
	- ローカルネットワークの端末にパブリックIPアドレスを割り当てるために使用されるプロトコル
	- ルーターがSymmetricNATなどでローカルネットワークへのピアからの接続に制限をかけている場合は後述のTURNサーバーが用いられる
- __Traversal Using Relays around NAT (TURN)__
	- 前述のSymmetric NATが用いられている場合、ピアからの直接接続は不可能なため、このTURNサーバーを利用して接続する
	- P2Pと比較しオーバーヘッドが大きくなるためSTUNでP2Pが不可能と判別された場合のみ利用する


# 所感
- ピュアP2Pでルーム（多人数）通信はクライアントの負荷が大きく、品質が担保できないため利用できない(WebSocketでのICECandidate,SDPの交換や、接続後のメディアの送受信の負荷)
- フロー図上だと通信相手の特定のための情報をクライアントから渡しているがサーバー上で管理すべき
- 実装もそこそこの難易度ながらturnサーバーやwebsocket関連の設定がなかなかに面倒だった。ネットワーク構成がWebRTCだけで一気に複雑になる。
- WebRTCが利用できればテキスト、音声、ビデオなど基本全てのRealTimeCommunicationが可能なので非常に有用
- 商用アプリには現時点でSFU方式での実装がクライアント/サーバー両者の負荷とパフォーマンス面で一番最適である。一方、実装コストが非常に高いため、中小規模のアプリではSkywayやagora.ioなどのSDKが用いられることがほとんど。
External Link Account API の実装方法


# External Link Account API
[ExternalLinkAccount](https://developer.apple.com/documentation/storekit/externallinkaccount)

:::note warn
2022年10月12日までにExternal Link Account APIを採用し、App Storeにアプリのアップデートを提出する必要があります
:::

# ソースコード
```swift
        /// External Link Account
        if #available(iOS 16.0, *) {
            Task {
                if await ExternalLinkAccount.canOpen {
                    do {
                        try await ExternalLinkAccount.open()
                    } catch {
                        print("ExternalLinkAccount.open() error \(error)")
                    }
                }
            }
        }

```

# 結果
![ScreenShot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/cbcbe531-6fc3-227b-eafd-e8e94fd77339.png)
Databricksにおける最適化とパフォーマンスの推奨事項

[Optimizations and performance recommendations on Databricks \| Databricks on AWS](https://docs.databricks.com/optimizations/index.html) [2022/9/8時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksにおいては、レイクハウスにおける大規模ETL処理からアドホックなインタラクティブクエリーに至るさまざまなワークロードをサポートする数多くの最適化技術を提供しています。これらの最適化の大部分は自動で適用されます。Databricksを使うだけでシンプルにメリットを享受することができます。さらに、ほとんどのDatabricksランタイムの機能は、Databricksにおけるテーブルの作成で使用されるデフォルトのストレージレイヤーであるDelta Lakeを必要とします。

Databricksは、ワークロードの大部分を最適化するデフォルト値を設定します。しかし、特定のケースにおいては設定を変更することでパフォーマンスが改善します。

# Databricksランタイムのパフォーマンス

:::note info
**注意**
最新のパフォーマンス強化機能を活用するためには、最新のDatabricksランタイムを使用してください。ここで説明されるすべての挙動は、Databricksランタイム10.4 LTS以降ではデフォルトで有効化されています。
:::

- [ディスクキャッシング](https://docs.databricks.com/optimizations/disk-cache.html)を用いて、データを計算クラスターにアタッチされているディスクボリュームにロードすることで、Parquetデータに対する読み取りの繰り返しを高速化します。
- [動的ファイルプルーニング](https://qiita.com/taka_yayoi/items/93be3bf0b208becd23e6)は、クエリーの述語にマッチするデータを含まないディレクトリをスキップすることで、クエリーの性能を改善します。
- [ローシャッフルマージ](https://qiita.com/taka_yayoi/items/a1f70f51b594350f30bf)は、`MERGE`オペレーションによって再書き込みされ、`ZORDER`クラスタリングによって再計算されるデータファイルの数を削減します。
- Apache Spark 3.0では、数多くのオペレーションのパフォーマンスを強化する[adaptive query execution](https://qiita.com/taka_yayoi/items/38e59a224dfa40994638)が導入されました。

# パフォーマンス強化のためのDatabricksの推奨事項

- ソースデータセットのディープコピー、シャローコピーを作成するために、Databricksでテーブルを[クローン](https://docs.databricks.com/optimizations/clone.html)することができます。
- [コストベースのオプティマイザ](https://qiita.com/taka_yayoi/items/f4c2a1d6e113f2494cd2)は、テーブルの統計情報を活用することで、クエリーパフォーマンスを高速にします。
- 最適化書き込みと自動ファイルコンパクションを用いることでDeltaテーブルを[自動で最適化](https://qiita.com/taka_yayoi/items/240590bf16f03085157f)することができます。これは特に長時間処理を行う構造化ストリーミングジョブでは有用です。
- [高階関数](https://qiita.com/taka_yayoi/items/6efefabe544a25678b40)は、一般的なSparkオペレーターを持たない多くのオペレーションに対して、ビルトインかつ最適化されたパフォーマンスを提供します。高階関数はユーザー定義関数よりも高いパフォーマンスのメリットを提供します。
- Databricksでは、配列、struct、JSON文字列を含む[複雑なデータ型](https://docs.databricks.com/optimizations/complex-types.html)を操作するためのビルトインのオペレーターと特殊な構文を数多く提供しています。
- [レンジ](https://docs.databricks.com/optimizations/range-join.html)を含む、あるいは、大きな[偏り](https://docs.databricks.com/optimizations/skew-join.html)を持つjoinの設定を手動でチューニングすることができます。

# オプトインの挙動

- Databricksではデフォルトでシリアライズ可能な書き込みアイソレーションを保証します。シリアライズ可能性に対する[アイソレーションレベル](https://qiita.com/taka_yayoi/items/62a581c20ab4096a990b)を変更することで、同時オペレーションのスループットを削減することができますが、読み取りのシリアライズ可能性が求められる場合には必要になるかもしれません。
- 特定の条件にマッチするレコードを含まないデータファイルをスキャンする確率を削減するために、[ブルームフィルターインデックス](https://qiita.com/taka_yayoi/items/76c6fe647d334d9650b6)を使うことができます。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
ゆめみのインターンシップに参加した話

# 自己紹介
Swift歴1年ちょっとの文系大学生です。
普段はSwiftUIで個人開発をしていて、UIKitは全くの初心者です。
インターンシップに参加することに勇気が出ないよって方にインターンシップの雰囲気を伝えれたなと思います。

# [インターン詳細](https://hrmos.co/pages/yumemi/jobs/0000502)
最前線で活躍するエンジニアと共に、開発を体験！

- Pull-Requestベースの実践的な開発
- 先輩エンジニアとペアプロ
- テスタブルな設計とリファクタリング
- iOSアプリ開発あるある 不具合発生パターンを学習
- UIKitの鬼門 UITableView強化トレーニング
- 成果発表LT会

期間: 9月1日〜9月14日
場所: オンライン(家)
内容: https://github.com/yumemi-inc/ios-training

[こちら](https://github.com/yumemi-inc/ios-training)のリポジトリのREADMEに記載されているSessionをレビューを頂きながら進めていくといったような感じでした。
(ゆめみさんは色んなことが公開されててすごい！)

# 驚いたこと
### 業務開始時間が自由だった！！
インターンシップはさすがに時間決まってるんだろうなと思ってたら、
まさかの自由！！
私は基本10時に始めてました。

### 完全にオンライン
ゆめみさんは出社することがないっぽい？
どこに住んでてもいいのはガチで良いです。

### 勉強会の量がエグい
毎日なにかしらの勉強会があったと思います。
参加してる方も多くて学習意欲の高さが会社の勢いにも表れているんだなって思いました。

### 課題がめっちゃ勉強になる
私がインターン中も課題にissueが投げられたりしていて、リアルタイムで課題が進化してるのを目の当たりにしました。
Swiftの学習だけでなくGitの使い方であったり、GitHubの使い方であったりも学ぶことができる素晴らしい課題だと思います。

# 学んだこと
恥ずかしいですが作ったスライド公開しときます笑
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQv-upLA7IlRZU4DnoeCXSSd09JTb7f5FKE0dZDAnS8h5BHFVqIlxgcL2S3-k202ABEBS0FyNrvVlge/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

# 感想
まず1番最初に感じたのはレビューがめっっっっっっっっちゃ丁寧であるという事です。
インターンシップでこのレベルなら実務の場合はもっとしっかりとレビューしているんだろうなという印象を受けました。

**ゆめみは成長環境しか提供できません。**

この言葉はガチだなと実感しました。

レビューしてくださった皆様ありがとうございました！！
DNS｜レコードの種類

# DNSとは？
## ドメインネームシステム(Domain Name System)
ドメインをIPアドレスに変換してくれるシステム

:::note
**Aレコード** 
Address
ドメインをIPアドレスに置き換える
:::

:::note
**MXレコード** 
Mail Exchange
メールサーバのホスト名を記載するレコード
:::

:::note
**CNAMEレコード** 
Canonical NAME
ドメインを別のドメインに置き換えるレコード
:::
※特定のドメインを別のドメインに転送する場合に使用

:::note
**TXTレコード** 
TEXT
ドメインに関連するテキスト情報を記載するレコード
:::
※送信ドメイン認証の認証情報（SPFレコード）などに使用

## 参考サイト
https://hp-shizuoka.jp/column/2016/10/7515/
matplotlib.Axes3dで物理っぽい図を作る

Matplotlibの3Dプロットは問題が多くあまり実用的とは思えないのですが，使いたいときもあります．
物理の教科書っぽいきれいな原理図を作れるといいなあと思って試してみました．

## 環境

matplotlib 3.5.1
python 3.10.4
Ubuntu 20.04 on win

## 結果の図

作ってみたのは以下のような図．ポイントは，
  
- デフォルトになっている薄気味悪い灰色の壁を何とかする
- デフォルトの軸を消して新しい矢印をつける
- 3dのラジアルプロットっぽい棒にカラーマップを付ける
というところ．

![test_axes3d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672130/e2be8ac3-e512-1967-bf71-377f7afb0e78.jpeg)


## コード
```py
t = np.linspace(0, 2*π, 200)
x = np.cos(3*t)
y = np.sin(3*t)
cmap = cm.jet

# 元々ある3dの軸を無理やり消す
plt.rcParams['axes.linewidth'] = 0

# Axes3dのプロパティ
conf = {
    "projection": "3d",
    "proj_type": "persp", # ortho or persp
    "box_aspect": (2.8 ,1.2, 1),
    "elev": 40,
    "azim": -60, # ax.view_init(elev=40, azim=-60) これでもok
    "axisbelow": True,
    "facecolor": "w", 
    "xticks": [],
    "yticks": [],
    "zticks": [],
    }

fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111, **conf)

# 元々ある3dの壁を消す
ax.xaxis.pane.fill = False
ax.yaxis.pane.fill = False
ax.zaxis.pane.fill = False

# x, y, z軸の矢印の追加
arrow_conf = {
    "head_width": 0.15,
    "color": "k",
}
xax = mpl.patches.FancyArrow(x=0, y=0, dx=1.5, dy=0, **arrow_conf)
yax = mpl.patches.FancyArrow(x=0, y=0, dx=0, dy=1.5, **arrow_conf)
zax = mpl.patches.FancyArrow(x=0, y=0, dx=7, dy=0  , **arrow_conf)
ax.add_patch(xax)
ax.add_patch(yax)
ax.add_patch(zax)
mpl3d.art3d.patch_2d_to_3d(xax, z=0, zdir="x")
mpl3d.art3d.patch_2d_to_3d(yax, z=0, zdir="x")
mpl3d.art3d.patch_2d_to_3d(zax, z=0, zdir="z")

# データのプロット
ax.plot(t, x, y, "k--")
q = ax.quiver(t, 0, 0, 0, x, y, cmap=cmap, arrow_length_ratio=0, lw=0.5)
q.set_array(t)
```

## 留意点

- 灰色の壁の消し方
`ax.xaxis.pane.fill = False`でできます．元々調べた方法は`xaxis`ではなく`w_axis`を使うものでしたが，こちらはdeprecatedです．

- `set_visible`は使えない
まず，元々あるx,y,z軸を非表示にする方法が見つからなかった．
2Dだと`Spines`や`xaxis`などのオブジェクトが`set_visible()`というメソッドを持っているので，これに`False`を渡すとかがよくある軸の消し方．ところが３Dだと`spines`や`xaxis`に`set_visible(False)`とすると
```
UnboundLocalError: local variable 'axis_bb' referenced before assignment
```
となってまともに動かない．結局，力技で`xaxis`の`linewidth`をゼロにして対処した．これもなぜかrcParams経由でないと反映されなかった．理由はよくわからない．

- `FancyArrow`の追加
`ax.add_patch(Patch)`で矢印を`ax`に追加する．その後で`mpl3d.art3d.patch_2d_to_3d(patch, z, zdir)`とするとうまく矢印が追加できる．
`zdir`は面の指定（"z"とするとx-y平面が指定される）で，`z`で面からのオフセットを指定する．
`patch_2d_to_3d`は`Patch`オブジェクトを`Patch3D`オブジェクトに変換するものらしいが，変換後のオブジェクトを返すわけではなく，すでにあるインスタンスに直接作用しているようである．詳しくは[ソースコード](https://github.com/matplotlib/matplotlib/blob/v3.6.0/lib/mpl_toolkits/mplot3d/art3d.py#L380-L384)参照．
ちなみにこの方法を見出すまでは`ax.quiver()`（ベクトル場の描画などに使われるあれ）を使って矢印を描画するという方法を試していたが，矢印の頭のサイズをどうしてもうまく設定できずに諦めた．

- ステムプロットっぽいやつ
座標軸から放射状に棒を伸ばすプロット方法はけっこう見かけると思う．何と呼ぶのかわからないが，ステムプロットというものと少し似ている．これは`ax.quiver()`で`arrow_length_ratio=0`として矢印の頭を消すことで対応できる．ちなみに前述したとおり，矢印の頭のサイズの計算にも問題があるようで，とくに軸同士のスケールが異なる場合はきれいに表示されない．ので，消すしかないと思われる．

- 3D版`quiver()`のグラデーション
`quiver`はもともと`cmap`によるグラデーション表示に対応しているはずだが，３Dの場合はそうはいかないらしい．これは`set_array()`というメソッドで対応できる．これは`quiver()`がもともと持っているはずの`C`という引数に対応するもので，カラーマップをデータに対してノーマライズするための配列を受け付けるもの（その配列の値で色が決まる）．

## 結論

matplotlibの３Dプロット用APIを私は応援している．軽いしね．
Linux クラウドのサービスとセキュリティについて

●クラウドのサービスモデルとセキュリティの責任範囲

・SaaS（Software as a Service）
ソフトウエアをサービスとして提供。ユーザの責任範囲はデータの保護のみ。
例）gmail、salesforce、microsoft office

・PaaS（Platform as a Service）
ソフトウエアの開発、実行環境をサービスとして提供。ユーザの責任範囲はデータの保護やアプリケーションの管理。
例）Azure

・IaaS（Infrastructure as a Service）
サーバ、ストレージ、ネットワーク等、仮想化されたインフラ環境をサービスとして提供するサービスモデル。HaaS（Hardware as a Service）と呼ばれることもある。ユーザの責任範囲は、データの保護、ファイアウォールの設定、アプリケーションの管理、ゲストOSの管理などです。
例）AWS EC2、S3


●パブリッククラウドの機能
パブリッククラウドでLinuxサーバを運用する場合、通常のサーバの機能に加えて、クラウド独自の機能も使用する。

・管理コンソール
インスタンス（クラウド上の仮想マシン）の構築やデータベース管理など、クラウド機能を設定・管理するツール。操作はWebブラウザから行う。

・ファイアウォール
複数のクラウドサーバへの通信フィルタリングを一括で設定できるクラウド型ファイアウォールや、Webアプリケーションへの攻撃への防御に特化したWeb Application Firewall（WAF）などがある。

・ルーティング
クラウド側では、インターネット上で公開するサーバを置くパブリックなサブネットや、クラウド内のインスタンスからのみアクセスできるプライベートなサブネットなどの仮想ネットワークを構築し、用途に応じてルーティングを設定できる。
各インスタンスのLinuxサーバでもルーティングを設定できる。

●クラウドの特徴
オンプレミスの形態と比較して、パブリッククラウドには相違点がある。

・リージョン
リージョンとは、データセンターが配置されている地理的に分離された地域のこと。1つのリージョンのみでの運用だと災害時や障害発生時にサービスが停止してしまうが、それに備え、複数のリージョンに分散させて運用したりする。
ただし、リージョンがある国や地域によって法律や制限が異なるので注意。

・揮発性ストレージ
クラウドで提供されるストレージには「不揮発性ストレージ」と「揮発性ストレージ」がある。不揮発性ストレージよりもI/Oが高速なので一時ストレージとして利用
[Functions] PortalでAPIをデプロイ - Azure - Memo 

(自分用メモ)
 1日目:Azureポータル(Web)を使用してHTTPサービスをデプロイする。

- [総目次](https://qiita.com/shokkaa/private/7a1633dbf58ddc81f894)
- [目次: Azure Development](https://qiita.com/search?sort=&q=tag%3AAzure+tag%3Adevelopment+user%3Ashokkaa)

### [Azure Portal](https://portal.azure.com/)にアクセス
### 適切なリソースグループを作成
`ホーム` ➔ `リソースグループ` ➔ `作成`

### Functionアプリ作成
Functionアプリ(関数アプリ)はHTTPサービスの集合のこと。
`ホーム` ➔ `リソースの作成` ➔ `関数アプリ`
- `関数アプリ名`はURLのサブドメインになる。ワールドワイドにユニーク。
- `ランタイムスタック`はここでは`Noed.js`を指定。
- `ホスティング`はお試しなら`消費量`(使わなければコストはゼロ)
- `ストレージ`特に指定しなければ適当に作成される。
- `Application Insights`はデバック情報の保存。必要に応じて。
- `GitHub Actions の設定`は`無効化`、そのうち試す。
➔ `確認及び作成` ➔ `作成`

例:`2300101app1`を作成

### HTTP TriggerによるHTTPサービス作成
ホーム ➔ 関数アプリ(例:`2300101app1`) ➔ `概要` ➔ 
- `Select a template`=`Azure portal で作成`
- `Template`=`HTTP Trigger`
- `New Function`= `func1`(例)
- `Authorization level`= `ANONYMOUSE`(お試しなので認証なし)
➔`作成` 
これでサンプルコードによるサービスが世界にデプロイされた。
`コードとテスト`➔`Test/Run`➔`Run`
で `200 OK`が帰ってくればOK.

### テスト
`Get Function URL`➔URLをコピー
例: `https://2300101app1.azurewebsites.net/api/func1`
これにパラメータ(name=Shokkaa)をつけ、
`https://2300101app1.azurewebsites.net/api/func1?name=Shokkaa`
をブラウザで開き、`Hello, Shokkaa. This HTTP triggered function executed successfully.` が表示されればOK.
ソリューションアーキテクト対策_DynamoDB篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:


## DynamoDB
### DynamoDBについて①
10KBとかの小規模データを保存・処理するのはNoSQLが最適。よってDynamoDBを選ぶのがベストプラクティス。
そしてスケーラブルでもある。
ちなみにDynamoDBはセッションデータやユーザー設定、メタデータなどを格納するのに最適なNoSQLDBとのこと。

### DynamoDBについて②
リアルタイムのデータ集計処理に向いてる。
┗ AWS AppSync(アプリデータをリアルタイムで保存・同期するサービス)と組み合わせてリアルタイム処理機能を実装することが可能。
┗ EMR(Apache Hadoopを実行できるサービス)と組み合わせて、Dynamoに蓄積されたビッグデータを解析処理することができる。
┗ アプリケーションのWebセッションを管理することも可能。


### DynamoDBのスケーリング
DynamoDBはオートスケーリングを設定できる。テーブルを作成するとデフォルトで有効化となる。

また、DAX(DynamoDB Accelerator)を有効化することで、キャッシュを利用したパフォーマンスが大幅に向上する。
ただしキャッシュを利用したキャッシュDBは高コストであるため、コスト最適という意味ではスケーリングが望ましい。
DAXを有効にしたDAXクラスターは、1つのみのプライマリノードと、0〜9個のリードレプリカノードを構成することができる。

以下はおまけ。
- DynamoDBグローバルテーブル
マルチリージョンにマルチマスターデータベースをデプロイするための完全マネージド型のソリューション。
高い冗長性を実現できる。


### DynamoDBストリーム
DBに保存されたデータに対して追加・変更・削除が発生した時に履歴を保持する。通知も作れる。
保存期間は24h。超えたら削除される。
なのでメタデータの保存に最適。


### DynamoDBのデータ不整合について
DynamoDBはデータを読み込む時、以下の整合性を選択できる。

- 結果整合性モデル
読み込みスループットが最大限に向上する。ただし最新の書き込み結果が反映されない可能性がある。

- 強い整合性モデル
読み込み前に適切な応答を受け取り、全ての書き込みが反映された状態となる。

## DynamoDBがスパイクした時の改善策
### コスト効率を加味する場合
アプリケーションのバックエンドのデータレイヤにDynamoDBを設定している場合。
SQSとLambdaを連携してDynamoDBへの書き込み処理を並列化することでスパイクを改善できる。

SQSキュー内のメッセージを処理する時は、Lambda関数を使用する。
Lambdaイベントソースマッピングは標準のキューおよびFIFOキューと連携することが可能。
SQSを使用し、タスクをキューに送信して非同期な処理を行うことで、アプリケーションの1つのコンポーネントからタスクを任せることができる。

### DynamoDB DAX
DynamoDBは元々スケーラブルであるため、DAXを使用することで性能を向上させることができる。
ただしDAXはインメモリDBを利用するためコストが高い。
そのためSQSキューによって処理を分散する方が費用対効果は高い。

### スパイクを改善できない対応策
グローバルインデックス(※1)を作成しつつDynamoDBをマルチAZに展開することで可用性を高めることはできるが、スパイクの改善には至らない。

(※1)インデックスに関するクエリが全てのパーティションに跨り、表内の全ての項目を対象とする可能性のあるクエリのこと

https://qiita.com/uenohara/items/c52c2eef991fd6c8a405

DynamoDBをプロビジョンドスループット性能(※2)へ変更することで、予測可能なデータ処理に対する割り当てを変更することが可能だが、スパイクの改善には至らない。

(※2)テーブルごとの読み取り(Read)と書き込み(Write)に対して、必要なスループットキャパシティを割り当てること。
スループットはコンピュータやNW機器が単位時間あたりに処理できるデータ量のこと


## おわりに
引き続き追記します！
以上です。
ソリューションアーキテクト対策_EMR篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:

## Amazon EMR
EMRはビッグデータの解析などに使われるサービス。
HadoopやApache SparkなどのビッグデータフレームワークをAWS上で実行して、大量のデータを処理および分析プロセスを構築できるマネージド型のフレームワーク。
S3やDynamoDBのデータを解析できる。

なので、
S3 Glacierに保存したデータは解析できない。Glacierはデータをアーカイブして保存するためのストレージであるため。
S3 Selectでも同様のことはできるけど、大量のデータを解析する点でAmazon EMRに劣る。
Dynamoのデータを解析できるけど、アプリケーションのログファイルとかの大量のデータは不向き。Lambdaを使って解析するのも非効率。

ちなみにEC2インスタンスを利用して構成されるので、EC2のOSにアクセスが可能です。

## EMRのコンポーネント
EMRの中心的なコンポーネントはクラスター。クラスターはEC2インスタンスのコレクションのことで、クラスター内の各インスタンスはノードと呼ばれる。
EMRはこのノード(EC2インスタンス)にソフトウェアコンポーネントをインストールすることで、Apache　Hadoopなどの分散型アプリケーションでの役割を各ノードに付与する。

ノードの実態はEC2インスタンスなので、セットアップする際にオンデマンド・スポット・リザーブドインスタンスの選択が可能。
EMRを中長期的に使うか、短期的に使うのかでコストを意識した選択ができる。

## おわりに
引き続き追記します！
以上です。
PowerShellからログ出力

PowerShellスクリプトの頭の辺りに以下を書いておき、後は標準出力すればログファイルに出力されていく

```
Start-Transcript ("logs\" + ([DateTime]::UtcNow).AddHours(9).ToString("yyyyMMdd-HHmmss") + ".log")
```

logsフォルダの事前作成不要 (なければ作られる)
UTC時刻に9時間足して日本時間にしている
ソリューションアーキテクト対策_S3あれこれ篇其の2

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:

## S3とDynamoDB等を連携する
Lambda関数を連携させることでサービス同士の連携が可能。
関数の呼び出しはS3イベントで行うことで、S3のオブジェクト操作と連動したシステム連携処理が可能になる。Lambdaに限らずSNSやSQSでも良い。

ちなみにCloudWatchイベントによるS3のモニタリング(S3へのオブジェクト処理をトリガーにシステム連携処理を実行)でも可能だが、S3イベントを推奨。
また、Lambada呼び出しにSNSは使えない。サービスの連携は可能。

## S3アクセスポイント
S3の共有データセットへの大規模なデータアクセスの管理を簡素化したり、複数のポリシーに基づく制御を行う際はS3アクセスポイントを利用する。

S3アクセスポイントはバケットにアタッチされた名前付きのネットワークエンドポイントで、S3オブジェクトのオペレーション(GetObject, PutObjectなど)を実行するために使用できる。
各アクセスポイントは基になるバケットにアタッチされたバケットポリシーと連動して機能する、カスタマイズされたアクセスポイントポリシーを適用してアクセスを制御することが可能である。

![スクリーンショット 2022-09-21 18.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/5b6a17cf-0054-974a-1ddf-e83a4d4a4f0d.png)

### 類似している機能
Amazon S3 Transfer Accelerationは、クライアントとS3バケットの間で長距離にわたるファイル転送を高速・簡単・安全に行う機能。

VPCエンドポイントは、AWS PrivateLinkがサポートされているAWSサービスやVPCエンドポイントサービスに対して、インターネットを介さずにVPCをプライベートに接続できる機能。


## おわりに
引き続き追記します！

簡単ですが以上です。
Movable Type のサイトをレスポンシブ化 そのⅡ

##### Movable Type のサイトをレスポンシブ化 そのⅡ
　結論は、Movable Type 7 : テーマ(初期デザイン テンプレート) の "Eiger" を使用すれば ヘッダー や トップページの内容を簡単にカスタマイズできます。
詳しくはこちらで解説してあります。[Movable Type 7 Manual](https://www.movabletype.jp/documentation/mt7/designers-guide/manage-theme/our-theme/eiger/)
以下、戸惑った点をいくつかあげておきます。

1: それまで使用していた css は無効になり、新らたに別のディレクトリーにされます。場所はテンプレートで確認できます。

2: 当然ながら、記事等の中で使用していた css は、新たな css に追加する必要があります。

3: HTMLヘッダーは、初期状態では必要最小限の内容しかないので、それまで使用していた js ファイル等は追加します。viewport を設定する必要はありません。

4: HTMLブログヘッダーはなかったので、それまで記途していた meta タグ等は、記事テンプレートに記途しました。(私の場合)

5: サイドバー テンプレートも有りません。おそらく、それに相当するテンプレートが、"関連コンテンツ" というテンプレートだと思います。インデックス用とブログ用があります。

6: 記事の作成場所は、初期状態では、/サイト/blog に設定されてるようなので、既存の記事の保存場所がそうでない場合、初期状態の変更、もしくは, 既存の記事の保存場所からリダイレクトしなければ 404 Not Found エラーがでます。 

7: 私がカスタマイズしたテンプレートは、"バナーヘッダー" "ナビゲーション" "関連コンテンツ" 位のものです。


##### 後書き
以前の記事は手作業での手順を記途したもので、実際には当然ながら css の追加、変更を伴うもので、あらゆるコンテンツに対応するには大幅な変更を要していました。
maya python set motionblur

```Python
from mtoa.core import createOptions

def set_motion_blur(switch):
    mtoa.core.createOptions()
    if switch == "on":
        cmds.setAttr("defaultArnoldRenderOptions.motion_blur_enable", 1)
        cmds.setAttr("defaultArnoldRenderOptions.ignoreMotionBlur" ,1)
        cmds.setAttr("defaultArnoldRenderOptions.range_type", 0)
        cmds.setAttr("defaultArnoldRenderOptions.motion_frames" ,1)
    elif switch == "off":        
        cmds.setAttr("defaultArnoldRenderOptions.motion_blur_enable", 0)
        cmds.setAttr("defaultArnoldRenderOptions.ignoreMotionBlur" ,0)
        cmds.setAttr("defaultArnoldRenderOptions.range_type", 1)
        cmds.setAttr("defaultArnoldRenderOptions.motion_frames" ,0.5)
        
set_motion_blur("on")
```
VSCode ワークスペースのフォルダーを移動してしまったら・・・

## ■ はじめに
VSCodeのワークスペースのフォルダーを移動したところ、VSCodeのプリイマリーサイドバーのワークスペースのフォルダー名の後ろに！が表示されるようになりました。これは自動で修正されません。修正するにはどうするのか？整理してみました。

## ■ 前提
* Windows 10 以上のOS
* VSCode(ver 1.7.1.2)

## ■ フォルダー移動前
![2022-09-20-10-42-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239597/07c73d9d-a4e5-d66a-db5c-000755d69e60.png)

|* ワークスペース : My-Projyect<br>* 夏目漱石フォルダーをStoryに移動します。|
|:-|

※ VSCodeではワークスペース名は英語の場合、大文字になる。

## ■ フォルダー移動後
![2022-09-20-10-58-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239597/52ab28ce-987f-1630-59e0-3d4c6f01db0a.png)

|夏目漱石フォルダーに！が表示されます。|
|:-|

※ VSCodeの再起動で！が表示されます。

## ■ ワークスペース名.code-workspaceの編集

|ワークスペースの設定ファイル(ワークスペース名.code-workspace)を修正します。|
|:-|

* ファイル(F) → ファイルでワークスペースを開く
![2022-09-20-11-07-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239597/0e2327ae-4ea7-846f-69cd-7e4ac0e9e6c8.png)
* My-Projyect.code-workspaceファイルの配置しているパスを調べます。
* キャンセルでファイルダイアログボックスを閉じます。
※ 上記はOneDrive-Personal\ドキュメント
* テキストエディター（メモ帖など）で調べたパスのMy-Project-code-workspaceファイルを開きます。
![2022-09-20-11-16-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239597/69df43d3-bad2-cbb6-ed66-a25f18ab0c82.png)

|7行目の夏目漱石のパスを移動したので変更する必要があります。<br>28行目のStory以下のパスに移動しました。|
|:-|

* パスを下記のように修正しました。
![2022-09-20-11-21-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239597/f0ceb483-e07d-e281-4232-7fd9bf24c07d.png)

* 夏目漱石のパスから!が消えました。
![2022-09-20-11-31-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239597/2f7a4aee-4198-43dd-0312-ecba1c68ff88.png)

## ■ ワークスペースのまとめ

* ワークスペースのフォルダーは<b>ワークスペース名.code-workspaceファイル</b>へパスとして設定される。
* 「名前を付けてワークスペースを保存」で指定したフォルダーへ<b>ワークスペース名.code-woarkspaceファイル</b>を配置できる。
* <b>ワークスペース名.code-workspaceファイル</b>を「名前を付けてワークスペースを保存」をしないで、フォルダーを「ワークスペースに追加する」を(ファイル(F) → 「フォルダーをワークスペースに追加」)実行するとワークスペース名が<b>未設定（ワークスペース）</b>と表示される。このワークスペースに名前を付けるには、「名前を付けてワークスペースを保存」で名前を付けることができる。
* ワークスペースの名前を変更するには、<b>ワークスペース名.code-workspaceファイル</b>のファイル名のワークスペース名をエクスプローラーで変更することで名前を変更することができる。


# まとめ
VSCcodeのワークスペースの設定がsetting.jsonにないので調べてみました。複数の.code-workspaceを用意すれば、プロジェクトご毎に使用するフォルダーのセットを切り替えて使用できます。例えば、ゲームプロジェクトなら、game.code-workspace、受験勉強の資料は、jyuken.code-workspaceなどVSCodeの有効活用が可能です。単純にテキストエディターで編集できるところがいいですね。
XCode｜Errors were encountered while preparing your device for development. Please check the Device and Simulators Window.

エラーメッセージ

> Errors were encountered while preparing your device for development. Please check the Device and Simulators Window.

Google翻訳
> デバイスの開発準備中にエラーが発生しました。 [デバイスとシミュレータ] ウィンドウを確認してください。

参考にさせていただきました。
[Errors were encountered while preparing your device for development というXcodeエラー](https://unity-yuji.xyz/errors-were-encountered-while-preparing-your-device-for-development/)

### 事象

Xcodeで実機ビルドを行なった時、ビルド自体は、Successedになるのですが、実機やシミュレーターで実行する際に以下のエラーが出る。

### 環境
Xcode: 12.5.1
iPhone 8
iOS: 14.7.1

### 検証

・ビルドをし直す　ｘ
・クリーンビルドをし直す　ｘ
・実機端末の接続を繋ぎ直す　ｘ　
・実機やシミュレーターを再起動する ◯

### 操作・コマンド
まずは「Devices and Simulators」ウィンドウを見てみましょう

Window > Devices and Simulators もしくは ⌘⇧2 で開くことができます。

Deviceのところに対象のiPhoneがしっかり表示されていました。

ここにエラーやら何やらが出てたりします。

[Xcode error: Failed to prepare device for development](https://stackoverflow.com/questions/64974291/xcode-error-failed-to-prepare-device-for-development)

こちらを参考に、実機端末を再起動すると実機ビルドに成功できました

おそらく、いろんなアプリ起動していたり、容量が足りなかったりという原因があり端末側の不具合を起こしている時に出るエラーのようです。

なので、iPhoneの接続を繋ぎ直すだけでなく再起動（リセット）をすることで解決することが多いです。

ちなみに容量が足りなかったりすると他にも様々なエラーが起きたりするので、ある程度の容量を確保して開発してみてください。

開発していたらよくありがちではあるので、繋ぎ直してもダメだ。再起動してもダメだとなった場合に補足でお伝えしておきます。
ソリューションアーキテクト対策_データ暗号化篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:

## AWS KMS
AWSのデータベースやストレージサービスの全てと統合されておりå、保存データを暗号化することが可能。
ボリューム内の保存データやボリュームから作成されたすべてのスナップショットデータ保護転送中(S3への転送中)を暗号化することが可能。

## AWS 暗号化SDK
暗号化専用のライブラリ。この暗号化ライブラリを用いると、開発中のアプリケーションに対して暗号化のベストプラクティスによる暗号化の仕組みを簡単に実装できる。

## AWS CloudHSM
クラウドベースのハードウェアセキュリティモジュール(HSM)。AWSクラウドで暗号化キーを簡単に生成して使用できるようになる。

## おわりに
暗号化するサービスってもっと出題された気がします。
引き続き追加します！

簡単ですが以上です。
GradleTemplate of unity not found : /Applications/Unity/Hub/Editor/2021.3.6f1/...　の解決策

# 動作環境
- MacBook Pro Intel Core i5 Monterey version 12.0.1 
- Unity 2021.3.6f1
- NRSDKForUnity_Release_1.9.5
- NrealLight モデル：NR-9101GGL
- Xperia 5 Ⅱ SOG02SLA

# 背景
Nrealで使うAndroidのアプリをBuildしようとしたら下記のようなエラー。
![スクリーンショット 2022-09-20 10.19.32（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/82c0b976-76ee-82a9-a687-3af7961e92cd.png)

# 解決策
<iframe width="560" height="315" src="https://www.youtube.com/embed/RVtAD_q0Jtw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

この動画に全てが含まれているが一応解説。

（自分の環境だと）デフォルトで
`/Applications/Unity/Hub/Editor/2021.3.6f1/PlaybackEngines/AndroidPlayer/`にToolsが存在していないのが原因。

なので、
`/Applications/Unity/Hub/Editor/2021.3.6f1/PlaybackEngines/AndroidPlayer/Tools`となるように新しく`Tools`フォルダを作る。

そして、そのフォルダの中に
`/Applications/Unity/Hub/Editor/2021.3.6f1/PlaybackEngines/AndroidPlayer/SDK/cmdline-tools/2.1`の中にある、`GradleTemplates`のフォルダを入れてあげれば良い。

動画の方は、
`/Applications/Unity/Hub/Editor/2021.3.6f1/PlaybackEngines/AndroidPlayer/SDK/cmdline-tools/2.1`の中にあるファイルやフォルダを全てコピーして、`Tools`フォルダにペーストしており、筆者もその通りやったところ、無事直り、Buildに成功した。
SQLの意味

 SQLについて勉強したので備忘録として残す。

カラム...SQLの縦列
レコード...SQLの横列


▼SELECT　①〜　from ②~;

①　どのカラムを使用するか
②　どのテーブルを使用するか
③ ；セミコロンをしてここまでと指示する。


▼SELECT　　①* from ②~;

①　全てのカラムからのデータを取得する
②　どのテーブルか...


▼SELECT ①* FROM ②purchases WHERE ③category = ④"魚";

①全てのカラムからのデータを取得する。
②どのテーブルか。
③どのカラムか（縦）。
④カラムの中の「魚」のデータを取得する。


▼SELECT ①* FROM ②purchases WHERE ③name LIKE ④"%プリン%";

①全てのカラムからのデータを取得する。
②どのテーブルか。
③指定したカラムが〇〇を含む（〇〇のような）レコード
④「〜プリン〜」はOK 例：焼きプリン、プリンアイス、美味しいプリンのアイス


▼SELECT *　FROM ①purchases　②WHERE NOT name > "りんご";
①どのテーブルか
②nameカラムが「りんご」を含まないデータを取得


▼SELECT *　FROM ①purchases　WHERE ②price IS NULL;
①どのテーブルか
②priceカラムがNULLであるデータを取得


▼SELECT * FROM purchases WHERE price IS NOT NULL;
①どのテーブルか
②priceカラムがNULLではないデータを取得


▼SELECT *　①FROM purchases②WHERE character_name = "ひつじ仙人"　③AND category = "食費";
①どのテーブルか
②character_nameカラムが「ひつじ仙人」であるデータを取得
③categoryカラムが「食費」であるデータを取得

「FROM purchases」のあとにコードを追加し、categoryカラムが「食費」かつcharacter_nameカラムが「ひつじ仙人」であるデータを取得してください


▼SELECT *　FROM purchases　①WHERE character_name = "太郎" ②ORDER BY price DESC;
①character_nameカラムが"太郎"であるデータを取得
②ORDER BY price DESC;　priceカラムを価格が低い順に・・・

※DESC...昇順      ASC...降順


▼SELECT *　FROM purchases　②WHERE character_name = "太郎"　②LIMIT 10;
①WHERE character_name = "太郎"」のあとにコードを追加
②取得結果が「最大10件」となるようにデータを取得


保存時に使用するSQL文
▼INSERT文（どのようなデータをどのテーブルに登録するか）
('INSERT INTO users①(②name, age, mail)VALUES(③:name, :age, :mail)');
①テーブル名
②列名
③値
jqのむだづかいー階乗再帰篇

[JSON](https://datatracker.ietf.org/doc/html/rfc8259)処理のコマンドラインツールである[jq](https://stedolan.github.io/jq/)は、JSONテキストを1行でちゃくっと解析、変換するときに使うものです。正統的なプログラミング言語ではないので、これでアルゴリズムの学習をすることはまずありません。

とは言え、`jq`にも変数定義などプログラミング言語らしき機能が備わっているので、「やればできんじゃねぇ」と野望を募らせてしまうこともあります。

今日のお題は、アルゴリズムの教本には必ず出てくる再帰です。ここでは階乗（factorial）を実装します。

### Python

Pythonだったら、こう書くでしょう。

```Python
#!/usr/bin/env python

from sys import argv

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n-1)


if __name__ == '__main__':
    n = int(argv[1])
    print(factorial(n))
```

この再帰は、与えられた`n`から逆順に計算していきます。つまり、最初は`n * factorial(n-1)`、次に`n-1 * factorial(n-2)`と順に下がっていき、最後に`n`が`1`のときに`1! = 1`を返します。教科書通りです。

`n=20`のときの実行結果は次の通りです。

```
$ ./factorial.py 20
2432902008176640000
```

### jq

`jq`も同じようにコーディングするだけです。ただ、Pythonでは関数引数だった`n`は入力`.`で扱います。関数呼び出しをしなければならないので、関数で定義します。

```
def factorial:
    tonumber |
    if . == 0 or . == 1 then
        .
    else
        . * (. - 1| factorial)
    end;
```

`else`ブロックでは、`n-1`を関数に入力するのに、`. - 1 | factorial`とパイプを使わなければならないので、Pythonよりは読みにくくなっています。でも、構成は同じです。

関数定義は宣言の`def`に続いて関数名、シグニチャを区切るコロン`:`で始まり、以下コードブロックです。関数末尾（ここでは`end`）にはセミコロン`;`で終了を明示的に示します。

関数を用意したファイルを`factorial.jq`として、これを読み込むには`include "factorial";`をフィルタに記述します。ファイル拡張子は`jq`であることが期待されており、インクルードするときにはこれを外します。ここも、セミコロンで終端します。

`n=20`のときの実行結果は次の通りです。

```
$ jq -n 'include "factorial"; 20 | factorial'
2432902008176640000
```

同じ結果が得られました。即値の`20`より前に`include`を書くのがポイントです。


### おわりに

最初は半信半疑でしたが、再帰も、やればできるもんです。すごいですね、`jq`。


### 参考

- [./jq](https://stedolan.github.io/jq/) - `jq`のオフィシャルサイトです（英文）。
- [Qiita jq tag](https://qiita.com/tags/jq) - Qiita掲載の`jq`関連の記事一覧です。
- [jqハンドブックーNetOps/DevOps必携のJSONパーザ](http://www.cutt.co.jp/book/978-4-87783-491-3.html) - 関数定義はこの本の10.4節で軽く紹介されています。ご購入はこちらから【[出版社](http://www.cutt.co.jp/book/978-4-87783-491-3.html) | [honto](https://honto.jp/netstore/pd-book_31037910.html) | [amazon.co.jp](https://www.amazon.co.jp/jq/dp/4877834915) | [ヨドバシカメラ](https://www.yodobashi.com/product/100000009003450000/)】。

<img src="http://www.cutt.co.jp/book/images/978-4-87783-491-3.png" width="200" alt="表紙"></img>
OLAP とは

## 勉強前イメージ

オンライントランザクション処理的ななにか？

## 調査

### OLAP とは

Online Analytical Processing の略でOLAPと呼ばれています。
日本語での意味がオンライン分析処理や多次元分析とも言われています。
多次元というのが、売上データだったら商品別や時系列、エリア別など様々ん分析の軸で傾向を見ることを指します。
要するにOLAPとは蓄積したデータを複数の軸で分析を行ってリアルタイムにレスポンスを返す仕組みです。

### OLAPの実装方法

OLAPの実装方法には以下の3種類あります。

- MOLAP

Multi dimensional OLAP の略で
事前にキューブと呼ばれる多次元データベースに集計処理をかけたデータをバッチ処理で投入しておく方式です。

事前に処理を行ってるのでレスポンスは早いですが、事前のデータなので最新の情報は難しいです。

- ROLAP

Relational OLAP の略で
元のデータが入ってるデータベース自体を多次元分析のデータベースとして使う方式です。

MPLAPと逆で、分析するたびにデータを取り出すので最新の情報を取得できますが、レスポンスが遅いです。

- HOLAP

Hybrid OLAP の略で、MOLAPとROLAPのハイブリッド形式です。
MOLAP同様、集計データは事前にキューブと呼ばれる多次元データベースに集計処理をかけたデータ入れます。
なので集計データの取得は早いレスポンスが期待できます。
最新のデータを取得したい際も、ROLAPのようにデータベースに要求できるので最新のデータ取得も可能です。

## 勉強後イメージ

全然違うやつやんw

## 参考

- [OLAPツールとは？OLTPとの違いやOLAP分析が可能なオススメBIツール、上手な選び方まで詳しく解説](https://www.data-be.at/magazine/olap-tool/)
- [OLAP分析とは？OLTPとの違いや実施方法を詳しく解説！](https://it-trend.jp/bi/article/27-0067)
Vue run serve でエラーが起きたので解決しました。

## 結論
簡潔に言うとキャメルケースを使用せずにコンポーネントに名前をつけたから。ということがわかりました。
### 理由
キャメルケースを使用せずにコンポーネントに名前を付けたり、水平線で単語をつなぎ合わせたりすると、コンパイル時に常にエラーが報告されます。これは実際には文法検出の問題であり、非標準コードは文法チェック中にエラーと見なされます。文法の基準が異なるため、エラーが報告されることがよくあります。
以下でエラー内容を記載しています。

## npm run serve
```
(base) hogeMacBook-Pro:'プロジェクト名' hoge$ npm run serve

> 'プロジェクト名'@0.1.0 serve
> vue-cli-service serve

 INFO  Starting development server...


 ERROR  Failed to compile with 1 error

[eslint] 
/Users/hoge/github/'プロジェクト名'/src/pages/Detail.vue
  1:1  error  Component name "Detail" should always be multi-word  vue/multi-word-component-names

/Users/hoge/github/'プロジェクト名'/src/pages/Index.vue
  1:1  error  Component name "Index" should always be multi-word  vue/multi-word-component-names

✖ 2 problems (2 errors, 0 warnings)


You may use special comments to disable some warnings.
Use // eslint-disable-next-line to ignore the next line.
Use /* eslint-disable */ to ignore all warnings in a file.
ERROR in [eslint] 
```


注: 文法チェック中はコンポーネント名を 1 語にすることはできないため、Index などの 1 語でもエラーが報告されます。
この回避方法以外にもeslintを編集する方法もあるようですが今回はこちらのみ記載しました。

## 回避策
コンポーネント名の変更

たとえば、現在のログイン コンポーネント名がIndex.vueに変更された場合、コンポーネント名はキャメルケースで少なくとも 2 語で名前を付けるIndexData.vueのようにする必要がありIndexData.vueにします。

```
  App running at:
  - Local:   http://localhost:8080/ 

  Note that the development build is not optimized.
  To create a production build, run npm run build.
```

無事 npm run serveできました。