OmniAICreator/Qiita-1.07M huggingface dataset:
ページの最下部に行ったらコンテンツが追加されるような処理を実装してみた

こんな感じの挙動です
![Imgur](https://imgur.com/OCUIDQG.gif)

まずスクロール値を監視

```javascript
data : function(){
  return{
    scrollY : 0 //スクロール値が保存される
  }
},
mouted : function(){
  window.addEventListener('scroll',this.handleScroll);
},
methods : {
  handleScroll : function(){
    this.scrollY = window.scrollY;
  }
}
```


スクロールを監視して最下部に来た時に処理を実行

```javascript
watch : {
  scrollY : function(){
    let bottom = document.body.scrollHeight - document.body.clientHeight;
    if(bottom <= this.scrollY){
      //最下部に来たときに実行される
      this.getNextContent();
    }
  }
}
```
freeeの覚え

#入金処理：消込と取引登録
https://www.freee.co.jp/startguide/sales_processing/reconcile.html

４つのパターンがあるみたいです。
1.債権金額と入金額が同額の消込
2.手数料受取人負担の入金消込 <<-- 差額が880円以内であれば自動的に支払手数料として推測する。
3.債権一括入金時の消込 <<--これが気になる
4.部分入金時の消込　<<--これが気になる

債権を登録していない入金処理は取引登録

事前に債権を登録しない売上（レジ売上や前受金の入金等）については、[取引メニュー]の[自動で経理]から、決済済みの取引として登録します。


#【freee・会計フリー】「売上請求書→決済は受取手形」の処理をわかりやすく！
https://www.tanakaikei.com/freee-tegata/
【AWS】AWSアカウント取得したら、すぐやること

# AWSアカウント取得したら、すぐやること

以下を実施

- rootユーザのMFA化（多要素認証）
- 管理者IAMユーザーの作成
- 料金アラートを設定

## rootユーザのMFA化（多要素認証）

#### MFA
「multi-factor authentication」の略

https://aws.taf-jp.com/blog/9083#IAM%E3%83%A6%E3%83%BC%E3%82%B6%E4%BD%9C%E6%88%90
>rootユーザのMFA化（多要素認証）

## 管理者IAMユーザーの作成

https://docs.aws.amazon.com/ja_jp/mediapackage/latest/ug/setting-up-create-iam-user.html

AWS アカウント ID のエイリアスの作成

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/console_account-alias.html#CreateAccountAlias

## 料金アラートを設定

CloudWatch で概算請求額をモニタリングする

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/gs_monitor_estimated_charges_with_cloudwatch.html#gs_creating_billing_alarm

>ステップ 2: 請求アラームを作成する
OWASPってなに？

## 勉強前イメージ

セキュリティのなにかのイメージ

## 調査

### OWASPとは

オワスプと読み、`Open Web Application Security Project` の略です。
アメリカ合衆国の非営利組織でwebアプリケーションのセキュリティに関する研究や
脆弱性診断ツールの開発など活動を行っています。
各地にチャプターがあり、日本にも OWASP Japanがあります。

### サービス

OWASPは複数のPJを運用しており、セキュリティの情報共有を行っています。
主なプロジェクトは以下です。

- OWASP ASVS

OWASPが策定したWebアプリケーションに関する網羅的なセキュリティ要件のリスト

- OWASP ZAP

オープンソースのWebアプリケーション脆弱性診断ツールで無料で利用できます。
[こちら](https://www.zaproxy.org/download/)  からダウンロード出来ます。

- OWASP OWTF

セキュリティ基準に沿った効率的な検査ができるツールを開発

- OWASP Testing Guide

既知の脆弱性について内容・検査方法を管理

- OWASP Top10

定期的に発行しているWebセキュリティのレポートで
特にWebセキュリティとして警戒をしなければいけない項目のTOP10を記載

## 勉強後イメージ

セキュリティに関するもろもろ研究してる組織のことか....
元々、OWASP Top10って言う言葉を聞いたことがあってそこから調べてみたけど、
プロジェクトだったのか
今回はOWASPについて調べてみたけど、次はプロジェクトの中身とか見てみようかな

## 参考

- [OWASPとは？開発者が注意すべきセキュリティリスクについて](https://onetech.jp/blog/what-is-owasp-security-risks-that-developers-6884)
- [OWASPとは？ZAP、TOP10、
Testing Guide、ASVSなどを中心に解説](https://www.itmanage.co.jp/column/about-owasp/)
<備忘録>CLionとNucleoF446REでプロジェクトを作る方法

# はじめに
どうもこんにちは、はらしーといいます。この記事はCLion、CubeMX、STM32 Nucleo-F446REを用いて新しいプロジェクトを作る記事です。私の環境では以下の方法でうまくいきましたが、完全にすべての動作を理解しているわけではなく、とりあえずできたというだけで必ずしも正解ではないかもしれないことを予め言っておきます。

## 1. STM32CubeMXでプロジェクトを生成
1. [STM32CubeMX](https://www.stmcu.jp/design/sw_dev/pc_soft/52798/?gclid=Cj0KCQjw38-DBhDpARIsADJ3kjlyvKa0zjjzva-zZ4620yz6mOF9GmG-uW5UnHEPCS-ClroD8nOh-AIaAqUtEALw_wcB)(以下CubeMX)を使ってiocファイルを生成するために、CubeMXを開いてください。
1. 以下のような画面が出てくると思うので、"ACCESS TO BOARD SELECTOR"をクリックしてください。
![スクリーンショット 2021-04-09 130838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/d6f9b4ca-7c38-a8ed-3307-4d7361e5ea89.png)

1. 使用するマイコンボードを選択します。今回は"NUCLEO-F446RE"を選択します。そのあと、右上の"Start Project"を押します。
![スクリーンショット 2021-04-09 132203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/4736c3a2-7d88-d726-7916-2dfe71f9a296.png)


1. プロジェクトのウィンドウが表示されると以下の画像のようになっていると思います。この画面でPINの設定などを行うのですが、設定方法などは別ページに載せます。ここでは、最初の設定のみを行います。
1. まず、上部のタブから"Project Manager"を選択し、プロジェクト名とプロジェクトの保存場所などを設定します。
![スクリーンショット 2021-04-09 134131_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/8fb38624-f0fd-2497-0a0a-1099482445e5.jpeg)

1. 次に、左側のタブから"Code Generator"を選択し、以下の部分にチェックを入れます。(今回、私は以下のようにチェックを入れましたが、好みの部分もあるので好きなように設定してください)
![スクリーンショット_2021-04-08_114422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/f1c45f88-6117-da85-7b4c-200501cbd002.png)

1. 設定できたら右上の"GENERATE CODE"でプロジェクトを出力します。
## 2. Clionでプロジェクトを読み込む
1. "GENERATE CODE"で出力されたプロジェクトフォルダの直下にiocファイルがあるので、このファイルをClionで開きます。開くときにダイアログが表示されるので、"Open as project"を選択します。
1. 開くとBoard Configを設定する画面が開くので、今回は"st_nucleo_f4.cfg"を選択し、"Use"を押します。
![スクリーンショット 2021-04-09 140844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/a894c1b1-d50e-8a4d-2d0e-d5d93fb59c68.png)


1. 読み込むとCMakeLists.txtなどが生成されるので、これでもっとも基本的なプロジェクトが生成されました。<br>(メモ：コンパイルでCmakeがどうのこうのっていうエラーがでたときは"CMakeLists.txt"を再読み込みするとうまくいくことがあります)

# 終わりに
今回はプロジェクトを作成するところまでを書きました。自分用のメモとして書いてみましたが、誰かの助けになれば幸いです。気が向いたらLチカ、ボタン入力、タイマ割込みなどの記事でも書こうかなと思っています。
[MySQL] DBバックアップと復旧する方法

# [MySQL] DBバックアップと復旧する方法


## DBバックアップ

``` 
$ mysqldump -u (ユーザー[ex:root]) -p バックアップするデータベース名 テーブル名1 テーブル名2  > バックアップファイル名.sql

$ mysqldump -u (ユーザー[ex:root]) -p --all-databases > バックアップファイル名.sql
```

## DB復旧

``` 
$ mysql -u (ユーザー[ex:root]) -p 復旧するデータベース名 < バックアップファイル名.sql

$ mysql -u (ユーザー[ex:root]) -p  < バックアップファイル名.sql
```

## DBバックアップ（workbench）
①
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619610/cc22d8af-5ff5-969e-5ef5-8b562ef85fde.png)

②
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619610/9e2bb1d5-368c-8a10-d23c-924f3f8e1761.png)

③
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619610/ec769e7a-cdb0-fd59-ac28-baf6d6cdce39.png)
エクリプスの自動補完設定

Preferencesから

bindingは消して、設定したいボタンを押したらok。

![スクリーンショット 2021-04-13 9.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1220438/13a52997-75f2-4529-2f5f-1d2f3ba1b110.png)
[MySQL] ユーザー追加、削除、権限付与する方法

# [MySQL] ユーザー追加、削除、権限付与する方法


## 接続

``` 
$ mysql -u root -p
```

## ユーザー確認

``` 
mysql> use mysql;

mysql> select host,user from user;
```

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619610/8456ed82-762f-40a2-a68e-0344b94ec436.png)


## ユーザー追加

``` 
mysql> create user 'ユーザー'@'localhost(又は%)' identified by 'パスワード';
```
①%は外部から接続を可能よする設定です。

## ユーザー削除

``` 
mysql> drop user 'ユーザー'@'localhost';
```

## ユーザー権限付与

``` 
mysql> grant all privileges on *.* to 'ユーザー'@'localhost';

mysql> grant all privileges on DB名.* to 'ユーザー'@'localhost';

mysql> grant all privileges on DB名.テーブル名 to 'ユーザー'@'localhost';

mysql> grant select on DB名.テーブル名 to 'ユーザー'@'localhost';

mysql> grant update(カラム2, カラム1) on DB名.テーブル名 to 'ユーザー'@'localhost';
```

①all privieges はすべての権限を付与する意味です。 

②*.*はすべてデータベースそして、すべてのテーブルを指定する意味です。

③@後ろに特定IPを設定できます。

## ユーザー権限削除

``` 
mysql> revoke all on DB名.* from 'ユーザー'@'localhost';
```

## ユーザー権限確認

``` 
mysql> show grants for 'ユーザー'@'localhost';
```
[Rails] CSRF tokenでエラー対応方法

# [Rails]CSRF tokenでエラー対応方法


## CSRF tokenでエラー

``` 
Can't verify CSRF token authenticity.
```

## エラー対応方法

①CSRF tokenをHTMLソースコードに追加する。

``` html
<!DOCTYPE html>
<html>
  <head>
    <title> タイトル </title>
    <%= csrf_meta_tags %>  <<==これを追加する。
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>
```

②ajaxPrefilterにcsrf-tokenを格納する。

``` javascript
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
    var token;
    if (!options.crossDomain) {
    token = $('meta[name="csrf-token"]').attr('content');
       if (token) {
          return jqXHR.setRequestHeader('X-CSRF-Token', token);
        }
     }
 });
```

③headersにcsrf-tokenを格納する。

``` javascript
$(function() {

    $.ajax({
      type: 'PATCH',
      url: '/comments/' + commentId,
      data: {
        comment: {
          body: body
        },
      },
      headers: {
          'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content')
      },
      dataType: 'json',
    }).done(function (data) {

    }).fail(function () {

    });
  })
});
```
DIVからの脱却 〜section article aside nav〜

とりあえずdivで囲っておけば大丈夫となりがちになるほどdivはよく利用されてしまいます。
しかしSEO的やメンテナンスする際にそのdivがどのような意味を持つのかがわかりません。
ですので、クローラーに正しく認識してもらうため、メンテナンスしやすいためにdivではなく、セクションコンテンツを利用すべきということで、ここではdivではなくセクションコンテンツを使おう！ということをいいたいと思います。


#セクションコンテンツとは？
セクションコンテンツは４つの要素に分類されます。
**section article aside nav** の4つです。
これらそれぞれが１つのセクションであることを表します。

##section
section要素は、章や節のことをさします。
またsection要素にはh2などの見出し要素はセットで使われます。

```section.html
<section>
  <h1>プロフィール</h1>
  <p>初めまして・・・</p>
</section>
```

##article
article要素は、ニュースやブログ記事などのそれだけで自己完結していて、セクションの中で独立しているもの。

```article.html
<article>
　<section>
　　<h2>記事</h2>
　　<p>本文</p>
　　<h3>小見出し</h3>
　　<p>本文</p>
　</section>
</article>
```

##aside
aside要素は、例えば広告や補足記事など、メインコンテンツとか関連性が薄い内容の場合はこちらを使用します。

```aside.html
<aside>
　<section>
　　<h2>広告</h2>
　　<ul>
　　 <li><a href="#">広告１</a></li>
　　 <li><a href="#">広告2</a></li>
　　 <li><a href="#">広告3</a></li>
　　</ul>
　</section>
</aside>
```

##nav
nav要素は、ナビゲーションである場合に使用します。
ただナビならなんでもいいというわけでなく、主要のナビゲーションだけに使います。
よってサブメニューには使いません。

```nav.html
<nav>
　<h1>グローバルナビゲーション</h1>
　<ul>
　　<li><a href="#">MENU1</a></li>
　　<li><a href="#">MENU2</a></li>
　　<li><a href="#">MENU3</a></li>
　　<li><a href="#">MENU4</a></li>
　　<li><a href="#">MENU5</a></li>
　</ul>
</nav>
```

#div
w3gによると
> div要素（division）は区切りを意味するブロックレベル要素です。この要素自身が特に意味を持っているわけではなく、他の要素をグループ化（含まれた内容を一つの単位とする）し、文書に構造を付加することで文書の情報的価値を高めます。

と書かれています。
div要素自体は意味はなくデザインやレイアウトのためにdiv要素を使用するといった使い方があってるのかもしれません。

#とりあえずdivで囲っておけばいいやは ❌
divやsectionやarticleの違いがわからなくて、じゃあdivで囲えばいいやと思っていたのが、
しっかりとそれぞれの用途を理解すればgoogleのクローラーにも理解できるような、メンテナンスする際にもみやすく、わかりやすいようにセクションコンテンツを使っていけるともっといいコードに近づけるのではないかと思います。
拡張メモの内容を取引先オブジェクトに更新する2

前回の続きです。

どうやってもうまく行かないので、タイミングをずらす戦略に出ます。

取引先オブジェクトにはContentNoteのIdだけを記録して、取引先のAfter Updateトリガーで拡張メモを読みに行って
値を取得させる。

これなら、大丈夫じゃないのと超期待。

```
trigger NoteToAccount3 on Account (after update) {
	System.debug('############ NoteToAccount3 ##################');
    Map<Id, Account> aOldMap = new Map<Id, Account>();
    if (Trigger.Old != null) {
        aOldMap = new Map<Id, Account>(Trigger.Old);
    } else {
        aOldMap = new Map<Id, Account>();
    }
    
    Set<Id> ContentIdSet = new Set<Id>();
    for(Account accNew : Trigger.New){
        Account accOld = aOldMap.get(accNew.Id);
        if (accOld != null) {
            if (accOld.ContentId__c != accNew.ContentId__c) {
                if (accNew.ContentId__c != null) ContentIdSet.add(accNew.ContentId__c);
            }
        }
    }
    
    Map<Id,ContentNote> ContentNoteMap = new Map<Id,ContentNote>();
    List<ContentNote> ContentNoteList = [SELECT Id,Title,TextPreview,CreatedDate,Content FROM ContentNote WHERE ID =: ContentIdSet];
    for (ContentNote cn :ContentNoteList){
        ContentNoteMap.put(cn.Id,cn);
    }
    
    List<Account> updateAccountList = new List<Account>();
	for(Account accNew : Trigger.New){
        ContentNote cn = ContentNoteMap.get(accNew.ContentId__c);
        if (cn != null){
            Account acc = new Account();
            acc.Id = accNew.Id;
            acc.TextPreview__c = cn.Content.toString();
            System.debug('############ acc ##################' + cn.Content.toString());// NG null
            updateAccountList.add(acc);
            
        }
    }
    
	if (updateAccountList.size() > 0) update updateAccountList;    
}

```

結果はダメですねぇ。何でだろう。開発者コンソールでSOQLたたくとちゃんと値があるのに
トリガーでは取得できない。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/037b81fc-9a34-daa8-b9d7-556ae655f111.png)


