OmniAICreator/Qiita-1.07M huggingface dataset:
Blenderで車のアニメーション

## やること

Blender上で道路ネットワークを定義しておいて、それをPythonでグラフとして読み込んで、グラフ上のランダムウォークのアニメーションを作成します。

以下は、完成イメージです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/54b1ce9e-ebce-d8d3-9817-19086d8d3810.gif" width="300">

## 手順

以下のような手順です。

- Blenderで、道路ネットワークと移動用のオブジェクトを作成し、ファイル保存します。
- アニメーションを作成するPythonのコードを書いて実行します。
- アニメーションを確認します。

## オブジェクトの作成

道路ネットワークは、メッシュの頂点と辺を使います（面は使いません）。
どのように作っても良いのですが、ここでは簡単に作りましょう。

- `Ctrl + A`（追加）のメッシュのグリッド

移動用のオブジェクトも簡単にスザンヌ（モンキー）使いましょう。

- `Ctrl + A`（追加）のメッシュのモンキー

スザンヌが大きすぎるので小さくします。

- （スザンヌを選択した状態で）`S.1`、`[Enter]`

## Pythonのコード

Scriptingワークスペースで新規を押し、下記をコピペして、実行してください。

```py
import random

import bpy
from collections import defaultdict
from math import atan2


nstp = 42  # ステップ数
tmstp = 6  # 1ステップの時間

nt = bpy.data.objects["Grid"]  # ネットワーク
car = bpy.data.objects["Suzanne"]  # 移動用
vv = nt.data.vertices  # ネットワーク上の頂点

dc = defaultdict(list)  # 頂点の座標→接続する頂点の座標のリスト
for ed in nt.data.edges:
    nd1 = tuple(vv[ed.vertices[0]].co)
    nd2 = tuple(vv[ed.vertices[1]].co)
    dc[nd1].append(nd2)
    dc[nd2].append(nd1)

car.location = pre = vv[0].co  # 現在位置を最初の頂点
car.keyframe_insert(data_path="location", frame=1)
for stp in range(nstp):
    cur = tuple(car.location)
    while True:
        nxt = random.choice(list(dc[cur]))
        if nxt != pre:
            break
    pre, car.location = cur, nxt  # 現在位置を最初の頂点
    car.keyframe_insert(data_path="location", frame=stp * tmstp + 1)
    car.rotation_euler = 0, 0, atan2(nxt[0] - cur[0], -nxt[1] + cur[1])
    car.keyframe_insert(data_path='rotation_euler', frame=stp * tmstp - tmstp + 3)
    car.keyframe_insert(data_path='rotation_euler', frame=stp * tmstp + 1)
```

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

頂点の座標から接続する頂点の座標のリストをあらかじめ作成します。
そして、ネットワークの頂点についたら、接続する頂点をランダムに選び、`location`を変更して移動します。
`keyframe_insert`を使って、アニメーション用にキーフレームを追加します。

## アニメーション確認

layoutワークスペースに戻って、スペースキーを押してアニメーションを確認してみましょう。

以上
暗号ペイロード(ESP) とは

## 勉強前イメージ

ペイロードがわからん・・・
暗号化のなにか？

## 調査

### 暗号ペイロード とは

英語では Encapsulated Security Payload と言われ、略してESPと言われています。
まずESPとは [IPSec](https://qiita.com/miyuki_samitani/items/dc84fbf278d244951a11) においての通信プロトコルの一つであり、
代表的なものはIKE,ESP,AHになります。

ESPはIPSecのうち暗号化する担当で、IPの送受信の二者間でやり取りされるIPヘッダ部以外のデータ本体(ペイロードといいます。)を暗号化します。

### ESPで使用されるアルゴリズム

以下の3つがよく使用されます。

- DES

Data Encryption Standard の略で、1977年にアメリカ連保政府標準に採用された共通暗号方式です。
64ビットで、現在はコンピュータの性能が向上したのですぐ解読されるため推奨されていません。

- 3DES

Triple DES の略で、DESの安全性を高める方法として考えられたアルゴリズムです。
DESを3回程度繰り返すことで解読を難しくしています。

- AES

Advanced Encryption Standardの略で、DESに変わるアルゴリズムとして採用されました。
鍵長は128,192,256があり、DESより安全性が高いものになります。

## 勉強後イメージ

そういえばやったなぁ・・・(IPSecみて思い出した)
どっちかというと暗号ペイロードよりESPのがよく言われてるのかな。

## 参考

- [ペイロードを暗号化する「ESP」とは？IPSec上での仕組みを解説！](https://it-trend.jp/encryption/article/64-0080)
- [ESP 【Encapsulated Security Payload】 暗号ペイロード](https://e-words.jp/w/ESP.html)
Google Adsのコンバージョンタグを設定する方法


# はじめに
**発生した問題**
Google Adsにおける、コンバージョンページでGTMコンバージョントラッキングタグが発火しない
**解決策**
Page URLではなくPage Pathでイベント発生ページを指定することで解決。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/447a3c35-8c56-f942-d4b1-faa52588de03.png)

また、別ドメイン（SFDCなど）を経由してthanksページを表示する場合、コンバージョントラッキングタグが発火しない。問い合わせ・資料請求フォームクリック時に発火させる手段もある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/c5666acc-6dcb-dba3-ed94-2802845011ee.png)
この場合Classを指定する.

**以下詳細説明**


# Google Adsでコンバージョンアクションを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/b56e7f9a-c744-2e1c-d354-99d199bb720e.png)

Google Ads側のコンソール（ツールと設定→コンバージョン）からタグを設定する。
この時のコンバージョンIDとコンバージョンラベルをメモ

# Google Tag Manager側の設定
コンバージョントラッキングタグ及びコンバージョンリンカーを設定する。

## コンバージョントラッキングタグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/41d3c17e-f891-fe4b-d9ca-02ae117e0c04.png)

Google広告のコンバージョントラッキングをタグとして設定。
ID及びラベルは先ほどのコンソールから入力。その他の値は空白でOK.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/21a55bd6-9059-9214-00d9-83581b6e9dfe.png)
トリガーについてはページビューを選択。

トリガーの発生時の設定として下記の設定にすると発火するようにできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/447a3c35-8c56-f942-d4b1-faa52588de03.png)
- Page Path
- 含む
- フォーム送信ページのURLに含まれる文字列



## コンバージョンリンカー
新規タグから、コンバージョンリンカーを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/8a0ba104-1208-fa3e-3614-979c8fa7bdbb.png)

トリガーについてはAll Pagesを選択

あとはプレビューして発火を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/56537295-0bee-918a-a222-17117b90472e.png)
Docker docker-compose up -dを実行したときに出たエラー

# 概要

- `$ docker compose up -d`を実行して複数のコンテナを起動中に発生したエラーについてまとめる

# 出たエラー

```
ERROR: for php  Cannot start service php: error while creating mount source path '/Users/okawashun/workspase/study/docker/laravel_test/src': mkdir /Users/okawashun/workspase/study/docker/laravel_test/src: file exists
```

# 解決策

1. 関係ありそうなコンテナをすべてストップ
1. 関係ありそうなコンテナを削除
1. 関係ありそうなイメージを削除
1. Dockerを再起動

    ![スクリーンショット 2022-01-20 17.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2a53b375-256f-5552-45e9-90ca67750ddf.png)
AWS CLI逆引きメモ

必要に迫られたAWS CLIの逆引きメモです

## ネットワーク関連

### VPCID、サブネットID、アベイラビリティゾーンの一覧表示
```posh
 aws ec2 describe-subnets --query "Subnets[].{VPCID:VpcId,SubnetID:SubnetId,AvailabilityZone:AvailabilityZone}" --output table
```

```posh
---------------------------------------------------------------------------
|                             DescribeSubnets                             |
+------------------+----------------------------+-------------------------+
| AvailabilityZone |         SubnetID           |          VPCID          |
+------------------+----------------------------+-------------------------+
|  ap-northeast-1d |  subnet-0cxxxxxxxxxxxxxxx  |  vpc-015xxxxxxxxxxxxxx  |
|  ap-northeast-1a |  subnet-06xxxxxxxxxxxxxxx  |  vpc-015xxxxxxxxxxxxxx  |
|  ap-northeast-1c |  subnet-03xxxxxxxxxxxxxxx  |  vpc-015xxxxxxxxxxxxxx  |
+------------------+----------------------------+-------------------------+
```

## トラブルシューティング

### "aws configure"を実行するとconfigが読み込まれなくなる問題

#### 症状

`Windows 10 Pro`の`AWS CLI V2`にて現象を確認。

```posh
aws configure list-profiles
```
```posh
Unable to parse config file: C:\Users\test/.aws/credentials
```

#### 対応内容
該当ファイルをテキストエディタで開いて修正

#### 原因
AWS CLI以外のツールからプロファイルを作成していると起こる。
筆者の場合は`AWS Toolkit for Visual Studio`から追加した後に`AWS CLI V2`で追加すると発生しました。
`AWS CLI V2`からだけ操作を行っていると発生しませんでした。
PhoenixアプリでSendgridの"The from address does not match a verified Sender Identity. ..." エラーの解消

