OmniAICreator/Qiita-1.07M huggingface dataset:
シェルスクリプトでSSH接続してユーザーを切り替えてコマンド実行する

# 結論

以下のように、ssh接続してヒアドキュメントで実行したいコマンドを書いてやれば、
SSH接続してユーザーを切り替えてコマンド実行できます。

```shell:run.sh
ssh loginuser@target-server -tt << EEOOSS

sudo su - anotherloginuser << EOS
ls # ここに実行したいコマンドを書く
EOS

exit 0

EEOOSS
```

### --ttオプションについて

`-tt`オプションをつけないと以下のようにコマンドが失敗します。

```shell
$ sh run.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: 残念ですが、sudo を実行するには tty が必要です
```
セレクター

# 種類
・要素型
1class(.)(-,_,英数字使える。数字から始めてはいけない)(共通のクラスを半角スペースで追加できる)
```html
 <div class="box box-1">Box 1</div>
  <div class="box box-2">Box 2</div>
  <div class="box box-3">Box 3</div>
```

2id(#)(一つのページに一つ)
3属性(typeとか)
    →完全一致(=)、前方一致(^=)、後方一致($=)、部分一致(*=)
     [属性＝"属性名"]
4全称(* ,書いてある全てを選択する。*{})
# 組み合わせ
1a,b
    (セレクターを複数、「または」という意味、個々に指定できる、改行する、２種類以上)
2ab
    (二つの要件を満たすもの,繋げる、「なおかつ」と言う意味(dic.box)、１種類OR全ての要素)
3a > b
    (子要素を選択する)
4a b
    (子孫要素を選択する、半角空白)
5a + b
    (兄弟要素を選択する、直前がa要素のb要素)
```
 <ul>
    <li>項目</li>
    <li>項目</li>
    <li>項目</li>
    <li>項目</li>
  </ul>
```
１番目のli以外につく。

# 擬似クラス1
:nth-child()
    ・空白は入れない。li:nth-child(3)と書く。兄弟要素のうちの何番目につくか。
    ・()に３n→3の倍数、odd→奇数、even→偶数
:first-child
    ・空白は入れない。li:first-childと書く。
:last-child
    ・空白は入れない。li:last-childと書く。

# 擬似クラス２
:hover
    ・少し色が変わる。
:focus
    ・インプット要素のようにfocusがもてるやつのみ。
:action
    ・ボタンを押し込んだり要素をクリックしたときの状態を表現する。
# 擬似クラス３
:not()
    ・()かっこの中がついていないものは外す。()の中は.クラス名など。
# 擬似要素
擬似クラスと違い::から始まる。
::after
::before
```
p::after {
  content: ' -';
}
```
contentは中身の変更。

#　詳細度１
三つの基準からなる。上が優先される。
１idセレクターが出て来る回数
２class,擬似クラス,属性セレクターが来る回数
３要素セレクター,擬似要素が来る回数
＊検証では詳細度が高い順に出て来る。

# 詳細度２
上よりも優先される方法
１!importantを最後に書く
```
a {
  color: red !important;
}

```
２styleでHTMLに直接書く。
【pinia-plugin-persistedstate】PiniaでのStore永続化

ページのリロードでstoreのデータが消えてしまわないよう、storeの状態管理を永続化したい場合はライブラリを利用することで簡単に実現可能です。

Pinia対応のライブラリはいくつかあるようです。

- https://github.com/iendeavor/pinia-plugin-persistedstate-2
- https://github.com/Seb-L/pinia-plugin-persist
- https://github.com/prazdevs/pinia-plugin-persistedstate

今回は最もfavoriteと利用者が多く、更新頻度も高そうな[pinia-plugin-persistedstate](https://github.com/prazdevs/pinia-plugin-persistedstate)を採用します。

## 環境構築
- [公式リファレンス](https://prazdevs.github.io/pinia-plugin-persistedstate/)
- [公式GitHub](https://github.com/prazdevs/pinia-plugin-persistedstate)

### 前提

- Vue3
- Vite
- TypeSciprt
- Pinia

上記の環境構築については、記事にする予定

### 方法

1. インストール
    
    ```bash
    yarn add pinia-plugin-persistedstate
    ```
    
2. 設定
    
    main.tsにプラグインを追加します。
    
    ```jsx
    import { createApp } from "vue";
    import App from "./App.vue";
    import { createPinia } from "pinia";
    import { createPersistedState } from "pinia-plugin-persistedstate"; // 追加
    
    const pinia = createPinia(); // 追加
    pinia.use(createPersistedState()); // 追加
    
    createApp(App).use(pinia).mount("#app"); // 修正
    ```
    
3. storeを永続化
    
    永続したいstoreで `defineStore()` の新しいオプションに `persist:true` を設定します。
    
    ```jsx
    // src/stores/counter.js
    import { defineStore } from "pinia";
    import { ref } from "vue";
    
    export const useCounterStore = defineStore(
      "counter",
      () => {
        const count = ref(0);
        function increment() {
          count.value++;
        }
        return { count, increment };
      },
      {
        persist: true,
      }
    );
    ```
    
    リロードしてもstoreのデータが消えなくなったことが確認できます。
Salesforceのウォークスルーを設定しよう

こんにちは


今回はSalesforce「ウォークスルー」を見ていきましょう

https://help.salesforce.com/s/articleView?id=sf.customhelp_lex_wt_add.htm&language=ja&type=5

今回の内容は動画でも公開されています

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/G57F8l2uTeI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

ウォークスルーの制限などはこちらのヘルプなどでご確認ください
https://help.salesforce.com/s/articleView?id=release-notes.rn_general_iag_freemium.htm&type=5&release=232


ウォークスルーを設定すれば特定の画面で特定の文章や画像、リンクの表示が可能です

![opp0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/aff43135-cd79-762d-f26a-af5cc1314a51.png)



では設定方法を確認しましょう

クイック検索から
「アプリケーション内ガイダンス」
をクリックし追加をクリックしましょう
そうすれば特定のSalesforce画面で特定の文章やリンク、画像を表示させることが可能です

なお、設定を反映したいユーザプロファイルや表示させるタイミングも設定可能です

いかがでしたでしょうか

Salesforceをはじめて作成するユーザは
・どのボタンをクリックすればデータ作成ができるか
・次にどのボタンをクリックすればいいのか
と運用が難しい場面が出てくることがあるかと思います。

ぜひこの機能を活用し、よりよいSalesforceの運用ができればと思います
わかったふりをしていたphp-fpmってなんなのかを図解してみた

# PHPの実行には種類がある

何言ってるんですか？PHPはPHPでしょ？っていう人ほんとは僕だけじゃないですよね？

WEBサーバーがHTTPリクエストを受け取ったあとにPHPのプログラムが実行されるわけですが、その実行方法には種類があるというのです。

その種類についてウルトラ簡単に図解してみました。



# Apache モジュール版

![draw.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373655/691823dc-1a2a-9ff5-5bcd-bd61fdd925ad.jpeg)

ついこの間までWEBサーバーの代名詞とも言えたApacheですが、この方法ではPHPの処理はApacheに内包されたようなイメージで実行されます。

PHPのサーバーでの処理プロセスが、Apacheと同じプロセス内で実行されています。

この方法は比較的高速にPHPを実行することができます。

そのためかつてはメジャーな実行方法だったなという印象でした、たぶん。

デメリットがあるとすれば、WEBサーバーの実行ユーザーがそのままPHPのプログラムも実行していきますので権限が強いユーザーがアプリケーションの実行も担ってしまうことになることです。

サーバーによってはrootユーザーがPHPを実行しにいくこともあることを考えると、システムをぶっこわすような処理も動いてしまう？なーんてことも考えられたり考えられなかったり。


【メリット】
**PHPのプロセスを別で立ち上げ直す必要がないので早い！**

【デメリット】
**セキュリティ的に危ないかも**



# CGI

![draw.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373655/9efb8337-3722-5a5d-b494-69551b1859dc.jpeg)

CGI (Common Gateway Interface)。

なんのこっちゃということですが、要は

**WEBサーバーがリクエストを受けてからプログラムが実行されてリクエストが返却されるあたりの仕組み**

このことをCGIと呼ぶみたいです。

WEBサーバーとプログラミング言語の実行(つまり動的に返却するコンテンツを作り分ける機能)という本来別の処理が連携されている2つのものの共通、という部分にフォーカスされているのかなと思います。

PHPの起動方法の呼び方については、そもそも歴史的に次の技術がでてきて呼び方を追加するような感じになっているのかなとも思うので個人的には比較するにはあまりわかりやすい呼びわけにはなっていないと思います。

あとはその実行されるプログラムだけを指すこともあるとかないとか。

CGIの場合は先ほどのPHPモジュール版の実行のデメリットは解消しているのですが、メリットを失っているイメージです。

PHPのプロセスが別で起動する分、起動時、終了時の手間がかかり速度が鈍化します。


【メリット】
**プロセスが別なのでセキュリティ的に制御がしやすい**

【デメリット】
**PHPのプロセスを別で立ち上げ直すので遅い**



# FastCGI

![draw.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373655/acb9114c-a336-d737-9f4c-3f9325723bda.jpeg)

CGIの悪い部分を無くした感じ。

PHPのプロセスはWEBサーバーのプロセスに従って起動・終了を繰り返すのではなく、

すでに起動しているプロセスを使用するためコストが少ないわけです。

ゆえのFAST。

最近?でもないですが、昔はメジャーではなかったphp-fpmがいろんなプロジェクトで常識になってきたのはnginxの普及が大きいのかなと思います。

モジュール版の説明にApacheというWEBサーバーの名前が名指しだったのはNginxではモジュール版という概念は存在しないからです。

Nginxはphp-fpmとセットでないと実行することができません。



【メリット】
最強


# まとめ

厳密に説明すると少し混乱することもあるかと思いますが、ざっくり

**WEBサーバーは2強、ApacheかNginxか。**

**Nginxならプロセスが別であるphp-fpmを使う**

**Apacheならプロセスが一緒であるモジュール版での実行もあり**

くらいな感じで、リクエストを受け付けるWEBサーバー というものとア プリケーションを実行するためのプログラミング言語実行プロセス というものの立ち位置を理解できていればビジネスの従順なしもべとしてシステムを開発していくにはまず困らないかなと思いました。
これからのエンジニアはジェネラリストになれ！

CTOとして30年やってきました。
集大成としてCTO・エンジニアを増やすという事を目標にやってます。
優秀なCTOが育てば、優秀なエンジニアが育ち、優秀な企業が日本からも沢山生まれると思います。

# これからのエンジニアはジェネラリストになれ！

これからと言っても１０年以上前からこの話をしてきました。
今の時代は、VUCA(ブーカ）時代と言われてます。今まで考えもつかなかった様な早いスピードで、今まで考えも着かなかった様な変化が起こり、将来・未来が予測不可能な時代と言われてます。
・ロシアが戦争を始めたり
・コロナで一斉に各国が鎖国を始めたり
同時に
・AIの画像生成エンジンの進化・オープンソース化で色んな画像が生まれたり
・ブロックチェーン、NFTでデジタル価値に注目が集まったり
将来の技術トレンドとかを読み解いて準備するのは難しい時代になってます。

**こんな時に求められる人財というのは、Agilityが高い人財です。**

このAgilityは、Speedが早いだけではありません。俊敏な動きができる人財です。

# Agilityとは

Agilityとは、ツーリングとパッケージツアーの違いで説明できます。
昔は、決められた場所に沢山の人数で決められたルートで到達するパッケージツアーが主流でした。
これは、その方がコストも安いし、不慣れな部分を全員でカバーして専門家の基、安全に目的地に到着するためでした。
しかし、昨今、LCC等の普及やAirbnb等の普及で移動コスト、宿泊コストの選択肢は広がりました。個人の趣味嗜好に合わせて選択する必要があります。そしてネット情報の普及で情報が取得が簡単になり、専門家が必要なくなりました。
つまり目的地だけ決めておいて、移動手段や移動のタイミング等は、勝手に選択して良い、勝手に選択しなくてはならない時代になってきてます。大雑把な計画の中で各々のジャッジで進んで行くツーリングの力が必要となってます。

**これは経営に置いても同じです。**
全員でルールを守って一緒に開発して、一緒にテストして、一緒にリリースする時代は終わりました。
各々のエンジニアは、リモートワークに移行し、自分の裁量の中で開発を行い、納期に間に合わせる。互いがコラボレーションしながら作り上げていく時代です。
個々人の調整能力がとても求められる時代になってきてます。

# エンジニアにとって幅広い知識が求められる

これは、一人のエンジニアがプログラミングのみを知っていても駄目という事に繋がります。
席を並べて議論しながら決めていく事が出来ない以上、エンジニアは、プログラミングでもシステム全体のRASISを考慮する必要があります。
RASISとは、Reliability（信頼性）、Availability（可用性）、Serviceability（保守性）、Integrity（保全性）、Security（安全性）。
そのためには、ネットワーク、データベース、OS、サーバー等トータルでの知識が必要です。

プログラミングのスペシャリストとしてだけでは、価値が出しにくい状態です。
**そのためエンジニアは、スペシャリストでなく、ジェネラリストになっていく必要があります。**

Generalになるためには、
・幅広い情報吸収
・幅広いスキル取得
等、幅広い能力が必要です。

更に、Specialistではないので深く知る必要がありませんが、
浅すぎると役に立たないGeneralistになってしまうため注意が必要です

ただ、これだと無理！出来ないと思ってしまうかもしれません。

# ジェネラリストになるには
ジェネラリスト(Generalist)になるポイントは、まずは本質を理解する事です

本質を知れば、表面的なものが変わっても対応する事ができます

例えば、家の作り方を本質的に理解しとけば、新しい建築方法が出来たり
ビルの作り方とか、色々と対応する事ができます。

そして大事なのは、
・一度、本質的に理解する事
・情報は常に吸収する事
・情報と知識で整理整頓する事
このサイクルが重要となります

１．一度、本質的に理解する事
　得意なエンジニア領域（Go,Java,etc)なら深くしっかり理解します
　不得意な分野については、まずは勉強してみましょう。もしくは、得意な人を仲間として活用する事です

２．情報は常に吸収する事
　得意な分野で無い場合は、得意な人とディスカッションを行い、情報収集を怠らない様にします

３．情報と知識で整理整頓する事
　収集した情報をもっている知識をベースに
　・これは新しい
　・これは難しそうで廃れそう
　等、自分なりの見解としてジャッジし、整理整頓し行動を決めます
　但し、自分のジャッジが間違う可能性もあるので常に情報収集しながら軌道修正も必要
　＊大変そうにみえますが頻度は年１くらい

是非、VUCA時代に耐えられるアジャイルなジェネラリストなエンジニアになって欲しいと思います！
本番DBと開発用DBをシェルスクリプトで同期する

# 背景
本番DBと開発用DBでデータが大きく乖離してしまって、開発環境で有効なテストができない(特に処理速度の検証など)...。というのはおそらくどの企業でも抱える悩みだと思います。

なので、本番データのダンプを取って開発用DBに流し込む作業が発生したりしますが、これを手動でやると、、、

- AWSのインスタンスにsshで入ってダンプを取る
- それをローカルに一度持ってくる
- それを開発用サーバーにアップロードする
- 開発用サーバーでダンプファイルを実行する
- 不要になったダンプファイルを削除する

と、ちょっとめんどくさい工程を何度もやる羽目になります。そこで、これを自動で行うシェルスクリプトを作って楽しようというのが今回の趣旨になります。(完全自動はプログラムだとすれば、半自動ですね)


# バージョン1: ローカルのファイルをリモートで実行させるパターン
```shell: migrate_table.sh
echo '本番からステージングにmigrateするデータベースを入力してね: ' && read database;
echo 'どのテーブルをmigrateする?: ' && read table;

echo '=======処理開始=======';
ssh production-instance "mysqldump --extended-insert --no-tablespaces -u [user name] -h [host name] -p[password] ${database} ${table}" | gzip > "${table}_dump.sql.gz";
echo '本番テーブルのダンプ完了(1/2)';
gzip -d "${table}_dump.sql.gz";
ssh staging-instance "mysql -u [user name] -h [host name] -p[password] ${database}" < "${table}_dump.sql";
echo 'ステージングにmigrate完了(2/2)';
rm "${table}_dump.sql";
echo '=======処理終了=======';
exit;
```

### point1: ssh [接続先] [実行スクリプト] でサーバー側でスクリプトを実行できる

```shell
ssh production-instance "mysqldump --extended-insert --no-tablespaces -u [user name] -h [host name] -p[password] ${database} ${table}"
```

この部分がそうですね。これで、本番サーバーでmysqldumpを実行しています。ダンプするデータベースとテーブルは指定する必要があるので、スクリプトの最初の`read database`や`read table`でコンソールから入力された値を保持し、mysqldumpの実行文に展開します。

### point2: ssh接続は.ssh/configで別設定
```shell:.ssh/config
Host production-instance
    HostName [ホストのIPアドレス]
    User [ユーザー名]
    IdentityFile [秘密鍵ファイルのパス指定]

Host staging-instance
    HostName [ホストのIPアドレス]
    User [ユーザー名]
    IdentityFile [秘密鍵ファイルのパス指定]
```

こんな具合に設定を加えておくと、`ssh [ユーザー名]@[ホスト名] -i [鍵のパス]`と面倒なコマンドを打たなくても、`ssh production-instance`でぱぱっと接続できます。

### point3: --extended-insertオプションで複数行インサート文でダンプを作成する

今回ダンプすることになったテーブルは、本番環境で約300万行に及びます。これを通常のダンプファイルにすると超大容量のsqlファイルが生成されますし、何よりインサート文を1行ずつ実行するので日が暮れてしまいます。これを回避すべく、`--extended-insert`オプションをつけることによって容量や処理スピードを最適化しています。

### バージョン1の問題点：遅い
バージョン1では、ローカルのダンプファイルを開発用リモートサーバーに実行させる方法を取っていましたが、gzipから回答されたダンプファイルは数百MBに及んでいました。また、それをさらにリモートサーバーがRDSに送信しているので、余計に遅いわけです。というわけで、これを解決すべくバージョン2を作ってみます。

# バージョン2
```shell: migrate_table_v2.sh
echo '本番からステージングにmigrateするデータベースを入力してね: ' && read database;
echo 'どのテーブルをmigrateする?: ' && read table;

echo '=======処理開始=======';

ssh production-instance "mysqldump --extended-insert --no-tablespaces -u [user name] -h [host name] -p[password] ${database} ${table} | gzip > ${table}_dump.sql.gz";
echo '本番テーブルのダンプ完了(1/3)';

scp production-instance:"${table}_dump.sql.gz" ./
ssh production-instance "rm ${table}_dump.sql.gz";

scp "${table}_dump.sql.gz" staging-instance:~/
echo 'ステージングにdumpファイル設置(2/3)';

ssh staging-instance "gzip -d ${table}_dump.sql.gz && mysqldump --extended-insert --no-tablespaces -u [user name] -h [host name] -p[password] ${database} ${table}; rm ${table}_dump.sql";
echo 'ステージングにmigrate完了(3/3)';

rm "${table}_dump.sql.gz";
echo '=======処理終了=======';
exit;
```

バージョン1とは細かな違いですが、ダンプファイル.gzをそのまま開発用サーバーにアップロードして、サーバー上で解凍して実行しているというのがバージョン2の流れです。正確な時間は取っていませんが、バージョン1は300万行で20分以上、バージョン2は同じ行数で数分で処理を完了させることができるようになっています。


# P.S.
ガチで同期取るなら、そういうプログラムを別途作ったほうがいいでしょうね〜。

https://zenn.dev/chycara344/articles/7529bd5539de03
Leetcode 1870. Minimum Speed to Arrive on Time

# 1870. Minimum Speed to Arrive on Time

https://leetcode.com/problems/minimum-speed-to-arrive-on-time/description/

## アプローチ
* 二分探索を活用

```java
class Solution {
    public int minSpeedOnTime(int[] dist, double hour) {
        int start = 1;
        int end = 1000000000;
        int result = -1;

        while (start <= end) {
            int midSpeed = start + (end - start) / 2;
            double keisan = 0.0;
            for (int i = 0; i < dist.length; i++) {
                keisan = Math.ceil(keisan);
                // For example, if the 1st train ride takes 1.5 hours, you must wait for an additional 0.5 hours before you can depart on the 2nd train ride at the 2 hour mark. という条件があり、切り上げ処理が必要

                keisan += Double.valueOf(dist[i]) / Double.valueOf(midSpeed);
                // keisan = Math.ceil(keisan);
                // 合算したあと、切り上げ処理を行うと、最後の計算後に再度切り上げするようになるので合算の先に行う
            }
            
            if (keisan <= hour) {
                // 距離、時間、速度の計算公式で求めている時間より計算結果がつい盛ったら
                // 最後の時間を減らす
                end = midSpeed - 1;
                result = midSpeed;
            } else {
                start = midSpeed + 1;
            }
        }
        return result;
    }
}

```
SharePoint Online のサイドリンクバーをアコーディオンメニューにするだけで２時間ぐらい悩んだ件

こんにちは。
有給休暇を使ってQiitaの記事を書いている陰キャです。

ヘイシャ内にもクラウド化の波がやってきています。
んで、いままで オンプレサーバのSharePoint Server（SPS） を使っていたイントラWebサイトを、SharePoint Online （SPO）に切り替えるってことになってます。

でもまぁ、使い慣れないし、ノウハウもない。
公式サイトの機械翻訳みたいなリファレンスはアレな感じだし、ググっても上位に来るのはSPSの情報ばかりで、なかなか目的の情報にたどり着けず、ムキーーーーーーーーーーーーー！！！！ってなることも多々あります。

本記事のタイトルの作業も、「フツーにできるっしょ」と思ったんですが、軽くハマりました。
他にお困りの方もいると思うので、共有しておきます。


# やりたかったこと
SPOのWebサイトのサイドリンクバーを分類ごとに展開・省略可能な状態にする。
（分類をクリックすると、その内容が表示されるって感じ。まぁ、普通はサクッと出来ると思いますよね）

※「サイドリンクバーを分類ごとに展開・省略可能」だと文が長くなってしまうため、以降は「パカパカできる」と呼びます。

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/937c83f3-19d0-fe2c-cb03-fa785ea9bba8.png)
# 迷走
『フツーに考えて、サイドリンクバーの一番下の「編集」をクリックして、それっぽいアイテムを追加するんだよね？』って思ったですが、それっぽいものがない。
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/f73b36c4-d581-d68d-8361-6102d77e153a.png)
「リンク先アドレスをブランクにしたリンクを追加するとか？」とも考えたんだけど、必須項目なのでブランクでは保存ができない（最終的な考え方としてはこれが正解でした）。
「サイトの設定」あたりでパカパカ設定できるところがあるんやろか？と思って一通り確認したけど存在せず。

公式サイトもGoogleも漁ったけど、前述した通りアレな状態。
「よくわかんねぇけど、そうゆう仕様なのね（ありえねぇなぁ）」とあきらめかけた時に、たまたま社内の別サイトでパカパカできているところを見つけて、方法を聞いて解決できました（正直、「あぁ？なにそれ？」という方法なんですけどね）。

# （ここから本編）パカパカの作業手順
考え方としては、「リンク先アドレスをブランクにしたリンクを追加する」で正解でした。
ただ、普通の編集方法ではできないです。

<b>手順１）</b>「サイトの設定」→「サイドリンクバー」を開く
<b>手順２）</b>画面左下の <b>極めて分かりにくい場所</b> にある「リンクの編集」をクリック
（ヒント表示で隠れて見えない場合もあるので要注意。この見つけにくさは悪意を感じる）
![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/d8870a92-5662-9a71-ef24-7eaa042d6a6e.png)
<b>手順３）</b>画面左下の「＋リンク」をクリック
![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/12161778-e099-a58e-e58f-b03466fcf3bf.png)

<b>手順４）</b>
追加したい分類名を記入し、アドレスはブランクのまま「OK」で保存
![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/2de54862-2a7f-2e99-36ed-40884812b4a1.png)

<b>手順５）</b>
保存する（これ、忘れがちなので要注意）
![img6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955093/dd8ab432-40b1-35b4-2912-a1568308eb24.png)

<b>手順６）</b>あとは通常のサイドリンクバーの編集機能で階層の設定するだけ
（公式の情報にもあるし、ググれば出てくると思うので、以下略です）



# 注意事項と感想
- 裏技っぽい操作なので、現在（'22/11/14）は使えますが、将来的に使えなくなるかもしれません。
もしくは、まっとうな機能が正式に追加されるかもしれません。
- 前述の通り、通常のサイドリンクバーの編集機能ではリンク先がブランクのままだと保存できません。
分類名変更のためには「サイトの設定」に行く必要があります。
- 変化が激しいため、常に過渡期的な状態。しょうがないとは思いつつ、やっぱシンドイっすね。
「有識者と日頃から仲良くしておく」というのが重要だと思います。
英語の発音、大丈夫ですか？人知れずこっそり確認できるアプリです。　「なんで忘れるかなぁ俺の格言。それならつくる！《企画編③》」

## 音声認識は進んでいる
競馬で負けた時に作った勝負事の格言、せっかく作っても有効に使われたことが無く、それを改善するためにスマホアプリを作ろうとしています。
　　　[NOTE記事：なんで忘れるかなぁ俺の格言。それならつくる！《企画編①》](https://note.com/xedge748hagi/n/n1352db87dae7)
　　　[Qiita記事：芸術は爆発だ！私の頭もだ！やり場のない怒りを芸術の域に昇華させる
　　　アプリです。「なんで忘れるかなぁ俺の格言。それならつくる！《企画編➁》](https://qiita.com/Xedge748hagi/items/7f2c0e7bff17fc38198b)
格言のような文章をパソコンではなくてスマホで手入力するのは苦手だなと思い、音声入力ツールを試しました。思ったより間違えずに聴き取って書き出してくれます。ソースコードを見ていたらこんな設定が。
　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/50d04f9d-53e9-5f81-bbb0-064c59c9dd44.png)
'ja-JP'は言語コードといって日本語を表します。言語コードで検索すると一覧が出てきますが、世界には実に多くの言語があるものです。
## 音声認識の精度が原因ではない
日本語以外が試したくなり、'en-gb'［英語（イギリス）］に変えてやってみたところ、日本語とは比べ物にならないほど認識してもらえませんでした。実に恥ずかしい英語力。ちゃんと音声認識アプリに認めてもらえるよう、英語の発音を直さないといけません。とはいえ英会話教室に通うのも大げさだし･･･。
## 英語の発音上達アプリ
ということで英語の正しい発音を聴いて、それを出せるよう訓練するアプリを作りました。
まずは英単語を入力して正しい発音を聴いてください。そして赤いボタンを押下して発音しましょう。認識してもらえば話した英単語の画像が表示されます。自身のある方は最初から音声入力で構いません。cat や dog、Star等、簡単な単語が意外と難しかったりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/f2ff0924-4d06-1790-d2bd-9fabe39910da.png)
【使ったもの】
・HTML、CSS、JavaScript
・CodePen、Vue.js、jQuery、Bootstrap、Netlify
・[Pixabay（フリー画像素材）](https://pixabay.com/ja/)
・Web Speech API
## Netlifyで公開中
https://keen-druid-759d4b.netlify.app/

## 解説
#### ソースコード
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="dyKRGwr" data-user="Xedge748hagi" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Xedge748hagi/pen/dyKRGwr">
  変な英語をしゃべっていませんか？</a> by Xedge748hagi (<a href="https://codepen.io/Xedge748hagi">@Xedge748hagi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

Pixabay に登録して発行されたAPIキーをソースに埋め込む必要があり、上記のソースコードはそれを削除しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/bd6eff53-c323-182a-4ad3-a8bf3b1605d0.png)


#### Bootstrap による画面レイアウト
Bootstrap で画面を作成しました。画面を12分割したグリッドシステムが画面設計をわかりやすくしてくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/9cb07aa7-a59f-eb4c-3232-26d52146b119.png)
ボタンも用意されたものの中から色付きのものを選びました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/85b1778e-9ffc-08c9-03d8-8feed9e6f5f9.png)
#### Web Speech API
画面から入力された英語を this.speech で Speech Synthesis に受け渡して発声させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/6d1754f6-1ce5-2fc3-aa51-6f319ce0ccde.png)
#### 画像検索と結果表示
音声入力を文字に変えて画面に返すと同時に、認識した文字に関する画像を pixabay.com に検索にいきます。0～複数件の画面情報が返ってきますので JSON 形式で受け取り、プレビュー用の小さい画面のURL（previewURL）を取り出して gazou に設定します。gazou は div タグの集まりで、HTML側に送って表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887131/a67ae62e-9599-2aac-eaa1-35ee85b17862.png)
## 最後に
関連する画像検索をしますので、英文ではなく英単語の発音練習になります。思わぬ単語と画像が返ってきますので面白いかと思います。パソコンよりはスマホで人目につかずに使いたいアプリだと思いますので、Bootstrap で画面を作ったのはよかったです。
エンジニア向け：CTO目線のこんな企業がオススメ

