OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】オートメーションの失敗を通知する仕組みを作ってみた

## はじめに
前回投稿した[【AWS】オートメーションでEC2を自動停止・起動する手順（画像付き）](https://qiita.com/santasan1224/items/06c0bdc789eda22674e4)の続きで、SSMオートメーションが失敗を通知する仕組みを実装しましたので記録として残しておきます。

## 対象読者
- SSMオートメーションを実装検討している最中の人
- SSMオートメーションから通知の仕組みを学習したい人
- AWSサービスを利用している方で運用設計またはインフラ自動化を検討している最中の人

## 使用環境
前項で紹介した記事を参考ください。

## 実装してみる
### EventBridgeのルール作成
EventBridgeにアクセスして、「ルールの作成」をクリック。
名前は他者に理解できるようなものにする。
イベントバスはAWSサービス内で完結するものであるため「デフォルトイベントバス」を選択。
ルールタイプは「イベントパターンを持つルール」を選択。
![スクリーンショット 2022-05-08 13.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/50d806d0-1219-f421-5fa0-c5a4f333e2fd.png)
![スクリーンショット 2022-05-08 13.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/3f3d25dd-c90a-5fe5-af7f-99c84ee17c5c.png)
![スクリーンショット 2022-05-08 13.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/1930e80f-4b66-6e97-189c-242a6b84de8a.png)

イベントパターンは以下のような形になりました。
オートメーションの実行監視対象を"EC2起動・停止"のみとしたいため、detail.Definitionセクションを以下のように指定。
（対象を指定しないと、全てのオートメーションが実行監視の対象となってしまうため）


```
{
  "source": ["aws.ssm"],
  "detail-type": ["EC2 Automation Execution Status-change Notification"],
  "detail": {
    "Definition": [
      "AWS-StartEC2Instance",
      "AWS-StopEC2Instance"
    ],
    "Status": ["Cancelled", "Failed", "TimedOut"]
  }
}
```



### ターゲットを選択
ターゲットをSNS通知にしてトピックを選択。
★事前にSNSトピックの作成を行なっておいてください。
![スクリーンショット 2022-05-08 13.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/56b66850-46ba-c124-ea52-acb00c1de381.png)

### ルールの作成完了
![スクリーンショット 2022-05-08 13.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478546/05d9ac96-9fa2-a190-fe15-24c189d4e285.png)

## 参考
[AWS Systems Manager Automationのイベント](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/EventTypes.html#SSM-Automation-event-types)
Excel関数メモ_便利関数

# 概要
Excel関数で便利であり利用頻度が多いものを
随時こちらに備忘録としてまとめて残していこうと思います(='ω'=)

本記事はほぼ解説抜きのコピペ用です。
仕組みを知りたい方は記載内容を元に検索して頂ければ色々記事がでるはずのなのでそちらをご確認願います。

（連番の汎用版は色んなサイトで投稿されているが元は誰が作ったんだろう、、
初めて知った時は凄すぎて感動しました。。(;'∀')）


## 連番
```
・簡易版
=ROW()-[現在の行]

・汎用版（セルが連続している場合）※1行目には利用できません。する場合は1行目のみ個別設定のIF文で追加が必要です。
=N(OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),-1,0))+1

・汎用版（セルが離れている場合(結合セルの場合等)）※1行目には利用できません。する場合は1行目のみ個別設定のIF文で追加が必要です。
=MAX(OFFSET(INDIRECT(ADDRESS(1,COLUMN())),0,0,ROW()-1,1))+1

・アルファベット連番（A1は例であり、隣のセルを参照しているだけです。基本的に連番と併用です）
=IF(ISNUMBER(A1)=FALSE,"",IF(MOD(A1,26)=0,"Z",CHAR(MOD(A1,26)+64)))
```

## 表検索
※最新Excelの場合はXLOOKUPがあるから不要。
```
INDEX MACTH(VLOOKUPの強化Ver)です。列番指定不要であり、逆順や上下左右も可能。
=INDEX(【欲しい列】,MATCH(【検索地】,【検索列】,0))
```

## 文字列検索
```
・有無を知りたい場合(フィルタなどに使用する事が多い）	
=COUNTIF(【対象セル】,"*【検索文字】*")

・含まれている個数を知りたい場合	
=LEN(【対象セル】) - LEN(SUBSTITUTE(【対象セル】, "【検索文字】", ""))

・何文字に出現しているか知りたい場合(MID関数などと合わせて使用する事が多い）	
=FIND("【対象文字列】",【対象セル】,1)
```
CloudWatch Logsで複数の条件でログを検索する

## はじめに
エラー調査時にCloudWatch Logsでキーワードで検索するのですが、複数のキーワードを含むエラーを検索する際のやり方をいつも忘れるので、この記事に書いておきます。

## コマンド

`キーワード1`含むログ、`キーワード2`を含むログを表示する

```
?"キーワード1" ?"キーワード2"
```
JupyterLab(JavaScriptノートブック)にて「Kernel Restarting」が頻発する際の対処法

### 注意
本記事はJuyterLabにてJavaScriptのノートブックを動作させたときのものです
Pythonのノートブックでのことではありませんのでご注意ください

# 動機
JuyterLabにてJavaScriptのノートブックを動作させた際、カーネルを再起動させると「Kernel Restarting」が頻発し、煩かったため

# 環境
・OS  : Windows11 pro
・JupyterLab  : Version 3.3.4

# 対処法
JupyterLab起動時のオプションに
&nbsp;&nbsp;KernelManager.autorestart False
を加える

例
&nbsp;&nbsp;jupyter lab --KernelManager.autorestart False

このオプションを見つけたのはJupyterNotebookのページでしたが、JupyterLabの方でも機能するようでした

# 参考
https://jupyter-notebook.readthedocs.io/en/stable/config.html
Error: Failed to parse template: 'utf-8' codec can't decode byte 0x83 in position XXX: invalid start byteの対処法

## はじめに
sam local invoke時に題記のエラーが発生したので、対処法を調べてまとめます。

```bash
sam local invoke --skip-pull-image --event .\devfiles\event.json --template .\devfiles\template.yaml
Error: Failed to parse template: 'utf-8' codec can't decode byte 0x83 in position 734: invalid start byte
```

## 対処方法
template.yamlがUTF-8でなかったので、UTF-8で保存し直しました。

## 参考
https://teratail.com/questions/120137
gitで複数コミットをまとめる際のコマンドまとめ

## はじめに
gitでPR作成時に複数コミットをまとめたい時があります。
その際にいつもググって対応していますが、今後の自分のためにコマンドをまとめておきます。

## 

### git logでまとめたいコミット確認

```bash
> git log --oneline
d12871a test3
db92104 test2
e4ae077 test1
```

### git rebase -iで複数コミットをまとめる

今回は上記の3つを1つにまとめることを考えます。

まとめたいコミット分だけgit rebase -iします。
```bash
git rebase -i HEAD~3
```

すると、以下が表示されます。
古いコミットが上、最新のコミットは下に表示されます。

```bash
pick e4ae077 test1
pick db92104 test2
pick d12871a test3
```

一番上のコミットの`pick`を`s`に変更します。

```bash
pick e4ae077 test1
s db92104 test2
s d12871a test3
```

その後、コミットを修正する画面が出てきます。
画面内のThe first commit's message is の部分のメッセージを更新することで、まとめた後のコミットメッセージとして残すことができます。
【xarray】データの時間座標の変換（resample）

# xarray.Dataset(Dataarray).resample
参考：https://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html

xarrayのDataset, Dataarrayのnp.datetime64型時間座標を異なるスケールの時間座標に変換できる。
例えば、
monthly から seasonal
6 hourly から daily
## 使い方
~~~py
da.resample(time=freq).(変換後の値を計算するメソッド)
# time: daの時間座標名
# freq: 変換後の時間座標間隔
~~~
## resampleメソッド実行例
### 用いるデータ
2000-01-01から10年間のmonthlyデータ
~~~py
import numpy as np
import pandas as pd
import xarray as xr

da = xr.DataArray(np.arange(12*10),dims='time',
                  coords={'time':pd.date_range('2000-01-01',periods=12*10, freq='M')})
~~~
データ詳細
~~~py
>>> da
xarray.DataArraytime: 120
array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
        13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,
        26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
        39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
        52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
        65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
        78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
        91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103,
       104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
       117, 118, 119])
Coordinates:
  * time (time) datetime64[ns] 2000-01-01 ... 2000-04-29
~~~
### monthlyからyearlyに変換（平均）
その年の値を12ヶ月分の平均で代表する場合
~~~py
>>> da.resample(time='Y').mean()
array([  5.5,  17.5,  29.5,  41.5,  53.5,  65.5,  77.5,  89.5, 101.5,
       113.5])
Coordinates:
     * time (time) datetime64[ns] 2000-12-31 ... 2009-12-31
~~~

### monthlyからdailyに変換(線型近似）
線型近似の場合はinterpolate('linear')
~~~py
>>> da.resample(time='D').interpolate('linear')
xarray.DataArraytime: 3623
array([0.00000000e+00, 3.44827586e-02, 6.89655172e-02, ...,
       1.18935484e+02, 1.18967742e+02, 1.19000000e+02])