デフォルトで

```elixir:lib/supac/accounts/user_notifier.ex
# ...

  # Delivers the email using the application mailer.
  defp deliver(recipient, subject, body) do
    email =
      new()
      |> to(recipient)
      |> from({"MyApp", "contact@example.com"}) # <- cause of error
      |> subject(subject)
      |> text_body(body)

    with {:ok, _metadata} <- Mailer.deliver(email) do
      {:ok, email}
    end
  end

# ...
```
となっているので

```elixir:lib/supac/accounts/user_notifier.ex
# ...

  # Delivers the email using the application mailer.
  defp deliver(recipient, subject, body) do
    email =
      new()
      |> to(recipient)
      |> from({"MyApp", "hoge@gmail.com"}) # <- fixed
      |> subject(subject)
      |> text_body(body)

    with {:ok, _metadata} <- Mailer.deliver(email) do
      {:ok, email}
    end
  end

# ...
```
などと有効なメールアドレスに変更することで解消できます。
[JS]基礎的な文法(変数定義)

アウトプットとして

Rubyの学習をしてJSのコードを見ると、ごちゃごちゃしてるように見えてどうしても苦手意識が拭えない…
一つ一つ分解するとそんなに難しくないはずだとは思っているが…
というわけで、苦手意識克服するために超基礎的なところから！！

## JSの変数定義の仕方
JavaScriptの変数定義の様式は、var、const、letと３つ存在する

### var
varの特徴として、`再代入、再定義ともに可能`

```javascript
var sample = "こんにちは"

sample = "こんにちは"
// 再代入OK

var sample = "こんにちは"
// 再定義OK
```

### const
後から書き換えることができない変数を定義する書き方
constの特徴として、`再代入、再定義ともに不可`

```javascript
const sample = "こんにちは"

sample = "こんにちは"
// 再代入NG →エラーが起こる

const sample = "こんにちは"
// 再定義NG →エラーが起こる
```

※constで指定する「後から書き換えることのできないデータ」は、正確には`「定数」`と呼ぶ

### let
後で書き換えることができる変数を定義する書き方
letの特徴として、`再代入は可能だが、再定義は不可`

```javascript
let sample = "こんにちは"

sample = "こんにちは"
// 再代入OK

let sample = "こんにちは"
// 再定義NG →エラーが起こる
```

## letとconstの違い
- letは再代入する予定のある変数を定義する際に使用する
- constは再定義する予定のない変数を定義する際に使用する
 
 
　
以上。
少しずつでもJSの苦手意識を無くしていきたい…！
Autify で Salesforce を動かしてみよう～ vol.10 Autify のトライアル期間が終了したとき

# はじめに
- Autify で Salesforce を動かしてみよう、と思い記事にしてみます。
- TIPSなども記載できれば、と考えています。


# トライアル期間が終了しました💦

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/60a7d080-96c5-736b-81c4-f334a1d0dfeb.png)

気が付いたら、トライアル期間が終了してました。
この時、どうなるんでしょうか。


### Autify から 実行してみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/cbf4bb67-6082-b717-c204-0adbd130bb29.png)

なるほどなるほど、こんな表示になるんですね。

### API から 実行してみましょう

- API の詳細はこちら。
https://autifyhq.github.io/autify-api/

- 実行したら「401 Unauthorized」が発生しました。なるほど！
    - APIを実行して、これが発生すると、この原因が考えられそうです。
- POST 系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/2f27d6f5-9205-1e60-8892-6be904eb51c2.png)

- GET 系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/87258cbd-7e59-ff76-c9de-0782fc154f8e.png)

### シナリオ・テスト結果はどうなるの？

テスト結果は、一定期間保存された上、その後は見えなくなるようですが、
それ以外は、消えないそうです。

- 契約期間が終わったらユーザーの登録やテストシナリオやテスト結果はどうなりますか？
    - https://autify.zendesk.com/hc/ja/articles/900004804663-%E5%A5%91%E7%B4%84%E6%9C%9F%E9%96%93%E3%81%8C%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%9F%E3%82%89%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%99%BB%E9%8C%B2%E3%82%84%E3%83%86%E3%82%B9%E3%83%88%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E3%82%84%E3%83%86%E3%82%B9%E3%83%88%E7%B5%90%E6%9E%9C%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B-

- テストの実行結果はどのくらい保存していますか？
    - https://autify.zendesk.com/hc/ja/articles/900000817443


# ご了承ください
- まだまだ勉強中の部分もあります。間違っている箇所もあるかもしれません。
- Salesforce、Autify は、この時点のバージョン(2022年1月頃) での内容になります。今後、仕様変更が変わることによって、内容の通りにならない可能性もあります。ご了承ください。
 - また、URLなども変更になっている可能性もあります。

# 過去の記事
- Autify で Salesforce を動かしてみよう～ vol.0 準備編
 - https://qiita.com/xx_mana/items/107eb97dcc0da26daeb8
- Autify で Salesforce を動かしてみよう～ vol.1 ログインへの道
 - https://qiita.com/xx_mana/items/7f532a977184037ea80c
- Autify で Salesforce を動かしてみよう～ vol.2 JSステップ・現在の日時
 - https://qiita.com/xx_mana/items/1642075b7fdb4950d419
- Autify で Salesforce を動かしてみよう～ vol.3 文字色のエラーチェック
 - https://qiita.com/xx_mana/items/59e1cf5275ef0656d7c9
- Autify で Salesforce を動かしてみよう～ vol.4 もっと詳細なブラウザ情報ってとれるの？
 - https://qiita.com/xx_mana/items/02bcbc7003566d2eef85
- Autify で Salesforce を動かしてみよう～ vol.5 Autify API を使ってみよう！
 - https://qiita.com/xx_mana/items/9b87ad071f62a200f0c4
- Autify で Salesforce を動かしてみよう～ vol.6 Salesforce のメジャーリリース
 - https://qiita.com/xx_mana/items/55b2d65c995ac62e2129
- Autify で Salesforce を動かしてみよう～ vol.7 Visualforce / Apex
 - https://qiita.com/xx_mana/items/89d9dac362311190e8af
- Autify で Salesforce を動かしてみよう～ vol.8 ShadowDOM・その１
 - https://qiita.com/xx_mana/items/022bc98c3c052d0acc04
- Autify で Salesforce を動かしてみよう～ vol.9 ShadowDOM・その２
 - https://qiita.com/xx_mana/items/1a586c905e6ce3d0821b
[スクラム入門] スクラムの一歩は朝会でGood OR Newから！

#### スクラムガイドをすっ飛ばしてのスクラム

スクラムガイドについて、
SCRUM BOOT CAMP THE BOOKとかわかりやすい書籍がでているし、
Google検索すれば、入門記事が色々出てくる

おすすめ入門書籍

https://www.amazon.co.jp/dp/B086GBXRN6/

#### まずは朝会の導入

スクラムイベントで一番導入しやすいのは、デイリースクラムになるかと。

ただ、デイリースクラムはだんだんと進捗報告する場になり、
スクラムのように、チームを盛り上げるのにかける。

特にリモートだとタスク淡々と読むマンになる。
そこでデイリースクラムの前にアイスブレイクを10分で実施する！

（時間を区切るのは大事。今度は雑談でダラダラになってしまうため！）

#### アイスブレイクって何をするの？

Good & New(グッド アンド ニュー)は良いネタになる。
良かったこと、そして新しいことである必要はないかなと思う。

https://thanks-gift.net/column/communication/good-new/

なので、少し変えて Good OR New（よかったこと　もしくは　新しくチャレンジしたこと）をテーマにやるのが良いのかなと思う。

もしくは、テーマが決まらないなら、トークガチャで決めてもらうのもあり！

https://talkgacha.com/
【Ruby】任意の文字列を部分的に削除　slice!メソッド

※初心者向け
※アウトプット練習の為

開発環境
rails 6.0.4.4
ruby 2.6.5

**概要**
対象となる文字列から任意の文字を削除したのち、残った文字列を出力するプログラムを実装します。

##問題内容
以下の要件を満たすmissing_charメソッドを実装しましょう。

**・対象となる文字列からn番目の文字を削除すること**
**・削除された文字以外の文字列を出力すること**

**雛形**

```ruby
def missing_char(str, n)
  # 処理を記述
end

# 呼び出し例（1つ目の引数には対象となる文字列を、2つ目の引数には対象となる文字列から何番目の文字を削除するのかを指定しましょう）
missing_char('kitten', 1)
```

出力例：
missing_char('kitten', 1) → 'itten'
missing_char('kitten', 2) → 'ktten'
missing_char('kitten', 4) → 'kiten'

**ヒント**
slice!メソッドを使用しましょう。