CTOとして20年、CTO10社、技術顧問20社以上の森川目線でのこんな企業がオススメをまとめてみました！

１．CTOクラスが沢山いる
　これは、結構特殊ですが、元CTOクラスがエンジニアの人事をやってたり、VPoEをやってたりする企業があります。
元CTOという事は、exCTOなのでエンジニアとして、マネージメント、経営に関してとっても苦労されてた方々です。そして、そのexCTOが認めたCTOが存在する会社という事です。
　更にexCTOの過去のノウハウをその企業のCTOがゲットするという事は、すごいノウハウが集まった会社という事になります。
　逆もあります。創業CTOが退任して、外部から新しいCTOが来てる場合も同様に、ノウハウが集積されている状態ですので、オススメです。
　こーいう企業は、エンジニアの転職先としては、完璧ですよね。

２．人事がエンジニア出身者
　1番と似てはいますが、CTO出身者でなくて、現場でエンジニアをやってた人が人事をやってるパターンです。
　採用面にしても、評価にしても、異動、退職相談に関してもエンジニアの気持ちが分かった人事が調整に入ってくれるので会話がスムーズです。
「アプリメインのスキルだけど、もっとサーバーサイドの開発をやりたい」、「インフラエンジニアをやってるけど、IaC周りをもっとやるべきだけど聞いてもらえない」「scrumのベロシティについて、あまり理解してくれない」とかを話す事が出来ます。
　こーいうのを知らない人と会話するのは、結構めんどくさいです。

