OmniAICreator/Qiita-1.07M huggingface dataset:
Recommended Methods and Practices for Timing Analysis and Design within the AUTOSAR Development Process, No.645, AUTOSAR 21-11 (326) FO

Recommended Methods and Practices for Timing Analysis and Design within the AUTOSAR Development Process, No.645, 2021-11

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_TimingAnalysis.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

Glossary も　参考に入れましょう。

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf


[1] Methodology for Classic Platform
AUTOSAR_TR_Methodology
[2] Specification of Timing Extensions
AUTOSAR_TPS_TimingExtensions
[3] Explanation of Adaptive Platform Design
AUTOSAR_EXP_PlatformDesign
[4] Software Process Engineering Meta-Model Specification
http://www.omg.org/spec/SPEM/2.0/
[5] Embedded Systems Development, from Functional Models to Implementations
[6] EAST-ADL - Model Domain Specification
http://www.east-adl.info/Specification.html
[7] Tool Support for the Analysis of TADL2 Timing Constraints using TimeSquare
http://hal.inria.fr/docs/00/85/06/73/PDF/paper.pdf
[8] Unified Modeling Language: Superstructure, Version 2.0, OMG Available Specification, ptc/05-07-04
http://www.omg.org/cgi-bin/apps/doc?formal/05-07-04
[9] System Modeling Language (SysML)
http://www.omg.org/spec/SysML/1.3/
[10] UML Profile for Modelling and Analysis of Real-Time and Embedded systems
(MARTE)
http://www.omg.org/spec/MARTE/1.1/
[11] Architecture Analysis and Design Language (AADL) AS-5506A
http://standards.sae.org/as5506a/
[12] TIMMO-2-USE
[13] Specification of Operating System
AUTOSAR_SWS_OS
[14] Scheduling algorithms for multiprogramming in a hard real-time environment
http://cn.el.yuntech.edu.tw/course/95/real_time_os/present paper/Scheduling Algorithms for Multiprogramming in a Hard-.pdf
[15] Controller Area Network (CAN) Schedulability Analysis: Refuted, Revisited and
Revised
http://dl.acm.org/citation.cfm?id=1227696
[16] Pushing the limits of CAN-Scheduling frames with offsets provides a major performance
http://www.loria.fr/ nnavet/publi/erts2008_offsets.pdf
9 of 162 Document ID 645: AUTOSAR_TR_TimingAnalysis
Recommended Methods and Practices for Timing
Analysis and Design within the AUTOSAR
Development Process
AUTOSAR FO R21-11
[17] Probabilistic response time bound for CAN messages with arbitrary deadlines
http://ieeexplore.ieee.org/xpl/abstractAuthors.jsp?arnumber=6176662


# 文書履歴(document history)
ver. 0.01 初稿 20220607
React Chakra-uiでRadioのラベルフォントサイズを自由に変えるには？

Chakra uiの提供する`<Radio>`にはラジオボタンの選択肢のフォントサイズを変えるプロパティ: `size`があります。
しかし、これには`sm, md, lg`の３つの選択肢しかありません。

https://chakra-ui.com/docs/components/form/radio#radio-sizes

つまり、ラジオボタンの選択肢のサイズをこれ以上大きくしたいときに、これらは選択肢として不十分となります。


### sizeでサイズ調節する例

sizeでサイズ調節する例として、一部分を切り出してみました。

```:sizeでラジオボタンのフォントサイズを指定する例
  const Radios = formChoices.map((choice, index) => (
    <Radio
      size='lg'
      value={(index + 1).toString()}
      key={choice}
    >
      {choice}
    </Radio>
  ))
```

これに対して、さまざまな方法でstyleを上書きしてフォントサイズを変える試みをしてみた次第であります。
しかし、変わらなかったり、変わっちゃいけない部分のサイズが変わったり、苦戦しました。

`<Radio>`の`fontSize`を指定しても、思うように変えることはできませんでした。

1時間ほど格闘した後、最終的に原始的な方法で解決できました。

# 解決策


**`<Radio>`タグで囲むテキストを、なんらかの要素でラップして、その要素にスタイルを適用する。**

具体的には、以下のように`<Text>`で囲ってみて、そのプロパティでフォントサイズを指定することにしました。

```:Radioの子要素をラップして、そこでフォントサイズを指定
  const Radios = formChoices.map((choice, index) => (
    <Radio
      size='lg'
      value={(index + 1).toString()}
      key={choice}
    >
      <Text fontSize='2xl'>{choice}</Text>
    </Radio>
  ))
```

https://chakra-ui.com/docs/components/typography/text

### 今回の事例からの学び

`<Radio>`などのフォームコンポーネントの役割は、あくまでラジオボタンのデザインや機能としてのものであるということです。言い換えれば、ラベルなどの、ラジオボタン自体とは違うレイヤーを指定するには、ラベルテキストの部分を`<Text>`などの部品にラップして、そこでスタイルの調節を試みるべきである、ということです。

ここを`<div>`や`<p>`タグなどとして、生のHTMLと混ぜて、それらで個別にスタイルを指定しても理論上動くはずですが、レスポンシブデザインなどを考えると、Chakra-uiのビルトインの`<Text>`を使う方がいいかもしれません。---ここについてはどうなんでしょう。コメントで教えていただけると今後の参考になります。


お読みいただきありがとうございました。それでは、良い１日を！
構成を理解してURLが読めるようになる！

# なにこれ？
URLは**解読不可能な呪文ではありません**。

URLはすべて、決まった構成で書かれているのです。

URLの構成を理解して、**URLとはいったいどのようなものなのか**を理解できるようにしましょう！



# この記事のゴール
以下の内容が理解できることを目的としています。
* URLとはどのようなものなのか
* URLの構成
* 各構成の意味



# URLとは？
URLとは、Uniform Resource Locatorの略で、**どのような手順（プロトコル）**　で、**どこのWebサーバーにある**、**どのようなコンテンツ**にアクセスするかを示します。



# URLの構成
今回は、次のURLを例に構成を見ていきます。
`https://www.example.jp:80/path/index.php?page=1&count=2#sec1`

このURLは次のように切り分けることができます。

| URLのセクション | 名前| 意味 |
|:-----------|:------------|:------------|
|   https:                | スキーム(Scheme)     | 通信方式を指定する。        |
|   //www.example.jp:80   | オーソリティ(Authority)| ホスト名（またはIPアドレス）とサービスポート番号を指定する。ポート番号を省略するとデフォルト番号を使用する。       |
| /path/index.php         | パス(Path)          | ディレクトリ名やファイル名といったリソースのパスを指定する。 |
| ?page=1&count=2         | クエリ(Query)        | リソースのアクセス方法をさらに細かく指定する。Webアプリのパラメータやコマンドに使用する（省略可）。   |
| #sec1                   | フラグメント(Fragment) | ページの特定の場所を示すアンカーを指定する（省略可）。      |

それでは、一つ一つ見ていきましょう。



# スキーム
`https:`のように一番左に位置するものを**スキーム**と呼び、通信方式であるプロトコルを表します。
Webシステムではスキームに`http:`や`https:`を使用しますが、他にもファイル転送サービスの`ftp:`や、電話サービスの`tel:`などのスキームが存在します。

`https:`の部分は、「**通信方式を表すんだな〜**」と考えましょう！



# オーソリティ
`//www.example.jp:80`のように一般的に「ホームページのアドレス」と考えられる部分を**オーソリティ**と呼びます。

オーソリティは`//`から`/`の部分を指し、**ホスト名**、**サービスポート番号**などを含みます。

`//www.example.jp:80`の部分は、「**アドレスを表すんだな〜**」と考えましょう！


# パス
`/path/index.php`の部分は**パス**を示し、/から?までの前、または末尾までを表します。

パスは、サーバー内のファイルの格納場所など、特定のリソースを識別するために使用します。
例えば、`www.example.jp:80/path/index.html`の場合、サーバー内のpathディレクトリの中にある`index.html`ファイルを指定しています。

`/path/index.php`の部分は、「**ホームからのパスを表すんだな〜**」と考えましょう！


# クエリ・フラグメント
`?page=1&count=2`は**クエリ**、`#sec1`は**フラグメント**を表します。
クエリは?から＃の前、または末尾までを表し、フラグメントは#から末尾までのことを指します。

クエリではアプリケーションのパラメータやコマンドを指定します。
フラグメントでは同じページ内の特定の場所を指定する**アンカー**に使用します。

`?page=1&count=2`や`#sec1`の部分は、「**何かの値をセットしてて、あってもなくても良いん部分なんだな〜**」と考えましょう！



# URLは解読不可能な呪文じゃない
プログラムを書いたりするような方でなければ、普段からURLの構成を気にする方は少ないと思います。
一方で、URLのように一見意味のわからない文字の羅列を見て「**Webのことを理解するのは難しい**」と思う方は多いのではないでしょうか。
そんな苦手意識を持っている方にも、この記事を読んで「**URLってこんな意味があるんだ**」とか「**Webにある数字の羅列には何か意味があるんだ**」と思ってもらえたら嬉しいです。


# 参考文献
こちらの本を参考にしました。
`Web技術がこれ1冊でしっかりわかる教科書`
TECH CAMP 3日目　~Ruby~

