OmniAICreator/Qiita-1.07M huggingface dataset:
個人開発Flutterアプリリリースまでの小話（iOS）

# はじめに
前回の記事にてFlutterを使って個人開発したアプリをリリースしたため軽くご紹介をさせていただきました。（https://qiita.com/Oyama-Kohei/items/7c4a6a7be226f0775bb2）
iOSのアプリリリースにはAppleの審査があり、基準がかなり厳しいため自分も苦労をしましたが今回の記事では、そんなiOSアプリリリースの苦労話やツールなどを紹介できればと思います！

# アプリができたら
まずはAppDevelopperProgramに参加しましょう！
これをしないとAppStoreに自分が作成したアプリを登録できない仕組みになっています。
こちらから　→ https://developer.apple.com/programs/
参加費用は年間で約100ドルです。。。高い。。
ただ自分は一通りリリースまでやってみることで得られた知識/経験は大きいものでした。
iOS開発をやっている方は一回でもいいのでやってみるといいかもしれません。

# AppStoreConnect
多くの方はTestFlightからアプリのテストを行なっているかと思いますので、ビルドからアップロードの手順に関しては割愛いたします。
自分は下記の記事を参考にしました！

https://qiita.com/kz23szk/items/d7c90bea1f6136218456

AppDevelopperProgramに参加すると,タブ選択でAppStoreからこのようなページが表示されると思いますので、iOS App > +ボタンでTestFlightのバージョンを指定してリリース準備を始めることができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077515/1047e8b8-1ca3-1ec9-8cf3-200f7eeaa545.png)

ここからはリリースに際して必須情報を入力する際に自分がどのような情報を入力したか？　リジェクト（Appleからの審査落ち）を回避するためには？などの情報を共有できればと思います！
# iOSのプレビューとスクリーンショット
iOSのリリースに伴い、iphone6.5, iphone5.5インチそれぞれのプレビュー画像の登録が必須になっています。
自分も色々と調べましたが、画像には実際のアプリのイメージや機能の説明などが入っているものが一般的でした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077515/1b1c0b46-ff44-b628-fc6e-8a256795b5fd.png)

下記に公式イメージで端末の枠画像をダウンロードできるので、そこからイメージを無料で自作することもできますが、、、

https://developer.apple.com/design/resources/#product-bezels

自分は作成した画像を各端末のサイズ出力できるツールがあったので、それを使用して作成しました！
（後からですが、、個人的には自作でも簡単に作成できそうだったので自作をお勧めします）

https://theapplaunchpad.com/

# プライバシーポリシーの作成
アプリの内容によってはプライバシーポリシー及び利用規約の策定が必要になります。
例えば、自分が作成したアプリの場合FirebaseAuthenticationによるメールアドレス/パスワード認証やGoogleAdsの広告表示の観点で " 利用者情報の取得/利用 "に該当したためプライバシーポリシーを策定しました。
というか少ししっかり目のアプリであれば大体規約の作成が必要になります。
雛形などもあります！


必ず作成しましょう！！！（というより作成しないとほぼリジェクト対象になります。。。）

ちなみに参考までに自分のアプリで作成したプライバシーポリシーと利用規約は下記のものなので参考までに。

https://firebasestorage.googleapis.com/v0/b/tuskmum-flutter.appspot.com/o/terms%2Fterms_privacy_policyhtml.html?alt=media&token=bd887e99-542b-482b-8b2c-38630b1ae350

なお、公開方法に関しては、自分の場合GitHub Pagesというホスティングサービスを使ってwebページをインターネット上から公開して、それをFirebase Cloud Storage内で管理してフロント側から参照する方法をとっています。
レンタルサーバーを契約しなくても簡単に自分が作ったWebページを公開できるので便利です！

https://gakogako.com/github_pages/

# その他
「サポートURL」と「問い合わせ先」を登録する欄があり、アプリに不具合があった場合の問い合わせに使用するものなのですが、自分の場合はアプリ専用のwebページを作成するのが面倒だったので、開発用のメールアドレスからtwitterアカウントを作成してtwitterのアカウントページをwebサイトのページとして登録したらすんなり審査通りました。。。

# まとめ
特にアプリをリリースする上でのリジェクト対象をあげてみましたがおさらいすると「アプリイメージ」「プライバシーポリシー/利用規約」そして紹介しませんでしたが最も重要なのはバグをなくすことです！
自分は何度もリジェクトを食らいましたが皆さんもめげずに頑張りましょう。

忘れてましたが一番のハードルはAppDevelopperProgramに参加する費用でした。。。
Echo Show 5 第2世代 を買ったので防災情報を登録する


x ここは、日本の東京近郊です。

目的
こ一時間かかったのでノウハウをまとめる

![o_cop242.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bc8d83a9-d6b1-6667-5fa9-85e662bf5fff.jpeg)


![o_cop239.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/eb0c06a2-f20b-dc0d-e5c2-05426c521ab7.jpeg)

![o_cop240.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/804b193c-a4dd-8a40-4047-a05100b308b1.jpeg)


![o_cop241.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e1c58b07-05d7-b0df-3e24-6afa8c38c1e5.jpeg)







1. PCのGoogle Chrome から　amazonにログイン

2. 検索で「すべて」を「Alexaスキル」に変更

3. 「防災情報」と入力する

4. 結果から防災情報を選択する

5. このスキルを管理からスキルを有効にする

6. デバイスの国および郵便番号でアクセス権を管理を開く

7. 有効にして保存

8. 終わり


Echo Show 5での作業


1. 「アレクサ」「防災情報」と叫ぶ

2. おわり
やっているFDLを紹介します

![work - FDL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/d6503ad1-5aa6-f84e-0825-f9b2ddda30ed.jpeg)

## はじめに

ファン・ダン・ラーンは、yattomさんの記事を参照ください。

https://qiita.com/yattom/items/90ac533d993d3a2d2d0f

私は、かれこれ2年ほど振り返りのFun／Done／Learnを続けてます。その中で、形を変えながらきたので少し紹介させてもらいます。


## 利用シーン

### プロジェクトの振り返り

王道の利用方法です。
プロジェクト進行で、よかったこと、できたこと、できなかったこと、悪かったこと、印象的なことなどを共有しています。


### 雑談（アイスブレイク）

邪道な利用方法です。
最近あったことなどを中心に共有しています。

## 利用方法

1. wait cardに付箋を吐き出す（1〜5分）
1. wait cardにある付箋を、記載した人が説明する。
1. 説明者が移動者を選定して、FunかDoneかLearnに移動してもらう。
1. 移動者が、次の説明者になる。 `2に戻る`
1. 振り返りの中で、`もっとこう出来た` `こうすればよかった` `挑戦したいこと`などを Idea or Tryに貼り出す
1. ラスト10分で、Idea or Tryにある付箋を見返して、実際に取り組んでいく内容を抽出


## 最後に

追加したのは`Idea or Try`です。
途中からこの枠を追加したのですが、ディスカッションして発散するだけになってしまっていた状態から、次につなげられるようになりました。
KPTでもいいのですが、プロジェクトに直接関係がない人などがいる場合に、付箋を出しづらい場合があるので、FDLはハードル低めでちょうどいいのではないかと感じています。
Deforum_Stable_Diffusionで RuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory


Deforum_Stable_Diffusionやってると，　`RuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory` とか言われることがあって，その際の対処方法のメモです．エラー内容は↓．

```
reading custom settings from /content/drive/MyDrive/Settings.txt
The custom settings file does not exist. The in-notebook settings will be used instead
Saving animation frames to /content/drive/MyDrive/AI/StableDiffusion/2022-12/StableFun
Loading base model ()...Using cache found in /root/.cache/torch/hub/rwightman_gen-efficientnet-pytorch_master
Done.
Removing last two layers (global_pool & classifier).
Building Encoder-Decoder model..Done.
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-12-9425e8efad93> in <module>
    548 # dispatch to appropriate renderer
    549 if anim_args.animation_mode == '2D' or anim_args.animation_mode == '3D':
--> 550     render_animation(args, anim_args)
    551 elif anim_args.animation_mode == 'Video Input':
    552     render_input_video(args, anim_args)

5 frames
/usr/local/lib/python3.8/dist-packages/torch/serialization.py in __init__(self, name_or_buffer)
    240 class _open_zipfile_reader(_opener):
    241     def __init__(self, name_or_buffer) -> None:
--> 242         super(_open_zipfile_reader, self).__init__(torch._C.PyTorchFileReader(name_or_buffer))
    243 
    244 

RuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory
```

## 解決方法

自分の場合は色々試したあげるく，Google colabのファイルを作り直すことで解決しました．

Pytorchの何かしらのzipファイルを読み込む失敗のエラーだと思うので，`dpt_large-midas-2f21e586.pt` を手動でとってきたり色々試しり，StackOverflowに書かれていたように，ドライブにあるAIフォルダを削除するも試したのですが，すべてダメで，Colabファイル作り直すのが良いと思います．
Renderでサクッとデプロイするひとり

# デプロイしないと見えない
　結局のところ、個人開発はデプロイしないと始まらない。ローカルでいじってみてもそれは個人満足で終わってしまい、やったぞ！のような感情を起こさない。頑張って公開しないといけない。

# さくらvpsはむずかしかった

　わたしははじめ、デプロイ先にさくらVPSを選んだ。金額も安く、いつのまにかスケールアップ！して高額になることもない。Herokuも考えたが、ちょっとかっこよくなりたかった。それが仇となった。