**slice!メソッド**
slice!メソッドは、配列や文字列から指定した要素を削除し、削除した後の要素を返すメソッドです。末尾にエクスクラメーションマーク(!)のつくメソッドを破壊的メソッドといいます。これはもとの配列や文字列を変化させるメソッドです。

```ruby
string = "abcdefg"
string.slice!(2)

puts string
#=> "abdefg"
# 2番目の要素のcが取り除かれている
```



##解答

```ruby
def missing_char(str, n)
  str.slice!(n - 1)
  puts str
  #=>'itten'
end

# 呼び出し例
missing_char('kitten', 1)
```

##解説
任意の文字に対してn番目の文字を消すために、文字列自体から取得した値を取り除く、**slice!メソッドを**使用します。
**sliceメソッド**は文字列自体の形を変化させることはできないため、エクスクラメーション(!)を付けた**slice!メソッド**に変更しています。

この**slice!メソッド**はmissing_charメソッド内で処理を行います。
missing_charメソッドの引数**str**には入力した文字列、nは何番目の文字列を消すのか指示する数字を入れる仕様になっています。

```ruby
def missing_char(str, n)
```

例えば、呼び出し元が**missing_char('kitten', 1)**であれば、**str**には**'kitten'**が入り、nには1が入るということです。

そして、**slice!メソッド**に**n**から**1**を引いた数を引数にしています。
なぜ1を引くのかというと、文字列の順番を指定する際も、配列と同じように先頭の文字列
は0からカウントされるためです。
よって、下記のように記述することで**n**から**1**を引いた数字に該当する文字列を**str**から削除することができます。

```ruby
str.slice!(n - 1)
```
Gitコマンド短縮化

# はじめに

Git使う際、わざわざ

```
git add .
git commit -m"message"
```

としていないでしょうか。

# コマンド短縮化

configの設定にaliasを追加します。
**ac**というaliasを追加することで、addとcommitをまとめて実行するようにします。

```shell
git config --global alias.ac '!git add -A && git commit -m'
```


**s**というaliasを追加することで**git s**でステータス見れるようにします。

```shell
git config --global alias.s '!git status'
```



# 使用方法

```shell
git s
git ac "message"
```

以上。
CMakeチュートリアル３【変数・環境変数・分岐・ループ】

前回はCMake【チュートリアル２】で複数のファイルの扱い方について解説しました
しかし、全部手書きしていては手間がかかって仕方ない事も多々あると思います
今回はCMakeで変数・ループ・デバッグの仕方について解説していこうと思います

ソースコードは[github](https://github.com/0xopenfields/cmake_tutorials)からダウンロード/cloneしてください

# チュートリアル３
CMakeでの変数の使い方やデバッグプリントの仕方などについて解説していきます
今回は、冗長ですがCMakeの使い方を説明するため、四則演算の関数を全て別のファイルに分けています
tutorial_3/CMakeLists.txtを開いてください
前回より少し複雑になっています

## 変数
CMakeで変数に値を代入するには`set`を使用します
CMakeでは変数の型がないので内部的には文字列になります
変数の種類は値・文字列・BOOLの３種類があります

```CMake
set(VAR_VALUE       1)
set(VAR_STR         "文字列")
set(VAR_BOOL        ON)
```

## デバッグ
CMakeで変数のデバッグをするには`message`を使用します
`""`で囲んだ文字列の中でも`${変数名}`とすれば出力できます
また、`STATUS`の他にもいくつかのオプションが存在する
これについては別のセクションで解説予定

```CMake
message(STATUS  "VAR_VALUE=${VAR_VALUE}")
message(STATUS  "VAR_STR=${VAR_STR}") 
message(STATUS  "VAR_BOOL=${VAR_BOOL}")
```

## 環境変数
CMakeでシステム環境変数を取得するには`$ENV{環境変数名}`を使用する
下記の例は環境変数`PATH`を出力する

```CMake
message(STATUS  "PATH=$ENV{PATH})")
```

## 変数の外部入力
CMakeを実行する時に`-D 変数名=値・文字列`を付けて実行すると外部から変数に値を代入できます

例)

```
cmake -S tutorial_3 -B build/tutorial_3 -D VAR_FLAG=ON
```

## 分岐
分岐文は以下のように記述します

```CMake
if(分岐条件1)
    処理1
else if(分岐条件2)
    処理2
else()
    処理3
endif()
```

tutorial_3/CMakeLists.txtの分岐例は以下のようになっています
変数`VAR_FLAG`をcmake実行時にON/OFFを代入することで通る分岐が変わります

```CMake
if(VAR＿FLAG)
    message(STATUS "VAR_FLAG is TRUE")
else()
    message(STATUS "VAR_FLAG is FALSE")
endif()
```

## ファイル・リスト
ファイルのリストを１つの変数に代入できます
下記の例ではtutorial_3/srcフォルダの中のソースコードを変数`SOURCES`に代入しています
また、`*`はワイルドカード、`${CMAKE_CURRENT_SOURCE_DIR}`は予約語です
`${CMAKE_CURRENT_SOURCE_DIR}`は現在のCMakeLists.txtがあるディレクトリを指します

```CMake
file(GLOB_RECURSE SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cxx)
```

## ループ 
ループ文は以下のように記述します
`${SOURCES}`にはadd.cc, sub.cc, mul.cc, div.ccが代入されているので４回ループします
順番にファイル名が変数`file`に代入されます

```CMake
foreach(file ${SOURCES})
    message(STATUS ${file})
endforeach()
```

## プロジェクトへの一括追加
`add_executable(${PROJECT_NAME} ${SOURCES})`で変数\${SOURCES}に入力したファイルをプロジェクトに一括追加することができます

```CMake
add_executable(${PROJECT_NAME} ${SOURCES})

target_include_directories(${PROJECT_NAME} PRIVATE include)
```

## ビルド

```
cd cmake_tutorials
cmake -S tutorial_3 -B build/tutorial_3 -D VAR_FLAG=ON
cmake --build build/tutorial_3
```

## 実行 
- Windows

```
build\tutorial_3\Debug\cmake_tutorial_3.exe
```

- Mac/Linux

```
build/tutorial_3/cmake_tutorial_3
```

---
出力結果

```
5 + 3 = 8
10 - 7 = 3
3 * 8 = 24.000000
13 / 3 = 4.333333
```

---
CMakeの変数・環境変数・分岐・ループについて解説しました
複雑な構文など全部網羅は仕切れないですが色んなOSS等も見てみると参考になると思います
CMakeの予約語については[こちら](https://cmake.org/cmake/help/v3.22/manual/cmake-variables.7.html)を参考にしてください

次回はライブラリの作成と複数プロジェクトについて解説していこうと思います
Excelを読み取り専用で開く【VBS】

##はじめに
こんにちは、Mottyです。
かなり久しぶりの投稿となりますが...ちょっとExcelファイルとvbsについて書きました。
共有サーバーに置いてるスケジュールなど、変更してはいけないファイルを見るときは”読み取り専用”で開くのが一番安全ですよね。
方法はいくつかあるので、今回はそれについてまとめました。併せてVBSの威力も知ってもらえたらなと思います。

###1.Excelのクイックアクセスツールバーから開く

Excelファイルを開いてオプション→クイックアクセスツールバーを開く。
コマンドの選択：基本的なコマンドを選び、「読み取り専用の設定/解除」を選ぶ
（膨大な数のコマンドがあるので、下記のスクショを参考に探してください。笑）
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/4d7ce551-6bfc-105d-e7eb-2276ff70137e.png)


一番上の緑タブにアイコンができましたね。
ここをクリックすることで読み取り専用の設定/解除が行えます。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/0959aeb5-ee33-08ef-0ea7-a64448df538a.png)


###2.Shift押しながら右クリック→読み取り専用
隠しコマンド的な機能ですが、Shiftを押しながらExcelを右クリックすることで、以下のような画面が開かれます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/bffcbfc9-9130-6155-376a-cd383202df92.png)

※**ただしこれを押しても読み取り専用では開けません！**
windows内のどこかしらのプロパティを設定すれば開けるそうですが、設定変えてPCがおかしくなるリスクもあるので…少しおすすめはできません。一応そういう方法もあるよ、ということだけ紹介しておきます。

###3.VBSCriptを組み、そこから開く

愛してやまないVBSCript...メモ帳で編集できるプログラムの登場です。一旦vbsファイルを作ってしまえば以降ダブルクリックだけで機能するものです。
①メモ帳を新規で開く
②下記をコピーする
③Excelのパスをコピーして、下記のFilePath="*.xlsx"欄に張り付ける
④名前を付けて保存→拡張子を.vbsに置き換える ※日本語のファイルを開く場合、文字コードはASIIで保存しないと文字化けしてエラーが出てしまいます。
⑤ダブルクリックをすると読み取り専用で開ける。

```読み取り専用で開く.vbs
Dim FilePath
FilePath="*.xlsx" 'ここにパスを入力する

Dim objExcel
Set objExcel = WScript.CreateObject("Excel.Application")
objExcel.Visible = True
Call objExcel.Workbooks.Open(FilePath,,True)'読み取り専用で開く
objExcel.DisplayAlerts = False
Set objExcel= Nothing 'オブジェクトの破棄
WScript.Quit
```