# 学習内容
- HTML
　- `object-fit:cover;`,`object-fit:contain;`
　- `opacity`
- Ruby
　- getsメソッド、chompメソッド
　- バックスラッシュ`\`
　- .timesメソッド、.eachメソッド
　- スコープ
　- 引数、仮引数、実引数
　- 戻り値
　- メソッド
　
# 苦労したこと、改善
- 指定された文字色が#A0A0A0だったが数字の0を英語のOと入力したため、文字色が変わらなかった。
　改善：数字の0やカンマピリオドなど似ている数字や文字に気をつけて入力する。できればコピペする。

### メモ
本日初めてチーム内でもくもく会を開催しました。一人で作業しているよりも作業が捗りました。
少ないチームの中で開催すると、参加するのに勇気がいると思うので、同じ１２７期のメンバーにも声をかけて大人数で実施したいと思います。
基本情報（文字の表現方法）

コンピュータは文字に数値を割り当てることで、文字データを表現します。
文字コードはたくさんあるみたいです。とりあえず文字コード表を見てみます。
文字があああああああああああ

## 文字コード表（ASCII）
|2進|8進|10進|16進|略語|図形表現|CS|エスケープシーケンス|名前/意味|
| :---: | :---:| :---: | :---: | :---:| :---: | :---: | :---:| :---: |
|0000000|	000|	0	|  00|	NUL	|␀	|^@	|\0	|  ヌル文字
|0000001|	001|	1	|  01|	SOH	|␁	|^A	|	  |  ヘッディング開始
|0000010|	002|	2	|  02|	STX	|␂	|^B	|	  |  テキスト開始
|0000011|	003|	3	|  03|	ETX	|␃	|^C	|	  |  テキスト終了
|0000100|	004|	4	|  04|	EOT	|␄	|^D	|	  |  伝送終了
|0000101|	005|	5	|  05|	ENQ	|␅	|^E	|	  |  問い合わせ
|0000110|	006|	6	|  06|	ACK	|␆	|^F	|	  |  肯定応答
|0000111|	007|	7	|  07|	BEL	|␇	|^G	| \a|	ベル
|0001000|	010|	8	|  08|	BS	|␈	|^H	| \b|	後退
|0001001|	011|	9	|  09|	HT	|␉	 |^I | \t|	 水平タブ
|0001010|	012|	10|	0A	|LF	  |␊	| ^J |\n |     改行
|0001011|	013|	11|	0B	|VT	  |␋	| ^K |\v |	    垂直タブ
|0001100|	014|	12|	0C	|FF	  |␌	| ^L |\f | 書式送り
|0001101|	015|	13|	0D	|CR	  |␍	| ^M |\r | 	復帰
|0001110|	016|	14|	0E	|SO	  |␎	|^N	|   | シフトアウト
|0001111|	017|	15|	0F	|SI	  |␏	|^O	|   | シフトイン
|0010000|	020|	16|	10	|DLE	|␐  |	^P|		|  伝送制御拡張
|0010001|	021|	17|	11	|DC1	|␑  |	^Q|		|  装置制御1、XON
|0010010|	022|	18|	12	|DC2	|␒  |	^R|		|  装置制御2
|0010011|	023|	19|	13	|DC3	|␓  |	^S|		|  装置制御3、XOFF
|0010100|	024|	20|	14	|DC4	|␔  |	^T|		|  装置制御4
|0010101|	025|	21|	15	|NAK	|␕  |	^U|		|  否定応答
|0010110|	026|	22|	16	|SYN	|␖  |	^V|		|  同期信号
|0010111|	027|	23|	17	|ETB	|␗  |	^W|		|  伝送ブロック終結
|0011000|	030|	24|	18	|CAN	|␘  |	^X|		|  取消
|0011001|	031|	25|	19	|EM	  |␙  | ^Y|		| 媒体終端
|0011010|	032|	26|	1A	|SUB	|␚  |	^Z|		|  置換
|0011011|	033|	27|	1B	|ESC	|␛  |	^[|	\e|	エスケープ
|0011100|	034|	28|	1C	|FS	|␜	|^\	|	 | ファイル分離標識
|0011101|	035|	29|	1D	|GS	|␝	|^]	|	 | グループ分離標識
|0011110|	036|	30|	1E	|RS	|␞	|^^	|	 | レコード分離標識
|0011111|	037|	31|	1F	|US	|␟	|^_	|	 | ユニット分離標識
|1111111|	177|	127|7F  |DEL|␡	|^?	|	 | 抹消
## 文字コードの種類と特徴
文字コードの代表的な種類としては、次のようなものがあります。
## ASCII(アスキー)
米国規格協会（ANSI)によって定められた、かなり基本的な文字コード。
含まれる文字はアルファベットと数字、あといくつかの記号のみで、１文字を7ビットで表します。
アスキーアートが有名ですね
　　 ∩＿＿＿∩
　　 | ノ　　　　　 ヽ
　　/　　●　　　● |　クマ──！！
　 |　　　　( _●_)　 ミ
　彡､　　　|∪|　　､｀＼
/　＿＿　 ヽノ　/´>　 )
(＿＿＿）　　　/　(_／
　|　　　　　　 /
　|　　／＼　＼
　|　/　　　 )　 )
　∪　　　 （　 ＼
　　　　　　 ＼＿) 
## EBCDIC(エビシディック)
IBM社が定めた文字コードで、8ビットを使って１文字を表します。大型の汎用コンピュータなどで使われています。
## シフトJISコード(S-JIS)
ASCIIのコード体系の文字と混在させて使えるようになっている日本語文字コードです。
ひらがなや漢字、カタカナなどが扱えます。
マイクロソフト社のOSであるwindowsでも使われており、１文字を２バイトで表すそうです。
## EUC(イーユーシー）
拡張UNIXコードとも呼ばれ、UNIXのOS上でよく使われる日本語文字コードです。
基本的には１文字を２バイトで表しますが、補助漢字などは３バイト使います。
## Unicode(ユニコード)
全世界の文字コードを一つに統一してしまえということで、各国のありとあらゆる文字を
1つのコード体系であらわそうとした文字コード。
当初は１文字を２バイトで表す予定だったらしいですが、３バイト、４バイトと拡張されているようです。
1993年にISOで標準化されています。
## まとめ
へぇって感じですね。
Windows に OpenSSL(3.0.3)をインストールする

# Windows に OpenSSL(3.0.3) をインストールする

以下のURLから Windows版のOpenSSLのインストーラをダウンロードし、インストールします。

https://slproweb.com/products/Win32OpenSSL.html

今回、私は　Win64 OpenSSL v3.0.3 を ダウントードし、インストールしています。

C:\Program Files\OpenSSL-Win64 フォルダの start.bat を起動すると openssl.exe が格納されているフォルダを環境変数 PATH に追加してくれます。

```
Win64 OpenSSL Command Prompt

OpenSSL 3.0.3 3 May 2022 (Library: OpenSSL 3.0.3 3 May 2022)
built on: Wed May  4 02:41:48 2022 UTC
platform: VC-WIN64A
options:  bn(64,64)
compiler: cl /Z7 /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 -DL_ENDIAN -DOPENSSL_PIC -D_USING_V110_SDK71_ -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_WIN32_WINNT=0x0502
OPENSSLDIR: "C:\Program Files\Common Files\SSL"
ENGINESDIR: "C:\Program Files\OpenSSL\lib\engines-3"
MODULESDIR: "C:\Program Files\OpenSSL\lib\ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0x7ed8320b078bffff:0x400004219c91a9

C:\Users\xxxxx>
```
Ubuntu 22.04 LTS で困ったからDebian 11に移行したけど困ったからDockerでkernelをビルドした。

# 概略
結構新しいラックサーバーをubuntu22.04にアップグレードしたらモニターが映らなくなった。
GPUは Matrox G200xxx なんだけど、枯れすぎたらしい。
ssh経由でkernelのフレーバーを変更したら写ったけど、新規にインストールできない（何かあっても再現できない）環境になってしまった。インストールUSBで立ち上げてもログインする前にモニターに映らなくなる。幸い立ち上げたばかりなので色々かえてもいい。

## 仕様
ベンダーはubuntuをサポートしているらしいが、canonicalのカーネル開発チームがベンダーを裏切ったので意味がない。

いつの時代もサポートなんて最小限にされてしまうよなと感慨深げに。

## 処置 & 新たな問題
debianに変更した。ubuntuよりもシンプルでsidからパッケージを持ってくることもできるしやった〜！！
あ、コンフリクトするやん。。。

家ではarchを使っていて、職場では長らくubuntuだったのでパッケージを管理してコンフリクトがものすごいエモかったです。

サーバーは主にdockerでデプロイされる環境なのでカーネルを比較的新しく保っておけばいい。だが、debianだと、sidからカーネルをインストールはできるが、他のツールのバージョンは古くなって他に入れたいソフトがビルドできない。。。

## Dockerでビルドしたろ！！！！！！
Dockerでsidのイメージを持ってきてビルドするとシステムがクリーンなまま保てて、カスタマイズできてとても良い。

kernelは`KCFLAGS=-march=native`でビルドすると品質があがるらしい。
```bash:Dockerfile
FROM debian:unstable-slim

