OmniAICreator/Qiita-1.07M huggingface dataset:
maya arnold missing either uvlist or uvidxs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/df0dccb6-269e-3976-d4ba-148ff120fe93.png)

```
for uv in [x for x in ls('userShape.map[*]', fl = 1) if len([y for y in getAttr(x) if y > 100 or y < 100]) > 0]: setAttr(uv, (0, 0))
```
【Javascrip】リテラルとは

---
### 自分用学習メモ

---
#### リテラルとは

リテラルとは、プリミティブ型や一部のオブジェクト型に格納できる値の事

```
const str = 'hello'; //文字列リテラル

const x = 123; //数値リテラル 
```

---
#### プリミティブ型とは

プリミティブ型とは、リテラル値（変数の値）が規定値以外のものに変更できないデータ型の事。

数値、文字列、論理値、長整数、null、undefined、シンボルがある。

---

#### 整数リテラルを表示する

```
// 0bから始まる2進数リテラル

console.log(0b0110); // => 6

// 0xから始まる16進数リテラル

console.log(0xF); => 15
```
---
#### 浮動小数点リテラル

```
.123; // => 0.123

2e8; // => 200000000
```
---
#### テンプレートリテラル

テンプレートリテラルは、バッククォート(`)で囲んだ範囲を文字列として扱える。

```
let x = 123;
console.log(`次の値は${x}です。`);

//次の値は123です。
```
---
#### UndefinedはGlobal変数（関数内で定義できるが非推奨）

```
function fn(){
    const undefined = "test";
    console.log(undefined);
}
fn();
// test
```
---
#### オブジェクトリテラル

```
const obj = {
  'tomato':300,
  'apple' :200
}
//console.log(obj);
console.log(obj.tomato);    //ドット記法
console.log(obj['apple']);   //ブラケット記法
```

オブジェクトリテラルでは数値から始まる識別子は利用できない（ドット記法）
```
const obj = {
  '123':300
}
console.log(obj.123);
// SyntaxError
```

---
#### 配列リテラル

```
const array      = [1,2,3];
console.log(array[0]);
// 1
```

---

※ JavaScriptにおける数値の型は、「IEEE754倍精度浮動小数点数（64ビット）」と1種類のみなため
JSにおける数値は少数で表現される。

[IEEE754倍精度浮動小数点数](https://ja.wikipedia.org/wiki/IEEE_754)
[参考サイト](https://jsprimer.net/basic/data-type/)
picoCTF Writeup picoGym Practice Challenges Scavenger Hunt (注意<spoiler>)

# Scavenger Hunt

Description
There is some interesting information hidden around this site http://mercury.picoctf.net:44070/. Can you find it?

http://mercury.picoctf.net:44070/


```:index
<!-- Here's the first part of the flag: picoCTF{t -->
```
```:css
/* CSS makes the page look nice, and yes, it also has part of the flag. Here's part 2: h4ts_4_l0 */
```
http://mercury.picoctf.net:44070/robots.txt
```:html
User-agent: *
Disallow: /index.html
# Part 3: t_0f_pl4c
# I think this is an apache server... can you Access the next flag?
```

http://mercury.picoctf.net:44070/.htaccess
```:html
# Part 4: 3s_2_lO0k
# I love making websites on my Mac, I can Store a lot of information there.
```

http://mercury.picoctf.net:44070/.DS_Store
```:html
Congrats! You completed the scavenger hunt. Part 5: _7a46d25d}
```

picoCTF{th4ts_4_l0t_0f_pl4c3s_2_lO0k_7a46d25d}
obnizでクラウド実行してみる

:::note warn
ここでは業務や運用で使ったこともなくobniz1台、ゲートウェイ1台しか持っていない僕がまとめてるものになります。
:::

# obnizでアプリを動かす
動かす方法としては
1. ブラウザ上で動かす
1. NodeJSなどサーバ上で動かす
1. アプリをインストールしてクラウド実行する
などがあります。

今回は3番目について書きます。

# クラウド実行
これはイメージとしてクラウド上にブラウザがあって、それを設定したトリガーで開いてくれるイメージで、Lambdaのようなサーバサイドのプログラムを作って…というのではなく、通常の開発と同じでhtmlタグがあるコードそのままを動かすことになります。
なんとなく別で作るのかな？って個人的に思いこんでたんですが、なるほどそういうことか。ということを理解するまで時間がかかりました。

# 利用制限
- 1回の実行は30秒
- 1日150回まで

上記制限を超えると強制終了になるので要注意です。
なお、Obniz.App.done();しないとタイムアウトするので、通常の開発ではちゃんと動いてたのに！という点は気をつけてください。

https://obniz.com/ja/doc/reference/cloud/app/browserapp-cloudexec

# トリガー
- Webhook
- 決められたある時間
- 決められた時間の間隔
- デバイスがオンラインになったら
- デバイスのスイッチが押されたら

があります。
上記の制限から決められた時間の間隔だと約10分の設定が最短になります。

https://obniz.com/ja/doc/reference/cloud/app/browserapp-cloudexec

# 利用用途
- 定期的にセンサーなどの値を読み取ってクラウドにあげておく
  - 室温など環境の変化を定期的に調べる
  - 機器の死活監視として定期的に調べる 
- 電源復旧時に機器の状況を確認する
- スマホやサーバなどからの指示でセンサーの値を確認する
  - 帰宅前に現在の部屋の温度を確認してクーラーなどいれるか判断する

## クラウド実行では適さないもの
- [**✕ 適さない**] 接続するBLE機器からのトリガーでデータを送信する
  - MESHのボタンを押したことを取得する
- [**✕ 適さない**] 接続するBLE機器が不定期でデータを投げるのでそれを即時で取得して送信する
  - 異常があった時に即時にイベントを飛ばす

基本的には接続するBLE端末からPUSHはクラウド実行では適さないということです。
これらは常時電波を受信してチェックする必要になります。ですが、30秒制限がある、決められた時間の間隔だと10分毎にしか起動できないため、ループして常時BLEの監視をしてというアプリが動きません。それと、obnizの特性上、端末だけで処理をしアクションを起こすというのが出来ません。
（パイプラインアプリなど使えばいけるのかもしれませんが問い合わせ前提のため試せてません。）
そのため、こういう用途の場合はNodejsなどで自分でサーバを起動させループさせチェックをさせる、Webhookでなんらかしらアクションを起こして30秒以内にそのアクションが行われるという方法が必要です。ですが、Webhookのアクションベースだと別のシステムで扉があいたらWebhookを投げてなど別のシステムも必要になり大掛かりになる可能性があるのでおすすめはできません。

# ゲートウェイの使い方
個人的にいろいろな動作確認済みBLEデバイスがあり、単体でBLEデータを必要なタイミングでアップしてくれるのかと思いこんで obniz BLE/Wi-Fi Gateway Gen2.0 をMakerFaireTokyo2022 で売っていたので衝動買いしてみました。
ですが、使ってみてクラウド実行が自分で使いたい方法には適さないと気づくまで時間がかかってしまいました。
そのあたり含めて利用用途と制限など事前にまとめておきたく記事にしました。
ただこれによってobnizでいろいろなAPIがあったりということを知りました。もしかしたら僕がやりたかったものはもしかしたら他のobnizの機能の何かでできるかもしれないし、M5Stackなどを利用してobnizOSのプラグイン開発などで対応できるものがあるかもしれないなと思っていますがまだ試せてません。

https://obniz.com/ja/doc/guides/plugin/

イメージしてたよりも全然奥が深いぜ…obniz…
BigQuery DDLサンプル

## 記事の目的
BigQuetyのDDLをよく忘れるのでそのメモ

## DDL
```
[
{"name":"id","type":"INTEGER","description":"id","mode":"NULLABLE"},
{"name":"date","type":"DATE","description":"実施日"
{"name":"status","type":"STRING","description":"ステータス","mode":"NULLABLE"}
]

```

## createTableSQLサンプル

```
"CREATE EXTERNAL TABLE `<<project>>.`<<dataset>>.<<table>>`
(
  id INT64 OPTIONS(description=""id""),
  date DATE OPTIONS(description=""実施日""),
  status STRING OPTIONS(description=""ステータス"")
)
OPTIONS(
  sheet_range=""<<targetSheet>>"",
  skip_leading_rows=1,
  format=""GOOGLE_SHEETS"",
  uris=[""<<spreadsheetURL>>""]
);"

```

## DDL取得クエリー
```
SELECT
  table_name, ddl
  FROM
   `<<project>>.<<dataset>>`.INFORMATION_SCHEMA.TABLES
 WHERE
  table_name = '<<table>>'
;
```
【HTML/CSS】「:hover」で、カーソルを合わせたアイコンを変化させる！

※この記事は、プログラミング学習サイト「Progate」の学習内容に関するものです。

<b>「HTML&CSS 学習レッスン 中級編」</b>の学習中に、
とっても小さなことながら感動したことがあったので、書き残してみます。

◎<b>「トップ部分を作ろう / 6.レイアウトを整えよう」</b>
　・カーソルが乗った状態を<b><font color="red">hover</b>という
　・CSSにて、クラスやタブのセレクタに疑似クラス<b><font color="#ffaa00">「:hover」</b>を書き加えたものを
　　用意すると、<b><font color="red">カーソルを乗せたときだけ{ } 内に設定した内容が適用され、見た
　　目が変化する</b>

【記入例】
```:HTML:
<div class="btn">新規登録はこちら</div>
```
```:カーソルを乗せていないとき用のCSS:
.btn {
 width: 180px;
 padding: 8px 24px;
 text-align: center;
 color: white;
 background-color: #000077;
 opacity: 0.8;
}
```
↑カーソルを乗せていないとき、
・枠の幅は<b>180px</b>で、空白は<b>上下8pxずつ、左右24pxずつ</b>
・文字の位置は<b>中央寄せ</b>、文字色は<b>白</b>、文字の不透明度は<b>0.8</b>（若干透過された白）
・背景は<font color="blue"><b>青</b></font>

```:カーソルを乗せたとき用のCSS:
.btn:hover {
 background-color: skyblue;
 opacity: 1;
}
```
↑カーソルを乗せたとき、
・文字の不透明度を<b>1</b>（透過されていない白）に変化
・背景を<b><font color="skyblue">水色</font></b>に変化

【見た目の変化】
![using-hover_before-after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174940/7419236b-0046-2215-81b8-73fd88981d92.png)

学生時代、ホームページ作成のためHTMLを少しかじっていたのですが･･･
ただのHTMLではできることに限界があって、何度もモヤモヤしたものです。
いやぁ、CSSってすごい！可能性が無限大！ですね♪✨

P.S.
コーディングよりも記事を書く時間の方が圧倒的に長くなるの何とかしたい ||| orz |||
【Excel】厄介なGETPIVOTDATA関数の自動挿入をオフにする方法

# これは何

Excelで数式入力する際、ピボットテーブルのセルを参照すると
`GETPIVOTDATA関数` が自動挿入されて、
「うわあぁぁぁぁぁあぁぁぁあぁぁぁぁ」ってなることありますよね。

それを阻止すべく、自動挿入の設定をオフにする方法を備忘録として残します。


※↓このように絶対参照になってしまう
![スクリーンショット 2022-11-30 13.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/c43db17e-d976-795a-d6e8-d409ec865f09.png)

# どんな人に向けた記事か

- ExcelのGETPIVOTDATA関数に辟易している方
- Excelでピボットテーブルを参照して数式をよく組む方
- Excelをお勉強中の方

# GETPIVOTDATA関数の自動挿入をオフにする方法

## Macの場合
1. 上部のメニューバーから `ピボットテーブル分析` をクリック
※メニューバーに表示されない場合はピボットテーブルを一度クリックすると表示されます
![スクリーンショット 2022-11-30 13.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/50a56951-2d9f-46b0-d5bc-c78236fb4756.png)
2. `オプション` を開き、`GetPivotData の生成` 項目のチェックを外す
![スクリーンショット 2022-11-30 13.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/b5528a62-5a7b-1ae6-e868-3b61bc53591b.png)
3. 完了！
![スクリーンショット 2022-11-30 13.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/519a9c4e-4301-acbb-8dc6-563c9644fb14.png)
数式をコピペしても、ちゃんと相対参照になっていることが確認できます。
![スクリーンショット 2022-11-30 13.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/78cd57f1-784f-c0f3-0133-96e154772d18.png)


## Windowsの場合

1. `ファイル` から `Excelオプション` をクリックする
1. `数式` タブを開き、`ピボットテーブル参照にGetPivotData関数を使用する` 項目のチェックを外す
1. 完了！


Windowsでの設定方法は下記の記事に設定方法がまとまっていました :pray_tone1:

https://excel-master.net/data-analysis/pivot-table-getpivotdata-off/


# おわりに

ちょっとした確認で数式をよく使う人は、デフォルト設定を相対参照にしておいた方が楽だと思います！
ビルスケールで AR 表現をする VPS 選定 2

[MoAR](https://whatever.co/moar/) を実現するのに必要な VPS (Visual Positioning System) を選定する話、その2。  
その1はこちら。

https://qiita.com/Saqoosha/private/b9fef6517831ac136a26

# ARCore / Geospatial API

https://developers.googleblog.com/2022/05/Make-the-world-your-canvas-ARCore-Geospatial-API.html

Immersal 調査後、数ヶ月中断しているあいだに Google から [Geospatial API](https://developers.google.com/ar/develop/geospatial) なる VPS が発表され、もしやこれは Immersal より楽ちんなのでは？と思って検証を開始。

<br/>

<iframe width="100%" height="500" src="https://www.youtube.com/embed/g-yoPthv-wo" title="Geospatial API + PLATEAU model" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Geospatial API で AR オブジェクトを配置するには緯度経度を指定する必要があるので、[PLATEAU](https://www.mlit.go.jp/plateau/) から WHEREVER ビルのモデルと緯度経度をひっぱってきて配置。API から取得できる精度は 30〜50cm 程度と出ているけど見た感じではそれ以上にピッタリしている印象。

<br/>

<iframe width="100%" height="500" src="https://www.youtube.com/embed/lFDgZUiOn8U" title="Geospatial API + custom model" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

自分で図面からモデリングしたビルモデルを配置すると PLATEAU でやったときよりはズレが目立ったけど位置を微調整すれば問題なさそうだった。Immersal みたく自分で特徴点データつくらなくてよくて精度もよいってことでこの時点で Immersal から Geospatial API に乗り換え。

#### アプリインストール後の初回起動時だけ精度が悪くなる問題

Geospatial API は [`GARGeospatialTransform`](https://developers.google.com/ar/reference/ios/interface_g_a_r_geospatial_transform) の `horizontalAccuracy`, `verticalAccuracy` プロパティでトラッキング中の精度を取得できるようになってるのだけど、初回起動時はなぜかこの値が 1.0m 以下になることがほとんどない。

2回目以降の起動時には全く同じ場所で 0.2m 程度の精度が出ていることが確認できて実際の見た目ズレもそのぐらいになっている。実際の見た目は初回起動時も2回目以降と同じでそこまでズレてなくて単純にこのプロパティの値がおかしいっぽい。

これがどういう問題につながるかというと、ある一定精度 (0.5m) までトラッキング精度があがってからコンテンツを起動しようとしても初回だけ絶対に起動しないっていうことになる。対処法はコンテンツ起動の精度を 1.5m とかまで下げてしまうこと。これすると初回はいいけど2回目以降は逆に精度が悪い状態でスタートすることになるんだけど、今回のアプリの特性上2回目ってのはあまりないのでまあいっかと精度下げる方向で対処。

# Lightship VPS

https://lightship.dev/products/vps

Geospatial API をいろいろ調査しているあいだに今度は Niantic の Lightship に VPS が搭載されるってことで調査してみたけど、VPS と言っても数メートル程度の範囲をトラッキングするのが主な使い方っぽくて今回のようなビルスケールに適用できるものではなかったのでスルー。

# ARKit / Location Anchors

https://www.moguravr.com/arkit-6/

Lightship VPS をいろいろ調査してるあいだに今度は WWDC で ARKit 6 が発表されてこれまでアメリカ国内でしか使えなかった [Location Anchors](https://developer.apple.com/documentation/arkit/content_anchors/tracking_geographic_locations_in_ar) が東京でも使えるようになったということでそちらも調査…

<br/>

<iframe width="100%" height="500" src="https://www.youtube.com/embed/4UksJuT2J5A" title="Location Anchors" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Geospatial API と比べてもそんなに精度の違いはないように見えたけど見る位置によっては若干 Geospatial API のがよさそうな感じだったので Geospatial API のまま進めることにした。

# 結論

| VPS | 総評 |
|:-|:-|
|Immersal|精度は悪くないがセットアップがめんどくさい|
|Geospatial API|使えるエリア内だし精度よい|
|Lightship VPS|トラッキングできる範囲が狭すぎるし使い方がよくわからん|
|Location Anchors|使えるエリア内だし精度よい|

ということで、Location Anchors より Geospatial API のが動かした感じ精度がよさそうってことで Geospatial API で開発することに決定〜（したけどその後いろいろあった話はまたこんど…

## おまけ

VPS をいろいろ調べたのでいいとこ悪いとこを並べた記事を書いた。

https://qiita.com/Saqoosha/items/42e8f3ec648a0c9f03be
Ubuntu 22.04 - 最新のNginxをインストール

## 前提
Ubuntu に Nginx をインストールしたら、バージョンが 1.18.0 だった。
これは 2020 年にリリースされたバージョンで古いので、最新にしたい。

Ubuntu には、OS 標準のソフトウェアというものがあるらしく、Ubuntu 22.04 の OS 標準な Nginx を確認すると、1.18.0-6ubuntu14.3 と表示される。

また、類似記事で`apt-key`を使っていることが多かったんだけど、これを使うと`$ sudo apt update`したときに一生エラーが出ることになるので、`apt-key`を使わない方法でやってみる。

参考）
http://nginx.org/en/linux_packages.html
## 環境
Ubuntu 22.04 LTS
Nginx 1.18.0 → 1.22.1
## 設定
### 署名鍵のインポート
参考 URL に沿って設定していく。
```
$ sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
```
```
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg
```
確認
```
$ gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>
```
```
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
```
### Nginx のレポジトリ追加
Ubuntu のリリース名の確認する。`jammy`とわかる。
```
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"
```
リポジトリ情報はこうなる。
```
deb https://nginx.org/packages/ubuntu/ jammy nginx  
deb-src https://nginx.org/packages/ubuntu/ jammy nginx
```
これ↑を`/etc/apt/sources.list.d/`の中に`nginx.list`を作成して書く。
`nano`でも`vim`でも何でもよいが、`vim`使い慣れてるので、私は`vim`使います。
```
$ sudo vi /etc/apt/sources.list.d/nginx.list
```
一応、確認しておこう。
```
$ cat /etc/apt/sources.list.d/nginx.list 
deb https://nginx.org/packages/ubuntu/ jammy nginx  
deb-src https://nginx.org/packages/ubuntu/ jammy nginx
```
### インストール
さ、ドン！
```
$ sudo apt update
$ sudo apt install nginx 
```
そして、もう一度 Nginx のパッケージを確認する。
```
$ nginx -v
nginx version: nginx/1.22.1
```
おぉぉおおおお！1.22.1 に変わっています。
あと少し。ステータスが`inactive (dead)`になっているので…
```
$ sudo systemctl status nginx
○ nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Wed 2022-11-30 13:55:04 JST; 1min 2s ago
```
Nginx を起動する。
```
$ sudo systemctl start nginx
```
`active (running)`になっていればOK。
```
$ sudo systemctl status nginx
● nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-11-30 13:57:18 JST; 12s ago
```
twigからjsに変数を渡す方法

twigのテンプレートに変数をセットし、それをJavaScriptで取得する

```
{% set hoge = "ほげ" %} //変数hogeに、ほげをセット

<script>

const foo = '{{ hoge }}'; //変数fooに、hogeを代入
alert(foo);

</script>
```
DANSO


![DANSO_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961940/ce904228-4464-e5d4-fce4-4edd43a1cc0e.png)


## DANSOとは

観念から技術までを実践として捉え、学 (Academic) と術 (Art) にまつわるon-goingな世界の一断面を共有し、様々な「層」をあらわにする建築情報学会企画の新媒体です。

キックオフをかねて、Qiitaのアドベントカレンダーにて記事を募る運びとなりました。建築情報学会周りの実践を共有いただき、多様で生々しい一面を垣間見る事で、活発な研究、制作、また協働のきっかけになればと期待しております。

一記事から、複数記事まで、分量は問いませんが、学会員（学生会員含む）の方の記事を公開させていただいております。
後日、建築情報学会のサイトにてアーカイブを公開予定です


### DANSO記事の内容
- 研究の内容
- 扱っているソフト、言語のノウハウ、失敗談、デバグの軌跡などなど
- 学生時にこんな研究をしていて、卒業後、今こんな活動をしています
- 興味を持っている建築情報学周りのリサーチ
- 先日こんな学会、勉強会、講演会に参加してきました！といった報告

などなど、建築情報学にまつわる実践であればなんでも公開していきます。
多様な方面での断層をお楽しみに！

## 巨人の肩に乗る
DANSOを企画するにあたり、**Klima Magazine** という出版物を参考にしました。websiteは[こちら](https://klima-magazine.com/en)
学術の民主化を掲げ、現代の藝術から学問までを包括的に扱う、フランスの半年刊の雑誌。著者の多くは異なる専門分野に在籍する博士課程の学生が担当しており、新鮮で刺激的なコンテンツを提供しています。Klima Magazineは現代学術の水平断面をあらわにすることで、議論喚起しています。彼らの実践とその共有は、学問的という意味において、いわゆる、巨人の肩に乗ることで成立しているものですが、一方で、彼らの実践が、次世代にとっての巨人となることも、また確かです。

建築情報学会は、その多様性から、分野としての確立が難しいようにも思えますが、翻って、学際的な側面がその特徴ともいえそうです。各個人が現代の実践者としてフラットかオープンに議論を展開していくことで、新しい知見にたどり着くことができるかもしれません。既存の分野に回収されないからこそ、どんなに小さな気づきや発見でも、アーカイブし、共有していくことで、不確定な時代を生き延びていく術となり、できることなら、次世代の乗る巨人の背を伸ばす、そんな貢献ができるならば、それほど嬉しいことはありません。

ちいさく、そしてゆっくりとしたスタートではありますが、DANSOの一歩目をここに記したいと思います。
picoCTF Writeup picoGym Practice Challenges Cookies (注意<spoiler>)

# Cookies

Description
Who doesn't love cookies? Try to figure out the best one. http://mercury.picoctf.net:17781/

http://mercury.picoctf.net:17781/check
のcookieのname値を調べると0となっている。

````.sh:solve.sh
#!/bin/bash
for i in `seq 0 20`;
do
    echo -n $i
    curl --cookie "name=$i" --data "name=snickerdoodle" --silent -L http://mercury.picoctf.net:17781/search | grep "<b>"
done
````

```
$ ./solve.sh 
0            <p style="text-align:center; font-size:30px;"><b>I love snickerdoodle cookies!</b></p>
1            <p style="text-align:center; font-size:30px;"><b>I love chocolate chip cookies!</b></p>
2            <p style="text-align:center; font-size:30px;"><b>I love oatmeal raisin cookies!</b></p>
3            <p style="text-align:center; font-size:30px;"><b>I love gingersnap cookies!</b></p>
4            <p style="text-align:center; font-size:30px;"><b>I love shortbread cookies!</b></p>
5            <p style="text-align:center; font-size:30px;"><b>I love peanut butter cookies!</b></p>
6            <p style="text-align:center; font-size:30px;"><b>I love whoopie pie cookies!</b></p>
7            <p style="text-align:center; font-size:30px;"><b>I love sugar cookies!</b></p>
8            <p style="text-align:center; font-size:30px;"><b>I love molasses cookies!</b></p>
9            <p style="text-align:center; font-size:30px;"><b>I love kiss cookies!</b></p>
10            <p style="text-align:center; font-size:30px;"><b>I love biscotti cookies!</b></p>
11            <p style="text-align:center; font-size:30px;"><b>I love butter cookies!</b></p>
12            <p style="text-align:center; font-size:30px;"><b>I love spritz cookies!</b></p>
13            <p style="text-align:center; font-size:30px;"><b>I love snowball cookies!</b></p>
14            <p style="text-align:center; font-size:30px;"><b>I love drop cookies!</b></p>
15            <p style="text-align:center; font-size:30px;"><b>I love thumbprint cookies!</b></p>
16            <p style="text-align:center; font-size:30px;"><b>I love pinwheel cookies!</b></p>
17            <p style="text-align:center; font-size:30px;"><b>I love wafer cookies!</b></p>
18            <p style="text-align:center; font-size:30px;"><b>Flag</b>: <code>picoCTF{3v3ry1_l0v3s_c00k135_bb3b3535}</code></p>
19            <p style="text-align:center; font-size:30px;"><b>I love macaroon cookies!</b></p>
20            <p style="text-align:center; font-size:30px;"><b>I love fortune cookies!</b></p>
```

picoCTF{3v3ry1_l0v3s_c00k135_bb3b3535}
AWS Shield Standardとは何か

ELBを設定していて「そういえばDDoS攻撃対策ってどうするのだっけ？」となっていろいろ調べた際の覚書です。多分こうですよね、という程度の理解なので間違ってたらまた訂正します。ごめんなさい。

公式資料は以下のとおり。
AWS Shield StandardとAWS Shield Advancedの説明※AWS Shield Standardの説明がフワッと書いてあります。
https://aws.amazon.com/jp/shield/features/
AWS Best Practices for DDoS Resiliency※英語版のみの公開ですが、普通にDeepLでまるっと翻訳できます。
https://d1.awsstatic.com/whitepapers/Security/DDoS_White_Paper.pdf
AWS Best Practices for DDoS ResiliencyのWhite Paper※PDFとだいたい同じ内容のようです。ただしこちらの方が日付が浅いため、細かな部分はこちらで確認した方がよさそうです。
https://docs.aws.amazon.com/ja_jp/whitepapers/latest/aws-best-practices-ddos-resiliency/welcome.html
# AWS Shield Standardはレイヤー3、4に対するDDoS耐性用マネージドサービス
結論から書くと、AWS Shield Standardはレイヤー3（ネットワーク層）とレイヤー4（トランスポート層）のDDoS耐性用のマネージドサービスと理解するのが分かりやすそうです。公式資料の書きっぷりからすると、そう言い切るのは多分ちょっと違うんですけど、大枠でいうなら合っていると思います。

ドキュメントをちょろっと読んだ際の誤ったイメージはこんなでした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884210/1a87b4f8-843d-233f-eb92-bd7c2fe8e462.png" width="500">
ですが、特定のAWSサービスに依存していないので、イメージとしてこちらに近そうです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884210/0a341a2b-a410-5bbf-9dd2-054a62c6806e.png" width="500">
まぁ、Shieldって言ってるんだから最初の絵より下の絵の方がイメージ近いのは当然かもですね。
あと、AWS Shield Standardで防いだ攻撃のログ取りなどは難しそうです。どうも各種マネージドサービスの前にAWS Shield Standardが機能しているようなので、そこをすり抜けた攻撃は各マネージドサービスでログ取り出来そうですが、AWS Shield Standardが防御した攻撃はログ取り出来なさそうです。
# レイヤー7は対象外っぽい
ドキュメントに明記されていないので対象外とみて間違いないでしょう。AWS Shield Advancedを利用すると保護されそうですが、充実したサービスに加えていかんせんお値段がお値段（3000USD／年）なので世に知れたサービスでないと費用対効果を得られそうにないです。

# おわりに
AWS Shield Advancedの資料やDDoS耐性のベストプラクティスの資料はあったんですけど、AWS Shield Standardについてのパリっとした資料を見つけられなかったので、覚書でした。レイヤー3とレイヤー4についてはマネージドサービスの種類に関わらずAWS Shield Standardでナチュラルにある程度ガードされていると考えて大丈夫そうです（でも漏れちゃうこともある）。また特に大規模な基盤を構築する場合はAWS Shield Standardにのみ頼ることなくDDoS耐性を考えた方が良さそうです。
CognitoユーザプールとIAMの両方を使ったAppSyncの認証設定

# 概要
この記事では、CognitoユーザプールとIAMの両方を使ったAppSyncの認証方法を紹介します。

# スキーマ
[アドベントカレンダー](https://qiita.com/advent-calendar/2022/inoue-mn)の1日目から5日目で作成したAppSyncをCognitoユーザプールでの認証に切り替えます。

```graphql
input CreateRadioInput {
	id: ID!
	program_name: String
	cast: [String!]
	weekday: Int
	time: String
	favorite: Boolean
}

# 今回追加する箇所
input DeleteRadioInput {
	id: ID!
}

type Mutation {
	createRadio(input: CreateRadioInput!): Radio
		@aws_cognito_user_pools @aws_iam
	updateRadio(input: UpdateRadioInput!): Radio
		@aws_cognito_user_pools @aws_iam
	deleteRadio(input: DeleteRadioInput!): Radio
		@aws_cognito_user_pools @aws_iam
}

type Query {
	getRadio(id: ID!): Radio
		@aws_cognito_user_pools @aws_iam
	listRadio(filter: TableRadioFilterInput, limit: Int, nextToken: String): RadioConnection
		@aws_cognito_user_pools @aws_iam
}

type Radio @aws_cognito_user_pools @aws_iam {
	id: ID!
	program_name: String
	cast: [String!]
	weekday: Int
	time: String
	favorite: Boolean
}

type RadioConnection @aws_cognito_user_pools @aws_iam {
	items: [Radio]
	nextToken: String
}

input TableBooleanFilterInput {
	ne: Boolean
	eq: Boolean
}

input TableIntFilterInput {
	ne: Int
	eq: Int
	le: Int
	lt: Int
	ge: Int
	gt: Int
	contains: Int
	notContains: Int
	between: [Int]
}

input TableRadioFilterInput {
	day: TableIntFilterInput
	time: TableStringFilterInput
	favorite: TableBooleanFilterInput
}

input TableStringFilterInput {
	ne: String
	eq: String
	le: String
	lt: String
	ge: String
	gt: String
	contains: String
	notContains: String
	between: [String]
	beginsWith: String
}

input UpdateRadioInput {
	id: ID!
	program_name: String
	cast: [String!]
	day: Int
	time: String
	favorite: Boolean
}
```

``Mutation``と``Query``、``type Radio``、``type RadioConnection``に
``@aws_cognito_user_pools``と``@aws_iam``を追加することで、
CognitoかIAMで認証が通ったものを受け付けるようになります。

リゾルバーの変更は不要です。

# おまけ
CognitoとIAMでの認証方法を紹介しましたが、
AppSyncでは、この二つ以外に、
- API キー
- Lambda
- OpenID Connect プロバイダー

の認証方法があります。

詳しくは、[AWS公式サイト](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/security-authz.html) を参照ください。
Certbot 2.0.0でキータイプがECDSAになった

## 参考

> 新しい証明書のデフォルトのキータイプはECDSAになりました secp256r1 ( P-256 )。以前はRSA 2048ビットでした。既存の証明書は影響を受けません。

* https://community.letsencrypt.org/t/certbot-2-0-0-release/188240

> `--key-type`

`ecdsa` : 2.0.0からデフォルト
`rsa` : 2.0.0より前はデフォルト

* https://hyper-text.org/archives/2021/11/lets_encrypt_ecdsa.shtml

## IEではECDSAはエラーになる

![エラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c73611ab-d256-91ec-211e-9474eba7b596.png)
Leetcode 1207. Unique Number of Occurrences

# 1207. Unique Number of Occurrences

https://leetcode.com/problems/unique-number-of-occurrences/

## 難易度
### EASY

## アプローチ
### HashMap, HashSet

```java
class Solution {
    public boolean uniqueOccurrences(int[] arr) {
        
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        HashSet<Integer> set = new HashSet<>();
        for(int i : arr){
            hashMap.put(i, hashMap.getOrDefault(i,0) + 1);
        }

        for (Map.Entry<Integer,Integer> a: hashMap.entrySet()) {
            if(set.contains(a.getValue())){
                return false;
            }
            set.add(a.getValue());
        }
        
        return true;
    }
}
```
Linode の StackScripts のデバッグ方法

## はじめに
StackScripts は Linode で初回構成（プロビジョニング）時に実行できるスクリプトです。
とても便利な機能ですが、標準では StackScripts の記述を間違えたときの原因が追えません。
今回は StackScripts の実行ログを取得し、原因解析の時間を短縮する方法をご紹介します。

StackScripts の解説はこちら。

https://qiita.com/isss802/items/d6e59063d3473659983d


## StackScripts のデバッグ方法
ベーシックな方法ですが、StackScripts で実行されたログをそのままファイルに書き出します。

こちらのように StackScripts に一文加えるだけです。

```BASH
exec 1> >(tee -a "/var/log/linode_stackscripts.log") 2>&1
```

以下はサンプルの StackScripts です。
仮想マシン作成時にユーザを追加し、SSH の設定を変更する処理などを記載しています。

```bash
#!/bin/bash
#<UDF name="username" label="SSH Username" default="">
#<UDF name="password" label="SSH Password" default="">
#<UDF name="publickey" label="SSH Public Key" default="">
#<UDF name="disable_root" label="Disable root login for SSH" oneOf="Yes,No" default="Yes">
source <ssinclude StackScriptID=1>

# enable logging
exec 1> >(tee -a "/var/log/linode_stackscripts.log") 2>&1

if [ "$USERNAME" ] && [ "PASSWORD" ]; then
    user_add_sudo "$USERNAME" "$PASSWORD"
    
    if use_add_pubkey "$USERNAME" "$PUBLICKEY" && [ "$DISABLE_ROOT" == "Yes" ]; then
        ssh_disable_root
    fi
fi
```


こちらの StackScripts を実行すると、`/var/log/linode_stackscripts.log` にログが書き出されます。

```BASH
$ cat /var/log/linode_stackscripts.log
Adding user `user1' ...
Adding new group `user1' (1000) ...
Adding new user `user1' (1000) with group `user1' ...
Creating home directory `/home/user1' ...
Copying files from `/etc/skel' ...
/root/StackScript: line 14: use_add_pubkey: command not found
```

こちらを見てみると、`/root/StackScript: line 14: use_add_pubkey: command not found` との記載があります。
StackScripts の14行目において、本来 `user_add_pubkey` という関数名であるところが `use_add_pubkey` となっていたためエラーが発生したとわかります。
他のエラーもログに出力されるので、解析に便利ですね。

## まとめ
今回は StackScripts のデバッグ方法についてご紹介しました。
StackScripts に一文追加するだけで利用できるので、StackScripts を作られる際はぜひ追加することをおすすめします。

## 関連記事
アカマイ・テクノロジーズ合同会社の Qiita では Linode 関連など開発者向けの記事を記載しています。

https://qiita.com/organizations/Akamai
cisco OSバージョン変更_備忘

①　3CDaemonが入っているPCとルータをLANケーブルで接続
※3CDaemonは現在配布されていないため人にもらうとかする

②　ルータとPCを同じネットワークになるようアドレスを設定する

③　3CDaemon起動
　　FTPserver → Configure FTP Server → FTP Profiles
　　Profile Name:anonymous
　　User Directory:OSがあるディレクトリ
　　This user can:Login, Download, Upload をチェック
　　→適用→OK

④　show versionで今のルータのバージョンを確認

⑤　copy ftp:xxxxxxx.bin flash:
　　ftp:の後ろにＰＣに保存している変更したいバージョンのファイル名を入力
　　remote host? : PCのアドレス入力

⑥　show flash: | inc xxxxxxxx.binでflashにコピーされたことを確認

⑦　boot system flash:/xxxxxxxxx.bin
※/(スラッシュ)忘れないように
→指定しておくと、起動がはやくなる
  　
⑧　show bootで確認し、OSが切り替えられているか確認

⑨　write mem　保存

⑩　reload

⑪　show versionでバージョンが切り替わっていることを確認
SketchUpからBlenderにインポート




![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) SketchUpが好きだけど少数派な気がする。
## やること
SketchUpで作成したファイルをBlenderにインポートします。
今回見つけた方法はたぶん改善の余地ありですが、とりいそぎのメモです。

## 課題と原因
何も考えずに.daeファイル経由でインポートしたところ下記のようになりました。

① Blenderの画面にインポートしたオブジェクトが表示されるものの、レンダリングでは無視された。  
    → 原因はわからないが、偶然解決できた。

② 表示されないオブジェクトがあった。
    → SketchUpでコンポーネントを使った時にインスタンスが表示されないらしい。

③ ゴミのような点線が画面にいっぱい出た。
    → SketchUpでグループを作ると、その原点に対して点線が出るらしい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/b4695656-7b18-2d26-9fc8-dd329290b631.png" width = 500/>

これらを解決していこうと思います。

## 暫定のエクスポート・インポート手順

### STEP1 : SketchUpで下準備をする
- コンポーネントになっているものをすべて固有に変更する。
- 無駄なグルーピングを解除し、入れ子関係を減らす。

- SketchUpでファイル→エクスポート→3Dモデル… を選択し、
　COLLADAファイル(*.dae)のフォーマットで出力する。

### STEP2 : Blenderにインポートする

- Blenderで、ファイル → インポート → Collada(デフォルト)(.dae)
  インポートされると、オブジェクトが画面に表示される。

- レンダーを試してみる。うまくいけば問題なし。
 
- オブジェクトが画面には表示されるがレンダーに認識されない場合は以下に進む。

### STEP3 : Blender内でのデータ整理

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/240213b0-eeeb-b610-9730-ac71314bdb08.png" width=300/>


- Blender右上にあるアウトライナーの中にSketchUPという項目があるのを確認する。

- まず、インポートしたファイル以外の既存のオブジェクト（ライトやカメラなど）があれば、
新規コレクションを作成し、その階層内に移動しておく。
（アウトライナー上で右クリック→新規コレクション）

- これで、既存のCollectionの中にはインポートしたファイルのみになる。

- アウトライナーのSketchUPという項目を選択しxキーで削除する。
中身がアウトライナーに並ぶが、これでレンダーでも認識される。レンダーを実行して結果を確認し、ここで一度セーブする。

- アウトライナーの中に「Instance_数字」があるか確認。　
おそらくSketchUpで作成したコンポーネントだが正しく表示されていないので、どのパーツかを特定しておく。
また、意図しないグルーピングや点線などがないか確認し、削除とアンドゥなどで該当箇所を特定する。

- 上記で特定した箇所について修正するため、Sketchup側に戻り、STEP1から作業する。

### STEP4 : 仕上げ

- Blenderにインポートし、満足がゆくまでSTEP1-3の手順をくりかえす。

- アウトライナーの「skp_camera_Last_Saved_SketchUp_View」
を削除する。

- Collectionの名前をわかりやすい任意の名称に変更する。

- インポート時に色がついているが、動かすと色が抜けたりするので、マテリアルを改めて割り当てる。

- レンダリングが動作することを確認する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/c4df0389-a319-2702-0d94-4e8cdc108218.png" width = 300 />

- 扱いやすいようにBlender内でCollectionにグルーピングしたり、原点設定をしたりする。

- あとはBlenderの通常の使い方で、テクスチャやアニメーションなどのアレンジを加えていく。

- いろいろ適当でもとりあえずHDRIに置いてアンビエントオクルージョン設定にしてレンダリングするといい感じに見える。
![SS 220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/344b1e6e-c7b1-4de7-e625-6989ddff6aad.png)
社内のQ&Aフォーラムに寄せられて嬉しかったこと

株式会社LIFULLのプロダクトエンジニアリング部の二宮と申します。

以前「[GitHub Discussionsで社内のQ&Aフォーラムを開設する](https://www.lifull.blog/entry/2022/02/24/100000)」でもご紹介したことがあるのですが、LIFULLではGitHub Discussionsを使った社内向けのQ&Aフォーラムを有志で運営しています。現在、およそ500個の投稿があり、社内の情報やノウハウ共有に役立てていると思います。

> このフォーラムは「あるシステムについて誰か詳しい人に相談したい」とか「設計についてチーム外にも相談したい」とか、エンジニアリングで困ったことをなんでも聞ける窓口になることを目指しています。最近ではアーキテクトチームや QA チームなどの公式の窓口としても利用でき、質問の内容に応じて適切な部署や人がアサインされる体制も整い始めました。

元々はQ&Aのみを想定していたのですが、予想していなかった嬉しい使われ方も行われています。今回はそれを紹介します。
（また、これを社内のエンジニアが見て、「こういう使い方をしてもいいんだ」と更に活性化することを期待しています！）

## 技術知見の共有の場になっている

GitHub Discussionsには、Q&A以外に `Knowledge` というカテゴリがあります。これを使って「皆に共有したい技術的な知見」を共有する人が現れました。

例えば次のようなものが投稿されています。

> **画像に lazy-loading を適応するとパフォーマンスが劣化する場合があるので気をつけてください #496**
>
> **まとめ**
> * ヒーロー要素となる画像(LCPのターゲットとなる要素の画像)/first view に入る画像については、必ず lazy-loading を避けること
> * むしろ優先度を高く読み込むようにする
>   * `<link rel="preload"`
>   * `fetchpriority="high"`
> （以下略）

Discussions上で、過去の質問を検索するとき、これらのKnowledgeも表示されるため、困っている人に直接リーチできる可能性がありそうです。

## データについての相談も寄せられるようになっている

GitHubを利用しているので、元々はエンジニアだけをターゲットにしていたのですが、データ関連の問題も投稿されるようになりました。

LIFULLでは（他の会社でもままある話だと思うのですが）データについての相談を各部署の「詳しい人」が相談を受けて、[データスチュワード](https://note.com/datamanagement/n/nea31f82bce3e)という役割を設けて相談を一元管理しようという動きがあります。そちらの役割の方から投稿して頂いた内容がこのようなものです。

> **BQ：{あるデータのテーブル}の{種別カラム}=13は何ですか？ #487**
>
> **相談**
> * BQ：{あるデータのテーブル}の{種別カラム}=13が何か知りたい。
> * {種別カラム}の値と名称を管理しているマスタやドキュメントがあるか？
> * マスタがない場合、最新情報を確認する手段を教えて欲しい。
>
> **分かっていること**
> * {種別カラム}=13は\*\*\*\*年\*月が初出っぽい
> * {種別カラム}=13はすべて\*\*\*
>
> （以下略）

実はこれは、特定のユースケースで保存されるデータの一部に誤りがあり、データを生み出す側の実装を調べないと分からない問題でした。「データスチュワードが相談を管理して、実装上や仕様の問題はエンジニア向けのQ&Aフォーラムに投稿する」という動き方で比較的短時間で解決できました。

以前はこうした問題は「データ部署が仕様を調べてもよく分からず、各不動産マーケットに連絡が来て、そこのエンジニアが実装内容を調べて…」というチームをまたいで、長い時間がかかってしまっていたんじゃないかと思います。

こちらの質問は[LIFULL Tech Hub](https://www.lifull.blog/entry/2022/07/27/090000)という社内カンファレンスがきっかけで繋ぐことができました。LIFULLではこうした社内イベントもいろいろ工夫して実施されています。

## 提案や意見集約の場として使ってもらえている

開発プロセスの中で「何かちょっとイケてないけど、どこに提案すればいいか分からない。誰に修正してもらえばいいか分からない」というモヤモヤがあることもあると思います。そうした提案もいくつか行なってもらえています。

> **「開発チェックシート」の体験向上について #440**
> 
>　選択式アンケートは匿名回答のようなので、ぜひ率直なご意見をお寄せください。
>
> **背景**
> \*\*開発者の方々などが使用している開発チェックシートは開発フロー上欠かせないものと考えていますが、現状の運用には次のような不便さがあると考えています。
>
> 1. 共通テンプレートが改変されてしまう
> 2. 共通テンプレートがどこにあるかすぐに分からない / たどるのが手間
>
> （中略）
> そこで、何らかの改善策が打てれば生産性向上に寄与できるのではないかと考え、以下の2通りの改善策を考案しました。
> 
> （以下略）

何かプロダクトを作る際のサポートとしてGoogle Spreadsheetのチェックシートがあるのですが、その内容がいくつか古びてるんじゃないかというような内容でした。

こちらのdiscussionには「こう修正したほうがいいんじゃないか」とか「チェックシートができた当時より自動テストでカバーできる範囲も増えてるから軽減できるんじゃないか」みたいな意見が寄せられ、その結果を品質管理の部署に拾って改善に向けて動き始められたそうです。

## まとめ

以上のように、GitHub Discussionsを使ったエンジニア向きのフォーラムは、けっこういろいろ面白い動きに繋がるものだと思います。『[Googleのソフトウェアエンジニアリング](https://www.oreilly.co.jp/books/9784873119656/)』でも `YAQS：Q&Aプラットフォーム` という社内フォーラムが紹介されていますが、これと似た取り組みが普段使っているGitHub内ですぐに実現できます。

「[GitHub Discussionsで社内のQ&Aフォーラムを開設する](https://www.lifull.blog/entry/2022/02/24/100000)」でも紹介した通り、GitHub Actionsを使った自動化や通知なども簡単に実装できます。

皆さまの会社でもぜひやってみてください。
React参考サイト

#　参考動画

https://www.youtube.com/watch?v=nRCNL9T3J98

https://www.youtube.com/watch?v=ANcopd8Bmao&t=866s

https://www.youtube.com/watch?v=uuAdVs7sbAs


https://www.youtube.com/watch?v=XKSYF2aZnkQ

https://www.youtube.com/watch?v=gLbTluYSb_U&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=3

https://www.youtube.com/watch?v=Ym4If5W9SS0&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=4


https://www.youtube.com/watch?v=Q-df0QgZuhE&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=5


https://www.youtube.com/watch?v=Sex6Vc-NJEk&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=6


https://www.youtube.com/watch?v=dTghhYtvPek&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=7


https://www.youtube.com/watch?v=7MzVcLAtl8g&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=8


https://www.youtube.com/watch?v=f8iXdpbvvH8&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=9


https://www.youtube.com/watch?v=Ejr2vj527j4&list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k&index=10


https://www.youtube.com/watch?v=bMknfKXIFA8

#　参考サイト

https://teto-tech.com/article/udemy-react-beginner3



https://ja.reactjs.org/tutorial/tutorial.html

https://www.tohoho-web.com/ex/react.html

https://qiita.com/TsutomuNakamura/items/72d8cf9f07a5a30be048

https://udemy.benesse.co.jp/development/app/react-beginner.html


https://wk-partners.co.jp/homepage/blog/hpseisaku/javascript/react-start/


https://qiita.com/tomipetit/items/6563eacd88e63bda5de3

https://qiita.com/tomipetit/items/cdd319d8fce8bdb829d0


https://qiita.com/tomipetit/items/975eceda3d07b152547c


https://zenn.dev/azukiazusa/articles/react-rerender-patterns


https://zenn.dev/toono_f/articles/02a815b78f7fd3
これを知っていればコミット整理が楽になる

## これは何

私は開発作業をしているとき、一旦手を動かすことを優先することが多く、1つ1つのコミットの修正範囲が大きくなってしまうことが多いです。
コミットログを想像しながら開発ができればいいのですが、やはり書いてみないとわからないことも多いので、、、

そんな時に、後からでもコミットログを整理整頓しやすい `tig` というツールがあります！

細かい使い方はいっぱいありますが、覚えることが多すぎると結局使わなくなってしまうので、これだけ知っておけば、コミット整理が楽になるという部分にだけフォーカスして紹介します。


## tigのインストール

そこまで難しくはないと思うので、こちらを参考に行なってください。
https://github.com/jonas/tig/blob/master/INSTALL.adoc

Macであれば、Homebrewからインストールできます。
```shell
$ brew install tig
```


## tigの基本的な見方

ターミナルで下記のコマンド `tig`を入力すると `main view` が開きます。

```shell
$ tig
```

`main view`の中で、それぞれの履歴にフォーカスして`Enter`を押すことで、変更差分を見ることができます。
カーソルの移動は、左の画面では `↑`/`↓` 右の画面では `k`/`j` を使います。

画面を抜けたい時は、`q` を押します。
`d`を押すことで履歴画面を全画面にもできます。

![スクリーンショット 2022-11-22 11.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/ec3f92ec-da6a-44f5-431a-e802bcf61d8b.png)



## tigの便利なところ

コミット整理を行う上で難しいのが、同じファイル内で複数の修正を行ない、それぞれを別のコミットにする場合です。
ファイルが別々であれば、`git add ファイル名` で今から作りたいコミットに含めたいものだけstageに追加すれば良いですが、同一ファイル内だと途端に困ってしまうことないですか？

それではやっていきましょう！

### status view を開く

`main view`が表示されている状態で、`s`を押すと git status を実行したような画面になり、まだコミットされていないファイルのリストが表示されます。
![スクリーンショット 2022-11-22 12.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/39082ad8-cfd3-0f0e-e5dc-db6bdc7dc106.png)
- **Changes to be committed:** 
    - stageにのっている変更(コミット対象になる変更)
- **Changes not staged for commit:** 
    - まだstageにのっていない修正
- **Untracked files:** 
    - まだstageにのっていない新規ファイル追加


### ファイル単位でstageに載せる

`status view`を開いた状態で、 stageに載せたいファイルにカーソルを合わせて、`u`を押すだけ。
これで、ファイルごとstageに登録されます。

![スクリーンショット 2022-11-22 12.08.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/b6cb3f3c-62f2-0257-6ae5-0b4c1f0bf063.png)


### 部分ごとにstageに載せる

`status view`を開いた状態で、 **Changes not staged for commit:**の中にあるファイルにカーソルを合わせて、`Enter`を押します。
修正履歴が表示されるので、@@ ~ @@ の範囲内で`u`を押すと、そのまとまりがstageに登録されます。

![スクリーンショット 2022-11-22 12.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/5dac60e0-44fd-cb7c-ac8a-b4f1c5f939c4.png)
※新規追加ファイルは対象外

### 1行ごとにstageに載せる

`status view`を開いた状態で、 **Changes not staged for commit:**の中にあるファイルにカーソルを合わせて、`Enter`を押します。
修正履歴が表示されるので、stageに追加したい部分にカーソルを合わせて`1`を押すと、その行がstageに登録されます。
![スクリーンショット 2022-11-22 12.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/f8cbe068-cd5b-cfae-9738-754deee11e72.png)
※新規追加ファイルは対象外


### stageから外す

`status view`を開いた状態で、 **Changes to be committed::** の中にあるファイルに対して、追加の手順と同様のことを行えば、ファイル単位/部分単位/行単位でstageから外すことも可能です。


## 最後に
基本的には`git`だけでもなんとでもできますが、コミット整理の際には、特に`tig`が直感的でわかりやすいので、私はコミット整理の際にだけ`tig`の力を借りています。
本記事では特に`tig`の便利な使い方だけにフォーカスして、なるべく覚えることが少なくなるように意識したので、多くの方に使っていただけると嬉しいです。

また、コミット整理系の記事に関して、[git commit --fixup が便利](https://qiita.com/inukai-masanori/items/82eb0626fd75f3eb0922) も書いているので、ぜひご覧ください。
インフォマティカ・データマネジメント・プラットフォーム概要

# Informatica Intelligent Data Management Cloud
この記事は [インフォマティカ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/informatica) Day 1 の記事として書かれています。

Informatica Intelligent Data Management Cloud (IDMC) は、必要なデータを発見し、あらゆるシステムのデータを繋げ、データを綺麗にすることにより信頼性を確保し、システムや業務を超えて関連付けた横串分析や、誰もが簡単かつ安全にデータが扱われるよう統制を可能にするデータマネージメントプラットフォームです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/f3a64bbf-63fe-8f28-60b2-b198bf726af0.png)
2022年12月現在、以下のサービスは日本語版がリリースされています。
・データカタログ (システム・メタデータ管理)
・データ統合 (ETL,ELT,データ統合ハブ,インジェスチョン)
・API&アプリ統合 (API開発と公開,ビジネスプロセス統合)
・データ品質 (データプロファイリング,データクレンジング)
・マスタデータ管理&360アプリ (顧客マスタ,参照マスタ,財務マスタ)
・データガバナンス&プライバシー (ビジネス・メタデータ管理)

2022年12月現在、以下のサービスは英語版がリリースされています。
・データマーケットプレイス (データのECサイト)
# データセンター
IDMCは日本を含む世界8か国のデータセンターで稼働しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/2e662b29-46a0-e023-0846-b87685f65dcd.png)
データセンターによって提供するサービスが異なります。詳細は後述のProduct Availability Matrix で確認できます。
# Secure Agent
オンプレミスのシステム間でのデータ統合にも関わらずデータがクラウドを経由してしまうとセキュリティやパフォーマンスの考慮が必要となってしまいます。
IICSはクラウドサービスですが、ハイブリッドのアーキテクチャを採用しています。社内あるいはIaaSなどユーザーが管理するネットワーク上のサーバにSecure Agentと呼ばれるモジュールをインストールすることにより、セキュアかつ高パフォーマンスなデータ統合を実現できます。
Secure Agentのインストール要件については、以下のInformatica Network(技術情報サイト)をご参照ください。
[Secure Agentのインストール要件](https://knowledge.informatica.com/s/article/526096)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/09e4e6df-3ca3-b4d6-504c-6c76a69bdff0.png)

# IDMCのトライアル
IDMCは30日間の無償トライアルが利用できます。
トライアルを利用するには次のブログを参考にサインアップを行ってください。
[Informatica Intelligent Cloud Services のサインアップ - Informatica Network](https://knowledge.informatica.com/s/article/informatica-intelligent-cloud-services-%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97?language=en_US)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/fd7ca6a1-28c5-d9ff-7ab7-44c13dc8398e.png)

# トレーニング
IDMCの操作を体験いただけるウェビナー形式のハンズオントレーニングや、自分のペースで学習できるオンデマンドトレーニングもあります。
# Product Availability Matrix
IDMCのデータセンター毎の利用可能サービスやSecure Agentの稼働OSはProduct Availability Matrix (PAM)で確認できます。
なお、PAMにアクセスするにはInformatica Network(技術情報サイト)にアカウント登録する必要があります。
[Informatica Networkのサインアップ - Informatica Network](https://knowledge.informatica.com/s/article/informatica-network%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97)
# 困ったときは
Informatica Community内のJapan User Groupでディスカッションやご質問をすることができます。
[Japan User Group](https://network.informatica.com/s/group/0F96S000000Q2PqSAK/japan-user-groupJapan)
ただし、Japan User Groupのメンバーによるベストエフォートでの返信になります。
# 最後に
Advent CalendarではIDMCの様々な機能が紹介されます。「この機能を使ってみたい!」などあれば、本記事で紹介したトライアル環境にサインアップして自由に試してみてください。
picoCTF Writeup picoGym Practice Challenges Easy Peasy (注意<spoiler>)

# Easy Peasy

Description
A one-time pad is unbreakable, but can you manage to recover the flag? (Wrap with picoCTF{}) nc mercury.picoctf.net 64260 otp.py

ncで接続されたサービスに接続すると、最初に暗号化フラグを取得し、必要なだけのデータを暗号化できる。
```
$ nc mercury.picoctf.net 20266
******************Welcome to our OTP implementation!******************
This is the encrypted flag!
5b1e564b6e415c0e394e0401384b08553a4e5c597b6d4a5c5a684d50013d6e4b

What data would you like to encrypt? test
Here ya go!
15532f0c

What data would you like to encrypt?
```

サービスの実装から、長さ 50000 の XOR パッドを使用して入力を暗号化していることがわかる。ワンタイムパッドとして使用する場合、これは壊れないはずですが、この場合、サービスはラップアラウンドを実行し、50000 文字ごとに同じパッドを再利用する。

したがって、フラグの暗号化に使用された XOR 値を取得するには、ラップアラウンドを発生させて、既知の入力を同じXOR値で再暗号化する必要があります。入力がわかっているので、それを暗号化された結果と XOR してキーを取得できます。次に、暗号化されたフラグを使用してキーを XOR するだけです。

実際、同じ暗号化フラグを、最初に暗号化するために使用された XOR ストリームで再暗号化することで、これをもう少し効率的にすることもできる。これにより、平文フラグが生成されます。

```.py:decrypt.py
from pwn import *
from tqdm.auto import tqdm
import binascii
import string
KEY_LEN = 50000

encrypted = "51466d4e5f575538195551416e4f5300413f1b5008684d5504384157046e4959"


def get_message(slide, encrypted):
    io = remote("mercury.picoctf.net", 64260)
    for i in range(4):
        io.recvline()
    io.sendline("1"*(50000-slide))
    io.recvline()
    io.recvline()

    io.sendline(deconvert(encrypted))
    io.recvline()
    io.recvline()
    message = io.recvline().strip()
    return message


def convert(message):
    key = (chr(0)*len(message)).encode()
    result = list(map(lambda p, k: "{:02x}".format(ord(p) ^ k), message, key))
    return "".join(result)

def deconvert(message):
    dec = b""
    for i in range(0,len(message),2):
        dec+=chr(int(message[i:i+2],16)).encode()
    return dec

print(deconvert(encrypted))

message = get_message(32, encrypted)
message_dec = deconvert(message)
print(message_dec)
```

```.py:decrypt2.py
from pwn import *

KEY_LEN = 50000
MAX_CHUNK = 1000

r = remote("mercury.picoctf.net", 64260)
r.recvuntil("This is the encrypted flag!\n")
flag = r.recvlineS(keepends = False)
log.info(f"Flag: {flag}")
bin_flag = unhex(flag)

counter = KEY_LEN - len(bin_flag)

with log.progress('Causing wrap-around') as p:
    while counter > 0:
        p.status(f"{counter} bytes left")
        chunk_size = min(MAX_CHUNK, counter)
        r.sendlineafter("What data would you like to encrypt? ", "a" * chunk_size)
        
        counter -= chunk_size

r.sendlineafter("What data would you like to encrypt? ", bin_flag)
r.recvlineS()
log.success("The flag: {}".format(unhex(r.recvlineS())))
```

picoCTF{3a16944dad432717ccc3945d3d96421a}
モデルファイルを分けた時でも、SQLAlchemyでいい感じに型チェックする

[公式の方法](https://docs.sqlalchemy.org/en/14/orm/extensions/mypy.html)だとモデルファイルを分けたときにうまくいかないので、対処方法のまとめ

## 参考
- [Mypy / Pep-484 Support for ORM Mappings(公式)](https://docs.sqlalchemy.org/en/14/orm/extensions/mypy.html)

- [SQLAlchemyで型チェックをがんばる](https://zenn.dev/yukinarit/articles/8cf10358be0086)
型チェック自体はこちらの記事が詳しい

## TL; DR
```bash
pip install sqlalchemy[mypy]
```


```pyproject.toml
[tool.mypy]
plugins = ["sqlalchemy.ext.mypy.plugin",]
```

```python:base.py
from sqlalchemy.orm import declarative_base
Base = declarative_base()
```


```python:campany.py
from .base import Base
from typing import TYPE_CHECKING
from sqlalchemy impoprt String, Column

if TYPE_CHECKING:
    from sqlalchemy.orm import declarative_base
    Base = declarative_base()

class Campany(Base):
    __tablename__ = "campany"
    id: int = Column(Integer, nullable=False, primary_key=True)
    name: str = Column(String, nullable=False)
```

## プラグインインストール
```bash
pip install sqlalchemy[mypy]
```
後ろに`[mypy]`つけてインストールする必要がある。

## mypyの設定
pyproject.tomlにインストールしたプラグインを指定
`plugins = ["sqlalchemy.ext.mypy.plugin",]`


ここまでで、モデルファイルがひとつだけの場合は型チェックできる。

## モデルのファイルを分ける場合
base.pyを作って`Base = declarative_base()`して使いまわすとモデルファイルを複数に分割できるけど、そのままやるとmypyに怒られる。
mypyで型チェックするためには、そのファイル内でBaseを作る必要がある。
そこで、困ったときの`TYPE_CHECKING`で型チェック時のみBaseを上書きする
```python
from .base import Base
if TYPE_CHECKING:
    from sqlalchemy.orm import declarative_base
    Base = declarative_base()
```


## [補足] pyrightでは諦める

sqlalchemy-stubsを入れても

```python
str_var: str = model.str_column
```

とかすると

`"Column[String]" is incompatible with "str (reportGeneralTypeIssues)" `が出てしまう

しばらく前に調べた感じだとSQLAlchemyについては、pyrightではいい感じにやるのは無理そう。
なので、`reportGeneralTypeIssues=false`にして型チェックはmypyに任せる
Mac環境のcurlで、SSLのURLにアクセス出来ない[SSL: CERTIFICATE_VERIFY_FAILED]場合の対処

# 経緯

- 次のプロジェクトでpoetryというパッケージ管理のツールを使うことになった
- サイトの説明によると次のコマンドを実行するとインストールされるらしい
    - `curl -sSL https://install.python-poetry.org | python3 -`
- だが、次のエラーによって阻まれた

```
...
Traceback (most recent call last):
  ...
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)>
```

# 状況

- SSLの仕組みと状況からざっくり次のように解釈
    - SSLは暗号された通信を行うための仕組み
    - たしか公開鍵だの秘密鍵だののやり取りをする
    - 多分、ローカルに鍵がなくてサーバー側に公開鍵を渡せないんだろうな

# 対処

私の環境は、python 3.9。
コマンドもそれに従って変わってくる。
```shell
% cd /Applications/Python\ 3.9
% sudo "./Install Certificates.command"
Password:
 -- pip install --upgrade certifi
...
install --upgrade pip' command.
 -- removing any existing file or link
 -- creating symlink to certifi certificate bundle
 -- setting permissions
 -- update complete
```

その後 `curl -sSL https://install.python-poetry.org | python3 -` も無事成功。

# まとめ

curlがpythonで動いているところと絡んで、sslのファイルがどこに必要なのかで結構迷った。
そしてpythonのディレクトリに証明書を発行するためのコマンドが予め用意されているもの知らなかった。
今回の問題に対処するのに、始めはMacにデフォルトで入っていたpython 2.7からどうする？って感じだったのでかなり右往左往したが、結論的には対処で書いたコマンド実行だけで済むという長い道のりを経てたどり着いた答えがしょぼいものという定番のものだった。

# 参考
https://stackoverflow.com/questions/27835619/urllib-and-ssl-certificate-verify-failed-error
Magento2で縮小版画像のキャッシュを一気に作成する

デフォルトでは、サムネイルを表示するときに都度作成しているようなので、初回アクセス時は遅く感じます。以下のコマンドで一気に作成できます。

```shell-session
$ bin/magento catalog:image:resize
```
結構時間がかかります。
ビルスケールで AR 表現をする VPS 選定 1

# MoAR - Museum of AR とは

https://whatever.co/moar/

六本木にある Whatever Co. が入居する WHEREVER ビルの壁面に自由に絵を描くことのできるスペースがあって、せっかくならビルやこのエリア一帯を盛り上げるなにかを描こう！でも単に絵を書くだけじゃつまらんので AR 連動するものにしよう！って流れでスタート。

![WHEREVER](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595/7af3bc26-8eea-188a-fcf7-a80906ea4b61.jpeg)

# ビルスケールで AR する方法

ビルにオーバーレイして AR 表現をするのは通常の ARKit / ARCore ではできなそうというのは容易に想像できたので、何らかの VPS (Visual Positioning System）を使う方向で調査した。

:::note info
**VPS - Visual Positioning System**
事前に収録されたデータとカメラ画像（と場合によっては GPS などの位置情報）をマッチングさせることでカメラが世界中のどの位置にあってどの方向を向いているかを推定する技術。  
誤差数センチ〜数十センチメートルでカメラ位置と姿勢が取得できるのでそれらの情報をもとに適切な位置に絵を描くことでマーカーなどを使用せずに AR 表現ができる。  
GPS だけで同じような処理をする場合、誤差が数メートル程度になるので ビルレベルで AR 表現をするのは難しい。（遠景の山とか星とかなら気にならない
:::

## Immersal

https://immersal.com/

企画当初の 2022 年 1 月時点でまともに使えそうなのが [Immersal](https://immersal.com/) だった。（ARKit の Location Anchors はアメリカ国内限定だったし ARCore の Geospatial API はまだ公開されてなかった。）

### 使い方

1. Immersal Mapper というキャプチャ用アプリがあるので対象物を色んな方向から撮影する。
2. Immersal Mapper から専用サーバーに撮影した画像を送信する。
3. しばらく待つと写真から解析された特徴点データ (Immersal 専用フォーマット) と位置合わせ用のモデルデータ（PLY と glTF）が生成される。（1.71.0 で glTF 出力機能廃止…）
4. glTF はフォトグラメトリされたっぽいモデルになってるのでこれを Blender などによみこんで AR コンテンツの位置あわせをする。
5. Immersal SDK を組み込んで↑の特徴点データを読み込ませてカメラ画像をつっこむと一致したときにその画像に対するカメラ姿勢パラメータが取得できるのであとはそれを AR カメラに設定してコンテンツ動かすなりする。

### やってみた

<iframe width="100%" height="500" src="https://www.youtube.com/embed/opDqO1eNWWw" title="Immersal 1.15.0 / WHEREVER" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

- Immersal Mapper で 130 枚ぐらい撮影した。
- だいたい位置あってるけど完全ピッタリってこともない。（ドリフトする）（Localize ボタン押したときだけ位置あわせしてるので数秒おきに localize するようにすればよいかも
- 遠いほうがズレが気にならない（あたりまえ
- 昼間撮影したデータが夜でも使えるのかは要検証（たぶん別途撮影してデータ作らないといけない

### 精度をあげるためにフォトグラメトリアプリで解析したカメラデータを使う

Immersal にはカメラ画像とその姿勢パラメータを送るとそれらをもとに特徴点データを生成してくれる API があって、これを使うと Immersal Mapper を使わずに特徴点データが作れる。（というか Immersal Mapper はその API を使っている）

ドキュメントにはサンプルとして Metashape で解析したカメラパラメータで生成する方法が書いてある。

https://immersal.gitbook.io/sdk/tutorials/how-to-map/custom-images

精度がイマイチなのは Immersal Mapper のロジックの問題かな？と思ったのでサンプルコードのまんま、Metashape に写真を食わせてカメラパラメータを取得して API つかって特徴点データを生成してみたものの、結果はあまり変わらなかった。

Metashape の解析精度がイマイチかな？と思って Reality Capture で同じようにやってみたものの、こっちも結果はあまり変わらなかった。（Immersal API が求める形式と Reality Capture の出力できる形式が座標系含めいろいろ違うので Unity でコンバートする仕組みを作る必要があってわりと苦労したのにー）

結局 Immersal Mapper で作るのと外部解析での特徴点データの精度はあんまり変わらないという結論。

![生成方法による違い](https://user-images.githubusercontent.com/27694/194525825-6950a2cc-947c-4c3a-bd46-0a42a55e8007.png)

特徴点データとともに生成される glTF のモデルデータを見ると精度がある程度わかるので重ねてみた絵。紫のがビルのモデルデータでこれに近いほど精度が高い。テクスチャがついてるメッシュが Immersal Mapper でグリーンのメッシュが Reality Capture で解析したカメラパラメータをもとに生成したデータ。どっちもほぼ同じで実際にアプリに組み込んでみても精度はあまり変わらない。

・・・

（余談：要はカメラの絶対位置と姿勢の精度がしっかりしてればいいんしょ？と思って RTK でカメラ位置を取得しようとしてみたのだが都会のビルのはざまでは RTK Fix するわけもなく断念…）


### 結論

全くズレが気にならないレベルではないけど Immersal の精度であれば今回の用途には使えそう。ただしコンテンツ側でそのズレが気にならないようにする演出は必要そう。

・・・

といったあたりで別プロジェクトが燃えだしたので一旦 R&D は中断、続きは数カ月後…（明日の記事に続く