無事に読み取り専用で開けたかどうかを確認してください。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/7543850e-283f-5940-9232-4cef6c00a5f0.png)


##最後に
ファイルのコピペや今日の日付のフォルダを作るみたいな簡単な作業だったらバッチファイルで済むのですが、
Office系のアプリを操作したりメールを送ったり、みたいな少し高度なことはVBScriptがやってくれます。
ほかにもVBSやバッチの便利な方法などあったら不定期で更新していきたいと思います。
それでは。
【Python】モジュール探索パスの追加方法

モジュール探索パスを追加してインポートする方法をメモしておく。

# モジュール探索パスの追加方法
モジュール探索パスとは、Pythonのimport文で自作のモジュールなどをインポートする際に探索されるパスのこと。これを追加することで絶対インポートができ、カレントディレクトリによらず上位ディレクトリでも正しくインポートできる。
モジュール検索パスは、標準ライブラリの```sys```モジュールである```sys.path```に格納されている。そこに、```append()```メソッドを使用して、パスを追加する。


```python
import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), "../.."))
```

ここで、```os.path.join()```は引数で与えられたパスを結合する。
また、```os.path.dirname(__file__)```は実行ファイルのディレクトリ名を取得できる。
RSpecで孫モデルから親モデルの属性を指定することはできない