３．エンジニア独自の評価や制度がある
　エンジニアは、他の職種の方々と違い、パフォーマンス的な側面以外にスキル的な側面の評価も大事な職種です。
　そのため、総合職的な職種の評価制度とは別途違う形の評価制度を作る必要があります。　
　又、給与テーブルも変える必要があります。エンジニアの給与は、他の職種と違って高めの設定にしないと採用出来ないし、辞めていってしまうリスクが高いです。給与以外にも、PC支給や手当、リモートワーク、書籍購入、資格取得支援、セミナー参加支援等もあります。
　この辺りの制度の構築がしっかり出来てる会社は、エンジニアについて真剣に考えてる会社という事になります。
　２番の流れにもなりますが、人事に元エンジニアの方がいるとこれがやりやすいです、そうでない場合は、CTOがメッコリ入って作る必要があります。CTOの方がここに力を入れてるという事自体で素晴らしい会社の証でもあると思います。

４．売上、利益、利用ユーザー数、純資産が伸びている
　ここはエンジニア以外にもつながる話ですが、売上、利益が伸びていない会社というのは、未来への投資が出来ないです。
特にエンジニアは、先述の通り、スキル部分の習得が必要です。目の前のPJばかりやってたら、幅の狭いエンジニアにしか育てません。現場の仕事や事業メインのみでPJにアサインされるのではなく、個々人の状況、タイミングを見て、スキルの幅、厚みを伸ばすために適切なPJアサインする必要があります。
適切なPJアサインするには、会社の業績が安定している必要があります。
　
５．CTOがイベントに沢山出てる（もちろんCTO以外も）
　CTOがイベントに沢山出ているという事は２つの点で重要です
　１．CTOがあまり忙しくない
　　　CTOが忙しすぎると、話も聞いてくれないし、適切なジャッジもしてくれない。速度も無ければ柔軟性も無い。
　　　忙しすぎるCTOは能力の低いCTOです。
　　　イベントに精力的に参加するCTOは、少なくとも忙しすぎないとジャッジできます。
　２．採用に真剣に向き合っている
　　　　CTOがイベントに参加して喋るのは、自社のブランド力向上のためです。これは採用強化の一貫です。
　　　　ここをCTO自ら率先して行ってるという事は、CTOが採用、人財を経営の第一優先に置いているという証です。