RUN echo "deb-src http://deb.debian.org/debian unstable main" >> /etc/apt/sources.list
RUN sed -i 's@deb.debian.org@ftp.riken.jp/Linux/debian@g' /etc/apt/sources.list
RUN apt-get -y update && apt-get -y upgrade && apt-get -y install build-essential libncurses-dev fakeroot dpkg-dev && apt-get -y build-dep linux
RUN apt-get -y install linux-source
RUN ls -l /usr/src/linux-config-5.18
RUN tar xf /usr/src/linux-source* && cd linux-source* && mv /usr/src/linux-config-*/config.amd64_none_amd64.xz . && xz -d config.amd64_none_amd64.xz && mv config.amd64_none_amd64 .config && echo "CONFIG_PROCESSOR_SELECT=y" >> .config
RUN cd linux-source* && nice make -j 65 KCFLAGS=-march=native bindeb-pkg
RUN mkdir data

CMD mv linux-headers* ./data/ && mv linux-image* ./data/ && mv linux-libc-dev* ./data/
```
dataディレクトリをマウントしたら良い。

# 結論
えっ！５分でビルド終わった。。。。。
コンフリクトはDockerに丸投げする。本番ディストリはお固くまとめる。新旧一体でどや。
記事を書こう or いいね(LGTM)しよう。followはそれから。

今日の作業はここまでにさせてください。

https://qiita.com/kaizen_nagoya/items/5d01216353449d57d115

の続きです。Qiitaで、記事（コメント、編集リクエストを含む）を書かず、いいね（LGTM)またはストックを押さず、
followする方が大勢おみえになるのはなぜでしょう。

twitterで、無言followするのとは違う気がします。
twitterで、FF外で、いいねしたり、コメントするのとも違います。
FF内なのに、いいねがなく、コメントがないという状態かもしれません。

そうすると、合点が行く気もします。

読んでくださるfollower。　 Github, Qiita,Twitter, facebook, bookmeter.

https://qiita.com/kaizen_nagoya/items/6dd40ff9a72331182944

当方調べでは、twitter IDをお持ちのQiita ID所有者は多数派ではないようです。
ということは、twitterから流れて来た習慣かどうかは定かではありません。

githubはどうでしょう。

followだけして、プロジェクト等に星をくださっていない方は、それなりにおみえな気がします。

こんなにfollow順番が似てるのってどういう現象＝偽識別子

https://qiita.com/kaizen_nagoya/items/ea0de85a2e5fbcbdd06e

の行動を取られている方で、githubのIDをお持ちの方は皆無でした。
githubの習慣ではないような気がします。

ブロックさせていただきました。followを取り消させていただきました。

https://qiita.com/kaizen_nagoya/items/a1bfb426cfed1b534dfe

ブロックさせていただきました。followを取り消させていただきました(2)

https://qiita.com/kaizen_nagoya/items/51363c3e3e6d4396a067

偽識別子(fake ID)と呼んでもいいですか

https://qiita.com/kaizen_nagoya/items/ad466661c9985457cb70

いいね(lgtm)せずにfollowする人の行動を分類

https://qiita.com/kaizen_nagoya/items/1496dac5a85d10b461d9

20220607で2人、20220608で１人。
同じようなfollowerの数 31 で、同じようなfollow順番。

Qiita 表彰プログラム

https://qiita.com/kaizen_nagoya/items/cc82fefe1dda4b7250d8

を見て、followすればいいという記事を、誰かが、どこかに書いている可能性があります。
関連記事には見当たりませんでした。

そんな記事をおみかけでしたら、ぜひお知らせくださると幸いです。
日本語ではない可能性があります。

# 記事を書こう or いいね(LGTM)しよう。followはそれから。

まず記事を書くことを推奨しましょう。
コメント、編集リクエストでもいいかもしれません。

次に、いいね（LGTM)またはストックしよう。

followはそれから。

お願いします。

直近のfollowerの行動記録

https://qiita.com/kaizen_nagoya/items/124277ebfcd3712efa66

>２０２３年５月追記
その後の調べでは、同一行動をとっている人の何割かはスパムでないことが判明しました。
一部の人が怪しいIDだからといって、同じ行動をとっている人がすべて怪しいことはないことが判明しまいsた。
アプリ、サイトなどで、まず２１人フォローしようということをお勧めされている方がおみえのようです。
いくつかのSNSでは、主催者自体が推奨していたり、フォローしないと先に進めないサイトがあったりします。キータがどういうつもりかよくわかっていません。関係者とお話しした際も、フォローについての話題はでませんでした。キータも高校などの関係で、ISとかアクセス数とか、後悔できない事情がいろいろあり、経営判断がよくゆらいでいるのかもしれません。
Qiitaが調べて、それらのアプリ、サイトに助言してくださるのがいいかと考え、Qiitaにはお伝えしているつもりです。お返事を欲しいという文章は書いていません。お返事はいただいていません。


# 参考資料

Qiita: いいね, follow, follower, ストック, views。Qiita(35)

https://qiita.com/kaizen_nagoya/items/1f0c56ebd05c5495f72e

Qiitaでfollowさせていただいている方をTwitterでfollow。Qiita(31)

https://qiita.com/kaizen_nagoya/items/81f1f8346c62856e3700

Organization対抗戦　応援と事前準備のお勧め

https://qiita.com/kaizen_nagoya/items/a0f08c629912b0d85976
Mac で Command+Tab 中にだけ使えるショートカットキーまとめ

Mac では `Command+Tab` でアプリケーションを切り替えられますが、この最中にだけ有効なショートカットキーがあることに気づきました。

![command-tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2596/ef4f9a1b-858c-4e00-cf4d-a419c4a60b24.png)

ドキュメントを見つけられなかったので、まとめてみます。

## Command+Tab の間だけ有効なショートカットキー

ショートカットキー | 機能
-- | --
**`Command+1`** | アプリケーションウィンドウ選択
`Command+↑/↓` | アプリケーションウィンドウ選択
`Command+←/→` | 左右のアプリを選択
`Command+Tab` | 右のアプリを選択
`Command+Shift+Tab` | 左のアプリを選択
**<code>Command+`</code>** | 左のアプリを選択 (日本語キーボードだと無効)
`Command+Space` | 選択中のアプリを開く
`Command+Return` | 選択中のアプリを開く
**`Command+H`** | アプリを切り替えずに選択中のアプリを隠す
**`Command+Q`** | アプリを切り替えずに選択中のアプリを終了させる
`Command+ESC` | アプリの切り替えを終了
`Command+.` | アプリの切り替えを終了

英語キーボードだと、`Tab` の上のバッククォート (<code>`</code>) で左に戻れます。

`Command+1` でミッションコントロールの「アプリケーションウィンドウ」機能にはいります。ここで数字キーでウィンドウが選べると最高だと思うのですが、、矢印キーかマウスを使う必要があるようです。

ちなみに、アプリケーションウィンドウの選択中は、`Tab`、`Shift+Tab`、バッククォート (<code>`</code>) でアプリケーションを切り替えられます。

自分で一つずつキーを押して確認しているので、漏れがあるかもしれません。また、macOS のバージョン等で挙動が異なるかもしれません。ご了承ください。
JUnit で引数をチェックするテストを書くには

Mockito の ArgumentCaptor を利用する。

例えば、呼び出したメソッド内で与えた初期値が引数としてわたっているかをチェックするため。

```Java
import static org.mockito.Mockito.verify;
import org.mockito.ArgumentCaptor;

（省略）

    // キャプチャする引数を用意
    ArgumentCaptor<Long> idCaptor = ArgumentCaptor.forClass(Long.class);

    // テスト対象を呼び出し
    service.getReview(null);

    // キャプチャ
    verify(mapper).findById(idCaptor.capture());

    // 評価
    assertEquals(0L, idCaptor.getValue().longValue());
```

## 参考

https://www.javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentCaptor.html

https://www.baeldung.com/mockito-argumentcaptor
PythonによるRNA-Seq（バルク）データ解析 ~発現量の正規化~

本稿では、マッピング・カウント数の算出を終えたRNA-Seq (シングルセルではなくバルク) データから、Pythonを用いて発現量の正規化を行う方法を解説する。
# 発現量の正規化方法 FPKMとTPM
参考: https://bi.biopapyrus.jp/rnaseq/analysis/normalizaiton/tpm.html (2022年6月8日アクセス)
遺伝子発現量の正規化手法として、下記の代表的なふたつの手法が知られている。
- **FPKM/RPKM** (Fragments/Reads Per Kilobase of exon per Million mapped fragments/reads, 以降はFPKMと表記する)
- **TPM** (Transcripts Per Million)

最近の論文では TPMを用いた算出を目にすることが多い気がする。実際にFPKMでは転写産物の発現量を正確に表していないことが報告されている（Li et al. Bioinformatics 2010; Wagner et al. Theory Biosci. 2012）。
詳細は上記の論文を参照していただきたいが簡単に説明すると、
**FPKM**の場合は、
(1) サンプルの総リード数を100万に揃える
(2) 各遺伝子の長さによる補正 (長い遺伝子の方が、多くのリードがマッピングされるから)
の順番で計算が進む。
一方**TPM**の場合は、
(1) 各遺伝子の長さによる補正
(2) サンプルの総リード数を100万に揃える
の順番で計算が進む。
つまりTPMの場合は、最終的に全ての遺伝子のTPMを合算すると、どのサンプルにおいてもその値が一定になるが、FPKMの場合は若干のずれが生じる。

