OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQLのDockerコンテナが起動しない!!!

# 背景
つい先日、Dockerを使ってRails+PostgreSQLの勉強をしようとしていた時の話です。以下のようなDockerfileとdocker-compose.ymlを作成しました。

```Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
    build-essential\
    libpq-dev\
    nodejs\
    postgresql-client\
    yarn
WORKDIR /rails-dir
COPY Gemfile Gemfile.lock /rails-dir/
RUN bundle install
```

```docker-compose.yml
version: '3'

volumes:
  db-data:

services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/rails-dir'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db:
    image: postgres:15
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
```
さあ、コンテナを起動するぞ。
```
docker-compose up -d
```

```
         Name                       Command              State            Ports         
----------------------------------------------------------------------------------------
rails-dir_db_1    docker-entrypoint.sh postgres   Exit 1                         
rails-dir_web_1   irb                             Up       0.0.0.0:3000->3000/tcp
```
DBコンテナが起動していない!!!

# 原因
とりあえず、ログを確認してみましょう。
```
docker-compose logs
Attaching to rails-dir_web_1, rails-dir_db_1
db_1   | popen failure: Cannot allocate memory
db_1   | initdb: error: program "postgres" is needed by initdb but was not found in the same directory as "/usr/lib/postgresql/15/bin/initdb"
```
# 解決策
[解決策](https://stackoverflow.com/questions/76555305/postgres-container-failed-to-start-with-initdb-error-popen-failure-cannot-allo)
解決策に記載されている通り、PostgreSQLのDockerイメージを``15``から``bullseye``イメージに切り替えてみたら良いらしい。

```docker-compose.yml
略
 image: postgres:15-bullseye
 略
```
実行
```
$docker-compose up --build -d
$docker-compose ps

         Name                       Command              State           Ports         
---------------------------------------------------------------------------------------
rails-dir_db_1    docker-entrypoint.sh postgres   Up      5432/tcp              
rails-dir_web_1   irb                             Up      0.0.0.0:3000->3000/tcp
```
無事DBコンテナが起動できました。
robocopyしてたらERROR87で沼った話

# 現象
robocopyコマンドでHDDにファイルをコピーしてたら特定のファイルをコピーするときにERROR87を吐く

~~パラメータ間違ってるって何？これバッチファイルで動かしているんですが~~

おそらくこやつ(なんか環境違う気もするがまあ…)
https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/robocopy-may-report-error-1338-87

# 環境

- windows11
- USB接続ポータブルHDD

# 原因
**HDDをFAT32でフォーマットしていたこと**


# 対処

データを退避させてNTFSに再フォーマット(むちゃくちゃ時間かかるので覚悟を)

# ひとこと

~~どうせエラー吐くならはじめから吐いてくださいよこういう中途半端に動くのが一番困るんですよ~~
AI時代のコーディングテスト

ChatGPTやGithub Copilotの普及により、面接で行っているコーディングテスト（コーディング試験）もやり方を考える必要がでてきました。
ただ、あまりその点に言及した記事がなかったため、ひとまず現時点で思いつく対策を挙げてみました。

# 前提
所属している組織は関係なく、個人の見解です。
開発業務がメインですが、中途/新卒問わず面接官として参加することがあります。
応募者としてはここ数年参加したことがありません。
コーディングテストは事前にお渡しするものと、ライブコーディングどちらも実施したことがあります。
ライブコーディング中はできれば画面を共有していただき、コーディング中の思考をなるべく口に出していただくようにお願いしています。

# そもそもAI利用を許可するかしないか
まず大前提として、AIを使わない場合のコーディング能力を測りたいのか、使った場合の測りたいのかを決める必要があります。
現場での使用が許可されていない場合は必然的に前者になりますし、使用できる場合であっても、現状の普及率なら候補者同士の比較をしやすくするために同じ条件でテストをしてもらうのもありだと思います。

# AI利用を許可しない場合
ライブコーディングなら手元を見せて貰うだけなので特に変わりません。
事前課題のタイプは、課題と専用のオンラインエディタと課題がセットになったタイプのサービスでは、コピペなどを検知する仕組みもあるらしいのでそういったもので検知できそうです。

# AI利用を許可する場合
今までであれば、候補者の開発スタイルを知るために簡単な要件を伝えて1からコードを書いて貰うということでもある程度能力を測ることができました。
ただ、AI使用可能であればプロンプトに要件放り込んで終わり！となってしまうことが多いので、別のアプローチが必要になってきます。
生成されたコードを適切に理解して説明できるのであればそれでよし、というのであればそれはそれでいいと思いますが、難易度は若干下がってしまうと思います。

### スクラッチは止めて既存コードの変更にする方法
現時点では数ファイル以上の規模のソースコードを全部AIに読み込ませるのは現実的ではないと思いますので、既存のプロジェクトを用意しておき、その上に機能追加や変更を課題として実施するやり方です。

デメリットとして、ディレクトリの切り方やテストの書き方などが既存のプロジェクトに引きずられるため、候補者自体のスタイルが見えにくくなります。
近いうちにAI側が進化してプロジェクト内の全ソースコードを平気で読み込むようになるかもしれません。

### 問題解決能力の方にフォーカスする方法
例えばフロントエンドエンジニア志望であれば、webサイトのプロジェクトを渡して遅いのを改善して貰うなどのやり方です。
ボトルネックの特定ならば、Pagespeed、Chrome DevTools、ブラウザ拡張等の使用、ログの確認や追加などいくつもの方法がありますし、
解決方法も同様に、重い処理を単純に早くする以外にも並列処理や圧縮、待ち時間に遊ぶミニゲームまでなんでもありです。

デメリットとしては試験の難易度が高く、候補者が何もできない可能性がでてくること、
自由度が高いので面接する側にも判断をするだけの知識が求められること、
純粋なコーディング能力は見えにくくなる可能性があることなどがあります。

### 一般的な方法ではない書き方を要求する方法
端的に言えば競技プログラミングやコードゴルフを行ってもらうやり方です。

デメリットとしてはやや実務能力が図りにくくなることと、
近いうちにAI側が進化して対応してくる可能性があることです。

# 最後に
観測できた範囲だと、最近のエンジニア志望の学生の過半数は分からないことをChatGPTに聞くくらいに一般化しており、また個人的にも今後はGithub copilotが使えない職場には行くつもりがないくらい気に入っているので、コーディングテストでもそれを活用することを前提としたものに適応していくべきだと思います。

# 参考
[株式会社ゆめみサーバサイドコーディング試験模試(2023年度版)の回答例とフィードバック例](https://qiita.com/taruhachi/items/56085228fe17537cc0d8)
本試験でのChatGPTの使用は禁止されているそうですが、実際にChatGPTで回答した場合とその評価を紹介されています。

[ChatGPTと競技プログラミングにトライ【Python】【ChatGPT】](https://qiita.com/ds_consultants/items/758f5a416be1987ee879)
ChatGPTを使って競プロの問題を短時間でクリアしています。

[HireRooの不正対策に関してに関しての説明](https://support.hireroo.io/suspicious-behavior)
コーディング試験サービスでのコピペやフォーカス外れに対しての対策を紹介されています。

[CodilityのChatGPTなどの不正対策機能の告知](https://www.prnewswire.com/news-releases/codility-introduces-ai-resistant-skills-assessments-301807718.html)
allowing customers the option to create tests that are ChatGPT-resistantとのことですが具体的にはどんなことができるのかよく分かりませんでした。
muiのstyled() を使ってstyled componentを作る方法

メモ。

```tsx
import * as mui from '@mui/material';

const StyledDiv = mui.styled('div')(({ theme }) => ({
  flex: "1", //　"1"は文字列
  flexDirection: 'column',
  justifyContent: 'flex-start',
  marginTop: '0.5em',
}));

const Component = (props: any) => {
    return (
        <StyledDiv> styled div</StyledDiv>
    )
}
```

## Ref

https://mui.com/system/styled/
プリザンターを便利に使う小ネタ②

本記事は、[OSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/pleasanter) の19日目の記事です。

## はじめに
皆さま「プリなま」は、ご存知でしょうか？
今年の3月から始まった、お悩み解決生配信、と題してYouTubeにて毎月行っている配信です。
…はい、そうです。2回目です。

この記事では、そんな「プリなま」で取り上げて解決したお悩みから今回も3つほど便利そうな小ネタをご紹介します。

[ノーコード・ローコード開発「プリザンター」ch \- YouTube](https://www.youtube.com/@Pleasanter)

## カンバンで文字を強調する
![カンバン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834556/2f5434a4-5dff-98f0-cf17-631a466b91fa.png)

カンバン表示、便利ですよね。
ドラッグ＆ドロップでステータスを変更できるので私もよく使っています。カンバン表示で一部の文字を強調したい、というようなご要望、多くないですか？
上図の例は、商談を管理するテーブルですが、商談の場合、金額を強調して表示したいといったご要望です。
これが、実は結構簡単にできたりします。

```
$p.events.on_kamban_load = function () {
    $('.kamban-item').each(function (index, ui) {
        var data = $(ui).text().split(':');
        if (data.length === 2) {
            $(ui).html(`<span>${data[0]}</span><span>&nbsp;:&nbsp;</span><span style="font-weight:bold;color:blue">${data[1]}</span>`)
        }
    });
}
```
わずかこれだけのスクリプトで実現できます。
上の例では、集計対象で「売上」が選択されているので売上の金額が強調表示されていますが、対象の項目を変更するとその項目が強調表示されます。便利！

```style="font-weight:bold;color:blue"```

の部分にスタイルを書いてあげれば、文字の色や大きさなど自由に変更できます。

こちらは、プリなま#4「⑥カンバンで一部の文字を強調することはできますか？」でご紹介しています。

プリザンターお悩み解決生配信 プリなま #4 - YouTube
https://www.youtube.com/watch?v=Ui5lco_trLQ&t=1432s

## 一覧画面の行に色をつける

![色.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834556/f3c09f7a-213e-7b45-4a32-556fe7373879.png)

スクリプトの「基本のキ」という感じではありますが、なんだかんだでご質問も多い一覧表示での背景色設定。
こちらはサーバスクリプトで「行表示の前」を条件にして以下のコードを書き、
```
if (model.NumA >= 3000000) {
    model.ExtendedRowCss = 'big';
}
```

以下のスタイルを設定するだけ！

```
.big {
    background-color: pink;
}
```

上の例では数値A(NumA)の値が300万以上の場合、bigというスタイルを適用するというスクリプトになります。この部分を変更してあげれば様々な条件で色分けすることができるので便利！

こちらは、プリなま#1「④一覧画面で行ごとに色を変えることはできますか？」でご紹介しています。


プリザンターお悩み解決生配信 プリなま #1 - YouTube
https://www.youtube.com/watch?v=Pur1SqxNvCM&t=695s

## 編集画面で動画を再生させる

![動画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834556/8005bc6f-a631-fbbc-ac5c-be75a6ef8678.png)

なんと、プリザンターは動画を添付すると、動画を再生することもできます！
なにに使うのでしょうか。きっと、なにかに使えます。いつか活用できる可能性が微レ存です。

こちらは、プリなま#3「④編集画面で動画を再生させることはできますか？」でご紹介しています。

プリザンターお悩み解決生配信 プリなま #3 - YouTube
https://www.youtube.com/watch?v=I9QHlwHucgU&t=786s

## おわりに
プリザンターはローコード開発ツールです。
ローコードとは、コードを書くことで機能を拡張できるということを指すわけですが、その拡張性の高さもプリザンターの特徴のひとつです。今回取り上げた、文字の強調や行の背景色設定など、実際的に業務で使えそうな拡張から、何に使うかはよくわからないけどなんだか楽しいカスタマイズまで、幅広くパワフルに拡張できます。
プリザンターは業務アプリを開発するプラットフォームではありますが、スタイルシートやスクリプトの学習教材としても、役に立つのではないかと思っています。すでに100を超えるサンプルがダウンロード可能なプリなまアーカイブも是非お役立て下さい。
e.preventdefaultの挙動について

# はじめに

いままでなんとなくで理解していた`e.preventdefault()`にいて考える機会があったのでざっとまとめてみます

# 挙動について

`e.preventdefault()`はイベント自体を伝播しないようにするものだと思っていたが、イベント自体をそもそもしないということがわかった

たとえば、入力をしているときにe.preventdefaultをした場合はそこで発生したイベント(たとえばキーダウン)などはなかったことにする

# 勘違いしていたやつ

イベントは発生するが途中で伝播を止めるのは`e.propagation`というのが別にある
この動きこそが当初勘違いしていたものであった

# では伝播を阻止するのはなぜか

例えばAコンポーネントの中にBコンポーネントが入っていたとする

Aコンポーネントで**イベント**をうけとるとユーザーを削除
Bコンポーネントで**イベント**をうけとるとユーザーフォームの内容を確定する

としたときに、Bコンポーネントで発生したイベントをBコンポーネントで阻止しておかないとAコンポーネントに伝播して、Aコンポーネントでは削除をしたいのかとイベントから判断してユーザーを削除することになる

実際にこんな実装になることは殆どないが、イメージはこんなかんじ

# おわりに

図解するともっとわかりやすいのですが、今回はざっとまとめるだけにしました
なんとなく理解していたのが理解したというところまでいったのでよかったです
確率過程ランダムウォーク編

:::note warn
この記事は、[Supershipグループ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/supership)の20日目の記事になります。
:::

## 概要

- 確率過程の簡単な例であるランダムウォークを紹介。
- 吸収壁というものがあるランダムウォークを紹介して、ギャンブルはあんまり良くないということを実感。

## はじめに
最近なんとなくで確率過程を勉強しています。
最終的な目標は伊藤の補題やブラックショールズ方程式を理解することなのですが、何事も下積みが大切ということで離散版のランダムウォークから勉強していきます。
せっかくアドベントカレンダーで記事を書いているのでこれを機に勉強を続けてアウトプットを出し続けられたらいいなあという気持ちです。


## ランダムウォーク
まず確率過程の例としてランダムウォークから始めます。
$X_i$ という自然数で添字付けられた互いに独立な確率変数を持ってきます。
ここで $X_i$ は $X_i = 1$ を確率 $p$ で、 $X_i = -1$を確率 $(1-p)$ で取るとします。

確率変数ってなんだっけとなる方は、確率によって出てくる数字程度に認識してください。
例えばサイコロの出目1~6は確率で出てくる数字なので、サイコロの出目は確率変数です。

また、互いに独立というのは確率が影響しないということです。
「10回連続で表が出たから次は裏が出やすい」とかはなく、常に他の出目などに影響を受けずにランダムだよってことです。

さて、この確率変数に従って原点から動き回るのがランダムウォークです。
$S_n = X_1 + \cdots + X_n$ と定義すると $S_n$ が原点をスタートしてから $n$ 番目の位置になります。
この $S_n$ の期待値は $E(S_n) = n(p - (1-p))$ となります。例えば $p = 1/2$ の時は期待値が0になります。
等確率で行ったり来たりすると思えば期待値が0になるのは直感通りですね。

ここではこんな感じで確率によって数字が決まる数列を（離散）確率過程ととりあえず定義しておきます。
確率論をちゃんとやったことがないので大体で話は進めます。

期待値を計算したのでついでに分散も計算してみましょう。

$V(S_n) = V(X_1 + \cdots + X_n) = V(X_1) + \cdots + V(X_n)$ なので各分散を求めます。

$E(X_i^2) = p \times 1^2 + (1-p) \times(-1)^2 = 1$ と簡単になるので、

$V(X_i) = E(X_i^2) - E(X_i)^2 = \cdots = 4p(1-p)$ と計算可能です。

以上をまとめると、
$E(S_n) = n(p-(1-p))$, $V(S_n) = 4np(1-p)$　と計算できたことになります。


ついでですが、中心極限定理より $S_n$ は $n$ が十分大きい時に正規分布 $N(E(S_n), V(S_n))$ に近づきます。
例えば $p=1/2$ の時であれば $N(0, n)$ という正規分布に近づくので、それっぽい感じがしますね。



## 吸収壁のあるランダムウォーク

今までやってたランダムウォークに少し条件を付け加えたものが吸収壁のあるランダムウォークです。
これは結構単純で、ランダムで移動するものが壁にぶつかると終わるというものです。
「物の位置が動いてどこかに当たると止まる」と考えるとあんまり大したことがないですが、「確率によって数値が変動し、それがどこかの閾値で止まる」と考えると少しファイナンスっぽくなってきます。

AさんとBさんが$a$円と$b$円を持っていて、確率 $p$ でAさんが1円をBさんからゲットするというゲームを繰り返すという状況を考えます。
この時にAさんが勝つ確率は？というのがちょっとしたランダムウォークの応用になります。

この時はスタート位置が $a$ から始まり、 Aさんの所持金は $0$ から$a+b$ の間を動きます。
所持金が０になるとAさんの破産、所持金が $a+b$ になるとAさんがBさんの全額を奪うのでBさんの破産というわけですね。

Aさんの所持金が $a$ 円の時にAさんが勝つ確率を $u_a$ とします。
すると $$ u_a = pu_{a+1} + (1-p)u_{a-1}$$ が成立します。
これを日本語で言うと、 $a$ 円持っている時に勝つ確率 = 「確率$p$ で $a+1$に行き、そこから勝つ確率」 + 「確率$1-p$ で $a-1$に行き、そこから勝つ確率」　という感じです。

あとはこの漸化式を解くだけなので解いてみると

$$u_a = \frac{1-(\frac{1-p}{p})^a }{ 1- (\frac{1-p}{p})^{a+b} }$$

となります。
ここで一つやばいことがあって、 $p=1/2$ のときです。
この時 $u_a$ の分母は0になって話が破綻します。
ただここはちょっと計算を省略してしまったので、アレですが、 $p=1/2$ の時は $u_a = a/(a+b)$ となることも計算できます。 

ちょっとこの式の意味を見ていきましょう。
等確率で勝敗がつく場合は、所持金が多い方が勝ちやすいということがまずわかります。
１０００万円持っている人と10円持っている人が等確率のコインの裏表で1円のやりとりを行うと10円側が負ける感じがしますよね。

この辺の計算を行うと、一定の確率で金銭のやり取りを行うとはいえ、お金を持っている方が相手を破産に追い込めて勝ちやすいということがわかります。
しかし現実はここまで分かりやすいモデルではなく、結構色々あるものです。
そういうわけで僕は有馬記念はジャスティンパレスで行こうと思いました。

:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::
pythonでpairwise alignment(ペアワイズアラインメント)

pythonでペアワイズアラインメントを行う方法を記します。



:::note info
**追記**
複数の配列ついてに総当たり形式で、全組み合わせのアラインメントする方法を記事にしました。
https://qiita.com/kujira_0120/items/2de5d08925aa7a80e15e
:::


# ペアワイズアラインメント
>バイオインフォマティクスにおいて、シーケンスアラインメントとは、DNAやRNA、タンパク質の配列（一次構造）の類似した領域を特定できるように並べたもので、機能的、構造的、あるいは進化的な配列の関係性を知る手がかりを与える。
>ペアワイズシーケンスアラインメントは、2配列間でのアラインメントで、部分的、あるいは全体の類似性を詳しく調べるときに用いる。
>[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E3%82%A2%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88)より

アラインメントを行うWebアプリもあります。以下は一例です。

https://www.ebi.ac.uk/jdispatcher/psa/emboss_needle

# pythonで実装

## ライブラリのインストール
```terminal
conda install biopython
pip install biopython
```
公式のドキュメント
https://biopython.org/docs/1.75/api/Bio.Align.html

## ライブラリのインポート
```python
from Bio import Align
from Bio import SeqIO
from Bio import SearchIO
```

## 配列を読み込む

Fastqファイルのパスを入力。FastqはNCBIのサイトなどからダウンロードできる。
（Fastqを使わず配列を手入力でも可能。）
```python
file1 = './[fastqファイル].faa'
file2 = './[fastqファイル].faa'

seq_a = list(SeqIO.parse(file1, "fasta"))[0].seq
seq_b = list(SeqIO.parse(file2, "fasta"))[0].seq
```

## パラメーターの設定、実行
```python
aligner = Align.PairwiseAligner()

# アラインメントパラメータを設定
aligner.match_score = 2
aligner.mismatch_score = -1

aligner.mode = "global" #ローカルの場合は"local"
alignments = aligner.align(seq_a, seq_b)
alignment = alignments[0]

print(alignment)
```

### 実行例

```
target            0 MQQAG--LTLMA----VAVCV--A--------FQ------------------TS-----E
                  0 |------|--------||-----|--------|-------------------||-----|
query             0 M----SRL----RRYEVA---LEAEEEIYWGCF-YFFPWLRMWRRERSPMSPTSQRLSLE

target           21 AI--LPM---------------A----SS--CCTEV--------SHHVSGRLLERVSSCS
                 60 |---||----------------|----||--|||----------|-----|||-|-----
query            48 A-PSLP-LRSWHPWNKTKQKQEALPLPSSTSCCT--QLYRQPLPS-----RLL-R-----

target           50 -I-----QR-ADGDCD-L-AAVI-LHVK--RRRICISP---H--NRT-LKQWMRASEVKK
                120 -|-----|--|||||--|-|-|--||----||----|----|--||--|-----|-----
query            93 RIVHMELQ-EADGDC-HLQA-V-VLH--LARR----S-VCVHPQNR-SL-----A-----

target           92 NGR--ENVCS--GKK--Q---PSR------KDRKGHTTRKHRTRGTHRHEA--SR-----
                180 --|--|------||---|---||-------|--|-------------------|------
query           131 --RWLE----RQGK-RLQGTVPS-LNLVLQK--K-----------------MYS-NPQQQ

target          130 - 130
                240 - 241
query           163 N 164
```

## スコアの表示
```python
import numpy as np

length = alignment.shape[1]

difference = np.array(alignment.aligned)[0][:, 1] - np.array(alignment.aligned)[0][:, 0]
identity = np.sum(difference)
ratio = identity / length*100

print(f'Score:    {alignments.score}')
print(f'Length:   {length}')
print(f'Identity: {ratio:.1f}% ({identity}/{length})')
```

### 実行例
```
Score:    106.0
Length:   241
Identity: 22.0% (53/241)
```
wpa_supplicant.confに設定ないのにWifiに繋がる

### 初めてBookwormを使ったときにWifi設定でハマったので、備忘録として残します。
2023-12-05-raspios-bookworm-armhf をmicroSDカードに書き込んでブート。
X-Window起動後、画面右上のWifiアイコンから目的のアクセスポイントを選び、PSKを入力して無事接続。
wpa_supplicant.confを確認するが、設定は書き込まれていない。
```/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
```
いつものnetworkセクションがない
wpa_cliで確認すると設定がある。いったいどこに設定されているのだろう？
```
pi@raspberrypi:/run/wpa_supplicant $ sudo wpa_cli	
wpa_cli v2.10	
Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi> and contributors	
	
This software may be distributed under the terms of the BSD license.	
See README for more details.	
	
Selected interface 'wlan0'	
	
Interactive mode	
	
> list_networks	
network id / ssid / bssid / flags	
0       ssid1  any     [CURRENT]
```
調べてみると、/etc/NetworkManager/system-connections/ にある設定ファイルを見に行っているらしい
```
pi@raspberrypi:~ $ cd /etc/NetworkManager/system-connections/
pi@raspberrypi:/etc/NetworkManager/system-connections $ ls -al
合計 12
drwxr-xr-x 2 root root 4096 12月 12 12:39 .
drwxr-xr-x 7 root root 4096 12月  5 10:10 ..
-rw------- 1 root root  289 12月  5 10:58 ssid1.nmconnection
```


ファイルの内容を確認すると、PSKがハッシュではなく平文で書かれていた・・
wpa_supplicant.con同様、ハッシュの記述にできるかは今後調査予定
```
[connection]
id=ssid1
uuid=xxxx
type=wifi
interface-name=wlan0

[wifi]
mode=infrastructure
ssid=ssid1

[wifi-security]
auth-alg=open
key-mgmt=wpa-psk
psk=password
```
次にwpa_cliで、別のSSIDを追加後、1つ目のSSIDを無効化してセーブしてみるも、FAIL・・
```
> add_network
1
<3>CTRL-EVENT-NETWORK-ADDED 1
> set_network 1 ssid "ssid2"
OK
> set_network 1 psk "password"
OK
> enable_network 1
OK
> disable_network 0
OK
> save_config
FAIL
> save_config
FAIL
```
先のディレクトリを見てみると、新しいssidの設定は追加されている
```
pi@raspberry:/etc/NetworkManager/system-connections $ ls -al
合計 16
drwxr-xr-x 2 root root 4096 12月 12 12:39 .
drwxr-xr-x 7 root root 4096 12月  5 10:10 ..
-rw------- 1 root root  283 12月 12 12:39 ssid2.nmconnection
-rw------- 1 root root  289 12月  5 10:58 ssid1.nmconnection
```
しかし、リブートするとssid1で繋がってしまうので、ssid1の設定ファイルを削除（移動）して再度リブート
```
pi@raspberry:/etc/NetworkManager/system-connections $ sudo mv ./ssid1.nmconnection /home/pi/
```
するとssid2のアクセスポイントに接続できるようになった
```
> list_networks
network id / ssid / bssid / flags
0       ssid2  any     [CURRENT]
```

wpa_supplicant.confですべて管理していると思っていたけど、いつの間に変わったのか・・
PSKハッシュ記述の件も含めて、時間があれば調査予定
現在時刻が関わるアプリケーションの複雑性に立ち向かうにはどうすれば良いか？(PHP)

答え

![現在時刻なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3604824/b5200db1-77da-86e0-464d-c0e818a60905.png)


## 参考
- 現在時刻が関わるユニットテストから、テスト容易性設計を学ぶ
    - https://t-wada.hatenablog.jp/entry/design-for-testability
- 時計オブジェクト（ドメインクロック）を導入してテスト容易性と意図性を高める
    - https://phpmentors.jp/post/46982737824
- PSR-20: Clock
    - https://www.php-fig.org/psr/psr-20/
- PSR-20 Meta Document
    - https://www.php-fig.org/psr/psr-20/meta/
- 『単体テストの考え方/使い方』
    - https://book.mynavi.jp/ec/products/detail/id=134252
    - 第11章: 単体テストのアンチ・パターン
- 'REQUEST_TIME'
    - https://www.php.net/manual/ja/reserved.variables.server.php
- 「全てがリクエストの後に真っ更になる」
    - https://web.archive.org/web/20110127085754/https://www.codeblog.org/blog/moriyoshi/
- php-timecopを実戦投入してみた
    - https://www.slideshare.net/hnw/phptimecop
- Implement Psr\Clock\ClockInterface #2813
    - https://github.com/briannesbitt/Carbon/pull/2813
- created_at と updated_at のあつかい
    - https://tech.notti.link/6dcafda
    - > created_at と updated_at をアプリケーションが参照することは基本的にしない
(リンクだけです)材料力学「Shrink-fitting(焼きばめ)」を調べた。

# wikipedia 
焼きばめ圧力の理論式　＜

https://ja.wikipedia.org/wiki/%E7%84%BC%E3%81%8D%E3%81%B0%E3%82%81

https://en.wikipedia.org/wiki/Shrink-fitting

# google検索

https://www.google.com/search?q=%E7%84%BC%E3%81%8D%E3%81%B0%E3%82%81&rlz=1CAUHAM_enJP1089&oq=%E7%84%BC%E3%81%8D%E3%81%B0%E3%82%81&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTILCAEQABgEGCUYgAQyCwgCEAAYBBglGIAEMgsIAxAAGAQYJRiABDILCAQQABgEGCUYgAQyCwgFEAAYBBglGIAEMgYIBhBFGDwyBggHEEUYPNIBCDk1NzRqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8
ROSロボットシミュレータ 環境構築

# turtle bot (+ 2d Lidar)

2d-lidar付きのロボットをお手軽に試したい場合これを使うのがが良さそう?

## インストール方法

```
sudo apt install -y ros-noetic-turtlebot3-msgs
sudo apt install -y ros-noetic-turtlebot3
sudo apt install -y ros-noetic-turtlebot3-simulations
```

## 実行方法

シミュレータ立ち上げ
```
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_gazebo turtlebot3_world.launch
```

urdf,gmapping等

```
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
```

![Screenshot from 2023-12-19 18-35-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/3f4e924c-75a8-91fd-ab50-5ed2f6d9db3e.png)

topic一覧

```
/clicked_point
/clock
/cmd_vel
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/performance_metrics
/gazebo/set_link_state
/gazebo/set_model_state
/imu
/initialpose
/joint_states
/map
/map_metadata
/map_updates
/move_base_simple/goal
/odom
/rosout
/rosout_agg
/scan
/tf
/tf_static
/turtlebot3_slam_gmapping/entropy
```

tf tree

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/ae997ff4-29ea-0453-9bcd-bf5eda273855.png)





# 参考

https://qiita.com/protocol1964/items/1e63aebddd7d5bfd0d1b
SRv6って難しいの？

# はじめに
　SRv6って言葉は聞いたことがあるけど、実際はどんなものでどんなところで使えるかよくわからない。しかもなんか難しそうだし・・・。この記事では、初心者向けにSRv6ってどんなものかを大雑把に解説します。
 
# SRv6ってなに？
　最近、大手サービスプロバイダのバックボーンに使われるようになったルーティングの技術の１つ。まだまだ、新しい規格が作られていて、進化の途上です。Segment RoutingをIPv6を使って行うものがSRv6、MPLSを使って行うものがSR-MPLSと呼ばれています。
 簡単にいうと、送信するヘッダに途中で通過するセグメントリストを持っていて、途中のルータはそのセグメントリストを見て次に転送するルータを決定します。
 ただし、このときのセグメントリストは、IPアドレスではなく、SID（Segment ID）で表記されます。SIDについては次の章で解説します。


![srv6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/22cf5fc7-0b91-9abd-8eed-0fc2555909aa.png)

SRv6の入り口となるルータで送信したいパケットをカプセル化しSRヘッダを追加します。SRヘッダには経由するセグメントリストを保持しており、途中経由するルータ（セグメント）では、受け取ったパケットのSRヘッダに載っている自分のSIDを見て、NextHopルータへルータへ転送します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/e52597a8-0a85-cf73-1355-4fbb19a15119.png)

# SID
 SRv6で用いるSIDは、IPv6アドレスと同じ形式（128bit）で表記されます。前64bitがLocatorでどのネットワークのロケーションを示します。後半64bitでFunctionやOptionを示しますが、この部分はルータが自動生成してくれます。
 Functionはいろいろ定義されているが、L2VPNやL3VPNなどがよく使われます。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/bb90f85d-2895-022d-ed0b-1e370f7415cb.png)

近年、Locator部を32bitにしたuSIDも使わていますが、現時点ではuSIDとSIDに互換性はなく、uSID同士、SID同士でないと通信はできません。（単純なIPv6転送だけであればできます）なお、SIDはRFC8986で定義されています。

## それじゃどうするか？
これで、SRV6について大まかに説明してきました。（ほんとにざっくり）
実際に設定をどうやっていくのか見てみましょう。
今回、前提条件として、
* ルータ同士はISISで接続
* loopbackインターフェイスにIPv6の固定IPを付与
* ルータ間の通信はIPv6 LLDPを使う
* L3VPNで設定
* SIDはBGPで広報
* プライベートASを使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/5abb392a-0e17-74c7-1f9b-7b57b9aa9755.png)

設定の中でSRv6にかかわる部分を抜き出してみました。
```
vrf VRF1
  rd 64521:5
  address-family ipv4 unicast
   segment-routing srv6
    locator 1
    alloc mode per-vrf
```
まずは、BGPのVRFの設定の中に、IPv4 unicastをSRv6のLocator 1でSIDを広報するように設定しています。

```
segment-routing
 srv6
  encapsulation
   source-address fc00:3001::1
  !
  locators
   locator 1
    prefix fc00:ff01:1::/64
```
この部分がSRv6の要です。
SRv6トンネルのソースアドレスの設定とLocatorの設定をしています。
今回は、SRHに入るルータリストは設定していませんが、必要な場合は、SR Policyでルータリストを設定します。

```
router isis 1
 net 49.0000.0000.0001.00
 address-family ipv6 unicast
  metric-style wide
  segment-routing srv6
   locator 1
```
isisの設定にもSRv6の設定を入れておきます。
と、SRv6固有の設定はこんなものです。

## さいごに
SRv6の初歩についてちょっとだけ解説しました。
世の中にはもっと詳しく解説してくれているページがあると思いますので、興味を持った方はそっちも参考にしてください。
設定自体はそんな複雑なことはしていないので、割と簡単にできると思います。
（SRv6ができるルータが手元にあればの話しですが・・・）
Linuxテキスト処理コマンド問題

# 問題：/etc直下のファイル数、ディレクトリ数の合計を調べよ。

```bash
$ ls /etc | wc -l
```

ポイント：
lsは出力先がコンソールだと1行で表示されリダイレクトだと改行される。
以下で試すとわかる。

```bash
$ ls / | cat
```

# 問題：/etc直下のファイルをファイルサイズの大きい順に並べよ。

```bash
$ ls -l /etc | sort -rn -k 5
```

# 問題：/etc/passwdの7列目のみを表示せよ。

```bash
$ cat /etc/passwd | cut -d : -f 7
```

# 問題：/etc/passwdの7列目のみを重複を省いて表示せよ。

```bash
$ cat /etc/passwd | cut -d : -f 7 | sort | uniq
```

# 問題：/etc/passwdの7列目のみを重複を省いた上で、出現回数の多い順に表示せよ。

```bash
$ cat /etc/passwd | cut -d : -f 7 | sort | uniq -c | sort -rn
```

# 問題：/etc/passwdの列の区切り文字をカンマにして表示せよ。

```bash
$ cat /etc/passwd | tr : ,
```

# 問題：/etc/passwdの改行を削除して表示せよ。

```bash
$ cat /etc/passwd | tr -d "\n"
```

# 問題：output.logへの追記をリアルタイム表示して監視せよ。

```bash
$ tail -f output.log
```

# 問題：以下のコマンドの結果から2021.txtはどうなっているか想像せよ。

```bash
$ cat -n 2020.txt
     1  Hokkaido
     2  Kyoto
     3  Okinawa
     4  Tokyo
     5  Kanagawa
     6  Osaka
     7  Nara
     8  Nagano
     9  Fukuoka
    10  Ishikawa
```

```bash
$ diff 2020.txt 2021.txt
5d4
< Kanagawa
6a6,8
> Kanagawa
> Fukuoka
> Nagasaki
9d10
< Fukuoka
```

diffの結果はユニファイド形式の方が分かりやすい。

```bash
$ diff -u 2020.txt 2021.txt
--- 2020.txt    2023-12-19 17:46:17.502831155 +0900
+++ 2021.txt    2023-12-19 18:19:52.896839644 +0900
@@ -2,9 +2,10 @@
 Kyoto
 Okinawa
 Tokyo
-Kanagawa
 Osaka
+Kanagawa
+Fukuoka
+Nagasaki
 Nara
 Nagano
-Fukuoka
 Ishikawa
```
 
答え：
```bash
$ cat -n 2021.txt
     1  Hokkaido
     2  Kyoto
     3  Okinawa
     4  Tokyo
     5  Osaka
     6  Kanagawa
     7  Fukuoka
     8  Nagasaki
     9  Nara
    10  Nagano
    11  Ishikawa
```
【Flutter】内製ライブラリ開発でpackageとpluginの選択に迷った場合

自社用にライブラリを内製しようとした場合、まず[packageの種類](https://docs.flutter.dev/packages-and-plugins/developing-packages#types)で迷うことがあるかもしれません。
ネイティブの機能に関わる場合はPluginsを選択することになりますが、内製ライブラリを開発するという場面においては、ヘルパー関数や共通ウィジェットをまとめるケースが考えられます。
このとき、ヘルパー関数はネイティブの機能に関わることは稀と考えられますが、共通ウィジェットは一部必要になる可能性があります。
そこで、当社の内製ライブラリでは、monorepoの形をとっており、sw_flutter_sdkというリポジトリの中にsw_helper(package)、sw_widget(package)、sw_video(plugin)という複数のpackageやpluginを持たせることで柔軟な対応をとっています。
monorepoの形をとっているものとしては、[riverpod](https://github.com/rrousselGit/riverpod)などの有名どころでも見られます。（packagesディレクトリ内に複数のpackageが格納されています）
  
尚、複数のpackageを管理しようとすると、それぞれのpackageごとにpub getしたいときなど、しばしば不都合があります。
その場合は、[melos](https://pub.dev/packages/melos)を利用いただくと便利です。
AtCoder入青記事

[木更津高専 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nit_kisarazu)の20日目の記事となっております
Prev ← [AtCoder入茶しました](https://qiita.com/nairoki/items/ec0c8b3ae1e42a842389) by @nairoki
Next → [AtCoder入緑記事](https://qiita.com/toma09to/items/08438b8f92f6b4d21707) by @toma09to

# はじめに
青色になりました！
昨年の12/10に緑になってからちょうど1年、今年の6/10に水になってからちょうど6ヶ月です

![blue_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983542/8057140e-3709-d459-5335-9adcf8871be6.png)

https://atcoder.jp/users/ku_senjan/history/share/abc332


# 学んだこと
あんまり多くないと思います
最近は偶然自分の得意な問題セットに当たっているだけな気もします
以前よりも解くスピードと安定感が上がって、応用力が少しついたイメージです
例えば二分探索での判定問題とか、セグ木に何を乗せるかとかを考えるなどです

## アルゴリズム等
それらを使った問題も載せておきます

### 二分探索
答えを決め打ち二分探索

https://atcoder.jp/contests/abc324/tasks/abc324_f

### しゃくとり法
二分探索でええやん←ダメです、しゃくとりを書けるようになりましょう

https://atcoder.jp/contests/abc247/tasks/abc247_e

### セグメント木
モノイドを考えます

https://atcoder.jp/contests/abc331/tasks/abc331_f

### 遅延評価セグメント木
写像も考えます

https://atcoder.jp/contests/abc332/tasks/abc332_f

### ローリングハッシュ
文字列系統は苦手で、まだZ-algorithmなどは理解していません…

https://atcoder.jp/contests/abc141/tasks/abc141_e

### 強連結成分分解
互いに行き来可能なグループごとに分割します

https://atcoder.jp/contests/abc245/tasks/abc245_f

## 考え方やテクニックなど

### 期待値の線形性
期待値の問題が出た時、これを理解してなくて困ってました…

https://atcoder.jp/contests/typical90/tasks/typical90_bn

### 逆元を毎回計算するとTLEする場合があります
必要な場面では前計算しておきます
二項係数のライブラリは以下を参考にさせていただきました

https://blog.hamayanhamayan.com/entry/2018/06/06/210256

### DPをメモ化再帰で書く
遷移が面倒な場合はメモ化再帰をしています
EDPCのフレンズさんの解説を読んで知りました

## その他やったこと
### デバッグ用ライブラリの整備
ローカルでは標準エラー出力、ジャッジの時は何も出力されないようにしています
マクロ等を作る上で以下の記事を参考にさせていただきました

https://trap.jp/post/1224/

### atcoder-cliを自分好みに使う
シェルスクリプトを書いて以下を一気にできるようにしました
acc submitの時にojに引数を渡せるのを最近になって知りました
1. ファイルが更新されている場合は再度コンパイル
1. ローカルテスト
1. ACが出たら提出か確認
1. 提出

### 解けないor時間がかかる問題をスルーする
自分の実力だとABC-Dでも解けない場合があるので、順位表でどのくらい解かれているかを確認してから一旦飛ばしてます
順位表の確認には[AtCoderStandingsAnalysis](https://greasyfork.org/ja/scripts/398439-atcoderstandingsanalysis)を使っています

### 使用している拡張機能や便利サイトなど
入水の時にまとめたのをご覧ください

https://qiita.com/ku_senjan/items/a615f4859658b4aa0897#%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD

### 現在読んでいる本
- PAST本(上級~エキスパート)
    - 一問一問学びがあって楽しいです
    - 本に書いてあるのはPythonのみですが、C++のコードも公開されています
https://github.com/tsutaj/pastbook-2-source-code
- マスター・オブ・場合の数
    - マスター・オブ・整数が良かったのでこちらも読んでいます
- 数学オリンピックの表彰台に立て！
    - JMOに出ますと言ったら優しい先輩が貸してくれました！
手を動かして問題を解く癖がついてきた気がします

### 精進
夏休みに精進BAN鯖に参加しました、お世話になりました
水diffへの苦手意識がかなり薄まりました

![shojin_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983542/3f220e1e-6788-abe9-034a-e0ba3b599836.png)
![shojin_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983542/be5f4610-e388-ee70-c5f8-1ca636a8e4c6.png)
![shojin_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983542/c6f767c1-13c3-0c73-6f4e-737fbb6bbf76.png)
![shojin_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983542/e0214bc1-c5fe-07be-0c14-3275c2dc3f9d.png)

# さいごに
今まで基本的にABCしか参加してなかったので、これからARC,AGCだったり、Codeforcesにも挑戦しようと思います
黄色…なれるんでしょうか…
stm8のシリアルで遊ぶ


目的
ハードウェアシリアルを試す

![o_cop868.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/833d7ab4-c4f3-2d44-bd06-142460082a6d.jpeg)


![o_cop866.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fc5b8559-7684-7f8c-1188-7598b10e24fe.jpeg)

![o_cop867.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/20dd4d3e-8c39-e317-a3b6-0c0b49ba2363.jpeg)


```c++


#include"stm8s.h"

void send_string(char *str)
{
    char c;

    if (!str) return;

    while ( c=*str++ ) {  // assignment intented
        while (!UART2_GetFlagStatus(UART2_FLAG_TXE));
        UART2_SendData8(c);
    }
}


void setup ()
{
    uint32_t i;

    UART2_DeInit();
    UART2_Init(9600, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO,
        UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);

    while (1) {
        send_string("Hello World!\n");
        for (i=30000; i; i--);
    }
}


void loop(){}


```
Androidのプロセス間通信って？BinderProxyってなに？？

本記事では、プロセス間通信や、BinderProxyとは何か、そして普段のAndroid開発の中でどのように登場するのかについて話していきます。

## 注意
末尾にも書いたのですが、こちらの記事は自分の浅い理解をもとに書いてしまっています。追って更新いたします。

## 簡単に話すと
BinderProxyとは、Androidのプロセス間通信(IOC)の仕組みの中で重要な要素です。プロセス間通信は、コンピュータの動作において、複数プロセス間でデータをやりとりする仕組みのことです。Androidアプリは1つのプロセスにつき1つアプリケーションを走らせることができます。日記アプリで、何か別の写真アプリを経由してに写真を投稿すると思いますが、この時日記アプリ->写真アプリ->日記アプリと複数のプロセスをまたいだやりとりをしています。この複数プロセスの間のやりとりを、Android OS上で上手くやってくれる子がBinderProxyということです。

## 登場人物
| 名前 | 解説 |
|:-:|:-:|
|  **クライアント** |  クライアントはサービスやデータを要求している側のプロセスです。冒頭の文章だと日記アプリですね。 |
|  **サーバー** | サーバーは、要求されたサービスやデータを提供する側のプロセスです。 冒頭の文章だと写真アプリですね。|
| **バインダーシステム**  |  IPCシステムの1種で、別プロセスであるクライアントとサーバーのやりとりを取り持ってくれるのがバインダーシステムです。公式Documentによると、バインダーシステムは別のIPCシステムに比べて効率的、高速、そしてセキュリティの観点でも優れているそうです。 |
| **IBinder**  |  サーバーが、自身が提供する機能をクライアントに公開するインターフェースのこと。各サーバーが１つ持っている。|
| **BinderProxy**  | IBinderを実装したもの。バインダーシステムのやり取りでは実際にはBinderProxyが動くので、バインダーシステムの中で何かTransactionTooLargeExceptionといった例外が投げられたときに、エラーログに現れるのはIBinderではなくBinderProxyの名前になります。 |


## 登場人物ってわけではないけど、ドキュメントで出てきてわかりづらかった単語
| 名前 | 解説 |
|:-:|:-:|
|  **remote object/remotable object** | 何か特定の扱いたいobjectが別プロセスに存在していることを「remote」と表現しているようです。 |



## Android開発で登場するとしたら
Android開発で１番身近なプロセス間通信は、冒頭で出てきたようなデータのやり取りだと思います。この時にBinderProxyくんが動いてくれています。

### 気をつけること。
BinderProxyに受け渡せるデータ量には制限があります。公式ドキュメントには1MBが上限とあります。この上限を超えてデータを受け渡す、または別プロセス先のアプリからデータが渡されてこようとすると、先ほど挙げた**TransactionTooLargeException**が投げられてクラッシュしてしまいます。気をつけましょう。この例外はOS側から投げられてしまうもので、try~catchはできない認識です。


## わからなかったこと
先述の通り、BinderProxyはプロセス間通信のための存在ですが、観測範囲ではプロセスが変わっていない時でも動いているようです。具体例はActivityの破棄時です。システムによるActivityの破棄時にonSaveInstanceStateが発火して、データがBinderProxyへと受け渡されていきます。が、システムによってActivityが破棄されたとしても、すぐにアプリケーションが最前面に戻れば同じプロセスで復帰します。なので少なくともActivityが破棄された、onSaveInstanceStateが発火したタイミングではプロセス間通信が行われると決まっていないと思います。なのに毎回プロセス間通信のためのBinderProxyに書き込みが行われる点が自分にはよくわからなかったです。詳しい方教えてください、、
この記事を書いていて何もわからなくなってしまったので、以下の本などを読み加筆していこうと思います。

https://www.amazon.co.jp/Android%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93%E3%80%88I%E3%80%89%E2%94%80%E2%94%8060fps%E3%82%92%E9%81%94%E6%88%90%E3%81%99%E3%82%8B%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AAGUI%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-WEB-DB-PRESS-plus/dp/4774187593/ref=asc_df_4774187593/?tag=jpgo-22&linkCode=df0&hvadid=295706574430&hvpos=&hvnetw=g&hvrand=17225478531799332407&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009247&hvtargid=pla-527357531701&psc=1&mcid=0aab34aedc4e300baba6f43227b8fea4&th=1&psc=1




## 参考記事
https://developer.android.com/reference/android/os/IBinder
https://developer.android.com/reference/android/os/TransactionTooLargeException
https://developer.android.com/guide/components/activities/parcelables-and-bundles?hl=ja#sdbp
https://developer.android.com/guide/components/activities/process-lifecycle?hl=ja
個人的に最近好きなUI/UX3選

この記事は ウェブクルー Advent Calendar 2023 20日目の記事です。
昨日は @yuko-tsutsui さんの「 [AWS EC2環境にCircleCI＋CodeDeployを導入した時の記録](https://qiita.com/yuko-tsutsui/items/931336d257ac283e9696) 」でした。

今年も日々のストックから、UI/UXに関するものをご紹介したいと思います。
個人的な好み・見解になりますので、ご了承ください。

## スライダーの見せ方、2段階
まずはECサイトのスライダーです。
画像を横にクルクル回すスライダーはよく使うものですが、ここのコントロールってすごく悩みますよね…。
一見よくある横軸のスライダーですが、画像右上のアイコンをタップすると、モーダルウィンドウとなり縦軸に切り替わります。縦スクロールの方が情報が見やすく、インタラクションもすごく気持ちがいいですね。
また画像右上の複数枚あることを示すアイコンも見たことがないものだったので珍しいなと思いました！
![RPReplay_Final1702896617 (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314279/21237c5a-b12e-32a5-cdf0-299ff4b3ee02.gif)
参照元：[https://shopping.yahoo.co.jp/](https://shopping.yahoo.co.jp/)のアプリおよびSP版




## 追従ヘッダーの透過具合
こちらは不動産サイトです。とてもデザインが好きです(笑)
注目したのは追従ヘッダーです。
スクロールされても常に表示させておきたいコンテンツがある際に当社もよく使う手法ですが、特にスマートフォンサイトでは表示領域を取られてしまい、追従を採用するかは賛否両論分かれるところです…。~~ちなみに私は反対派でして。~~
ですが、こちらのヘッダーはスクロール中もあまり気にならずかつ視認性高い印象、、調べてみたところ背景透過の具合が絶妙…！
CSSのbackdrop-filterのぼかし(blur)＋透過(alpha)で表現されていました。
alpha値のみだとハッキリしすぎてしまい、ぼかし(blur)のみだとボヤっとしすぎてしまう、ダブル掛けが絶妙。
CSSで一工夫するだけで良くなるいい例だと感じました。
※すりガラスのような表現ができるGlassmorphism（グラスモーフィズム）というデザイン手法のようです。
```
.header__bg {
    backdrop-filter: blur(3px);
    background-color: rgba(255, 255, 255, 0.6);
}
```
![公式｜ロケーション｜ミオカステーロ南行徳｜山田建設 - Google Chrome 2023-12-20 10-17-04 (1) (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314279/a0a46746-781f-557b-2525-f11350e40437.gif)
参照元：[https://www.yamada-kensetsu.co.jp/cms/bukken/minamigyotoku/](https://www.yamada-kensetsu.co.jp/cms/bukken/minamigyotoku/)
参考：[https://photoshopvip.net/126760](https://photoshopvip.net/126760)

## 補足/ヘルプ情報の見せ方
日頃大変お世話になっている某キャッシュレスアプリから。
？アイコンをタップし表示されるヘルプ情報の見せ方の個人的に一番好きなUIでして。
こちらは某ポイントを利用した資産運用のページですが、画面下のリスト上の右にある「コース説明」をするためのヘルプマーク（？アイコン）を押すと下からニュっとモーダルウィンドウのようなものが表示されます。
スマホを片手で操作した際に”親指が届く範囲”で完結している点が個人的Goodポイントです！こういう補足情報は手軽にサッと確認できる方がストレスがないですね。特に閉じるボタンが親指から遠くなればなるほど辛い…。
アプリ内のヘルプがすべてこの表示方法に統一されている点も良きです。（一部例外あり）
![RPReplay_Final1702966178.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314279/0ce9d4b4-ac3e-e317-eefc-f2b7f65cf1ef.gif)
参照元：[https://paypay.ne.jp/](https://paypay.ne.jp/)のアプリ版のみ

## おわりに
いかがでしたでしょうか？活用できそうな手法は取り入れていきたいですね。
またストックが溜まったらご紹介できればと思います。

明日は、@kalzit さんの記事です、よろしくお願いします。
トラブルシューティングを解決する時のメモ

AWS のトラブルシューティングにおいて、より早く解決に導くための自分なりのメモをざっと残す。そして、

## 事実確認
まずは、どこまで処理が進んだか、どこでエラーが起こったのか等を把握することが大事。
- ログ、エラーメッセージ等を見る (エラーメッセージやログは、飛ばさずにすべて読む)
- API 実行履歴を確認する (AWSだと、CloudTrailで確認できる)

## 全体把握
- 構成を確認する
- ネットワーク経路を確認する

## 調査
- 問題の切り分け
    * アプリケーション側で発生しているのか
    * AWS側で発生しているのか
    * 再現性はあるのか
        * いつ、どれくらいの頻度で発生するのか
- 何がわからないのか明確にする
- わからないことは、すべて調べてノートにまとめる
    - 理解を焦らない。理解にじっくり時間をかける
Swiftにおけるシャローコピーとディープコピー

# 概要

最近Swiftを触っているときにふとSwiftにおけるシャローコピーとディープコピーってどういう仕様なんだろう？と思い、書いてみました。

# 詳細

##  用語の説明

まずはシャローコピーとディープコピーについての説明。

シャローコピー
コピーされたオブジェクトが参照しているオブジェクトへの新しい参照を作成すること。
コピー元とコピー先のコレクション（例：配列やディクショナリ）は同じオブジェクトを共有します。故に、内部を変更した場合、コピー元とコピー先の両方に反映される。
シャローは浅い、という意味でシャローコピーは浅いコピーとも呼ばれる。
参照

ディープコピー (Deep Copy)
コピーされたオブジェクトとその内部のオブジェクトのコピーを生成すること。コピー元とコピー先は完全に独立したオブジェクトであり、内部のオブジェクトも再帰的にコピーされる。故にコピー元のオブジェクトを変更した場合にコピー先のオブジェクトに変更は反映されない
ディープは深い、という意味でディープコピーは深いコピーとも呼ばれる。

## Swiftでの仕様

[この公式のブログ](https://developer.apple.com/swift/blog/?id=10)を見る限り、Swiftでは単純に代入を行った場合、Int、String、Structなどの値型はディープコピー、参照型のclassはシャローコピーの原則がある。
それらを踏まえると、基本的には値型はそこまで気を遣って管理する必要はないが、classの管理については無闇矢鱈に共有代入を繰り返すことは避けた方が良いと思える。


ちなみに、classでシャローコピーとディープコピーをSwiftでそれぞれ実装した場合、以下のようになります。


```swift:シャローコピー
import Foundation

// シャローコピーの例
class ShallowObject {
    var value: Int

    init(value: Int) {
        self.value = value
    }
}

let originalShallow = ShallowObject(value: 42)
let copiedShallow = originalShallow

// originalShallowとcopiedShallowは同じオブジェクトを参照
print(originalShallow.value)  // 42
print(copiedShallow.value)    // 42

// originalShallowの変更はcopiedShallowにも反映される
originalShallow.value = 99
print(copiedShallow.value)    // 99
```

`originalShallow`に対して行った変更が`copiedShallow`にも反映されていることが確認できます。

一方でディープコピーですが、以下のように書けます。

```swift:ディープコピー
import Foundation

// ディープコピーの例
class DeepCopyObject: NSCopying {
    var value: Int

    init(value: Int) {
        self.value = value
    }

    func copy(with zone: NSZone? = nil) -> Any {
        // ディープコピーを手動で実装
        let copy = DeepCopyObject(value: self.value)
        return copy
    }
}

let originalDeepCopy = DeepCopyObject(value: 42)
let copiedDeepCopy = originalDeepCopy.copy() as! DeepCopyObject

// originalDeepCopyとcopiedDeepCopyは別々のオブジェクト
print(originalDeepCopy.value)  // 42
print(copiedDeepCopy.value)    // 42

// originalDeepCopyの変更はcopiedDeepCopyには影響しない
originalDeepCopy.value = 99
print(copiedDeepCopy.value)    // 42
```


以下のようなcopy()関数を定義し、コピーするときに使用することで、ディープコピーを行っている。
この関数を使用したオブジェクトは異なるオブジェクトとして存在するため、コピー元のオブジェクトに対して行った変更に影響受けないということが分かる。
```swift
func copy(with zone: NSZone? = nil) -> Any {
        // ディープコピーを手動で実装
        let copy = DeepCopyObject(value: self.value)
        return copy
    }
```

## 使われる場面

ここは個人的な意見になるが、じゃあそれぞれのコピーはどういう場面で使えば良いのか？と考えてみると、以下のように考察できるのではないか。

シャローコピー:
- メモリ効率を重視しない場合
- 内部のオブジェクトを共有していることが許容される場合
- 内部のオブジェクトが変更されても問題ない場合

ディープコピー:
- 内部のオブジェクトへの変更が元のオブジェクトに影響しないようにする場合(オブジェクトの完全なコピーが必要な場合)
- オブジェクトの構造が複雑であり、深い階層のコピーが必要な場合


## コピー時の注意点
また、調べているうちに以下のような注意点も分かった。
- ディープコピーは性能上のコストが高いことがあるため、十分な注意が必要なこと
- 内部に循環参照がある場合、ディープコピーは無限ループに陥る可能性があること
- ディープコピーは深い階層まで再帰的に行われるため、大きなデータ構造ではコストが高いこと
- Swiftにおいて、`Array`や`Dictionary`の`copy()`メソッドはシャローコピーを行うこと



## 備考
Apple公式の[Swiftのはじめ方](https://swift.codelly.dev/guide/%E6%A7%8B%E9%80%A0%E4%BD%93%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%B9/%E5%80%A4%E5%9E%8B%E3%81%A8%E5%8F%82%E7%85%A7%E5%9E%8B.html#%E5%80%A4%E5%9E%8B)というドキュメントが丁寧に解説されていて分かりやすかった。
WebSocketを使ったアプリはRenderにデプロイすると簡単だよという話

# はじめに
この記事は「[RUNTEQ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/runteq)」の19日目を担当しています。テーマは『初めて学んだ技術』 ということで、私が最近作ったアプリでWebSocketを用いた際に苦労した点について書こうと思います。

# 背景
この記事は、WebSocket通信を使ったアプリをVercelにデプロイしたところ上手く機能せず、代わりにRenderにデプロイしたところ機能したことから、各PaaSごとの事情を調べたものです。作成したアプリは以下のものになります。フロントエンドをNext.jsで作成しVercelにデプロイ、バックエンドをFastAPIで作成しRenderにデプロイしました。RUNTEQというプログラミングスクールで、有志とともにチーム開発を行いました。

▼チーム開発　2人協力型のホラー×謎解きゲーム「[MISERY](https://misery-seven.vercel.app/)」

https://misery-seven.vercel.app/

# VercelとWebSocket
VercelでWebSocket通信をする方法はあるようですが、一手間を加える必要がありそうです。VercelはWebSocket通信について以下のように示しています。（英語の原文をDeepLにて翻訳）
> ###### Vercel Serverless FunctionsはWebSocket接続をサポートしていますか？
> VercelのServerless Functionsはステートレスで、最大実行時間があります。そのため、 Serverless FunctionへのWebSocket接続を維持することはできません。この記事では、アプリでリアルタイム通信を使用するための情報と、それを有効にする方法について詳しく学べる場所を提供します。
> ###### リアルタイム通信の有効化
> Serverless Functionへの永続的な接続を維持することはできませんが、Pusher Channelsのようなサードパーティのサービスを利用することで、アプリのリアルタイム通信を可能にすることができます。サードパーティのサービスを利用する場合、クライアントはイベントのサブスクライブに使用し、すべてのパブリッシュはServerless Functionで処理することに留意することが重要です。

https://vercel.com/guides/do-vercel-serverless-functions-support-websocket-connections

# Fly.ioとWebSocket
Fly.ioではWebSocket通信ができることをブログの中で明示しています。
> Flyによく寄せられる質問のひとつに「WebSocket接続に対応していますか」というものがあります。答えは「はい」ですが、その前にもう少し詳しく説明し、例をお見せしましょう。

この引用元は、簡単なチャットアプリを用意してくれています。試したい方は、以下のリポジトリをクローンして試してみると良いでしょう。
[flychat-ws in fly-examples](https://github.com/fly-apps/flychat-ws)

https://fly.io/blog/websockets-and-fly/

# RenderとWebSocket
RenderのコミュニティでWebSocketに関する質問が行われていることから、WebSocket通信を使うことが可能であることが伺えます。

https://community.render.com/t/websocket-server/8765

# HerokuとWebSocket
無料プランが終了してしまったためコストがかかってしまいますが、HerokuでもWebSocketは使えそうです。

https://devcenter.heroku.com/ja/articles/websockets

# まとめ
今回挙げた4つの、どのPaaSでもWebSocket通信を用いたアプリをデプロイすることは可能のようですが、コストをかけずに簡単に実装するのであればFly.ioやRenderでデプロイするのが良さそうです。とりわけRenderでは私がアプリが動くのを確認しているのでオススメします。現在簡単なチャットアプリをFly.ioで動かそうと検証中ですが、初めて触るので上手くいっていません（汗）。検証が完了し次第、追記させていただきます。
さて、ご存知の方も多いと思いますが、Renderでは15分アプリを動かしていないとスリープしてしまいます。私は[MISERY](https://misery-seven.vercel.app/)というアプリでバックエンドを常に動かし続ける必要がありましたので、[UptimeRobot](https://uptimerobot.com/)という監視ツールでレスポンスを送り続けることでスリープしないようにしています。

https://qiita.com/ppputtyo/items/2ab44303dcfabeb7b23e
【UiPath】リトライスコープの罠

## はじめに

所定の回数を繰り返し作業したいから、リトライスコープアクテビティにしよ～:grinning:
と思って、作った際に陥った出来事を共有します。

## 結論
リトライスコープは**条件を指定しないと、リトライの回数を入れてても、1回で終わり**ます。
よく考えればそりゃそうだよね。条件がないことが条件！みたいなもんだしなー:innocent:

なので、みんなも、条件ないけど、とにかく決まった回数を必ず繰り返したいなら「繰り返し(指定回数)」アクテビティを使いましょう。
もしくはリトライスコープの**条件は、必ずなにかをいれましょう**。お兄さんとの約束だよ:construction_worker:

## 実践
特に条件は指定せず、何回繰り返したかインクリメントできるようにしておいて・・・
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/e1dde605-1cca-b470-b6d3-387a2a91490d.png)

「リトライの回数」プロパティも10回に設定！
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/cf67fbe3-42be-b505-1a2c-252d465f1a4c.png)

さて結果は！
![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/dd57b94f-13fa-b16e-ea5e-c324c30d5158.png)

こんな感じで一回で終わります～:sob:

みんなも気を付けてくださいねー。
ではまたー。
自動翻訳のにっくきアイツを消し去りたかった

# はじめに
個人開発やプロジェクト立ち上げ時の最初の最初にブラウザからの初期チェックで毎回自動翻訳の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519878/bbb719a6-79a8-5b4c-7552-92bd1f404efc.png)
これが出てきてイラってなってました

# 課題
ブラウザ確認時の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519878/9a28bcb7-821f-8c59-07b3-18b42b6d655f.png)

これを消し去りたい

# 解決方法
```shell:app/public/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
...
```

html langが自国語と違うときに勝手に翻訳しようとしてしまう（っぽい？）ので、**ja**に変更してあげると消えてくれる。

# 終わりに
ここデフォルトで自国のやつで作られてくれないかなぁ
Adobe AfterEffects ロトブラシ機能  (Adobe MAX 2023 )

Globee Advent Calendar 21日目の記事です。

こんにちは。またの登場失礼します、Globee２人目のデザイナー苗村です。([前回記事](https://qiita.com/snaemura/items/a9fe6f81c380e1e45013)はこちら、[前々回記事](https://qiita.com/snaemura/items/dea89ef3b612da552a92)はこちらです)

Adobe MAX 2023でアップデートのあった、AfterEffectsの「ロトブラシ」機能をサクッと試してみた！のでお伝えします。

## AfterEffect「ロトブラシ機能_3.0」
ロトブラシ機能では「切り抜きたい被写体」を動画から分離させてくれる機能です。動くマスクを簡単に作成出来ます。

12,3年前、1フレーズおきに手作業で行っていた作業を、おおよそのベースをAIが自動でやってくれます。

## 試したかった背景
abceedのコンテンツの中に、コーチ陣による「解説講義動画」があります。2023年の10月までに[116本の解説講義動画](https://prtimes.jp/main/html/rd/p/000000066.000038232.html)を公開しています。
今後、解説講義動画やコンテンツ制作において、ロトブラシは一役買えるのではないか?と考えました。

## ロトブラシ機能を試してみる
### ❶動画を用意
夏に娘が撮影したクラゲの動画があったので、今回はこちらで試してみます。
細い触手まで切り抜けるでしょうか..

![IMG_1910_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620698/87ffc57b-46e9-150d-cd19-b546cc5347de.gif)

### ❷AfterEffectsへ読み込み、ロトブラシでなぞる
読み込み→コンポジット→動画をダブルクリック
→ロトブラシツールを選択、ラフに被写体をなぞる

![lb_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620698/5433ed70-84ca-c548-79dd-45870204f53d.png)


### ❸調整ツールでエッジを微調整
感覚的、数値的に境界線のぼかしや滑らかさを調整。

![lb_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620698/8e110c91-3935-dba1-9b6f-281730917ded.png)

## 結果
サクッとのレベルではマスクの精度は悪くなさそうです。触手(細部)のクオリティはまだまだかと感じました。

![IMG_1910_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620698/e0e2ead6-7e76-1a61-4c0d-6f76287e4152.gif)


## 課題・まとめ
切り抜き後、より自然に馴染ませるためには、撮影時の背景が大きく左右しそうです。今回は半透明のモチーフであるため、顕著に分かりました。
サクッと試したため、細い触手部分のマスクの精度を上げられませんでした。細部のクオリティを上げるには、いくつかのモチーフ、様々な背景で試し、数値等をじっくり検証する必要がありそうです。

今回、2秒半程度の尺で、作業時1/2の解像度でも時間はかかったので、高解像度、長尺の動画での編集はタフな部分もありそうだと予測しています。
今後、動画コンテンツで一役買える日が来ることを願い、結びとさせていただきます。


## 採用情報
株式会社Globeeでは、現在エンジニア採用を積極的に行っています。まずはカジュアル面談にて弊社の「教育」にかける思いや「ものづくり」の考え方についてお話できればと思います。お気軽にご応募ください。
[株式会社Globee 採用ページ](https://globee.notion.site/Globee-d184eefc3561480292481299c64b04bc)
GitLabCIからSSH経由でコマンドを実行する

GitLabCIでデプロイ先サーバーのコマンドをSSH経由で実行する方法です。

前回記事を書いたftpアップロードの後にコマンドを実行する必要があったので作りました。

https://qiita.com/bellx2/items/dabde1d92e932c76624a

## .gitalb-ci.yml

いきなりですが、ファイルから。

```yaml:.gitlab-ci.yml
stages:
  - exec

deploy-exec:
  stage: exec
  image: alpine:latest
  variables:
    SSH_SERVER: ''
    SSH_PORT: '22'
    SSH_USER: ''
    SSH_PRIVATE_KEY: ''
    SSH_CMD: ''
  before_script:
    - 'command -v ssh-agent >/dev/null || ( apk add --update openssh )' 
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan -p $SSH_PORT -H $SSH_SERVER >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
  script:
    - ssh $SSH_USER@$SSH_SERVER -p $SSH_PORT "$SSH_CMD"
  only:
    - main
```

## 変数

見ればわかりますね（省略
GitLab CI設定のvariablesに設定してください。

## 解説

- 小さいのでイメージはalpineを使います
- ssh-agentをインストールします
- $SSH_PRIVATE_KEYをセットします
- SSH先サーバーを`.ssh/known_hosts`にセットします

## むにゃむにゃ

必要になったので作りました。これで、GitLab上でファイル更新をすると、アップロード、デプロイ先でのスクリプト実行が一気に走るようになりました。めでたしめでたし:grinning:
figmaのコンポーネントを理解しよう

# 時代は…どうなるんだ？
Figmaの記事を書いていたらAdobeがFigmaを買収する話が流れたらしいですね。
https://www.itmedia.co.jp/news/articles/2312/18/news189.html

これからの時代はFigmaだぜ！！！と前回の記事で書いてしまいましたが、どうなるかわからなくなってきました。
とはいえ、Adobeが改めてXDを開発するとも考えづらいような気もします。

これからもFigmaが主流になることを祈りつつこの記事ではFigmaの機能を紹介していこうと思います。

# コンポーネント
## コンポーネントってなに？
コンポーネントは簡単に言えば流用できるパーツです。
UIデザインなどにおいてはボタン要素などのページ中に何度も出てくる要素に対し使うことができます。

これの利点は親のデザインを変更することにより、子のデザインを一括変換できること。
子はそれぞれ違う要素をもたせられることです。

実際に見てみましょう。

## メインコンポーネントを作成する
以下のような親要素を作成します。
これを **メインコンポーネント** と言います。
![スクリーンショット 2023-12-19 16.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/cd987a4d-8ac1-4a35-22cc-1f8635e4e3dc.png)

このメインコンポーネントはデザインの中に組み込まずに外側に配置する場合が多いです。（後にデザインを調整したり、コーディングの際に参照しやすくする為）
figmaでは別ファイルのコンポーネントを参照することも可能です。

次にパーツ化したい要素をまとめて選択肢し、右クリックから**コンポーネント　の作成**をクリック。

![スクリーンショット 2023-12-19 16.46.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/652a5829-a786-0f14-0187-a544f45828f4.png)

すると、選択した部分のグループがレイヤー上で紫色の表記に変わります。
これでメインコンポーネントが作成できました。
![スクリーンショット 2023-12-19 16.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/8a135fbc-4401-57a0-f2b5-45b874e5fbd1.png)

## インスタンスを作成する
次に、デザイン上に配置する子要素を作成していきます。
これを **インスタンス** と言います。

先程作ったメインコンポーネントを右クリックしてコピー・ペーストします。
すると、以下のようにアイコンが微妙に違うコンポーネントが出てきます。

![スクリーンショット 2023-12-19 16.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/cec40137-6f48-92bf-4675-4db6e632196d.png)

◇のほうがインスタンスです。
見た目上では同じですが、違いがあります。

以下ではわかりやすくする為、メインコンポーネントを親要素、インスタンスを子要素と呼びます。

### 子要素を変更しても親要素は変わらない
上が親要素で下が子要素です。
子要素の横幅を変更しても、親要素の方に影響はありません。
![スクリーンショット 2023-12-19 16.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/a9e8dfe8-b860-82b4-50e2-276196833be5.png)

### 親要素を変更すると子要素にも変更が適用される
ですが、逆に親要素に変更を加えると、子要素にも同様の変更が加わります。
下図は親要素の背景色を変更しました。子要素の方も同時に切り替わっています。
![スクリーンショット 2023-12-19 17.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/1bbcee0f-27ba-8e95-4c39-9d4443ba8a85.png)

### 子要素の一部を変更すると、そこは維持される
例えば
①子要素のテキストを変更する
②親要素の背景色を変更する
とすると、以下のようになります。

![スクリーンショット 2023-12-19 17.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/95bafa48-462d-9506-8b13-cef713f32a66.png)

この状態から親要素のテキストを変更しても子要素のテキスト部分は独立した要素という扱いになっている為、親要素の変更の影響を受けません。

![スクリーンショット 2023-12-19 17.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/1c2ef422-98a4-1a28-ae41-d18ce43701e0.png)

## アセットパネル
毎回ボタンをコピーせずとも、レイヤーと同じタブにある「アセット」を使えばコンポーネント化してある要素を呼び出すことができます。

![スクリーンショット 2023-12-19 17.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/75b7fea8-e25d-1685-87dd-6bc9a9352eca.png)

#　おわりに
Figma、とても便利です。
個人的にはXDより好きかもしれません。
adobeが買収できなかったのはおのれEU感ありますが（adobeはadobeで色々やってるので仕方ない感じありますが）、今後単体でも活躍して発展していくことを祈りましょう。
2023年最も使ったFigmaプラグイン

株式会社GlobeeでUIデザイナーをしている西田です。

今回は、2023年もっともつかったFigmaプラグインを紹介します。

# Filter

https://www.figma.com/community/plugin/1034178978552865811/filter

選択した領域にふくまれるテキストやグループ、ベクターなど、種類別に選択可能にしてくれるプラグインです。

たとえばframeに含まれるテキストだけを選択して一気にフォントファミリーを変更したい、特定のフォントサイズのテキストだけ選択したいときによく使います。

これがないと一つ一つクリックして選択しないと行けないので非常に便利です。

# Contrast

https://www.figma.com/community/plugin/1034178978552865811/filter

テキストと背景色のコントラスト比をサクッと確認できるプラグイン。
アプリやWebに限らず、一定のコントラスト比を保たないと、非常に読みづらい状況が発生しますが、このツールを使うことで最適なコントラスト比を設定するのに役立ちます。

アイコンやシェイプに使うには問題なくても、テキストに使うと見づらいとか、大きめのフォントサイズならOKだけど12px程度のサイズだと適さない、などが簡単にわかるのもいいですね。

また、WCAG 3.0にて検討が進められているテキストの視覚的コントラスト基準である「APCA」にもbetaながら対応しています。

# DownSize

https://www.figma.com/community/plugin/869495400795251845/downsize

Figmaを長期間使っていると、いろんな画像をダミーとしてつかったりします。
それの積み重ねでメモリ使用量が大きくなり、Figmaが重くなって使用しづらい状況になります。

そんなとき、このプラグインを使うと表示しているページに含まれる画像を一気に軽量化してメモリ使用量を削減することができます。

毎日使うようなものではありませんが、存在を知っていると困ったときに非常に便利です。

# Color Name

https://www.figma.com/community/plugin/880101729425135325/color-name

Figmaでカラースタイルを作成するとき、困るのがそのカラースタイルの名前です。
たとえば、UI的な役割を名称にいれて、例えばPrimary、Secondaryとかやってるとかなり管理がしづらくなります。

そこで、abceedの場合は色にUI的な意味合いは加えず、色の見た目を名称にセットしているのですが、それで困るのが名前の付け方です。名前を考えるのに時間をかけることはしたくないなあ、、、と思っていたら見つけたのがこのプラグイン。

色設定したシェイプをを選択したあとこのプラグインを実行すると、その色に近い名称を提案してくれます。

![スクリーンショット 2023-12-19 17.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620678/327c3982-ef76-8643-d5c6-0f05ad35adbb.png)

# Figma to STUDIO

https://www.figma.com/community/plugin/1274345780965443906/figma-to-studio

先日、弊社でもSTUDIOを導入し、各種LPをSTUDIOに移行することにしました。そうすることで、デザイナーとマーケ担当者などの間でデザイン/実装/リリースが完結するのでエンジニアのリソース逼迫を避けることができます。

通常、Figmaでデザインを作ったら、そこから必要な素材を書き出して、STUDIOにアップして、デザインをみながらSTUDIOでデザインを地道に反映していきますが、このプラグインにより、「Figmaでデザインをコピーして、STUDIOでペーストするだけ」という夢のようなフローが実現します。

もちろん、Figma側のデザインが複雑だとそもそもコピーに時間がかかるとか、STUDIO側でペーストしたときにデザインが崩れることがありますが、そこはデザインの作り方をできる限りシンプルにすることで対応できます。また、STUDIO側で調整がもちろん可能なので特に問題はありませんでした。

通常なら2〜3日かかっていた作業が、数十分から数時間で完了する素晴らしいプラグインです。

# 2024年もFigmaプラグインで生産性アップ！

先日Adobeが買収を諦めたFigmaですが、今なおたくさんのプラグインが開発されています。
2024年もプラグインを使いまくってよりよいデザインをつくっていきましょー
"numpy.core.multiarray failed to import cv2"はnumpyが古いだけじゃなかった

OpenCVを使おうとしたらタイトルのエラーが出ました。
とりあえずググってみると「Numpyが古い」、「Numpyをアップデートしよう」と出てきます。
~~~ bash
pip install -U numpy
~~~

ただし自分の場合はアップデートしても変わりませんでした。

## 解決策
OpenCVのバージョンを上げたらエラーが出なくなりました。

変更前
~~~
numpy==1.24.4
OpenCV==4.1.1
~~~
変更後
~~~
numpy==1.24.4
OpenCV==4.6.0
~~~

## まとめ
経緯は省きますが、「Numpyに対してOpenCVが古すぎないか？」と思い試してみました。
とりあえずエラーが出なくなってよかったです。