以上、１から５について書いてみましたが、いかがでしょうか。
エンジニアの転職の際気をつけてみて下さい。
Windows環境でpythonのパッケージをインストールする方法

## 概要
WindowsにPythonをインストールしたがパッケージの入れ方がわからなかったのでメモ書き


## パッケージをインストールする方法
結論からコマンド プロンプト上でpipコマンドを打ってinstallをすれば良い
```
pip install パッケージ名
```

例：下記はexcelを扱うためのパッケージ(openpyxl)をインストールするコマンド
```
pip install openpyxl
```

ここでpipが見つからないとエラーが出た場合はpath設定ができていない。
Windowsのpath設定を行う。
pathがわからない場合は下記のコマンドを叩くとpipまでのファイルパスが表示される。
```
where pip
```

## インストールしたパッケージ一覧
```
pin list
```

## パッケージをアンインストールする方法
```
pip uninstall パッケージ名
```

## パッケージの情報確認
下記のコマンドで確認。インストールされたpathも確認できる。
```
pip show パッケージ名
```

## パッケージのアップデート
```
pip install -U パッケージ名
```
【Ruby on Rails】RSpecの導入方法




# RSpecの導入方法

### Gemfileに追記

GemfileにRspec, Factorybot, Fakerを追加するための記述を追記。
この時、:test do ~ endの間に追記することに注意。

```ruby:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  #ここに以下3行を書き足す
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker'
end
```

### ターミナル実行

ターミナルで以下を実行。
```terminal:ターミナル
bundle install
rails g rspec:install
```

以下の実行結果が表示される。
specフォルダー内に「spec_helper.rb」「rails_helper.rb」の二つのファイルが作成されている。
```terminal:ターミナル実行結果
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```


### Rspecに設定を追記
「.rspec」に「--format documentation」を追記。
```diff_ruby:.rspec
--require spec_helper
+ --format documentation
```

＃techcamp136期
【テトリス作成①】ボード生成について深掘る

こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119

★★★★★随時更新★★★★★
2022.11.22追記
２０２２.１１.２８追記
★★★★★★★★★★★★★★★


```
(見本)Board.cs

(変数)
    //ボード基盤用の四角枠格納用、Transformへ四角枠を格納する
        [SerializeField]
        private Transform emptySprite;

    //ボードの高さ,ボードの幅,ボードの高さ調整用数値
        [SerializeField]
        private int height = 30, width = 10, header = 8;
(関数)
    //ボード作成
        void CreateBoard()
        {
            if(emptySprite)
            {
    
                for (int y =0; y < height - header; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        Transform clone = Instantiate(emptySprite, new Vector3(x,y,0), Quaternion. identity);
                        clone.transform.parent = transform;
                    }
                }
            }
        }

(呼び出し)
        void Start()
        {
            CreateBoard();
        }

```

解説

【変数】
```
    //ボード基盤用の四角枠格納用、Transformへ四角枠を格納する
        ①[SerializeField]
        ②private ③Transform ④emptySprite;

    //ボードの高さ,ボードの幅,ボードの高さ調整用数値
        ①[SerializeField]
        　②private int height = 30, width = 10, header = 8;
```
①インスペクタから呼び出し可能な変数
②宣言したモジュールの中でのみ
③Transform内にボード基盤用の四角枠格納用
④名前
⑤高さ、横幅、ボードの高さ調整用数値を整数で指定

型についてまとめ記事 https://qiita.com/hanatan079/items/36386ae4335bb0b06c88


【関数】
```
 //ボード作成
        ①void CreateBoard()
        {
            ②if(emptySprite)
            {
                ③for (int y =0; y < height - header; y++)
                {
                    ④for (int x = 0; x < width; x++)
                    {
                        ⑤Transform clone = ⑥Instantiate(emptySprite, new Vector3(x,y,0), Quaternion. identity);
                        ⑦clone.transform.parent = transform;
                    }
                }
            }
        }
```
①何も返さない型、変数名
②四角枠に格納する条件
③y(上下(高さ))が0から始まり、height(30) - header(8)=(22)マス目までいくまで繰り返し処理する
④x(左右)が0マス目からwidth(10)の間で処理する
⑤Transform clone(子)
⑥emptySpriteをz(手前奥)は０の場所から回転をせずに生成する
⑦親の指定

void型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
for文についてまとめた記事
　https://qiita.com/hanatan079/items/01530bc45bab85f3d19f
Instantiate関数についてまとめ
　https://qiita.com/hanatan079/items/66a183ea5168c985c366
基本構文について
https://qiita.com/hanatan079/items/a109b40b0e159779590c
parentプロパティについて
https://qiita.com/hanatan079/items/9adbadebf4fcc867b182

【呼び出し】
```
 void Start()
        {
            CreateBoard();
        }
```
スタートメゾットで作成した関数を呼び出す
mac で ECR にログインしようとすると怒られる

## エラー

mac で　ECR にログインしようとすると怒られる

```
Error saving credentials: error storing credentials - err: exit status 1, out: `The user name or passphrase you entered is not correct.`
```

## 解決