Coordinates:
  * time (time) datetime64[ns] 2000-01-31 ... 2009-12-31
~~~
より下位の時間座標に変換する際、存在しない値を参照するようなメソッド(sumなど）を指定すると、そのような位置の値はNaNになる。
~~~py
>>> da.resample(time='D').sum()
<xarray.DataArray (time: 337)>
array([ 0.,  0., nan, ..., nan, 11., 11.])
Coordinates:
  * time     (time) datetime64[ns] 1999-12-15 1999-12-16 ... 2000-11-15
~~~

#### freqの文法について
[このページ](https://note.nkmk.me/python-pandas-time-series-freq/)に簡単にまとめられている
# xarray.Dataarray.shift()
座標を指定した単位幅ずらせる。時間軸以外でも可能。
ずらして座標値が存在しなくなった位置の値はNaNとなる。
## 実行例
参照：https://docs.xarray.dev/en/latest/generated/xarray.DataArray.shift.html
~~~py
arr = xr.DataArray([5, 6, 7], dims="x")
arr.shift(x=1)
<xarray.DataArray (x: 3)>
array([nan,  5.,  6.])
Dimensions without coordinates: x
~~~
Requirements on E2E, No.847, AUTOSAR 21-11 (57) FO

Requirements on E2E, No.847, 2021-11

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_RS_E2E.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 42文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|term|Description|
|:--|:--|
|E2E |End-to-End.|
|E2E Profile| A set of combined E2E measures as efficient solution for a particular communication stack.|
|BER |Bit Error Rate - a rate of corrupted bits in a byte stream, e.g. 1e-5.|

## 英日
日本語は仮訳

|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|399|e|e|
|2|242|of|の|
|3|226|the|その|
|4|114|communication|通信|
|5|105|a|一つの|
|6|122|to|に|
|7|96|and|と|
|8|92|data|与件|
|9|85|e_|e_|
|10|75|in|の|
|11|73|rs_e|rs_e|
|12|66|for|にとって|
|13|63|shall|しなければならない|
|14|59|autosar|AUTomotive Open System Architecture(短縮名)|
|15|56|be|です|
|16|51|on|の上|
|17|51|requirements|要件|
|18|47|document|文書|
|19|46|g|g|
|20|46|or|または|
|21|46|protocol|規約|
|22|44|is|です|
|23|39|by|に|
|24|35|id|identifier, 識別子(短縮名）|
|25|33|faults|欠点|
|26|32|profile|横顔|
|27|32|r|r|
|28|31|protection|保護|
|29|31|safety|安全性|
|30|30|use|使う|
|31|30|used|使った|
|32|29|can|できる|
|33|28|as|なので|
|34|28|autosar_rs_e|autosar_rs_e|
|35|28|detection|検出|
|36|28|information|情報|
|37|27|case|場合|
|38|27|fo|foundation(短縮名）|
|39|27|periodic|周期的|
|40|27|receiver|受信器|
|41|26|are|です|
|42|25|description|説明|
|43|25|rs_main_|rs_main_|
|44|25|this|これ|
|45|24|cp|classic platform(短縮名）|
|46|24|fault|障害|
|47|24|material|材料|
|48|24|mechanisms|仕組み|
|49|23|c|c|
|50|23|d|d|
|51|22|provide|提供|
|52|21|applies|適用する|
|53|21|crc|Cyclic Redundancy Check(短縮名）|
|54|21|dependencies|依存関係|
|55|21|rationale|理論的根拠|
|56|21|supporting|対応|
|57|20|an|と|
|58|20|ap|adaptive platform(短縮名）|
|59|20|sender|送信者|
|60|20|that|それ|
|61|20|with|と|
|62|19|mechanism|機構|
|63|18|it|それ|
|64|18|time|時間|
|65|17|from|から|
|66|17|library|図書館|
|67|17|received|受け取った|
|68|16|end|終わり|
|69|16|profiles|横顔|
|70|15|different|違う|
|71|15|each|各|
|72|15|error|誤り|
|73|15|incorrect|正しくない|
|74|15|type|型|
|75|14|based|基づく|
|76|14|ecu|Electronic Control Unit(短縮名）|
|77|14|iso|International Organization for Standardization(短縮名）|
|78|14|protected|保護|
|79|14|sequence|順序|
|80|14|support|対応|
|81|13|interval|間隔|
|82|13|management|管理|
|83|13|not|いいえ|
|84|13|related|関連している|
|85|13|release|公開|
|86|13|state|状態|
|87|12|at|で|
|88|12|between|の間に|
|89|12|detect|探知|
|90|12|srs_e|srs_e|
|91|12|which|どの|
|92|11|application|応用|
|93|11|functional|機能的|
|94|11|its|これは|
|95|11|non|非|
|96|11|transmitted|送信|
|97|10|consumer|消費者|
|98|10|corrupted|破損している|
|99|10|defined|定義済み|
|100|10|detected|検出した|
|101|10|draft|原案|
|102|10|rs_saf_|rs_saf_|
|103|10|safe|安全な|
|104|10|where|どこ|

# 参考(reference)

[1] ISO 26262:2018 (all parts) – Road vehicles – Functional Safety
http://www.iso.org
[2] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[3] Glossary, AUTOSAR_TR_Glossary
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf
【TypeScript】オブジェクトの Value から Key を取得する

# はじめに
定数オブジェクトの``value``から``key``名を取得したい場面があって、定数オブジェクトに対して汎用的に利用できる関数を作成してみた。

こんな書き方もありそう、ここあんまり良くない実装になっているなどご指摘等々あれば気軽にコメントいただけると嬉しいです。

# 作成した関数
```ts
const getKeyByValue = <
  OBJECT extends Record<string | number, any>,
  KEY extends keyof OBJECT,
  VALUE extends OBJECT[KEY]
>(
  obj: OBJECT,
  val: VALUE
): KEY => {
  // key と value を逆にしたオブジェクトを生成
  const keyValueReversedObj: Record<VALUE, KEY> = Object.fromEntries(
    Object.entries(obj).map(([key, value]) => [value, key])
  );

  // そのオブジェクトから key（第２引数の val)に応じた値を取得
  return keyValueReversedObj[val];
};
```

ジェネリクスを利用していてかなり読みづらくなってしまっているものの、やっていることとしては

- ``key``と``value``を逆にしたオブジェクトを生成
- そのオブジェクトから``key（第２引数のval)``に応じた値を取得

しているだけである。

# 解説
こんなユーザーの状態を表す定数をサンプルとして考えてみる。

```ts
const UserStatusValue = {
  non: 0,
  init:1,
  active: 2,
} as const;
```

```ts
// 出力結果はこうなる
const key = getKeyByValue(UserStatusValue, 2);
console.log(key); // => active
```

## Genericsの部分

```ts
// 第一引数に取れる obj は { key: value, ... } の形式のオブジェクトに限定する
OBJECT extends Record<string | number, any>,

// 返り値は OBJECT の key に限定する
// UserStatusValue の場合 "non" | "init" | "active" となる
KEY extends keyof OBJECT,

// 第二引数に取れる val は第一引数の value に限定する
// UserStatusValue の場合 0 | 1 | 2 となる
VALUE extends OBJECT[KEY]
```

第一引数をセットした時点で、第二引数に取れる値が限定されるためUserStatusValueに存在しないvalueを第二引数に指定するとエラーになる
```ts
// Argument of type '3' is not assignable to parameter of type '0 | 1 | 2'.
const key = getKeyByValue(UserStatusValue, 3);
```

## getKeyByValue() を利用しない場合はこんな形になりそう
``getKeyByValue()``を利用しない場合、各定数オブジェクトに対してその都度、こんな``switch``関数を作成していく必要があると思う。

```ts
// こんな関数を各オブジェクトごとに書く必要がある
export const getKeyUserStatus = (
  statusVal: typeof UserStatusValue[keyof typeof UserStatusValue]
) => {
  switch (statusVal) {
    case UserStatusValue.non:
      return "non";
    case UserStatusValue.init:
      return "init";
    case UserStatusValue.active:
      return "active";
  }
};
const key = getKeyUserStatus(2);
console.log(key); // => active
```

``getKeyByValue()``を作成することで、各定数オブジェクトに対してその都度、こんな``switch``関数を作成していく必要がなくなる。

## この関数の微妙なところ
### const assertion されてないオブジェクトの場合、存在しない value を第二引数に指定できてしまう

``as const``されてないオブジェクトの場合、存在しない``value``も第二引数に指定可能になってしまう。その場合``undefined``が返ってしまう。

```ts
export const UserStatusValue = {
  non: 0,
  init: 1,
  active: 2,
};

const key = getKeyByValue(UserStatusValue, 3); // エラーにならない
console.log(key); // => undefined
```

なので、``as const``を使った定数を前提とすることの認識を統一する必要などがありそう。

### Generics が読みづらい
単純に読みづらい、かつ、ここまで``Generics``を頑張って使う必要があるかも微妙な感じがする。

# 最後に
試行錯誤しながら、自分なりに書きました。
冒頭にも述べたように、もっと良いやり方、懸念点、指摘事項などあればコメントいただけると大変嬉しいです。

ありがとうございました。
kotlin RecyclerViewの並び替え（ドラッグ&ドロップ、スワイプ）の方法

# 初めに
RecyclerViewのアイテムを長押しでドラッグ、そのままアイテムを移動　または、スワイプ
させる実装です
簡単にではありますが、実装方法を残しておきます


# 早速
まず、RecyclerViewが実装されたActivityやFragmentにメンバ変数を定義します

    private var itemTouchHelper: ItemTouchHelper? = null


同じクラスのonCreate()関数もしくは、onViewCreated()関数内に以下のコードを入力します


        // ドラック&ドロップの実装
        itemTouchHelper = ItemTouchHelper(
            object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN,
                ItemTouchHelper.ACTION_STATE_IDLE) {
                override fun onMove(　// ドラッグした時
                    recyclerView: RecyclerView,
                    viewHolder: RecyclerView.ViewHolder,
                    target: RecyclerView.ViewHolder,
                ): Boolean {
                    val fromPos = viewHolder.adapterPosition
                    val toPos = target.adapterPosition
                    // 並び替えを実装したいrecyclerViewのadapter
                    // 引数には　並び替え前のポジション,並び替え後のポジション
                    adapter.notifyItemMoved(fromPos, toPos)
                    return true
                }

                override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                    // スワイプでやりたい処理
                }
            })

以上になります


# 終わりに
携帯からスマホになって自然と使っていたドラッグ&ドロップですが、こんな実装をしていたんだ！と身近で使っていた機能を実際に紐解くことができる楽しい体験ができました

**個人的に**この実装の記事で端的でわかりやすいものがjavaの記事が多かったので自分用に記事を残しました
Monaca × NCMBでマンガビューワーアプリを作る（その2：データの用意と一覧画面の作成）

NCMBにはいくつかの機能がありますが、データベースのように使えるデータストアや写真などを保存しておくファイルストアはよく使われる機能になります。

今回はそのデータストアとファイルストアを組み合わせて、マンガビューワーアプリアプリを作ります。[前回はアプリの概要とNCMBの初期化を行いました](https://qiita.com/goofmint/items/d6abf5beb6b9dd1b6aea)ので、今回はデータの準備と一覧画面の作成を行います。

## 完成版のコード

作成したデモアプリのコードは[NCMBMania/Monaca_Comic: MonacaとNCMBを使ったマンガアプリのサンプルです](https://github.com/NCMBMania/Monaca_Comic)にアップロードしてあります。実装時の参考にしてください。

## データの用意

### マンガデータ

今回はCCなどで公開されている以下のマンガデータを利用しました。ありがとうございます。

- [ブラックジャックによろしく](https://densho810.com/free/)
- [ダーウィン事変](https://afternoon.kodansha.co.jp/news/5183.html)
- [聖☆おにいさん](http://morningmanga.com/st023cc/)

これらのデータをダウンロードし（一部はPDFから画像にした上で）、ページ毎に連番で保存します。たとえばブラックジャックによろしくであれば、bj_1.jpeg・bj_2.jpeg…といった具合です。

そうしたデータをまとめてNCMBのファイルストアにアップロードします。

![FireShot Capture 276 - 20220506155402 ニフクラ mobile backend - console.mbaas.nifcloud.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/d4b1145c-30bb-16d6-0245-363850060434.jpeg)


### データストア

次にデータストアでComicクラスを作成します。フィールドは次のように作成します。

| フィールド名 | 型 | 意味 |
|-----|-----|-----|
| title | 文字列 | マンガのタイトル |
| key | 文字列 | 画像ファイル名のプリフィックス（bj_など） |

そしてマンガデータを作成します。

![FireShot Capture 277 - 20220506155412 ニフクラ mobile backend - console.mbaas.nifcloud.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9a75621f-5974-d6c5-c21f-775cee16418d.jpeg)


## 一覧画面の作成

`www/pages/list.html` を作成します。HTMLを含めた基本形は次の通りです。

```html
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">書籍一覧</div>
      </div>
    </div>
    <div class="page-content">
      <div class="list links-list">
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $onMounted, $update }) => {
		// ここにJavaScriptを記述
    return $render;
  };
</script>
```

### 書籍データを取得する

JavaScriptで書籍データを取得する処理を記述します。これは `$onMounted` 関数内で記述します。この関数はDOMのマウントが終わった際に呼ばれます。

```js
let comics = [];
// DOMがマウントされたタイミングで実行
$onMounted(async () => {
	// コミックデータを取得する
	const Comic = ncmb.DataStore('Comic');
	comics = await Comic
		.order('title')
		.fetchAll();
	// 取得したら表示更新
	$update();
});
```

変数 `comics` の中にデータが入った段階で `$update` 関数を呼ぶことで、HTML側に表示を反映できます。 `div.list` の中に一覧表示を追加します。

```html
<div class="list links-list">
	<!-- ここに追加（ここから） -->
	<ul>
		${ comics.map(comic => $h`
			<li><a href="/comics/${comic.key}?title=${comic.title}">${comic.title}</a></li>
		`)}
	</ul>
	<!-- ここに追加（ここまで） -->
</div>
```

これでデータの取得と、画面への反映が完了します。

![FireShot Capture 282 - 20220506185731 Monaca × Framework7 × NCMB - localhost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9bacc99b-c5b3-c4b3-9126-02ae5e5dbc0e.jpeg)


## まとめ

マンガビューワーアプリではデータを取得するのみでアプリから更新は行いません（カスタマイズして既読管理機能などを付けても良いでしょう）。そのため、実装はとてもシンプルになります。

次回は[マンガを選択した後の表示処理](https://qiita.com/goofmint/items/be71c862afe7fa1a03e8)について解説します。
Monaca × NCMBでマンガビューワーアプリを作る（その1：アプリの仕様とNCMB SDKの初期化）

NCMBにはいくつかの機能がありますが、データベースのように使えるデータストアや写真などを保存しておくファイルストアはよく使われる機能になります。

今回はそのデータストアとファイルストアを組み合わせて、マンガビューワーアプリアプリを作ります。まず初回となる今回は、アプリの概要とNCMBの初期化を行います。

## 完成版のコード

作成したデモアプリのコードは[NCMBMania/Monaca_Comic: MonacaとNCMBを使ったマンガアプリのサンプルです](https://github.com/NCMBMania/Monaca_Comic)にアップロードしてあります。実装時の参考にしてください。

## ベースについて

今回はMonacaを利用し、UIフレームワークとしてFramework7を用いています。その際のベースとして[NCMBMania/MonacaFramework7Base: Monaca × Framework7 × NCMBのベースアプリです。](https://github.com/NCMBMania/MonacaFramework7Base)を利用しています。執筆時点でのFramework7のバージョンは7.0.2です。

## 画面について

今回のアプリは以下の2つの画面を持っています。

- 書籍一覧画面
- 書籍閲覧画面

### 書籍一覧画面

![FireShot Capture 282 - 20220506185731 Monaca × Framework7 × NCMB - localhost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/ababca13-040c-ea76-a034-e0b4b224098c.jpeg)


`pages/list.html` として作成します。データストアから書籍データを取得し、一覧表示します。

### 書籍閲覧画面

![FireShot Capture 282 - 20220506185729 Monaca × Framework7 × NCMB - localhost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/457f9e90-50d4-2db3-ebe4-86c5a5bfceec.jpeg)


`pages/view.html` として作成します。一覧画面で選択された書籍の画像データを取得し、マンガビューワーで表示します。

## 利用するライブラリ

今回は以下のライブラリ・SDKを利用しています。

- NCMB SDK
- [laymic](https://github.com/dettalant/laymic)
- Framework7

NCMB SDKとFramework7は上記ベースアプリに元々含まれています。laymicはWebベースのマンガビューワーになります。

### laymicのインストール


laymicをGitHubのリポジトリからダウンロードし、distの中身を `www/assets/laymic` 以下に保存します。そして `www/index.html` にて読み込みます。

```html
<link rel="stylesheet" href="assets/laymic/laymic.min.css">
<script src="assets/laymic/laymic.iife.min.js"></script>
```

## ルーティングの設定

今回の2画面に合わせてルーティングを変更します。 `js/routes.js` を以下のように修正します。

```js
const routes = [
  {
    path: '/',
    url: './index.html',
  },
  // コミック一覧画面
  {
    path: '/comics/',
    componentUrl: './pages/list.html',
  },
  // コミック詳細画面
  {
    path: '/comics/:key',
    componentUrl: './pages/view.html',
  },
  {
    path: '(.*)',
    url: './pages/404.html',
  },
];
```

## index.htmlの修正

index.htmlでは初期表示でコミック一覧画面を読み込むように修正します。まだ `pages/list.html` はないので、画面が真っ白になってしまいます。

```html
<div id="app">
	<div class="views tabs safe-areas">
      <div id="view-home" class="view view-main view-init" data-url="/comics/">
      </div>
    </div>
  </div>
</div>
```

## NCMB SDKの初期化

NCMBのWebサイトでアプリを作成し、アプリケーションキーとクライアントキーを取得します。そして `www/js/config.json` を開いてそれぞれのキーを記述します。

```json
{
	"applicationKey": "ここにアプリケーションキー",
	"clientKey": "ここにクライアントキー"
}
```

この `config.json` は `js/app.js` にて読み込まれ、NCMBを初期化処理に利用されます。

```js
// NCMBの初期化用
const event = window.cordova ? 'deviceready' : 'DOMContentLoaded';
document.addEventListener(event, async (e) => {
  const config = await (await fetch('./js/config.json')).json();
  window.ncmb = new NCMB(config.applicationKey, config.clientKey);
  window.app = new Framework7({
    name: 'My App', // App name
    theme: 'auto', // Automatic theme detection
    el: '#app', // App root element
    // App store
    store: store,
    // App routes
    routes: routes,
  });
});
```

これでNCMBが初期化され、利用準備が整いました。

## まとめ

今回はアプリの概要説明と、NCMBの初期化処理を行いました。[次回は表示するデータの用意と、一覧画面の作成](https://qiita.com/goofmint/items/12fa244f01a0789a8f00)を行います。
DisplayPort UnPlug判定の待機時間を変更するレジストリキー？（おそらくAMD限定）

この記事は検証が不十分です。検証を追加して記事の信頼性向上にご協力ください。
# キー名は「　PP_ULPSDelayIntervalInMilliSeconds　」

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\ の下などの場所にあります
"ULPS"等で検索した方が早いかと思われます

DWORD型でデフォ値 30000だったので、とりあえず倍の 60000に設定しています
当方環境では「ウィンドウがセカンダリモニタへ引っ越す謎の怪現象」から解放されました

　テスト環境
　Windows 11 Insider Preview 22610.1 (ni_release) ＆ AMD, Inc. - Display - 30.0.21001.1004


「　EnableUlps　」キーの方は前文明のRadeon 5000 Series（笑）の頃には既に存在していたようですが
ドライバが古い場合、当該レジストリキーが存在しない ＆ 作成しても動かない可能性があります

# Plug and Playを騙すアダプタは有名ですが
アダプタに罪は無いけれど、これを職場のリースPCに導入するのは如何なものかと
そうこうしてる間に自宅PCでもトラブったので、解決法を探しまくった結果がこれだよ

# 免責
使用された場合の動作に関して、一切の責任を取りかねますのでご了承ください
ここなら「判る人しか来ない」ので問題ない・・・はず
VBAメモ_変数の命名やコメント方法等

# 概要
以下基準は<b>個人的な主観</b>で見やすいようにと考えて勝手に作ったコメントや記述方法です。
その為、ほぼ自分用のメモです。

随時この方が良いかな、、的な感じて考えているので、
昔に開発したのや今後開発して投稿するのは以下の通りに出来ない場合があります。。その場合はご容赦を(;'∀')
また既に手法が確立されていたり、良いものや方法があったら教えて頂けると幸いです！

## 関数説明の記載
作成したプロシージャの前には説明コメントを記載します。
詳細な記載方法は下記の例の通りです。

内容につきましては、
「関数名」「機能」「引数」「返却値」「備考」を記載します。
こちらの記載方法であれば後かぱっと何に利用するプロシージャであるか、
また作っていませんがテキストで読み込めで処理すれば作成した関数の一覧と説明が一覧化出来るかな、、と思っています。
（多分...できなかったら改良します笑）

引数の記載を1: 2: としている理由につきましては、
引数名が長かったり途中で名が変わったりした際に手間でしたので連番にしました。


## コメントの記載
VBAは他の方に引継ぎをする際にブラックボックス化して改修できない事がよくあるらしいので
出来る限りコメントをするようにした方が良さそうです。
全部が全部に付けると逆に分かりにくくなる可能性があるので、1行単位にきっちり付ける必要は無いと思います。

## プロシージャ名の頭文字について
・「f」　　→ (fuctionのつもり,,,)　エクセルの関数として呼び出す場合はプロシージャ名の場合に設定
・「main」&nbsp;→ メイン処理はプロシージャ名の場合に設定
・「set」　→ メインから呼び出すプロシージャで設定する処理（戻り値が無いSub）の場合に設定
・「get」&nbsp;&nbsp;&nbsp;→ メインから呼び出すプロシージャで取得する処理（戻り値が有るFuction）の場合に設定

## 変数名の頭文字について
・「p」　&nbsp;&nbsp;&nbsp;→ (parameterのつもり,,,)プロシージャの引数の場合に設定
・「obj」　→ システムオブジェクトを利用する場合に設定
　　　　　（例 Set objFSO = CreateObject("Scripting.FileSystemObject") ）

## （作成例）
```vb
'------------------------------------------------------------
'関数名：setEventOnOff
'機　能：処理の高速化
'引　数：1:対象ファイル
'　　　　2:　　　←2は記載例として書いているだけであり本来不要です。
'返却値：-
'備  考：メイン処理開始時にFALSEで呼び出し、終了時にTRUEで呼び出してください。
'       各種イベント等の処理を停止することでメイン処理のの高速化を図るプロシージャです。
'------------------------------------------------------------
Sub setEventOnOff(ByVal pFlg As Boolean)
    With Application
        .ScreenUpdating = pFlg '画面表示の更新
        .EnableEvents = pFlg ' オブジェクトに対してイベント
        .DisplayAlerts = pFlg ' マクロの実行中に特定の警告やメッセージ

        '計算方法の設定
        If pFlg = True Then
            .Calculation = xlCalculationAutomatic '計算方法：自働
        Else
            .Calculation = xlCalculationManual '計算方法：手動
        End If
    End With
End Sub
AWS認定ソリューションアーキテクト プロフェッショナル受験記

以前取得したアソシエイトの有効期限が切れそうだったのでプロフェッショナルを受験することにしました。

使用した教材

- [AWS認定ソリューションアーキテクト－プロフェッショナル～試験特性から導き出した演習問題と詳細解説～](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%EF%BC%8D%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%EF%BD%9E%E8%A9%A6%E9%A8%93%E7%89%B9%E6%80%A7%E3%81%8B%E3%82%89%E5%B0%8E%E3%81%8D%E5%87%BA%E3%81%97%E3%81%9F%E6%BC%94%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC%EF%BD%9E-%E5%B9%B3%E5%B1%B1%E6%AF%85-ebook/dp/B08F9CQ6LT)
- wizlabs.com の AWS Certified Solutions Architect Professional
 英語です。問題数は多いですが、おススメできるほどではないですが、良くもなく悪くもない印象です。
- AWS Skill Builderのデジタルコース Exam Readiness: AWS Certified Solutions Architect – Professional (日本語版)、そのほか気になるサービスのデジタルコース
- 公式の試験ガイド、サンプル問題、模擬試験　試験ガイドに試験範囲となるサービスとか、どういうことが問われるかがまとまっていて、範囲を絞る参考になります。
- 各サービスの公式ドキュメント、各種ホワイトペーパー/BlackBelt資料　調査の際はなにはともあれ公式ドキュメント参照が基本です。
- Amazon Kindleで購入した、ちゃんと監修されているのかあやしい感じの問題集。解説が少ししかなかったので、そういうのは避けた方が良い。
- ネットで英語でググると出所不明な問題がいろいろと出てきますが、正解があやしかったりするのでおススメしません。ただあとから思うと本番と似たような問題が多い気もします...（1つ上も）
- AWSは以前より業務でもよく触っていますが、試験勉強はだいたい2か月ぐらい前から土日に集中してという感じでしょうか。

受験の思い出

- GW中の某日、テストセンターで受験。冷房がわりと効いていて途中でトイレに行きたくなった。浅く座ったり深く座ったりして気をまぎらわしたらそのうち気にならなくなった。試験前に水分摂取はおススメしない。
- 受験自体はマスクしててOKだった。
- 長文の問題が多く、途中から読むのが嫌になってくる。速読とかつまみ読みするテクニックを習得するとよいかもしれない。あとは、レッドブルなど集中力をブーストするようなものを事前に摂取するとよいかもしれない。（水分摂取と矛盾するが...）
- 数は少ないが、問題に誤字脱字、翻訳の誤りのようなものを発見した。英語バージョンも見えるとはいえ、英語圏と比べ不公平になりかねないのでAWSさんにはなんとかしてもらいたいです。
- すぐにわからない問題は見直しフラグを立ててスキップし次に進むようにした。一巡した時点で残り1時間、未回答かなど解答状況の一覧が見えるので、10数問くらいの未回答を解答し、それ以外にも回答したけど見直しフラグ立っているものを一通り見直しした時点でちょうど時間切れ。
- テストセンターのパソコンのスペックが良くないのかなんなのか、画面遷移に１秒ぐらいかかります。見直しの数が多いとチリツモで時間が削られることになり、またこちらも焦ってきますので注意が必要です。
- 内容は、試験ガイドにもありますが、個々のサービスの個々の機能の知識がベースになるとはいえ、要件を満たす・要件に対して最適なのはどれか、一番高信頼なのはどれか、AZまたぎあるいはリージョンまたぎで高可用になるのはどれか、コスト最小化はどれか、運用が最も楽になるのはどれか、RPO・RTOの要件に対して最適なものはどれかなどやはりアーキテクトらしい問われ方がメインでした。印象に残っているのはEC2関係の問題ですかね...
- 終了時点で画面に合格か不合格か表示されるが、その後もらう紙には書いていない。数日後にメールで再度結果通知が来る。

結果
スコア 790 合格　（合格ライン 750）
内訳はいずれの分野も、コンピテンシーを満たしている、になってました。対策本で100%近く、wizlabsで80%ぐらいとれるまで覚えたのにスコアが低めでヘコんだところ、そこだけは良かったです。
問題集などと同じ問題もありましたが、数としては見たことない問題の方が圧倒的に多かった印象です。

合格すると、次の試験の半額特典をゲットできます。最近流行りのMLでも受けようかと思います。
VBAメモ_初期設定等

# 説明
備忘録としてVBAを利用する際に初回にしておいた方が良い手順などをまとめます。
その為、何度か触れたことがある方等の簡易手順となりますので
詳細な設定や見方は他のサイトをご参照ください。
まだ私自身もVBA歴が浅いので必要に応じて随時追記していこうと思います。


## １．開発画面の表示
VBAを一度も使用したことが無い場合、開発タブが表示されていない場合があります。
その為、以下の手順で表示を行います。
/------------------------------------------------------------
ファイル→オプション→リボンのユーザ設定→リボンのユーザ設定の「開発」にチェック
/------------------------------------------------------------
上記より開発タブが表示されますので、開発タブから開発画面（VisualBasic）を開きます。
（開発画面をVBEと言い、ブログラムコードをVBAと言います。E：エディタ A：アプリケーション）

## ２．開発画面の表示設定①
開発時に役に立つ表示をあらかじめ行う。
/------------------------------------------------------------
「表示」タブ→以下をそれぞれ表示
・イミディエイト　　　→　デバッグ等の表示に利用
・ローカル　　　　　　→　デバッグ時の変数の現在状態を確認する際に利用
・ウォッチウィンドウ　→　デバッグ時の状態など式入力で確認可能
・プロジェクト　　　　→　開発モジュール等一覧を表示
・プロパティ　　　　　→　開発モジュール自体の名前などを変更する際に利用
/------------------------------------------------------------
## ２．開発画面の表示設定②
VBAでは以下の順より文字の大きさや色などの変更が可能です。

/------------------------------------------------------------
「ツール」タブ→「オプション」→

**「編集」タブ**
- VBA開発に慣れてきたら「自働構文」はチェックを外しておいた方が良いです。
　　（ちょっとしたインデント等をしようとするたびにチェックが走りエラーポップが出るので結構煩わしいので、、）
- 「変数の宣言を強制する」にチェックをした方が良いです。
　　（VBAは変数の方を宣言しない場合はVariant型で指定され自動判定が行われますが、明確化する点や明示的に変数を設定したい場合もあると思いますので強制して宣言の方で慣れた方が良いと思います。）

**「エディタの設定」タブ**
- 文字が小さい場合は、ここでサイズ変更します。
- 個人の好みに色設定も可能です。

**<font color="red">＜個人的なおススメ色設定＞</font>**
（※初期設定に戻すボタンが見当たらなかったので、自PCではない場合は元の状態を覚えておいた方が良いです。。）
標準コード　　　　：前景[黄色]　　後景[黒色]　　インジケーター[自動]
選択された文字　　：前景[ピンク色]後景[灰色]　　インジケーター[自動]
構文エラーの文字　：前景[赤色]　　後景[黄色]　　インジケーター[自動]
次のステートメント：前景[自動]　　後景[黄色]　　インジケーター[黄色]
ブレークポイント　：前景[白色]　　後景[茶色]　　インジケーター[茶色]
コメント　　　　　：前景[黄緑色]　後景[黒色]　　インジケーター[自動]
キーワード　　　　：前景[水色]　　後景[黒色]　　インジケーター[自動]
識別子　　　　　　：前景[白色]　　後景[黒色]　　インジケーター[自動]
ブックマーク　　　：前景[自動]　　後景[自動]　　インジケーター[水色]
呼び出し元　　　　：前景[自動]　　後景[自動]　　インジケーター[黄緑色]
/------------------------------------------------------------

## ２．ショートカットの設定
VBEにはショートカットによる「やり直しのCtrl+Y」や「コメントアウトのCrtl+/」 等が出来ません。
その為、以下の手順よりショートカットを個別で設定する事で疑似的に可能になります。
/------------------------------------------------------------
表示→ツールバー→ユーザ設定
→ポップアップウィンドウのコマンドタブ
→VBE画面にてショートカットを設定したいボタンをクリック
→ポップアップウィンドウの「選択したボタンの編集▼」
→「イメージとテキストを表示」にチェック
→「名前」に設定したいショートカットキーを入力
　　例）コメント(&C)
　　※カッコで囲んだ内容がショートカットキーになります。
　　　上記で設定するとボタンに「Alt+C」で動作するショートカットを割り当てられます。
　　　(Altが前提なのでCtrlとのショートカットは無理そう、、)
/------------------------------------------------------------

## ３．参照設定
VBAでは参照設定（インポート設定）をしないと動作しないものがあります。
正確にはCreate文で作れば設定しなくても出来ますが、VBにコンバートする時にもCreateの方がメリットがあると思いますが、
基本的には出来たVBAそのまま渡すことが多くVB変換もまれな例であり、
速度的にもCtrl+スペースで入力候補が出ないデメリットがあるので極力設定しておいた方が良いと思います。

以下参照はよく利用するので事前にしておいた方が良いです。
/------------------------------------------------------------
Microsoft Excel 最新バージョン Object Libray
Microsoft Office 最新バージョン Object Libray
Microsoft ActiveX Data Objects 最新バージョン Object Libray
Microsoft Scripting Runtime
/------------------------------------------------------------
wxWebViewにwxMemoryFSHandlerからUTF-8データを渡すと動かなくて困った件

# wxWebViewにwxMemoryFSHandlerからUTF-8データを渡すと動かなくて困った件

デバッグ記録。もしかして他の人にも有用かもしれないので記載して供養する。

## 経緯
- wxWebViewを使ってみたくなったので、サンプル通りメモリー上のファイルシステムにHTMLファイルを登録して読みだそうとした
- wxWidgetsにはwxMemoryFSHandlerというのがあり、初期化処理をしてAddFileすると `memory:page1.htm` にアクセスすれば実ファイルを作らずに仮想的なファイルにアクセスできる、これの用途はゴミファイルを増やさずに一時ファイル的なものを増やせるというところ

```cpp
wxFileSystem::AddHandler(new wxMemoryFSHandler);
wxMemoryFSHandler::AddFile("page1.htm", "<html></html>");
```

参考:
https://github.com/wxWidgets/wxWidgets/blob/2740737b40d30817b474e30ff76e43f0903c2e97/samples/webview/webview.cpp#L220-L239

## 問題

- 日本語を含む文字列を投入して、wxWebViewに読み込ませるとエラー発生
  - バージョンはwxWidgets v3.0.5

```cpp
wxFileSystem::AddHandler(new wxMemoryFSHandler);
wxMemoryFSHandler::AddFile("page1.htm", wxString("日本語文字列"));
```

```
../src/common/stream.cpp(844): assert "buf" failed in Read(): Warning: Null pointer is about to be read
```

streamの読み込み時にNULLポインタになってるとかなんとか、正直これではよくわからない。実験しているうちに日本語文字列だけがエラーを出すことに気づいたので、それで当たりをつけて検索した。

## 解決策

wxPythonの方で同様の問題があり、いったんwxScopedCharBufferに渡してからwxMemoryFSHandlerに渡している。

→ これで解決した

https://github.com/wxWidgets/Phoenix/pull/1039/

```python
    # Make some more python-friendly versions of the AddFile methods accepting text or raw data
    c.find('AddFile').findOverload('textdata').ignore()
    c.addCppMethod('void', 'AddFile', '(const wxString& filename, const wxString& textdata)',
        isStatic=True,
        doc="Add a file from text data, which will first be converted to utf-8 encoded bytes.",
        body="""\
            wxScopedCharBuffer buf = textdata->utf8_str();
            wxMemoryFSHandler::AddFile(*filename, (const char*)buf, strlen(buf));
            """)
```
2022-05-08 C++ Builder (Alexandria) > OnKeyDownイベント > VK_LEFTを認識しないときがある

### 動作環境

- Windows 10 Pro (21H1)
- RAD Studio Alexandria (Update 1)
- VCLプロジェクト


### 関連

- [c++ builder > OnKeyDownイベント > Formにコンポーネントがある場合はKeyPreview=trueにすることでOnKeyDownイベントを認識する](https://qiita.com/7of9/items/f7a2cf2fcde695541525)


### 症状

FormKeyDownやFormKeyPressイベントにおいて
- Jキーはイベントが発火する
- カーソルのキー(e.g. VK_LEFT)はイベントが発火しない
    - KeyPreview=trueの状態
    - 新規プロジェクトでは動作するが、既存プロジェクトで実装したら動作しない？
    - 上下左右のカーソルキーだけ失敗

色々試したが対処方法は見つからず。
VK_LEFT発火時に他のイベントに行っているかと確認したが、そういうわけでもなさそうだった。

VK_LEFTのキー入力時に描画が更新されるのだが、イベントが起きないという状況。


### 関連?

- [How to capture KeyDown when focused controls interfere?](https://stackoverflow.com/questions/67623092/how-to-capture-keydown-when-focused-controls-interfere)

新規プロジェクトでもTButtonを足すと同じ状況になった。
これかな。

### フォーカス

TButtonのTabStopをfalseにするとVK_LEFTの入力を認識した。
上記のリンクの状況が起きているのだろう。
Frontier を支える技術

https://zenn.dev/frontier/articles/20220427-frontier-tech-stack のクロスポストです。

---

この記事では、[Frontier](https://frontierjs.herokuapp.com) を作成するにあたって採用した技術について簡単に解説していきます。

## Next.js

[Next.js by Vercel - The React Framework](https://nextjs.org/)

言わずとしれた、React ベースのフレームワークです。間違いなく、Next.js がなければ Frontier は作れなかった･･･とまでは言いませんが、生産性の向上に大きく寄与しているかなと思います。

特に [API Routes](https://nextjs.org/docs/api-routes/introduction) や、[NextAuth.js](https://next-auth.js.org/) が役に立ちました。今回は認証に [Email を用いたマジックリング](https://next-auth.js.org/providers/email) を採用しており、メールの送信には [Mailjet](https://www.mailjet.com/) を利用しています。

この辺に関しては、おいおい詳しい解説記事を書いていく予定です。

## Prisma

[Prisma - Next-generation Node.js and TypeScript ORM for Databases](https://www.prisma.io/)

TypeScript と親和性が鬼のように高い O/R マッパーで、Next.js との相性も抜群です。先ほど触れた API Routes のお陰でそこからエンドポイントを作成して Prisma のクエリを呼び出せますし、NextAuth.js との連携もバッチリです。

## Tailwind CSS

[Tailwind CSS - Rapidly build modern websites without ever leaving your HTML.](https://tailwindcss.com/)

[ユーティリティファースト](https://tailwindcss.jp/docs/utility-first) な CSS フレームワークの代表格である Tailwind CSS を採用しました。

Next.js で書く際は、CSS Modules などを使わずにスタイリングが出来るので開発が非常に楽になって便利ですね（もちろん、CSS Modules と組み合わせることも可能ですが）。

また、今回は Tailwind CSS ベースの CSS フレームワークとして [daisyUI](https://daisyui.com/) を採用しました。daisyUI はスタイリングが Tailwind CSS ベースであるため Tailwind CSS に用意されたクラスでのスタイルの上書きが行いやすく、またテーマなど便利な機能が多数内包されていてとても開発体験が良かったです。

Tailwind CSS の恩恵を受けつつ、デザインを楽したいケースではかなり役立つのではないでしょうか。

## Heroku

[Cloud Application Platform | Heroku](https://www.heroku.com/)

Heroku を使えば DB 環境も用意できるので、今回は Vercel ではなくこちらを採用しました。Heroku 単体でアプリケーションから DB、その他もろもろ面倒を見てくれるのが良いですね。

（この記事の執筆時点では障害が起きていて辛いところがあるのですが 😅）

## おわりに

繰り返しになりますが、各技術の詳細や実際に動いているアプリケーションでの使われ方に関しては、今後さらに記事を書いて解説していく予定なのでお見逃しなく 🙌

---

さいごに、Frontier では一緒にフロントエンドのプロを目指して高め合うコミュニティメンバーを募集しておりますので、以下のページからお気軽にご応募ください ✨

👉 [Frontier（フロンティア） | フロントエンドのプロを目指す学習コミュニティ](https://frontierjs.herokuapp.com/)
子コンポーネントに渡すPropsを親コンポーネントから受け取る時の型 - React.ComponentPropsの活用

React.ComponentPropsを使うことで少しだけ便利にPropsの型を定義できます。
React.ComponentPropsで子コンポーネントのPropsの型を参照できます。

## React.ComponentPropsを使わない

```Todo.tsx
export type TodoProps = {
  title: string;
  isCompleted: boolean;
};

export const Todo = (props: TodoProps) => {
  return (
    <div>
      <p>{props.title}</p>
      <p>{props.isCompleted ? "完了" : "未完了"}</p>
    </div>
  );
};

```


```TodoList.tsx
import type { TodoProps } from "src/pages/company/profile/Todo";
import { Todo } from "src/pages/company/profile/Todo";

type TodoListProps = {
  todoList: TodoProps[];
};

export const TodoList = (props: TodoListProps) => {
  return (
    <div>
      {props.todoList.map((todo) => {
        return <Todo {...todo} />;
      })}
    </div>
  );
};

```

TodoコンポーネントのPropsの型をexportして、TodoList側でimportして利用しています。
他にもTodoコンポーネントとTodoListコンポーネントの両方で同じ型の定義をする方法もあります。(コードなし)

## React.ComponentPropsを活用

```Todo.tsx
type TodoProps = {
  title: string;
  isCompleted: boolean;
};

export const Todo = (props: TodoProps) => {
  return (
    <div>
      <p>{props.title}</p>
      <p>{props.isCompleted ? "完了" : "未完了"}</p>
    </div>
  );
};

```

```TodoList.tsx
import type { ComponentProps } from "react";
import { Todo } from "src/pages/company/profile/Todo";

type TodoListProps = {
  todoList: ComponentProps<typeof Todo>[];
};

export const TodoList = (props: TodoListProps) => {
  return (
    <div>
      {props.todoList.map((todo) => {
        return <Todo {...todo} />;
      })}
    </div>
  );
};
```

`ComponentProps<typeof Todo>`がTodoPropsの代わりになっています。

## ちょっと解説

`ComponentProps<typeof Todo>`でTodoコンポーネントのPropsと同じ型を表しています。
`ComponentProps<typeof Todo>[]`はTodoコンポーネントのPropsの型の配列を表しています。
`ComponentProps<typeof Todo>["title"]`のように`["〇〇"]`を繋げて、特定のプロパティの型を取得することもできます。
(`ComponentProps<typeof Todo>["title"]`は`TodoPropsのtitle`の型 = string型)

ComponentPropsを使うことで、
* 子コンポーネントの型をexport/importする必要がない。
* export/importしないから使う型を間違えることもない。(importがコンポーネントの指定1つになるから間違えない)
* 同じ型を複数書く必要もない。
みたいな恩恵を受けることができて、少し便利に型を書くことができました。
HTMLファイルをhttpプロトコルでブラウザ表示する 

ローカル環境のHTMLファイルをブラウザにドラッグ&ドロップすると、
file://〜〜
のURLで表示される。
http://〜〜
で表示したい場合はどうするか。

### Docker + PHP "Apache without a Dockerfile"

https://hub.docker.com/_/php

例えばindex.htmlファイルを配置したディレクトリに移動して
下記コマンドを実行すると
http://localhost/index.html
でWebページを表示できる。Mac

```zsh:zsh
# コンテナ作成、起動
docker run -d -p 80:80 --name php-apache-c -v "$PWD":/var/www/html php:apache-buster
```
コンテナの終了、起動
```zsh:zsh
# コンテナを終了
docker stop php-apache-c
# もう一度コンテナを起動
docker start php-apache-c
```

　WindowsコマンドプロンプトやPowershellもおおむね同一のコマンドで操作できる。
ただしカレントディレクトリの表現が異なる。

Powershell向け
```powershell:powershell
docker run -d --name php-apache-c -v ${PWD}:/var/www/html -p 80:80 php:apache-buster
```
コマンドプロンプト向け
```:cmd
docker run -d --name php-apache-c -v %cd%:/var/www/html -p 80:80 php:apache-buster
```


### その他の方法　リンク

#### PHP
ビルトインウェブサーバー
https://www.php.net/manual/ja/features.commandline.webserver.php

```
php -S localhost:8000
```

#### Python
ローカルのWebサイトを確認する方法
https://blog.webcreativepark.net/2013/08/06-121744.html

```
python -m SimpleHTTPServer 8888
```

#### IIS
ローカルストレージにある HTML の表示を HTTP 経由でお手軽に確認する方法
http://gootara.org/library/2015/12/iisex.html
Play Frameworkで画面表示が遅い原因と対処

# はじめに

※別のブログに投稿していた記事をQiitaに投稿し直しています。（元の記事は削除予定）

# 環境

Play Framework 2.2.6  
macOS Big Sur 11.5.2

# 現象

Play Frameworkのアプリをローカルで起動すると、画面表示が遅い。
Chromeで確認したところ、```Cache-Control```の値がローカル環境と本番環境とで異なる。

* ローカル環境

「Cache-Control: no-cache」になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/082c9817-70f0-36f0-28de-b4923382811b.png)

* 本番環境

「Cache-Control: max-age=3600」になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/3287b1a9-ab46-bf16-74ee-766d7f5c4f77.png)

# 原因

アプリ内ではキャッシュに関する実装は無いので、Play Frameworkのソースを調査したところ、
Assets.scalaにキャッシュに関する実装がある。

```scala
Play.configuration.getString("\"assets.cache." + resourceName + "\"").getOrElse(Play.mode match {
  case Mode.Prod => Play.configuration.getString("assets.defaultCache").getOrElse("max-age=3600")
  case _ => "no-cache"
})
```

https://github.com/playframework/playframework/tree/2.2.x

本番だとキャッシュが有効になり、本番以外はno-cacheになる模様。  

# 対処

本番モードかどうかは、Playの起動コマンドで切り替えられるため、startコマンドに変更。  
ただし、startコマンドだとVSCodeなどからリモートデバッグできない点は注意。

本番モード：startコマンド  

https://www.playframework.com/documentation/ja/2.3.x/Production

開発モード：runコマンド  

https://www.playframework.com/documentation/ja/2.1.x/PlayConsole
Nvidiaチャート分析メモ　Fibonacci, Gann fan, moving averags

# テクニカル分析
Nvidiaが5月末に決算を迎えるので、チャートにマニュアルで分析してみました。
投資アドバイスではなく、個人的な投資用のメモです。
テクニカル分析自体は有効だと思いますので、少し詳しめに記述します。

### ポイント
- マシーンラーニングでさらなる需要期待
- 競争力の高い製品
- データセンターへの納入増加
- 3ヶ月の売買サイクル×2の中長期

![NVDA22may-analysis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1409234/6eceb399-a505-5dd6-00b4-12c092af4216.png)
#### リンク
実際使用したチャートはこちらの[Tradingview](https://www.tradingview.com/chart/HPqmkyHX/)から見ることが出来ます。

### 使用したテクニカル分析メソッド

- 自然界の数の法則フィボナッチ整数[^1]を利用して上昇または下落の範囲を予想
[Fibonacci retracement](https://info.monex.co.jp/technical-analysis/indicators/018.html)
[Fibonacci time zone](https://coc-biwako.net/fibt) 
- 10日の単純移動平均線と出来高加重移動平均線の乖離発生でトレンド転換を予想
[Simple moving average(10) & Volume-weighted moving average(10)](https://manabu-blog.com/vwma)
- 45度という角度を利用したギャン・ファンで下方サポートラインを確認
[Gann fan](https://fx比較.top/tech/chart-gann/)

※リンクテキストは分析手法の正しい表記をするために英語で書いていますが、すべて日本語サイトです。



### 投資戦略

:::note info
ロング（買い）のタイミング
1.　リトレースメントの0.236のラインで反発している今
2.　決算発表後、一時的に下落に転じたら押し目買い
:::

:::note warn
ショート（売り）のタイミング
1.　決算発表後上昇なら、フィボナッチタイムゾーンの2で緑ゾーン以上なら一度利確
2.　一時的な調整反発があっても持ちこたえてタイムゾーン3で上昇なら利確
:::
 

準備資金は複数のタイミングに分割して追加投資

例A
買い　100万分　株価185
売り　128万　株価236.8　+28％
買い　128万+100万　株価207.2　-12.5％
売り　305万　株価277.7　+34％
205万の儲け（205％）

:::note alert
ロスカットのタイミング
1.　赤ゾーンを下回ったタイミング
2.　ショルダーを考慮するならタイムゾーン（ファン）原点と同じ価格以下
:::

ロスカットをする、下落局面も軌道修正されれば当初のタイミング通り買う

例B
買い　100万　株価185
売り　87.5万円　株価161.87　-12.56％
買い　87.5万円+100万　株価154　-7.87％
売り　295.2375万　株価237.16　+57.46％
198万の儲け（198％）
![nvda22may-analysis2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1409234/7d4cbab1-c093-3f79-c66a-3419f33b40a4.png)

### 半値戻しは全値戻し

これは有名な投資格言で、精神的な訳され方が多いようですが、
昔ながらの現物好き証券マンに言わせれば「半値戻れば損を取り戻せる」ということのようです。

上の例でも、Aの株価はきれいな三角を描いて「全値戻し」ですが、Bは投資期間内の最安値を0としてみると「半値」も戻っていません。
押し目買いでは、投資もあまりできませんでした。
それでも上昇率で稼げた分、儲けはほぼ互角になりました。
新たな投資参加者が、サポートラインを目指すため株価が動くと予想できます。
一段下のラインであれば株価237付近、その次だと220、となります。


[^1]:[フィボナッチ整数とは](https://www.kyo-kai.co.jp/img/support/motto/motto7.pdf)
【AWS認定試験】SAAに2回落ちたが、SAPは1回で合格できた話

# 概要
SAAに2回落ちたものの、SAPは1回で合格しました。
何が違ったのかについて、誰かのお役に立てればと思い、まとめます。

# 結論
勉強期間の長さに関係なく、**いかに能動的に行動できるかがポイント**です。

# スタッツ
□SAA(AWS Certified Solutions Architect - Associate)
　・1回目
　　－勉強期間：**2か月**(1日当たり平均1時間弱)
　　－受験日　：2019/1 (651点・**不合格**)
　・2回目
　　－勉強期間：**1か月**(1日当たり平均1時間弱)
　　－受験日　：2019/3 (681点・**不合格**)
　・3回目
　　－勉強期間：**1か月**(1日当たり平均1時間弱)
　　－受験日　：2020/4 (787点・**合格**)

□SAP(AWS Certified Solutions Architect - Professional)
　・1回目
　　－勉強期間：**1か月**(1日当たり平均1時間弱)
　　－受験日　：2022/3 (781点・**合格**)



# SAAの勉強法で変えたこと
1回目と2回目の勉強法は主に以下でした。
　・ブラックベルトの流し読み
　・模擬試験をやっただけ

つまり**やった感**のみで、受動的な事柄で完結していました。
その時は「勉強時間もしっかり取ったし大丈夫だろう」という甘い考えで受験していました。。

3回目で変えたことは以下です。
　・やってみたの記事を参考に自アカウントで**サービスを使ってみる**
　・模擬試験の問いの中で誤りの選択肢が**なぜ誤りかを調べる**

変えたことは**能動的に考え行動すること**でした。
ちなみに私は特にRDSとS3に疎かったため「RDS　つかってみた」などで検索し、自身のアカウントで環境構築していました。

# SAPの受験準備でやったこと
SAAの結果を踏まえ、以下を実践しました。
　・理解が浅い箇所を洗い出すために参考書を一通り読む
　・模擬試験を徹底的にやりきる

### 理解が浅い箇所を洗い出すために参考書を一通り読む
参考書は私は以下が良いなと感じ購入しました。

https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%95%8F%E9%A1%8C%E9%9B%86-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4815609063/ref=asc_df_4815609063/?tag=jpgo-22&linkCode=df0&hvadid=529520598444&hvpos=&hvnetw=g&hvrand=5874769069829616295&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009318&hvtargid=pla-1412432309456&psc=1&th=1&psc=1


図が適切に使われていること、巻末に模擬試験と解説がついていることが良いなと感じました。
(他にも良本はありますので、調査し購入いただければと思います。)

理解が浅い部分は、読むスピードが遅くなり何回か読み返すため、そこで何が苦手かがわかると思います。そのようなAWSサービスを「XXX　使ってみた」などのように調べ、実際に使ってみました。

### 模擬試験を徹底的にやりきる
模擬試験はAWSアカウントがあれば**AWS Skill Builder**にて無料で受験できます。
解説付きのため、本チャン前に受験した方が良いと思います。

https://explore.skillbuilder.aws/learn/course/external/view/elearning/9159/aws-certification-official-practice-question-sets-japanese

間違えた問題は誤選択肢を含め「なぜ異なるのか」という点を追求しました。

# まとめ
月並みですが、準備期間をしっかり設けることが大切なのではなく、いかに能動的に勉強できるかがポイントだと思います！
Ubuntu Server 20.04.3 LTS 構築#25 Samba

【今回の内容】
Sambaを導入する
実施日:2022/05/04～05/07

# 0.Sambaとは何か。
･LinuxをWindowsネットワーク上に参加させることが出来る。

# 1.目的
･Sambaを導入して、LinuxとWindows間でファイル共有をしたい。

# 2.確認事項
･OpenLDAPやFreeIPAを事前に導入する必要があるか。
⇒不要
･テスト環境で構築するため、Docker上で構築し問題なく動作するか検証する。
⇒Docker上で動作可能。Dockerイメージがいくつか用意されている。
　今回はDocker上にSambaを導入ではなく、サーバー上に導入

# 3.導入
･Ubuntu上にWindowsからアクセスできる共有スペースを作成する。
･アクセスするのは私個人だけなので、パーミッションを変更.
```
mkdir /home/ユーザ名/sharetest
chmod 700 sharetest
```
･パッケージ一覧とパッケージ更新
```
sudo apt update
sudo apt upgrade
```
･Sambaの導入
```
sudo apt install samba
```

# 4.設定
･Sambaユーザーを追加する。
･sudoを付けないと追加は失敗します。
```
sudo pdbedit -a -u ユーザー名
```

･/etc/samba/smb.confの設定変更/追加
･最下段の行に下記を追加
```
[share]
comment = share
browseable = yes
writable = yes
path = /home/ユーザー名/sharetest
allow hosts = 127. 192.168.1.xxx
```
上記設定後に\\\192.168.1.xxxをクライアントPCでnet viewコマンドで確認しても
ネットワークパスが見つかりません。エラーコード51と表示され、アクセスが出来ませんでした。
pingで疎通確認すると、疎通確認は出来るのでネットワークに接続はされています。
ssh接続でsambaを設定しているので、ファイアーウォールで制限が掛かっていると考え、
ファイアーウォールの許可制限を実施しました。
```
sudo ufw allow samba
```
再度、net viewコマンドを実施
共有名などが表示され、コマンドが正常に終了しましたと表示されました。
クライアントPCからもアクセスできることを確認し、サーバー側で作成したテスト用ファイルも
表示されました。

# 5.セキュリティ
shareへのアクセス制限を設定するため、4.で設定した[share]の中に
allow hostsの項目を追加しました。
この箇所にアクセス出来る端末のIPアドレスを記入することによって、
記入した端末以外からのアクセスを拒否できます。

# 参考にさせて頂いたサイト様
[Renoji様](https://renoji.com/IT.php?Contents=OS_CentOS/Server_File/Samba_Setting_SettingFile.html)

今回はここまで。
C# で Between（やりすぎバージョン）

## はじめに

　[前回](https://qiita.com/Tachy_Pochy/items/8123c64dc7eb47241358)の `Between()` は、上限値と下限値をそれぞれ「含む」「含まない」を選択することができませんでした。今回、できるものをつくってみました。

　しかし、ちょっと重厚長大になりすぎる嫌いがあるので、有用ではないかもしれません。

## サンプルコード

```csharp
using System;

namespace BetweenTest
{
    class EndPoint<T>
    {
        public enum OperatorType
        {
            Including,
            Excluding
        }

        public T Value { get; set; }
        public OperatorType Operator { get; private set; }

        public EndPoint(T t) { Value = t; }

        public static EndPoint<T> Including(T val)
        {
            return new EndPoint<T>(val)
            {
                Operator = OperatorType.Including
            };
        }

        public static EndPoint<T> Excluding(T val)
        {
            return new EndPoint<T>(val)
            {
                Operator = OperatorType.Excluding
            };
        }
    }

    static class Ext
    {
        public static bool Between<T>(this T source, T low, T high) where T : IComparable
        {
            if (low.CompareTo(high) > 0) { throw new ArgumentException(); }

            return source.CompareTo(low) >= 0 && source.CompareTo(high) <= 0;
        }

        public static bool Between<T>(this T source, EndPoint<T> low, EndPoint<T> high) where T : IComparable
        {
            if (low.Value.CompareTo(high.Value) > 0) { throw new ArgumentException(); }

            bool validLow;
            if (low.Operator == EndPoint<T>.OperatorType.Including)
            {
                validLow = source.CompareTo(low.Value) >= 0;
            }
            else
            {
                validLow = source.CompareTo(low.Value) > 0;
            }

            bool validHigh;
            if (high.Operator == EndPoint<T>.OperatorType.Including)
            {
                validHigh = source.CompareTo(high.Value) <= 0;
            }
            else
            {
                validHigh = source.CompareTo(high.Value) < 0;
            }

            return validLow && validHigh;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            if (5.Between(1, 6))
            {
                Console.WriteLine("Hello World!");
            }

            if ("5".Between("0", "9"))
            {
                Console.WriteLine("Hello World!");
            }

            var validRangeFrom = EndPoint<int>.Excluding(0);
            var validRangeLimit = EndPoint<int>.Including(5);

            if (5.Between(validRangeFrom, validRangeLimit))
            {
                Console.WriteLine("Hello World!");
            }
        }
    }
}
```
2022-05-08 C++ Builder Alexandria > コード補完が使えない > 右クリックでコンテキストメニューを表示して待つ

### 動作環境

- Windows 10 Pro (21H1)
- RAD Studio Alexandria (Update 1)
- VCLプロジェクト

### 症状

コード補完がCtrl+Spaceにて発動しない。
下記の実装でEnabledをコード補完したいがリストが表示されない。
(B_playはTButton型)

```
B_play->E
```

### 対処

上記のEのところで右クリックしてコンテキストメニューを表示する。
10秒くらい待つとコード補完が有効になるようだ。
一度有効になるとIDEを終了するまでは有効のままのようである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/84628b46-00f8-f89c-9528-69c1ebdd7a58.png)
オバチャンがVRoidとTDPTを使ってヨガやってみた備忘録

# はじめに

技術的な文章になっていないような気がしますが、導入した備忘録ということでお読みいただければ幸いです。

## 動機

著者は、
- ヨガインストラクターの資格であるRYT200を取り立てほやほや
- モデリング未経験
- プログラミング、コンプレックスあり

という人間です。

3Dのヨガインストラクターがいたらいいなと思い、連休中に作ろうと奮起しました。
ここではその記録を備忘録として残したいと思います。
すぐに忘れちゃいますからね。

以下、詳しい方からするとアホみたいなことをしてるかもしれませんが、温かい目で見守ってください。

## Blenderで挫折

Blender

https://www.blender.org/

はじめ、イチから自分で作ろうと思ってBlenderに手を出しました。
だってかっこいいじゃないですか。

というのと、著作権などで話がややこしくなるのを考えると自分で作る以外の選択肢があると思っていませんでした。

しかし、コマンドの多さに圧倒され、皆さんが作ってるようなリンゴを作るのすら1日がかりでできなかったので、諦めました。（連休は終わりがあるので。）

## ソフトウェアの選定し直し

以下の条件で再度ソフトを探しました。

- キャラクターを作れる
- そのキャラクターを使用できる権利が自分に帰属できる
- 全身を動かせる
- できればスマホの動画から人の動きをトラッキングしてほしい

条件に当てはまりそうなソフトがVRoidとTDPTでした。

## 作業の流れ

VRoidを使って「バーチャルなヨガインストラクター」の身体を作って、TDPTで動かします。

所要時間は試行錯誤を含めて5，6時間くらいでした。

# 使用したソフトウェア

## VRoid

VRoidはPixiv発のプロジェクトです。

VRoid Studioで3Dのキャラクターを作れます。無料。

https://vroid.com/studio

公式サイトから正式版v1.7.0のSTEAM版をダウンロード。
インストールは画面の表示に従って行うと難なくクリア。フォルダの位置もデフォルトで設定。

STEAM版にしたのはこの手のアプリケーションを一元管理できるかな、と思って。（どうなんだろう。）

FAQを参照すると目的の「バーチャルなヨガインストラクター」の用途でも利用可能なようです。

この手のソフトは著作権とかの問題で、利用するのはもっとややこしい話になるのではないかと危惧していたのですが、そんなことありませんでした。

## TDPT

TDPTはカメラや動画ファイルがあれば、動きをよさげにトラッキングしてくれるアプリです。
iphonやipadのみのようです。ダウンロードは無料。

https://digital-standard.com/tdpt_lp/


VMD形式、BVH形式での書き出しには課金が必要なようですが、そのお値段490円です（執筆時点）。
安い、と思う。

詳細は、公式ページをみるのがはやい。

# 「バーチャルなヨガインストラクター」爆誕

というわけで、VRoidで3Dキャラクターを作成しました。

https://hub.vroid.com/characters/4613705393711214060/models/1872224942418439036

途中のキャプチャー撮るの忘れました。
それくらいするっと作れました。

いろいろ考えた末、外見は目立たない方がいいかなと思い、ほぼデフォルトです・・・
欲を言えばウェアを整えてあげたかったのですが、私の技術と残り時間が追いつきませんでした。

# 太陽礼拝（Sun Salutation）やってみた

次にTDPTを使って、自分の動きをカメラで撮影して、モデルを動かしてみました。

思いのほか、追従してくれました。

## ウッターナ・アーサナ（前屈）

![ウッターナアーサナ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576498/a7d261d8-9666-b27e-80f2-136a57fff396.png)

きれいな前屈ができない著者の姿を正しく表現してくれました。

## ブジャンガ・アーサナ

![ブジャンガアーサナ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576498/e00982f6-85ab-3915-2d09-383a7a5ccb78.png)

手が床についてないし足の方向がおかしいけど、大枠ではよいと思います。

## ダウンドッグ

![ダウンドッグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576498/35b6a9ef-348a-79b2-9f3b-bcfb976df6da.png)

ダウンドッグではこっちみなくていいです。
キャプチャは一番いいものですが、腰が妙にくねって安定しませんでした。

# 感想

思ったよりも時間がかからずに動かせるところまで行けて驚きです。
利用にあたっての規約関係も整備されている印象で時代の変化を感じます。

実際に太陽礼拝というヨガではメジャーなポーズをとってみて、足と腰のあたりの動きがおかしいことに気づきました。

TDPTのFAQで足のボーンの位置によって動きがおかしくなるような話が載っていたのでその辺も気を付けたいと思います。

# 今後の課題

- 動きがフレームに収まるようにする（画角の問題）
- 腰のボーンをどうにかする（要調査）
- 手足など細かいところの動きを微調整できるか調べる
- 名前を付けてかわいいヨガウェアを着せてあげたい

素人が複雑な人体の動きをトレースしようとするは大それたことかもしれませんが、少しずつやっていきたいと思います。

今回は以上です。
GW中にやったことリスト

今年のGWでやったことを以下に記します。


①　ホワイトハッカー関連

・virtualboxで仮想マシン2台（Kali Linux + Windows7)を立て、Kali 　Linuxからwindows7へ攻撃（ping攻撃、netcatによるバインドシェル・リバースシェル攻撃、管理者権限の奪取、パスワードクラッキング、バックドアの設置）を行った。

・Wiresharkを用いてパケットキャプチャを行った。
・CTF（セキュリティコンテスト）のバイナリファイル解析・QRコード解析を行った。
・Pythonのsocketライブラリを用いて、TCPコネクションを実装した