# FPKM/TPMの計算
### FPKM
```math
\displaylines{
C_i: 遺伝子 (転写産物) i のリードカウント数 \\
L_i: 遺伝子 (転写産物) i の長さ \\
FPKM_i = \biggl(\frac{C_i}{\sum{C_i}}\biggl)10^6\biggl(\frac{10^3}{L_i}\biggl)
}
```
左の2つの項で総リード数を100万 (10<sup>6</sup>)に揃え、一番右の項で遺伝子 (転写産物) の長さにより補正しており、先述の順番に計算が行われている (1000 bpあたりの長さなので、10<sup>3</sup>をかけている)。
### TPM
```math
\displaylines{
C_i: 遺伝子 (転写産物) i のリードカウント数 \\
L_i: 遺伝子 (転写産物) i の長さ \\
TPM_i = \biggl(\frac{C_i}{L_i}\biggl)\frac{10^6}{\sum{\frac{C_i}{L_i}}}
}
```
TPMの場合は、FPKMの場合とは逆で、左の項で、まずそれぞれの遺伝子 (転写産物) のリードカウント数をその長さで補正した後に、補正したリード数の合計が100万 (10<sup>6</sup>)になるように補正している。

# Pythonでの実装
今回は、featureCountsで算出したリードカウントデータを、dataframeとして読み込んで計算を行なっている。
**データ例**
|Gene_ID|Chr|Gene_Length (<i>Li</i>)|Gene_Count(<i>Ci</i>)|
|-------------|-------------|-------------|-------------|
|Gene_A|chr1|12567|3352|
|Gene_B|chr2|567|32|
|Gene_C|chr3|123|2|


Gene_Length: 遺伝子長データがあるカラムのラベル
Gene_Count: カウントデータがあるカラムのラベル
```python:TPM_FPKM.py
import pandas as pd

# カウント数÷遺伝子長の計算
def count_per_length(df):
    return float(df['Gene_Count'])/float(df['Gene_Length'])

# FPKMの計算
def fpkm(df):
    return (float(df['Counts_per_Length'])/float(count_sum)) * 1000000000

#TPMの計算
def tpm(df):
    return (float(df['Counts_per_Length'])/float(cpt_sum)) * 1000000

# メインスクリプト
data_path = 'data_path' #featureCountの出力ファイルのパス
data = pd.read_table(data_path, header=1) #featureCountファイルの読み込み
count_sum = data['Gene_Count'].sum() #リード数の合計を算出
print('Total count reads', count_sum)

data['Counts_per_Length'] = data.apply(count_per_length, axis=1) #各遺伝子・転写産物における、カウント数÷長さ を算出
counts_per_length_sum = data['Counts_per_Length'].sum() #カウント÷長さ、の合計を算出
print('Sum of counts per length >', counts_per_length_sum)

data['FPKM'] = data.apply(fpkm, axis=1)
data['TPM'] = data.apply(tpm, axis=1)
data.to_excel('Result_File.xlsx')
```

# おわりに
上記のスクリプトにおいて、'Gene_Length', 'Gene_Count', 'data_path'の部分は、使用するデータによって変える必要がある点に注意してほしい。また今回はPythonを用いて算出を行ったが、すべてのサンプルにおいて手作業で行うことを厭わなければ、表計算ソフト (エクセルなど) を用いて計算を行うことも可能である。
VisualStudio2022とVsCodeでReact＋ASP.NET Coreを使ってみた

VisualStudio2022を使用してフロントエンドはReactバックエンドはAsp.NET_Coreのプロジェクトを作成するための備忘録です

# 環境
・VisualStudio2022
・VisualStudioCode
・Postman 　※API確認・開発便利ツール
・SQLSERVER
・node.js


## 実際に作成していく
VisualStudio2022で「ASP.NET Core WebAPI」プロジェクトを選択

細かな手順は公式docsを参考にしました
[チュートリアル](https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-6.0&tabs=visual-studio "チュートリアル")

何はともあれ一度実行してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417340/117cce1a-b2be-4112-d7a1-c7cb756c5b6a.png)

レスポンス200 でJSONデータが返されていることが確認できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417340/71b56b4e-ae99-df01-7856-1c4ff045b002.png)



#### launchUrl を更新する
チュートリアルにも書かれてるが　Properties\launchSettings.json の　launchUrl を "swagger" から "api/プロジェクト名" に更新。

#### モデルクラスを作成
プロジェクト⇒追加⇒新しいフォルダで[Models]フォルダを作成。MVC のMの部分です

#### EntityFrameworkCoreのインストール
今回はSQLSERVERを使用するので必要なefcのパッケージをNuGetを使用してインストールします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417340/081b2bbc-dd64-56dd-8d45-bd7197a167ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417340/8cb2dc78-961b-4bfc-585d-1b541bf2f0a5.png)

この二つをインストールします。これによってEntityFrameworkを使用してSQLSERVERに接続するためのパッケージがプロジェクトにインストールされます

#### contextクラスの作成
インストール完了後に、「Models」フォルダ右クリック「追加」→「クラス」⇒「プロジェクト名Context」というクラスを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417340/4e7baa81-57d0-60a5-8f1d-6842296a611b.png)

appsettings.jsonに接続文字列を追加


```c#:appsettings.json
 "ConnectionStrings": {
    "プロジェクト名Database": "Server=サーバー名\\;Database=データベース名;persist security info=True;user id=ユーザ名;password=パスワード;MultipleActiveResultSets=True"

  }
```

program.csに追加

```c#:program.cs
builder.Services.AddControllers();

builder.Services.AddDbContext<作成したContextクラス>(options =>
  options.UseSqlServer(builder.Configuration.GetConnectionString("プロジェクト名Database")));

//データベース例外処理
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

---------
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
else
{
    app.UseDeveloperExceptionPage();
    app.UseMigrationsEndPoint();
}

```
データベースの例外処理のために
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore NuGet パッケージを追加します

>Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore NuGet パッケージには Entity Framework Core のエラー ページ用の ASP.NET Core ミドルウェアが用意されています。 このミドルウェアは、Entity Framework Core の移行に関するエラーを検出して診断するのに役立ちます。

## コントローラーの作成
　続く...
MastodonでConoHaのオブジェクトストレージサーバーからWasabiに移行した話