# 概要
has_one/belong_toの関係で構成された2段階のモデルがあった場合、孫モデルをcreateするときに親モデルの値を指定したかった。
[![Image from Gyazo](https://i.gyazo.com/d92b5d60a0a7ec13d5b57e6a988804d8.png)](https://gyazo.com/d92b5d60a0a7ec13d5b57e6a988804d8)

# 結論
できない

# じゃあどうするのか
一度子モデルを作って繰り返すしかない。以下例。

■RSpec  

```ruby
  # 一番上の親モデルを作ります
  oya = create(:親)

  # 子モデルをcreate_listで作りながら、eachで孫モデルを作ります
  create_list(:子, 3, 親: oya).each do |child|
    create(:孫, 子: child)
  end
```

■子Factory

```ruby
  factory :子, class: 'Child' do
    # associationで自動で親モデルをcreateしてくれる。が、RSpecで指定した「oya」で上書きされる感じ
    association :親

    # RSpecで上書きされた親のidをつかう
    sequence(:oya_id) { 親.id }
    sequence(:name) { |n| "testname#{n}" }
  end
```


■孫Factory

```ruby
  factory :孫, class: 'Mago' do
    # associationで自動で子モデルをcreateしてくれる。が、RSpecで指定した「child」で上書きされる感じ
    association :子, factory: :Child

    # RSpecで上書きされた子のidをつかう
    sequence(:child_id) { 子.id }
    sequence(:name) { "c" }
  end
```


Factory内で2階層上のIDを何とか指定したかったができなかった。いい方法があれば教えてください。
RPGタスクの使い方マニュアル

#説明
ゼミにて作成したアプリの使い方マニュアル。
※アプリはデモ版です。

作成したアプリURL↓
https://creampuff.pythonanywhere.com

#使用言語等
Python3
Django3
HTML/CSS
JavaScript
Bootstrap

#アプリ概要
タスク管理とゲームを融合したアプリ。

大学の課題や就活の予定を締切付きで登録。
タスク完了が
締切前：モンスターに攻撃できる
締切後：モンスターから攻撃される
タスクを沢山完了させるほど勇者のレベルが上がり達成感が得られる

#実装している機能
#####タスク機能
タスクの登録・削除、タスクのカテゴリー追加・削除、履歴の確認・削除
#####ゲーム機能
タスク完了時ゲームアニメーション、キャラクターの装備設定、ステータス確認、装備購入


#使い方
1.アプリのURLに飛んでください。トップページに行きます。
アプリURL: https://creampuff.pythonanywhere.com

2.トップページの右上から入会ボタンで入会を行ってください。
メールアドレスとパスワードでアカウント作成できます。
![スクリーンショット 2022-01-20 13.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386248/a43fc1d6-c991-39ee-a4a3-40e155749604.png)

3.ログイン後、右上にマイページボタンが現れるのでマイページに移動します
![スクリーンショット 2022-01-20 13.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386248/6ca41a8e-8d00-611d-2db8-7f9bc0ddb688.png)

4.メニューの一番下のタスク管理からアプリのメインページに移ります。
マイページではパスワードの変更や退会ができます。
![スクリーンショット 2022-01-20 14.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386248/5db8405e-da15-8435-53a5-5de8a504268f.png)
メインページ
![スクリーンショット 2022-01-20 14.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386248/aeeab786-43a1-e9b8-6b8b-43268278e797.png)

メインページのメニューバーからタスクの登録やカテゴリーの追加・削除などの機能を使うことができます。
タスクを完了するとゲーム画面にてアニメーションが流れます。
ぜひ、操作してみてください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386248/101665f3-a778-e250-1ae1-e7dbf1c3e882.png)
タスク完了時に流れるアニメーションの様子



#制作背景
課題や予定を管理したいというのと、タスクを終わらせることを楽しくなるようにしたいという目的からこのアプリの制作を行いました。

#制作フロー
アプリ構成検討、アイディア出し
↓
作成機能決定、完成予想図
↓
アプリのプロトタイプ作成
タスク管理を文字のみで表記
↓
ステータス画面、武器購入画面の作成
↓
ゲーム部分アニメーション・ロジックの作成、見た目の調整
↓
ログイン画面作成
↓
細かい修正と外部サーバーへ接続


#こだわったポイント
・ゲーム感覚で楽しめるようにアニメーションが流れるようにしたこと
・やりがいが感じられるように完了したタスクの数や総攻撃数を目にみえるようにしたこと

#次回に向けた学び
・ゲームにステージを作ったりチームで協力できたりともっとゲーム性を高めること
・データベースを学び、個人別々のメインページにすること
[Mac構築] Nodenvではなくnを使った npmのインストール

Macを新調したときの環境構築のメモ

npmを使うとき、いつもNodenvだったが、
今回はnを使ってインストールしたメモ

### nとは

https://github.com/tj/n

### nの設定手順

・HomeBrewでインストール

```sh
$ bnrew install n
```

・LTSのNodeをインストール

```sh
$ sudo n lts
```

・Nodeのバージョンを指定してインストール

```sh
$ sudo n 10.15.3
```

・Nodeのバージョンを切り返る

```sh
$ sudo n
```

![node10.15.3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/9fc09d07-f47a-5f72-c392-33397dd2e2cc.png)
￼
#### 所感

バージョンをUIで切り替えるだけでいける。コマンドも短くて楽！
【楽天ブックス書籍API】配列にpushしたやり方( vue2 , vuex )

##for of文で配列にpushする際に詰まったので備忘録(楽天API)

####使用した技術
- TypeScript
- Vue2
- Vuex

####楽天ブックス書籍APIの中身
![スクリーンショット 2022-01-20 14.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102695/2e1cbe90-b2ce-25a8-beee-2af95d2927ee.png)
Items配列の0番目にItemオブジェクトがあり、その中に連想配列として情報が格納されています。

##取得したデータをVuex stateの配列に格納する
####間違ったやり方
![mutataions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102695/e30c87ef-278e-60e4-9f29-e8ada067ed52.png)
payload.Itemsを回し、item.keyでpushしようとしていました。
しかしこれだとItems配列の内のItemオブジェクトの連想配列まで辿り着けておらず、解決策はこうでした↓

####解決したやり方
![スクリーンショット 2022-01-20 15.53.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2102695/1b6a49e6-fc82-e34b-3188-a8449685efd3.png)
【 item.Item.key 】と指定することで解決。
for of文で回したitemの中のItem、にしたら無事取り出すことができました。
vbsの作法 その50

# 概要

vbsの作法、調べてみた。
comサーバやってみた。

# 参考にしたページ

https://qiita.com/Stosstruppe/items/f2b2f9f2f78c6a120bb0

# 環境

- windows10 home

# サンプルコード

```
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Sample
{
	[ComVisible(true)]
	[Guid("C699A6A5-D3D5-4A6F-AAC0-C8E45EA2C326")]
	[InterfaceType(ComInterfaceType.InterfaceIsDual)]
	public interface ITest {
		void Hello(string msg);
	}
	[ComVisible(true)]
	[Guid("357D2C12-8FD1-41F8-AFCE-A513026666B0")]
	[ProgId("Sample.Test")]
	[ClassInterface(ClassInterfaceType.None)]
	public class Test : ITest {
		public void Hello(string msg) {
			MessageBox.Show(msg, "Test");
		}
	}
}

```

# 手順

```

csc -target:library sample.cs
regasm /codebase sample.dll

```

# 確認

vbs

```
Dim o
Set o = CreateObject("Sample.Test")
o.Hello("hello, VBScript")
Set o = Nothing



```

以上。
個人開発のよくある落とし穴20選【９選追加(202012追加)】

## まとめ

個人開発で「これをやれば成功する！」というのは無い。
しかし、体系だったフレームワークや正攻法は存在する。
よくある落とし穴を先に学んで避けるべき！

## ターゲット

- 個人開発をやろうと思っている人全般
- 個人開発で成功体験がまだない方


## 思考

**起業や新規事業開発の落とし穴**と個人開発の落とし穴で似てるところが多い
スタートアップの記事や個人開発者へのインタビューを通して気づいた落とし穴を11選まとめてみた
（９選追加 2022/12）



## よくある落とし穴

---

### 1.目的がはっきりしていない



![個人開発の目的マップ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/ea095e32-e192-3ccd-bebd-d2c5e72a6ce7.jpeg)




```
最大にして一番多い落とし穴！
スタートアップと個人開発で異なる点は、「人によっては儲かることが成功ではない点」である。
個人開発では個人が自分で開発をしたいと思う理由は千差万別.
目的を見失わないだけで成功体験は得やすくなる。
```



#### よくある例



- お金儲けしたい目的のアプリに**勉強の要素も追加**、使ったことの無い言語の多用で工数の増加。
    - 結果、ローンチ前にやる気がなくなり、時間経過によるアイデアの頓挫。
- 技術力をアピールする目的で始めたが、どうせ作るならとバズりたい欲が高まる。
    - おもしろAPIを使用した簡易的なアプリでバズりを狙いにいってしまう。



#### 対応

**目的は最初に明確化。常に確認**しながら目的ベースで開発することをおすすめします。
一つの目的を完遂することですら**難易度は高い**ことを理解する。



例） 自分の学習のためのアプリ

- 作ったアプリを長くメンテナンスをすることが一番の学び。
  - 一定数ユーザーがいて**ロングラン**できることが必要。
    - お金をたくさんかけられないが、**UXを下げられない**。
    - 制約の中でユーザーが稀にログインしてくれるような設計をする必要がある。



#### 自己成長が目的の場合

- 成長のための戦略を立てる。
- 時間や労力をかけて何を得て、どんな道が広がるか、どうなりたいかまで見据えておきたい。

`戦略があればムリ・ムラ・ムダが減る`



##### ※これ以降は「売上を作りたい」や「人気になりたい」などの目的を前提にします。

---

### 2.車輪の再発明(類似サービス)



大きく2つ

```
・ 市場調査をせずコンセプトが同じサービスを作る
・ 類似サービスを気にし過ぎて作らない
```



#### 対応

サービスのペルソナを設定。
課題に対して現在どんな代替対応をしているかを調査。
ユーザーストーリーの仮説を立てる中で既存のサービスなどで対応できていない点があれば、サービスとしての差分になることを理解する。

---

### 3.いつの間にか「高機能なもの」を作ることが目的になる


```
ユーザーが欲しいものでなく、自分が作れるものや作りたいものに焦点が当たってしまう。
フォーカスがずれてしまう状態。
技術力のある人などを陥りやすい落とし穴。
高機能は既存の顕在化された軸における延長戦でしかない。
```


![wooden-board-ge49422b2d_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/0736ae79-c883-f76d-40e7-8ab04da954ed.jpeg)


#### 対応

ユーザーが求めているのは高機能なものではなく、需要にあった「ドリルの穴」であることを忘れない。
サービスができてからはユーザーインタビューなどを繰り返し、本当に欲しいものは何かを検証したり、インサイトを獲得する。

---

## 20選まとめは移転させて頂きました🙇‍♂️

まだまだあります「よくある落とし穴」
２０選全てを無料で見ることができるのでぜひチェックしてあげてください。

https://www.ideee.tech/avoid_pitfall?utm_source=qiita&utm_medium=article&utm_id=avoid_pitfall

---

## まとめ

サービス開発を成功させるためには考えることが多い。
しかし、確実に成功に近づける方法はあるので
試行錯誤しながら検証を繰り返していくのは楽しい！!!

---

## 落とし穴追加していきます

今回は[こちらのLT会](https://tonihome.connpass.com/event/235153/)用に11選をまとめました！
（そこに９選を追加して20選になりました！）
経験に基づき、シェアをしていきたい落とし穴はまだあり、30程書ける予定です！
時間があるときに追加していく予定ですので、よろしければ**LGTMやシェア**で応援よろしくお願いします🙇‍♂️

---

## 自己紹介

個人開発について発信しています！
Twitterもフォローください👏
[@1026NT](https://twitter.com/1026NT)
なる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/3db40e7d-3213-be1f-8650-c6ad5dff69c9.jpeg" width="300px">
CMakeチュートリアル２【include, 複数ソース】

前回は[CMake【チュートリアル１】](https://qiita.com/openfields/items/0ea6e19304a427e6c616)で最小のCMakeLists.txtの書き方を解説しました
今回はインクルードと複数ファイルのプロジェクトの書き方について解説していきます

ソースコードは[github](https://github.com/0xopenfields/cmake_tutorials.git)からダウンロード/cloneしてください

# チュートリアル２
CMakeでinclude, 複数ファイルのビルド方法について解説していきます
gcc/g++で書くとこんな感じのやつですね

```
g++ -I include -c src/add.cc -o src/add.o
g++ -I include -c src/tutorial.cc src/add.o -o cmake_tutorial_2
```

## CMakeLists.txt

```CMake:tutorial_2/CMakeLists.txt
cmake_minimum_required(VERSION 3.13)

project(cmake_tutorial_2)

add_executable(cmake_tutorial_2
                src/tutorial_2.cc
                src/add.cc)

target_include_directories(cmake_tutorial_2 PRIVATE include)
```

1. `add_executable` でcmake_tutorial_2プロジェクトにsrc/tutorial_2.cc, src/add.ccを追加   
2. `target_include_directories`でcmake_tutorial_2プロジェクトのインクルードディレクトリにincludeを追加 

## ビルド

```
cd cmake_tutorials
cmake -S tutorial_2 -B build/tutorial_2
cmake --build build/tutorial_2
```

## 実行 
- Windows

```
build\tutorial_2\Debug\cmake_tutorial_2.exe
```

- Mac/Linux

```
build/tutorial_2/cmake_tutorial_2
```

---
出力結果

```
5 + 3 = 8
```

---
さて、今回はインクルードと複数ファイルでのプロジェクト作成とビルドでした
[次回](https://qiita.com/openfields/items/e8ce0e64ef4f4ee32ccd)は変数を使用してもう少し複雑にしようと思います
Google Chromeで開いているタブの数を確認するとき

# はじめに

Choromeでついタブを開きすぎてこのようになっていることはありませんか？![スクリーンショット 2022-01-20 15.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294645/86b99b3d-9861-fc79-7151-e158406c0034.png)
まだこれだけならいいのですが，僕の場合，![スクリーンショット 2022-01-20 15.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294645/a1b88b3e-093b-f965-cdc8-8c95116caf25.png)
こんな具合で大量に開きすぎています...

もちろんスマートフォンも例外ではなく，
![スクリーンショット 2022-01-20 15.20.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294645/2b9a75c6-19f2-0aa0-2267-6804eaf20412.png)
ご覧の通り，開いているタブ数が100をとっくに超えていて:Dと笑われてしまっています...

# Chromeで開いているタブの数の確認の仕方

こんなに開いているので手作業で数えるわけにはいきません．
じゃあどうするかというと以下のページにまとめられています．

https://chrome.google.com/sync

先程のアドレスにアクセスして下の方にスクロールしていくと...
![スクリーンショット 2022-01-20 15.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294645/e96dc08f-4e19-ab1a-63a4-a432e12db97d.png)

僕はどうやら1162個のタブを開いていたようです...

用法用量を守ってタブの開き過ぎにはご注意を...
Azure仮想マシンのWindowsライセンス認証ができない

# Windowsラインセス認証失敗

現象：
AzureのVMは標準作成を行い、ログインしたら、
　　・システム属性または　更新とセキュリティからライセンス認証に
Windowsはライセンス認証されていません　という記載があります。
　　・壁紙に「Windowsのライセンス認証」というアラートはあります。

対策：
設定は間違わなければ、slmgr.vbs /atoにて実施すると認証できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/ffbaedf3-85c2-9af1-5194-677feae4d0cb.png)

普通はどこか特にNW設定が不備があり、↑のイメージのように通さない結果になります。

トラブルシューティングについては、以下の通り記載します。

* 以下のコマンドでKMSは正しく設定されたことを確認する。  
<code>
Invoke-Expression "$env:windir\system32\cscript.exe $env:windir\system32\slmgr.vbs /skms kms.core.windows.net:1688"
</code>

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/fdf2bd0a-832c-8e20-ca5e-4f75ed25547f.png)

* PSpingを利用して、以下のコマンドでNWが疎通できることを確認する。  
<code>
 .\psping.exe kms.core.windows.net:1688
</code>

* ルートテーブルに23.102.135.246 (KMSサーバ)へのトラフィックはInternetへ出ることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/850e017d-28ac-aeb1-197a-79541c0abc34.png)

* NICのセキュリティグループに　23.102.135.246 (KMSサーバ)へのトラフィック　が許可されていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/04e32f00-c122-690f-03a2-f5d7e8fa3078.png)

Azureの参照リンク：
https://docs.microsoft.com/ja-jp/troubleshoot/azure/virtual-machines/troubleshoot-activation-problems
様々なコンテンツ(要素)がある動画の同期再生について

教育系、ライブコマース系、投げ銭系のライブ配信ではアーカイブでの配信も有効活用されます。
これらのアプリではホワイトボードであったり、チャットであったり、商品情報等、様々なコンテンツが動画以外の部分に表示されているのが一般的です。

アーカイブ配信ではリアルタイムの画面表示を再現する必要が出て来ます。

この記事ではライブコマースのライブ配信アプリを例にアーカイブ動画の設計について解説します。
映像配信部分についてはAgora.ioを利用する想定になります。

##アプリの概要
（筆者の好みで釣具のライブコマースを想定します）

**配信側**

スマホを3脚に固定して配信。配信開始,録画開始等のボタンや視聴者からのコメントが見れるシンプルな仕様。
利用中(販売中)の釣具を設定して視聴者に情報提供。
別システムと連携して現在の釣り場の状況も見れる。
視聴者からのコメントも見れる。

**視聴側**
映像だけではなく複数の情報がリアルタイムに表示される。
アーカイブ動画でもリアルタイムと同様にタイムラインに沿って複数の情報が更新される。

![スクリーンショット 0004-01-20 14.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/a3c5aa26-6e68-47ba-f490-d5a100209c73.png)

##一番簡単な録画方法
手っ取り早くアーカイブ録画を作成するには、視聴アプリをそのままスクリーンキャプチャしてしまうことです。
（アシスタントさんが必要になってきますが。。。）

##アーカイブ録画のシステム化
Agora.ioでは以下の3パターンの録画方法を提供しています。

- オンプレミス録画
- クラウド録画
- Webページ録画

大雑把な違いについては以下になります。
![スクリーンショット 0004-01-20 14.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/3a95326a-3378-7c18-deba-c5c1e8bc53a8.png)


##録画開始までのフロー
すべての録画パターンにおいて基本的に以下のフローになります。

![スクリーンショット 0004-01-20 14.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/7f51f55f-72e6-b9b4-7101-09af32d80987.png)

サーバーの管理について(A)オンプレ録画、(B)クラウド&Webページ録画で分けると以下のようになります。
![スクリーンショット 0004-01-20 14.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/7a1ca986-dbd0-67e3-0add-b10fee1a8062.png)


##アーカイブ再生アプリの設計
**設計のポイント＝タイムライン**となります。
ライブ配信開始時を起点として
 
- いつからいつまで
- 何が
- どこに表示されていたか

等をデータとして残しておく必要あります。

##動画(HLS)単体でのタイムラインファイル
**.m3u8**

HLSでの動画は.tsという動画ファイルと.m3u8というタイムラインを表すテキストファイルで成立しています。
.m3u8には.tsファイルの情報と再生する順番が記載されています。この情報をブラウザが最初に取得して、順番に動画を取得しながら再生をします。
![スクリーンショット 0004-01-20 15.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/95610336-7b50-76d8-44fc-497bc8a94b0c.png)
[出典元 Agora.io公式ドキュメントより](https://docs.agora.io/en/cloud-recording/cloud_recording_manage_files?platform=RESTful#sample-m3u8-file-for-video)

##コンテンツ毎のタイムラインファイル
運営側で独自のフォーマットで作成する必要がでてきます。
イメージとしては以下のようなものです。
![スクリーンショット 0004-01-20 15.12.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/08dca4b2-7b4f-b8a9-4ac3-ca85398a3eb7.png)

実際にはテキストファイルのような形式になります。
各項目についてもそれぞれ詳細なデータを保持しているパターンもあります。
表示座標や大きさ、ライブでは表示されてたけどアーカイブでは表示させない等。

##Webページ録画の場合は

**Agoraのサーバー内でブラウザが起動してWebページそのものを録画しつづけます**
(視聴側がiOS/Androidアプリの場合は別途Webページ録画用にWebアプリを作る必要があります)

**メリット**
前述のような複雑なタイムラインファイルや実装不要で1つの動画ファイルで再現可能
**デメリット**
1つの動画ファイルで生成されるので編集が難しい（消したいチャット文言等）


##最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=22d70ef4959c60a78a87)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=22d70ef4959c60a78a87)
【Apigee】非同期処理を実装する方法

Apigeeの仕様については、公式のドキュメントやYoutubeにアップされている説明動画がたくさんあるのでありがたいです。
ただ謎に細かいところでつまずいたりしたので一応メモ。

# 「Service Callout」ポリシーで、「Response」タグを省略する
[公式ドキュメント](https://docs.apigee.com/api-platform/reference/policies/service-callout-policy#response)に書いてありました。↓
>この要素を省略すると、API プロキシはレスポンスを待ち受けません。


### 動作確認
Service Calloutを追加（プロキシチェーンで、別のプロキシを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364867/7f14e22c-7638-45f8-e866-1492e7351006.png)

↓ここでは、あえてJavaScriptで2秒くらいwaitするプロキシを別途作成済みなので、それを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364867/544dbae6-6d8b-83ef-7e44-a889f7c1d336.png)

あと、アクセスはローカルからのみ受け付ければよいので、AccessControlで一応127.0.0.1のみ許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364867/4e06534e-f9ac-9fa2-1fd0-c1ba57e05376.png)

リクエストすると、呼び出し先（左）のプロキシの処理は完了していないが、呼び出し元（右）の処理は完了している。（非同期処理が行われている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364867/27b94b97-d6db-87c5-7740-146127a74a7e.png)