　デプロイまで、調べたり試したり、ものすごく時間がかかった。ぽちっとクリックすればおわるHerokuなどのPaaSとは違って、アカウントをつくったりセキュリティの設定をする必要があった。このあたりは苦闘は記事にまとめている。

https://qiita.com/kyokucho1989/items/3ae9dc6ccb11b8235796

https://qiita.com/kyokucho1989/items/096d756f4cc577f2e3ba

https://qiita.com/kyokucho1989/items/2ca65786c642c3875106

https://qiita.com/kyokucho1989/items/1a5fa8584d97f775cb6c

　記事はここで途絶えている。おそらく、RailsのgemであるCapistranoを使ってデプロイをしようとして、詰まったはずだ。なぜ詰まったか、あまり覚えていない。確か、アプリをサーバーに上げようとしたら、サーバーのメモリ不足でエラーになったはずだ。なぜかは知らない。

# Render.com をつかう

　もうデプロイ優先！とすることにして、Render.com をつかうことにした。Herokuのようなサービスでわりとかっこいい。ひとまず無料プランにしてデプロイした。1日でできた。

https://render.com/

　すごい。もっとはやくやればよかった。


# おわり

　とにかくデプロイしないと先に進まない。サーバーを勉強したいからとか、そんなこと考えたらダメだった。もっとたくさんやることがあった。

　ここからがスタート。
JavaScriptのthisについて

この記事は ウェブクルー Advent Calendar 2022 6日目の記事です。
昨日は @wc-takaharaさんの「TanStack Query(旧React Query)について整理してみた」でした。

# はじめに
WebCrewバックエンドエンジニア一年目の@kouki_kubotaです。
最近業務で調べる機会があったので、今さら感はありますがJSのthisについて書いてみようと思います。

## 関数呼び出し
これは使う機会が多いのでわかりやすい例だと思います。
簡単に書くと以下のようになります。

```script.js
function example() {
    console.log(this)
}

example();  //Window
```

この場合、exampleはグローバルオブジェクトなのでブラウザで表示した場合windowオブジェクトを表示します。
対して、strictモードだと以下のようになります。

```script.js
"use strict"
function example() {
    console.log(this)
}

example();  //undefined
```

strictモードというのはバグになりそうだけど通常エラーになっていなかったコードに対しエラーを表示させる仕組みのことです。
※詳しくは以下
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Strict_mode

この場合、`example()`は`undefined`を返します。

## メソッドチェーン

```script.js
const employee = {
    name: 'kubota',
    age: 22,
    getName: function() {
        return this;
    },
    getAge: function() {
        return this;
    }
}

console.log(employee.getName().getAge());    //{name: 'kubota', age: 22, getName: ƒ, getAge: ƒ}
```
自作でメソッドチェーンを作る際にはthisを戻す必要があります。
上の結果から分かるように、戻り値thisはオブジェクト自身を指すので、メソッドの呼び出しが可能です。

## アロー関数
アロー関数というのは
`let fruit = (apple) => {
    return this
};`
みたいなやつです。省略記法もいろいろあるので詳しくは以下からどうぞ。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

アロー関数は先ほどまでとは異なるthisの挙動をします。
アロー関数のthisの挙動はよく**束縛される**と表現されます。
簡単に言うとアロー関数のthisは関数定義の段階で決まっているということです。
以下比べてみます。
```script.js
//通常の関数宣言の場合

this.fruit = 'apple';
function selectFruit() {
    console.log(this.fruit);
}
const object = {
    fruit: 'banana',
    func: selectFruit
}
object.func();  //banana
```

```script.js
//アロー関数の場合

this.fruit = 'apple';
let selectFruit = () => {
    console.log(this.fruit);
}
const object = {
    fruit: 'banana',
    func: selectFruit
}
object.func();  //apple
```
このように通常の関数宣言だとオブジェクトを参照するためthisの値は常に一定ではありません。(関数宣言の時点でthisの値が確定しない)
対して、アロー関数の場合は関数宣言をした時点でthisの値が確定します。
また、上の例からもわかるようにアロー関数のthisは自身が定義されているスコープを参照するthisを確立するため、アロー関数内にthisは持ちません。よってメソッドチェーンは使えません。

## コンストラクタ

次にコンストラクタです、他のオブジェクト指向言語のコンストラクタと似ているようで異なる挙動がたくさんあります。
そもそもJSはプロトタイプベースの言語なので、JavaなどのようなClassは本来ありません(ES6以降クラス構文が出ていますが、似て非なるものです)

実際に見てみます。


```script.js
function Employee(name) {
    this.name = name;
    this.getName = function() {
        return this.name;
    };
}

let employee = new Employee('kubota');
console.log(employee.getName());    //kubota
```

このようになります。thisはnewによって新しく作られたemployeeオブジェクトを参照します。
また、先ほどのアロー関数はコンストラクタとして使用することはできません。

## bind, call, apply

bindは強制的にオブジェクトを紐づけることができます。

```script.js
function Fruit() {
    console.log(this)
}
let obj = { name: "apple" }
let bindFruit = Fruit.bind(obj)
bindFruit() // => {name: "apple"}

```

call/applyはbindの逆のイメージで、呼び出し側からオブジェクトを紐づけます。
```script.js
function Fruit() {
    console.log(this)
}
let obj = { name: "apple" }
Fruit.call(obj) // => {name: "obj"}
```

# おわりに

以上です、簡単にはなりますがJSのthisについて思いつく限りあげてみました。
間違い等ありましたらコメントでご教授ください。

明日は、@komacchi_uさんになります。
よろしくお願いします！
2022/12/6主にITとかセキュリティの記事

「Chrome」にゼロデイ脆弱性 - 前回ゼロデイ対応から1週間強で
https://www.security-next.com/141913

「制御システムセキュリティカンファレンス」の参加者募集がスタート
https://www.security-next.com/141909

Ubuntuに権限昇格の脆弱性 - 詳細情報も公開
https://www.security-next.com/141905

セキュアブート無効化可能な脆弱性、Acerの個人向けート PCでも見つかる(12/4)
https://www.zaikei.co.jp/article/20221204/699967.html

民間事業者 個人情報漏えい 半年で1500件余報告 前年同期の3倍(12/4)
https://www3.nhk.or.jp/news/html/20221204/k10013912601000.html

【Mac】動作が重い/遅いときの原因と12の対処法を解説！(12/3)
https://otona-life.com/2022/12/03/146753/