```sh
$ cat ~/.docker/config.json
{
	"auths": {
		xxxxx
	},
	"credsStore": "desktop"
}%  

```                                                                                   

`credsStore` を消せばいいらしい

```sh
$ vim ~/.docker/config.json 
```

```sh
$ cat ~/.docker/config.json
{
	"auths": {
		xxxxx
	}
}
```
スレッドとは？

# スレッドとは？
- コンピューターのプログラムは基本的に1行ずつコードが実行されながら動作する。このようなプログラムの流れを「スレッド」（Thread: 「糸」）と呼ぶ。

# シングルスレッドとマルチスレッド
- 大抵のプログラムはひとつの処理の流れを記述するが、そのことを「シングルスレッド」と呼ぶ。
- しかし、プログラムによっては処理効率を上げるなどして、複数の処理を並行して行うことがある。それを「マルチスレッド」と呼ぶ。

# Dispatch Queueクラス
- Swiftにおいては、このスレッドを管理するためにDispatch Queueクラスが存在します。

# キューの種類
- Dispatch Queueクラスには2種類が存在します。

### mainQueue
- メインスレッドでタスクが実行されていく直列のキューです。UI部分は主にこのキューで管理されているので、処理後にUIを更新したい場合は、このキューに格納する必要があります。

### global Queue
- システム全体で共有される直列のキューです。このキューは5種類の実行優先順位ごとにキューが管理されます。
    - userInteractive
        - ユーザーからの入力をインタラクティブ(対話的)に反映させるために即座に実行させる必要がある場合に指定する優先度
    - userInitiated
        - ユーザーからの入力を受けてから反映させる場合に指定する優先度
    - default
        - 優先度が指定されなかった場合のデフォルト値となる優先度
        - 明示的に指定するのは非推奨らしい
    - utility
        - ユーザーが正確性を求めていないような処理を行う場合の優先度
    - background
        - バックグラウンドで行うような処理を行う場合の優先度
        
# なぜメインスレッドでないとUIはアップデートできないのだろうか？
- ここで僕が思った疑問としては、どうしてUIのアップデートは毎回メインスレッドで呼ぶ必要があるのだろうか？と思った。
- みなさんもUITableViewなどの`reload`を行う際に、よくメインスレッドで呼んでくださいとエラーメッセージが表示されたことがあるだろう。

# スレッドセーフではないから
- 調べていくと、UIKitはそもそも`nonatomic`であり、スレッドセーフでないからという内容が出てきた。
- つまり、ある特定のスレッドが走っている際に、他のデータが競合してしまう可能性があるということだ。
- そうなってくると、例えばUITableViewの場合だと、
    - もしTableViewのセルをあるバックグラウンドスレッドで削除した際に他のバックグラウンドスレッドでインデックスを処理した場合、データ競合を起こす可能性が出てくる。
- 他にも色々なケースが考えられうるだろう。
- このようなケースを考えた場合に、単純に一つのシングルスレッドで操作を行った方がいいという結論がでる。

# そもそもどうしてUIKitはスレッドセーフではないのか？
- UIKitがスレッドセーフでない理由はパフォーマンスが落ちるからである。具体的に、UIKitの処理スピードが落ちるということだ。

# どのようにUIKitはレンダリングされているのか？
### レンダリングに必要となる要素
- このような内容を見た時に、そもそもどのようにUIKitがViewに描画されているのかが気になった。
- まずUIKitの描画のために以下のような要素があることを理解する必要がある
    - UIKit: 
        - 全てのコンポーネントを保持しており、ユーザーのイベントを処理するが、描画自体はできない
    - Core Animation:
        - 全てのViewを表示し、アニメーションする
    - Open GL ES: 
        - 2Dと3Dの描画を提供しているサーバー
    - Core Graphics: 
        - 2Dの描画を提供しているサーバー
    - Graphics Hardware:
        - GPU
### Core Animation Pipeline
- その上で、Core Animation Pipelineというものが存在し、このプロセスをたどって、レンダリングが可能となる。
- 以下がそのプロセスである。
    - Commit Transaction:
        - Viewのレイアウトや画像のデコードとフォーマット変換操作、ビューレイヤーのパックアップを行った上で、Render Serverへの送信を行う
    - Render Server:
        - Commit Transactionから送られてきた情報をDesirializeする。その上で、ViewのPropertyから描画命令を生成し、VSync Signalが来た時にOpenGLを呼び出す。
    - GPU:
        - GPUはVSync Signalを待って、そのSignalが呼び出された時にOpenGLを使い、ここで初めて描画を行う。
    - Display:
        - バッファからデータを受け取り、表示のためそのデータをスクリーンに送る。

- ちなみに、`VSync Signal`とはこれらのパイプラインを同期するためのものである。アプリが復帰してレンダリングを開始する時間や画面を合成する時間、ディスプレイのリフレッシュ周期の動機を行う。この同期をによって、途切れがなくなりグラフィックスの視覚的なパフォーマンスが良くなる。

### ここで本題に戻る
- ここまでの情報を読んでいただくとわかる通り、UIKitの描画には色々な工程が必要となっており、決してシンプルなものではない。むしろ複雑なものである。そうなってきた時に、UIKitをシングルスレッドの処理のみでレンダリングしているとどうしても処理に時間がかかってしまう。そのため、UIKitはマルチスレッドで処理されており、そのため僕たちがUIKitを使う際には`non-atomic`なUIKitを利用するため、常にシングルスレッドでの呼び出しが必要となる。（この場合はメインスレッドのこと）
運用トラブルを避けるために大切な6つのこと。

# 始めに
アーキテクチャ非機能要件について解説する。
尚、解説時には、以下の3つの形式に分けて解説する。

* what??
* why??
* how??

#  アーキテクチャ非機能要件とは？？
## what??
機能面以外の全ての要件のこと。
以下の6つの観点がある。
①変更容易性
②相互運用性
③効率性
④信頼性
⑤テスト容易性
⑥再利用性

## why??
リリース後の運用の大きなトラブルのほとんどが、非機能的な特性に起因しているため。

## how??
アーキテクチャ設計において非機能要件を考慮に入れる。
具体的には以下の3つのことを行う。
* 要件定義において、それぞれの観点についてどの程度必要とされるのか確認
* アーキテクチャ設計の時点で、この要件を考慮に入れた構造を考慮
* テストで要件を満たしているか確認

# ①変更容易性
## what??
ソフトウェアの改善の容易性の観点。
以下の4点が求められる。
* 簡単に修正できるか
* 簡単に拡張できるか
* 簡単に組織化できるか
* 簡単に別のプラットフォームに移行できるか

## why??
ユーザーの要求に、長期間にわたって、きめ細やかに、素早く対応していくため。

## how??
以下の4点から考察を行う。
* 保守性
* 拡張性
* 再構築
* 移植性

### 保守性
障害が発生したコードの修正のしやすさのこと。
保守性を高めるためには、変更を局所にし、他のモジュールへの副作用を最小にすることが必要である。

### 拡張性
* 新しい機能の追加
* モジュールの新しいバージョンへの置き換え
* 不要な機能やモジュールの除去

等のしやすさのこと。
拡張性を保つためには、モジュール間の結合が弱いことが必要である。

### 再構築
モジュール間の関係の再組織化のこと。
再構築を行いやすくするためには、モジュールの実装には影響を及ぼさずに、モジュールを柔軟に配置することが必要である。

### 移植性
ソフトウェアの、以下の4点の適合のしやすさのこと。
* ハードウェアプラットフォーム
* ユーザーインタフェース
* オペレーティングシステム
* プログラミング言語
* コンパイラ

移植性を高めるためには、ハードウェア依存性を考慮しながら、ソフトウェアを設計することが必要である。

# ②相互運用性
## what??
ソフトウェアが他のソフトウェアとやり取りできる能力のこと。
異なるソフトウェアが、同じ交換形式を介してデータをやり取りしたり、同じ形式のファイルを読み書きしたり、同じプロトコルを使ったりして、相互に接続できることが求められる。

## why??
* 開発期間短縮のため。
* コスト削減のため。

## how??
外部の機能やデータ構造へ、アクセスが明確に定義されたアーキテクチャを設計する。
その際のプロトコルやデータ形式の選定において、業界の標準的な規格を選択するようにする。

# ③効率性
## what??
ソフトウェアが、実行に伴うリソース使用において、適切な性能を引き出す能力のこと。
以下の2つの観点に分かれる。
* 時間効率性
* 資源効率性

### 時間効率性
時間という観点から定義されたリソースの使用効率のこと。
主に以下の3点で計測する。
* スループット：一定の時間内に何件の処理を終えることができるか
* レスポンスタイム：ユーザーの入力操作から応答までにかかる時間
* ターンアラウンドタイム：ユーザーによる作業開始時から求められた情報の出力を終了するまでの時間。

### 資源効率性
コンピュータ資源という観点から定義されたリソースの使用効率のこと。
主に以下の4点で計測する。
* CPUの使用時間
* メモリの使用量
* ストレージ消費量
* ネットワーク伝送量

## why??
リソースをうまく活用することで、ユーザーの使い勝手を良くするため。
アーキテクチャ設計の段階で、モジュールへの債務分散と、そのモジュール間の結合を適切に行う必要がある。

## how??
コンピュータのリソース使用時において、節約するだけでなく、最大限有効活用するなどして、適切に利用する。

# ④信頼性
## what??
ソフトウェアが、例外的な場面、予期しない方法や不正な方法で使用された場面においても、機能を維持する能力のこと。
以下の2点の側面がある。
* フォールトトレランス
* ロバストネス