# 移行した理由
Wasabi、登録だけして使ってなかったのでただお金を吸い取られていたから！アイエエエ！！
というのは7割本当で、3割は[Mastodon移住の話からMastodonメディアをwasabiという安いオブジェクトストレージに移管した話まで](https://qiita.com/mecaota/items/365fa9330366e74f756a)を読んだから。Wasabiを使う話はこの記事を読んでいただければ使えるようになります。また、[メディアをオブジェクトストレージに移行しました](https://diary.akane.blue/2019/06/05/move-media-to-object-storage/)をよんで、rcloneという便利なコマンドがあることがしれました。
また、主催している[インスタンス](https://workaholic.cloud/)がわりと思ってたより流速があるのでConoHaの100GBでは心許なくなってしまった。

## ではやっていきましょう。
```
＄ rclone config
```
まずはConoHaから設定していきましょうか。
```
[workaholic]
type = swift
user = gncu********
key = ********
auth = https://identity.tyo1.conoha.io/v2.0
user_id = gncu********
tenant = gnct********
tenant_id = ****f7e503a14d598e18159723310aab
tenant_domain = workaholic
storage_url = https://object-storage.tyo1.conoha.io/v1/nc_****f7e503a14d598e18159723310aab
endpoint_type = public
auth_version = 2
```
ってなれば多分メディアを引っ張ってこれる。所々伏せてます。この調子でWasabiも設定しましょう。
```
[wasabi]
type = s3
provider = Wasabi
env_auth = false
access_key_id = ******************
endpoint = s3.us-west-1.wasabisys.com
acl = public-read
secret_access_key = **************************************
location_constraint = workaholic
```
って感じになります。
```
$ rclone lsd workaholic:
```
って打って
```
 14274709988 2022-06-08 19:42:52    171660 workaholic
```
みたいに出てきたらswift側はOK。また、
```
$ rclone lsd wasabi:
```
で、
```
          -1 2022-06-08 09:01:51        -1 workaholic
```
と、バケット名が出てくればOK。さあ、cloneしましょう。
```
$ rclone sync workaholic:workaholic wasabi:workaholic -P
```
とすれば進捗状況を見ながらゆったりsyncされる様が見れます。17万もファイルがあると半日仕事ですね！お茶したり食事したりしながら待ちましょう。もっとビャーっといけるものかと思ったら数百キロバイトくらいで進むので大きいインスタンスほど時間はかかりまくります。

syncした後はnginxのリバースプロキシを設定したり(この辺は前述の記事に書いてあります。)、Mastodonの.env.productionをswiftを使う設定からS3を使う設定にしてビャッと
```
# systemctl restart nginx mastodon-*
```
で、ズビャッとConoHaを見に行く設定からWasabiを見に行く設定に変わります。

変わったかどうかはなんか画像上げて上がったら画像を別タブで表示させてみてアドレスがきちんとWasabiのものに変わっているかどうかを確認ですね。

ConoHaはConoHaで一人インスタンスのために契約は保持します。

## 後書き
前述の二つの記事を書いてくれたお二方に感謝します。ありがとうございました。
それではよいMastodonライフを楽しんでいきましょう。
【Flutter】Android12で実行出来なかったけど解決！[INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl764624764.tmp/base.apk (at Binary XML file line #21): intent tag may have at most one action.]

# エラー内容
FlutterをAndroid12で実行したときに下記のエラーが出ていた。
```
Error: ADB exited with exit code 1
Performing Streamed Install

adb: failed to install path/build/app/outputs/flutter-apk/app.apk: Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl764624764.tmp/base.apk (at Binary XML file line #21): intent tag may have at most one action.]
Error: Failed to install APK again.
Error launching application on Pixel 4.
```

# 解決方法

下記の部分が重要で、intent タグは最大1つのactionタグしか持てないらしい。

```
intent tag may have at most one action.
# intent タグは最大1つのアクションを持つことができます。
```

下記のようにAndroidManifest.xmlの内容を変更する！

**変更前**
```/android/app/src/main/AndroidManifest.xml
 <queries>
        <intent>
            <action android:name="android.support.customtabs.action.CustomTabsService" />
            <action android:name="android.speech.RecognitionService" />
        </intent>
 </queries>
```

**変更後**
```/android/app/src/main/AndroidManifest.xml
 <queries>
        <intent>
            <action android:name="android.support.customtabs.action.CustomTabsService" />
        </intent>
        <intent>
            <action android:name="android.speech.RecognitionService" />
        </intent>
 </queries>
```

これでAndroid12で実行できるようになりました！！

# 参考
Flutterから始めてAndroidよくわかってないマンですがとりあえず解決して良かったです。下記参考になりました。
Android11からなってたっぽい？誰かの参考になれば嬉しいです。

https://github.com/xamarin/Essentials/issues/1392#issuecomment-698352098
Vimium設定考

前の記事ではVimiumを導入するに至った経緯を説明したが、今回は具体的な設定（主にマッピング）について  

## マッピング戦略
基本的な戦略としては、  
- 腱鞘炎にならないように
    - Shiftキーを多用しすぎるとやばい
    - このためなら多少の統一感は無視する
- なるべく効率のいいように
- できれば片手でも操作したい

という感じ  

リマップ時のコマンドは設定画面のShow available commandsから確認し、設定済みのマップは設定画面以外からでも`?`で確認できます  

## マッピング
`h`と`l`は真っ先に潰せるキーで、これらはデフォルトだと横スクロールという割り当てになっているが、まぁ使う機会はそうそうないし使わざるを得ない時点で感じなので真っ先に潰して活用すべき  

ですが、その前にタブ間の移動が`J`（左）と`K`（右）というのはいささか直感に反するので変えておきます（横タブなら合理的なのか...?とも思ったけど、あれは左側が上にいくのでそんなことない気が... `gT`･`gt`は2ストロークなので論外）  

最初は`H`と`L`に設定していたものの、タブ移動というのは意外と酷使するキーで、特に私のように`F`（新規背面タブでリンクを開く）を酷使する場合には尚更です  
`F`の方が頻用するかと思いこれを`f`と入れ替えていたのだけど、これを通常クリック相当とするのはあまりに慣れないし、あまりに慣れないあまり頑張って慣れようとして`H`･`L`を押し続けたせいで軽い腱鞘炎になりました（気を付けよう！）  
結果`F`はデフォルトのままの`F`に戻して、`h`を左側のタブへ、`l`を右側のタブヘに割り当てました  
```vim
map h previousTab
map l nextTab
```
さて、このまま`J`と`K`のマップを残しておいても誤爆するだけなので、unmapするか任意のコマンドを割り当ててしまいましょう  
```vim
unmap J
unmap K
" 私の場合
" map J scrollPageDown
" map K scrollPageUp
```

これが私にとって最低限の設定です  
戻る/進むは`h`/`l`に振ってしまいがちな気がしますが、`F`メインの新タブをバンバン開く運用だと意外とデフォルトの`H`･`L`で十分事足りるので、それをそのまま使っています  

後は、タブの復元にいちいち`X`を押すのは扱いづらいので、`r`にも割り当ててしまうとよいです  
もともとあったリロードは[デフォルト](https://github.com/philc/vimium/wiki/Keymap)だと何も設定されていないShift後の`R`に追いやります（あまり使わないので）  
```vim
map r restoreTab
map R reload
```
ちなみにですが、Firefoxの場合vimiumのrestoreと、タイトルバー右クリックから選択できる「閉じたタブを開きなおす」では挙動が違うようなので注意が必要です（vimiumの場合別ウィンドウのやつも復元されてしまう）  
Chromeの場合は知りません  

あと、Firefoxの場合プライベートウィンドウからだと設定が正常にできないので注意しましょう（試してみた感じおそらくできないのが正常な動作で、Firefoxの場合のみ検出して防ぐのに失敗してるとかっぽい。なぜできないようになっているのかは謎...）  

### 片手用のマッピング
完全に左手のみでというのは無理ですが、スクロールぐらいなら片手のみでもしたいものです  
私は`u`と`d`（半画面分上下にスクロール）をよく（連打しつつ）使うのですが、`u`は右手側の位置にあるので、ちょうどいい位置にあった`s`に`u`相当の挙動を割り当てました  
`u`の代わりに常時使うほどではありませんが、なかなかにいい感じです  
```vim
" for lefthand only browsing
map s scrollPageUp
```

あと、何となくイメージに合うので`w`と`b`でタブ間移動ができるようにもしています  
私はブックマーク「のみ」を検索することがないのでいいのですが、（`O`からでも開けますし）一応`b`や`B`はブックマークを開くコマンドとして定義されているので注意が必要です  
```vim
map w nextTab
map b previousTab
```
これになぞらえて、`W`と`B`で戻る/進むとかにしても面白そうですね  

全体像的にはこんな感じです  
意外と少なかったですね（手元のだとコメントアウト行が多かった）  
まぁ、素のままでもわりと使いやすいですからね  
```vim
map h previousTab
map l nextTab
unmap J
unmap K
" 私の場合
" map J scrollPageDown
" map K scrollPageUp
map r restoreTab
map R reload

" for lefthand only browsing
map s scrollPageUp
map w nextTab
map b previousTab
```

## マッピング以外の設定について
（前提として左下の`Show Advanced Options`を押しておくこと）  

必須だと思うのは`f`でリンク踏んだ時の文字指定のやつぐらいで、あれだけは`abcdefghijklmnopqrstuvwxyz`のすべてを指定しない理由がないので必須だと思う（限られたキーのみにしてもキータイプ数が増えるだけな気がする）  

Excluded URLs and keys（指定したページで指定したキーを無効にする）は、youtubeのみ設定しています  
Patternに`https?://www.youtube.com/watch*`、キーにfjklmを指定（それぞれフルスクリーン、10秒巻き戻し、一時停止、10秒飛ばし、ミュート）  

後はPrevious patternsなんかを設定したり、ロード時にフォーカスを奪われないようにしたり、cssを設定したり、デフォルトのサーチエンジンを変えたりなんかがあるけど必須ではないと思う（cssは内蔵のvomnibarを使うならモチベーション的に実質必須みたいなとこはあるけど、見た目だけの問題なので）  
cssは[ここ](https://github.com/philc/vimium/wiki/Theme)とかから気になったのを拝借してみるだけでもだいぶ変わると思います  

## 使用する上でのTips
ブラウザデフォルトのショートカットキーの中にも活用できるものがあったりするので、調べておくとよいです  
個人的に`Ctrl-L`（アドレスバーにフォーカス）はよく使います  
あと、Vimiumを導入したらVimと同じく`Ctrl-[`で`Esc`キーの代わりになりもするはずです
中クリック氏（スクロール氏）がご逝去されたのでVimiumを導入した

（ほんとは五月の頭ごろにはこの経緯で導入してた）  
詳しい設定なんかは別の記事で出します  
→[上げました](https://qiita.com/ewre/items/c892c1647884d875bcbf) ~~よく考えたらこの記事技術要素あるかかなり怪しいですね...~~

## 背景
- 元々ブラウジングに関して中クリックを頻用することにより不満はなかった
    - リンクに対して中クリックで背面の新しいタブで開く、ページ内で押すことでマウスを動かした分だけスクロール、タブに対してでタブを閉じる、タイトルバーに対してで新規タブ作成等
    - これにより複数リンクを気軽に開きやすくなったり、マウスを動かす的の範囲を広げられたり、スクロールのみではできない微調整ができたりなどのメリットがある
- ただ、これらの使い過ぎによって通常スクロール氏が過労でお亡くなりになられてしまった
    - スクロールしてもチャタリングのような挙動で元に戻るのが過半になり、実用に耐えなくなってしまった。享年一年。
    - これにより中クリックへの依存度が高まる悪循環、いずれ何も操作していなくても誤動作しだすかもしれず、対策は必至

## これを踏まえた目的
- 中クリックへの依存度の軽減
    - 他キーへの中クリックのバインドも一つの手だが、結局狙いを合わせる手間が別にかかったりするしそれにも限界がある
    - キーボードブラウジングへ進むのが正攻法では？
        - 例えばVimiumなんかはしばしばおすすめされているのを見るため前々より気になっていたものの、導入の手間が気になり手を出していなかった
        - キーボードを使ったブラウジングならば、操作の効率自体も上がる可能性がありそう

よって、要件としてはこのような感じになった  
- 新規タブでリンクを開ける
- ある程度微調整可能でスムーズなスクロール操作
- タブ操作などのそれ以外の作業も簡略化したい

## 目的に合致したもの
- vimライクなブラウザ操作を提供するやつから検討した
    - [Vimium](https://github.com/philc/vimium), [Vixen](https://ueokande.github.io/vim-vixen/), [Tridactyl](https://github.com/tridactyl/tridactyl), [Surfingkeys](https://github.com/brookhong/Surfingkeys)など（[ここ](https://rion778.hatenablog.com/entry/2022/03/08/221353)なんかを参考にした）
- Vixenなんかも設定をjson直で管理できたりしてよさそうだったのだけど、スムーズスクロールのしっくり感からとりあえずVimiumを使ってみることに
    - カクッカクッというスクロールだと自分がどのぐらいスクロールしたのかが認識できなかったりするので、ゆるふわにはわりと重要な要素
    - カスタマイズ性は最低限でそこまで高くはないみたいだけど、シンプルで必要十分そうだし初心者にはぴったりっぽかった
        - 凝ってる人となると、js書いてなんでもできるのが売りのSurfingkeysでゴリゴリカスタムして使ったりしてるらしい
            - 自分はまだその前にやるべき効率化手段が他にあると思うので手は出さないけど
dbtでディレクトリ名をBigQueryのデータセット名に設定する

# 背景
最近、BigQueryにおけるデータ変換を行うツールとしてdbtを使い始めました。

https://www.getdbt.com

しかしこのdbt、プロジェクトごとに一つのBigQueryデータセットを作る仕様になっています。

一方、使い方によってはディレクトリごとにBigQueryデータセットを作成したいケースもあるかと思います。本記事ではカスタムマクロによってそれを実現したいと思います。

# 用語説明
dbtとBigQueryでは用語の使い方が紛らわしく、少々混乱しそうになりますが、以下のようになっています。本記事ではわかりやすくするため、接頭語としてdbt/BigQueryをつけて記述します。

| dbt | BigQuery |
| --- | -------- |
| プロジェクト | ー |
| データベース | プロジェクト |
| スキーマ | データセット |

# やりたいこと
dbtではデフォルトでは、`profiles.yml` の `dataset`に設定した値をBigQueryデータセット名として設定されます。例えば `dataset` に `dbt_test`を設定していると以下のようになります。

![dbt_custom_schema_before_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336552/7c72a063-193d-96c4-b1bc-bfb918698efc.png)

また、`dbt_profiles.yml`で `+schema: foo` を設定すると以下のように、`<default schema>_<custom schema>`になります。

![dbt_custom_schema_before_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336552/8be8a4d2-e244-d2ca-23b0-2ae40bc98e55.png)

本記事ではこれに対し以下のようなファイル構成であった場合、ディレクトリ名である `example` をそのままBigQueryデータセット名に設定することを目指します。

```
├── models
│   └── example
│       ├── my_first_dbt_model.sql
│       ├── my_second_dbt_model.sql
│       └── schema.yml
```

# やり方
dbt では `generate_schema_name` マクロを定義することで、好きなスキーマを設定することができます。

https://docs.getdbt.com/docs/building-a-dbt-project/building-models/using-custom-schemas#advanced-custom-schema-configuration

`generate_schema_name` には `custom_schema_name` と `node` の二つの引数が渡されます。
この `node` の型は `ParsedModelNode` で、以下の値が設定されています。

| パラメータ | 概要 | 例 |
| --- | --- | -- |
| raw_sql | SQLファイルの内容 | |
| database | BigQueryプロジェクト名 | |
| schema | デフォルトのBigQueryデータセット名 | 'dbt_test' |
| fqn | Fully Qualified Name | ['(dbtプロジェクト名)', 'example', 'my_first_dbt_model'] |
| unique_id | プロジェクトで一意なモデルID | 'model.(dbtプロジェクト名).my_first_dbt_model' |
| package_name | dbtプロジェクト名 | |
| root_path | dbtプロジェクトディレクトリまでのパス | |
| path | モデルディレクトリ内のモデルファイルのパス | 'example/my_first_dbt_model.sql' |
| original_file_path | dbtプロジェクトディレクトリ内でのパス | 'models/example/my_first_dbt_model.sql' |
| name | モデル名 | 'my_first_dbt_model' |
| alias | エイリアス | 'my_first_dbt_model' |

ディレクトリ名をBigQueryデータセット名に設定するには `fqn` または `path` が使えそうです。
今回は `fqn` を使用して以下のマクロを組みました。

```jinja
{% macro generate_schema_name(custom_schema_name, node) -%}

    {%- set fqn = node['fqn'] -%}
    {%- set schema = '_'.join(fqn[1:-1]) -%}

    {{ schema }}

{%- endmacro %}
```

これで `dbt run` するとディレクトリ名の `example` がBigQueryデータセットに設定され、やりたかったことができました。

![dbt_custom_schema_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336552/06fb2841-0d4a-e5e5-bd6c-69bf3679d93e.png)

# おわりに
dbtは学習コストが少し高いですが、その分カスタマイズ性が高くて良いですね。

プロジェクト全体のソースコードは以下になります。

https://github.com/myzkyuki/dbt_custom_schema_example
Dartコードの自動整形が崩れる

# 事象
Flutterプラグインを追加したAndroid Studioには、Dartコードを自動で整形する機能があります。


<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287959/55f72b16-13bf-0f67-4c93-f1a4d2fac258.png">


多くの場合この自動整形はいい感じに整形してくれるのですが、ソースコード中にExpanded()が含まれる場合インデントが崩れます。
```Dart:整形後

Expanded(
    child: Row(
  children: [   //本来このchildrenはあと4スペース分、右にあるべき
    Container(
      color: Colors.green[300],
    ),
  ],
)),
```

# 原因
VScodeのDartプラグインレポでやり取りされている[issue](https://github.com/Dart-Code/Dart-Code/issues/1363)を見ると、どうやらDartのフォーマッターの仕様のようです。

# 解決方法
上記の仕様はFlutter公式も把握しており、[以下のように解決方法を提示しています](https://docs.flutter.dev/development/tools/formatting#using-trailing-commas)。
>Flutter code often involves building fairly deep tree-shaped data structures, for example in a build method. To get good automatic formatting, we recommend you adopt the optional trailing commas. The guideline for adding a trailing comma is simple: Always add a trailing comma at the end of a parameter list in functions, methods, and constructors where you care about keeping the formatting you crafted. This helps the automatic formatter to insert an appropriate amount of line breaks for Flutter-style code.
>要約：最後の要素だろうがなんだろうが、つけれるところは常にカンマをつけてね。

実際に私の例でいうと、
```Dart:カンマを追加して整形
Expanded(
  child: Row(
    children: [
      Container(
        color: Colors.green[300],
      ),
    ],
  ),       //←このカンマを追加するとキレイに整形される。
),
```
このようにRow()の後ろにカンマを追加したらキレイに整形されました。
プログラム上意味のないカンマを置くのに少し抵抗はありますが、
インデントが崩れるよりはマシなので素直に従おうと思います。
JavaScript DOM操作

今回はJavaScriptでHTMLのテキストを表示するという機能を実装してみました。
実装した内容は以下になります。
・クラスの作成
・DOM操作の実装

HTMLはこのようにしました
```HTML:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    ...省略
  </head>
  <body>
    <div>
      <div id="parameterView"></div>
    </div>
    <div>
      <div id="enemyImageView" style="position: relative"></div>
    </div>
    <div>
      <div id="commandView"></div>
      <div id="messageView"></div>
    </div>
    <script src="script.js"></script>
  </body>
</html>
```

まずはクラスの作成から実装します
```javascript:script.js
class Message{
}

```

クラス名はとりあえず適当につけました

次にHTMLのテキストを表示の実装をしていきます
先ほど作成したクラスの中に実装していきましょう!
```javascript:script.js
class Message{
  static printMessage(text) {
    messageView.innerHTML = text;
  }
}

```

静的メソッドを使うために関数の前にstaticをつけておきました。
コードを中身を見ていきましょう!
「messageView.innerHTML=text;」の部分ですが、ここにはHTMLで指定したタグのidにtextという引数の値を格納するという処理になります

最後に実装した処理を実行していきましょう!
```javascript:script.js
Message.printMessage("こんにちは<br>");

```
クラス内の関数を実行するために上記のように実装していきます
ブラウザで開くと引数に代入した値が表示されるようになっているはずです。

最後まで見ていただきありがとうございました。これからもプログラミング関連の投稿をしていきますのでぜひよろしくお願いします。
辞書構造を工夫したMigemo実装の紹介


Migemoとは、ローマ字のまま日本語をインクリメンタル検索するためのツールです。
Migemoにより、かな漢字変換をすることなく、漢字を含んだ日本語の検索を快適に行うことができます。

高林哲氏により、2000年に初版が公開されて以降、様々な発展を遂げました。
現在広く利用されているMigemo実装は、KoRoN氏によって公開された[C/Migemo](https://github.com/koron/cmigemo)でしょう。

拙作ながらも、私ogunaもMigemo実装を公開しています。
このサイトでは、Migemoの機能を説明し、次世代へと繋がるMigemo実装の紹介をしていきます。

## Migemoとは

日本語の文章や単語は、IMEによりローマ字を漢字に変換しながら入力します。
Migemoでは、このIMEによる変換をすることなく、単語の検索をすることができます。

例として、「吾輩は猫である」中の「獰悪」の文字を検索するとします。
Migemoがない場合、検索窓にカーソルを移動させ、IMEをオンにし、「douaku」とローマ字入力した後に、変換候補の中から「獰悪」を選択します。
一方、Migemoでは、検索窓にカーソルを移動させたのち、「doua」と入力するだけで「獰悪」にカーソルが移ります（下図で獰悪がピンクにハイライト）。
このようにキーボードの操作が大幅に削減されるため、快適に検索を行うことができるのです。

![117541047-005d0a80-b04d-11eb-818c-4236e158e6cf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/6bfd9b44-cc00-8e1d-90b6-fbb04076d4ba.png)

上記を含むMigemoの簡単なデモは、以下のサイトで試すことができます。

- [jsmigemo Demo](https://oguna.github.io/jsmigemo/)

## 省メモリなMigemo

Migemoは内部に「かな→漢字」変換用の辞書を格納しています。
この辞書はメモリを大きく占めます。

そこで私は、データ構造を工夫することにより、メモリ使用量を大きく削減しました。
具体的には、C/Migemoでは26.1MBであったメモリ使用量を、Rust実装のMigemoでは7.7MBにまで削減しています。
その分クエリに要する時間は増えましたが、十分実用的な速度を維持しています。

この削減は、C/Migemoでは2重連鎖木でデータを格納していたのに対し、
省メモリなMigemoではLoudsトライで格納したことによります。

## 主要な言語による実装

Migemoが多くのソフトウェアやツールでの導入が容易になるよう、様々な言語でMigemoを実装しました。
全て省メモリの辞書に対応しています。

- Go: [gomigemo](https://github.com/oguna/gomigemo)
- Rust: [rustmigemo](https://github.com/oguna/rustmigemo)
- Java: [jmigemo](https://github.com/oguna/jmigemo)
- Python: [pymigemo](https://github.com/oguna/pymigemo)
- C#: [csmigemo](https://github.com/oguna/csmigemo)
- JavaScript(TypeScript): [jsmigemo](https://github.com/oguna/jsmigemo)

CやC++では、Rustで出力する外部ライブラリを利用することができます。

これら複数の言語で実装したMigemoの性能を比較したベンチマークを公開しています。

- [migemo-benchmark](https://github.com/oguna/migemo-benchmark)

| | C/Migemo | gomigemo | rustmigemo | jsmigemo | jmigemo | rustmigemo-wasm | pymigmeo | csmigemo |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 言語 | C | Go | Rust | TypeScript | Java | Rust→WASM | Python | C# |
| ランタイム | Native | Native | Native | Node.js | JVM | Node.js | CPython | .NET Core |
| 実行ファイルサイズ (KB) | **72** | 1974 | 358 | N/A | N/A | N/A | N/A | N/A |
| 辞書ファイルサイズ (MB) | 4.78 | **2.03** | **2.03** | **2.03** | **2.03** | **2.03** | **2.03** | **2.03** |
| メモリ使用量 (BM) | 26.1 | 12.1 | 7.7 | 14.8 | 15.5 | 14.4 | 6.5 | **6.4** |
| 起動時間 (ms) | 198 | 78 | **65** | 165 | 234 | 150 | 462 | 147 |
| クエリ時間 (ms) | **5053** | 5860 | 14939 | 24753 | 15892 | 14618 | 119909 | 17493 |


## 最新の用語を追加したMigemo辞書

言語は生きており、日々様々な単語が生まれています。
快適な検索を実現するには、最新の用語の検索も可能でなければなりません。

SKK辞書からMigemo辞書を生成するのは、手間のかかる作業です。
そこで、生成したMigemo辞書を下記で配布しています。

- [migemo-dict-latest](https://github.com/oguna/migemo-dict-latest)
- [migemo-compact-dict-latest](https://github.com/oguna/migemo-compact-dict-latest)

## 商用利用可能なMigemo辞書

C/Migemoに同梱されている辞書ファイルは、SKKから生成されているため、GPLライセンスと考えられます。
もしあるプログラムをこの辞書ファイルを同梱して配布する場合、そのプログラムもGPLしなければならないかもしれません。
そのような考えから、Migemoを利用するプログラムの多くはユーザによる辞書のダウンロードを強いていました。
結果、Migemoを導入するユーザの手間が大きくなっていました。

より簡単にMigemoを利用できるようにするには、緩いライセンスの辞書ファイルが必要です。
そこで、BSDライセンスのプロジェクトから生成したMigemoの辞書を作成しました。

- [yet-another-migemo-dict](https://github.com/oguna/yet-another-migemo-dict)
qiita apiを叩く。その3

# 概要
javascriptで、qiita apiを叩いてみた。
itemsを取得してみた。

# サンプルコード

```


var app = new Vue({
  el: '#app',
  data: {
    items: []
  },
  mounted() {
    axios.get(`https://qiita.com/api/v2/users/ohisama@github/items`).then(response => {
      this.items = response.data;
    }).catch(error => {
      alert(error);
    });
  }
});




```

# 成果物

https://embed.plnkr.co/plunk/inGmlRc7wpqWrasWqPSg

以上。
momoをraspiで実行

## 環境
raspberrypi 4b
usbカメラ
PC

## 準備
```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libnspr4 libnss3
```

## momoのダウンロード＆解凍
```
$ sudo wget https://github.com/shiguredo/momo/releases/download/2022.2.0/momo-2022.2.0_raspberry-pi-os_armv7.tar.gz
$ sudo tar -zxvf momo-2022.2.0_raspberry-pi-os_armv7.tar.gz
```

## momoの実行
```
$ ./momo --no-audio-device --resolution QVGA test
```

## PCで表示
以下リンクにブラウザでアクセス
<http://ラズパイのアドレス:8080/html/test.html>
connectクリック
再生ボタンクリックでカメラ映像が表示される

ラズパイのアドレスはラズパイで以下コマンドで確認する
```
$ ip addr
```
Fargateでno space left on device

## 事象
Fargateでデプロイしたら、以下のエラーが発生しました。
```
CannotCreateVolumeError: unable to mirror
/var/lib/two/volumes/8b081e14781e4f2885380becbbefab29/volumes/vf-4028715966 to
/var/lib/two/volumes/8b081e14781e4f2885380becbbefab29/volumes/public-files: failed to copy
existing contents to task volume: unable to copy contents from the image
/var/lib/two/volumes/8b081e14781e4f2885380becbbefab29/volumes/public-files
/var/lib/two/volumes/8b081e14781e4f2885380becbbefab29/volumes/vf-4028715966: failed to copy files: copy file range failed: no space left on device
```

## 調査
- 何回かやると成功したので、コンテナの中にログインして調べる。

### コンテナにECS Execでログイン
```
aws ecs execute-command \
--cluster {クラスタ名}  \
--task {タスク名} \
--container {コンテナ名} \
--interactive \
--command "/bin/sh"
```

### dfコマンドで調べる
- Diskがいっぱい・・・。Railsアプリケーションの中身が多いようだ・・。
```sh
root@ip-192-168-5-22:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          30G   30G     0 100% /
tmpfs            64M     0   64M   0% /dev
shm             1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/nvme0n1p1  4.9G  1.9G  3.0G  38% /dev/init
/dev/nvme1n1     30G   30G     0 100% /usr/src/rails/public
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /sys/firmware
```

### duコマンドでディレクトリ別に調べる
- うーん。5.5GBしか使っていない（dfだと30G）
```sh
root@ip-192-168-6-103:~# du -h /usr/src/rails/public | grep 'G'
1.2G	/usr/src/rails/public/packs/js
1.2G	/usr/src/rails/public/packs
1.6G	/usr/src/rails/public/packs-test/js
1.6G	/usr/src/rails/public/packs-test
2.7G	/usr/src/rails/public/assets
5.5G	/usr/src/rails/public
```

AWSサポートに問い合わせたところ、dfコマンドだと、エフェメラルストレージの使用量なので、実際の使用量と差異が発生するとのこと。
つまり、`5.5GB`も使っていることが問題だった！！！


## 原因
- `5.5GB`使っていたのは、Railsのassets:precompileの結果をキャッシュしていて、ゴミデータまで一緒にキャッシュされていた為でした。また、それをデプロイしていたので`no space left on device`が発生しました。
Google スプレッドシートの罫線ショートカット

ショートカットで罫線を消したり引いたりできるとはかどります。

Windows:
- `shift+alt+6` ... 選択範囲の罫線を消す。
- `shift+alt+7` ... 選択範囲の外周に罫線を引く。

## 参考
https://aprico-media.com/posts/3103
Railsでエンドポイントを立てるときに沼った話

railsをエンドポイントを作成をしていて沼ったところと、どうやってそれを解決したのかを残しておきます
沼ったポイントとしては**railsのcorsの設定**です

## railsのcorsの設定
### どこで沼ったのか
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS)において、Rails APIでは[rack-cors](https://github.com/cyu/rack-cors)というgemを使用していました。
CORSについての詳しい知識はありませんでしたが、
- 許可をしたいAPIを叩く側のドメイン
- 許可をしたいリソースファイル
- 許可をしたいHTTPヘッダー
- 許可をしたいHTTPメソッド
を設定する必要があるということは認識していました。

便利なgemに感謝しつつフロントエンドの実装を進めていたところ、ログイン用のAPIを叩いたときにsession idがcookieに保管されていないことに気がつきました。

### どうすれば良かったのか
こちらの[記事](https://nishinatoshiharu.com/cors-pass-cookie-setting/)によると、どうやら`credentials: true`という設定をしないとレスポンスの`Set-Cookie`にCookieがセットされないため、フロントがCookieの取得ができないそうです。
よって`./config/initializers/cors.rb`は下記のようになります。
```react
Rails.application.config.middleware.insert_before 0, Rack::Cors do
    allow do
        origins(['localhost', /localhost:\d+\Z/, /(.+).local.example-dev.com\Z/])
        resource '*',
            headers: :any,
            methods: [:get, :post, :put, :patch, :delete, :options, :head],
            credentials: true
    end
end
```
`credentials: true`の部分を記述していないがために数時間も溶かしてしまいました...

また、railsではありませんが、フロント側でも自身のドメインのCookie値を設定するために`withCredentials`を`true`にする必要があるそうです。([ここ](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/withCredentials)に書いてあった。

CORSについて全く理解ができていないなと反省しました...
セキュリティに関する知識がないといつかやらかす気がするのでしっかり勉強しようと思います。
結果にコミットする

# 結果にコミットする

結果にコミットしたくないですか？
したいですよね？

僕はしたいです。
なので結果にコミットすることにしました。

## 結果リポジトリを作成

１．github 上で New をクリック

https://github.com/

![Screen Shot 2022-06-08 at 18.08.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/f7e69fe9-9eb0-0ab8-c38a-ae8d8bb7a153.png)

２．Repository name を kekka にして create repository

※一度 kekka リポジトリを作成した後でスクショを取ってるのでエラーでてますが気にしないでください。

![Screen Shot 2022-06-08 at 18.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/775f8feb-4aa6-6aad-de30-0bb900ea4643.png)

## clone してコミット

１．URLをコピーして clone する

![Screen Shot 2022-06-08 at 18.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/50488834-614c-7482-f06e-a4e7d3c87ed3.png)

任意のディレクトリで実行
```
$ git clone githubでコピーしたURL
$ cd kekka
```

２．README作成

```
$ touch README.md
$ echo '結果にコミットする' >> README.md
```

３．結果にコミットする
```
$ git add .
$ git commit -m '結果にコミットする'
```

４．とりあえずPush
```
$ git push
```

これで結果にコミットできました。
誰でも結果にコミットできるなんて良い時代ですね。

## 感想

ネタ被りそう。
怒られたら消します。
nRF SDK:改めてライセンスレジストレーション

# Segger Embedded Studio
今さら感が強いですが、Segger Embedded Studio(以下、SES)はNordic製品を開発する場合に限ってライセンスフリーとなっています。当時の記事を探してみたのですがこれですね。

https://www.nordicsemi.com/News/2017/10/SEGGER-and-Embedded-Studio-IDE-support?lang=ja-JP

::: note
ちなみに弊社はライセンスを購入しました、たしか(笑)
いや、何に対してお金を払ったのか実はあまり記憶になくて・・・。(おぃ)
:::

# やり方がどこにも書いていない
しかしどこにもそのやり方が書いてありません。不親切極まりないですね。ちなみに一応Qiitaで検索すればそれらしい記事はヒットしますので、ここから辿るという方法でも問題はないです。

::: note
いや、改めて自分用にまとめておこうと思っただけです。ボケる前に(笑)
:::

# ライセンスを申請する
ライセンスを申請するページはこちらです。しかしこのページってどこかから辿れるのだろうか・・・？

https://license.segger.com/Nordic.cgi

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/cd2651aa-b19c-8b73-440d-b58c128cf886.png)

## MACアドレスってどうやって調べるの？
やり方は色々ありますが、コマンドプロンプトから/ipconfig allと打つのが一番早い気がします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/ab35753c-2622-62bd-9150-bd8be5b37b96.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/163e8be0-92c8-b53f-f3de-8ce215f3ad1d.png)

::: note
今さらですが、アクティベーションのページにライセンス入力画面から確認できるよって書いてありますね・・・(笑)
:::

## ランダムアドレスを使うとNG
Windows 10にはセキュリティのためにMACアドレスを毎回ランダムにするという機能があります。
が！
これをオンにすると申請したMACアドレスと違うMACアドレスになってしまうのでライセンスが無効と言われてしまいます。この手のMACアドレスをベースにしたライセンスを使う場合は必ずオフにしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/20f9ed2b-aace-a6f7-ff39-13e856f43a81.png)
# メールが届く
ほどなくメールでライセンスが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/75023af0-3c81-8c58-f5ad-649a26069db5.png)
これをSESのLicense Managerから入力すれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/b57f0709-630c-ac5c-f13f-4d1cee9b9b57.png)
# これで
起動時に出るこの画面を見なくてもよくなります(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/227a2b58-b436-4a19-0467-ff062c6ee328.png)

::: note warn
インストール直後のhello_worldプロジェクトはNordicのCPUを指定していないのでライセンスがないと出ますが正常な動作です。
Nordic CPUのプロジェクトを作成、もしくは読み込むと何も出ないです。
:::
ASUS ノートパソコンのタッチパッドがテンキーになるやつを無効化

ASUS ExpertBook B9450F のタッチパッドの右上を長押しするとタッチパッドがテンキーになる。
便利な人には便利なのかもしれないが、何故かいつのまにか点いてて誤爆するマンなので無効化したい。

1. My Asus を開く（F12の固有ファンクション）
2. カスタマイゼーション > 一般 > 入力デバイス設定 > NumberPad ロック
3. この項目を「ロック解除」から「ロック」にする！！！！！

長押ししても付かなくなった！！！！！！！！！！

おわり

<font color="#eeeeee">はじめての Qiita の記事がこんなんでいいのか…？</font>
CSS記法〜基本セレクターの種類について

# CSS記法について

CSSではいくつか記法が存在するが、代表的なものに、
HTMLなどで指定された`要素`に対して`{}(波カッコ)`をつけてスタイルを記述していくものがある。

https://twitter.com/DT880605/status/1534371863970959360?s=20&t=YQMM4GIJxpY42g6hWxv3lQ

この時に、{}(波カッコ)の前についた要素のことを `セレクター` という
セレクターの書き方には、いくつか種類があるため基本的なものについてまとめてみた。

# 基本セレクターについて

|| 名称 | 記法 | 対象のHTML要素 |
|:-:|:-:|:-:|:-:|
|⑴| 要素型セレクター  | h1  | `<h1>...</h1>`  |
|⑵| classセレクター | .info  | `<p class="info">...</p>`  |
|⑶| idセレクター  | #ok  | `<button id="ok">...</button>`  |
|⑷| 属性セレクター  | [href]  | `<a href="about.html">...</a>`  |
|⑸| 全称セレクター  | *  | 全ての要素  |


Sampleコードを参考にして例を書いていく
```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>CSS Sample</title>
    <link rel="stylesheet" href="css/styles.css">
  </head>
  <body>
    <h1>Hello World!!!</h1>
    <p class="info">Sample Sample Sample Sample</p>
  </body>
</html>
```

### (1) 要素型セレクター
要素名をそのまま書いて、スタイルを指定できる。
``` CSS:styles.css
/* (1)要素型セレクター */
h1 {
  color: red;
}
```
#### 結果
h1の文字色が赤くなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185869/b40e8410-c347-f489-fbb8-1a636d4243d4.png)



### (2) classセレクター
.(ドット)の後にクラス属性の値を書いて、そのクラスのついた要素のスタイルを指定できる。
``` CSS:styles.css
/* (2)classセレクター */
.info {
  color: skyblue;
}
```
#### 結果
Sampleの文字色が水色になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185869/250b040e-e1e7-6e09-94c2-1bad3354c64c.png)
#### 特徴
* 要素型と違い、途中でタグ名などを変更した場合でもセレクターを修正せず同じスタイルを維持できる。
* クラス属性の値は複数指定することが可能。

```index.html
~略
  <body>
    <h1>Hello World!!!</h1>
    <p class="info">Sample Sample Sample Sample</p>
    
　　　　　　　　<!-- h2のclass属性の値にinfoとtitleを指定 -->
    <h2 class="info title">Hello World!!!</h2>
    <p>Sample Sample Sample Sample</p>
  </body>
~略
```
``` CSS:styles.css
.info {
  color: skyblue;
}
/* 属性の値titleのみ青色でフォントを細くする。 */
.title{
  color: blue;
  font-weight: normal;
}
```
#### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185869/05cf99ff-2723-5eb2-143e-641cb5216ab6.png)


### (3) idセレクター
#(バウンド記号)の後にid属性の値を書いて、そのidのついた要素のスタイルを指定できる。
```html:index.html
~略
  <body>
    ~
    <!-- buttonのid属性の値にokを指定 -->
    <button id="ok">OK!!!</button>
  </body>
~略
```
```css:styles.css
/* (3)idセレクター */
#ok{
  background-color: deeppink;
}
```
### 結果
背景が濃いピンク色のボタンが指定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185869/33032b6c-379a-9148-d5da-58a0483aea98.png)

### 特徴
* 同じページ内で同じ属性の値を使ってはいけない。
*  class属性と違い、空白を使ってはいけない為id属性の値は複数指定できない。


### (4) 属性セレクター
**[]**(大カッコ)の中に属性の値や名前を書いて、特定の属性のついた要素のスタイルを指定できる。

### (5) 全称セレクター
*(アスタリスク)をセレクターに書いて、全ての要素のスタイルを指定できる。
```css:styles.css
/* (5) 全称セレクター */
*{
  font-size: 8px;
}
```
#### 結果
文字が一括で小さくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185869/2b9cc8ed-432a-41a0-daea-ae1b31f8b0a2.png)