### 懸念
呼び出したプロキシからのレスポンスを受け取れないこと。
非同期処理のレスポンスを使って何かしたい場合はこの方法使えない。。
Webhookに対してレスポンスを返し、その上で内部処理を行うという作りの場合などはこれでOK。
sfdx Error: Value too long for field: Source maximum length is:131072


[Lightning Web コンポーネントファイルのリリース](https://trailhead.salesforce.com/ja/content/learn/modules/lightning-web-components-basics/push-lightning-web-component-files?trail_id=lex_dev)

をやっていて表題のエラーになりました。

何これ？

プロジェクトを作った時に前々回、前回のフォルダーの下に配置してしまったようです。
まぁ、何にも考えずに保存したのが間違えでした。

深い階層にあったbikeCardのフォルダーを削除して　プロジェクトの作成からやり直しです。

今度はuserの直下につくりました。

無事にデプロイできた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/87ccc4dc-07ab-a3ce-78e3-74efe3cbb494.png)


このチェレンジは説明通りにつくれば、問題なく完了できます。
しかし、VS Codeでデプロイしたプレイグランドと、検証しているプレイグランドを一致させておく必要がありますね。

-------------------------------------------------------------

[Lightning Web コンポーネントでのイベントの処理](https://trailhead.salesforce.com/ja/content/learn/modules/lightning-web-components-basics/handle-events-in-lightning-web-components)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/15d6a5db-45cd-1cd7-11c2-debd448e1e24.png)
どうやって、展開するんだろう？不思議です。

仕方ないので、ダウンロードして展開したファイルをプロジェクトのbikeCardのあるフォルダーにコピーします。
その後VS Codeを閉じて、再度起動させました。

ああ、勝手に読みこんだみたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3d5b5194-56cd-80f8-b315-b1b8f38b93be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c0abf38a-2414-33be-8977-df49b2a0c269.png)

よく分からんけど、これでデプロイは完了できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/82920244-e7fc-2630-16f5-757bb1ce59c9.png)

--------------------------------------------------------------------------------------------------