### フォールトトレランス
ソフトウェアに障害が発生したときに、正常な動作を保ち続ける能力

### ロバストネス
不正な使用方法や入力ミスから、ソフトウェアを保護する能力。

## why??
求められる機能維持レベルはさまざまであるため。

## how??
### フォールトトレランス
以下の2点がある。
* 内部に冗長性を持たせる　
* 大事な機能のみを提供して処理継続を優先する設計であるフェースソフトを考慮

### ロバストネス観点
以下の2点がある。
* 障害時に、その部分を切り離す設計であるフェールセーフを考慮
* 障害が発生しないように、ユーザーが誤った操作を行っても安全に稼働させる設計であるフールプルーフも考慮

# ⑤テスト容易性
## what??
ソフトウェアに対して効果的かつ効率的にテストを行う能力のこと。
* 効果的 = テストによって、ソフトウェアの隅々まで、漏らさずにその品質を検証できること。
* 効率的 = テストのコストや労力が少ないこと。

## why??
テストの品質が本体の品質であり、テストは非常に重要であるため。

## how??
アーキテクチャ策定の時点から、検証方法の観点も含めて設計する。
モジュール間の依存関係があると、テストしにくい部分に、全体が足を引っ張られる可能性があるため、依存関係の排除がポイント。

# ⑥再利用性
## what??
ソフトウェアを、全体でも一部でも、別のソフトウェアの開発に再利用する能力のこと。
以下の2つの側面がある。
* 再利用するソフトウェア開発
* 再利用のためのソフトウェア開発

### 再利用するソフトウェア開発
* プロジェクト内の既存モジュール
* 以前のプロジェクトのモジュール
* 各種ライブラリ

等を利用すること。

### 再利用のためのソフトウェア開発
将来のプロジェクトで再利用できるようなモジュールを、現在のソフトウェア開発で創出すること。

## why??
再利用によって作る分量が減り、ソフトウェア開発のコストと期間が減少するため。

## how??
### 再利用のためのソフトウェア開発
アーキテクチャの構成を、既存の構造やモジュールに「プラグイン」できるようにする。

### 再利用のためのソフトウェア開発
開発中のソフトウェアから、自己充足的な部分を取り出すことができるアーキテクチャにする。
自己充足部分を独立したビルドできるようなモジュールないしパッケージにしておく。
DB入力ノードにクエリを書き込んで高速に読み込む(SPSS Modeler データ加工逆引き9-8)

# DB入力ノードにクエリを書き込んで高速に読み込む(SQLプッシュバック)

![スクリーンショット 2022-11-07 18.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/922407a7-166b-ee85-f4c4-2d581306a9a7.png)

この記事は逆引き9-6を前提に書かれています。先に参照ください。

https://qiita.com/416nishimaki/items/48bf0176afae916de117

## 1.想定される利用目的

・大規模なデータベースを入力にした際のデータ加工速度の向上


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/sql_query.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-07 18.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fab78a8d-24a9-b241-b342-cf298a0ba4d2.png)

a.入力するデータは以下の通りです。読み込み時点で[Cate]が[1]に絞り込まれています。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6d18c3a8-2258-15f8-f213-1d19103ee732.png)

DB接続は以下の記事を参考にしてください。

https://qiita.com/416nishimaki/items/ee13873b9d78268d648a

b.[条件抽出]ノードを編集します。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7438db1a-e178-530b-582c-55b6d8298fd0.png)

[テーブル]を実行します。読み込み時点でレコード（行）が絞り込まれており、後続のストリームでもSQLプッシュバックが有効であることがわかります。
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/22934d0b-83df-ead4-8667-ea18a8f697df.png)

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9166a820-44de-1bec-d76e-5ed58d7dd37a.png)




#### 注意事項

今回の処理はシンプルであるためSQLクエリを利用する恩恵は少なく、同じ内容を後続のストリームで記述しても速度に変化はありません。以下の記事のように速度を稼げる処理かどうかを見極めて利用します。また速度のみならず、多くの利用者の利便性を上げるためにテーブルを結合し行と列を絞り込んだ読み込みのルーチンとして利用するケースも想定されます。


https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-16/

## 4.参考情報

#### SQLプッシュバックを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-02/

https://qiita.com/kawada2017/items/418378d654c7cc36c20a

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
オラクルへのクラウド移行検討　第１回　−マルチクラウド−

**OCLS（Oracle Cloud Lift Service)を利用して移行検討して内容を、お伝えできる範囲で提供していきます！[^1]**

# 今回のユースケースは・・・・
アプリケーション（AP層)をAWS、データベース（DB層)はOracleCloudInfrastructure(OCI)を検討しているマルチクラウドのケースです。
# 検討ポイント！！
AP層はAWS、DB層はOCIにした場合の検討は以下となります。
- APとDBのクラウド・サービス分離した場合のアーキテクチャ（具体的な外部接続形式）
- オンプレミスとAWS、OCIのネットワーク接続の方法
- クラウド・サービス分離時の遅延の影響
***
以下に詳細の検討した内容を記載していきます。お楽しみください！！
# １．移行検討の実施内容について
　実施した内容としては<b>”移行のアーキテクチャの策定”</b>、<b>”POCの実施項目の整理”</b>、あとは<b>”クラウド化のリスクの洗い出し”</b>といったところを実施しました。

# ２．マルチクラウドの選択理由
データベースをOCIにしたいというお話（<b>ライセンスの有効活用と費用最適化</b>）がありまして、そもそもなんでAWSにAPを置くという想定なんですか?と聞いたところ<b>一部をすでにAWSに持っていっちゃった</b>からというお話がありまして、あとはAWSの方が<b>ノウハウがあるからその分の学習コストが不要</b>であるためというところが回答として返ってきました。これいろんなお客様で同じようなことを言われているので、他のところでもあるかと思います。

# ３．アーキテクチャ判断-AP層とDB層はどこのクラウドに置くか（外部接続）
<b>外部接続の３パターン</b>
今のお客様のネットワーク環境だと、一回お客様のデータセンター折り返しでの通信になってしまうということで、毎回お客様のデータセンターにファイルが行って、折り返してOCIにいきます。かなり遠回りのネットワーク構成になっているというところですね。これがかなり大きな問題（<b>遅延</b>）になりそうだったのでその対策としての案を出しました。

今回はその対策として3パターンの外部接続構成をお客様に紹介しました。
3パターンの理由としましては<b>”お客様の負荷”</b>や<b>”費用感”</b>に応じて選択いただける案があるためです。レイテンシーを下げる案を提案しているんですけども、コストとお客様の負荷が高い方が、レイテンシーが下がるというものとなっていますので、その中でお客様の中でバランスのいい案を選択いただいています。

<b>案１：既存オンプレミス・ルーター折り返し接続</b>
既存で利用している回線を共有
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951863/47204cfc-0107-0cad-90ea-7ceb41c160c8.png)

1つ目の案なんですけどもお客様既にFastConnect（閉域接続）を敷設いただいていますので、
それをそのまま使って何も構成変更しないというパターンを提案しております。
この場合コストだけは全然ないんですけれども、先ほど言った通り線通信がお客様のデータセンター経由になってしまうというのでかなりレイテンシーは悪いものとなってきます。メリットとしてましては回線費用が変わらないというところと、構成に変更がないというところで、お客様の負荷が少ないというところになっております。考慮点としては、遅延の影響が大きくなるところがあります。

<b>案２：既存キャリアのCloud接続サービス利用</b>
既存のAWSおよびOCIへの閉域網を統合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951863/77a3a9bc-f7bf-1664-be7a-006088b80d47.png)
2つ目の案ですけれども、こちらはお客様はAWSのDirectConnectとOCIのFastConnectと同じキャリアの回線を使用されておりました。まずキャリアの通信経路内でより2つのクラウドが近い場所で折り返せないかというところをキャリアにお問い合わせをするということも可能かなと考えました。
　そこで”よりクラウドに近いところで折り返しする構成に契約変更ができないかという問い合わせするという案”を出しました。これによって”AWSとOCIの閉域網も統合できる”というものがあります。これによって回線費用の低減及び運用のシンプル化とあとは遅延の影響をより減らすということができます。考慮点としては、変更の作業や、費用がかかったりといったところがあります。

<b>案３：Cloud相互接続サービス追加</b>
相互接続サービスを連携用に追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951863/4085f87f-357a-9590-0974-d00ac9346a42.png)

3つ目の案ですね。こちらは既存の接続にまた別の相互接続サービスを追加購入するというパターンですね。これどういったことかといいますと相互接続拠点から、EquinixさんとかMegaportさんとかの別のサービスを契約してもっと近いところで折り返してもらうそういったサービスとなっております。考慮点としては、追加ベンダーが入るので新しい契約とか追加費用が発生するというところがあります。

# ４．最後に
<b>結果：どの構成にしますか？</b>
結局お客様にどういった判断をいただいたかといいますと<b>”結論としましては案2”</b>となりました。
理由としては比較的手軽な割にレイテンシーが改善しそうというところと、あとは案3は通信が早そうだけれども新規ベンダーが入ると追加コストがかかるのでこれはすぐにはできないねという話になりまして案2になりました。
　お客様の認識では別クラウド間通信になるので処理が遅くなるというのは分かっていると、ただこのレイテンシーについては一旦この接続で検証するという想定でしようとなっています。
移行前までには、連携部分（AP層とDB層との連携、オンプレミスとの連携）を棚卸しして、不安であればPoC（<b>本番で想定している構成</b>）してみましょう！
ちなみにOCIのマルチクラウド事例を紹介します。
https://www.oracle.com/jp/cloud/multicloud/