じゃぁ、Anonymous windowsではどうだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/20d227e9-55da-5ce7-7e84-de86ee65aade.png)



ちゃんと値が取れますねぇ。２段階のトリガーでもタイミングが早いってこと？

次に考えられるのは、取引先の更新をApexバッチにしてもっとタイミングを遠くすることかな。
Service Cloud の効率性 ⇒ Analytics を使用したインサイトの収集および収益性の向上

１．Service Analytics によってチームは何ができますか?
２．Service Analytics では、カスタマーエクスペリエンスを改善するために、エージェントはどのようなことを行えますか?
３．Service Analytics では、KPI をどのように設定できますか?
４．Einstein Discovery はデータの解析完了後に何を生成しますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/ba2350af-9da8-c31c-8f6d-7761b2513f62.png)
レガシーコード改善ガイド 1章 ソフトウェアの変更

# 前提
レガシーコード改善ガイドのoutputを章ごとにやってます。
自分のoutputとある程度の人に伝わったらラッキー程度の考えを前提にしているので、分かりやすい記事ではないです。
イラストもないので、完全に理解したい人は書籍を読みましょう。

# 概要
変更の種類と変更されるものの対応表が以下になる。リファクタリングをするときは基本的にinput/outputは変更されず、構造だけが変わる。これを行うためにはテストが必要である。

||要件追加|バグ修正|リファクタリング|最適化|
|--|--|--|--|--|
|構造|o|o|o||
|新機能|o||||
|既存機能||o|||
|リソース利用||||o|