[Lightning Web コンポーネントへのスタイルとデータの追加](https://mindful-badger-3sib3d-dev-ed.lightning.force.com/lightning/n/Bike_selector)

このチェレンジは説明通りにつくれば、問題なく完了できます。
しかし、VS Codeでデプロイしたプレイグランドと、検証しているプレイグランドを一致させておく必要がありますね。

私の場合とは原因が違うみたい。

+ [I received the error message below upon deploy source to org](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G2RUgSAN)
Node.js: ssh 接続

Node.js で ssh 接続をする方法です。

ライブラリーのインストール

```bash
sudo npm install ssh2 -g
```

```js:ssh_exec.js
#! /usr/bin/node
//
//	ssh_exec.js
//
//					Jan/20/2022
// ---------------------------------------------------------------
const { readFileSync } = require('fs')

const { Client } = require('ssh2')
const dotenv = require('dotenv')

dotenv.config()
host = process.env.HOST
user = process.env.USER
command = process.env.COMMAND
key_private = process.env.KEY_PRIVATE

const conn = new Client()
conn.on('ready', () => {
console.log('Client :: ready')
conn.exec(command, (err, stream) => {
	if (err) throw err
	stream.on('close', (code, signal) => {
		console.log('Stream :: close :: code: ' + code + ', signal: ' + signal)
		conn.end()
	}).on('data', (data) => {
		console.log('STDOUT: ' + data)
	}).stderr.on('data', (data) => {
		console.log('STDERR: ' + data)
	})
})
}).connect({
	host: host,
	port: 22,
	username: user,
	privateKey: readFileSync(key_private)
})
// ---------------------------------------------------------------
```

```text:.env
HOST = "example.com"
USER = "scott"
COMMAND = "cd /home/scott/tmp/jan20 ; ls -l"
KEY_PRIVATE = "/home/scott/.ssh/key_private"
```

実行スクリプト

```bash
export NODE_PATH=/usr/lib/node_modules
./ssh_exec.js
```
DrawProceduralNow: SetPass(0)の位置をミスると，変数がセットされない問題



**`SetPass(0)` の位置をDrawProceduralNowの直前にしないと** particlesBufferのバッファーが空になったりすることがあるらしい．Spoutに切り替えり，戻したときに最初の切り替え時はBufferやSetFloatで設定した値などが空になっていたが，下のようにSetPass(0)を正しい位置に変更すると，ただしく値が渡されるようになる．


```
this.particlesMaterial.SetBuffer(ShaderIDs.ParticlesBuffer, this.particlesBuffer);
this.particlesMaterial.SetPass(0); //描画開始位置らしい？
Graphics.DrawProceduralNow(MeshTopology.Points, this.particlesBuffer.count); 
```
VSCodeで Import "***" could not be resolved Pylance(reportMissingImports) が出るときの対処法

いろんな環境で同じエラーを吐いていたので、備忘録として残す。[How to solve Pylance 'missing imports' in vscode](https://dev.to/climentea/how-to-solve-pylance-missing-imports-in-vscode-359b) を参考にした。

私の場合、venv で sandbox という仮想環境を作成し、そこにインストールした airflow をインポートする際に標題のエラーが発生していた。インストール先にパスが通っていないことが問題らしいので、追加してやればよい。

まず該当するライブラリの場所を確認する。

```bash
$ find -name "airflow"
./sandbox/lib/python3.8/site-packages/airflow
...
```

パスの場所がわかったら、`.vscode/settings.json` に以下のように追記する。上記では相対パスで表記されているが、`.vscode/settings.json` では絶対パスで記述するのがよさそう。

```.vscode/settings.json
{
    (その他設定),
    "python.analysis.extraPaths" : [
        "/home/sandbox/lib/python3.8/site-packages/"
    ],
}
```

最後に、VSCode を再起動すればエラーが発生しなくなる。
Rust製の便利なコマンドラインツール

fd(findの代替ツール)
https://github.com/sharkdp/fd

ripgrep(grepの代替ツール)
https://github.com/BurntSushi/ripgrep

ripgrep-all(PDF, E-Books, Office documents, zip, tar.gzも検索対象)
https://github.com/phiresky/ripgrep-all

sd(sedの代替ツール)
https://github.com/chmln/sd

exa(lsの代替ツール)
https://github.com/ogham/exa

zoxide(cdの代替ツール)
https://github.com/ajeetdsouza/zoxide

bat(catの代替ツール)
https://github.com/sharkdp/bat

delta(diffの代替ツール)
https://github.com/dandavison/delta

starship(プロンプト設定ツール)
https://github.com/starship/starship

gitui(gitのTUIツール)
https://github.com/extrawurst/gitui
neosでlogix その51

# 概要

niosでlogixやってみる。
練習問題、やってみる。

# 練習問題

跳ねる箱をつくれ。

# 手順

- devtooltipを装着。
- 新規->3d->box
- インスペクターを開く
- Transform->Interaction->Touch Buttonを追加
- logixtooltipを装着。
- そのインターフェースを取り出す
- devtooltipを装着。
- Physics>CharacterControllerを追加
- logixtooltipを装着。
- そのインターフェースを取り出す
- ノードブラウザを表示
- Interaction->Button Eventsをスポーン
- Users>local userをスポーン
- Actions>Write Refをスポーン
- Physics>Set Character Velocityをスポーン
- つなぐ


# 成果物

```
neosrec:///U-ohisama/R-0ee1ec21-db19-425b-ba63-9a699caff48e
```


以上。
備忘 vueのテンプレート内のタグに直接スタイルあてる方法

こう書く

```vue
<template>
  <div>
    <a
      v-if="isMediaSupported"
      :class="{file_video: !isStartedPlay}"
      class="container"
      :style="{
         borderBottom: 'solid'
      }"
    />
  </div>
</template>
```
CMakeチュートリアル１【Hello, world】

前回は[CMake【インストール編】](https://qiita.com/openfields/items/78ee99ce6e7100b7b3d6)でした
今回は実際にCMakeを書いていきます
まずは、皆さん大好きHello, worldです

ソースコードは[github](https://github.com/0xopenfields/cmake_tutorials.git)からダウンロード/cloneしてください

# チュートリアル１
CMakeには、CMake-GUIというGUIでプロジェクトを出力する方法もありますが、敢えてコマンドベースで解説していきます

## CMakeLists.txtの書き方

CMakeコマンドでプロジェクトを出力するにはCMakeLists.txtを書きます  
CMakeコマンドがルートディレクトリのCMakeLists.txtを解釈してプロジェクトを作成します  

```cmake:tutorial_1/CMakeLists.txt
# CMakeの最低要求バージョンの定義
cmake_minimum_required(VERSION 3.13)
# プロジェクト名の定義
project(cmake_tutorial_1)
# プロジェクトにtutorial_1.ccを追加
add_executable(cmake_tutorial_1 tutorial_1.cc)
```

1. `cmake_minimum_required(VERSION 3.13)` でCMakeの最低要求バージョンを指定します(満たさない場合はエラーが出ます)   
2. `project(cmake_tutorial_1)`でプロジェクト名を定義します  
3. `add_executable(cmake_tutorial_1 tutorial_1.cc)`でcmake_tutorial1プロジェクトにtutorial_1.ccを追加します(tutorial_1.ccはただのhello, world)   

## ビルド

```
cd cmake_tutorials
cmake -S tutorial_1 -B build/tutorial_1
cmake --build build
```

1. `cmake -S tutorial_1 -B build/tutorial_1`  
    `-S tutorial_1`でソースコード(CMakeLists.txtのルート)を指定  
    `-B build/tutorial_1`で中間・出力ディレクトリを指定、build/tutorial_1フォルダが作成されます

2. `cmake --build build/tutorial_1`  
    `--build`はビルドコマンド  
    `--build build/tutorial_1`でbuild/tutorial_1フォルダをビルドする  

※CMake 3.12以前は以下のようにビルドしてました  

```
cd cmake_tutorials
mkdir build/tutorial_1
cd build/tutorial_1
cmake ../../tutorial_1
make
```

## 実行
ビルドが成功するとbuildフォルダに中間ファイルや実行ファイルが出力されます  
出力先などはCMakeLists.txtで変更は可能ですが、その方法はまた別途  
今回はビルドオプションを指定していないのでDebugモードでビルドされているため、Winとその他で若干出力ディレクトリが異なる  
- Windows

```
build\tutorial_1\Debug\cmake_tutorial_1.exe
```

- Mac/Linux

```
build/tutorial_1/cmake_tutorial_1
```

---
以上、今回は実際にCMakeLists.txtの書き方とビルドの仕方でした
[次回](https://qiita.com/openfields/items/5a7b24b0ac7416887a48)はinclude, 複数ファイルについてです
VSCode Beautifyがnull合体演算子とオプショナルチェーンを殺しに来るとき

元々Prettierを使ってましたが、HTMLの謎の改行に嫌気が差し、設定でも上書きできなかったのでBeautifyに乗り換えました。
ただ、Beautify は長らくアップデートが止まっており、JSのアップデートに追いついていません。
特に、VSCode上からインストールしただけだとオプショナルチェーンとnull合体演算子に含まれる `?` の両側に勝手にスペースを開けられます。

```js
// before
a ?? b;
array[0]?.func();

// after（構文エラーになる）
a ? ? b;
array[0] ? .func();
```


流石におかしいだろうと思い、issueを見に行ったら有りました。
[Breaks optional chaining (?.) and Nullish coalescing operator (??) · Issue #401 · HookyQR/VSCodeBeautify](https://github.com/HookyQR/VSCodeBeautify/issues/401)
[Update to actual js-beautify version? · Issue #346 · HookyQR/VSCodeBeautify](https://github.com/HookyQR/VSCodeBeautify/issues/346)

どうやら、Beautifyに使われている `js-beautify`自体のバージョンを自分の手で上げる必要があるとのこと。
調べて出てきた下記コマンドを実行

```bash
# beautify の拡張機能本体のディレクトリへ移動
$ cd ~/.vscode/extensions/hookyqr.beautify-1.5.0

# パッケージアップデートする
$ npm update

# アップデートされたか確認する（ 1.11.0 以上ならOK）
$ npm list | js-beautify
├── js-beautify@1.14.0
```

アップデート完了後にVSCodeを再起動（リロード）するときちんと動くようになってます。

パッケージアップデートが済んだことで大きな不満は無くなりましたが、メンテナンスが止まっていると問題も出てきやすいですね…
Prettierは今もアクティブにアップデートされ続けているので、きちんとissue出して将来的にはまた戻る方針の方が良さそうです。
laravel GD php画像ライブラリを有効化

# laravel GD phpライブラリの有効化
laravelで画像アップロード機能を構築する際に、GD（画像を生成するためのPHPライブラリ）を有効化する方法をメモしておく。

## 環境の整理
- Windows10
- laravel 8
- php は2つインストールされている状態。

　1つ目：C:\php（PHP Version 7.3.33）
　2つ目：C:\MAMP\conf\php7.4.1

## 方法
1. phpinfoで、以下を確認。
Configuration File (php.ini) Path ： no value
Loaded Configuration File： C:\php\php.ini
![2022-01-16_04-13-26-1325fd507cbb2de563ef50ccd4fb0258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/60561d91-1690-8a9a-e570-1b486903df88.png)

2. C:\php\php.iniを extension=gd2 を編集する。（　';'を削除。　）
変更前
![スクリーンショット 2022-01-20 134538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/ed9f1e6e-3c13-f6b2-4971-ee6ace49be0a.png)
変更後
![スクリーンショット 2022-01-20 134514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/ab5b25ce-5ad9-b53d-e7dc-e8516075bbfb.png)

3. すぐ反映されなかったため、以下を実施する。
  - PC 再起動。
  - laravel : php artisan serve を再度実行

4. phpinfoで、gdが表示されていることを確認する。
![スクリーンショット 2022-01-20 134141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/abc1513e-d44a-4b55-e243-1bae68de157d.png)


＊phpが2つインストールされていたため、とても混乱だったが、これで画像アップロード機能はスムーズにいけた。


OK
CMake【インストール編】

# CMakeについて
C/C++には古くよりgcc/g++コマンドやmakefile, autoconfなどのビルド方法があります
これらはLinuxがベースになっていてWindows/Macでは使えなかったり、それぞれのプラットフォームに依存があったりします
また、ビルドする際にルートディレクトリにファイルが出力され、gitの差分が多く出たりもします

CMakeはこれらの問題を(書き方次第ではあるが)解決してくれるツールです

# CMakeのインストール
CMakeはWin/Mac/Linux向けのツールです
最新版のインストール方法について説明します（執筆時点の最新3.22.1）
また、2021年辺りよりarm64向けのインストーラも配布されるようになりました
## Windows
32bit版Windows：[Windows i386 Installer]の~.msiをダウンロードして実行
64bit版Windows：[Windows x64 Installer]の~.msiをダウンロードして実行
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/586e56c9-f088-51f5-45c9-67563cbbebc7.png)

## Mac
macOS 10.13以降：[macOS 10.13 or later]の~.dmgをダウンロードして実行
それ以前　　　　：[macOS 10.10 or later]の~.dmgをダウンロードして実行
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630559/bd44cad1-0118-7952-09f8-7111cfa79073.png)

## Homebrew

```
brew install cmake
```

## Ubuntu-x86_64
Intel CPU向けのインストール方法

既に`apt install cmake`されている場合は以下を実行してください

```
sudo apt purge cmake
sudo rm -r /usr/share/cmake
sudo rm -r /usr/share/cmake-3.xx // xxはインストールされているバージョン番号
```

```
cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.sh
./cmake-3.22.1-linux-x86_64.sh
sudo mv cmake-3.22.1-linux-x86_64 /opt
sudo ln -s /opt/cmake-3.22.1-linux-x86_64/bin/* /usr/bin
rm cmake-3.22.1-linux-x86_64.sh
```
## Ubuntu-aarch64
JetsonなどARM64向けのインストール方法

既に`apt install cmake`されている場合は以下を実行してください

```
sudo apt purge cmake
sudo rm -r /usr/share/cmake
sudo rm -r /usr/share/cmake-3.xx // xxはインストールされているバージョン番号
```

```
cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-aarch64.sh
./cmake-3.22.1-linux-aarch64.sh
sudo mv cmake-3.22.1-linux-aarch64 /opt
sudo ln -s /opt/cmake-3.22.1-linux-aarch64/bin/* /usr/bin
rm cmake-3.22.1-linux-aarch64.sh
```
## ソースコードビルド
Raspberry PiなどARM32だとこのインストール方法になります
※スゴイ時間かかります

```
cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1.tar.gz
tar xvf cmake-3.22.1.tar.gz
cd cmake-3.22.1
./bootstrap && make && sudo make install
```

---
以上、各OS向けのインストール方法でした
[次回](https://qiita.com/openfields/items/0ea6e19304a427e6c616)は実際にCMakeを書いていきます
AWSユーザがGCPを調べてみた

## はじめに

AWSでいくつかシステムを構築している私が初めてGoogle Cloud Platform（GCP）を調査した時のメモです。

## 目次

1. AWSとGCPとの違い
2. 参考になりそうなページを見つけた


### 1. AWSとGCPとの違い

Googleが比較表を作っていたのでこちらを参考にする。

https://cloud.google.com/free/docs/aws-azure-gcp-service-comparison?hl=ja

使いそうなものを一部引用記載する。
同じような機能でも複数あったりする？

|機能名：AWS|機能名：GCP|備考|
|:--|:--|:--:|
| Amazon VPC | Cloud Router ||
|Amazon Elastic Compute Cloud（EC2）P3 | Cloud GPU||
|Amazon Elastic Compute Cloud（EC2） | Compute Engine||
|AWS 自動スケーリング|Compute Engine オートスケーラー||
|Amazon EC2 インスタンス接続|OS ログイン||
|Amazon Elastic Block Store（EBS）|永続ディスク||
|AWS Lambda|Cloud Functions||
|AWS Simple Storage Service（S3）|Cloud Storage for Firebase|サーバーレス|
|Amazon Cognito|Firebase Auth|サーバーレス|
|AWS Simple Storage Service（S3）|Firebase Hosting|サーバーレス|
|AWS DynamoDB + AppSync|Firebase Realtime Database||
|AWS Simple Storage Service（S3）|Cloud Storage||
|Amazon Identity and Access Management(IAM)|Identity and Access Management||
|Amazon DynamoDB|データストア||
|Amazon Aurora(MySQL)|Cloud Spanner||
|Amazon Athena、Amazon Redshift|BigQuery||
|Amazon Route53(DNS)|Cloud DNS,Cloud Domains||
|AWS Elastic 負荷分散(ALB)|Cloud Load Balancing||
|Amazon VPC フローログ|VPC フローログ||
|Amazon VPC NAT インスタンス|Cloud NAT||
|Amazon Virtual Private Cloud（VPC）|Virtual Private Cloud||
|Amazon API Gateway|Apigee API 管理||

### 2.参考になりそうなページを見つけた

AWSはいっぱいあるのですがGCPは比較的マイナーなのでしょうか

【GCP入門編・第1回】エンジニア必読！今さら聞けない、Google Cloud Platform (GCP) とは？
https://www.topgate.co.jp/gcp01-what-is-google-cloud-platform

一番単純なEC2相当のGoogle Compute Engine起動

【GCP入門編・第3回】難しくない！ Google Compute Engine (GCE) でのインスタンス起動方法！
https://www.topgate.co.jp/gcp03-google-compute-engine-launch-instance
neosでlogix その50

# 概要

neosでlogixやってみる。
Apply Character Impulseノード、
Apply Character Forceノード、
Set Character Velocityノード、使ってみた。
local userでないと、だめなようだ。

# 写真

![2022-01-19 23.10.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ac008cbf-e162-52b9-c919-f25de7acb089.jpeg)


# Apply Character Impulse

```
Inputs
 	Impulse	Apply
 	Float3	Impulse
 	CharacterController	Character
 	Bool	IgnoreMass
Outputs
 	Impulse	OnDone
```


# Apply Character Force

```
Inputs
 	Impulse	Apply
 	Float3	Force
 	CharacterController	Character
 	Bool	IgnoreMass
Outputs
 	Impulse	OnDone
```

# Set Character Velocity

```
Inputs
 	Impulse	Apply
 	Float3	Velocity
 	CharacterController	Character
Outputs
 	Impulse	OnDone
```

# 手順

- devtooltipを装着。
- 新規->3d->box
- インスペクターを開き、コンポーネントを追加
- Physics>CharacterController
- logixtooltipを装着。
- インターフェースを取り出す。
- ノードブラウザを表示。
- Actions>Write Refをスポーン。
- Users>Local Userをスポーン。
- Physics>Apply Character Forceをスポーン。
- Physics>Apply Character Impulseをスポーン。
- Physics>Set Character Velocityをスポーン。
- つなぐ


以上。