以上となります。
マルチクラウドの移行の参考になれば幸いです。


[^1]:Oracle Cloud Lift Services（OCLS）は、OCIを初めて利用する顧客に対する支援、クラウド利用開始までの期間短縮とリスク低減を通じて、OCIを利用する顧客の満足度向上を図るプログラム
ドメイン層について【The Clean Architecture 】

# ドメインとは？
- プログラミングにおけるドメインとは「問題領域」のこととなる。クリーンアーキテクチャでの実装をしていく中で、ドメイン層にどんなことを記述することが正解なのかわからなかったため、ここにメモを残す。

# ドメインを現実世界に置き換える
- ドメイン層を理解するにあたって、ドメインを現実世界に置き換えてみる。
- 世の中には数々の問題領域（ドメイン）が存在する。例えば、交通、環境、金融などである。ここからの例では、交通を問題領域として話を進めていきたいと思う。

# モデル化
- まず大前提、交通という問題領域について語る前に、「モデル化」という工程を踏む必要がある。なぜなら、ありのままの現実（ありのままの概念）で話を行うことは不可能だからである。つまり、何かの共通認識を作る必要がある。そうしないと、問題領域についての理解が不可能であるからだ。
- 例えば交通なら、
    - 交通網
    - 自動車での移動
    - 徒歩での移動
    - 交差点
    - 片道
- など数々の共通認識の上で、「交通」という概念が成り立っている。この人間が何かの概念を理解するために要素分解していく作業のことを「モデル化」という。

# プログラミングに落とし込む
- ここまでの話をした上で、今の話をプログラミングに落とし込もうと思う。
- 基本的に`Clean Architecture`においてのドメイン層には「何か共通認識を合わせるべきもの」が存在する。ここにおいて、その「何か共通認識を合わせるべきもの」のことを`User`とする。アプリ内で、その`User`を使って何かを行いたい時に、その概念をそのまま使おうとしても無理である。なので、モデル化して落とし込む必要がある。
- 以下が具体例である。

```Swift
struct User: Codable, Hashable {
    let id: Int64
    let name: String
    let selfIntroduction: String
    let birthday: Date
}
```

- このように`User`という概念を落とし込めて初めて、共通認識として成り立つ。

# 注意点
- `User`の構造体のようにドメインを表現することは可能であるが、ここで大きな落とし穴が存在する。
- 本当にその変数、定数、関数はドメインが知っている必要がある知識であるのか？という点だ。
- 例えば、
```Swift
struct User: Codable, Hashable {
    let id: Int64
    let name: String
    let selfIntroduction: String
    let birthday: Date
    let nickName: String
}
```

- このような関数がドメイン内に存在するとする。
- 果たして、この`nickName`という定数はドメインに存在するべきなのか？
- もちろんプロジェクトの問題領域にもよるが、基本的にnickNameを扱う必要がないプロジェクトだとしたら、必要がない定数だろう。
- 現実世界において、そのユーザーがニックネームを持っていたとしても、必要がない情報はドメインモデルに存在してはならない。
- また、ドメイン層という観点においても、現実世界の問題領域と照らし合わせて、その関数や変数、定数はドメイン層にあるべきなのか？という考え方がとても重要である。
- 「ドメイン層は絶対であり、王様」と`Clean Architecture`の本にも記述されている通り、ドメイン層におくべき変数、関数、定数は注意して選ぶ必要がある。

# まとめ
- 具体例が多くなってしまったが、まとめると、上に記載されている例のように何か抽象的な概念（問題領域）をありのままで使うことが難しいので、それをモデル化して落とし込む層のことを「ドメイン層」という。
ライブラリー無し自作関数  Python3 西暦 ➡ 和暦変換 関数 

# 西暦 ➡ 和暦　変換　Function 

```python:main.py

import datetime

class Gengou():

    def __init__(self):
        pass

    def Data_Set(self):
        date_arr = [
            {'year': 2019, 'name': '令和', 'new_Japanese_calendar': '平成31年'},
            {'year': 1986, 'name': '平成', 'new_Japanese_calendar': '平成元年'},
            {'year': 1926, 'name': '昭和', 'new_Japanese_calendar': '大正15年'}
        ]
        return date_arr

    def Gengou_Print(self, now_y, r_month, date_arr):
        for d_val in date_arr:
            if now_y == d_val['year']:

                if r_month < 5:
                    # 年度の元年を返す
                    return d_val['new_Japanese_calendar']
                else:
                    return '令和元年'

            if int(now_y) >= d_val['year']:
                year = int(now_y) - d_val['year'] + 1
                return d_val['name'] + str(year) + "年"


# 出力
to_date = datetime.datetime.now()
change_date = to_date.strftime("%Y-%m-%d")


now_y = change_date[:4]  # 西暦 取得
month = change_date[5:7]  # 月　取得

# 西暦 ➡ 元号　変換
Genotu_obj = Gengou()
data_set = Genotu_obj.Data_Set()
gengou_y = Genotu_obj.Gengou_Print(now_y, month, data_set,)
print(gengou_y)

```
img(object-fit, vertical-align, float )

# object-fit
・cover
縦横比を保ちながらなるべく大きく表示。
・contain
縦横比を保ちながら画像を中に入れる。
・fill
比率は関係なく、埋める
・none
何もしないで入れる。
#vertical-align
・baselineを基準にどれくらい移動するか。+-で。
・インライン要素のものならなんでも使える。
# float
・回り込ませるために使う。
・float:right;で画像を右に寄せる。
・他の要素は通常の配置から外れて、画像がなかったように配置される。
    (しかしテキスト、インライン要素は避ける)
・普通にすると、p-2が被ってしまう。その時は、、、
```html
<body>
  <p class="p-1">
    <img src="logo.png" width="128" height="128">
    こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
  </p>
  <p class="p-2">
    こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
  </p>
</body>
```
```css
img {
  width: 80px;
  height: 80px;
  float: right;
}

.p-1 {
  display: flow-root;
}

.p-2 {
  /* clear: right; */
}
```
・clear:rightにする。(次の要素を変える。被らないようにする。)
or
・display:flow-rootをつける。(周りこませるやつにつける。それもimgと同じ要素にする。)
Goでjsのmapやfindなどを使いたい

## はじめに
jsでよくやっているこんな感じのコードをGoでも書きたい。けど外部のパッケージは入れたくない場合の対処法を紹介します。

```ts
type Skill = {
  name: string
}

const skills: Skill[] = [
    { name: 'Ruby' },
    { name: 'Javascript' },
    { name: 'Python' },
]
const py = skills.find(s => s.name === 'Python')
// => {name: "Python"}
console.log(py)

const names = skills.map(s => s.name)
// => (3) ["Ruby", "Javascript", "Python"]
console.log(names)
```
## find
まず適当にsliceを用意。

```go
package main

type skill struct {
    name string
}

func main() {
	skills := []skill{
		{name: "Ruby"},
		{name: "Javascript"},
		{name: "Python"},
	}
}
```

sliceに型をつける。

```go
package main

type skill struct {
    name string
}

type skills []skill

func main() {
	skills := []skill{
		{name: "Ruby"},
		{name: "Javascript"},
		{name: "Python"},
	}
}
```

sliceにメソッド定義をして、mainの中で呼び出します。

```go
package main

import "fmt"

type skill struct {
	name string
}
type skills []skill

func (s skills) find(findFunc func(s skill) bool) skill {
	for _, sk := range s {
		if findFunc(sk) {
			return sk
		}
	}
	return skill{}
}

func main() {
	skills := skills{
		{name: "Ruby"},
		{name: "Javascript"},
		{name: "Python"},
	}
	s1 := skills.find(func(s skill) bool { return s.name == "Python" })
	fmt.Printf("found skill: %+v\n", s1) // found skill: {name:Python}

	s2 := skills.find(func(s skill) bool { return s.name == "Go" })
	fmt.Printf("found skill: %+v\n", s2) // found skill: {name:}
}
```

## map
mapも同じ要領で実装してみます。関数名がmapだとgoの予約語と被ってエラーが出るので、publicのMapにしています。あまりいけてないので良い名前があればお教えいただけますと幸いです🙇‍♂️

```go
package main

import "fmt"

type skill struct {
	name string
}
type skills []skill

func (s skills) Map(mapFunc func(s skill) interface{}) []interface{} {
	var ret []interface{}
	for _, sk := range s {
		ret = append(ret, mapFunc(sk))
	}
	return ret
}

func main() {
	skills := skills{
		{name: "Ruby"},
		{name: "Javascript"},
		{name: "Python"},
	}
	n1 := skills.Map(func(s skill) interface{} { return s.name })
	fmt.Printf("mapped skill: %+v\n", n1) // mapped skill: [Ruby Javascript Python]
}
```

## おわりに
意外に簡単にできました。
slicesごとに定義するのは面倒なので、使いまわせるようにしたいですが、あまり良い方法が浮かびませんでした。

やはりパッケージを使うしか無いのか🤔
プログラム仕様について

# プログラム仕様とは
プログラムに求めることを定義したもののこと。

# プログラム仕様の種類
- ウォーターフォールモデルの開発手法では、以下の3つに分けてトップダウンで使用を作成する。
### 基本仕様
- PMなどの要求主要に基づいて、機能概要、機能構成、ハードウェア構成、運用の前提条件、性能や品質の要件などを記述する。
### 機能仕様
- ソフトウェアを開発する上で、そのプログラムの動作を記述した一連の文章のこと。主にソフトウェアが受け付けるべき入力を列挙し、それら入力に対してそのシステムがどう動くかを記載する。
### 詳細仕様（技術仕様）
- 具体的なコードの実装を説明する文章のこと。
position・z-index

