OmniAICreator/Qiita-1.07M huggingface dataset:
NESエミュレータを作る-準備編

[PONOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ponos) 8日目です。
昨日は[@e73ryo](https://qiita.com/e73ryo)さんの[記事](https://qiita.com/e73ryo/items/892d026cc009925bddeb)でした。
# はじめに
RubyでNESエミュレータを作ってみました（現在進行系）。
作ってみて理解できたところ・ハマったところなどを書いていこうと思います。
これからエミュレータ作りをしてみようと思っている方の助けになれたら幸いです。
今回は準備編です。

# 用意するもの
### 使い慣れたプログラミング言語（重要）
なるべく慣れた言語で書きましょう。
僕は最初まったく分からないエミュレータをまったく分からないRustで書き始めて全然進まない状態になってました。
結局ある程度まではRustで作れたのですが現在Rubyで書き直しています。
言語によってはfpsが出ない場合もありますが良しとします。
Rustは何もわからないです。
### ROM
NESのロムを用意します。
今回は[こちら](http://hp.vector.co.jp/authors/VA042397/nes/sample.html)のサイトで提供されているサンプルロムを使用します。
Hellow, Worldを表示するだけのロムですがこれを動かせるように次回の記事で実装していきます。
市販のゲームを動かしたい場合は別途用意する必要があります。
### ファミコンのカセット（任意）
ゲームカセットは買っておくとスプライトを見て楽しめたり、これを動かすぞというモチベーションになって良いです。
駿河屋などで買いましょう。
エミュレータを作るだけならテスト用のロムもあるので必須ではありません。
中身の基盤を見たい場合は殻割りに挑戦しましょう。
爪を折らないように開ける方法が色々公開されています（僕は全部折りました）。
![PXL_20220323_042446340.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/7d0385d8-7cda-4f86-c362-4df09c9e71aa.jpeg)
### ROMダンパー（任意）
こちらも必須ではないですがゲームカセットからROMイメージを吸い出すのに必要です。
Amazonで買えますが結構お値段は高いです。
僕が買った[FC用のダンパー](https://www.amazon.co.jp/dp/B087GGBVMV)はUSBでPCに繋ぐだけでROMイメージを取り出せるので便利です。Macでも使えます。
いろんなハードの吸い出しをしたい場合は[ベース吸い出し機](https://www.amazon.co.jp/dp/B084CDGQX3)+各ハード用の別売り吸い出し機を買いましょう。
![PXL_20220422_005349219.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/24e952bb-6882-99ff-ca0f-e97494db2292.jpeg)

# 参考にしたサイト
* [ファミコンエミュレータの創り方　- Hello, World!編 -](https://qiita.com/bokuweb/items/1575337bef44ae82f4d3)
一番見た記事
* [NES研究室](http://hp.vector.co.jp/authors/VA042397/nes/index.html)
CPUを実装するときに参考にしました
* [NES Emulator from Scratch](https://www.youtube.com/playlist?list=PLrOv9FMX8xJHqMvSGB_9G9nZZ_4IgteYf)
画面作りの参考にしました

# 次回に続く
[続きます。](https://qiita.com/ackyla/items/c48b05ee4e67596f6130)
明日は@kerimekaさんです。
SvelteKitのFlowbite-Svelteを実装した話

# はじめに

SvelteKitの開発を始め、いくつかのUIコンポーネントを試しましたが、


* 一部のコンポーネントが動かない
* 一部のクラスが動かない

等の事象が発生し、なかなかこれだ！というものに決まりませんでした。。
(きっと私の構築方法が悪いんだと思いますが、、)


`Flowbite-Svelte`が私の環境では唯一ちゃんと動いたので実装方法を載せておきます。


# ①SvelteKitの構築

1. `SvelteKit`構築

    ```bash
    $ npm create svelte@latest
    Need to install the following packages:
      create-svelte@2.0.0-next.198
    Ok to proceed? (y) y
    
    create-svelte version 2.0.0-next.198
    
    Welcome to SvelteKit!
    
    This is release candidate software; expect bugs and missing features.
    
    Problems? Open an issue on https://github.com/sveltejs/kit/issues if none exists already.
    
    ✔ Where should we create your project?
      (leave blank to use current directory) … 
    ✔ Which Svelte app template? › SvelteKit demo app
    ✔ Add type checking with TypeScript? › Yes, using TypeScript syntax
    ✔ Add ESLint for code linting? … No / Yes ›  No
    ✔ Add Prettier for code formatting? … No / Yes ›  No
    ✔ Add Playwright for browser testing? … No / Yes ›  No
    ✔ Add Vitest for unit testing? … No / Yes ›  No
    
    $ npm install
    ```

1. localhost:8080で開くように調整する

    ```javascript
    // vite.config.js

    import { sveltekit } from '@sveltejs/kit/vite';
    
    /** @type {import('vite').UserConfig} */
    const config = {
    	darkMode: 'class',
    	plugins: [sveltekit()],
    	server: {          // 追加
    		host: true,    // 追加
    		port: 8080     // 追加
    	}                  // 追加
    };
    
    export default config;
    ```

    `8080`以外のポートを開けたい場合は`port`の部分を調整する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/86a7ad9e-5605-629f-5d90-a64b1f15c08d.png)

# ②Tailwind CSSのインストール

`svelte-add`を使って`tailwindcss`をインストール

```bash
$ npx svelte-add@latest tailwindcss
$ npm install
```

# ③Flowbite及び依存関係のインストール

```bash
$ npm i -D flowbite flowbite-svelte classnames @popperjs/core
```

# ④tailwind.config.cjsの修正

```javascript
// tailwind.config.cjs
const config = {
  content: [
    "./src/**/*.{html,js,svelte,ts}",
    "./node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}",
  ],

  theme: {
    extend: {},
  },

  plugins: [
    require('flowbite/plugin')
  ],
  darkMode: 'class',
};

module.exports = config;
```

# styles.cssの修正

デモアプリのcssが効いているので全て削除

# 完了

```vue
<script>
  import { Button } from 'flowbite-svelte';
</script>

<Button>デフォルトボタン</Button>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/8e895812-5410-eb67-5dd8-b0bf98306b2b.png)

今のところストレスなく使えてます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/51802661-fdc9-9d24-997f-e71b58cdca3b.png)

よく使うようなコンポーネントがかなり充実しているので非常におすすめです👍

ビデオなんかもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/d855735a-89d1-27e8-84ff-0387200e1c90.png)
SemaphoreSlim を使ったイベント待ち受け

スレッドAと、スレッドBが平行で動作しており、スレッドBがスレッドAの完了を待ち受けしたい場合、例えばこんな感じのコードを書くことができる。


```csharp: Program.cs
bool readyToStart = false;

Task task1 = Task.Run(async () =>
{
    while (true)
    {
        if (readyToStart) break;
        await Task.Delay(TimeSpan.FromSeconds(1));
    }
    Console.WriteLine("I started");
});

Task task2 = Task.Run(async () => {
    Console.WriteLine("Wait for 5 sec by loop");
    await Task.Delay(TimeSpan.FromSeconds(5));
    readyToStart= true;
});

await Task.WhenAll(task1, task2);
```

```:出力結果
Wait for 5 sec by loop
I started
```

動くのだけど、待ち受けのループが発生してダサい。このようなケースだと、ループではなく、イベントを待ち受けするコードに変えた方がすっきりする。

```csharp: Program.cs
var semaphore = new SemaphoreSlim(0, 1);

// Thread one
// Wait for the event happening.
var task1 = Task.Run(async () =>
{
    await semaphore.WaitAsync();
    Console.WriteLine($"I Started!");
});

// Thread two
// Fire the event after after a delay.
var task2 = Task.Run(async () =>
{
    Console.WriteLine("Wait for 5 sec");
    await Task.Delay(TimeSpan.FromSeconds(5));
    Console.WriteLine("Going to release semaphore");
    semaphore.Release();
});


await Task.WhenAll(task1, task2);
```

```:出力結果
Wait for 5 sec
Going to release semaphore
I Started!
```

うん。こっちの方がずっと良い。

* [SemaphoreSlim](https://learn.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=net-7.0)
備忘録2

回答日など、初期状態を空白にするカスタマイズ	
	
前作業で追加したDatePicker＊は、日付が表示される	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
回答日＊の「DatePicker＊＊」の関数の左辺で「 InputTextPlaceholder 」の関数を全部消して、「If(IsBlank(Self.SelectedDate), Text(" ")) 」にする	
	
	
	
	
	
	
	
	
	
	
	
	
日付がブランクになる	
	
	
	
	
	
	
	
	
	
	
	
	
回答日＊＊について、作業を繰り返す
備忘録

回答日など、入力すると勝手に遷移する問題の解消カスタマイズ	
	
既存では、以下のデーターカード	
	
	
	
	
	
	
	
	
	
	
	
DataCardValue***のプロパティで「表示」を「オフ」にする	
	
	
	
上部メニューの「挿入」→　「入力」→　「日付の選択」をクリック。　データーロックを解除して挿入する	
	
	
	
	
	
	
	
	
	
	
DatePicker＊＊　が挿入されるので、適宜サイズや位置を編集	
	
	
	
	
	
	
	
	
	
	
	
	
	
回答日＊(親のカード)の関数の左辺で「 Update 」の関数を、「 DataCardValue＊＊ 」から、追加した[DatePicker＊]に変更する	
DatePicker1の１とかは挿入順の番号なので、カード内で揃える必要はない	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
DatePicker＊の関数の左辺で「 DefaultDate 」の関数を、「 Today() 」から、[Parent.Default]に変更する	
	
	
	
	
	
	
回答日＊＊について、作業を繰り返す
なでしこで逆ポーランド記法を実装する(10分で)

逆ポーランド記法とは何でしょうか。日本語プログラミング言語「なでしこ」を使う場合、どのように実装すれば良いでしょうか。２点について紹介します。

# 逆ポーランド記法とは

Wikipediaが分かりやすいです。

> 逆ポーランド記法（ぎゃくポーランドきほう、英語: Reverse Polish Notation, RPN）は、数式やプログラムの記法の一種。演算子を被演算子の後にすることから、後置記法 (Postfix Notation) とも言う。
> その他の記法として、演算子を被演算子の中間に記述する中置記法、前に記述する前置記法（ポーランド記法）がある。 名称の由来は、演算子と被演算子の順序がポーランド記法の逆になっていることによる。

具体的に言うと・・・

> 例えば、「3 と 4 を加算する」という演算を、一般的に数式の表記に用いられる中置記法で記述すると、以下のようになる。

```
3 + 4
```

> 一方、逆ポーランド記法では、加算を表す演算子 + を、被演算子である 3 と 4 の後（右）に置いて、以下のよう記述する。

```
3 4 +
```

この書き方って、助詞を加えると次のようになり、なでしこの日本語記述方式と似ていますね。

```
3(に) 4(を) +(足す)
```

# どのように逆ポーランド記法を計算すれば良いか

逆ポーランド記法を計算するには、次の手順で計算すれば良いのです。

- (1) 文字列を空白でトークンに区切る
- (2) トークンを1つ読む
- (3) 数値なら、スタックに積む
- (4) 演算子なら、スタックから2つ値を取り出して計算してスタックに積む
- (5) トークンが空でなければ(2)に戻る
- (6) スタックに残っている値が答えとなる

# さっそくなでしこで作ってみよう

それでは、上記の手順に基づいて逆ポーランド記法を実装してみましょう！
ちなみに、タイムトライアルで何分で作れるか測ってみましょう！

以下が答えです。[こちらの貯蔵庫](https://n3s.nadesi.com/id.php?1924)から実行できます。

```rpn.nako3
式エディタ＝「3 5 +」のエディタ作成。
計算ボタン＝「計算」のボタン作成
結果エディタ＝「」のエディタ作成。
計算ボタンをクリックした時には
　　S=(式エディタからテキスト取得)
　　Sを逆ポーランド計算して答えに代入。
　　結果エディタに答えをテキスト設定。
ここまで。

●（Sを）逆ポーランド計算とは
    スタックは[]
    Sを「 」で区切って反復
        C=対象
        「+-*/%」でCが何文字目
        もし、そうならば
            B=スタックから配列ポップ。
            A=スタックから配列ポップ。
            もし、C=「+」ならば
                スタックに(A+B)を配列追加💧
            もし、C=「-」ならば
                スタックに(A-B)を配列追加💧
            もし、C=「*」ならば
                スタックに(A*B)を配列追加💧
            もし、C=「/」ならば
                スタックに(A/B)を配列追加💧
            もし、C=「%」ならば
                スタックに(A%B)を配列追加💧
        違えば
            C=INT(C)
            スタックにCを配列追加。
        ここまで。
        # スタックをJSONエンコードして表示。
    ここまで。
    スタックから配列ポップ。
ここまで。
```

タイムトライアルで、だいたい10分くらいで実装できました！
皆さんは、手順を見てどのくらいの時間で実装できるでしょうか。

# まとめ

以上、逆ポーランド記法は「スタック構造」を使うと、簡単に計算できることも分かったと思います。いろいろな定番アルゴリズムをなでしこで実装するのは楽しいと思いますので挑戦してみてください！

ちなみに、この記事を書くのもタイムトライアルでした。
貯蔵庫へプログラムの投稿も含めて20分でやりきりました！！
投稿に際して、Twitterの認証コードを入れるのが一番時間かかったかも。。。
リモートワークメインのチームで取り組んでいるコミュニケーション方法

この記事は、[クラウドワークス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/crowdworks)の12日目の記事です。

[クラウドリンクス](https://start.crowdlinks.jp/)の開発チームでエンジニアをしている @karukan029 です。開発チームのメンバーは、ほとんどが地方在住のためリモートワークをメインとしています。そんなチームにジョインして約４ヶ月、どのようなサービスを用いてコミュニケーションを取っているか、うまくいってる点や課題を交えながら紹介していきます。

# 利用しているサービス

### Slack

https://slack.com/intl/ja-jp

- チャットサービス
- テキストベースのやり取りで利用

### Google Meet

https://apps.google.com/intl/ja/meet/

- Webミーティングサービス
- 予定ありのミーティングやチーム外のメンバーとのミーティングで利用

### Notion

https://www.notion.so/ja-jp

- ドキュメント管理などができるサービス(できることが本当に多いので、一言で表現することが難しい)
- ドキュメントの管理やチームでのタスク管理で利用
- 以前はbacklogを利用していたが、自動保存による入力への障壁の軽減、ドキュメント作成の手軽さ、チーム内外でのコラボレーションのしやすさからNotionに移行

### Gather

https://www.gather.town/

- バーチャルオフィスサービス
- Webミーティングも可能
- ちょっとした会話、相談で利用

# 普段のコミュニケーションの取り方
基本的なやりとりはチャットベースで行っており、テキストベースだと難しい相談や情報共有は必要に応じてWebミーティングで実施しています。また、チームでスクラムを1スプリント1週間で運用しています。定期的なミーティングとして、朝会での情報共有とスクラムイベントを実施しており、朝会で毎日必ず一回は顔を合わせるようにしています。
- 毎日
    - 朝会
- 週に一度
    - スクラムイベント
        - バックログリファインメント
        - スプリントプランニング
        - スプリントレビュー
        - スプリントレトロスペクティブ

# うまくいっている点と課題
リモートワークと対面での仕事の大きな違いとして、他のメンバーの様子が見てわかる、会話が聞こえてくるなど、環境から得られる情報がリモートワークに比べて対面の方が多い点にあります。気になることを話していたら、話に入っていって一緒に考えたり気軽にコラボレーションすることができます。

よりチームとしてのコラボレーションを活発化するためには、この気軽さをリモートワークでどう再現するかが重要になると感じています。私たちのチームでは、この気軽さをSlackのチーム用times(分報)チャンネルとGatherを組み合わせで実現しようとしています。

### times(分報)チャネルの運用で、つぶやきを見える化
Slackでメインの情報共有用のチャンネルとは別に、開発チーム用のtimesチャンネルを運用しています。timesチャンネルでは、情報共有しておくべきことだけでなく、今考えていることやどうでもいいことを呟いていいルールになっています。このような場所を作っておくことで、他のメンバーの考え方や今やっていることが自然に見える化できます。これにより、対面時に環境から得られていた情報をチャットから得られるようになります。

分報の運用は、各メンバーが自由に使っており、あくまで強制ではありません。強制ではないことで投稿の手軽さを得られますが、書かれていることがすべてではないことは留意しておく必要があります。もっといろいろ書き込んでいきたいけど強制感があると、手軽さが減る...このバランスの取り方は今後の課題です。


### ちょっとした会話や相談をGatherで
ちょっとした会話や相談は、以前はSlackでハドルミーティングで実施していましたが、Gatherの運用を開始してからの方がより手軽に話せるようになったと感じています。ミーティングに対する心理的障壁という観点だと、Gatherの運用は効果的なのかもしれません。

もちろん、Gahterに入っていても定期ミーティング以外で会話しない日もあります。会話によるコミュニケーションは強制されてやることではありません。しかし、リモートで仕事をしていると何となく話したい気分になることもあります。そんなときは、Gahter内のRoomへ移動し、作業したりしています。Roomは複数人でミーティングを実施するための場所なので、ちょっと話したいと居場所でアピールしているわけですね。
![GatherのRoom内にいるkarukan029の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2406937/28921f0d-97ba-d956-a05d-e6e2f92efad6.png)
現状、Gatherの運用についてルールを設定しているわけではありませんが、Room内にいるときの方が個別のスペースにいる時よりも声をかけやすかったらしいです。逆の立場で考えても、確かに机でもくもく作業しているときは声のかけづらさを感じる気がします。このあたりの運用ルールを設定することで、よりコミュニケーションを活発化できそうなので、ルールを検討していくつもりです。

# 最後に
いかがだったでしょうか？

最後にクラウドワークスでは、一緒に働く仲間を募集中です。

クラウドリンクスでもエンジニアを募集しております！
サービスをグロースするフェーズにあり、1→10でプロダクトを作り上げていく仲間を募集中です。一緒にクラウドリンクスを盛り上げていきましょう！

https://crowdworks.co.jp/careers/
開発ために高速でdocker buildをやる

# 背景
### ローカル環境でdocker buildをやると、キャッシュなしでネットワークスピードが遅いでビルド時間が結構かかる
### Dockerfileファイルが以下のように
```
FROM ubuntu:20.04

WORKDIR /workspaces

# ソースコードコピー
COPY ./src /workspace/

# package install
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get install -y --no-install-recommends\
    python3.8 \
    python3-pip 

# pipefile install
RUN pip install pipenv==2022.8.5 && pipenv install --system

# その他のパッケージのインストール
RUN apt-get -y update
RUN apt-get install -y clang
RUN apt-get install -y python3-dev
```

### ビルドコマンド
```
$ docker build my_project/test
```

# 問題の解決
### 参照
* [GithubActionsでのDocker BuildでCacheを効かせる方法メモ \- Qiita](https://qiita.com/mokemokechicken/items/39e3b04f3cbe09e5a601)

### キャッシュを追加
* 環境変数設定
    * DOCKER_BUILDKIT=1
* ビルドコマンド

```
$ docker build my_project/test --build-arg BUILDKIT_INLINE_CACHE=1
```
    * これは1回目ビルドするときに、キャッシュも作成する。
    * 2回目ビルドすると、キャッシュを利用できて時間が短縮になる

### ソースコードのみ修正してもビルド時間がかかる
* 開発中にパッケージの変更が少なくて、ソースコードの修正が多い
* dockerfileより、キャッシュを利用してビルドするときに、修正部分からキャッシュ利用せずに再ビルドする
* 例えば、ソースコードを更新すると、COPYから再ビルドする
* そういえば、開発のためにソースコードのCOPYとPipefileのインストールが最後にやるべき

# まとめ - 高速ビルドするために以下のことをやるべき
### BuildKitを有効
* DOCKER_BUILDKIT=1

### ビルドコマンド
```
$ docker build my_project/test --build-arg BUILDKIT_INLINE_CACHE=1
```
### dockerfileの順番
* 先にソースコードと関連しないパッケージのインストール
* 最後にソースコードのCOPY

```
FROM ubuntu:20.04

WORKDIR /workspaces

# package install
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get install -y --no-install-recommends\
    python3.8 \
    python3-pip 

# その他のパッケージのインストール
RUN apt-get -y update
RUN apt-get install -y clang
RUN apt-get install -y python3-dev

# ソースコードコピー
COPY ./src /workspace/

# pipefile install
RUN pip install pipenv==2022.8.5 && pipenv install --system

```
オレオレつぶやきProcessing

# はじめに
こちらは[Processing Advent Calendar 2022](https://adventar.org/calendars/7370)の8日目の記事になります

ところで[#つぶやきProcessing](https://twitter.com/hashtag/%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing)をご存じですか?
知らない?
そうですか...(終)

# 説明
https://twitter.com/Hau_kun/status/1136299935618351105

[#つぶやきProcessing](https://twitter.com/hashtag/%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing)はProcessingを使い、1ツイート(280字)に収まるプログラムで、どこまでアートを表現できるかに挑戦するものです。
とにかく短いコードで色んなものを作ります。

# 本編
去年に知り、時々暇があれば[投稿](https://twitter.com/search?q=(%23%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing)%20(from%3Ateruru33550336))してる訳なんですが、基本的に何か元ネタがあってそれを元に作っています。
というのも、自分が他の方のような素晴らしいものを作ることが出来ない上、あまりに難しいもの
を作り続けているとモチベーションが続かないからです。
なんだかんだで1年です。

時々どうやって考えてるんだろ...って言ってる方を見ましたので、ここで頭の中を開けてみたいと思います。
これを見て気になった方がいましたら参考にしてください。

# 初級編
https://twitter.com/teruru33550336/status/1449001995193380868

これはめちゃくちゃ簡単で、四角を並べるだけのものです。
今見るとまだ短く出来ると思っています。
ぱっと見で同じ関数を使って並べるだけやろ！と思ったので作ってみました。

これと同じ感じで考えるのなら、[オリンピックシンボル](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%AA%E3%83%B3%E3%83%94%E3%83%83%E3%82%AF%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB)とかが近いでしょう。
丸を並べるだけなら簡単ですね。

# 中級編
https://twitter.com/teruru33550336/status/1556276549959454721

アニメーションがあると見た目的にも「うお～」ってなります。
これはラーメンを食べてる時に思いついたやつです。
ぱっと見コードはぐちゃぐちゃですが、ただ四角と半円を並べて色を付けただけになります。

お箸を動かすのにsinを使いました。
三角関数を勉強するのを諦めたそこのあなた！こういうところで使うんですよ！
少ない図形だと、座標を動かすためのプログラムを書く文字数を確保出来ます。
例えば流れ星だと、`星の形 + 端から端へ飛びながら消えていくアニメーション`という感じになります。
アニメーションをつけるなら簡単な形を使う！と思うことが大切です

本当だと雷紋(ぐるぐるのやつ)も作りたかったのですが、文字数が足らずに断念。
こういう文字数が足りなかった時に、どこを削るかを考えるのも大変です。

# 上級編
https://twitter.com/teruru33550336/status/1586358748758519808

大体Twitterで見たものを元に作ります。
ここまでくると、ただ並べるだけじゃいけなくなってきます。

こういう時に、作れるかもしれない...と思う基準として、「その図形を描画するのにどのくらいの文字数が必要か」が頭の中で大体予想しています。
例えば、ここでは`bezier`関数を使う訳ですが、各引数に3桁の数字が入った場合、`bezier(100,100,100,100,100,100,100)`となり、35文字となります。
これは`35/280=0.125`で12.5%も使うこともなり、`図形 + 動き`の考えでいくと図形側に多くの文字数を要することになります。
そこで、for文を駆使して引数を変えることで、図形を描画させるための文字数を抑えて複数個の図形が描画することが出来ます。

あとはこのfor文をどうやって使うかです。
そこで出てきますは三角関数！
少ない文字数で円状に配置でき、幾何学的ものを作ることが出来ます。
三角関数を勉強するのを諦めたそこのあなた！こういうところで使うんですよ！

`random`関数を呼び出すことで、複雑なプログラムを書かずともそれっぽい動きを作ることが出来ます。
連続的な値を使いたいのであれば`noise`関数があります。

コードの詳しい説明はとある勉強会で行ったこちらのスライドが詳しいです
https://docs.google.com/presentation/d/1o0okco5c6IdmxPZBgGINTO9fAlW2P9Fzrrrxy3VqPOw

# まとめ
簡単なものを作るなら、少ない種類の図形を複数回使う。
アニメーションを付けたかったら、図形と動きの文字数のバランスを考える。
もっと複雑にしたかったら、jsの仕様を知ることでもっと文字数を抑えることが出来ます。
文字数の減らし方は色んな方が記事を書いてくださってるので、それを参考にするといいと思います。

あとは何を作るかです。

毎日目にしているもの。
日頃使っているアプリのアイコン。
お茶を飲むためのコップ。
今日食べたお昼ご飯。
意外と簡単に作ることが出来る形は身近にあります。

こういう創作でマンネリ化する原因として、アイデアが思い浮かばないことだと思っています。
そのため、何か元ネタを用意してそれを真似てみるのはどうでしょうか。
別に美しいものを作る必要は無いと思っています。
数をこなすことで、いざ何かを作りたくなった時の力になると信じています。

たった、280字以下のプログラム、書いてみませんか?
JVM系统运行时内存分析工具-MAT

工欲善其事必先利其器！只有对Java服务应用的内存使用情况充分了解，才能保持其健壮性。Java对象的内存分布情况可以通过JDK自带的工具`jmap`获取，对内存情况的分析JDK也提供了相应的工具`jhat`。由于`jhat`使用起来并不友好，更多的时候用的是更为强大且直观的内存分析神器`MAT`。

* 基本用法
* 真实案例分享
* 总结

## 基本用法

1. 下载[MAT](https://www.eclipse.org/mat/downloads.php)。
2. 获取内存dump文件。
3. 运行`MAT`分析文件。

下载安装MAT是相当简单的，这里就不过多描述。至于如何获取内存的dump文件？一般有三种方式：其一我们可以通过`jmap`去获取当前Java进程的堆内存信息：

```shell
# 1. 直接查看对象分布
$ jmap -histo ${PID}

# 2. 使用jmap生成堆内存转储快照
# format=b:二进制 dump.hprof:文件名          
$ jmap -dump:live,format=b,file=dump.hprof ${PID}
# 记录堆内存所有对象的快照放到文件里去了，供后续MAT分析
```

第二种方式，也是每个应用必不可少的兜底方式，就是设置JVM选项，使应用能在任何时候发生`OutOfMemoryError`的时候都能自动生成一份dump文件[保留事故现场]。

```shell
# JVM 设置
-XX:+HeapDumpOnOutOfMemoryError
```

第三种方式是通过MAT直连本机Java进程获取，点击`Acquire Heap Dump Dialog`，应用会将本机运行Java进程的列表展示出来，选择一个对应Java进程即可。由于我们的程序一般运行在Linux的堡垒机上[无论是测试还是生产环境]，这个功能也基本上很少用到。
![16542403256262.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228534/2dc49079-22a3-e47e-3980-1159b2366fcd.png)
*如何使用MAT进行内存分析呢？*

通过我们上面JVM参数的设置，一旦我们的应用出现`OOM`的错误，那么当时对象内存分布的快照文件会自动创建，我们只需要将这个文件从服务器传到本地进行分析即可[一般用sftp工具]。通过MAT打开该文件的时候需要注意一点：OOM出现的时候，dump文件都会非常大，这里需要设置一下MAT的`MemoryAnalyzer.ini`配置：

```shell
# MemoryAnalyzer.ini
-Xmx1024m #默认只有1GB，按需修改。
```

**Leak Suspects**

`Leak Suspects`这个报告信息是最直观可以分析出*内存泄漏*的地方。如下图，MAT会将可能出现内存泄漏的问题点的信息展示出来：包括大对象内存分布饼状图、线程信息、内存泄漏对象的大小。有经验的工程师通过这一点基本上就可以直接去看代码找到问题的所在了。

![16542476547401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228534/43be0a98-0e75-008b-3817-efe296a0a084.png)

**Histogram**

Histogram[直方图]展示的是每个class实例个数、Shallow Heap和Retained Heap。Shallow Heap指的是每个实例占用的内存[如一个Object对象需要64个bits]；`Retained Heap`则是每个实例引用到其他对象的总大小。`Retained Heap`的含义是，当某个对象回收的时候，与此同时它所引用的对象也会回收，所回收的内存大小就是这个Retained Heap。*一般生产中运行的应用，需要关注的是那些自定义的类所创建的实例数量以及通过框架反射创建的实例数量是否正常。*
![16542486067224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228534/f1eefa33-3214-0f2d-e66f-712d81a767c6.png)

**Dominator Tree**

直方图[Dominator Tree]能给出的信息是通过类的名称统计的，要弄清楚对象真实的内存分布情况需要用到MAT另外的一个分析方式：Dominator Tree（支配树）。*支配树列出每个对象(Object instance)与其引用关系的树状结构，还包含了占有多大内存，所占百分比。*

通过下图我们就很容易看出来这里导致OOM的原因是：一个名为`doom-collection`的线程下有一个`ArrayList`对象包含了9个超大的`Character数组`对象。
![16542492765295.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228534/d99efe1f-6ab9-6271-4b2f-afb272215af9.png)

**Thread_overview**

线程总览[Thread_overview]功能也相当使用，它可以将线程信息、局部变量、方法栈信息以及内存信息展示出来。开发人员可将问题直接定位到实际代码行数。
![16542497673696.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228534/dca04e88-e06f-9478-fe1b-57df6a26f3c8.png)
以上这些功能足以应对测试及生产中出现的OOM问题的排查。接下来讲述一个我们遇到的真实的OOM案例。

## 真实案例分享

该案例虽然是发生在测试环境，但是其关联影响也是不小的。由于我们的系统是一个平台性的系统，很多关联方需要在我们测试环境做测试，所以我们的测试环境基本上都要保持一个稳定的状态，一旦环境出问题各方的投诉就会蜂拥而至。

某天，测试跑过来说FAT环境很卡，请求时不时超时。查看日志，发现正常运行了几个月的系统第一次出现了OOM！dump文件拉出来一看，问题显而易见：有一个自动化测试框架的线程对象占了饼状图80%的内存。最后问题的定位是测试工程师新加了自动化测试框架，然而相关参数设置有问题导致对象创建过多，最总内存溢出。解决方法：修改参数，重新启动应用，服务恢复正常。

## 总结

MAT非常小巧也非常实用，一方面使用它能迅速找到OOM的问题所在，另一方面通过它可以清晰的了解整个应用的内存分布情况。OOM是非常严重的问题，在测试阶段就应该特别注意。尤其是压测阶段，可以通过上面的分析工具及方法查看并分析应用运行时的对象内存分布情况，尽早的发现问题的所在，这样才能保证生产环境下应用的健壮。
シビックテックはボランティア活動だからこそ、参加しやすさが大切

## はじめに
2022年は月に一度の趣味として、シビックテックの活動に参加してきました。
「市民ボランティア」というと、町の清掃・ゴミ拾いだとか、防災訓練のようなイメージがあります。シビックテックは、テクノロジーを使ったボランティア活動です。

一年続けた中での気づきと振り返りを記事にして、アドベントカレンダーに投稿したいと思います。

https://qiita.com/advent-calendar/2022/civictech


## 一年間の振り返り

### サマリー

:::note info
一行でもソースコードを書くことが役に立つ
:::

:::note info
初めて会う方の困りごとの話を聞くことには学びがある
:::

:::note info
生活の中で、ちょっとだけ手伝うものだから参加しやすさが大切
:::


### テーマ

今年は、いくつかのテーマに協力させてもらいました。
環境をテーマにしたものだったり、オープンデータ自体への取り組みです。

https://www.businessinsider.jp/post-259972

気候変動をじぶんごとにする「じぶんごとプラネット」では、環境について知らない世界を知る良い経験になりました。ネットで環境の話を聞いてもどこか遠い話のように感じてしまうような状況から、マイバッグを持つようになったり、ペットボトルを使うのを控えたりするようになりました。

デザイナーの方に Figma の便利な Tips を教えて頂いたり、エンジニアが参加しやすいように環境を整えたりしていました。学びの多いボランティア活動だったと思います。

https://qiita.com/t-kurasawa/items/64a429e8b53bd7202f87

https://qiita.com/t-kurasawa/items/89f7b8e963221c229add


## 来年に向けて
次に取り組んでいるのがオープンデータ自体をテーマにしたものです。シビックテックではオープンデータを活用することが多いのですが、データ自体の整形であったり、活用するための環境はまだまだ黎明期なのかなと思います。

来年は、オープンデータの linter や、オープンデータのパッケージマネージャーの開発に少しづつでもお手伝い出来たら良いなと思っています。

https://github.com/c-3lab/dim

それでは、良いお年を。
HTML5の要素タグの使い分け

# header要素
ページのヘッダー部分を表すタグです。
※セクショニング要素ではありません。

# footer要素
ページのフッタ部分を表すタグです。
※セクショニング要素ではありません。

# nav要素
メニュー、目次、索引等のサイト内全ページに一貫して表示されるグローバルナビゲーションなどに利用されます。

# aside要素
サイドバー、広告、新着記事、人気記事等の補足情報を表します。

# main要素の定義
ページ内の主要部分に使用します。
1ページ内に1つのみ使用可能で、article/aside/footer/header/nav要素の中には入れてはいけません。

# article要素の定義
そのページから切り取っても独立した記事として成立するセクションに使用します。
※例えば料理レシピのサイトで、材料や準備するものだけでは１つの記事として成立しないので、このタグは不適切です。
主に、ページのメインコンテンツ部分に使用します。

# section要素の定義
ページ内で文章のまとまりを表すタグです。子要素に見出し（h1〜h6）を持つのが基本です。
また、レイアウト目的では使用ません。
※レイアウト目的なら<div>を使用します。

# セクショニング要素とは
最後に、セクショニング要素について触れておきます。
section/article/aside/navがセクショニング要素に該当します。
HTML5から導入されたHTML要素で文章のまとまった範囲(セクション)を囲い、検索エンジンが文書の構造を理解するのを助ける要素のことです。
HTML5以前であればこういった箇所にはdivタグを用いることが一般的でしたが、現在は文書構造に適したセクショニング要素を使用することで、よりSEOに強いウェブサイトを作ることが可能になっています。
Cognos Analyticsのレポートで画像ファイルを出力する

Cognosのレポートに画像ファイルを表示する方法を紹介します。

# レポートに画像ファイルを表示する

## 画像オブジェクトを使用する

レポート開発画面の、ツールボックス > レイアウト > 画像 を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/0219e4ac-5ee1-3094-da72-553d7328ba84.png)

「画像」のプロパティから、URLソース > URL をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/9c960525-8b94-9d07-8136-93ee3cc6f29d.png)


レポートに追加したい画像ファイルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/4e14441b-72d4-60af-c0de-8f3bb784ad6d.png)

これでレポートに画像ファイル出力が追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/3281e9e4-7dda-3e04-2424-b9857aab00fb.png)

必要にように応じてサイズの調整を実施します。

## 画像ファイルの配置先

レポートに出力する画像ファイルは、Cognosサーバー (Reportサーバー) 上に配置しておく必要があります。
デフォルトでは、以下のフォルダが初期参照先になっています。

Windows環境：
C:\Program Files\ibm\cognos\analytics\webcontent\bi\samples\images

Linux環境：
opt/ibm/cognos/analytics/webcontent/bi/samples/images


# 画像オブジェクトを使用する時の注意点

## PDF出力時の画像サイズ

画像のプロパティにある、位置決め > サイズおよびオーバーフロー処理 で設定できる幅と高さは、HTML表示時の調整になります。
ここでの設定がHTMLに組み込まれて、ブラウザ表示時に画像のサイズを調整します。
PDF作成時はこの設定は効かず、画像本来のサイズで表示されるので注意が必要です。
画像ファイルを準備する段階でPDF出力時に適切なサイズのものを準備する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/048c748d-c651-ddbd-9cf2-2662ca7eab59.png)


## 画像選択時のイメージ参照

Cognosの前段にWebサーバーがあり、WebDAVの構成が完了していないような環境では、下記の画像選択画面で、「参照」をクリックしても画像は表示されません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/0901c360-977e-0586-a4b7-03adf4c057d1.png)

# 自己学習記事一覧

Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト
https://qiita.com/shinyama/items/95885c7246dc413b6448
Javascript フォームに入力した値をコンソールで取得できない

## 環境
Mac(M1, 2020)
vscode５

# [概要]
javascriptでTODOアプリを作成中、フォームに入力した値を取れているか確認するために
console.logで確認してみると
一瞬だけ入力した値がコンソールに表示され取得できてない現状
```
const form = document.getElementById("form");
const input = document.getElementById("input");

form.addEventListener("submit", function () {
  
  console.log(input.value);
});
```

![スクリーンショット 2022-12-07 18.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/83846a7c-3182-c57b-71fe-b1719ae4d875.png)

原因としてはフォームでenterを押すと画面がリロードされるとのこと（元々そうなってる）
今はそれをされたくないのでリロードのイベントを無しにしたい
すでに使っているaddEventListenerを使うと関数の中の引数にeventとゆう種類のデータを取得できる
eventにはpreventDefaultメゾットがありこれを使うとデフォルトのイベントを発生しないようにできる
今回の場合は、formをsubmit(エンターキーを押す)したときのブラウザのリロードを中断できる


## やったこと
1.関数の中の引数にevent
2.event.preventDefaultを追加
```
const form = document.getElementById("form");
const input = document.getElementById("input");

form.addEventListener("submit", function (event) {
  event.preventDefault();
  console.log(input.value);
});

```


## 結果
入力した値が取得できた
![スクリーンショット 2022-12-07 18.28.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884551/5519b0be-1f3b-e9c8-d4e1-7bddeb4d9db6.png)
NetBSD/arm進捗-20221208

FreeBSD/armがくそなので、NetBSD/arm 9.99に引越し中です。

|SOC|arch|状況|
|:--|:--|:--|
|STR9102|ARMv4(FA526)|割り込みpicにしてINSTALLで起動できました。USB,if,pciが動いてません|
|IXP422|AEMv4|OpenRD boot仕様調べ中。情報無いのでU-Boot焼き直しも考えたほうが良いかも|
|MV88F5181(Orion)|ARMv5|USB外してINSTALL起動できます|
|MV88F6281(Kirkwood)|ARMv5|普通に使えます|
|5VT1310(RT1310)|ARMv5|未着手|
|M83261(Comcerto)|ARMv6|USB使えませんが、INSTALL起動できます
|A10|ARMv7|普通に使えます|

随時dmesgはNYC*BUG dmesgdにアップしてます。

https://dmesgd.nycbug.org/index.cgi?do=index

ソースはここにあります。

https://github.com/yamori813/netbsd-src
paiza.ioでelixir その128

# 概要
paiza.ioでelixirやってみた。
ニューラルネットワークで、and,or,xorの学習と推定、やってみた。

# 参考にしたページ

https://qiita.com/takumi1015/items/b65f77d1c40076df3aae

# サンプルコード

```
defmodule NeuralNetwork do
  @lambda  1.0
  @eta     0.1
  @spec of([number],[number]) :: number
  def of(w, x) when length(w) == 3 and length(x) == 2 do
    w 
    |> Enum.zip([1, x] 
    |> List.flatten)
    |> Enum.map(fn {a, b} -> 
        a * b 
    end)
    |> Enum.sum
    |> sigmoid
  end
  @spec error_correct(number, {[number], number}) :: [number]
  def error_correct(w, {x, y}) do
    w
    |> Enum.zip([1, x] 
    |> List.flatten)
    |> Enum.map(fn {a, b} -> 
        a + @eta * (y - of(w, x) * b) 
    end) 
  end
  @spec training([number], [{[number], number}]) :: [number]
  def training(w, data), do: w |> _training(data)
  defp _training(w, []), do: w
  defp _training(w, [h | t]), do: _training(error_correct(w, h), t)
  @spec exec([number],[{[number],number}],number) :: [number]
  def exec(w, _, n) when n == 0, do: w
  def exec(w, data, n) when n > 0, do: exec(training(w, data), data, n - 1)
  def exec(_, _, _), do: false
  defp sigmoid(x), do: 1 / (1 + :math.exp(-@lambda * x))
end

alias NeuralNetwork, as: NN
w = [1, 1, 1]
and_data = [{[0, 0], 0}, {[0, 1], 0}, {[1, 0], 0}, {[1, 1], 1}]
v = w 
    |> NN.exec(and_data, 1000)
IO.puts("and")
IO.write("0, 0 : ")
NN.of(v, [0, 0])  
|> IO.inspect
IO.write("0, 1 : ")
NN.of(v, [0, 1])
|> IO.inspect
IO.write("1, 0 : ")
NN.of(v, [1, 0])
|> IO.inspect
IO.write("1, 1 : ")
NN.of(v, [1, 1])
|> IO.inspect
or_data = [{[0, 0], 0}, {[0, 1], 1}, {[1, 0], 1}, {[1, 1], 1}]
v = w 
    |> NN.exec(or_data, 1000)
IO.puts("or")
IO.write("0, 0 : ")
NN.of(v, [0, 0])
|> IO.inspect
IO.write("0, 1 : ")
NN.of(v, [0, 1])
|> IO.inspect
IO.write("1, 0 : ")
NN.of(v, [1, 0])
|> IO.inspect
IO.write("1, 1 : ")
NN.of(v, [1, 1])
|> IO.inspect

xor_data = [{[0, 0], 0}, {[0, 1], 1}, {[1, 0], 1}, {[1, 1], 0}]
v = w 
    |> NN.exec(xor_data, 1000)
IO.puts("xor")
IO.write("0, 0 : ")
NN.of(v, [0, 0])
|> IO.inspect
IO.write("0, 1 : ")
NN.of(v, [0, 1])
|> IO.inspect
IO.write("1, 0 : ")
NN.of(v, [1, 0])
|> IO.inspect
IO.write("1, 1 : ")
NN.of(v, [1, 1])
|> IO.inspect
```

# 実行結果

```
and
0, 0 : 1.8616738545650644e-4
0, 1 : 0.048426217768489974
1, 0 : 0.0487058890113323
1, 1 : 0.9333035631517769
or
0, 0 : 0.01050281992405151
0, 1 : 1.0
1, 0 : 1.0
1, 1 : 1.0
xor
0, 0 : 1.778830268595577e-15
0, 1 : 0.6666666666648118
1, 0 : 0.6364094670296399
1, 1 : 0.9999999999999996
```

# 成果物

https://paiza.io/projects/QQQeJZM7lDdqqFuMiR7Vyw?language=elixir


以上。
Twitterから見るChatGPTの使い道～事例紹介～

# 🫣TL;DR

2022年12月から一般に公開された「ChatGPT」。こんな使い方をしている人がいるよという事例紹介。

https://chat.openai.com/chat

ChatGPTとは？や利用の開始方法やは別途記事を参考に。

https://aiacademy.jp/media/?p=3546

https://qiita.com/nyax/items/553bf5610c2d2202de22

ざっくりいうと、何かと話題のイーロン・マスク氏が共同会長を務めるNPOのOpenAIが開発した「GPT-3」（深層学習を使って人間っぽい文章を生成する自然言語技術処理モデル）をチャット形式で手軽に一般の人が使えるようにしたサービスです。

# 📜事例紹介
## 対話
まず最もスタンダードな利用方法として対話から始まる質問の受け答え、しりとり...などがあります。そこから知らない単語などの調べ物などにもそれらしい回答をしてくれます。

少し発展して、インタビューの質問を考えてもらったという方もいらっしゃいます。

https://twitter.com/yktyshr/status/1599641205574610945?s=20&t=E8jghij4coPIeg-HOOVo-w

## ブログ執筆
先ほどの対話からまた少し発展して、その内容をブログ記事のような形で形式を指定してまとめてもらうということも試している方がいらっしゃいました。

https://twitter.com/cacaci9/status/1600440335263748096?s=20&t=E8jghij4coPIeg-HOOVo-w

## コーディング
これもすでに試した方が多いかもしれませんが、設計からコーディング、デバッグ、テスト、レビューなどなど。ここまでくると開発のほぼ全行程をこなす日も近そうです。

https://twitter.com/ht164/status/1598748230917173248?s=20&t=E8jghij4coPIeg-HOOVo-w

## VM
またこれも、コードを描いてもらうところから一歩進んでVMを立ててプログラムを実行させたりコンソールを操作するようなこともできるそうです。

https://twitter.com/uint256_t/status/1599277115626909697?s=46&t=lxABwCs89mQWoMcaf1JPAw

## 描画
AIと言えば少し前に話題になった描画のようなことも少し工夫するとできるようです。

https://twitter.com/palette_decolo/status/1598972244780535808?s=20&t=E8jghij4coPIeg-HOOVo-w

## 問題を解かせる
競プロをはじめ、医師国家試験や司法試験、より一般的な試験、もっと簡単な計算問題などを解かせている事例も見かけます。ただ初歩的なひっかけ問題を間違えるということも往々にしてあります。

https://twitter.com/bayashiko_kpr/status/1599314443292545025?s=20&t=E8jghij4coPIeg-HOOVo-w

https://gigazine.net/news/20221205-chatgpt-passes-ap-computer-science-a/


# ⚠️注意点
この記事の執筆時点（2022年12月8日）では、ちょうど一般利用が開始されて1週間が経ち利用者もかなり増えているようです。そのため一部利用頻度などに制限がかかっている場面も見受けられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/ef3fbfb2-7ff8-7068-8020-b01b0775f3b4.png)

また、おそらく皆さん御用達の技術質問投稿サイト「StackOverFlow」ではChatGPTに生成させたと思われる回答が見受けられることから、ChatGPTに生成させた内容を投稿しないよう利用ポリシーが出されました。（ただ、どうやってChatGPTに生成させた文章かどうかを判別するのかについては課題が残りそうです。）

https://meta.stackoverflow.com/questions/421831/temporary-policy-chatgpt-is-banned

# まとめ
筆者自身試しに触ってみて非常に手軽に、かつ想像以上に自然でそれらしい回答をしてくれるChatGPTの性能に驚きを隠せません。ただ注意したいことは、まだまだ回答の精度はプロトタイプということですね。正解がある質問に対して生成された文章については、参考にはなるとして別途利用者自身での検証も十分に必要と思われます。
ただ、今後もこの手の技術については目が離せません。

https://twitter.com/elonmusk/status/1599128577068650498?s=20&t=E8jghij4coPIeg-HOOVo-w
MySQL8Quickを修正する

# やっぱりYouTubeは強い？　
　九月に公開したMySQL8のSampleApp、たった３分の[YouTube動画](https://youtu.be/HVeZe1v9qmg) にコメントがついた。おおお、半ば忘れかけていた。それで慌てて[GitHub](https://github.com/dongri727/sample_app_flutter_mysql8) を見にいくと、おおお、STARが三つもついているではありませんか。　
　たかが三つで騒ぐな、とおっしゃるなかれ。万年初心者としては舞い上がっちゃう成果である。しかもissueにもコメントがついてる。おおお〜。

## よかったら[MySQL8QUICK](https://github.com/dongri727/MySQL8Quick) もお試しください　
　素人のcodeなので、正直言うとちょっと後ろめたくもあるが、せっかくだから見てもらいたい。そしたら、「overflowします」と指摘された。　
　そうだった！　先日は「公開する」にフォーカスしていたので、入力時にキーボードが出るとoverflowになるの、気づいていたけど無視したのでした。強引に入力すれば、使えなくはないので。　
　でも、公開して、指摘されたら、やっぱりそのままは不誠実だよね、「素人なので許して〜」とか言ってる場合ではない。　

## resizeToAvoidBottomInset: false,
　とりあえずscaffoldにこの一行を追加。すると少なくともiPhone14でのoverflowは起きなくなった。でもSEみたいな縦の短い機種だと、まだあふれる。で、flexの比率を変えた。入力1:ListView5だったところを1:4にしたら、お、収まった。よきよき。Androidも収まってる。よしよし。

## Macキーボード問題で焦る　
　さあ、更新前に確認しよう。え゛〜っ、access denied !!!　ちょっと待て、ちょっと待て、なんで〜。　
　結論から言ってしまうと、せっかくsimulatorに表示されていたキーボードを使わずに、Macから打ったのがいけなかった。こういうときMacキーボードはなぜかいつもと違う挙動をする。Pの隣にいるはずの　@　がshift2に移動するのだ。パスワードを非表示にしていたので、@が化けるているのに気づかなかった。ああ、びっくりした。　
　ということで、無事　pushして、mergeして、朝活終了。 

## Macで @ が出なくなったらshift2 
## ついでに 　*　は　shift8
Tableau CloudのMFA認証をAuthenticatorアプリで楽にする

# Tableau Cloud（旧Tableau Online）のMFAが面倒だった
当初、ログイン時の設定の仕方が良くなかったのか、iPhoneの設定アプリ内にあるパスワード管理でワンタイムパスワードを使ってログインする状態になっていた。
ただ、社内的に困っている人が多く見受けられたので、Salesforce Authenticatorアプリを使う方法に切り替えたら便利だった。
具体的には、MFAの認証が切れるのが早すぎる（30分程度で切れる）ので、ほぼログインするたびに毎回iPhoneの設定アプリを開かねばならず、Tableau Cloudへのアクセスが億劫になっていた。
# Salesforce Authenticatorアプリなら、自動でログインできる
一度設定してしまえば、以後ID/Passwordのみでログインできるようになるので、おすすめ。

## Tableauの個人設定からMFA設定を変更する
- Tableau Cloudにログインし、「マイ アカウントの設定」を選択
- 「多要素認証方式の管理」 を選択
- 「Salesforce Authenticator」を選択
- スマホでアプリをダウンロードし、「アカウントを追加」
- スマホアプリで表示される2つの単語を、Tableau Cloudの画面に入力する

## Authenticatorアプリでログインし、MFAを自動化する
- Tableau Cloudにログインする際、MFAの認証方法でSalesforce Authenticatorを選択する
- スマホアプリで認証する際、「信頼できる要求として自動化」的なオプションをONにした状態で承認する

→ 以降、ID/Passwordのみでログインできるようになります。
Informatica Data Loaderを使ってみる 

この記事は [インフォマティカ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/informatica) Day 8 の記事として書かれています。
# はじめに
本記事では、無償・ノーコードでデータを簡単に取り込むことができるInformatida Data Loaderを紹介します。Informatica Data Loaderはオンプレミスやレガシー、SaaSサービスなど40種類以上のデータソースから以下のターゲットへデータをロードすることができます。
- AWS Redshift
- Azure Synapse
- Google BigQuery
- Snowflake
- Databricks

データソースとターゲット接続の種類については、[オンラインヘルプ](https://onlinehelp.informatica.com/IICS/prod/idlf/en/index.htm#page/cc-connections/Connections.html)をご参照ください。
# サインアップ
こちらの[サインアップサイト](https://marketplace.informatica.com/forms/data-loader.html)にアクセスして登録します。もしくは、ご利用の上記ターゲットからInformatica Data Loaderを選択してアクセスすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/fce77a39-ace9-308c-0cfa-079720df3d45.png)
サインアップ完了後、下記ログイン画面に遷移しますので、こちらからログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/f57eb2eb-419d-170d-592e-0817d1993eb2.png)
#  手順
本記事では、SalesforceからSnowflakeへデータをロードする手順を例として紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/96642a11-d3e8-8147-7841-f581be4dfbe0.png)

## 1. ソース接続設定
**1-1. 新しい接続からSalesforceを選択**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/d0e90d18-206e-d7f1-71c0-cfdfdc208889.png)
**1-2. Salesforceへの接続設定**
対象ソースに必要なユーザ名やパスワードなどを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/525448cd-39cd-cb5e-48bf-88c7c5e05a32.png)

**1-3. ロード対象のソースオブジェクトを指定**
1. ソースオブジェクト: 一部を含めるを選択
2. [+] ボタンからソースオブジェクトを選択

本記事では、[ソースデータを微調整しますか]の項目はデフォルト設定のまま進めますが、フィールドの除外やフィルターの設定に加えて、プライマリーキーとウォーターマークフィールドを定義することで、ターゲットへのインクリメンタルロードを実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/0a233698-85f6-ddf0-dbaf-2ae5e0796d91.png)
## 2. ターゲット接続設定
**2-1. 新しい接続からSnowflake Data Cloudを選択**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/94808d5a-67e7-f161-7d79-d9156efda1e5.png)
**2-2. Snowflakeへの接続設定**
ターゲットに必要なユーザ名やパスワードなどを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/35126935-403b-97ec-5519-6e5c1cc25832.png)
**2-3. ロード先のターゲットオブジェクトを指定** 
- ターゲット名のプレフィックス: オブジェクト名に追加する接頭辞を入力
- TagetType: table
- Path: Snowflake上のDB名/スキーマを入力

ここでは、毎回新規テーブルを作成する [いいえ、毎回新しいテーブルを作成する] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/4f575082-c74b-281b-69fa-a27fe40e4d39.png)
## 3. データロード実行
**3-1. 名前を入力して保存後に実行**
[カスタマイズ]項目では、スケジュール実行や通知などの設定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/f1ff0b67-ee17-e632-9063-02a8cc3ef6de.png)
**3-2. マイジョブからステータスを確認**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/d4126ab8-d01b-fb15-3126-83ef2774e149.png)
**3-3. Snowflake上でデータがロードされていることを確認**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/bb4cc55d-94c3-3566-8cb4-a20a5729b213.png)
# おわりに
Informatica Data Loaderは、ノーコードの3ステップで簡単にデータをロードできるツールです。ご興味を持たれたら、無償ですので是非お試しください。
paiza.ioでelixir その127

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
zipをダウンロードして、解凍して、読め。

# サンプルコード

```
:inets.start
:ssl.start

{:ok, {_status, _headers, body}} = :httpc.request('http://hp.vector.co.jp/authors/VA005129/support/arc/cswz.zip')
#|> IO.inspect
{:ok, file} = File.open("test.zip", [:write])
IO.binwrite(file, body)
File.close(file)
zip = "test.zip"
zip
|> String.to_char_list
|> :zip.unzip
#|> IO.inspect
File.read("CS.TKW")
|> IO.inspect



```

# 実行結果

```
{:ok,
 "<SenseCase=1>\r\nabstract\r\nas\r\nbase\r\nbool\r\nbreak\r\nbyte\r\ncase\r\ncatch\r\nchar\r\nchecked\r\nclass\r\nconst\r\ncontinue\r\ndecimal\r\ndefault\r\ndelegate\r\ndo\r\ndouble\r\nelse\r\nenum\r\nevent\r\nexplicit\r\nextern\r\nfalse\r\nfinally\r\nfixed\r\nfloat\r\nfor\r\nforeach\r\ngoto\r\nif\r\nimpliit\r\nin\r\nint\r\ninterface\r\ninternal\r\nis\r\nlock\r\nlong\r\nnamespace\r\nnew\r\nnull\r\nobject\r\noperator\r\nout\r\noverride\r\nparams\r\nprivate\r\nprotected\r\npublic\r\nreadonly\r\nref\r\nreturn\r\nsbyte\r\nsealed\r\nshort\r\nsigned\r\nsizeof\r\nstackalloc\r\nstatic\r\nstring\r\nstruct\r\nswitch\r\nthis\r\nthrow\r\ntrue\r\ntry\r\ntypedef\r\nunit\r\nulong\r\nunchecked\r\nunsafe\r\nushort\r\nusing\r\nvirtual\r\nvoid\r\nvolatile\r\nwhile\r\n"}
```

# 成果物

https://paiza.io/projects/2vSMr217ADzfGHgD2pr69g?language=elixir

以上。
RealityCaptureのregistrationデータを流用する検討

「instantNeRFで遊ぶ Advent Calendar 2022」の12日目です。

今週はtransform.jsonの内容をRealityCaptureのデータから作る方法を検討していきます。

:::note
業務外の個人的な検討活動です。
:::

通常の手順でcolmap2nerf.pyを使ってカメラパラメータを求めtestbed.exeを実行したところ、ケーキの形がひしゃげて再生されました。
おそらくCOLMAPが導いたカメラの位置や向きの誤差が大きかったのかもしれません。
![12-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c4d5a659-b338-af4f-71bd-b880571e8c2a.png)

同じ画像ファイルを使いRealityCaptureで再構成した結果では正しく再現されました。
個人的に使い慣れたRealityCaptureのカメラパラメータを流用しinstantNeRFの再生品質を上げることを検討します。

![12-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/64197b8b-0b31-d376-616e-5550fa5e35a0.png)

#### colmap2nerf.py
instantNeRFはcolmap2nerf.pyというスクリプトを使い、COLMAPが解析したモデルデータ; cameras.txtとimages.txtをtransform.jsonというデータファイルに変換します。colmap2nerf.pyにrun_colmapをつけるとCOLMAPが実行されます。
COLMAPのモデルデータはcolmap_textフォルダにテキスト形式で保存されます。cameras.txtが内部パラメータ、images.txtは外部パラメータに相当します。

colmap2nerf.pyにrun_colmapをつけない場合、colmap_textフォルダに置いてあるモデルデータを使用することになります。

![12-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/d2268308-bf4a-1a72-6299-fd4dcdb17a01.png)

そのモデルデータをRealityCaptureからexportしたデータと挿げ替えることが目的です。

#### transform.json
transform.jsonは画像のファイル名とカメラパラメータ、instantNeRFの表示領域のパラメータを記録しています。
![12-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/24b47ad3-abfd-e6a4-6fbf-188e2e0353da.png)

transform.jsonはこのあとカメラごとの外部パラメータが続きます。

カメラの内部パラメータはcameras.txtをほとんどそのまま写されています。
一方、カメラの外部パラメータはimages.txtを形式の変更と座標変換が行われています。例えばカメラの向きの形式はimages.txtがクォータニオン、transform.jsonが回転行列です。

#### 方針
カメラ情報の解析結果をRealityCaptureで代用する内容の案はこちらです。
- カメラの位置
- カメラの外部パラメータは全部（位置と向き）
- カメラの内部パラメータと外部パラメータは全部

![12-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/7d66cb27-bc77-edd0-f890-1d8fad0d4bf2.png)


#### 課題
下記の内容を理解する必要がありそうです。
1. COLMAPのモデルデータ
1. RealityCaptureのRegistrationデータ
1. colmap2nerf.pyの座標変換

各項目の内容が大きいことや情報の検索性を高めるため、日にちを分けて検討していこうと思います。
eSIM(本体に埋め込み・書き換え可能）のGSMA仕様の超訳

IoT時代を生き抜くために、通信する産業用ロボや車などに埋め込まれるであろう、eSIMを避けていてはサバイブできない気がしてきましたので。

eSIMの仕様を定めるGSMAの公開文書を読んでポンチ絵にしていきます。
とりあえず初心者は、SGP.02、21, 31, 22を読んでおくと良いらしい。

ETSIの標準はあまり読まないですが、3GPPの標準化はしてたので読めるはず！

# 更新履歴
12/8 ポンチ絵（妄想）と参考文献を並べた

# 概要ポンチ絵
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/e4a3529b-634d-26f0-4d82-d1b1b68c2476.png)

# 参考文献
[1]SGP.21 eSIM アーキテクチャ V3.0 2022/3月版 https://www.gsma.com/esim/esim-specification/
[2]SGP.31 eSIM IoT アーキテクチャと要件 V1.0 2022/4月版　https://www.gsma.com/esim/esim-specification/
[3]SGP.22 eSIM 技術詳細　V3.0 2022/10月版　https://www.gsma.com/esim/esim-specification/
[4]SGP.08 eSIM セキュリティ　V1.2 2022/07月版 https://www.gsma.com/esim/esim-specification/
[5]SGP.18 eSIM セキュリティ　V1.0 2022/10月版 https://www.gsma.com/esim/esim-specification/
[6]SGP.25 eSIM コンシューマ（スマホ向け） V1.0  2018/05月版 https://www.gsma.com/esim/esim-specification/
[7]SGP.14 eSIM PKI（公開鍵） V2.0 2021/2月版
全部下記からダウンロード可能
[8]SGP.02 eSIM リモート設定 v4.2 2020/7月版　https://www.gsma.com/esim/resources/sgp-02-v4-2/

# 以下詳細

#
マンガの読者 について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。

マンガの読者。ご存じだろうか。PowerPoint (他 Word など) の中から使えるイラストたちである。

https://ppdtp.com/powerpoint/tamori/

タモさんが作れるという。さっそく昨日書いた [Snipping Tool について知らなかったこと - Qiita](https://qiita.com/e99h2121/items/f40580e524e7e67cebed) の枠線も活かしながらタモさんを書いてみよう。

顔
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f94ff679-67e2-e21a-8a1b-e9f55535c824.png)

サングラス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/12725df2-335d-9b49-1c50-42631e63117e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/9e39c751-ce54-cb3f-480a-2c5693cab881.png)

上半身を足して、頼れそうなタモさんにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ae0b946d-601b-dd91-a511-a62268f40a97.png)

Marp でスライドを書いてきた私ですが、PowerPoint にも慣れたいと思います。

[【VS Code + Marp】Markdownから爆速・自由自在なデザインで、プレゼンスライドを作る - Qiita](https://qiita.com/tomo_makes/items/aafae4021986553ae1d8)
[Markdownでスライドを書こう - Marp用テンプレート - Qiita](https://qiita.com/e99h2121/items/79db6b7375ccbf3d3977)

なおこの「マンガの読者」というわかったようなわからんような日本語は [Open Peeps, Hand-Drawn Illustration Library](https://www.openpeeps.com/) というやつらしい。そのうち我らの [かわいいフリー素材集 いらすとや](https://www.irasutoya.com/) も加わったらいいんじゃないだろか。以上今日わたしが知らなかったことでした :star2:
lytnoteという概念

# はじめ
　目標を管理して進捗を追うアプリを作りたかった。私が必要とするためである。当時は毎月目標をたてて、月末に目標の達成状況を確認する、ということをメモ帳に書いていた。なんか味気なかったし、単純に面倒臭かった。世間にはTODOアプリが多く存在しているが、「目標を設定し振り返りを行う」というアプリは意外となかった。

# 名付け
　ちょうどRailsの学習も良い頃合いにあったので、ポートフォリオとしてアプリをつくることにした。最初期のアプリ名はsimple-recordとしていた。ただ、デプロイの前にドメインを取る準備をしていて、名前が気になった。

「simple-recordでは単純すぎる」
「Googleで検索すると複数のサイトが出てしまう」

　そのような理由もあり、名前を再考した。英字がかっこいいなと思った。ただ、memoやnoteなどシンプルすぎてもだめ。むずかしいな、やることは単純な振り返りなのに。feedback?　なんかしっくりこない。

　そこで特に意味がない語を先頭につける。漢文の「而」のような。（後で調べたら、而にも意味はあり、書き下しの時に読まないだけだった。）zi-note？ちょっとカッコ悪い。もっと軽い感じが良い。ライト、light。これだ。

　lytを頭につける。ネズミの遺伝子の名前らしいが、書き心地も読み心地も良い。

　そうしてlytnoteが生まれた。

https://lytnote.com/

　このアプリは単純なメモ書きであり、厳密な管理をしない。ユーザーが長く続けられるようにもっと使い心地を追求しないといけない。さながら野帳のように。

　まだまだ改善が必要だ。
AWS CloudFront障害時にRoute 53のフェイルオーバーが効かない設定を見直した話

# はじめに
久しぶりの投稿です。
毎週記事を書くといいながら2ヶ月も記事の投稿がストップしていました。
あ、サボっていたわけではありません。
実はこの2ヶ月間は資格の勉強をしていてAWS認定資格もちゃんと２つ取りました。
その後ワールドカップというイベントに参加して、世界のサッカートレンドを学習したり、なんやかんやで投稿を先送りにしていました。
言い訳はこのあたりにしまして、本題に参りたいと思います。

今回担当案件でインフラ構成にまずい部分がありました。
改善しましたので備忘録として残したいと思います。
説明下手でわかりにくい箇所等あるかと思います。ご了承ください。
また、ご指摘ご意見ありましたら教えてください！お待ちしています。

# 前提
構成は下の図のようになっています。
実際の構成はもっと複雑で冗長化もしているのですが、今回は必要な箇所だけ。
[![Image from Gyazo](https://i.gyazo.com/864baf2d4713c2c3657fc5d15b6e7dd8.png)](https://gyazo.com/864baf2d4713c2c3657fc5d15b6e7dd8)
- CloudFrontからALB、そしてEC2インスタンスへ通信が進む。
- CloudFront障害時はRoute 53のフェイルオーバールーティングによりALBへトラフィックをルーティングする。
- 特定のIPアドレスのみ許可するため、ALBリスナールールに次を設定
    - HTTP Header
    - X-Forwarded-Forが通信OKのIPアドレスの場合、ターゲットのEC2インスタンスへトラフィックをルーティングする。
[![Image from Gyazo](https://i.gyazo.com/78a9415ee858486ddd43881e33c03a08.png)](https://gyazo.com/78a9415ee858486ddd43881e33c03a08)
- CloudFrontからALBへcustom headerは渡さない
    - フェイルオーバー時にCloudFrontを経由しないため、custom headerを設定するとフェイルオーバールーティングがALBではじかれるため

[![Image from Gyazo](https://i.gyazo.com/c32f67af69bd1c178e8a72aa1d8bfbf8.png)](https://gyazo.com/c32f67af69bd1c178e8a72aa1d8bfbf8)


# 課題
### CloudFrontに障害が発生し、Route 53によりALBへフェイルオーバールーティングが行なわれた場合
CloudFrontを経由しないため、X-Forwarded-Forのリスナールールに一致せず、ALBでエラーを返してしまう。
![cb5110df64f832ccd391648c8156cc5e (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/2369d10a-a2de-aaf1-ef3c-49bb270f2519.png)


custom headerを渡さないだけでなく、次の両者ともにALBのターゲットであるEC2インスタンスへの通信を可能な状態にしたい。
- トラフィックがCloudFront経由（X-Forwarded-For）でALBに来る場合
- トラフィックがCloudFrontを経由せずにALBに来る場合

# 改善案
ALBにおいてCloudFront経由（X-Forwarded-For）で来る場合とCloudFrontを経由しない場合のどちらのIPアドレスにもtargetへのルーティングを許可します。

解決策としては以下の2点を考えました。
1. ALBリスナールールにX-Forwarded-Forに加え、送信元IPアドレスを追加し、targetへ通信を許可する
![cb5110df64f832ccd391648c8156cc5e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/de2c5d67-7b68-e37e-c892-9acc03b00695.png)
    - メリット
        - 無料で設定可能
    - デメリット
        - リスナールールには上限あり
        - リスナールールが煩雑になり、管理しにくく漏れが発生する可能性あり。
   
2. AWS WAFを利用してIPのホワイトリストを設定し。ALBにアタッチ
    - メリット
        - 管理がしやすい
    - デメリット
        - 料金がかかる
        
設定方法等はこちらがわかりやすかったです。

https://qiita.com/bython/items/7dfd6d972a0e5c6b5657

# 解決
結局、管理面を考慮し、AWS WAFにルールを設けることになりました。
え、リスナールールの方が簡単だし、無料じゃん！とも思われますが、実際の環境ではたくさんの許可IPアドレスが存在し、さらにいくつかのパスも指定しなければいけませんでした。
リスナールールが複雑になってわかりにくいためWAFを利用しました。

# 最後に
AWSの業務をする時が一番楽しいなと感じる今日このごろ。
設計も答えは一つではなく、様々なパターンがあるんだなと日々勉強になっています。
そもそもCloudFrontに障害が起こる可能性ってどれくらいなのかなーと思ったりします。
調べてみるとちょこちょこあってるみたいですねー！
日々勉強です！
もっとこういう設計にすればいいじゃないという意見があればください！

# 参考
https://qiita.com/bython/items/7dfd6d972a0e5c6b5657
オンラインって本当に楽しい！

こんにちは！
<a href="https://qiita.com/advent-calendar/2022/life-is-tech-kanto">Life is Tech ! Kanto Advent Calendar 2022</a>の8日目を担当します、「じゃがりこ大好き」映像制作コースメンターのあべさくです！


<h1>書こうと思った背景</h1>
スクールでは土曜オンラインのCAを2年間やらせてもらったり、<br>
2020冬キャンではオンライン演劇をやらせてもらったり、<br>
School X の立ち上げに関わらせていただいたり、<br>
オンラインカメラマンをしたり、、、<br>
などなど、Life is Tech ! では、『オンラインの人』という印象も持たれているなと感じるようになりました<br><br>
加えて、オンラインのサークルを立ち上げたり、オンラインの学生団体に所属してみたり、<br>
他のコミュニティでもオンラインのコンテンツを考えることが多かった大学生活だったなあと思っています<br><br>
そんな大学生活の中で『オンラインの人』として漠然と、ある目標を掲げていました。それは、<br><br>
「オンラインって楽しい！」って思わせること。<br><br>
これまであまり、オンラインでのコミュニケーションのコツがまとまった記事などはないなと思ったので、オンライン伝道師として、オンラインの魅力やオンラインでのコミュニケーションのコツをお伝えします！


<h1>オンラインとは</h1>
ここでは本来対面で行っていたことをオンラインで行っているイベントなどをさすことにします

<h1>オンラインでのコミュニケーション</h1>

<h3>概念的なところ</h3>
さて、オンラインでのコミュニケーションで困ることとして、「相手の表情や空気感がわからなくて、戸惑ってしまう」というのをよく耳にします

確かに、オンラインでのコミュニケーションを抽象的に考えると、対面でのコミュニケーションとは異なり、目の前にいても、拒絶しようと思えばカメラとマイクをオフにして拒絶できる、というかなり合理的なコミュニケーション形態です

そんな環境下でも、<br>コミュニケーションを取ろうと思ってくれる=ちゃんとコミュニケーションとりたいという気持ちがある<br>ということだと思っています

相手に「コミュニケーションを取りたい」と思わせなければコミュニケーションができないのではないでしょうか。
なので、まずは、オンラインでコミュニケーションを取ることができている人は**自信を持って欲しい**です

<h3>意識しなければいけないこと</h3>
実感したことがある人も多いかと思いますが、オンラインでは、対面でのコミュニケーション以上に『大袈裟に』振る舞う必要があります<br>
対面でのコミュニケーション以上に伝わることが少ないからです<br><br>

ただ、全ての会話において大袈裟にする必要はありません。
本当に伝えたいことだけを大袈裟にすれば良いのです

<h3>複数人の場合</h3>
オンラインでのコミュニケーションで困ることとしてよく聞くのが、<br>
「複数人で話すのが難しい」ということ。<br>
<br>
ただ、意識するべきことは、「今誰が話していて、話の流れがどうなっているのか」です<br>
これは、対面ではあまり意識しないだけで、複数人で話している時はみんなが無意識に考えていることなのです。普段は無意識だからこそ、いざオンラインで意識して話そうと思うと、難しく感じてしまうことが多いように感じます<br>

<h1>オンラインだからこそ実現したこと</h1>
上記を踏まえて、オンラインだからこそ実現できたことは、大きく二つあると思っています<br>
<h4>1. 人見知りの人でもコミュニケーションを取れる</h4>
   人見知りだとしても、話す相手がコミュニケーションを取ろうとしてくれている状態で、カメラとマイクを消して相手とのコミュニケーションを拒絶するのは、流石に心が痛い、、、、と感じる人が多いように感じます。案外、初手対面よりも、初手オンラインの方が必要な時以外のコミュニケーションは要さないため、安心できるのではないかと思います。これまでLife is Tech ! でオンラインスクールをやってきて実感しました。<br>
なので、本当に人見知りで新しい環境ではどうにもならない！という方は、一旦オンラインでコミュニケーションを取ることもお勧めしたいです<br>
<h4>2. 幅広い人とのコミュニケーションを取れる</h4>
オンラインで日本に限らない、海外の大学生や中高生とも関わってきました<br>
もちろん、対面でも可能ですが、やはりその手軽&気軽さから、行動にうつしやすいように感じます<br>
実際、私はコロナ前に英会話サークルを立ち上げたかったのですが、仲間が集まらなかったのと、海外の方との交流がいまいち掴めなかったことから一度断念しています<br>
その後、オンラインで英会話サークルを立ち上げ、仲間集めも、その後の活動も、比較的円滑に進みました<br>
行動への移しやすさ故の成功だったと思っています<br>

<h1>オンラインでのアクティビティ</h1>
現在withコロナの生活様式が定着してきて、ここからオンラインでのコミュニティを立ち上げる人は少ないとは思います<br>
ただ、もしもオンラインから始まるコミュニティがあるのだとしたら、まず進めたいのが、やはり<br>「<a href="https://garticphone.com/ja">Gartic Phone</a>」と「<a href="https://loungegame.site/top/V2P5XJPBLJGCLM46SAS6PBLKTA">ラウンジ</a>」<br>
今となっては知名度も上がってきましたが、やはりシンプルかつ自由度の高いゲームのため、どんな環境でも使いやすいのが特徴です<br><br>
稀に、サイトやPCの環境上使えない場合がありますが、その際はホワイトボードを画面共有して絵しりとりなどをするのもお勧めです<br>
これはLife is Tech ! のオンラインスクールに入る人に向けた情報になりますが、初めてオンラインスクールに入る時や、代講で入る時にも、一旦アクティビティを挟むだけでかなり心の距離が縮まります<br>
時間を惜しまずに一度アクティビティを挟むのも、オンラインでのコミュニケーションをとるコツかなと思っています<br>

<h1>アドカレ書いてみて</h1>
本当はもっと深い内容にしたかったのですが、ちょっと間に合わず、、、不完全燃焼な感じがありますTT<br>
あと、実際みんながどんな情報が欲しいのか、とか聞いておけばよかった、、とちょっと思ってますTT<br><br>
でもでも！オンラインでのコミュニケーションの抵抗感が少しでもなくなってくれたら本望です！<br>
「オンラインだから」避けるのではなく、オンラインでの楽しみ方も一緒にもっと探していきたいよっ！という思いも込めた記事でした！<br>
他にも欲しいオンラインでのtipsなどがあれば、是非是非教えてください！！<br>
追記していきます！
Puppeteer実装時に参考にしたページ

下記の記事が参考になりましたので、自分用に残しておきます。

[Puppeteerで複数のURLはPromise.allで処理したほうが倍以上高速](https://iwb.jp/puppeteer-multiple-url-promise-all-several-times-faster/)
[コピペで簡単！puppeteerのこんなとき実例８件](https://blog.capilano-fw.com/?p=5824)
[Puppeteerを使ってボタンクリックとダウンロード](https://officeforest.org/wp/2020/02/18/puppeteer%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A8%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/)
[puppeteerでファイルをダウンロード](https://rinoguchi.net/2020/12/puppeteer-file-download.html)
[Puppeteerでファイルダウンロード](https://qiita.com/horikeso/items/69528c2b21ede15a56ee)
[Puppeteerでファイルをダウンロードする2022]()
[puppeteer でファイルをダウンロードするときに、任意のパスと名前を指定して保存する](https://aquasoftware.net/blog/?p=1583)
[Puppeteer の使い方](https://vicugna-pacos.github.io/puppeteer/how-to/)
[puppeteerのoptionsのメモ、とくにwaitUntilの値をよく忘れる](https://blog.local-c.com/archives/3275)
Ledger CLIで家計簿をつけたい！入門6 PL(損益計算書)を見る

前編↓

https://qiita.com/kikeg/items/1b72edf179c1fef66751

# 実践

前の貸借対照表のような御託を並べるのはもう疲れました。この図を見てください。

![損益計算書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2278753/41b3f9da-cf58-3114-412b-2fb37f4c3659.png)

損益計算書というのは昨日見た貸借対照表と逆のことを言ってるだけです。収入から費用を引いて残るのが利益、ということを端的に表すのが損益計算書です。

```shell-session
$ ledger -f root.ledger bal ^Income ^Expenses ^Loss ^Profit
          24,493 JPY  Expenses
           5,000 JPY    Cash
           6,578 JPY    Fun:Game
           2,915 JPY    Grocery
          10,000 JPY    Travel
         -10,000 JPY  Income:Baito
--------------------
          14,493 JPY
```

これはややこしいですが、費用-収入なのでプラスなら赤字、マイナスなら黒字になります。そしてこの数字が昨日見た貸借対照表のときの残高のちょうど符号を反転した数になります。

そういえば、この使ってるデータをGitHubにあげておきました。自分で入力した人は同じものなのでpullしなくて大丈夫です。

https://github.com/xkikeg/ledger-codelab

明日からはまた入力に戻っていくつか応用的な記録tipsを紹介して、その後visualizationやまともな解析（前年同月比や前月比）ができるかやってみます。僕もやったこと無いので興味津々です。では。