円安・物価高でITインフラの「コスト低減」が急務に、有識者が2023年に推す技術とは(12/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02279/120100001/

マイナカードは便利か？　鍵を握るのは「JPKI」(12/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/112400132/

使いやすさが魅力の「AQUOS sense7」、でも諦めなければいけない3つのこと(12/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00093/00133/

基幹システムはローコードで作れる　40年稼働のメインフレームを刷新 高砂熱学工業(12/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/112800118/

基盤モデル（Foundation Models）(12/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/112800129/
レーザー加工機入門

このブログは[ラクス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus)その2の6日目です。2枚目のカレンダーなので気軽に書いていきます。

## あらすじ

- プライベートの創作活動でMDFボードの切り抜き、紙コースターへの刻印が必要になった
- 中国製の安価な半導体レーザー加工機を利用
- 加工時のレーザー出力パラメータの設定にChatGPTが使えた

## 使っているもの

- [NEJE](https://nejetool.com/) Master 2s 20W
    - レーザーモジュール N30820
        - 半導体レーザーモジュール
        - 出力5.5W
        - 20Wの表記は入力電力らしい
    - いわゆる中華レーザー加工機
        - 購入時は2万ちょいでしたが、現在3万円代
    - 加工範囲は17x17cm
- [LaserGBRL](https://lasergrbl.com/)
    - フリーウェアの汎用レーザー加工アプリケーション

## レーザー加工機とは

レーザー加工とはレーザー光を使用して素材を加工する加工機械です。
ベクター画像を元にした精密な加工が可能で、紙、皮、木材、樹脂、金属といった素材に対して加工を行うことができます。
加工は出力によって刻印や切断を行うことができます。

ちなみに樹脂素材にはアクリルがよく使われますが、半導体レーザーでは黒色アクリルしか加工できません。透明アクリルの加工には半導体レーザーは透過してしまうため、より高価なCO2レーザーを利用したレーザー加工機が必要になります。

## レーザー加工処理の流れ

レーザー加工の流れは以下のようになります。

1. 加工寸法を指示するための画像作成
1. レーザー加工アプリケーションでのレーザー出力指定
1. 素材の位置合わせ
1. 加工開始

それぞれ見ていきます。

### 加工寸法を指示するための画像作成

レーザー加工を指示する画像ファイルはSVGなどのベクター画像を利用します。

かっとやこくAdobe IllustratorやInkscapeで作成してもいいですし、私の場合はAffinity Designで制作していました。最終的に出力される寸法で作成する必要があるので、寸法をピクセルではなくミリメートルなどで指定できるアプリケーションが必要です。

またカットした後に箱組みなど組み立てが必要になる場合は、同様のアプリケーションでも良いですし、Fusion360などの3D CADでDXFファイルを作成し、InkscapeでDXFからSVGに変換して用いることも多いようです。

ちなみにAffinity Designで作成いたSVGでは、このあとの私が利用しているレーザー加工アプリケーションに読み込ませた時に曲線がなめらかにならず、直線の組み合わせのようになってしまいました。
Affinity Designで作成したSVGをInkscapeで変換すれば、期待通りの曲線になりましたが縦横の寸法がそれぞれ２倍になるなど変換に一手間かかるので、特にこだわりなどがなければ最初からInkscapeで作成することをお勧めします。

### レーザー加工アプリケーションでのレーザー出力指定

画像が作成できたらレーザー加工アプリケーションに読み込ませます。

利用しているLaserGRBLでは読み込み時にレーザー出力の指定も行います。高級機に付属するアプリケーションや、有償アプリケーションのLightburnでは画像内の線の色ごとに出力を変えることができるようですが、LaserGRBLでは一度の加工で複数パラメーターを指定することはできないようです。
刻印と切断を併せて行いたいシチュエーションは結構多いので、近いうちにLightburnを購入したいと思っています。

出力設定は使用している機材の最大出力や、加工する素材によって異なるので試行錯誤が必要です。一度に複数パラメータを指定できるアプリケーションを利用している場合は出力を少しずつ変えて加工するテストピースを最初に作ると作業がスムーズかと思いますが、LaserGRBLではテストピースを作るのも一苦労なので適当に調整しながらパラメータを探ることになります[^cause]。

[^cause]: 正直この工程が一番面倒くさく感じます。素材も無駄になりますし。テストピースを作りやすくするためにもある程度慣れたらLightburnを買ってしまうのが良さそう。

ちなみにこの工程を少し楽にするために最近話題の[ChatGPT](https://chat.openai.com/chat)が意外と使えたりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31037/457253a3-ba90-b6ca-176c-1ef6895834e2.png)

ちなみに上記の例だと切断速度100mm/秒だと焦げが目立ちそうなので、切断速度を２倍にして2pass（2回繰り返し加工すること）で処理した方が綺麗になりそうです。

ちなみに同じMDFボードでもメーカーによってパラメーターが異なってくるので素材を仕入れる場合は同じお店で仕入れるようにしましょう。

### 素材の位置合わせ

パラメータの設定が終わったら、今度は素材の位置合わせです。

LaserGRBLではレーザーモジュールを「原点に戻す」「加工範囲の周囲を回る」「加工範囲の中心に移動する」といった操作ができますので、これらを駆使して素材の位置を合わせてください。また、原点位置を調整することもできます。
ちなみに何度も繰り返し加工を行っていると原点がズレることがあるので都度確認。

素材は直接作業台におくと加工時の焦げが目立つので、割り箸を挟むとか、ワイヤーネットを敷くとかしましょう。もちろんレーザー加工機用のハニカムベッドがあればそれが最良です[^bed]。

[^bed]: 私の場合は2cm厚のMDFボードを使っています。ハニカムボード欲しい。

繰り返し複数の素材に加工を行う場合は、素材の位置合わせのためのコーナーなどを配置すると良いでしょう。

### 加工開始

ここまで設定すればあとは加工スタートするだけです。この手の加工機はイメージよりも時間がかかるものですが、3Dプリンタに比べると処理時間は圧倒的に短いです。

私が使っているレーザー加工機の最近加工した例としては

- MDFボードの15x15cmの範囲を塗りつぶすように刻印：約40分
- 紙コースターに9x9cmの範囲に線画で模様を刻印：2分弱
- 1mm厚の紙コースターから63x88mmの角丸長方形を切り抜き：2分弱

3Dプリンタだとちょっとしたものを作るにも数時間必要なので、これでもだいぶ早いです。

---

## まとめ

レーザー加工は怖くない。

今はまだ刻印と切断しかやっていませんが、切断後に組み立てできるような設計図も作っていきたいと思います。
Code for Fukuoka 2022年の振り返り

# 1月
2021年から開始した隔週雑談MTGをオンラインで実施。

# 2月
引き続き隔週雑談MTGを実施。
福岡市の史跡関連の方より、史跡に関する勉強会を実施してもらいました。今津の元寇防塁辺りのことを学びました。

# 3月
引き続き隔週雑談MTGを実施。

# 4月
引き続き隔週雑談MTGを実施。
新年度会をリアルで実施。

# 5月
引き続き隔週雑談MTGを実施。
２０２０年に参加した市長広聴事業にてディスカッションした小学校との実証授業の対象校検討を福岡市教育委員会と開始。
(実は2021年にも予定していたが最終的にコロナ感染状況拡大より中止に）

# 6月
引き続き隔週雑談MTGを実施。
小学校との実証授業の対象校との打ち合わせ開始。

# 7月
引き続き隔週雑談MTGを実施。
UDC2022キックオフシンポジウムにて福岡拠点の計画発表（オンライン）。
まち歩きマッピングを試行実施。

# 8月
引き続き隔週雑談MTGを実施。
元寇防塁体験XRコンテンツ作成に向けて福岡XR部と協力開始。

# 9月
引き続き隔週雑談MTGを実施。
元寇防塁3Dデータを福岡市史跡整備活用課、福岡XR部と一緒にiPhoneにて作成。
小学校との実証授業の方針決定。図書館のリファレンスサービスにより対象校で今回題材となる地域資源の調査。
UDC2022福岡拠点キックオフイベント実施。
CodeforKyushuでCodeforJapanSummitウォッチパーティ・久しぶりのイベントを開催。

# 10月
隔週雑談MTGを小学校の実証授業に向けて定例MTGで毎週実施に変更。
トゥクトゥクで中心地である天神から香椎のビアガーデンに移動して久しぶりのリアル懇親開催。
小学校での実証授業に向けてTシャツとパーカー作成。実証授業対象小学校で授業２コマ実施。
元寇防塁3DデータによるARコンテンツを（実証授業対象校以外の）小学校の授業にて利用。

# 11月
引き続き週次定例MTGを実施。
小学校で校外見学授業同行。
UDC2022中間シンポジウムに参加。

# 12月
引き続き週次定例MTGを実施。
小学校で３コマ授業参加予定。

Code for Fukuoka再スタートからの5年目、振り返りました。
4年目の昨年は振り返りしておらず、どうまとめようか悩みましたがひとまず今年のみ振り返りました。

# 最後に
前回２年前の振り返りにも記載していた市長公聴事業でのディスカッションから実現した小学校との実証授業を昨年も進めていってましたが、最終的に昨年はコロナ感染状況拡大により中止となっていました。そして今年いよいよ実現して進めていってます。

再スタートの当初取り組んでいた公園データはデータ整理をしていこうとしたところでコロナのサイトであったり、そもそも公園に行くリアルイベントが出来なくなったりでストップしてしまい、昨年からは市長公聴事業で出てきた小学校の実証授業へと対象が変わりました。
色々要因はあるものの、結果的に自分の子どもが公園に連れて行く年代から小学生になったことで自分自身の興味対象も変わってきたことを感じました。

小学校の実証授業に関しては、年明けも続くので全て終わったところでまた記事にまとめたいと思います。
元寇防塁のARコンテンツを使った授業の詳細は1月21日に開催される CivicTechForum2022の福岡会場で紹介します。

昨年はできなかったけど、やっぱり振り返りは良いですね。
活動自体をきちんと振り返ることで感覚値ではない確かなものを感じます。
セッション管理ちゃんとできてる？セキュリティ被害に遭わないためにおさらい。

# はじめに
この記事は[Webの基礎をおさらいカレンダー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/basic_review)の3日目です。
このカレンダーでは、なんとなくわかった気になっている、Webの知識をおさらいするカレンダーです。
興味をもし持ってくださった方は、購読いただけると嬉しいです！

3日目は、セッション管理について紹介します。

## セッションとは
* 一連の処理・操作・通信などの開始から終了までを指す。
    * 例: ログイン~ログアウトまで

HTTPはステートレスなので、通信状態を保持しません。
そのため、ユーザーを識別し、状態を管理するために、セッション管理を行う必要がある。

セッション管理を行うことで、ログインしたユーザーごとに異なるマイページを表示したり、ECサイトでカートに商品を保持したりといったことが行えるようになる。

## セッション管理の手法
続いて、セッション管理の方法について説明していきます。

以下の三つの方法がありますが、CookieにセッションIDを保存するやり方が主流です。
他の方法は、セキュリティリスクが大きかったり、実装が大変だったりするためです。

* URLにセッションIDを埋め込む
* フォームにセッションIDを埋め込む
* CookieにセッションIDを保存する

上記、三つの方法について、具体的に説明していきます。

### URLにセッションIDを埋め込む
URLのクエリストリングにセッションIDを埋め込む方式です。
例: example.com?sid=12345
常に、セッションIDが付与されている状態のため、URLが漏洩した瞬間、情報漏洩につながります。

* **メリット**
    * ガラケーなどCookieが使えないサイトでも使える

* **デメリット**
    * セッションIDが漏れやすく、セキュリティリスクが高い

:::note alert
この手法は、基本的に使わないでください。
検索エンジンがセッションID付きのURLをキャッシュしてしまったり、SNSなどでURLを共有するなど
簡単にセッションIDを漏洩してしまう危険があります。
:::

### フォームにセッションIDを埋め込む
フォームのhiddenフィールドにセッションIDを埋め込む方式です。
ページ遷移を全てフォームで行う必要があるため、ユーザー体験に影響が出ないようにするには工夫が必要です。
セキュリティリスクは一番低いので、購入ページなどの重要箇所といった部分的な使用がおすすめです。

* **メリット**
    * セッションIDが漏れにくい
* **デメリット**
    * ページ遷移を全てフォームで管理する必要があるため、実装が大変

### CookieにセッションIDを保存する
Cookieについては、2日目のアドベントカレンダーにまとめたので、[こちら](https://qiita.com/yutaroud/items/e24234ca907d83ed0ed9)をご確認ください。
Set-Cookieヘッダーを使用してブラウザにセッションIDを保存させます。
実装の手間が少ない反面、
XSS(クロスサイトスクリプティング)によるCookie情報の抜き取りやHTTPSを使用しないHTTP通信での抜き取りなどの対策が必要になります。

* **メリット**
    * 実装の手間が少ない
* **デメリット**
    * セキュリティ攻撃の対象になりやすい

## セッションによるセキュリティリスク
### セッションハイジャック
名前の通り、セッションを乗っ取る(ハイジャックする)行為です。
セッションが乗っ取られる原因として、以下が挙げられます。
* 推測されやすいセッションIDになっている
    * 日付や固有名など推測しやすいものの場合、総当たり攻撃や推察によって突破されてしまう。
* ユーザーからセッションIDを抜き取る
    * XSSによるCookie情報の抜き取り
    * HTTP通信でのCookie情報の抜き取り
* セッションIDの固定化(セッション・フィクセーション)
    * URLにセッションIDを埋め込む
    * CookieのセッションIDをXSSなどで上書きする
    * Set-Cookieヘッダーを追加して任意の値を設定する
#### 対策
* セッションIDを推測しにくいものにする。ランダム生成値など。
* ワンタイムセッションIDを発行するなど、常に新しいセッションIDを発行するようにする。
* アプリケーションの脆弱性を塞ぐ。XSSの対策、HTTPS通信にするなど。

# おわりに
以上、 Webでのセッション管理方法についての説明でした！
セキュリティリスクに気をつけながら、セッション管理をうまく活用しましょう！

[Webの基礎をおさらいカレンダー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/basic_review)の3日目でした。
興味をもし持ってくださった方は、購読いただけると嬉しいです！

## 参考文献
[[ThinkIT] 第4回：セッション乗っ取り ](https://thinkit.co.jp/free/tech/7/4/1.html)
[TechRacho Webアプリのセッション管理とデータ保存を学ぶ](https://techracho.bpsinc.jp/hachi8833/2018_09_19/61260)
SI向けGitHub-flow改

# はじめに
- SIとしてGitブランチ戦略を考えた時、何が最適か見つからなかった
    - GitHub-flowは都度リリースする形態が前提なので、SIの様にフェーズという長い期間を経てリリースするのに向かない
    - Git-flowはdevelopブランチとmainブランチの定義が曖昧、きっちり管理しないとカオスになる
    - GitLab-flow, gitworkflows...
- 運用としては単純明快なGitHub-flowがいいが、SIにおける運用や各ブランチの明確化、CICD運用を踏まえて改良して運用することにした。

# 概要

- `main`がメインである
- タスク作業は`feature/#{issue番号}`で行う
- 不具合対応は`hotfix/#{issue番号}`で行う
- 環境確認用ブランチ(検証: `env-staging` / 本番: `env-production`)を用意する
  - 各環境にデプロイする際に対象ブランチで上書きし、デプロイする  
    上書き元と同一のブランチとしたいため、コンフリクトリスクがあるmergeやrebaseは行わない  
    ```
    # STG環境の場合
    git checkout env-staging
    git reset --hard 上書き元ブランチ
    ```
  - 本ブランチはデプロイするためだけのテンポラリブランチであり、壊れても無くなっても問題ないものとする
  - 現在の各環境の状態となる
  - ブランチpushによるCICDを行うなら本ブランチをトリガーとする
  - 状況により環境ブランチを切る (開発: `env-development`等)
- ファーストリリース前後で運用方法が変わる(下図参照)
  - ファーストリリース後の`main`は`問題なく動作する本番環境と同じもの(受入テストを完了したもの)`という扱いとする


## ファーストリリース前
![github_flow_kai-before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152189/02f3a567-ab28-7664-869d-ab5bb46b73a2.png)
- 開発者にとっては基本的にGitHubFlow
- タスク作業をする際は、`main`から `feature/#{issue番号}`を切る
  - タスク完了後、`main`へマージする
- 各環境動作確認時
  - `main`を環境確認ブランチ(検証: `env-staging` / 本番: `env-production`)へ上書きする  
    ```
    # STG環境の場合
    git checkout env-staging
    git reset --hard master
    ```
  - 対象ブランチをデプロイし、動作確認する
- リリース時
  - `main`を`env-staging`, `env-production`へ上書きし各環境にデプロイ、動作確認する  
    ```
    # STG環境の場合
    git checkout env-staging
    git reset --hard master
    ```

## ファーストリリース後
![github_flow_kai-after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152189/836217cd-aa3d-33a3-fc7f-2ce042d166e2.png)
- `main`より`release/ver{バージョン番号}`を切る- タスク作業をする際は、`release/ver{バージョン番号}`から`feature/#{issue番号}`を切る
  - タスク完了後、`release/ver{バージョン番号}`へマージする
- 不具合修正が生じたら、`main`から`hotfix`を切る
  - 修正後、`env-staging`, `env-production`へ上書きし各環境にデプロイ、動作確認する  
    ```
    # STG環境の場合
    git checkout env-staging
    git reset --hard hotfix/#***
    ```
  - 本番の動作確認完了後、`master`へマージする
  - 開発中の`release/ver{バージョン番号}`へマージする
- リリース時
  - `release/ver{バージョン番号}`を`env-staging`, `env-production`へ上書きし各環境にデプロイ、動作確認する  
    ```
    # STG環境の場合
    git checkout env-staging
    git reset --hard release/ver{バージョン番号}
    ```
  - 本番の動作確認完了後、`main`へマージする
rex0220 アプリ集計プラグイン 自アプリのテーブル集計

rex0220 アプリ集計プラグインで、自アプリのテーブル集計を行ってみます。
計算式プラグイン、項目検証プラグインと組合せて、予算と実績の比較チェックします。

# 概要

予算と費用コード1は、ルックアップコピー項目で取得
費用コード別に集計し、予算と費用合計を比較チェックします。

- [アプリ集計プラグイン](https://qiita.com/rex0220/items/9a6996d46e199c83289d) Ver.40
    - 本レコード以外の費用を費用コード別に集計
- [計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73) Ver.55
    - 費用コード別にすべてを集計
- [項目検証プラグイン](https://qiita.com/rex0220/items/be20fd879f5e1bc9e035) Ver.36
    - 予算と費用合計を比較チェック

![2022-12-06_00h01_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5ca2780f-acee-cfa5-7889-f1884bd8da1c.png)
![2022-12-06_00h02_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7bb0e7b3-d647-8ffc-bedc-5e4ea9e8adfd.png)

# 費用操作例

![2022-12-06_01h53_51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9364c72d-7175-3a96-3785-591457c9db41.gif)

# アプリ集計プラグインの設定
自アプリのレコードを集計します。

![2022-12-06_01h57_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e6f040a7-f029-bc73-5acf-58ecf742d977.png)
- 自動・ボタン別設定
![2022-12-06_02h02_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/68c13ae5-79a4-6a2b-154b-bde6b000a4bd.png)
- 対象アプリ条件
    - 条件値：ARRAY("",TDS(費用コード1))
    - 条件値にルックアップコピー項目の「費用コード1」を指定すると値変更イベントで集計される
![2022-12-06_01h59_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/56e89cbb-d4e1-63a2-7b3d-deeb3bba2614.png)
- テーブル項目
![2022-12-06_08h16_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a51f9aac-a211-aaee-e46a-5a3c646ea9cb.png)

# 計算式プラグインの設定

![2022-12-06_02h24_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/866a7cb0-f3e3-e4e2-719b-eff128b5656d.png)

費用合計の計算式：
LET(code,費用コード,
  TR_SUM(SUMIF(費用コード=code,費用),FIRSTIF(費用コード2=code,実績))
)

# 項目検証プラグインの設定

![2022-12-06_02h33_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f646b5c0-2c89-08fa-f851-cc7200cb6333.png)

費用の条件：
予算<費用合計

# 作業用項目を非表示

予算・実績の比較チェックが問題なくだ動作したら、費用コード1, 費用実績（テーブル）の作業用項目を非表示にします。

## 費用コード1, 費用実績（テーブル）を非表示にした編集画面
![2022-12-06_08h04_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2e3b6117-b2fb-9a8b-d9e0-b61097b5a8fa.png)
## 項目検証プラグインによる非表示
※画面のイベント処理で非表示処理を行うため、一瞬項目が表示された後に非表示になります。

![2022-12-06_08h03_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/364716b0-4dbd-e84d-29e9-c3831e3c1859.png)

## 項目非表示プラグインによる非表示
※CSSで非表示にするため、画面表示時に非表示になります。
![2022-12-06_08h18_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8a399f07-3ef1-193d-5d32-2a8c672df49a.png)
Next.js13の新機能


# Next.js13の新機能

next.jsを最近学び始めたので、next.js13の機能も調べてみた。


## 新機能および変更
<dl>
  <dt>・appディレクトリ (ベータ版)</dt>
  <dd>レイアウト</dd>
  <dd>React サーバー コンポーネント</dd>
  <dd>ストリーミング</dd>
  <dt>・Turbopack (アルファ版):最大 700 倍高速な Rust ベースの Webpack の置き換え。</dt>
  <dt>・next/image:ネイティブ ブラウザの遅延読み込みで高速化。</dt>
  <dt>・@next/font(ベータ版):レイアウト シフトがゼロの自動自己ホスト フォント。</dt>
  <dt>・next/link: API を自動で簡素化<a>。</dt>
</dl>

### app ディレクトリ
 ディレクトリによってルーティングを行う機能（ベータ）
 各ディレクトリに設置されたpageファイルが自動的に読み込まれます。
オプションなので明示的に設定を変更する必要があります。
```
const nextConfig = {
  reactStrictMode: true,
  swcMinify: true,
  experimental: {
    appDir: true, //appDirを追加してtrueにする
  },
};
module.exports = nextConfig;
```

### Layouts - レイアウト
 ディレクトリ単位で設定したレイアウトファイルをネストすることができます。

### Reactサーバーコンポーネント （RSC）
 appディレクトリの場合、作成したファイルはデフォルトでServer Componentでフェッチの処理を記述するとサーバーサイドで処理が行われます。
Reactサーバーコンポーネントではサーバとクライアントが連携してRactアプリケーションのレンダリングを行うことによって、一部のコンポーネントがサーバでレンダリングされ、他のコンポーネントがブラウザ（クライアント）によってレンダリングすることを可能にしています。

### ストリーミング
サーバーコンポーネントとNext.jsのネストされたレイアウトを仕様し、データを必要としないページ部分を即座にレンダリングし、データを取得しているページの部分の読み込み状態を表示できます。これによりページ全体が読み込まれるのを待たずに操作を開始できます。


### Turbopack
従来のWebpackから、RustベースのTurbopackが含まれています。
* Webpackよりも700倍高速な更新
* Viteよりも10倍高速な更新
* Webpackよりも4倍高速なコールドスタート

### next/image
* クライアント側のJavaScriptの出荷を減らす
* スタイルと設定がより簡単に
* altデフォルトでタグを必要とし、よりアクセスしやすい。
* Webプラットフォームと連携
* ネイティブの遅延読み込みはハイドレーションを必要としないため高速

※ハイドレーション:HTMLに付随したJavaScriptを利用してイベントリスナを登録することでインタラクティブなページを生成する過程のことをいいます。

### @next/font
* カスタムフォントを含むフォントを自動的に最適化します。
* プライバシーとパフォーマンスを向上させるための外部ネットワーク要求を削除します。
* 任意のフォントファイルのビルドイン自動セルフホスティング
* CSSの size-adjustプロパティを使用してレイアウトシフトを自動的にゼロにします。

ビルド時にダウンロードされ静的にアセットとともにホスティングされ、ブラウザからGoogleにリクエストを送信しません。

### next/link
* &lt;link&gt;タグに&lt;a&gt;タグを記述しなくてもよくなりました。

```
import Link from 'next/link'

// Next.js 12: `<a>` タグが必要
<Link href="/about">
  <a>About</a>
</Link>

// Next.js 13: `<Link>` always renders `<a>`
<Link href="/about">
  About
</Link>
```

### その他
* Open Graph Protocol を介してソーシャル メディア画像の生成を最適化する
* Internet Explorerのサポート外

#### 終わりに
まだ、next.jsの勉強中ですが、アップデートだけを調べても勉強になりました。


・RSCの解説で参考にしたサイト
https://postd.cc/how-react-server-components-work/#01

・ハイドレーションについて参考にしたサイト
https://nishinatoshiharu.com/next-hydration-warning-resolution/#Hydration
MongoDBの学習に参考にしたサイト／書籍まとめ

# 概要

MongoDBの学習に参考にしたサイト／書籍を紹介します。
公式サイトは基本的に英語でとっつきにくいですが、日本語でも十分に纏められいてるものはあるので紹介します。

# 参考になる文献等(日本語ソース)

## [MongoDBの薄い本](https://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf)

2018年10月出版でバージョン的には2.6版となっていますが、基本的なことはバージョンが上がっても同じなので取っ付き時は古いバージョンのものでも参考になります。
本当に薄い本(40ページ程度)なのでサクッと読むことができます。

クエリの部分は2.6版向けということもあり、少し情報不足なので、他の情報ソースから補う必要はあります。

## [RDBエンジニアでもできる！MongoDBの構築と運用入門 (技術の泉シリーズ（NextPublishing）) ](https://www.amazon.co.jp/dp/B09MW2Z87F)

発売日: 2021/12/10
紙の本は定価2,200円ですが、Kindle Unlimited対象(2022/12/06時点)なのでKindle Unlimited会員の方にはおすすめします。

発売日も2021年末で比較的新しいもので、バージョン的には4.4向けで書かれています。
構築や運用について詳しく記載されています。

## [MongoDB 解体新書: これ１冊で即実践レベル！究極の入門書 (専門書)](https://www.amazon.co.jp/dp/B07BGC4MJ1)

発売日: 2018/3/12
こちらもKindle Unlimited対象(購入の場合1,250円)なのでKindle Unlimited会員の方にはおすすめします。
バージョン的には3系列を対象としていますが、今回紹介している日本語のソースの中では一番詳細に書かれていると思います。(ただしページ数的にも大分ボリューミーなので全部目を通せているわけではです。)

JavaとNode.jsでのサンプルプログラムも記載されています。


# その他

## [公式ドキュメント](https://www.mongodb.com/docs/)

何はともあれ公式ドキュメントには目を通すようにしましょう。
英語ではありますが、[DeepL](https://chrome.google.com/webstore/detail/deepl-translate-reading-w/cofdbpoegempjloogbagkncekinflcnj)や[Google翻訳等](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb)の拡張機能をうまく使って正しい情報を得るようにしましょう。

## [MongoDB Developer Community](https://www.mongodb.com/community/forums/)

MongoDB公式の方で提供されているコミュニティで
既存の質問を読み漁ると同じところで躓いている人も多く居るため、参考にしています。

英語でコミュニケーションの取れる方は質問をするのもいいかもしれません。

## [StackOverflow](https://stackoverflow.com/)

MongoDB Developer CommunityだけでなくStackOverflowにも情報が転がっていることが多いです。
日本語で既存の質問を探したり、自分で質問したりすることも可能ですが、英語版のほうが絶対量は多いため、

日本語版：https://ja.stackoverflow.com/
英語版：https://stackoverflow.com/

# 終わりに

日本語で情報を共有(出版)してくださっている方、ホント助かりますm(_ _)m

今では完璧では無いにしても翻訳の拡張機能を使ったりすることで英語のサイトでもある程度理解できる程度に翻訳してくれます。
英語だからと言って恐れることなく調べていくと新たな発見につながることも多いので、英語のサイトでもしっかり目を通すことをおすすめします。
複数のGithubアカウントでssh接続設定時、No such file or directoryのエラーが出てしまう

# 行っていたこと
メインで使っていたアカウントとは別でサブのアカウントでgit cloneしたかったため
[[備忘] 複数Githubアカウントでssh接続設定(config)を使い分ける手順](https://qiita.com/yampy/items/24638156abd383e08758)
こちらの記事を参考に進め、ssh接続をテストするために
```
% ssh -T git@github.com.sub
```
こちらのコマンドを実行したところ、エラーが出ました。
```
no such identity: /Users/ユーザー名/.ssh/id_rsa_sub?\200\200: No such file or directory
git@github.com: Permission denied (publickey).
```
# 原因調査
エラー文をよく見てみるとファイル名の後ろに「?\200\200」という文字があります。
.ssh配下の"id_rsa_sub?\200\200"というファイルを探してしまっているので`No such file or directory`とエラーが出ています。

しかしそんなファイル名にした覚えがないので`~/.ssh/config`を確認してみます。

```~/.ssh/config
Host github.com.main # メインアカウント
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa_main  # メインアカウント用の鍵
  TCPKeepAlive yes
  IdentitiesOnly yes

Host github.com.sub # サブアカウント
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa_sub　　# サブアカウント用の鍵
  TCPKeepAlive yes
  IdentitiesOnly yes
```
どこも間違えているところはない、、、と思っていたのですが、よく見てみると`~/.ssh/id_rsa_sub`の後ろに全角スペースがありました。チクショウ！！

# 最後に
全角スペースを解消し、もう一度`% ssh -T git@github.com.sub`を実行すると接続が成功したのが確認できました。
```
Hi {Githubアカウント名}! You've successfully authenticated, but GitHub does not provide shell access.
```

全角スペース一つでうまくいかないもんですね。
この記事が誰かのお役に立てれば幸いです。
selfでクラス変数にアクセスしようとするとどうなるのか？

<details><summary>事前知識：インスタンス変数とクラス変数について</summary><div>

## インスタンス変数
それぞれのインスタンスごとに独立した変数

### 宣言する方法
`self.変数名 = 値`
一般的にコンストラクタの内部で宣言される。

### アクセス方法
`self.変数名`

### 例
```python
class MyClass:
    def __init__(self, name): # コンストラクタ：インスタンス作成時に自動的に呼ばれる
        self.name = name     # インスタンス変数 name を宣言する

    def getName(self):    # インスタンス変数 name の値を返す関数
        return self.name     # インスタンス変数 name にアクセスし、値を返す

if __name__ == "__main__":
    a = MyClass("Sato")        # インスタンス a を作成
    b = MyClass("Tanaka")        # インスタンス b を作成

    print(a.getName())            # Sato
    print(b.getName())            # Tanaka

```

## クラス変数
全てのインスタンス間で共通した値を持つ変数

### 宣言する方法
```python
class MyClass:
	クラス変数 = 値
```

### アクセス方法
**クラス名.**変数名

### 例
```python
class MyClass:
    number = 5
    def __init__(self): # コンストラクタ：インスタンス作成時に自動的に呼ばれる
        MyClass.number += 1     # クラス変数 number の値に1を足す

    def getNumber(self):    # クラス変数 number の値を返す関数
        return MyClass.number     # クラス変数 number にアクセスし値を返す

if __name__ == "__main__":
    a = MyClass()        # インスタンス a を作成
    print(a.getNumber())            # 6
    b = MyClass()        # インスタンス b を作成
    print(b.getNumber())            # 7
```
</div></details>

# selfでクラス変数にアクセスしようとするとどうなるのか？
「self.変数名」としたときの挙動は以下のようになる。
- 同名のインスタンス変数が存在する場合
  - インスタンス変数を参照する
- 同名のインスタンス変数が存在しないが、クラス変数は存在する場合
  - **クラス変数を参照し、同名のインスタンス変数を新たに生成する**
- 同名のインスタンス変数もクラス変数も存在しない場合
  - エラーを返す

ここで、**クラス変数の型によって、selfでアクセスした際に値が変更できるか否かが変わる。**

## クラス変数がイミュータブルなオブジェクト（数値や文字列）な場合
  - 同名のインスタンス変数が新たに生成される際に、**値渡し**でコピーが生成されるため、**値が変更できない。**※
## クラス変数がミュータブルなオブジェクト（リストや辞書）な場合
  - 同名のインスタンス変数が新たに生成される際に、**参照渡し**でコピーが生成されるため、**値が変更できる。**※

※追記：厳密には、Pythonには情報処理用語でいうところの「参照渡し」の操作は存在せず、値渡しのみ。ただし、ミュータブルなオブジェクトの演算の際はオブジェクトのメソッドが呼び出されるため、オブジェクト自身の値が変更可能。詳細はコメント欄参照。

:::note info
これらの挙動は = で代入するときと同様。
参考：https://qiita.com/hrs1985/items/4e7bba39a35056de4e73
:::

### 例
```python
class MyClass:
    number = 5
    number_list = [5]
    def __init__(self): # コンストラクタ：インスタンス作成時に自動的に呼ばれる
        self.number += 1     # クラス変数 number の値で初期化されたインスタンス変数numberが生成され、インスタンス変数numberに1を足す
        self.number_list[0] += 1     # クラス変数 number_list のリストで初期化されたインスタンス変数number_listが生成され、インスタンス変数number_listの0番目の要素に1を足す

    def getNumber(self):    # インスタンス変数 number の値を返す関数
        return self.number     # インスタンス変数 number にアクセスし値を返す

    def getNumberList(self):    # インスタンス変数 number_list の値を返す関数
        return self.number_list[0]     # インスタンス変数 number_list にアクセスし値を返す

if __name__ == "__main__":
    a = MyClass()        # インスタンス a を作成
    print(a.getNumber())            # 6
    print(a.getNumberList())            # 6
    b = MyClass()        # インスタンス b を作成
    print(b.getNumber())            # 6
    print(b.getNumberList())            # 7
```

## 参考文献
- [Pythonのクラス変数とインスタンス変数](https://uxmilk.jp/41600)
- [とほほのPython入門 - クラス](https://www.tohoho-web.com/python/class.html)
- [Pythonの引数における参照渡しと値渡しについて](https://www.javadrive.jp/python/userfunc/index3.html)
- [Pythonのリストで参照渡しでないコピーを作成する話](https://qiita.com/hrs1985/items/4e7bba39a35056de4e73)
UnrealEngineプロジェクト起動時のエラー:The following modules are missing or built with a different engine version

備忘録
対象エラー
>The following modules are missing or built with a different engine version:
UE4Editor-[パッケージ名].dll
Would you like to rebuild them now?

>[パッケージ名] could not be compiled. Try rebuilding from source manually.

解決
- .Net関連を最新化(SDK,runtime,framework)
- Unreal Engine 用に Visual Studio をセットアップする
VisualStudioInstallerにて下記を有効にする
Game Development with C++
Unreal Engine installer
- .uprojectファイルから.sln(Visual Studio ソリューション)を生成する
生成した.slnをVisualStudioでビルド

参考サイト

https://qiita.com/chano2/items/517157c412ce5b03e905

https://forums.unrealengine.com/t/the-following-modules-are-missing-or-built-with-a-different-engine-version/475289

https://forums.unrealengine.com/t/cant-open-ue5-demo-the-required-library-hostfxr-dll-could-not-be-found/231688
ドキュメントオブジェクトモデル

# 木構造の各要素ノード
DOMのルートノードは```document```で```<html>```要素がその```唯一の子ノード```。
```<html>```には2つの子ノード(<head>要素と<body>要素)がある。

### ノードの種類
* 親ノード
* 子ノード
* 子孫ノード
* 祖先ノード

### document
```document```も含めDOMツリーの各ノードはクラスNodeのインスタンス。
Nodeのオブジェクトはプロパティとして親や子の要素を表す```parentNode```や```childeNodes```を持っているほか```nodeName```や```nodeType```といった識別のためのプロパティも持っている。

```js
<script>
      console.log('その客は'); 
```
コンソールに表示される。
```js
      console.log(document instanceof Node);//true
```
```instanceof``` 演算子でオブジェクトが特定のクラスに属しているのかを確認することができます。
### 出典
https://ja.javascript.info/instanceof#:~:text=instanceof%20%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%A7%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8C%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AB%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

documentはNodeクラスのインスタンスなのでtrue
```js
      console.log(document.parentNode); //null
```
documentには親のノードがいない
```js
      console.log(document.childNodes);
      // NodeList(2) [<!DOCTYPE html>, html.client-nojs]
```
documentの子要素を表す。
```js
      console.log(document.nodeType); //9
```
```.nodeType``` ノードの種類を取得
### 出典
https://www.javadrive.jp/javascript/dom/index9.html
```js
      console.log(document.nodeName);//#document
```
```.nodeName```　ノードの名前を取得
### 出典
https://www.javadrive.jp/javascript/dom/index10.html
```js
      const children = document.childNodes;
      console.log(`子供の数${children.length}`); //子供の数２
```
```.length``` 子要素の数を表示
```js
      console.log(children[0]);
      console.log(children[0].nodeType);

      console.log(children[1]);
      console.log(children[1].nodeType);
      console.log(children[2]);

      console.log(Node.ELEMENT_NODE);
      console.log(children[1].nodeType === Node.ELEMENT_NODE);
      console.log(Node.TEXT_NODE);
      console.log(children[1].childNodes[1].childNodes);
  </script>
```
# 感想
まだわからないことだらけだ。
勉強しよう。

# 出典
https://www.oreilly.co.jp/books/9784873117836/
CMake + Visual Studio でビルドコア数を設定するメモ

CMake で Visual Studio generator で Solution ファイル作ってビルドするとなんか遅い...

ninja generator とか使いたくない...(Visual Studio でエラーのキャッチとか quick fix ジャンプがうまくいかないときがある)

Visual Studio GUI で開発しつつビルドやりたいので, CLI で msbuild とかでジョブ数指定してビルドはしたくない.

そもそもデフォルトだとマルチコアビルドしてくれないっぽ?

## 方法

ぱぱっとやる方法はないようで, `/MP` コンパイルオプションをつけるしかないようです.

VTK の設定が参考になるでしょう.

https://github.com/Kitware/VTK/blob/592fb7826f67d043d40dac96bf7acb2ff06a2490/CMake/vtkCompilerPlatformFlags.cmake#L121

最近の cmake であれば, `CMAKE_CXX_FLAGS` に `/MP` 追加ではなく, `target_compile_options` で設定が推奨です!


## 注意点

Visual Studio 側の project 設定で CPU 制限している場合はそちらが優先されると思います.

https://stackoverflow.com/questions/35974304/c-how-to-limit-visual-studios-multi-processor-compilation
iframe表示部分のクリックイベントを取得する

# はじめに
ページ内のクリックを検知して処理を実行する実装をしていた際に、ページ内のiframe表示している部分のクリックイベントが上手く取得出来ておらず、検知する為に取った方法を記します。

[ソースコード](https://github.com/manzoku-bukuro/qiita/tree/main/iframe-detect)

# この記事の対象者
- クリックイベントを検知するような処理で、iframe内のクリックも検知したい人
- ページで埋め込んだiframe部分に対し、addEventlistenerを付与したい人
- ページで埋め込んだiframe部分のwindowオブジェクトを取得したい人

# iframe表示部分のクリックイベントを取得する
## 前提
あなたが作成中のページにiframe表示している部分があるとします。作成中のページのどこかをクリックしたら検知して、何かしらの処理を実行したいと思っています。
![スクリーンショット 2022-12-04 1.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/d1a5c491-c364-6c13-33fb-c2611a83c983.png)

### 使用するHTML部分
```html
<div class="pageWrapper">
    <iframe src="~~~"></iframe>
</div>
```

## (失敗)window.addEventlistenerでclickイベントを検知する
当然のように最初に試したことは、window.addEventlistenerでclickイベントを検知する方法です。造作もなくこれで完了だと思っていました。

以下script部分になります。
```js
window.addEventListener("click", () => {
    alert("clickを検知しました");
})
```

これで画面内を触ってみます。以下確認環境です。

[確認環境](https://manzoku-bukuro.github.io/qiita/iframe-detect/not_detect.html)

![スクリーンショット 2022-12-04 21.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/754d0a91-40ec-d9be-0abc-7a12511e3c65.png)

iframeエリア外をクリックするとalertが表示されますが、iframeエリアをクリックしてもalertが表示されないことがわかると思います。

どうやらiframe内のイベントは親フレームでは取得出来ないようです。ではどうしても親フレームでイベントを検知したい場合はどのようにすれば良いでしょうか？

## 方法1.iframe要素のcontentWindowに対しaddEventlistenerを登録する
まずiframe要素を取得します。私はquerySelectorを使用しました。そして取得したiframe要素に対してcontentWindowプロパティを使用することで、iframe内部のWindowオブジェクトにアクセスすることが出来ます。

iframe内部のWindowオブジェクトにアクセスすることが出来たら、親ページと同様addEventlistenerを登録することでiframeに対して
イベントを検知することが可能になりました。

[確認環境](https://manzoku-bukuro.github.io/qiita/iframe-detect/detect.html)

```js
window.addEventListener("click", () => {
    alert("clickを検知しました");
})

// DOMツリー構築後にiframe要素を取得して、addEventlistenerを登録する
window.addEventListener("DOMContentLoaded", () => {
    const iframeElement = document.querySelector("iframe");
    iframeElement.contentWindow.addEventListener("click", () => {
        alert("clickを検知しました");
    })
})
```

![スクリーンショット 2022-12-06 1.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/361a11df-090f-2ff5-83d4-7984bd59a463.png)

これでiframeエリアのclickイベントも検知することが出来ました。

### 注意点
埋め込んだiframeのWindowオブジェクトにアクセスするには、埋め込んだ親ページとiframeのページが同一のオリジンである必要があります。

なので自身のページに埋め込んだ全く無関係のページに対しcontentWindowにアクセスしてどうこうすることは出来ませんのでご注意ください。

# さいごに
この記事ではページに埋め込んだiframe要素に対して、contentWindowにアクセスしてaddEventListenerを登録する方法を説明しました。

それ以外の方法では、iframe内と親ページとでpostMessageを利用してやり取りする方法があります。そのやり方については別の記事で紹介しようと思います。
アウトプットを継続するために意識した3つのこと

# 概要
アウトプットを継続するにあたって、意識するポイントを3つ決めて実践・振り返りをしました。

# 目的
この記事を読むことで、アウトプットの続け方の参考になればいいなと思っています。
また、筆者としてはアウトプットドリブンで何かをアウトプットすることで、今後の継続に繋げていきたいと思います。

# 目指す姿
筆者の現状は三日坊主で継続に課題を感じる状態です。
目指す姿として、アウトプット継続できるマン＝アウトプットの習慣化を目指したいと思っています。
イメージとしては歯を磨くように毎日無理なくアウトプットできる状態が理想です。

# アウトプットへのモチベーション
そもそも、なぜアウトプットをしたいのでしょうか？
僕は人生を変えたいからではないかと思います。
* アウトプット＝なにかしら行動すること

と、ここでは定義しますが、考えを頭の外に出さない限り現実世界は変わりません。
得られた結果から考えや行動を更新していくことを繰り返します。

# 課題設定
ここでは、目標であるアウトプットの習慣化を噛み砕いてみます。

* アウトプットの習慣化＝アウトプット＋習慣化
    * アウトプット：どうやってアウトプットすればいいのか
    * 習慣化：どうやったら継続できるようになるのか

目指している目標は、実は2つの課題が組み合わさってできているようです。
それでは、どうやったら実現できるのでしょうか？

# やったこと
## アウトプットするために
まずアウトプットをするために何冊か本を読んでみました。
そこで得られた知見の中から3つほど意識すべきことを決定しました。
1. 目的と目標の明確化
1. 仕組みづくり
1. 目の前のことに集中する

この3つに決定しました。
それぞれ順に解説します。

### 目的と目標の明確化
目的(Be)と目標(Do)を決めます。
目的は、「〜になる」のような定性的な状態を、
目標は、達成ができたか確認できるよう数字を意識するように決定しました。

目的：アウトプットが習慣化できる
目標：1日に1回何かしらの記事を投稿する

### 仕組みづくり
2つ目は、習慣を継続するためのポイントを選択しました。
#### 小さくはじめる
何事も大きい目標を目指していますが、習慣化する上では着実に一歩を踏み進めることが重要です。
そこで、日々の目標として如何にハードルを下げるかがポイントになってきます。

今回の目標ではどうでしょうか？まだタスクが大きい気がします。
もう少しタスクを分解してみましょう。
* タスクの分解：記事を書くためのToDo
    * インプット
    * 記事の構成検討
    * 記事の作成

やらなきゃいけないことはざっくり上記3つ程度に分解できそうです。

そう考えると、これを毎日続けるのは難しそうですね。
「1日に1回投稿できる記事」ということを意識するともう少し簡単にしても良さそうです。

* タスクの再分解
タスクを簡単にするために更に細かくしてみます。

    * インプット
        * 題材を決める
        * 題材を読む
        * メモを取る
    * 記事の構成検討
        * わかったこと
        * 気になったこと
        * その他
    * 記事の作成
        * 箇条書き

ここまで分解できるとやることが明確になり毎日やるのもすこし楽になりそうです。
記事構成検討段階でわかったこと・気になったことを箇条書きにするだけでも十分練習になりそうです。

#### If-Thenルールの作成
If-Thenルールとはアルゴリズムのように「〜〜〜したらXXXする」という習慣化のためのルールです。
「寝る前に歯を1本フロスする」などのようにルールを決めます。
アンカーと呼ばれるきっかけを決めることで重い腰を上げる負荷を軽減できることができます。

今回は以下のようにしました。
* 朝デスクに座ったら今日の題材を決める

### 目の前のことに集中する
最後は、いかに集中力を切らさないでタスクに取り組むかです。

* TODOリストの作成
    * 紙にタスクの分解したものを記載しておく
まずは分解したタスクを紙に書き出しておきます。
紙に書き出して手元に置き、いつでも見れるようにしておきます。

* ポモドーロ・テクニックの活用
こちらは最近試していることですが、25分の活動・5分の休憩のサイクルを回すポモドーロ・テクニックです。
意識的に休憩を挟むことで集中力を作るようにしてみます。
参考：https://www.youtube.com/watch?v=NirXLsI7BXk

## やってみた
これまでのことを試しつつ、アウトプットができるか試してみました。
結論から言うと、習慣化までは難しく途中でアウトプットが継続できていない状況です。

振り返りつつ、改善ポイントを探していきます。

### 気づいたこと
* Bad: デスクに座るとすぐ仕事をしなくてはならなかった
* Good: ToDoリストを手元においているとやるべきことを意識しやすい
* Good: タスクを再分解したことで個々のタスクへのハードルは下がっていた

### なぜ続かないのか
* タスクに取り掛かるタイミングを確保できなかった
* 継続できない状況で目標を意識することができなかった

### どうしたらできるのか
* If-Thenルールのタイミング再考
自分の時間を意識的に確保できるタイミングなどにアンカーを設定する必要がありそうです

* 目標やタスクの可視化
タスクはToDoで可視化していましたが、目標はいつでも見える位置にはありませんでした。
手元にいつでも見える状態にしておくことで、意識を向ける機会が増えるのではないかと感じます。

# まとめ
アウトプットを継続するために意識することを決めて施してみました。
結果としては継続できませんでしたが、学びもあったので、修正と実践を繰り返し実践していくのが良さそうです。

ご覧いただきありがとうございました。
【HTML/CSS】レイアウトの整え方あれこれ②

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

こんばんは、aogiriです！
日に日に寒さも厳しくなってきている感がありますね･･･
仕事柄、24時前後に帰宅することになるのですが、
帰ってきたときの部屋の寒さよ･･･❄
37歳のおっさんには沁みます、えぇ･･･😢

さてさて、そんなことはさておき！
<b>レイアウトの整え方あれこれ・第2回</b> です！
レイアウトのコードをしっかり押さえておかないとマズイので、
明日の自分のために書き残しておきます。

◎ <b><font color=#ffaa00>ブロック要素（ブロックレベル要素）</font>・ <font color=#00dd00>インライン要素</font> ・ <font color="00aaff">インラインブロック要素</font></b>

　⑴　<b><font color=#ffaa00>ブロック要素（ブロックレベル要素）</font></b>
　　（例）見出しタグ（<b>div</b>・<b>p</b>・<b>h1</b> など）、<b>header</b>・<b>main</b>・<b>footer</b> など
　　　・イメージ ･･･ <b><font color=#ffaa00>その1行全体で1つの長方形</font></b>

　　　　・要素の並び方　　　　　　→ <b>縦向き</b>
　　　　・width 、height の指定　　→ <b>可</b>
　　　　・margin 、padding の調整　→ <b>可</b>
　　　　・text-align 、vertical-align の指定　→ <b>テキストにのみ反映</b>

　⑵　<b><font color=#00dd00>インライン要素</font></b>
　　（例）<b>a</b>・<b>span</b>・<b>img</b> など
　　　・イメージ ･･･ <b><font color=#00dd00>その1行のうちの一部分</font></b>

　　　　・要素の並び方　→ <b>横向き　<font color=red>※親要素の端で改行される</font></b>
　　　　・width 、height の指定　→ <b>不可</b>
　　　　・margin 、padding の調整　→ <b>左右のみ可</b>　<b><font color=red>※上下を指定すると表示崩れ</font></b>
　　　　・text-align 、vertical-align の指定　→ <b>親要素に対して指定すると反映</b>

　⑶　<b><font color="00aaff">インラインブロック要素</font></b>
　　（例）<b>a</b>・<b>span</b>・<b>img</b> など
　　　・イメージ ･･･ <b><font color="00aaff">ブロック要素とインライン要素の良いとこ取り</font></b>

　　　　・要素の並び方　→ <b>横向き　<font color=red>※親要素の端で改行される</font></b>
　　　　・width 、height の指定　→ <b>可</b>
　　　　・margin 、padding の調整　→ <b>可</b>
　　　　・text-align 、vertical-align の指定　→ <b>親要素に対して指定すると反映</b>

自分なりのイメージで書いたけれど、伝わるかな･･･💦
伝わらなければ、<b>「まだ説明できるだけの理解には至っていない」</b>だと思って、
さらに精進したいと思います。

今日はここまで！
ご覧いただき、ありがとうございました！
xrdp でRDP Proxy ゲートウェイ を作る話(1)　〜前提編〜

# xrdp でRDP Proxy ゲートウェイ を作る話(1)　〜前提編〜

## はじめに
[xrdp](http://xrdp.org/)はリモートLinuxホストにGUIログインするために広く使われているOSSです。<br>
接続プロトコルとしてMicrosoftリモートデスクトッププロトコル(RDP)を使います。
Windows標準搭載のRDPクライアント(MSTSC.exe)を利用できることが利点です。
<br>

あまり知られていませんが、このxrdpはRDP Proxy機能を持っています。

RDPクライアント —(RDP)— xrdp —(RDP)— RDPサーバー

という経路の接続が可能です。

業務用ネットワークと検証環境ネットワークとの境界に設置するような使い方ができます。

大規模で本格的な環境ではWindows Server に RDゲートウェイを設定する方法がありますが、xrdpはより小規模でシンプルなRDPゲートウェイとなります。

ここでは　xrdp を　RDP Proxy ゲートウェイとして構築する方法をご紹介します。

## 必要なもの
GatewayサーバのホストOSとしてLinuxが必要です。<br>
ディストリビューションの標準パッケージのxrdpではRDP Proxyモードは有効化されていないため、build環境とソースコードを準備してコンパイルする必要があります。

RDP Proxy モードのコンパイルのためには依存ライブラリとして　[NeutrinoRDP](https://github.com/neutrinolabs/NeutrinoRDP)が必要です。
NeutrinoRDPとは FreeRDP 1.0.1のforkで実質的に xrdp の RDP Proxyモード専用と言えるライブラリです。ファイル名が重複するためFreeRDP1.xと共存できないためかどのディストリビューションにもバイナリパッケージが用意されていません。xrdpの前に自分でbuildする必要があります。

まとめると、以下が必要です。
* Linux ホスト
* build環境
* [NeutrinoRDPソース一式](https://github.com/neutrinolabs/NeutrinoRDP)
* [xrdpソース一式](https://github.com/neutrinolabs/xrdp)

## 次回予告
代表的なディストリビューション向けのbuild方法を紹介します。
サクラエディタマクロ　指定桁で折り返し

タイプ別設定『スクリーン』でファイルタイプごとの折り返し桁が設定可能。

レコード区切りの改行コードがない固定長レイアウトのファイルを扱うことが多いため、
見るファイルごとに折り返し桁を変更するためマクロ作成。


使用しているサクラエディタ：
v2.4.1.2849 32bit (tag v2.4.1)

# 固定値で折り返し

折り返し桁を132桁に設定して、指定桁で折り返し。

```:SK_折り返し設定_132桁.mac
// サクラエディタ  キーマクロ

//折り返し桁数設定
ChangeWrapColm(132);

```

# 入力値で折り返し

入力ダイアログで指定した桁数で折り返し。

固定値版が増えていったので、入力するタイプも作ってみた。

```js:SK_折り返し設定_入力桁.js
// サクラエディタマクロ  WSH(JScript)
// -----------------------------------
// 入力値で折り返し
// -----------------------------------

var newWidth = InputBox("折り返し桁を入力　有効桁数：10～10240","",5);

Editor.ChangeWrapColm(newWidth - 0);

```

# ChangeWrapColm 関数補足
ヘルプの関数解説からの抜粋
* 有効な桁数の範囲は10～10240。範囲外の桁数では折り返し桁数を変更しない。
* 実行すると折り返し方法は自動的に「指定桁で折り返す」になる。
* 折り返し桁の変更はマクロを実行した画面にだけ適用され、設定の保存は行われない。
* 使用可能バージョン　sakura:1.6.3.0以降
  キーマクロ(.mac)形式ではsakura:1.6.5.0以降
Goの関数ではゼロ値はリテラルで返してほしい気持ちをLinterで綴る

## 何を作ったのか

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

以下のような、変数をそのまま返しているやつ嫌ですよね。それをチェックするツールを作りました。

```go
func f() struct{} {
        v := struct{}{}
        return v // ヤダ
}

func g() (v struct{}) {
        return v // ヤダ
}
```

https://github.com/gostaticanalysis/zerolit

## どう作ったのか

Goには静的解析ツールを作る機能が標準ライブラリで提供されています。詳しくは[分厚いスライド](https://tenn.in/analysis)をご覧ください。

ざっくりとしたアルゴリズムは以下の通りです。

* 代入文を探し、ゼロ値じゃない値を代入しているものに印を付ける
* `return`文で変数を返しているものを見つける
* その変数がゼロ値じゃない値を代入してる印がついていなければエラー
OperationalError: table xxx already exists を修正する

# 例外の再現

```python
import sqlite3

con = sqlite3.connect('test.sqlite3')
cur = con.cursor()
cur.execute('create table yutai(column1 , column2)')

---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
セル11 を c:\xxx\test.ipynb in <cell line: 4>()
      2 con = sqlite3.connect('yuutai.sqlite3')
      3 cur = con.cursor()
----> 4 cur.execute('create table  yutai(test1 ,test2)')

OperationalError: table yutai already exists
```


# 原因
google翻訳で調べると、OperationalError: テーブル xxx は既に存在しますと表示されます。
テーブルを作成した後に同じテーブルを作成しようとする発生するみたいですね。


# 解決方法

```python
import sqlite3

con = sqlite3.connect('test.sqlite3')
cur = con.cursor()
cur.execute('create table IF NOT EXISTS yutai(column1 , column2)')
```

create tableの後に 「 IF NOT EXISTS 」を記述する。
データベースに同じテーブル名が存在していても例外が発生しなくなりました。
【完走賞ゲット-6】「WebHID DualShock 4 Demo」というサイトを軽く試してみる

## はじめに
こちらは、[完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022](https://qiita.com/advent-calendar/2022/youtoy) の 6日目の記事です。

内容は、[DualShock 4 ワイヤレスコントローラー](https://www.playstation.com/ja-jp/accessories/dualshock-4-wireless-controller/)を使った、以下のサイトのお試しです。

●WebHID DualShock 4 Demo
　https://thebitlink.github.io/WebHID-DS4/

上記は、DualShock 4 を使った [WebHID API](https://developer.mozilla.org/ja/docs/Web/API/WebHID_API) のテストが行えるサイトのようです。

## DualShock 4 について
こちら、toio を使った開発をいろいろ検討している話を @akichika さんに話した際に、お借りできる流れになった DualShock 4 の写真です。

https://twitter.com/youtoy/status/1599791339117621248

DualShock 4 は使ったことがなく、今回が初使用です。
それで、軽く仕様を調べるところからやってみます。

### DualShock 4 の仕様（GIGAZINE　の情報）
DualShock 4 の仕様を確認してみようかと、「DualShock 4 の仕様」をキーワードにして検索をしてみました。
そこで、トップに出てきた以下の GIGAZINE の記事を見て、ざっくりと機能を見てみることにしました。

●PS4専用ワイヤレスコントローラー「DUALSHOCK 4」の機能・仕様詳細・画像まとめ - GIGAZINE
　https://gigazine.net/news/20130221-ps4-dualshock4/

以下に、気になった部分を取り上げてみます。

#### ライトバーについて
![ライトバーについて](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4bec50b6-34e2-da05-7559-2a720b9f9acd.png)

#### 音に関する機能
![音に関する機能](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/cc0ba3c8-ed75-a522-1c50-4f857f4f01e1.png)

#### ハードウェアの仕様のコンパクトな記載
ハードウェアの仕様について、コンパクトに記載されている部分を見てみました。

![ハードウェアの仕様のコンパクトな記載](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f4a367b5-92f5-d2da-1aed-85dea6ca3323.png)

### DualShock 4 の仕様（公式情報）
また、公式の情報も見てみることにします。

![公式情報1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d874ceb7-893e-69b1-c4bf-089adb4cd3a6.png)

![公式情報2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b2bdc435-acff-b6b4-31ce-1863475beb49.png)

## WebHID DualShock 4 Demo で DualShock 4 を使う
それでは、上で掲載していたサイト「WebHID DualShock 4 Demo」で DualShock 4 を使ってみます。

### WebHID DualShock 4 Demo のページを使ってみる
DualShock 4　を USB で PC に接続し、その状態で[「WebHID DualShock 4 Demo」のページ](https://thebitlink.github.io/WebHID-DS4/)を軽く触ってみました。
![WebHID DualShock 4 Demo](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9bafe3b7-0b6c-35c5-473f-dbcf4097d07c.png)

「Connect Controller」と書かれたボタンを押下してみます。
![「Connect Controller」と書かれたボタンを押下](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/dda1b859-1ee1-e9ed-a2c0-964bb163d43e.png)
そこで「Wireless Controller」という表示が出てきているので、これを選んでみました。

そうすると、DualShock 4 のセンサー・ボタン等の情報をガッツリ取得できそうな表示が出てきました。

https://twitter.com/youtoy/status/1599798472882151424

そして、「Webサイトからコントローラー方向の処理」や、その逆方向の処理を試してみました。

https://twitter.com/youtoy/status/1599799982118539267

これは色々できて楽しそう！

## 終わりに
借り物の DualShock 4 で「WebHID DualShock 4 Demo」というサイトを使った WebHID のお試しをしてみました。

これは思った以上に色々できそうなので、さらに活用できればと思います！

### 余談
「WebHID ＋ ゲームコントローラー」の組み合わせは、以前 Joy-Con との組み合わせを試したことがあったのですが、こちらもあらためて見直して見られればと思いました。

https://twitter.com/youtoy/status/1446828637781594115

https://twitter.com/youtoy/status/1446829415703347201