# position
基本的に単体で使う。relative,abosolute,fixed  + topとかでずらす。
・relative
    →staticの上段の辺から+-どのくらい動くか。
    →後の要素には影響なし。そのままの位置。
・abosolute
    →サイトの枠を基準にどのくらい。
    →後に続く要素は詰める。
    →囲んでいる要素に、relativeをつけるとそれが基準になる。
    →left.rightを０にしたら、margin:auto;で中央になる。
    →一番上に来る。絶対だから。
・fixed
    →基準はサイトの枠。
```css
position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
```
だと画面いっぱいに広がる。

# Z-index
htmlは後から書いたのが上にくる。
それを変えたい時はz=indexを使う。数が大きい方が上に来る。

＊w:100,h:100,borderがセットされていても、重ねると、borderはなくなる。
愛煙家だけわかる依存関係逆転の法則とポリモーフィズム

※ 注意
この記事は喫煙を推奨するものではありません。
20歳未満の喫煙は法律で禁止されています。
図汚いのは許してください

# 紙タバコの場合

実装が実装に依存しているイメージで、処理の方向と依存の方向が同じになっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2327661/d419c69e-4528-8325-7f19-2856ead64d04.png)


# IQOS の場合

IQOS 本体を人と TEREA を繋ぐインターフェースとして見立てると、**処理の方向に対して依存の方向が逆転**している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2327661/34820c48-eeb8-6eb8-8b40-01db37b4ca36.png)


# TEREA の種類を変えることも可能

例えば、レギュラーを使っていたが、メンソールに変えた場合、IQOS 本体を変える必要がない。
この状況は、**振る舞いが、実装によって決まる**ことを表している。
具体的には、TEREA が持っている実装（"味"や"香り"）はレギュラーとメンソールで異なるが、IQOS 本体が持つ振る舞い自体は変わらない（TEREA をセットすると吸えるようになるので）。
つまり、**ポリモーフィズム**が実現できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2327661/58bc3409-eb2e-e352-a84b-d19483ce96ee.png)

# まとめ
イメージ感で書いたので、間違っているところがあれば遠慮なくご指摘ください。
この図でいうと、IQOS に変えた人は、紙たばこ依存を脱したといえるでしょう。
Skitchをhomebrewで導入

# 概要

Skitchとは、スクリーンショットを範囲を指定して切り取ることができたり、その撮影したスクリーンショットへ文字や線、モザイクを使用し、色々な加工を簡単にすることができるアプリです。
skitchの登録方法は2つあります。
* App Store
* homebrew

今回はApp Storeにskitchがなかったため、homebrewを使用して導入していきます。

### 環境
* macOS Monterey Version 12.5.1
* M1 Mac

## 1.skitchを登録
```
$ brew install --cask skitch
```

## 2.evernoteもついでに

Homebrew Cask でインストールして一括で管理することができるため、
一応、コマンドを書いておきます。

```

$ brew install --cask evernote

```

## 3.skitchの画面

![スクリーンショット 2022-11-14 9.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634988/068398ef-ca44-73d4-e85f-80797a53148d.png)

## 最後に

参考にしていただけると幸いです。
Teslaはカメラを使ってどのように世界を認識しているか？

スライドによるとSingleImage、MultiCameraでも難しく、Transformer->BEV変換するみたいです。

https://speakerdeck.com/inoichan/teslahakamerawoshi-tutedonoyounishi-jie-woren-shi-siteiruka

BEVとは、Bird eye view空間の事で、いわゆる鳥瞰図ですね。
Transformerの中でもCross-attentionという機構を用いており、これによってマルチカメラの画像情報を統合し、効率よくBEV空間のベクトルに変換することに成功してるみたいです。
こちらはTeslaの自動運転をユーザーが使っている動画です。

https://www.youtube.com/watch?v=_ZYEjYnmPlA&list=TLGG4-7Bj9V96esxNDExMjAyMg

これに時系列情報（動き）が必要なので、SpatialRNNを使ってるみたいです。
1台の車を認識した時に、別の車の影で見えなくなっても時系列データがあれば、見えない時間も動きの予測が出来ます。
この考え方を使えば、車以外もスポーツとかに流用できそうですね。
有野課長のように、あるいはあの頃のボクのように

クリスマスにサンタからもらったスーパーファミコンと『スーパードンキーコング』を今でも覚えています。

小学1年生だった筆者は、それから2,3ヶ月ぐらいはこのゲームをやっていたと思います。

だいたいは一人でプレイしていましたが、休みの日には父親がそばにいて、自分と一緒にプレイしてくれました。

## XPとの相似、その1

このことを思い出したとき、社内で取り組んでいる**ペアプログラミング**と似ていることに気づきました。

> ペアプログラミングでは、以下のようなことをする。
> ・お互いにタスクに集中する。
> ・システムの改良について意見を出し合う。
> ・アイデアを明確にする
> ・パートナーがハマったら主導権を握り、相手の失望感を軽減させる。
> ・お互いにチームのプラクティスの説明責任を果たせるようにする。[^1]

父親と一緒にブラウン管を真剣に見つめ、ボーナスステージへの隠し扉がどこにあるか探し、トロッコが何度も落下してしまうのを見届け、コントローラを渡し合い、どちらかがクリアすれば大きく喜ぶ。

プラクティスの説明責任こそありませんでしたが、あの頃の筆者と父親がやっていたことはペアプログラミング的だったように感じました。

## XPとの相似、その2

これは決して家族内だけでの話ではありません。数人の友達で遊ぶときも同じでした。

1台のコントローラーを順番に渡しあいながら、操作していない友達はプレイヤーを応援して、ゲームを進めていく。

これは**ドライバーとナビゲーターの関係**と同じであるように見えます。

また友達の中には、ゲームをすでにクリアした子もいれば、タイトル画面すら見たことのない子がいます。言い換えれば知識量やスキルに差があるペア（モブ）ができることも多くあります。

このような場合、単純に「ゲームをクリアする」という成果だけでなく「未経験の友達が最初のボスを倒せるようになる」というような、いわゆる**成長やナレッジの共有**も成果になる点も、XPと似ているように感じます。

## 自身の振る舞いを省みる

上記の例から彼らの振る舞いを想像したとき、次のようなことが浮かびました。

- プレイヤーが誤った操作をしているとき「指摘したらかわいそう」と思って、指摘を控えるだろうか
- 自分だけがボスの弱点を知っているとき「マウントを取ってると思われないか」と心配して、教えるのを控えるだろうか

おそらく彼らはそんなこと気にせずに、そのとき知っている言葉でできるかぎりの情報を伝えるでしょう。

一方で、自身が（本物の）ペアプログラミングに臨むときはどうでしょうか。

知識量やスキル差、そこから派生する関係性のようなものを気にするあまり、ストレートにやりたいことを実行・提案できていないと感じる場面があります。

大人なので社会性はもちろん必要ですが、**XPの実践においては子どものような感覚も必要**なのかもしれません。[^2]

## 有野課長になる

これを考えたとき、頭の中にパッと浮かんだのは**『ゲームセンターCX』の有野課長**でした。

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

有野課長は特段ゲームが上手いわけでもなく、むしろ経験年数にしては下手なほうです。

それでも周りのスタッフの応援や指示、サポートを受けながらステージをクリアしていきます。

そして最後のボスを倒した瞬間、プロジェクトのゴールを迎えた瞬間。みんながその達成感を味わい、お互いを讃える。

この姿は、実はXPそのものを体現しているのではないでしょうか。

## 最後に

かなりポエム色の強い内容ですが、もしかしたらXPの本質に触れられたのかもしれないと思い、記事に残します。

自身がペアプロで迷ったときは「**自分は有野課長になれているか**」「**相手を有野課長にさせれているか**」を考えてみるのも良いのかな、と感じました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144277/c6eee986-d157-8926-b020-81a53ac2a185.png)  
(障害対応もみんなでやっている図[^3]）

[^1]: Kent Beck, Cynthia Andres『エクストリームプログラミング』、pp.86-87、Kindle Edition。

[^2]: 出典を忘れてしまったのですが、スパゲティータワーのワークにおいて、子どものチームのほうが大人のチームより良い成果を出している、という話を読んだことがあります。 ex.) [スパゲティータワーを建てよう！ │ Aiming 開発者ブログ](https://developer.aiming-inc.com/study/build_a_tower/)

[^3]: https://www.youtube.com/watch?v=i1UiwNKlsmM
InterfaceとAbstract Classの違い

# 違い

# 書き方
Interface
```cs
internal interface IFileOpener // interfaceは名前の頭に "I" をつけるのが慣習
{
    void Open(); // 継承するクラスにOpenメソッドの実装を強制する
}
```

Interfaceを継承するclass
```
internal class CSV : IFileOpener 
{
    void Open() // Openメソッドを実装しないとコンパイルエラー
    {
        Console.WriteLine("Open CSV File");
    }
}
```

Abstract class
```cs
internal abstract class FileOpener
{
    void Open() 
    {
        Before(); // Openの前にさせたい共通の処理
        Write(); // ここのクラスで個別に実装してほしい処理
        After(); // Openのあとにさせたい共通の処理
    }
    
    protected abstract void Write();
    
    void Before() {};
    void After() {};
}
```

Abstract classを継承するclass
```cs
internal class CSV : FileOpener
{
    protected override void Write() // 抽象クラスで定義されたabstractメソッドをoverrideしないとコンパイルエラー
    {
        Console.WriteLine("Hello");
    }
}
```