しかし、テストがないコードがテストしやすいコードになっていることはまれであり、基本的にはテストコードを書くためにリファクタリングが必要になる。このテストコードを書くためにリファクタリングをする際にももちろんinput/outputを変更してはいけない。このinput/outputをかえずにうまくテストができる状態にする方法を本書籍では紹介している。
またPRを作成するときはこの4つの指針に則って、複数目的のPRを作成しないようにするのがベストである。
【SQL】SQLとMySQLの違いをざっくり解説　no.2

![見出しを追加 - 2021-04-13T083659.875.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3386862f-d5eb-7aaa-9248-b9801e694e78.png)


こんにちは、まゆみです

SQLについての記事をシリーズで書いています

今回は第2回目になります

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/5d6e7160c868178f7122)では、『SQLとNoSQL』の違いや、それぞれの長所・短所について書かせていただきました。


今回は、<font color="Red">『SQLとMySQL』の違い</font>について書かせていただきます

ではさっそく始めていきますね。


#DatabaseとDatabase Management System について
![見出しを追加 - 2021-04-13T080711.718.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a2786eb6-2038-00d4-2238-c5ada24b9c5d.png)

SQLについて話す前に、<font color="Red">Database とDatabase Management Systemとは一体何か？</font>についても話しておきますね。


例えばあなたが、マッチングアプリを使っているとします。

その時、会員の写真・プロフィール・個人情報などデータが整理されて格納されているものが『Database』です。

そのDatabase をアップデートしたり、削除したりするための橋渡しをしてくれるのが『Database Management System』(DBMS)になります。

情報を整理整頓して蓄えている図書館をDatabaseと例えれば、その情報を管理している図書館司書がDatabase Management System とも言うことができますね。

#SQL vs MySQL
SQLはStructured Query Language と名前に『language(言語)』がついていることからもわかるように、<font color="Red">Databaseに語りかける言語そのもの</font>になります。

