OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsのバッチ処理でもこれが出来るんだと感心した事

# 背景
仕事でWindows Serverで動かすSQL Server起動停止用バッチファイルを作らなくてはいけなくなった。
その時に周りから教えてもらったコマンドや処理が、要件にぴたりはまってとても助かったので、
忘れないようにメモ。

# 要件
* サーバが複数台有り、サーバによって起動しているサービスが微妙に違うので、サーバによって停止するサービスを
変更しやすくする
→サービスのリスト化をする部分で、不要なサービスをremでコメント化
* バッチ実行結果を後で確認出来るよう、ログを出力する。ログファイル名に日付を入れる。
(7世代保存、それより古くなったら自動削除)

# SQL Serverの起動・停止させるサービスを指定
指定するサービスは、サービス一覧＞プロパティ＞サービス名　に表示されている名前で指定が必要
→最初自分で調べてこれが分からず、少しはまった。
※対象部分を全体のバッチファイルから抜き出して記載

  set SERVICE_LIST=
  set SERVICE_LIST=%SERVICE_LIST% MSSQLSERVER
  set SERVICE_LIST=%SERVICE_LIST% MSSQLFDLauncher
  set SERVICE_LIST=%SERVICE_LIST% SQLSERVERAGENT
  set SERVICE_LIST=%SERVICE_LIST% MSSQLServerOLAPService
  set SERVICE_LIST=%SERVICE_LIST% SQLBrowser
  set SERVICE_LIST=%SERVICE_LIST% MsDtsServer100
  set SERVICE_LIST=%SERVICE_LIST% ReportServer
  set SERVICE_LIST=%SERVICE_LIST% SQLWriter

# 7日以前に作成されたログファイルを削除
最初はこれが出来るというのを知らず、1行だけのVBスクリプトを外部ファイルで使おうとしていた。

set LOGFILES=sqlstart_*.log
forfiles /d -7 /m %LOGFILES% /c "cmd /c del @file" 2>> NUL

# 今回勉強になった事

* ○日以上たったファイルの削除が出来るコマンドが、バッチで扱えるのが分かった。
* 起動停止で指定するサービス名を、サービス一覧＞プロパティ＞サービス名　に表示されている名前で指定が必要な事。
* バッチファイルも意外と使える事。(でもやっぱりLinuxのシェルスクリプトの方がやりやすくて助かるけど)
Javaで何か作ってみる(2022/11/03 Day14)