>プログラミングにおいてデータベースへのアクセスのために、他のプログラミング言語と併用される。
引用元：[wikipedia(SQL)](https://ja.wikipedia.org/wiki/MySQL)

そしてMySQLはDatabase Management System の名称だということができます

>MySQL（マイ・エスキューエル、英語圏ではマイ・シークルとも）は、オープンソースのリレーショナルデータベース管理システム(RDBMS)である。
引用元：[wikipedia(MySQL)](https://ja.wikipedia.org/wiki/MySQL)

#まとめ
今回の記事はここで締めくくらせていただきます。

SQLを使うDatabase Management System はMySQL以外にもあり、MySQLでSQLを使った命令の仕方を習得すれば、他のDatabase Management System にスイッチするのは比較的簡単でしょう

Database Management Systemに色々な種類があるのは、そこで使われている言語が違うからではなく、それぞれのDatabase Management Systemが違った特色を持つからです。

では次回はいよいよ、SQLの書き方について書いていきます。
Blockchain界隈の情報収集をするために役立つサイト

## はじめに

普段Blockchainに関する情報収集に使っているサイトを紹介します。

## サイト集

https://blockchainmedia.asia/

https://crypto.watch.impress.co.jp/

https://www.coindeskjapan.com/

https://coinchoice.net/

https://jp.cointelegraph.com/

https://coinpost.jp/
【小ネタ】AS番号とは

https://www.infraexpert.com/study/bgpz01.html

# 要約

BGPでは、インターネット上での各ASを識別するために
番号を割り当てています。この番号がAS番号

ISP以外にも、大企業、学術研究機関なども1つのASが割り当てられている。AS番号はICANNという組織によって、RIR（Reginal Internet Registry）にブロック単位で割り当てられる。日本ではJPINICやAPNICがAS番号の割り当てを管理しています。

## 表

|AS番号|AS番号の範囲|用途|
|:---|:---|:---|
|グローバルAS番号|1 ～ 64511|インターネット全体で一意のAS番号|
|プライベートAS番号|64512 ～　65535|組織内部で自由に使用できるAS番号|
企業まとめ

Amazon    ・・ECサイト　Amazon.com　やクラウドサービスプラットフォーム　AWS
Apple     ・・プロダクトカンパニー　「Products（製品）」と「Services（サービス）」
Evernote  ・・パソコンやスマートフォン向けの個人用ドキュメント管理システム
Facebook  ・・SNS、ネット広告事業
Google    ・・検索、ネット広告事業
LinkedIn  ・・SNS、ネット広告事業
Microsoft ・・プロダクトカンパニー
Oracle    ・・プロダクトカンパニー
Yelp      ・・ローカルビジネスレビューサイト　アメリカ版食べログ　ぐるなび
Zynga     ・・ソーシャルゲーム会社
フロントで利用する単位について

職場で、単位についての研修があったので、それのまとめです。

#タグの大きさ指定

##px
1dot(ドット)＝１px(ピクセル)
パソコンの画面の表示は小さな点の集合体で構成されていて、その最小単位が1dot

##%
**親**に対して何％の表示をするか

##vw(viewportwidth)
**画面幅**に対して何%の表示をするか


#文字の大きさ指定
##%
**親**に対して何％の表示をするか
何もしていなければHTMLの初期値からの倍率
HTMLの初期値=16px

##em
1em=1文字
※現在はスマホやPCの表示に柔軟に対応できないため、利用されるケースは少ない

##rem
emの上位互換
htmlタグを親として倍率調整する。
【TypeScript】PickとOmit

TypeScript 初心者です。
React の型定義で Pick と Omit について学習したのでまとめてみました。

# Pick

`Pick<T, K>` は既に存在する T 型の中から K で選択したプロパティのみを含んだ新たな型を構築する。
下記の例では、`User`型の `name` と `email` のみを含んだ `UserItem`型を作成している。

```ts
type User = {
  id: string;
  name: string;
  email: string;
  address: string;
};

type UserItem = Pick<User, "name" | "email">;
// | で複数指定可

const user: UserItem = {
  name: "hoge",
  email: "hoge@example.com",
};

console.log(user); // => {name: "hoge", email: "hoge@example.com"}
```

# Omit

`Omit<T, K>`は既に存在する T 型の中から K で選択したプロパティを除いた新たな型を構築する。
下記の例では、`User` から `id` と `address` を除いた `UserItem`型を作成している。

```ts
type User = {
  id: string;
  name: string;
  email: string;
  address: string;
};

type UserItem = Omit<User, "id" | "address">;

const user: UserItem = {
  name: "hoge",
  email: "fuga",
};

console.log(user); //=> {name: "hoge", email: "hoge@example.com"}
```
AWS CLI EC2 Reserved Instance を一覧(CSV)にする

AWS CLI を使って EC2 リザーブドインスタンスを一覧にします。

```sh
aws ec2 describe-reserved-instances --filter Name=state,Values=active | \
jq -r ".ReservedInstances[] | [.Duration, .End, .InstanceCount, .InstanceType, .ProductDescription, .State, .InstanceTenancy, .RecurringCharges[0].Amount, .OfferingClass, .OfferingType, .Scope] | @csv"
```

## 解説

2つのコマンドをパイプで繋いでいます。

### JSON 取得

```sh
aws ec2 describe-reserved-instances --filter Name=state,Values=active
```

これでアクティブな EC2 Reserved Instance が JSON で取得できます。

結果は次のようになります。

```json
{
    "ReservedInstances": [
        {
            "Duration": 31536000,
            "End": "2020-04-30T07:17:45+00:00",
            "FixedPrice": 0.0,
            "InstanceCount": 1,
            "InstanceType": "t2.micro",
            "ProductDescription": "Linux/UNIX (Amazon VPC)",
            "ReservedInstancesId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "Start": "2019-04-30T07:17:46+00:00",
            "State": "active",
            "UsagePrice": 0.0,
            "CurrencyCode": "USD",
            "InstanceTenancy": "default",
            "OfferingClass": "standard",
            "OfferingType": "No Upfront",
            "RecurringCharges": [
                {
                    "Amount": 0.01000,
                    "Frequency": "Hourly"
                }
            ],
            "Scope": "Region"
        },
```

アクティブでないものも取得したい場合は `--filter` を削除します。

### JSON を CSV に変換

jq コマンド を使ってCSVに変換します。 AWS CloudShell でも使えます。

```sh
jq -r ".ReservedInstances[] | [.Duration, .End, .InstanceCount, .InstanceCount, .ProductDescription, .State, .InstanceTenancy, .RecurringCharges[0].Amount, .OfferingClass, .OfferingType, .Scope] | @csv"
```
SQLのNULLについて思ったこと・考えたこと(学習まとめ)

#初めに(前書き)

巷やSQL界隈では有名な書籍には、"NULLは値ではない"とかなんとか書かれていますが、これについての(筆者の素朴な)疑問について書き留めておきたいと思いました。また、NULLについて言われている従来の説(？)だとかに(恐れ知らずにも)(勝手ながら)批判をしていきたいと思います・・・(笑)。



#本題(本文)

いきなりですが、SQL界隈に出てくる"NULLは値ではない"、とする主張が正しいとすると、なぜ、NULLが演算の結果として出てくるのでしょうか？。そもそもなぜNULLを含む演算ができるのでしょうか？。※これ以前に、コンピューターは(なんらかの)値を入力として、その値について演算をして、値を出力する機械装置のはずですが・・・。
それに、SQLで使われる「NOT NULL制約」は特定のカラムがNULLとならないようにする機能なのですが、これはどう考えても、そのカラムが(NULLであれば、)"NULLである状態を表す値"を参照しているはずなので、表向きにはそれはマークだとか、記号だとかいって誤魔化しているだけなのではないでしょうか・・・。
また、SQLには「IS NULL」と「IS NOT NULL」という二つの"述語"が用意されていますが、同じ機能を"式"として実装しなかっただけで、DBシステム内部でやっていること(演算としての機能)は両者同じはずです。



#最後に(後書き)

今回は珍しく、(やや)批判的な記事を書かせていただきましたが、もしも、これを読まれた方が不快に感じられたなら申し訳なさで一杯です・・・。次回もまた懲りずに記事を書いていこうと思います。ありがとうございました。それではまた～。
各種RDBに格納できる文字列の最大長

| | MySQL5.6 | PostgreSQL12.4 | SQL Server 2019 |
| - | - | - | - |
|型|longtext|text|nvarchar(MAX)|
|最大サイズ|約4ギガバイト|約1ギガバイト|約2ギガバイト
|最大文字数|約20億文字|約5億文字|約10億文字
|参考|*1|*2|*3
*1 https://dev.mysql.com/doc/refman/5.6/ja/string-type-overview.html
*2 https://www.postgresql.jp/document/12/html/datatype-character.html
*3 https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql

文字数は、最大バイト数からUTF-16の2バイト文字で概算しています。
補助文字を使用した場合や、（MySQLやPostgreSQLで）別の文字エンコーディングを使用した場合など誤差が生じます。

なお、この記事を書いた時点で日本語wikipediaの最長ページは「英雄伝説 軌跡シリーズの登場人物」の1,391,754バイト（約40万文字）だそうなので、余裕で格納できますね。

RDBの選定にあたって、文字列サイズの制限を気にする必要はなさそうです。

参考：
https://qiita.com/marcodi/items/fe35e066d270306e0256
ラズパイ4に純正ファン

# はじめに

ラズパイ4はラズパイ3から性能が上がった分だけ発熱も大きくなった。

すでにサードパーティーからラズパイ4用のファン付きケースは多数販売されていたが、[ラズパイ４用公式ケース](https://www.raspberrypi.org/products/raspberry-pi-4-case/)にポン付けできる安価な[純正ファン](https://www.raspberrypi.org/products/raspberry-pi-4-case-fan/)が年末年始にかけて発売された。（[スイッチサイエンス](https://www.switch-science.com/catalog/6827/)だと700円程度）

年末年始にかけて初期不良確認がてらラズパイ4で[Rosetta@home](https://boinc.bakerlab.org/rosetta/)（新型コロナ(COVID-19)の解析をサポートするプロジェクト用ソフトウェア）を動かしていたが、ケースがそこそこ熱くなっていたので純正ファンを導入してみた。

# 導入方法

導入方法はきわめて簡単。ケースに嵌めてファンのピンをラズパイ４のGPIOピンに刺す。このままだと常時フル回転になるので、温度制御したければ`Raspberry Piの設定`メニューか`raspi-config`コマンドを実行してファンが(フル)回転する閾値の温度を指定をすればよい（再起動が必要）。

なお、どちらの制御方法でも**シャットダウン後はファンはフル回転**する。ファンを止めるには電源供給を止める必要がある。(この点は使いづらい)

# 効果

純正ファンの効果は大きい。[公式ブログ](https://www.raspberrypi.org/blog/designing-the-raspberry-pi-case-fan/)によれば[ファンをつけるとケースなしよりも冷える](https://www.raspberrypi.org/app/uploads/2020/12/all_final-800x333.png)ようだ。

Raspberry pi OSではないが別の環境(Ubuntu 20.04 (LTS)でRosetta@homeを連続実行)だと、ファンなしだとCPU温度が83℃のところ、ファンありで53℃まで下がった（室温約20℃の時）

|         |CPU温度|効果|
|:-------:|-----:|---:|
|ファンなし|83℃|     |
|ファンあり|53℃|-30℃|

# 感想

25mm角のファンなのでしかたがないが、ファンが回り始めると**耳障りでうるさい**。

簡易的にスマホのアプリで計測すると45～55dBくらいで決して大きい騒音レベルではないが、ファンの径が小さいために高音系で個人的にはかなり気になる。ただし、机の下に設置して音楽をかけたりすれば気にはならないレベルではある。

公式の制御方法だと常時フル回転か温度制御(一定温度以上になるとフル回転)だが、どちらも**耳障りでうるさい**。これをPWM制御(温度による多段階制御)に変えても**耳障りでうるさい**。どんなに細かく制御しても一定スピード以上になると音が変化するだけで**耳障りでうるさい**

**公式ケースにポン付けできて安価な点は非常に評価できる**。教育用途やワークショップ等で一時的に動作させるのであれば十分だろう。ただし、サーバー用途などで高負荷連続使用するなら発熱して`サーマルスロットリング`[^サーマルスロットリング注釈]くらってもサードパーティー製のファンレス金属ケースの方がよいと思う。


<!-- (注釈)コロンの後ろの半角スペースを忘れない！-->
[^サーマルスロットリング注釈]: CPU温度が一定以上になった時にCPUが壊れないように性能を落として発熱を抑える機能。
VScode便利機能まとめ(Mac用)

# はじめに
Mac用のVScode便利機能とショートカットのまとめ(ほぼ自分用)
随時更新予定

# 目次
1. [ショートカット](#Chapter1)

２. [便利機能](#Chapter2)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# ショートカット
拡大　Shift+command+「れ」
縮小　command+「ろ」


<a id="#Chapter2"></a>
# 便利機能
追加予定
MongoDBでのユーザの作成＆削除

# はじめに
以前[MongoDBのインストール方法と認証設定](https://qiita.com/sirius1000/items/7bd8a175f3ff8efc29c9)について記事にしました．

その中でrootユーザを作成する際に
![スクリーンショット 2021-04-13 1.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/d47391d7-add9-b5c1-5b8a-de5e96849a3b.png)
この部分をコピー＆ペーストし，ユーザ名：mongo/パスワード：passwordにしてしまう人が一定するいるという報告を受けましたので今回は間違えて作ってしまったユーザを削除する方法について説明します．

# ユーザの作成
まずおさらいですが，最初のユーザの作り方は上記にもある通りです．

```shell
$ mongo
> use admin
switched to db admin
> db.createUser({user:"mongo"(※任意), pwd:"password"(※要変更), roles:["root"(※ここではroot(一番強い権限)ですが任意に権限の強さは変えて問題ありません))]})
```
※コピペできないようにコードに注意書きを入れておきました💫

上記を入力した後`Successfully added user: `となればOKです

# ユーザの削除
では間違えて作成した場合の削除方法を説明します．
今回は上記にてrootでユーザを作成した場合を想定しています．

### 1.ログアウト
まず一度MongoDBからログアウトします．

```
> exit
bye
```

### 2.間違ったユーザでログイン
次に間違って作成したrootユーザでログインします．
(ユーザ名：mongo/パスワード：passwordで作成した場合のログイン方法)

```shell
$ mongo -u mongo
password: password(通常は見えない)
```

### 3.正しいユーザを追加
そして本来作りたかったユーザを作成します．
作り方は上記の「ユーザの作成」と全く同じです．

### 4.ログアウトします
そしてユーザ名:mongoからログアウト

### 5. 新しく作成したユーザでログイン
ログイン方法は上記と一緒．
新しく作成した内容で入力してください．

### 6.間違えたユーザを削除
最後です．ユーザを削除します．

```sh
> use admin
switched to db admin
> db.dropUser("mongo"←間違って作成したユーザ名を入力))
true
```

上記コマンドを実行し，最終的に`true`と出力されればOKです

### おまけ：確認

```sh
sugimokazu@sugimobank:/var/www/html$ mongo -u mongo
MongoDB shell version v4.0.23
Enter password:
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
2021-04-12T16:22:24.467+0000 E QUERY    [js] Error: Authentication failed. :
connect@src/mongo/shell/mongo.js:356:17
@(connect):2:6
exception: connect failed
```

削除したユーザでログインできないようになっていれば終了です．


# おわりに
何もかもコピペするのはよくないと，改めて感じました💫
Rubyの:(コロン)の種類

# Rubyの：（コロン）の種類について

Rubyを学習していて当たり前のように使っていた:(コロン)。
たくさんの種類がある事を知らずに何となくで使用していました。
基本を押さえておけば、後々の学習にも役立つと思いまとめました。

この記事はUdemyの以下の講座を参考にまとめさせて頂きました。
無料で公開されているなので、気になる方は是非。
[Udemy](https://www.udemy.com/course/ruby-on-rails-c/)

# :(コロン)の種類

## シンボル

```ruby:qiita.rb
:asdf
```

文字列の先頭にコロンがある場合は、シンボルのコロン。
シンボルは文字列の上位版。
シンボルは重複を許さず、シンボルの中身が同じであれば、コンピュータ内部では１箇所に保存され、処理速度がちょっと速くなったりするらしい。
文字列の場合は、中身が同じであってもコンピュータ内部では、別々の保存領域が必要。


## シンボルをキーにしたハッシュの定義

まずはハッシュがどういうものかというと、

```ruby:qiita.rb
hash1 = { キー1 => バリュー1, キー2 => バリュー2, キー3 => バリュー3 }
```

キーとバリューがセットになっているのがハッシュ。

ちなみに配列は重複した値を[]内に入れる事ができますが、ハッシュは重複（duplicated）したキーで違う値を定義することはできません。

ここまでの内容でわかったことは、
・ハッシュのキーはキー同士の重複を許さない
・シンボルもコンピュータの内部上、重複を許さない
この重複を許さない性質をもつハッシュとシンボルは非常に相性がいい。

そしてハッシュは次のように定義ができる。

```ruby:qiita.rb
hash1 = { "key1" => "value1", "key2" => "value2", "key3" => "value3" }

hash2 = { :key => "value" }
/これが正式な書き方/

hash2 = { key: "value" }
/これはシンボルをキーにした省略系の書き方/

```
つまり、{}の中の後ろコロンは、シンボルをキーにしたハッシュのコロンというわけです。

## メソッドのキーワード引数

メソッドとは、よく自動販売機に例えられます。
自動販売機は、お金を入れてボタンを押すとジュースが出てきます。
メソッドは、引数を渡してメソッドを実行すると戻り値が返ってきます。

何かを入れて、何を実行すると、何かが返ってくるものがメソッド。

キーワード引数を使用したメソッドは以下のようになります。

```ruby:qiita.rb
/普通の引数とメソッド/
def add(hikisu1, hikisu2)
 kotae = hikisu1 + hikisu2
 return kotae
end

puts add(3, 4)

/キーワード引数とメソッド/
def add(hikisu1:, hikisu2:)
 kotae = hikisu1 + hikisu2
 return kotae
end

puts add(hikisu: 3, hikisu2: 4)

```

そしてキーワード引数には以下の特徴があります。

* 引数に見出し(タイトルをつける事ができる)
* キーワード引数は順番が入れ替わってもOK
* 通常の引数と一緒に使える
* メソッドの呼び出しは括弧を省略できる

railsを使っているとこんなコードをよく見かけます。

```ruby:qiita.rb
render ("users/user", user: @user)
/（）は省略可/
```

１つ目は普通の引数ですが、user: @userの部分はキーワード引数です。
メソッドを呼び出す時の引数として後ろコロンが使われていたら、それはキーワード引数。


# よく見るコードの解説

ここまで理解ができればきっと次のコロンもどんなものかがわかるはず。

```ruby:qiita.rb
validates :content, presence: true, length: { maximum: 50 } 
```

validatesというメソッドがあって、それに対する引数が記述されています。
以下がvalidatesメソッドに渡されている引数たち。

```ruby:qiita.rb
:content  
→先頭にコロンがあるのでシンボル！

presence: true
→validatesメソッドの引数部分で後ろコロンなのでキーワード引数
 presence:というキーワード引数は、trueですよって渡してる（presenceという見出しをつけてる）

length: 
→validatesメソッドの引数部分で後ろコロンなのでキーワード引数

{ maximum: 50 }
→波括弧があるからこれはハッシュ
 ハッシュの内側で後ろコロンは、シンボルをキーにしたハッシュ。

```

続いてこちら

```ruby:qiita.rb

<%= link_to '削除する', @post,
        method: :delete, 
        data: { confirm: '本当に削除してOK？'} %>

```

細かく分解していくと、

```ruby:qiita.rb

link_to 
→これがまずメソッドになります。そしてlink_to以下はメソッドに与えられた引数。

'削除する'
@post
→それぞれ第一引数、第二引数。

method: 
→キーワード引数

:delete
→シンボル

:data
→キーワード引数

{ confirm: '本当に削除してOK？'}
→波括弧はハッシュ。
 ハッシュの内側に後ろコロンがあるから、シンボルをキーにしたハッシュ。

```

# まとめ

* 先頭にコロンがあったらシンボル
* ハッシュの内側に後ろコロンが会ったら、シンボルをキーにしたハッシュ
* メソッドの引数部分に後ろコロンがあったら、メソッドのキーワード引数
Javaでボゴソートを作ってみた

# ボゴソートの概要
- ソートアルゴリズムの一つ
- 配列内の要素を、シャッフルして昇順か降順で並び続けるまで<font color="red">ひたすら繰り返す</font>
- 完了するまでかかる時間は非常に長く、最悪無限になる可能性もある。
- 実用性は無く、遊びのネタ

# 手順
- 整数型のListを用いて、ソートを行う
- 昇順に並ぶまで、シャッフルを行う
- 昇順に並んだら、終了 

# 開発環境
- Windows 10
- OpenJDK 15.0.2

# ソースコード
```Java:BogoSort.java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class BogoSort {
    public static void main(String[] args){
        //初期化
        List<Integer> list = Arrays.asList(5,1,2,3,4);
        //trueが返されるまで、ひたすら繰り返す
        while(isAscendingOrder(list)==false){
            // シャッフルを行うメソッド
            Collections.shuffle(list);
            // 途中経過が見れる
            System.out.println(list);
        }
    }

    //List内の要素の並びが昇順ならば、trueを返す
    public static boolean isAscendingOrder(List<Integer> list){
        int i=0;
        for(;i<=list.size()-2 && list.get(i)<=list.get(i+1);i++);
        if(i==list.size()-1){
            return true;
        }
        return false;
    }
}
```

# 動かしてみる
時間を計測して、どのくらい時間がかかるかを測定してみる
まず、ソースコードを次のように変更

```Java
    public static void main(String[] args){
        long startTime = System.currentTimeMillis();
        List<Integer> list = Arrays.asList(5,1,2,3,4);
        while(isAscendingOrder(list)==false){
            Collections.shuffle(list);
            //System.out.println(list);
        }
        System.out.println(list);
        long endTime = System.currentTimeMillis();
        System.out.println("処理時間:"+(endTime-startTime)+"ms");
    }
```

listに代入する要素の内容、個数別に計測する
昇順になったlistの内容と、処理時間を表示する
スペックは割愛

## 結果
- 要素数5個の場合(内容:5,1,2,3,4)

```
[1, 2, 3, 4, 5]
処理時間:2ms
```
10回実行したが、0～2ミリ秒で終わった

- 要素数6個の場合(内容:6,1,2,3,4,5)

```
[1, 2, 3, 4, 5, 6]
処理時間:2ms
```
1～6ミリ秒で終わる

- 要素数10個の場合(内容:10,1,2,3,4,5,6,7,8,9)

```
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
処理時間:856ms
```

最小2ミリ、最大で約3000ミリ秒もかかった

- 要素数11個の場合(内容:11,1,2,3,4,・・・10)


```
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
処理時間:10161ms
```

3回試行した結果が、5000ミリ秒台が2回、10000ミリ秒台が１回だった

# 感想
ボゴソートがどのくらい効率が悪いのかが体感できました。
15個以上はいつ終わるか分からなかったので測定できませんでしたが、非常に面白かったです。

# 参考にしたサイト - 追記(2021/4/13)
載せ忘れてたので、追記しました。
[ボゴソート - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%B4%E3%82%BD%E3%83%BC%E3%83%88)
[Java - 配列をシャッフルする - 覚えたら書く](https://blog.y-yuki.net/entry/2018/08/22/094000)
PowerQueryで複数の列を一度にピボットする

#ピボット化って便利ですよね

たとえば、こんな家計簿があって
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/5b8df7f0-6bdb-87bf-8a58-c75657355d41.png)

項目を選んで、列のピボット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/76ca2bce-1787-395f-6f11-731bc034eb89.png)

すると、こうなるので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/7a6402a9-df3b-0a5b-3d07-a119b8cc9e0c.png)

　…あ、２月の交通費忘れてるわ。とか、２月の家賃入力間違えたわ。とかよく見えるわけですね。
　（後々集計しにくくなることもあるので、あくまで人間用のデータというか、見た目重視な変換ではありますが）

#複数の列をピボット化したい日もある

例えばこんなデータを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/5038c834-5a66-3a85-b35c-53dcaaf0aa5d.png)

こうしたい場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/d55f1647-737b-ba86-1625-8cff0bae921b.png)
　~~（理系科目ヒドイデスネ）~~

#そのままピボット化しようとする
##学期を選んで「列のピボット」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/af5de942-72a0-89f3-5406-f19499f96a6b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/ede66b36-d5fe-d345-b561-31cd94456efa.png)
　…ん？
##値列に持ってこれるのって一列だけなの！？
無理やり「点数」だけ選択して変換すると、欲しかったのはコレジャナイ 仕上がりに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/2935dbc8-12c5-66b2-bcee-1831fd72650b.png)

じゃあ、どうするか…？

#変換かけたい列が1つならいいってこと！

##まず、グループ化かけちゃう！
まずは、行タイトルと列タイトルに使いたい、「学期」と「科目」を選んで、「グループ化」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/1b62f48e-b850-8556-a10a-10290a7b7001.png)

グループ化の条件に「学期」と「科目」があることを確認し、
「新しい列名」にわかりやすそうな名前を付けて　「操作」で「すべての行」を選択→OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/b9b967a6-65f7-ed2a-2efc-cba8252e69f3.png)

##変換かけたい列が１つになったじゃん！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/1460a390-8f59-a365-dee4-a07d76a36066.png)

そうしたら、「学期」を選んで「列のピボット」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/9c089bd1-739b-4d10-64c2-3fe3f5412511.png)

「値」にさっき作った「グループ化」列を選んで、「値の集計関数」に「集計しない」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/2c520ae6-0805-49fb-918c-9b57d210fda8.png)