## 今日やった事
- MacにGit環境を構築した。
- Homebrewをインストールし、Homebrew経由でgitをインストールするようにした。
## 参考にしたもの
- [【Git/GitHub】Gitのインストール方法 (mac) - YouTube](https://www.youtube.com/watch?v=tJMLOS0a340)
- [macOS（またはLinux）用パッケージマネージャー — Homebrew](https://brew.sh/index_ja)
## 所感
- Macが古い（MacBook Pro　Early 2011）からか、Homebrewのインストールに時間がかかった。
- gitのインストールについては、動画では５分と言っていたが、１時間近くかかった。
- GitHubについては、ほとんど手をつけられなかった。

## 明日の予定
- 環境構築はほどほどにして、GitHubの整理をしたい。
- Javaの勉強も再開したい。
Javaで何か作ってみる(2022/11/02 Day13)

## 今日やった事
- 本当何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 引き続き、GitHubの整理を進めていく。
Javaで何か作ってみる(2022/11/01 Day12)

## 今日やった事
- 自分の[GitHub](https://github.com/takamatsuryota3)の整理を試みた。
## 参考にしたもの
- [【Mac】Gitの環境構築をしよう！ | プログラミングの入門なら基礎から学べるProgate[プロゲート]](https://prog-8.com/docs/git-env)
## 所感
- Macで、Git環境構築して、プルして整理しようと思ったら、Gitコマンド結構忘れてて焦った。  
&rarr;現場では、TortoiseGitやVSCodeに頼りっきり。たまにはコマンド使わないとな。。。
- 整理が完了するまでは、全てのリポジトリをprivateにしたい。

## 明日の予定
- 引き続きGitHubの整理をしていく。
- Git環境構築について、Windowsm,Macそれぞれで出来るように復習しておく。
ApsaraVideo Liveを調べてみた　～API管理編～

Alibaba Cloudのメディアサービス群に、**ApsaraVideo Live**が追加されたので調べてみました。

# 1. Alibaba Cloudのメディアサービス群
Alibaba Cloudのメディアサービス群は、**Media Services**と**Media Technology**のカテゴリに分かれています。

* Media Services
    * ApsaraVideo Live
        * オーディオ/ビデオプラットフォーム
            * 広域分散型ネットワーク
            * 大規模分散型リアルタイムトランスコーディング
    * ApsaraVideo Vod
        * オンデマンドオーディオおよびビデオストリーミング用ソリューション
            * 自動トランスコーディング
            * メディアリソースの管理
            * Alibaba Cloud CDNと連携したメディア配信
        
* Media Technology
    * ApsaraVideo for Media Processing
        * メディアプロセッシングサービス
            * オーディオやメディアファイルのトランスコード
                * トランスコード用のコスト削減
                    * プロセスの管理
                    * コンソール
                    * API/SDK

# 2.ApsaraVideo Liveについて
ApsaraVideo Liveは、オーディオ/ビデオプラットフォームです。
最新のコンテンツアクセス方式、広域分散型ネットワーク、大規模分散型リアルタイムトランスコーディングといった技術が使われています。

### 特徴
ApsaraVideo Liveの大きな特徴として4つほどピックアップしてみました。
* 全世界をカバーする1,500以上のライブビデオノード
* 複数のプラットフォーム(iOSやAndroidなど)をカバーするSDK
* 低レイテンシ
* 大量同時接続

### 機能
[機能](https://www.alibabacloud.com/help/ja/apsaravideo-live/latest/features)として大きく8のカテゴリがあります。
* ライブストリーム取り込み
* ライブストリーム再生
* ライブストリームセキュリティ
* ライブストリーム管理
* データ統計
* コンソール管理
* API管理
* SDKのサポート

多くの機能がありますが、今回はAPI管理にフォーカスしてみたいと思います。

# 3.API管理
ApsaraVideo Liveの機能として[API](https://www.alibabacloud.com/help/ja/apsaravideo-live/latest/api-overview#section-eo1-e2x-55v)に関するカテゴリが5つあります。
このカテゴリの中に、複数のAPIが準備されており基本的な操作が一通り行えるようになっています。
また、保存先にOSSを指定できるためとても便利ですが、リージョンの選択に注意が必要です。
* ドメイン名の管理
    * ドメイン名の作成・削除・変更・表示
* ストリーム管理
    * ストリーミングドメイン名の作成・変更・削除・有効/無効化
    * 同時視聴者数の照会
    * タスクの記録作成・停止
    * スナップショットタスクの作成・停止
* ライブストリーム録音
    * ライブストリームの記録
        * OSS(Object Storage Service)への保存
            * 対応している保存形式：m3u8/flv/mp4
            * OSSのバケット名とエンドポイントを指定する必要があります
* ライブストリームスナップショット
    * ライブストリーミング中にスナップショットをキャプチャ
        * OSSに保存
            * OSSはライブセンターと同一リージョンであることが必要です
* ライブストリームのトランスコード
    * ライブストリームを複数形式にトランスコード
        * サポートされているエンコード形式
            *  標準設定：lld/lsd/lhd/lud
            *  Narrowband HD設定：ld/sd/hd/ud

### QPS制限について
API操作するにあたり、[QPS制限](https://www.alibabacloud.com/help/ja/apsaravideo-live/latest/qps-limit-on-an-api-operation-in-apsaravideo-live)に注意する必要があります。
QPS制限とは、APIを呼び出す際の1秒あたりのクエリ数の上限です。
この制限を超えると、スロットリングがトリガーされ処理が中断されます。
たとえば、ライブドメイン追加のAPIである「AddLiveDomain」のQPSは30のため、1秒間に30回以内呼び出すことが可能です。
それ以上呼び出すとスロットリングがトリガーされます。

ただし、すべてのAPIにQPS制限が設けられているわけではないので、利用する際に確認が必要です。

### APIコール後のレスポンスとエラーコードについて
APIをコールした後のレスポンスですが、APIの種類によって内容が変わります。
しかし、正常に処理されると「RequestId」が返ってくることが共通の様です。

また、APIコール後にエラーが発生した際に返ってくるHTTPステータスコードは**400**でまとめられているので、エラーコードの内容まで確認して対応処理を行う必要がありそうです。



次回はSDKについて調べてみたいと思います。
【JavaScript】new.target

ES2015から、実行されたコンストラクタを参照する`new.target`というヤツが追加されました。
___
### コンストラクタ関数が`new`を使わず実行された場合にエラーを出力
~~~javascript
function Human (name, food) {
  console.log(new.target); // [Function: Human]
  this.name = name;
  this.food = food;
}

const human = new Human('Jack', '🍔');

console.log(human); // Human { name: 'Jack', food: '🍔' }
~~~

上記のプログラムでは、コンストラクタ関数（`Human`）を実行し、オブジェクトを生成しています。

**`new`が使用された場合、`new.target`は実行されたコンストラクタ関数を参照します。**

暗黙的に空のオブジェクト(`this`)を生成し、呼び出し元に生成したオブジェクトを返却する挙動は、`new`を使った実行が前提となっています。

ですが、上記のコンストラクタ関数は以下のように`new`を使わず実行することも可能です。
そうすると、誤った挙動となってしまいます。

~~~javascript
function Human (name, food) {
  console.log(new.target); // undefined
  this.name = name;
  this.food = food;
}

const human = Human('Jack', '🍔');

console.log(human); // undefined
~~~
**`new`が使用されなかった場合、`new.target`は`undefined`になります。**
それを利用した以下のような実装をすることで、`new`が使われたなかった場合にエラーを出力することができます。
~~~javascript
function Human (name, food) {
  if (!new.target) {
    throw new TypeError('Constructor Human requires "new".');
  }
  this.name = name;
  this.food = food;
}

const human = Human('Jack', '🍔');
~~~

~~~
throw new TypeError('Constructor Human requires "new".');
    ^
TypeError: Constructor Human requires "new".
~~~

___
### インスタンス化されたクラスを参照する

**`new.target`は直接実行されたコンストラクタを参照します。**

サブクラスを持つ場合、インスタンス化されたのがスーパークラスなのかサブクラスなのかをチェックすることができます。

~~~javascript
class Human {
  constructor (name, food) {
    this.name = name;
    this.food = food;
    if (new.target === Human) {
      console.log(new.target, 'SuperClass🍎');
    } else {
      console.log(new.target, 'SubClass🍏');
    }
  }
}

class Mutant extends Human {
  constructor (name, food) {
    super(name, food);
  }
}

const human = new Human('Jack', '🍔'); // [class Human] SuperClass🍎
const mutant = new Mutant('Logan', '🥩'); // [class Mutant extends Human] SubClass🍏
~~~
Next.js Headタグの使い方

# Headタグの書式ミスでvercelデプロイ失敗
Nextで作成したWebアプリケーションをVercelでデプロイしたのですが、
```console
react_devtools_backend.js:4026 TypeError: Cannot read properties of null (reading 'content')
...
...
```
ようなエラーが出てしまい、「サーバーサイド側で記述をミスったのかな...」
と思っていたのですが、色々見た結果nextのheadタグの書式で間違っていることが判明、、
```js
<Head>
    <h1>
        <title>ログインページ</title> 
    <h1>
</Head>
```
このような記述をしていたのが原因でした。omg

正しくは以下ですね↓
```javascript
<Head>
        <title>ログインページ</title> 
</Head> 
```
next初学者の方ご参考までに、以上
【JavaScript】ところで「値を返す」ってどういうことだっけ

![こんにちはせかい.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/f8a6bc72-d715-6949-4cec-bcf4bf69ba30.jpeg)
こんにちは。
最近さらにJavaScriptの魅力に気が付きつつあるSarasaです。

チュートリアルやらQiitaなどの投稿サイトを見てJavaScriptを勉強していると必ずといって出てくる

**「値を返す」**

というワード。

どのサイトでもあまりにさらっと出てくるけど
**「返すって言葉の含む領域広すぎじゃね？？」**
という疑問がぬぐえなかったので私なりの所感をまとめていければと思います。

# 「返す」と聞いてわたしが想像したもの
「返す」と言えば、、
![テニス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/0e3751b1-89c4-ed14-48f2-6150b6339dc7.jpeg)
**ボールを返す**とか

![本を返す.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/be070985-3507-8ff7-b755-0f902a32f1e9.jpeg)
**本を返す**とか

一言で言ってもいろんな解釈ができます。（あくまで私の感想

でも、少なくともJavaScriptでは

「**何らかの仕事の処理の結果を渡すこと**」

になるみたいです。
いやあわかりにくい・・

# 演算子「先輩！！右と左の値を足しました！！」
抽象的な話になってしまったので、
まずはめちゃくちゃ単純な足し算を例に解説していきます。

まず、
```javascript
a=3
```
では、aという変数に3を**代入**しています。
つまり、
![a=3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/f407abc4-323f-2a1b-1b95-77d7b64338e9.png)
aというラベルの付いた袋の中身を3にしてあげることとイコールになります。

では、算術演算子``+``を使ってa=3を表現すると、

```javascript
a=1+2
```
![a-1;2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/97358f84-ed46-174f-1e3d-17bf9dc58029.png)


代入演算子``=``「おい！算術演算子！！ちゃんとaの中身持ってきたんだろうな？？」
算術演算子``+``「はい！１と２を連れてきましたので３という**値をお返しできます！！**」

というやり取り（処理）が行われていることがわかるかと思います。

# 「２０歳未満にはお酒出さんといてください！」
また、この「返す」は条件分岐（if~else）でも使われています。

例えば居酒屋で「この客にお酒を出してよいか否か？」を判断するとします。
もちろんお酒を飲んでいいのは**20歳から**です。

```javascript
age>=20
```

仮に来店客の年齢を21歳とすると、
```javascript
age=21;

if(age>=20){
 //酒を出す//
 console.log (`20歳以上なので飲酒可能です`)
    }else{
 //酒は提供しない//
console.log (`20歳以下の飲酒はお断りしております`)
}
```

となるかと思います。
if~は式の値が**真**``true``の場合に実行、**偽**``false``の場合はelse以下の処理が実行されます。

つまり今回は、![age=21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/97f7c71e-25a2-ea98-3a00-d72e27964bd4.png)
新入り猫「お待たせしました！注文をお伺いいたします」
客「おう！！生ビールひとつ頼むよ！！」
新入り猫「すいませんが身分証のご提示を・・・」
客「えー今どき年齢確認ｗｗ・・まあいいけどさ」
新入り猫「ありがとうございますー（正直自分も面倒ｗ」


（新入り猫の頭の中
「んーっと、年齢が21歳``age=21``ってことは``age>=20``が``true``の**値を返す**から、、、if~の処理を実行！」
![酒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2863909/b32bb7a7-9682-5baa-6d8e-f5c293aa9c35.png)

（お酒出しておｋな感じだな
新入り猫「生ビールお待たせしました～」

～完～

# 「何が」「何に対して」値を返しているのか
恐らく**値を返す**の難しさって、この文章の中で主語「何が」と目的語「何に」が抜けていることではないでしょうか？？

慣れてくると「ああ、この文脈だと多分あの関数のこと言ってるんだろうなー」みたいにさらっと流せるのかもですが、私はしばらくの間は「あれ？」と思ったら立ち止まってそれぞれの処理のつながりを言語化してみる癖をつけようと思っている所存です。

# 参考ページ
[JavaScript初級者から中級者になろう](https://uhyohyo.net/javascript/index.html)
[@uhyo_](https://twitter.com/uhyo_)さんのサイトには大変お世話になっております・・！
ChromebookにAnaconda3とJupyter Notebookをインストールする正しい方法


ネット上にある記事を参考にChromebookにAnaconda3とJupyter Notebookをインストールしようとしたら、何度もつまづきました。そこで、ここに正しいインストール方法を記載しておきます。


## はじめに

Chromebookに「**Jupyter Notebook**」をインストールしようとして検索してみると、「**Anaconda3**」という統合環境をインストールする必要があることが分かりました。

Anaconda3をインストールすれば、それに含まれている「Jupyter Notebook」も使えるようになるというわけです。

# Anaconda3をインストールする方法

## その1 Linuxを有効

Anaconda3をインストールするには、最初にChromebookの設定で「Linuxを有効化」しておく必要があります。設定自体は簡単な操作だけで終了できます。私の場合、すでに有効化していたので特に問題ありませんでした。

## その2 ファイルをダウンロード

公式サイトから「**Anaconda3**」をダウンロードするだけですが、ここでつまづきました。

**Anaconda | Anaconda Distribution**

https://www.anaconda.com/products/distribution


私の使っているChromebookはサイトの右上にある「**Download**」をクリックしてもダウンロードが開始されませんでした。

そこで、Windowsパソコンからアクセスし、「Anaconda3」の**Linux用ファイル**をダウンロードし、そのファイルをChromebookに移しました。

ファイルのリンクは**公式ページの一番下**にあります。

ダウンロードしたファイルはこちら。
**64-Bit (x86) Installer (737 MB)**



## その3  Anaconda3をインストール

次にAnaconda3をインストールするのですが、ここでもつまづきました。

ターミナルで「ls」と打ち込み、ファイルの中身を表示させようとしても何も表示されないのです。

そこで、Linuxのファイルを改めて確認してみました。すると、確かに何のファイルもありません。よく考えてみたら、microSDカードの中にAnaconda3のファイルを入れたままでした。

そこで、今度はmicroSDカードに入っていたAnaconda3のファイルをいったん「**ダウンロード**」ファルダの中に入れ、

ターミナル上で「CD ダウンロード」と入力して移動しました。※ターミナル上で日本語を入力するにはあらかじめ準備が必要です。

この状態で、「bash Anaconda3-20****-Linux-x86_64.sh」と入力します。※Anaconda3のファイル名は、Linuxのファイルから確認可能で、ファイルを選択して「名前の変更」を選択すると、表示されます。それを全部選択してからコピーすると、Anaconda3のファイル名をコピーできます。
```
$ CD ダウンロード

$ bash Anaconda3-20****-Linux-x86_64.sh
```
インストール中に、質問されて止まるときがありますが、「Enter」ボタンを押すか、「yes」と記入すれば先に進めます。

これで、Anaconda3がインストールできました。

インストール後に、Linuxのファイルを確認すると、「Anaconda3」というファイルができています。




## その4  Jupyter Notebookを起動

あとはターミナル上で「**jupyter-notebook**」と記述してEnterボタンを押すだけですが、ここでもつまづきました。

何度やっても起動できないのです。

そこでよく考えてみたら、このコマンドは「**Anaconda3**」というディレクトリ上でしか有効にならないことが分かりました。

さっそく、ターミナル上で「cd Anaconda3」と記述し、場所を移動。
```
$ cd Anaconda3
```
それから「 jupyter-notebook」と記述してEnterボタンを押しました。
```
$ jupyter-notebook
```
すると、見事「 jupyter-notebook」が起動しました。
（出来るだけ）分かりやすく著作権クイズ！　～文化祭編～

# 概要
実際に著作権で困ったので備忘録的なものとして残しておきます。
文化祭をストーリーとして、著作権について少しでも学んでいただけたら嬉しいです。
（なんかシリーズ化してますが、その予定はないです。）

全てこれを参考にするのはお勧めしません。
気になった事があればちゃんとご自身でお調べいただくことをお勧めします。

# えー今年の文化祭は映画に決まりました！
さぁ、文化祭シーズン...もこの記事が公開される頃にはさすがに終わってるかな？
さて、皆さんのクラスでは今年の文化祭は「映画」になりました。
投票の結果、「美女と野獣」となりました。さぁ頑張りましょう。

という訳でダンスの練習でもしていきましょう。

## 練習

確か美女と野獣にはダンスシーンがあったはずです。
撮影に至って、事前にダンスの準備をしていきましょう。
音源データはあなたが持っているのでこれを撮影に参加する人数分CDに焼こうとします。

さて、**「みんなの自宅での練習用にCDを焼くこと」** は、著作権違反になるでしょうか？

<details><summary>答え</summary>

**著作権違反**となります。

著作者やレコード会社の許可なしに、多数に楽曲をコピーしたりすることをしてはいけません。

:::note info
例外について
著作者の死後70年が経過している作品は基本的に手続きなしで使用できます。
また、自分のためにTSUTAYAとかで借りたCDからスマホにダンスの音を落とすのは問題ないです。（個人的に楽しむための複製）
:::
</details>

## 撮影

さて、実際に撮影となりました。
実際のダンスシーンで、曲を流しながら撮影をしますが、このままではその曲が入ってしまいます。
**曲が入った状態で文化祭で上映する**のは著作権違反になるでしょうか？

<details><summary>答え</summary>

著作権違反となりません。

学校の文化祭での上映は、「営利を目的としない演奏・上映」となりますので、楽曲が入っていても問題ありません。

:::note warn
注意しておいた方がいい点
もし、上映において来場者から金銭を要求するような場合は、「営利を目的としない演奏・上映」に含まれませんので、手続きが必要です。
また、キャストに対して給料（報酬）が発生するような場合も手続きが必要な場合があります。
:::
</details>

## 編集

さぁ、大変ですね。あなたは編集もしなければなりません。
編集でBGMを入れることになりましたが...あとは分かりますね？
**文化祭での利用のために動画に楽曲を入れる**のは著作権違反になるでしょうか？

<details><summary>答え</summary>

著作権違反となりません。

学校行事のために楽曲を複製して動画に入れることは「学校などの授業のための複製」に当たりますので、著作権違反にはなりません。

:::note info
文化祭とは
文化祭とは「授業」の一環に当たるので、上映のためだけに制作するのであれば手続きは不要です。
:::
</details>

## 上映

楽しい楽しい上映です。
上映の際、入場料は取りません。また、入場者特典（？）として、実際に上映された動画が焼かれたDVDを先着10名に配布します。
**音源が含まれた映像を無料で配布すること**は著作権違反になるでしょうか？

<details><summary>答え</summary>

**著作権違反**となります。

有料でも無料でも関係なく、人に配る場合は手続きが必要です。

:::note info
料金シミュレーターを使おう
もし、実際に手続するとなったら料金シミュレーターを使ってみましょう。
10部無料配布で、国内の楽曲を40秒間利用する場合は約1200円の使用料が発生します。
:::
</details>

## 帰宅

まだ文化祭は終わりません。
親が映画とクラスの雰囲気を録画していました。まぁ、映画泥棒のパロディーを流さなかったので仕方ないですね。
さて、この録画された内容を家で見ようとしています。もちろん録画された映像の中には、上映された映画、その中で流れた音声が含まれています。
**家族が映画のもようをビデオに撮って、家でみる**ことは著作権違反になるでしょうか？

<details><summary>答え</summary>

著作権違反となりません。

家庭内で楽しむための録音・録画には、「個人的に楽しむための複製」となり、手続きはいりません。

:::note warn
ダメな例
多分、この映像をさらに頒布したりしたらダメなんでしょうね。
個人で楽しむようにDVDに焼くのまでがセーフだと思います。
:::
</details>

## 友達から...

「文化祭で流れた映画をほかの学校にいる彼女に送りたいから映像ちょうだい！」と言われました。
彼女という単語で脊髄反射して「ダメ」と言わずに、一旦著作権を考えてみましょう。
**映画の内容を友人の彼女に見せるために送る**のは著作権違反でしょうか？

<details><summary>答え</summary>

**著作権違反**となります。

脊髄反射した皆さん。実は正解です。
先ほどに近いですが、みんなに配ったりするのは違反です。
しかし例外もありますので下をご確認ください。

:::note info
これの例外
LINEで送らないで、YouTubeに限定公開で上げてURLを上げることにしました。
この場合は問題ないです。（JASRAC管理楽曲の場合）
YouTubeやニコニコ動画などは、サイトがまとめてJASRACと手続きをしています。
アップロードに際しては手続きは不要です。後で動画が消されても知りませんが...。
（手続しているサイトにはJASRACのマークがあります。）
:::
</details>

# まとめ
下手なことをしなければ問題ないです。
基本的に誰かに配ったりしなければ問題ないので、安心して撮影・編集しましょう。

今回の記事は下記ジャスラックさんのページを参考にしました。
音楽の著作権で困ったらこちらをのぞいてみましょう。

https://www.jasrac.or.jp/park/inschool/cultural.html

忘れないようにストックでもしておくと便利かもしれませんね！
では～ﾉｼ
VSCode使っている時にActiveSupport::MessageEncryptor::InvalidMessageが出たら最初に疑うこと

## 結論
各.encファイル内でvscodeによる自動改行が入っており、その改行のせいでうまく動いていない可能性があるのでVSCodeの設定を見直す

## 起こったこと
リモートリポジトリからpullした後にrailsコマンドを使用すると

```ターミナル
ActiveSupport::MessageEncryptor::InvalidMessage
```
のエラーが出力されるようになりました。

## 調べたこと
まずこのエラーは
```ターミナル
ActiveSupport::MessageEncryptor::InvalidMessage
```
本来セットになっているはずの暗号化されているファイル(hoge.yml.enc)とそれに対応するキー(hoge.key)が一致していないのが原因
扉の鍵穴と鍵が一致していないのが原因である。

詳しくは↓↓
https://hirocorpblog.com/rails-credentials-master/




## 原因
今回起きたことは
vscodeの設定で自動で改行が入り、その改行のせいでファイルとキーが一致しなくなてしまっていた。

元々ymlファイルはインデントや改行に厳しいため、改行は入っているとそれもしっかり認識されてしまう。

## 解決方法
VSCodeの設定を開く
![スクリーンショット 2022-10-25 0.49.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680888/a95b944a-f21f-920d-b1aa-72c870f08624.png)

「設定」に進む
![スクリーンショット 2022-10-25 0.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680888/070b4be7-4939-54a7-81b3-e791b8f37913.png)

検索窓に
```
insertFinalNewline
```
を入力
![スクリーンショット 2022-10-25 0.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680888/79c95afc-db14-964b-ea51-f77cb7478cc6.png)

（チェックがついていれば）外す

これで自動で行末に改行が入らなくなり、ymlファイルが意図通りのymlファイルとして認識される。
MakerUNOの8番ピンがINPUT_PULLUPしたのにHレベルにならないときに確認すること

MakerUNOの8番ピンを
 pinMode(8, INPUT_PULLUP)
と記述したのにHレベルにならないことがあった
ちょっとしたことが原因だったが備忘録として書いておく

最初気がついた時　ボードが壊れてるのかと思い
他のMakerUNOで試しても現象変わらず
プログラムが悪いのかと思い確認しても特に悪いところはない
なんでだろうと思いボードを見直してみたら
ブザースイッチがONになっていた

MakerUNOの[ユーザーズマニュアル](https://www.google.com/search?q=%E7%BF%BB%E8%A8%B3&oq=%E7%BF%BB%E8%A8%B3&aqs=chrome.0.69i59j69i65l2j69i61.2546j0j7&sourceid=chrome&ie=UTF-8)見たら
ブザー以外の目的で使うときはOFFにするようにと書いてあった
>PIEZO BUZZER SLIDE SWITCH
Slide switch to connect between pin 8 to piezo buzzer (labeled A). To use piezo buzzer, slide the switch on and program the buzzer. To use pin 8 for other purpose, slide the switch off.

![WS000150.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51752/ba7337d5-2dcb-2d85-764d-70c77ea6285d.jpeg)


ブザースイッチをOFFにして再度起動すると
8ピンは無事Hレベルとなりました。

今回の一件でピンの使い方を決めようと思いました。
基本形は０～７ピンは入力ピン８～１３ピンを出力ピンにする
PWMやSPI接続行う場合は都度考えます。
なでしこで素数判定する

プログラミングのレベルアップを考えた時、何かのお題を解くというのはとても役に立ちます。「素数判定」をお題にして、プログラミング力アップを目指しましょう！なでしこで素数判定のプログラムを作ってみます。

# 問題 - 素数判定

今回考えたいのは、次のようなプログラムです。

> 素数判定を行うプログラムを作ってください。そして、1から100までの自然数が素数かどうかを順番に判定してください。

このプログラム、何も見ずに作ることができるでしょうか。

## (ヒント) 素数とは

Wikipediaによる素数の説明は次の通りです。

> 素数（そすう、英: primeあるいはprime number）とは、2以上の自然数で、正の約数が1と自分自身のみであるもののことである。正の約数の個数が2である自然数と言い換えることもできる。... 最小の素数は2である。

つまり、正の整数Nが、(N-1)以下のどの整数でも割りきれない数が素数ということです。

## 例えば、どんな数が素数なのか？

ほぼ問題の答えでもあるのですが、素数がどんな数なのか確認してみましょう。

> 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,…

# 一番簡単な実装

「正の整数Nが、(N-1)以下のどの整数でも割りきれない数が素数」という点から、実直にプログラムを作ると以下のようになります。

```
●(Nを)素数判定とは：
　　　　もし、N<2ならば、いいえを戻す
　　　　もし、N=2ならば、はいを戻す
　　　　Iを2から(N-1)まで繰り返す：
　　　　　　　　もし、N％I＝0ならば、いいえを戻す。
　　　　それははい。
# テスト
Nを1から100まで繰り返す：
　　　　Nを素数判定。
　　　　もし、そうならば：
　　　　　　　　「{N}: 素数」を表示。
　　　　違えば：
　　　　　　　　「{N}: ー」を表示。
```

# 素数の特徴を掴んだ最適化を行う

もう少し、素数の特徴を考慮してみましょう。

まず、偶数の素数は2のみです。そこで、偶数であればすぐに、素数ではないという処理を入れましょう。
また、素数かどうかを判定する「繰り返し」文ですが、Nの平方根まで確認すれば、素数と判定して良いようです。この特徴も加味してみましょう。

```
●(Nを)素数判定とは：
　　　　もし、N<2ならば、いいえを戻す
　　　　もし、N=2ならば、はいを戻す
　　　　もし、N%2=0ならば、いいえを戻す
　　　　Iを2から(INT(平方根(N-1))+1)まで繰り返す：
　　　　　　　　もし、N％I＝0ならば、いいえを戻す。
　　　　それははい。
# テスト
Nを1から100まで繰り返す：
　　　　Nを素数判定。
　　　　もし、そうならば：
　　　　　　　　「{N}: 素数」を表示。
　　　　違えば：
　　　　　　　　「{N}: ー」を表示。
```

プログラムの行数が数行増えただけですが、実行時間はかなり短くなります。

# エラトステネスの篩(ふるい)

素数を検索すると、必ず出てくるのが、エラトステネスの篩という手法です。こちらもWikipediaが非常に詳しいので、詳しい解説は以下にゆずりますが、なでしこでも作ってみましょう！

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9

上記のエラトステネスの篩(ふるい)をそのまま、なでしこで実装すると以下のようになります。

```
●(Nの)エラトステネス篩とは：
　　　　結果＝[]
　　　　候補=[NG, NG]。
　　　　(N-2)回、候補にOKを配列追加。
　　　　Pを2から(N-1)まで繰り返す：
　　　　　　　　もし、候補[P]ならば：
　　　　　　　　　　　　結果にPを配列追加。
　　　　　　　　　　　　PP＝P×P
　　　　　　　　　　　　QをPPから(N-1)までPずつ増やし繰り返す：
　　　　　　　　　　　　　　　　候補[Q]=NG
　　　　Iで候補を反復：
　　　　　　　　もし、候補[I]ならば：
　　　　　　　　　　　　結果にIを配列追加。
　　　　結果を戻す。

# 100以下の素数を求める
素数一覧＝100のエラトステネス篩。

# プログラムの出力をお題に合わせる
素数配列＝[]。100回、素数配列にNGを配列追加。
素数一覧を反復：
　　　　素数配列[対象] = OK
Nを1から100まで繰り返す：
　　　　もし、素数配列[N]ならば：
　　　　　　「{N}: 素数」と表示。
　　　　違えば：
　　　　　　「{N}: ー」と表示。
```

# まとめ

素数に関するプログラムを、なでしこで作ると、こんな感じになります。
頭の体操で皆さんも素数判定に挑戦してみるのはどうでしょうか。
VsCode + CMake + GCC+ GDB +Qtの開発環境　手順メモ

## 0)環境
Ubuntu　20.04
Qt5
GCC 9
GDB 

## １）Vscodeの必要なExtentionsをインストールする
 ・[C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)
 ・[C/C++ Extention Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-extension-pack)
 ・[Cmake](https://marketplace.visualstudio.com/items?itemName=twxs.cmake)
 ・[Cmake Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools)
 ・[Qt Configure](https://marketplace.visualstudio.com/items?itemName=vector-wlc.qtconfigure)

## ２）QtConfigureのQtのインストールディレクトリを指定する
F1をおして、Qtconfigur:Set Qt Dirより、通常は/opt/Qtにある。

## ３）QtのプロジェクトをCmakeやQmakeで生成する。※今回はCmake
QtConfigureより、Qtconfigur:New project よりQtのプロジェクトを生成する。そのまま誘導のっていけば良い。


## ４）CMake Build
F1より、Cmake:Build　を行い、MakeFileの生成と、Makeを行い、実行可能ファイルが出来上がる。


## ５）Cmake Debug
F1より、Cmake:Debug　を行い、ターゲットのデバックができる。うまく行けばブレークポイントでちゃんと止まる。

## ６）Qt designerの起動
F1よりQtConfigure:Qt designer　で起動できるのでかなり便利。　QtのGUI.ui　ファイルの変更が行えるデザイナー。

## ７）Qt AssistantのHelp起動
F1よりQtConfigure:Qt Assistant　で起動。　ヘルプである。

## ８）コンパイラのコマンドオプションなどを指定したい場合
VScodeのTerminal　よりConfigure Tasks または　Configure Default Build Tasks よりCMake:buildを選択すると、tasks.jsonが生成されて、CMake:buildを実行した際のタスクが可視化される。ここの 

## 参考　CmakeLists.txt
Qtconfigur:New project 自動生成され、４）を追加したCmakeLists.txt を載せておく。

``` c
cmake_minimum_required(VERSION 3.5) # CMake install : https://cmake.org/download/
project(QtTrytest LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_PREFIX_PATH "/opt/Qt/5.12.6/gcc_64") # Qt Kit Dir
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Widgets REQUIRED) # Qt COMPONENTS
aux_source_directory(./src srcs)


# Specify MSVC UTF-8 encoding   
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")

add_executable(${PROJECT_NAME}
    WIN32 # If you need a terminal for debug, please comment this statement 
    ${srcs} 
) 
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets) # Qt5 Shared Library

```
ABC 049 C - 白昼夢 を DP でアプローチ

# アプローチ

再帰的に全探索してみたが TLE で WA。
随時,最適化を図ってくれる DP が最適と推察。
これなら全探索のように不要部分を探索せず答えが出せる(はず)

問題は[**コチラ**](https://atcoder.jp/contests/abc049/tasks/arc065_a)

コードを書く前に、
以下のように組み立ててから挑んだ。

&emsp;**1**.start 地点は、S の先頭とした
&emsp;**2**.先頭から dreamer, dream, erase, eraser を試す。
&emsp;**3**.上記で該当すれば DP として true をメモ
&emsp;**4**.S の先頭から後尾に進んでいくが、3 で True とした位置に辿り着いたら 2 を試す。
&emsp;**5**.4 で検証した結果 該当文字があれば True をメモ
&emsp;**6**.後尾に辿り着くまで 4,5 を繰り返す
&emsp;**7**.DP 最後の配列で true なら Yes, false なら No

# コード
以下で AC.

```day_dream.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//dream   5 
//dreamer 7 
//erase   5
//eraser  6

int main() {
	string S; cin >> S;
	int N = S.size();
	
	vector<bool>dp(N+2, false); 
	dp[1] = true;

	for (int i = 1; i <= N; i++) {

		if ((S.substr(i-1, 5) == "dream"|| S.substr(i-1, 5) == "erase") && dp[i]==true) {
			dp[i+5] = true;
		}

		if (S.substr(i-1, 6) == "eraser" && dp[i] == true) {
			dp[i+6] = true;
		}

		if (S.substr(i-1, 7) == "dreamer" && dp[i] == true) {
			dp[i+7] = true;
		}

	}

	//for (auto x : dp)
	//	cout << x << " ";
	//cout << "\n";

	if (dp[N+1]) cout << "YES";
	else cout << "NO";

	//while (1) {}
	return 0;

}
```

説明不足で申し訳ない。
ガンガン print or cout で経過を表示して
動作確認いただければ幸いです。
【Linux】psコマンドについて

# どんな時に使う？
ざっくりと、、プロセスとはメモリ上で動作しているプログラムの事を指します。
lsコマンド等を実行した際などに余り意識する事はないのですが、プロセスが生成されています。lsコマンド実行後には、プロセスが解放されます。

現在動作しているプロセスを確認したい時に、`psコマンド`を利用します。

## psコマンドについて
現在のターミナルで動作しているプロセスを確認する際には、`ps`と打つだけで確認する事が出来ます。
オプションを指定せずに`psコマンド`を実施した場合は、現在使用しているターミナル上で実行されているプロセスのみが表示されます。

```shell_session:psコマンド実施
[test_01@localhost /]$ ps
  PID TTY          TIME CMD
 1434 pts/0    00:00:00 bash
 3890 pts/0    00:00:00 ps
```

出力された結果を確認したところ、bashとpsプロセスが動作している事が確認出来ました。
右からPID、TTY、TIME、CMDカラムが出力されています。
`PID`は、プロセス毎に割り振られるプロセスID。`TTY`は、ターミナル名が出力されています。今はsshで繋いでいるので、「pts/0」と表記されています。実行結果は載せないですが、直接接続した場合は「tty1」と表記されました。作業では、気にした事がない項目です。`TIME`は、CPUの使用時間です。`CMD`は実行されているプログラムとなります。

`TTY`と`TIME`に関しては、私は業務であまり気にしていなかった項目です。`TIME`はプロセスの起動時間かなと勘違いしていました。
※`mas ps`で調べました。

| 項目|  内容  |
|---|----|
| PID | プロセスID |
| TTY | ターミナル名 |
| TIME | CPUの使用時間 |
| CMD | 実行しているプログラム |

　　

試しに他のプロセスを生成して、`psコマンド`を叩くとどうなるのか？を確認してみたいと思います。
`sleepコマンド`を実行して、その後に`psコマンド`を叩いてみます。

```shell_session:プロセス生成後にpsコマンド実施
[test_01@localhost /]$ sleep 3 &
[1] 4600
[test_01@localhost /]$ ps
  PID TTY          TIME CMD
 1434 pts/0    00:00:00 bash
 4600 pts/0    00:00:00 sleep
 4601 pts/0    00:00:00 ps
```

実行した`sleepコマンド`が表示された事を確認出来ました。3秒後に処理が終了するようにしたので、再度`ps`コマンドを実行します。

```shell_session:sleepコマンドの処理終了後
[test_01@localhost /]$ ps
  PID TTY          TIME CMD
 1434 pts/0    00:00:00 bash
 4602 pts/0    00:00:00 ps
[1]+  終了                    sleep 3
[test_01@localhost /]$ ps
  PID TTY          TIME CMD
 1434 pts/0    00:00:00 bash
 4603 pts/0    00:00:00 ps
```

表示されないことを確認しました。

## よく使うオプション

私がよく使用するオプションを下記表にまとめました。
UNIXオプション(-付き)とBSDオプション(-無し)で、効果が違います。
現場によると思いますが、`ps -ef`と`ps aux`のどちらかは使う場面が多いかと思います。
どちらも全てのプロセスが出力されますが、フォーマットが違うので見やすい方を使えばよいと思います。
私は特に指定がなければ、`ps aux`を使う機会が多かったので、こちらを好んで使用しています。


| オプション|  内容  |
|---|---|
| a | 端末操作のプロセスを表示　|
| x | 端末操作以外のプロセスを表示 | 
| u | CPUやメモリ使用率などの詳細情報を表示 |
| f | 階層表示 |
| -e | 全てのプロセスを表示 |
| -f | より詳細なフォーマットで表示　(full-format listing) |

試しに、`ps aux`コマンド実行時には下記のような結果を得られました
※動作しているプロセスが多かったので、省略。

`%CPU`と`%MEM`のCPU/メモリ使用率あたりは、よく確認してます。
`grepコマンド`を使用して、結果を見やすくする事もよくあります。

```shell_session:ps aux
[test_01@localhost ~]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 128024  6656 ?        Ss   10月30   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    10月30   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   10月30   0:00 [kworker/0:0H]

..etc

[test_01@localhost ~]$ ps aux | grep sleep
test_01   5799  0.0  0.0 108052   356 pts/0    S    16:00   0:00 sleep 5
test_01   5801  0.0  0.0 112824   968 pts/0    R+   16:00   0:00 grep --color=auto sleep
```

## 終わり
マニュアルを確認すると、思った以上にオプションが多くて驚きました。
私は業務上ではプロセス殺すときにPID調べたり、プロセス存在するかの確認で使用する事が殆どでございます。
CSVファイルを読み取ってPandasで編集してみた。

# はじめに
- 以前、とあるサーバーからCSVファイルをAPIで取ってきて、編集したものを自分のサービスに読み込ませるというバッチを作成する機会がありました。そのときの実行ログとして残しておきたいと思います。
- Webアプリ開発にしろ機械学習にしろ、CSVファイルを読み込んでそれに手を加えて使うというのは一緒だと思いました。他の人の役に立てば幸いです。

## pandasのインストール
```bash:インストール
% pip install pandas
% pip list | grep pandas #バージョン
pandas             1.5.1
```

# 1. CSVファイルの読み取り
```python:
import pandas as pd

file = PATH #取得したいファイルのPATH
df = pd.read_csv(file, encoding = "utf-8") #encodingは案件によって変えてください
```
今回は適当にdfを作ります
```python:df作成
df = pd.DataFrame({'name': ["tanaka taro", "yamamoto taro", "ota taro"], 'zipcode': ['111-1111', '222-2222', '333-3333'], 'school': ['新潟大', '新潟大', '千葉大']})
print(df)
#         name     zipcode     school
#0    tanaka taro  111-1111    新潟大
#1  yamamoto taro  222-2222    新潟大
#2       ota taro  333-3333    千葉大
```

# 2. 編集
## 2.1 一つの列を2つに分けたいとき。
ここでは、nameをfirstnameとlastnameに分ける処理を書きます。
```python:
df[["lastname","firstname"]] = df["name"].str.split(' ', expand=True)
print(df)

#        name   　　　　　　zipcode 　　　　　　　school  lastname firstname
#0    tanaka taro  111-1111    新潟大    tanaka      taro
#1  yamamoto taro  222-2222    新潟大  yamamoto      taro
#2       ota taro  333-3333    千葉大       ota      taro
```

注意点としては、`df[['column1','column2']]`のようにリストの中にリストの形になっていることです。
リストが1つしかないと、一つのカラムを取り出している処理となり
`    raise ValueError(
ValueError: Cannot set a DataFrame with multiple columns to the single column ('lastname', 'firstname')`というエラーが発生するのでご注意を

今回は半角スペースで分けたかったのでstr.split(' ')としましたが、そこも分けたい文字によって変えてください。`expand=True`も必要なのでお忘れなく。

## 2.2 いらなくなった列を削除
2.1 で作ったdfの中に`name`カラムがあります。これはもう使わないので削除しましょう
```python
df.drop(columns='name', inplace=True)
print(df)

#    zipcode school  lastname firstname
#0  111-1111    新潟大    tanaka      taro
#1  222-2222    新潟大  yamamoto      taro
#2  333-3333    千葉大       ota      taro
```
`inplace=True`というのはdfに加えた変更を一時的ではなくする(対象を即時変更する）オプションです。

## 2.3 ある列から特定の文字を削除したい時
次は、カラムがzipcodeのものから"-"(ハイフン)を取り除く処理を行います。
これも列を指定し、`replace`を使えば簡単にできます
```python:
df['zipcode'] = df['zipcode'].str.replace('-', '')
print(df)

#   zipcode school  lastname firstname
#0  1111111    新潟大    tanaka      taro
#1  2222222    新潟大  yamamoto      taro
#2  3333333    千葉大       ota      taro
```
## 2.4 ある列から重複しないように値を取り出す。
あるカラムが他のカラムと一対多の関係だったとします。いまの場合、`name`(名前)はどこかの`school`(学校)に属しているような状態です。`name`は`school`に対して属しているので、`school`の列に複数同じ要素が現れることもあります。今の場合，新潟大が二回現れています。
そして、いわゆる親のような存在(ここでは`school`)に対して処理したい場合が存在します。その場合，重複されているとちょっと困るというときがあるので、ある列から重複していない値を取り出す方法を紹介します。

それが`unique()`です。pd.Series.unique()としてあげることで、その列から重複のないリストを取得することができます。
```python:
print(df["school"].unique())
#['新潟大' '千葉大']
```
これとitterrows()やitertuples()などと組み合わせれば、ユニークな値のみに対して処理を行うことができます。


## 最後にCSVで出力
最後に編集したCSVを出力して終了です。
```python:
df.to_csv(path,index=False) #pathは自分の保存したい場所に指定してください。
```

他にも色々な編集があると思います。とりあえず、自分が使ったものを紹介させてもらいました。

## 参考記事
https://note.nkmk.me/python-pandas-reset-index/

https://deepage.net/features/pandas-unique.html
その非公開アカウントでアップロードした画像、漏れてませんか？

# 最近の出来事

先日買った靴の写真を鍵アカのTwitterでアップロードしたんですよ

https://pbs.twimg.com/media/FfE0bJZaAAA47PP?format=jpg&name=small

URL的にはこれになるのですが
かっこいいでしょう？

# あれ？

画像見ました？
何かおかしくないです？

そう、鍵アカでアップロードした画像にもかかわらず表示されるし、なんならログインも不要で見ることが可能なんですね

# ということは？

アカウントを持っていなくてもTwitterにアップロードされた画像をぶっこ抜けるということですね……
URLの可変部分は `[a-zA-Z0-9\-]{15}` となるでしょうか？
ざっとURL見るとそんな感じになってそうでした

30分もあれば総当たりでgetリクエスト投げるプログラム出来ちゃいそうです

ちなみに画像を削除した場合は多少のタイムラグありますが、ちゃんと画像が失効するようでした

# 気になるのは

Facebookも友達まで公開の画像のURLをシークレットウインドウで開くと同様に全世界に公開されてますので、どうやら世界中の人々は僕の友達らしい

mixiも友人限定の日記に載せた画像のURLをシークレットウインドウで開くと普通に表示される

ということで複数のサービスで似たようなことになっているらしい

このシークレットウインドウで開いても見れるというのがポイントで、接続先からするとIPアドレスなんかはわかるにしてもサービス利用してるユーザーは特定できないんですよね
それどころかサービスのアカウント持ってなくてもいいので

ログインすら不要で画像を見れるシステム設計ってログイン必須のシステムにおいても一般的な仕組みなんですかね？

偶然の一致で画像が引っかかる可能性ってかなり小さいと思いますが、サービスにログインもせずにプログラムで総当たりで引っかけていけるとなるとサービス側も気付きにくいんじゃないかという気がしててどうなんだろう

# 気をつけよう

公開制限をかけているからと言って画像をアップロードするとログインすら不要で公開されているケースがあるので気を付けましょう
Develop DEX platform

DeFi is growing in this bear market. With $3B to $5B, DeFi contributes to five percent of the daily crypto market transaction volume. Due to improvements in bidirectional blockchain bridges and growing Aggregator model DEXs, liquidity is growing. Traders are once again testing the waters in the DeFi space. 

But the real growth will come in late 2023 to mid-2024 when crypto regulations kick in worldwide. With more taxation and restrictions on crypto, centralized exchanges will have no choice but to raise their fees. And that is when users will pour across to the DeFi space for affordability. 

And this is an opportunity for you to make a mark in the crypto industry. And a DeFi exchange is what it takes to become an entrepreneur. 

## What is PancakeSwap Clone Script?

As you may know, PancakeSwap is a popular DeFi exchange. It has fought its fair share of fights to stay among the best DEX platforms. With over 1.8 million users and a monthly transaction rate of 55 million, it is one of the most trusted DEX platforms. 

Since all the codes are open-source, PancakeSwap's underlying software system is for the clone. The PancakeSwap clone script is the replication of PancakeSwap's operating system. 

The PancakeSwap clone script will give you the tools to launch a site like PancakeSwap. And it will have all its native features and room for customization. But what exactly are you getting?

## Features of PancakeSwap Clone Script-

Quick Crypto Swap
StableSwap
AMM Model
Limit Order Swap
Liquidity Pool
Perpetual Trade
Cross Network Bridge
Grid
Farms
Lottery
NFT Marketplace

These are the features the PancakeSwap clone script would provide the buyer to launch a DEX like PancakeSwap. 

Admin Dashboard
User Dashboard
Multiple Wallet Connect
DDoS Protection
SSRF Protection
End-to-End SSL Encryption

Security is one of the primary reasons why DeFi exchanges are preferred. And the PancakeSwap clone script does not compromise on protection. 

## Where to get PancakeSwap Clone Script?

There are more websites selling clone scripts online than ever before. It is vital to find a clone script service provider with accreditation. 

Here's how you determine a service. Reviews, the more positive reviews that a platform has, the better market presence they have. And in the crypto space, market presence determines trust. Another way to vet a business is customer service. Converse with the customer service portal, and test if they have a professional product. The demo is the best way to determine a product service provider. The demo will give you a clear idea of what you're buying. 

Are you an entrepreneur looking for an easy way to get started? A PancakeSwap clone script might be what you need. Get started now!

Get a free Demo here --> [PancakeSwap Clone Script](https://www.coinsclone.com/pancakeswap-clone-script/?utm_source=qitta&utm_medium=031122&utm_campaign=sinu)
【SAP BTP】アーキテクチャ・ダイアグラムを描きたいけど公式アイコンが見つからない件

# はじめに
SAP社のエンタープライズPaaS製品である、SAP Business Technology Platform（BTP） でアプリケーション開発をしている@fussasyです。上流工程において、アーキテクチャ・ダイアグラムを描く際に、AWSのようなクラウドベンダーが出している[アーキテクチャ・ダイアグラム][AWS Archetest Icon]の公式アイコンを利用したかったのですが、なかなか見つからなかったのでメモです。

# SAPの公式アイコン（icon）はどこにある？
以前まで、以下のリンクから利用規約と、SAP BTP（S4/HANA含）のアイコンセットが記載されたMS PowerPointスライドが提供されており、このスライドからアイコンを取ってきて利用できました。
https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=477829554
しかし、現在は301リダイレクトされSAP BTPの紹介ページに飛んでしまうみたいです……。
SlidePlayerにアップロードされているような、pptスライドがあったんですけどね……。
https://slideplayer.fr/slide/18117778/

さて、どこかに残っていないかなと探したところ、以下のSAPブログにダウンロードリンクが残っておりました。
（「Using the Solution Diagram Guidelines in MS PowerPoint」の項です）
https://blogs.sap.com/2018/01/05/be-visual-use-official-icons-and-samples-for-sap-cloud-platform-solution-diagrams/

ちなみに、以下がダウンロードリンクとなります。
https://d.dam.sap.com/a/JPUXye

他にも、PNGとSVGでのzip形式ファイルのダウンロードリンクも残っていました。
https://d.dam.sap.com/a/s9tyyJJ?rc=10

余談ですが、[Icon Explorer][Icon Explorer]ではイメージ画像を取得できません。
コチラはSAP UI5に記述して画面表示させる際に利用します。

# おわりに
SAP社の方から公式アナウンスがあれば、記事を更新したいと思います。
もし、SAP社の方々が見てくださっていれば、AWSのような案内ページを作ってくださると、開発者としてはとても嬉しいです。

[Icon Explorer]:https://sapui5.hana.ondemand.com/test-resources/sap/m/demokit/iconExplorer/webapp/index.html
[AWS Archetest Icon]:https://aws.amazon.com/jp/architecture/icons/
width:◯◯px;にしても、要素の幅が可変になる場合の対処法

## 結論
1. 隣り合う要素（青）に`width: calc(100% - 123px);`を当てる。
2. 親要素（緑）に対し、`display: flex;`と`justify-content-center;`を当てる。
:::note info
赤で囲んだ要素が対象の要素（widthが可変になる要素）の場合
:::

![ec83abc54f3bdf86912d750a35c04262.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512411/a9acd52d-d5aa-0069-0b10-0aa43873797b.png)


### 詳細
赤で囲んだ要素（`<div>`）のwidthが、
デバイスの幅によって変わった。
`width: 92px`と指定しているのにもかかわらずだ。

実際に、デバイスの長さが違うと
こんな風に表示される。
[![Image from Gyazo](https://i.gyazo.com/7f18ec46a32df807d8a96bed8f4af624.png)](https://gyazo.com/7f18ec46a32df807d8a96bed8f4af624)

[![Image from Gyazo](https://i.gyazo.com/8dcbc662f3433361675a76c2afcf074d.png)](https://gyazo.com/8dcbc662f3433361675a76c2afcf074d)
【Ruby ブロック引数】メソッド.(&block)の引数の「&」ってなに？

# はじめに
```
def block_execute(&block) # ← ここの引数の「&」の意味がわからない
  puts "block.call"
end

block_execute do
  puts "blockを実行"
end
```
def block_execute(&block)
これを見て、(&block)ってどんな引数だよ！！

と思ったので調べました。

# 結論
(&block)の「&」がついた引数は、ブロック引数と呼ばれるものです。

# 解説
ブロック引数の前にブロックとは何か？

### ブロックとは？
メソッド実行時に、そのメソッドの引数として渡せる「処理のかたまり」のこと。
今回で言うとここ↓
```
block_execute do
  puts "blockを実行"
end

または、
block_execute { puts "blockを実行" }
```

ブロックは 
* do ~ end で囲まれた処理のかたまり
* {} で書くことも可能
* メソッドに渡すためだけに存在する

### ブロック引数とは？
ブロックを受け取る専用の引数のこと。
正確に言うと、「＆」をつけると「 **ブロックをProcオブジェクトとして受け取れるようになる** 」です。
※ブロック自体はオブジェクトではない（データではない）のでそのままだと受け取ることができないということです。
Procオブジェクトについてはわからない人は調べてみてください。
参考: https://qiita.com/nagata03/items/919b0457409cc755ff0f

通常の引数は以下のように指定します。
```
def method(arg)
end
```
しかし、ブロック引数は以下のように指定します。
```
def method(&arg) # 「&」 が付きます
end
```
以上のように引数に「＆」を付け足してあげることで、ブロック（処理のかたまり）を受け取ることができるようになります。

# 動作確認
ブロックを渡して、正しくブロックが実行されるかを見てみましょう。
```
def block_execute(&block)
  block.call
end

block_execute do
  puts "blockを実行しました"
end

=> blockを実行しました
```
成功です。

次に、引数の「&」を消してみましょう。すると、、、
```
def block_execute(block)　# ← 「&」を消してみた
  block.call
end

block_execute do
  puts "blockを実行しました"
end

=> wrong number of arguments (given 0, expected 1) (ArgumentError)
```
うまく渡せませんでした。

ちなみに、今回使用しているブロックは「ブロック付きメソッド」と呼ばれるメソッドになります。
```
# ブロック付きメソッド
block_execute do
  puts "blockを実行しました"
end
```
ブロック付きメソッドがどのようにして呼び出されているかは、以下の記事が参考になります。
https://qiita.com/shuhei_sfc/items/5c582f89d5d8d7ab956c

# まとめ
def block_execute(&block)　このように引数に「&」が付くとブロックをProcオブジェクトとして受け取れるようになるとということでした。
CTFのRSA問題を解いてみた

ネットワークやってるくせに暗号技術全然わからなかったので覚え書き。

# 背景

https://play.picoctf.org/practice/challenge/162

この問題を解いていた。

## RSAをざっくり理解する


最初に与えられた文字列

```
Decrypt my super sick RSA:
c: 240986837130071017759137533082982207147971245672412893755780400885108149004760496
n: 831416828080417866340504968188990032810316193533653516022175784399720141076262857
e: 65537
```

wikiをもとに計算する
https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7

```math
m = c^d \mod{n}
```

ここで`m`が複合文となるので、未知数`d`を求めなくてはならない。

`d`の定義は以下である。

```math
d = e^{-1} \mod{\phi} \\
```

`φ`は以下で表せる。

``` math
\phi = \mathrm{lcm}(p-1,q-1) \\
n = p * q
```
`lcm`は最小公倍数を表す。
lcmはpythonのmathモジュールのlcm関数で計算できる。

ここまでで、`p`と`q`を計算できれば未知数`d`を求められることが分かった。

## pとqを求める

ここで、`n`を素因数分解することを考えてみる。
素因数分解は前の記事を参考に。

https://qiita.com/gosling-goldwyn/items/8c5b6f665e9427559962

mseiveを使用してnを素因数分解すると、以下の結果が得られた。
```
p40 factor: 1593021310640923782355996681284584012117
p42 factor: 521911930824021492581321351826927897005221
```

`n`は2つの素数の積だったため、うまく`p`と`q`が一意に定まった。

## 秘密鍵dを求める

次に秘密鍵`d`を計算する
```math
d = e^{-1} \mod{\phi} \\
```
ここでポイントなのが、
```math
e^{-1} \neq \frac{1}{e}
```
という点。
これはモジュラ逆数というものらしい。

https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%A9%E9%80%86%E6%95%B0

組み込み関数で頑張りたかったが見つけられなかったので、ネットに落ちてた関数を使用

https://tex2e.github.io/blog/crypto/modular-mul-inverse

これで秘密鍵`d`が求まった。

## 複合文mを求める

`m`を計算できればほぼゴール。

```math
m = c^d \mod{n}
```

桁数の多い数のpython計算モジュールのgmpyに、ちょうどよい関数があった。
windowsではgmpy2しか入らなかったので注意。

```
pip install gmpy2
```

```python
>>> m = gmpy2.powmod(c,d,n)
>>> m
mpz(13016382529449106065927291425342535437996222135352905256639592405461024281868413)
```

逆が成り立つことも確認した。
```python
>>> gmpy2.powmod(m,e,n)
mpz(240986837130071017759137533082982207147971245672412893755780400885108149004760496)
```

## 複合文mを文字列に変換する

正直ここにも時間をかけてしまったのだが、案外単純だった。
数値をバイト列に変換する。
長さは決め打ちで入れたがうまいやり方があるのかもしれない。

```python
>>> m.to_bytes(100,'big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00picoCTF{sma11_N_n0_g0od_23540368}'
```

以上。
「個人開発」❌「アドベントカレンダー」のすゝめ

これは[「アドベントカレンダー初参加する人を応援したい、アドベントカレンダーに参加したきっかけ Advent Calendar 2022」](https://qiita.com/advent-calendar/2022/sanka-kikkake)1日目の記事です。
[@seigot](https://qiita.com/seigot)　さんありがとうございます。

---
# 伝えたいこと

- 記事を書いたことがない人は、あまり深く考えずにアドベントカレンダーを書いてみよう。
- 個人開発のプレスリリースとしてアドベントカレンダーを使ってみよう！

## 技術向上の観点から見た記事を書く重要性

- 「わからないことを言語化する」特に文章として言語化することは、リモートワークが一般的になった現代の技術者にとってもはや必須の技能と行ってもいいのではないかと考えています。また、コードを書く時間よりもヘタをすればドキュメントを書いている時間が長い職業なのではないかとも思っております。
- その一方で、プライベートで人に見てもらう文章を書く機会は思ったより少ないと思います。
- 「プライベートで文章をみてもらう」という経験をを意識的に作り出せるのが「技術記事」だと私は思っております。
- 仕事の能力としてこれからも比重が上がっていくと予想できる（特に若手は！）ので今のうちから文章力を鍛えるがてら「技術記事」を投稿して他の人からアドバイスをもらおう！人脈にもなるぞ！

## 始めるのにおすすめのタイミングやアドバイス

- 最初の一歩を踏み出す言い訳を考えるのは大変だなと個人的には考えております。「お前もやるんだろ？俺もやるんだからさ」くらいのノリで友人巻き込みながら初めてのアドベントカレンダーを触ってみるといいんじゃないかなと個人的には思っております。
- その点で同級生など~~犠牲者を増やしやすい~~ 学生時代に一度経験してみることはおすすめです。
- 叩かれるのが…みたいなことを考えてしまう人におすすめのジャンルは「個人開発」
    - 自分の経験１００％でかけることが強み。
    - 特にアドベントカレンダーは結構購読して回る人もいるので個人開発の話をするのにもってこい！
    
## 個人的な始めるきっかけとそれを受けたメリット

- 私個人の体験談にはなるのですが、初めてアドベントカレンダーを書いたのが一昨年の「[かまってちゃんな彼女をPythonで作った話](https://qiita.com/yuriacats/items/bce25ff4cb7343ae0c7b)」でしてこの時応募するきっかけとなったのがその当時研究室の後輩であった [@namosuke](https://qiita.com/namosuke) 君が「自分がQiitaのクソアプリアドベントカレンダーに今年投稿する予定なのですが、ゆりあさんは投稿とかされないんですか？」みたいな会話がきっかけだった覚えがあります。
    - 初めて書いたアドカレ記事、ありがたいことに同じテーマで追走してくださった方がいて、引用をみると「やってよかったな」という気持ちになりました。
    - また、雑談でたまーーーにアドベントカレンダーの記事みました！みたいな形で触れてくださる方もいます。

- アドベントカレンダーがきっかけでアウトプットに対する苦手意識などが吹っ切れ、ハッカソンの参加やLT会登壇や運営などのアプトプットを積極的にするようになりました。

# それでも発信が怖いあなたに、ライティング能力を鍛える書籍の紹介

- 理科系の作文技術
- 考える技術・書く技術

## 終わりに

たたき台みたいな書き殴りになってしまいましたが、それでも書き方書き口を様々試してみることが文章力向上につながると信じているということで本日の記事は閉めさせていただこうと思います。

---

個人ごとではありますが、 [一人アドベントカレンダー](https://qiita.com/advent-calendar/2022/yuriacats) もやっております。興味がありましたらぜひご覧ください。
~~一応クソアプリアドベントカレンダーも10日目に参加します。~~
python Jupyter Lab

## Jupyter LabとJupyter Notebook
Jupyter Labは、Jupyter Notebookの後継機

## インストール方法
```
pip install jupyterlab
```
## 起動方法
コマンドプロンプトで「<b>jupyter lab</b>」
利用するブラウザで「<b>localhost:8888</b>」にアクセスする
```
jupyter lab
```

## pyファイル形式でエクスポート
[File]>[Sava and Export Notebook As]>[Excutable Script]

## Jupyter Lab 終了方法
[File]>[Shut Down]
Bigqueryの料金抑制方法②/アラート作成


①からの続き


## slackで対応する場合

##### 手順について

slack用の通知チャンネルを作成 > ポリシー作成時に通知先をslackとして選択

・メンションの付け方
@userIDとする
userIDとはslackで個々人を右クリックでリンクコピーしたURLの末尾から取得可能
`https://slack.com/*********`( ← *********がuserID)

参照資料

[slackでの通知設定](https://qiita.com/KKawa/items/996c2bd34f5f7092ab8f)

#### 設定方法の不明点の解明

##### Transform Dataについて
ローリングウィンドウ にて、監視する時間の間隔を決める。（例：5分に設定→過去5分間のデータを取得して異常を検知する）
基本1分単位で計測するのが良い。

#### Notify on incident closure
チェックを入れると、インシデント解消時にも通知が来るようになる。
インシデントの自動クローズ期間はデフォルトのまま「7日」でよいと思われる。


[通知チャンネル作成方法](https://cloud.google.com/monitoring/docs/samples/monitoring-alert-create-channel?hl=ja)

## 参照ドキュメント


[アラートと通知の方法](https://cloud.google.com/apigee/docs/api-monitoring/alerts-notifications?hl=ja)
【Swift】for文内のif文を省略できるらしい

# はじめに
SwiftLintを使ってたら警告が表示されて気づいたのですが、for文内のif文は`where`を使って1文にできるらしいです。

# やりかた
```swift
for user in users {
    if user == "SNQ-2001" {
        print("自分です")
    }
}
```

```swift
for user in users where user == "SNQ-2001" {
    print("自分です")
}
```

# おわり
こういうコードの省略形みたいなの知るとめっちゃ嬉しくなっちゃいます笑
【Linux】コンテナ内か判定する方法【Docker】

## 判定方法

以下のようにif文を記述することでコンテナ内かの判定ができます。  

```zsh
if [ -e /.dockerenv ]; then
  echo 'ここはコンテナの中です。'
fi
```

```zsh
if [ ! -e /.dockerenv ]; then
  echo 'ここはコンテナ内ではありません。'
fi
```
Integrated driving-dynamics control systems  ボッシュ自動車handbook 11版(102) p.1304

Chassis systems, Motorcycle Stability Control , ボッシュ自動車handbook 11版(101)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

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

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
# Integrated driving-dynamics control systems  , p.1304
## Overview 
## Functions 
## System architecture

# Reference
[1] Isermann (Editor) Fahrdynaimkregelung, Modelbidung, Fahrerassistenz systeme, Machatrorik, Vieweg Verlag Wiesbaden, 2006

https://www.iso.org/standard/51180.html

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

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

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221103
Motorcycle Stability Control, ボッシュ自動車handbook 11版(101) p.1296

Chassis systems, Motorcycle Stability Control , ボッシュ自動車handbook 11版(101)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

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

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
# Motorcycle Stability Control, p.1296
## Application
## Riding physics of a two wheeler
## Motorcycle AGS
## Motorcycle Traction control



# Reference
[1] J. Stoftregen Motorradtecknik, 9th Ed. Verlag Springer Vieweg, 2018

[2] ISO 8855:2011
Road vehicles — Vehicle dynamics and road-holding ability — Vocabulary

https://www.iso.org/standard/51180.html

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

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

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221103
乗り遅れた人のためのTailwindCSS

TailwindCSS。一度は耳にしたことがある方も多いと思います。
これまでのフレークワークと何が違って何がいいのか？メリットと利用時の注意をこの記事でお伝えできればと思います！
導入検討の際のお役に立てば嬉しく思います。

:::note info
【こんな方にオススメ！】
・CSSフレームワークの導入を検討している方
・これからTailwindCSSを勉強しようとしている方
:::

また、一個人の考え方なので何かご意見があればコメントいただけると幸いです。

## TailwindCSSは何がいいの？
最大の特徴は「utility-first」のCSSフレームワークだということです。
utility-firstというのは汎用的なclassを定義して組み合わせることでデザインパーツを構築する考え方のフレームワークです。


### 他のCSSフレームワークと何が違うの？
例えば、BootstrapたBulmaはコンポーネントとしてスタイルが定義されているのでclassで`card`を付与するだけでカードデザインが適用されます。
しかし、**TailwindCSSはコンポーネントという概念はなく、細かく定義されたutilityのclassを組み合わせる**ことでcardデザインを実現させます。

```html: Bootstrap or Bulma, TailwindCSS
<!-- Bootstrap -->
<div class="card">
  <div class="card-body">This is card.</div>
</div>

<!-- Bulma -->
<div class="card">
  <div class="card-content">This is card.</div>
</div>

<!-- TailwindCSS -->
<div class="max-w-sm rounded overflow-hidden shadow-lg">
  <div class="px-6 py-4">This is card.</div>
</div>
```

## 使うための環境セットアップ
導入については公式サイトを見ながらセットアップしてもらえれば問題ないと思います。

https://v1.tailwindcss.com/docs/installation

**個人的にハマった点はJavaScriptで動的に生成する場合の設定でした…**
動的に生成したHTML要素のTailwindCSSはwebpackでコンパイルした後にユーザーの操作によって追加されます。
なので、コンパイル時点でのCSSに反映されません。

:::note warn
TailwindCSSは指定したファイルを解析して必要なclassのみをスタイルとしてコンパイルしたすごい機能があります。
具体的には、classの指定から消せば、コンパイルの時に自動で不要なclassを削除してくれます…感動でした。
:::

JavaScriptで生成するHTMLにTailwindCSSのclassを指定している場合はJSファイルも解析対象にしてあげましょう。
`tailwind.config.js`に追記することで可能です。

```diff_javascript: tailwind.config.js
module.exports = {
-  content: ['./index.html'],
+  content: ['./index.html', './src/script/common.ts'],
  theme: {
    extend: {}
  },
  variants: {
    extend: {}
  },
  plugins: []
};
```
## classをマルチクラスで記述するのが面倒だ…
これまでCSSをいろんなフレームワークや設計で記述された方なら絶対思うはずです…。（私も思いました）
やっぱシングルクラスでしょ！って私も考えていましたが、TailwindCSSでは諦めていただければと思います。

:::note alert
理由はシンプルに**従来のCSSフレームワークと同じになり、コンポーネントを管理しないといけなくなる**からです。
平たく言えばTailwindCSSのメリットがなくなります。
:::

サービス改善で発生するパターン違いをどうするのか都度議論が発生し、それを怠るとコンポーネント崩壊が始まり手がつけられない状態になります。
公式サイトにもあるので、もしコンポーネントで管理したいということであれば別のフレームワーク、CSS設計を導入して独自で設計することをオススメします。

### 実はシングルクラスにもできるけど、やめた方がいい
`@apply`でclassをまとめることでコンポーネントのように定義することはできます。
繰り返しになりますが、TailWindwCSSではBadケースとなるのでやめることをオススメします。

詳細は別の投稿にまとめてあるのでそちらをご覧ください。

https://qiita.com/tanimoto-hikari/items/6fc9e684b7e83aa4a062

### classが覚えられないかもしれない…
vscodeであればプラグインがあるので活用してもらえればそこまで心配しなくても良いと考えています！
TailwindCSSを利用する際はぜひ入れてください！（私は知らず、初期は効率悪く作業してしまってました…）

https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss

## 【まとめ】乗り遅れた人のためのTailwindCSS
TailwindCSSはマルチクラスで冗長的な感じは否めないですが、柔軟に対応できる今の時代にあったフレームワークなのではないかと考えています。

:::note alert
スタートアップでどんなサービスにでも変化できる状態だと、どれだけCSSの設計を作り込んでも10年後には崩壊していることは発生すると考えています。
:::

ならば初めから設計のコストをカットして、**サービスの方針や土台が固まるまでは柔軟に対応できるフレームワークを導入する方が良い**というのが私の考えです。

### 導入する場合には破壊的変更に注意する
tailwindcssは流行りのフレームワークのためか更新スピードが早いです。

:::note warn
TailwindCSSに限ったことではありませんがバージョンが上がったからといってメジャーアップデートに対応すると破壊的変更がされていた場合アップデートは容易ではありません…。
:::

そのまま使い続けるのでも良いのですが、古いバージョンになれば新しく便利なメソッドを使えなくなるので、
それだけで技術的負債となり数年後には目も当てられないような状況になっていることはほぼ間違いないです。

:::note info
フレームワーク導入を検討するなら同時にメンテナンス工数も加味して計画を立てられることを強くオススメします！
:::

フレームワークの導入はその後のメンテナンスコストも加味して検討するべきだと考えます。