##あとは展開するだけ！
無事、目的の表形式まで持ってこられたので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/f2b2c411-8760-702a-b7fb-08a70dc709ee.png)


あとは展開するのみ！
「↰↱」を選んで、必要な列にチェックを入れて、展開！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/d0a4dc93-96c8-87cd-34ea-260fbac206c1.png)
　いい感じ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/0273a6bd-93e7-2539-fd80-e0da1aa10939.png)

全部展開すると、こうなる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/4299de3c-11d8-22cb-21bb-7e33e1742c9e.png)

もちろん、方法はいろいろあると思いますが、こんな解法もありますってことで！
C++勉強備忘録２

###教材...1と同じ

#1日目

###HelloWorld の出力

``` C++
#include<iostream>

using namespace std;

int main() {
	cout << "HelloWorld" << endl;
	return 0;
}
```
 

Cのprintf()などを使ってもできるが、C++の特有の方法で実行してみる。

iostream…ヘッダ（Cのヘッダファイルと混同しないこと。.hは要らないよ）
using namespace std;…using namespace 指定された名前の名前空間を使う宣言
cout…標準名前空間を利用する


coutについて
Cのprintfと同じような働きをするもの。関数ではなく、オブジェクトであり、標準入出力の出力をつかさどる。<<や>>でHelloWorld を送り出している。

endl…改行。\ｎも使えるが、こっちが一般的。


標準名前空間について
名前空間とは…大規模開発の際に名前が重複して使えなくなることを防ぐもの。
名前空間が違えば同じ名前の変数が使える。
同じ名前空間上では同じ名前を使えない（それはそう）


名前空間の利用
標準名前空間…もともとC++に備わっている名前空間で、stdと表記する。
ユーザーが独自に定義する名前空間も存在する。

using namespace (名前空間名);
もしくは
(名前空間名)::(変数名・クラス名など）
標準名前空間を使うのならば、名前空間名の部分がstdになる。
ex

``` C++
#include <iostream>
 
int main(){
    std::cout << "HelloWorld." << std::endl;
    return 0;
}
```



###コンソールから入力

```C++
#include<iostream>

using namespace std;

int main() {
	int a;
	cin >> a;
	cout << "a=" << a << endl;
	return 0;
}
```


コンソールから数値を入力して表示するプログラム。
cin…標準名前空間に含まれる命令。Cのscanfに相当する処理。
値を整数型変数aに代入して表示している。
cout…連続して複数の物を表示する場合、間を＜＜で挟む
→この場合、”a=”,aの値,endlの順に処理される。


ストリームの概念
ストリーム…cinやcoutはストリームと呼ばれるものに対してデータを送り込んだり受け取ったりするもの。
cin coutはそのストリームからデータのやり取りをしている。ストリームで入出力の対象を切り替えているイメージ。


###Stringと文字列

```C++
#include<iostream>
#include<string>

using namespace std;

int main() {
	string s, t;
	t = "入力された文字は、";
	cout << "文字列を入力：";
	cin >> s;
	cout << t + s << "です。" << endl;
	return 0;
}
```
 

実行すると「文字列を入力：」と出力され、入力待ち状態になる。任意の文字列を入力してEnterを押すと、「入力された文字は～」と表示される。

文字列を扱うにはstringというヘッダファイルをincludeする必要がある。（C言語のヘッダファイルのstring.hとは違うので注意が必要。

Stringでは、+,+=,==,!=,>,<のような演算子を用いることができる。

##課題(コードのみ表示）
####C++と表示させるプログラム

```C++
#include<iostream>

using namespace std;

int main() {
	cout << "C++" << endl;
	return 0;
}
```

####using namespace...を使わずに表示

```C++
#include<iostream>

int main() {
	printf ("programming in C++ Language\n" );
	return 0;
}
```

####cout一つ、1行で表示

```C++
#include<iostream>

using namespace std;

int main() {
	cout << "ONE TWO THREE" << endl << "FOUR FIVE SIX" <<endl;
	return 0;
}
```

####任意の数値を入力し、それを２倍する

``` C++
#include<iostream>

using namespace std;

int main() {
	int t;
	cout << "数値を入力してください：";
	cin >> t;
	cout<< t << "を2倍した数は、" << t * 2 << "です。" << endl;
	return 0;
}
```

####任意の2値の和と差を出力

``` C++
#include<iostream>

using namespace std;

int main() {
	int s, t;
	cout << "１つ目の数:";
	cin >> s;
	cout << "２つ目の数:";
	cin >> t;
	cout << s<<"+"<<t<<"="<<s + t << endl << s<<"-"<<t<<"="<<s - t;
}
```

####任意の姓と名から名前を出力

```C++
#include <iostream>
#include <string>

using namespace std;

int main() {
	string s, t;
	cout << "姓を入力:";
	cin >> s;
	cout << "名を入力:";
	cin >> t;
	cout << "名前は「" << s + t << "」です。" << endl;
	return 0;
}
```

####コードの間違いを修正（修正後のみ表示

```C++
#include <iostream>

using namespace std;

int main() {
	cout << "HelloWorld." << endl;
	return 0;
}
```
CanvasOverlay（Leaflet 地図）

こんにちは。
[Sumbera/L.CanvasOverlay.js](https://gist.github.com/Sumbera/11114288) というものを見つけました。canvas layer を作り（overlay）、その上に点などを自前で描画表示します。

作者自身がその後、Leaflet 1.x 対応版を作ったようで、私の下記の仕事は不要となったようです。

```
これに少し手を加えて Leaflet 1.x で動くようにしました：
```
* [kkdd/L.CanvasOverlay.js](http://bl.ocks.org/kkdd/b8ec235d76883f6c23e09305472fd842) (bl.ocks.org)


![leaflet_canvas.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/e9565d22-130d-4722-f393-79fddfd58d83.jpeg)
Laravel カラム追加時にでたエラーNot null violation: 7 ERROR:

## やりたいこと
"posts"テーブルに"part"というカラムを追加する。
#### 使用環境
OS
docker
DB：postgres:12
デプロイ先：Heroku

## つまづいたところ
php artisan migrateコマンド実行でエラー

```
$ docker-compose exec app sh //dockerコンテナに入るコマンド
/app# php artisan migrate 

SQLSTATE[23502]: Not null violation: 7 ERROR:  column "part" contains null values (SQL: alter table "posts" add column "part" varchar(255) not null)
```

エラーをよむ：新しく追加したカラム "part"はnull値を含んでいる。
(SQL: alter table "posts" add column "part" varchar(255) not null)
テーブルは追加カラム(varchar(255)=string)をnot nullで追加した

```
/app # php artisan migrate:status
+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table           | 1     |
| Yes  | 2014_10_12_100000_create_password_resets_table | 1     |
| Yes  | 2019_08_19_000000_create_failed_jobs_table     | 1     |
| Yes  | 2021_04_02_083813_create_posts_table           | 1     |
| No   | 2021_04_10_202701_add_user_id_to_posts_table   |       |
+------+------------------------------------------------+-------+
```
migration状況確認。
Noになっています。
## 解決方法
```
app # php artisan migrate:refresh
```
すべてのマイグレーションをロールバックしmigrateを実行。
反映されました！！

### Docker
Docker開発環境でpsqlにアクセスの仕方が分からなかったので;;
本番環境（Heroku）で確認

```
$ heroku pg:psql
:DATABASE=> \d posts
                                          Table "public.posts"
   Column   |              Type              | Collation | Nullable |              Default              
------------+--------------------------------+-----------+----------+-----------------------------------
 id         | bigint                         |           | not null | nextval('posts_id_seq'::regclass)
 title      | character varying(255)         |           | not null | 
 created_at | timestamp(0) without time zone |           |          | 
 updated_at | timestamp(0) without time zone |           |          | 
 user_id    | integer                        |           |          | 
 part       | character varying(255)         |           | not null | 

```
Nullable欄にnot nullと表記されている。
migrationファイルにnullable();と指定しない場合は、勝手にnot null制約をつけてくれる模様。

因みに...

```
$ heroku run php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
//省略
```

とmigrate:refreshではなく、freshで全てのテーブルを削除しmigrateを実行でも大丈夫だった。
違いはdownの処理を行ってからmigrationするか、テーブルを全削除してから1からmigrationするか、らしいがここの使い分けは今はピンときていない。

#### 参考URL
マイグレーション生成:[LaravelドキュメントURL](https://readouble.com/laravel/5.5/ja/migrations.html)
[備忘録] FirebaseUIエラー：No visible @interface for 'FIRAuth' declares the selector 'useEmulatorWithHost:port:'の対処法

#FirebaseUIをpod installしたら初めからエラーが出た
以下のようなエラーが出ました。

```
Error: /MyProject/ios/Pods/FirebaseUI/Auth/FirebaseAuthUI/FUIAuth.m:341:14: No visible @interface for 'FIRAuth' declares the selector 'useEmulatorWithHost:port:'
```

#環境
・macOS Big Sur バージョン11.2.3
・XCode 12.4
・Swift5.3.2

#対処法
Github上で同様のエラーが報告されていました。

https://github.com/firebase/FirebaseUI-iOS/issues/936

これによると、PodfileでFirebase/Authのバージョンを7.2.0以上にすれば良いとのことです。

```
pod 'Firebase/Auth', '>= 7.2.0'
```

#解決できなかった
上記の方法では私は解決できませんでした。

```
pod 'Firebase/Firestore'
pod 'FirebaseFirestoreSwift'
pod 'Firebase/Auth'
pod 'FirebaseUI/Auth'
pod 'FirebaseUI/Google'
pod 'FirebaseUI/Facebook'
pod 'FirebaseUI/OAuth'
pod 'FirebaseUI/Email'
```
私が入れたpodは上記の通りですが、一緒にFirestoreを入れていたため解決できなかったようです。
こちらもgithubに報告されていました。
どうやらFirebaseFirestoreSwiftとFirebase/Authが求めるFirebaseCoreのバージョンが違うことでコンフリクトが起きているようです。

https://github.com/firebase/firebase-ios-sdk/issues/7195

```
pod 'FirebaseFirestoreSwift', '~> 7.3-beta'
```
としてpod updateするとエラーが消えました！
pod updateする前にPodfile.lockを削除するのを忘れずに。
BigSleepで憧れだった画家になろう！[GAN]

## はじめに
こちらの記事はBigSleepを使用して**文章から絵をつくる(Text to Art)**実践方法をさくっとまとめたものになります。まだまだ記事が少なそうだったので**Google ColaboratoryによるBigSleepの使い方**を中心に紹介しています。

かくいう私自身、つい先日[GHELIA](https://ghelia.com)清水亮CEOの講演にてBigSleepの存在を知り、試してみたクチです。これから勉強していきたいと思っています。

**「老後は油絵でも描いて暮らしたいな」「漫画家になりたかった」**..そんな人には大変朗報です。（僕です。）一緒に芸術を爆発させましょう！

## BigSleepとは
GitHub : [https://github.com/lucidrains/big-sleep.git](https://github.com/lucidrains/big-sleep.git)

READMEを攻めの要約すると**「GANを使って、自然言語から絵を夢見ることができる」**そうです。オシャレだなぁ〜。

version 0.0.1が今年の1月19日ということで結構ホカホカなライブラリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/5c7d36d9-dea6-a52c-fa8d-36c11b6e718d.png)

## 百聞は一見に如かず、ということで

GitHubのsampleでも書かれている"fire in the sky"をBigSleepに流し込んでしばらくすると以下のような画像が得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/3fb56afd-397f-50c5-696b-3349c3de1ff6.png)
*1952: 伊藤佳十郎 「追憶の朱空」* とか書かれたら信じてしまいそうです。(もちろん全部でたらめです)

## Google Colaboratoryで試してみる

ここからが本記事の本題です。

GPU必須なので、GPUお持ちでない方はGoogle Colaboratoryを使用しましょう。
ランタイムのタイプをGPUに変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/8bab6980-f114-53de-416a-6716b0fdc25d.png)

CodeはREADMEのsample文章そのままです。はじめて実行する場合は!pip installしてあげてください。textの中身をあなたの思うまま書いてみましょう。日本語でも生成画像の内容はともかく動作はするみたいです。


```python
!pip install big_sleep
from big_sleep import Imagine

dream = Imagine(
    text = "I like coffee",
    lr = 5e-2,
    save_every = 25,
    save_progress = True
)

dream()
```

上記を実行すると、Imagingが開始され、epoc毎の絵が保存されていきます。
Colaboratory左側にあるFolderマークをクリックすると、生成された画像データが確認できます。（自身が不慣れなもので、ここで少し躓きました..）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/465f54d0-7041-3d5a-e549-ec642b2c36dc.png)

この記事を書きながら30分ほど放置してできた作品がこちらです。右側には私の解釈を付け加えています。笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/d1b0f9bc-e88b-2753-dad2-41043632771b.png)

なんとなくI like coffeeを表していそうな感じもしますし、少なくとも私の頭の中からは現れてこないArtです。AIが描いた絵から逆にインスピレーションを受ける、っていう事を体感しますね。

## 結論：なにこれ面白い
BigSleepにも感謝ですし、GPU使わせてくれるGoogle Colaboratoryにも感謝です。
AIと芸術のコラボレーションは今後も注目していきたいですね！

ひらめいた文章をArtにして、noteとかインスタとかに投稿してみようと思います。（オサレ）
【初心者向け】git stashまとめ

## git stashがありがたい状況
自分がgit stashを利用するケースは以下の２つです(他にも利用シーンがあればぜひコメントで)
これらの状況では作業中の変更差分を一時的に退避させるgit stashコマンドが便利

__①今作業中のブランチとは別のブランチで急ぎで対応すべき作業が発生した。だが、今の作業は中途半端で出来ればまだコミットしたくない__
⇒ 作業中の変更差分をstashで退避させて、作業対応後に退避させていた変更差分を取り出す

__②新しいブランチを切り忘れてコーディングを始めてしまった__
⇒ 変更差分をstashで退避させて、ブランチを正しく切り直してから変更差分を取り出す


## 実行手順
以下のコマンドで差分を退避させる

```sh
git stash push -u
```

<details><summary>オプションの説明/saveは非推奨</summary><div>

-u (--include-untrackedの省略形)
新規に作成されてまだgitにtrackされていないファイルもstashする
オプションなしで実行するとtrackされているファイルのみstashされたりしてカオスになるのでとりあえずで付けておいて損はない(はず)

※git stash saveでも同様のことができますがこちらは非推奨コマンドになりました
まだsaveを使っている人はpushにアップデートしましょう
</div></details>


stashされた差分は以下のコマンドで確認できる

```sh
git stash list
```

出力例
`stash@{0}: WIP on git-stash-tutorial: f86cd30 Merge pull request #4 from git_user/branchname`

取り出すときは対応するstash番号(stash@{0}みたいなやつ)を指定して取り出す

```sh
git stash pop stash@{0}
```

<details><summary>git stash applyでも可</summary><div>

popもapplyもどちらも変更差分を取り出す時のコマンド
popは取り出すと同時にstashスタックから消える
applyは取り出した後もstashスタックに残ったままの状態になる
</div></details>



## その他のコマンド
```
git stash clear
```
stashスタックを全て消去
無用な混乱を産まないためにも不要なstashがない状態にしておくと良い
【Rails6】ゲストユーザー機能の実装例

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

エンジニア転職でポートフォリオとなるアプリを開発する際、企業の方がアプリを確認しやすいようにユーザー登録しなくてもよいゲストユーザー機能の実装が望ましいという話をよく聞きます。

そこで今回は、ぼくが自分のポートフォリオで実装したゲストユーザー機能の例を紹介します。

## 前提
- deviseを使ってユーザー登録機能が実装されている
- Rails 6.0.3.5

## 動作確認
「ゲストユーザーとしてログインする」ボタンをクリックすると、ゲストユーザーでアプリにログインできます。
[![Image from Gyazo](https://i.gyazo.com/236e1cdb32ec8b72b83adee2dfc2cdb2.gif)](https://gyazo.com/236e1cdb32ec8b72b83adee2dfc2cdb2)

## ルーティングの設定
以下のようにパスとアクションを組み合わせを定義します
`guest_log_in`アクションはこのあとコントローラーで自作で定義するアクションです。

```config/routes.rb
devise_scope :user do
  post 'users/guest_log_in', to: 'users/sessions#guest_log_in'
end
```

## アクションの定義
以下のように`guest_log_in`アクションを定義します。

```app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  def guest_log_in
    user = User.guest
    sign_in user
    redirect_to calendars_path, notice: 'Logged in as a guest'
  end
end
```
アクションの中で使用している`sign_in`メソッドは、deviseが提供する機能で、サインイン状態にします。

ちなみにdeviseの公式GitHubの`devise/app/controllers/devise/sessions_controller.rb`内の`Devise::SessionsController#create`が`sign_in`メソッドです。※調べたことを書いているのですが、もし間違っていたらご指摘ください。ソースコードは[こちら](https://github.com/heartcombo/devise/blob/master/app/controllers/devise/sessions_controller.rb)。

また`guest`メソッドはこのあとモデルで定義します。

## モデルの定義
モデルにはクラスメソッドである`guest`メソッドを定義します。

```app/models/user.rb
class User < ApplicationRecord
  def self.guest
    find_or_create_by!(email: 'guest@guest.mail') do |user|
      user.name = 'ゲストユーザー'
      user.password = SecureRandom.urlsafe_base64
    end
  end
end
```
`find_or_create_by!`メソッドはRailsに用意されているメソッドで、「条件を指定して初めの1件を取得し、1件もなければ作成」します。

この場合、emailカラムが`guest@guest.mail`である初めのレコードを取得し、なければnameカラムが「ゲストユーザー」、passwordはランダムな値を生成してくれるRubyモジュールである`SecureRandom`を使って生成し、新しいレコードを作成します。
ぼくのアプリではusersテーブルにnameカラムがあるため、nameの値を指定しています。

`SecureRandom`については以下を参考にしてください。
[Ruby 3.0.0 リファレンスマニュアル SecureRandomモジュール](https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html)

## リンクボタンの作成
リンクボタンは任意の場所に以下のように記述します。

```erb
<%= link_to "Log in as a guest", users_guest_log_in_path, method: :post %>
```

## ゲストユーザーの編集ができないようにするアクション
ポートフォリオを公開した時にゲストユーザーを編集可能な状態していると、イタズラを受けてしまう危険性もあるので、編集できないようにするアクションを定義します。

```app/controllers/users/registrations_controller.rb
before_action :ensure_normal_user, only: :edit

def ensure_normal_user
  if resource.email == 'guest@guest.mail'
    redirect_to user_path(@user.id), notice: 'You can not edit guest user'
  end
end
```

## 参考資料
- [deviseの公式GitHub](https://github.com/heartcombo/devise)
- [Railsドキュメント find_or_create_by](https://railsdoc.com/page/find_or_create_by)
- [Ruby 3.0.0 リファレンスマニュアル SecureRandomモジュール](https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html)
- [【Qiita】簡単ログイン・ゲストログイン機能の実装方法（ポートフォリオ用）](https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104)
LinuxでもLED LightningしてPCを光らす[OpenRGB]

# はじめに
LinuxでもPCをびかびか光らせてパリピ仕様にしたい方用
OpenRGBというオープンソースを使います。

https://gitlab.com/CalcProgrammer1/OpenRGB


# 環境
OS : Ubuntu 20.10
Kernel : 5.8.0-49-generic

【LED関連部品】
マザボ：MSI MEG X570 ACE ATX
PCケース : NZXT H710i (Hueコントローラーっぽいのがついているやつ）
CPUクーラー :　NZXT KRAKEN RL-KRZ73-01(Hueコントローラー内蔵らしい）
キーボード：LG G213
ファン：NZXT AerRGB2
ファン：IN WIN Sirius Loop ASL120 
LEDストリング：ケースについているのが2本(Hueコントローラーから出ている）

# OpenRGBのインストール
## debから入れる
公式の[releasesページ](https://gitlab.com/CalcProgrammer1/OpenRGB/-/releases)から最新のdeb（自身のOSにあったもの）をDLして実行するだけ。
依存関係のパッケージのインストールも勝手にするし面倒な設定もせんでいいみたいなので楽です。

以下、現時点(2021/4/12)の最新かつ(version 0.5)Ubuntuへのインストールコマンド

```bash:
wget https://gitlab.com/CalcProgrammer1/OpenRGB/uploads/575b979bff2ecbcb93d7cbbd4d9f8b52/openrgb_0.5_amd64_88464d1.deb
sudo apt install openrgb_0.5_amd64_88464d1.deb
```

ファイル名についている88464d1はリリース時点のgitのコミットIDのようです。


## ソースからビルドしていれる
debからのバージョンだと自分のマザボを認識してくれなかったので
自分はソースから入れ直しました。
以下、全部公式に書いていることですが。

```bash:
# 必要パッケージインストール
sudo apt install openrazer-driver-dkms
sudo apt install git build-essential qtcreator qt5-default libusb-1.0-0-dev libhidapi-dev pkgconf
# DL & Build
git clone https://gitlab.com/CalcProgrammer1/OpenRGB
cd OpenRGB
qmake OpenRGB.pro
make -j32

# rootユーザー以外で実行する場合、rulesを適用
sudo cp 60-openrgb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger

# 起動
./openrgb
```

-j32 はmakeに32コア使うという意味です。そんなに時間かからないけど自身のcpuに合わせて。

## SMBus Access
RGB RAMおよび特定のマザーボードオンボードLEDを制御するには、SMBusアクセスが必要です。
とあります。

```bash:
sudo apt install i2c-tools
sudo modprobe i2c-dev
modprobe i2c-piix4
# 一部のGigabyte/Aorusのマザボでは必要？
# acpi_enforce_resources=lax

# rootユーザーで実行しない場合
sudo i2cdetect -l
# 上記コマンドで取得したものに対して （下記は全部に適応）
sudo chmod 777 /dev/i2c-*
```

## 配置場所変えてパス通す
```bash:
cd ..
sudo mv OpenRGB/ /var/opt/
sudo mkdir -p /usr/local/bin
cd /usr/local/bin/
sudo ln -s /var/opt/OpenRGB/openrgb

```


## updateしたいとき
```bash:
cd /var/opt/OpenRGB/
git pull
make clean
qmake OpenRGB.pro
make -j32
```

# 実行イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/0989d113-21a0-3d21-e08c-5ed482bb0179.png)

![写真 2021-04-12 23 33 54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/8aba6011-7aa3-49a6-aab2-c1ff5a1447e0.jpeg)

![写真 2021-04-12 23 34 51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/4e0a8b12-9e9a-a734-8cf2-85b266a06029.jpeg)


リアファン(AerRGB2)は検証作業中に壊れてしまって検証できず。
トップとフロントファン(Sirius Loop ASL120)は問題なく制御できたが、
レインボーがなかったため結局コントローラーに接続。
Krakenは対応していないっぽい（デバイスにリストされない）
（今のところ）LEDストラップとキーボードだけを制御する状態になりましたｗ

KrakenはGKrakenというオープンソースを使うのが良さそうです。

https://gitlab.com/leinardi/gkraken

記事書きました

https://qiita.com/yakitatata/items/c749b2ff2894cea58728

# 補足
最初はwineでMSIのMystic LightやNZXTのCAMなんかを動かしてできないかなーと頑張ってみたけど諦めた。
CAMはwineで起動はできるんだけどCPUとRAMしか認識していなくて、LED Funを認識させる方法がわからなかった。
もしそのあたり詳しい人がいましたら教えてくださると嬉しいです。（できるもんなの？）

メーカーぐちゃぐちゃで揃えてしまっているからOpenRGBで制御するのは自分に合ってると思いました。


# 参考
https://www.youtube.com/watch?v=YxOVwRRjmfA
phpフレームワークの仕組み/ネームスペース

こちらの講座でフレームワークの中身学習中です。
https://www.udemy.com/course/php-mvc-from-scratch
ポイントポイントで学んだことを書いていこうと思います！

今回はネームスペースと、あえてそれを使わない方法について。

##ネームスペース/名前空間とは？
phpファイルでclassを利用する時に、複数のファイルに分けてclassの情報を（整頓のため）書いているとします。
例えば別ファイル「post.php」に「Postクラス」の情報があるとします。

その情報を別のファイルで使うには

```php
require post.php
```
で読み込まなきゃいけません。
で、こういう別ファイル、別classががたくさん存在している時に、自分がどのクラスを使ってるかをわかりやすくするために使うものが名前空間です。
※名前衝突を避けるために使われます。

```php
namespace App;

class Product{
//例えばこの場合、このクラスを利用して新しくProductオブジェクトを作ると、
//App\Product classのオブジェクトが作られます。
}
```

```php
namespace App\Core;

class Product{
//こちらの場合、このクラスを利用して新しくProductオブジェクトを作ると、
//App\Core\Product classのオブジェクトが作られます。

}
```

##名前空間をあえて使いたくない時

例えば、日付に関する情報を取得したいとき。
グローバルクラスの DateTimeを使うとします。

```php
namespace App;
//classの記述は省略
$date = new DateTime();
//→Appの中のDateTime classがないとフェータルエラー！

```
このようにnewでDateTime()オブジェクトを作ると、Appの中のDataTme()を使ってしまいます。
namespace Appの宣言をしているからですね。
つまり、App\DataTme のclassがなければエラーになります。

もしそんなclassを作ってたとしても、この状態だと
これ　https://www.php.net/manual/ja/class.datetime.php　を使いたいのか、
または自作の App\DataTme を本当に使いたいのかが他の人からはわかりません。

この場合は

```php
$datatime = new \DateTme();
```
とかきます。
バックスラッシュが入ることで、ネームスペースは使わないぞ！と明示的に宣言することができます。

こちらも参考にいたしました！
https://www.php.net/manual/ja/language.namespaces.faq.php#language.namespaces.faq.shouldicare