OmniAICreator/Qiita-1.07M huggingface dataset:
DartSassへの切り替え

# DartSassへの切り替えで変更した部分は2つ

1. `@import`は使わず **`@use`と`@forward`** を採用
2. 通常の除算がコンパイルエラーになるため`calc()`または`math.div`を必ず使う

※他にも変更点はありそうだが私が気をつけたのは2点です
※`@import`は **2022年10月1日には廃止** されるからまじで早く切り替えたほうがいい（ちなみに私は同僚に聞くまで知らなかった）

# `@use`とは

読み込んだスタイルシートにのみに適用される。
たとえば`common.scss`に`button.scss`を読み込ませるときはこう。

```scss
@use "button";
```

コンパイルされた`common.css`には`button.scss`のスタイルが適用される。

## 変数とmixinの読み込ませ方

`common.scss`に変数ファイル`color.scss`と`button.scss`を読み込ませて、`button.scss`で変数を使おうとするとエラーになる。

```scss
//　これだとcolorの変数をbuttonで使えない
@use "color";
@use "button";
```

### button.scssに`@use`を直接記載する必要がある

- `**@use`のファイル名（名前）を`.`で参照させる必要がある**

```scss
// これならcolor.scssの変数が使える
// そして変数に@useの名前を参照させる
@use "color";
.button{
	color: color.$red;
}
```

- `**as {名前}`で任意の名前で参照させたり、`as *`で省略させることも可能**

```scss
// 任意の名前で参照する
@use "color" as c;
.button{
	color: c.$red;
}

// 参照を省略する
@use "color" as *;
.button{
	color: $red;
}
```

### 変数を外部から変更する場合は`with`を使う

- 変数宣言の際`!default`が使用されてる変数のみ変更可能

```scss
$red: #ff0000 !defalut;
```

```scss
@use "color" as * with(
	$red: #F30100;
);
.button{
	color: $red;
}
```

**※変数ファイルが複数ある場合、毎回すべて読み込ませるのは面倒なのでこうゆうときに`@forward`を使う**

## `@forward`とは

### 複数ファイルをまとめて読み込んだファイルを読み込める

`@use`は、読み込ませたファイル内でしか変数を使うことができない。

例えば複数の変数ファイルがあって、それをいろんなファイルにすべて読み込ませるのはとても面倒。そんなときに1つのファイルにまとめてから読み込むことができるのが`@forward`

```scss
$red: #ff0000 ;
```

```scss
$small: 200px;
```

```scss
// @useだとできない
@forward "color" as * ;
@forward "size" as * ;
```

```scss
// color.scssとsize.scssを読み込んだvariable.scssを読み込む
@use "variable" as * ;
// colorとsize内の変数が使える
.button{
	color: $red;
	width: $small; 
}
```

## `with`を使って読み込まれてる変数を変更できる

```scss
@use "variable" as * with (
	$small: 100px;
) ;
// colorとsize内の変数が使える
.button{
	color: $red;
	width: $small;  // 100px
}
```

## 同じファイル名は`as {名前}`で名前を変えなければいけない

```scss
// エラーになる
@use "layout/_header";
@use "project/_header";
```

```scss
//エラーにならない
@use "layout/_header" as "l-header";
@use "project/_header" as "p-header";
```

### ※`@forward`で経由されていればエラーにならない

```scss
@forward "layout/_header";
@forward "project/_header";
```

# `calc()`または`math.div`を使う
除算にだけ`math.div`を使用するのもあれなので
**基本的に`calc()`を使うことを推奨します。**
`calc()`ではなくてもできる計算にも`calc()`を統一性をもたせる、予期せぬエラーを防ぐためです。
```scss
math.div(100%, 3);  
calc( 100% / 3 )
```

# 参考記事
https://haniwaman.com/dart-sass/

https://yumegori.com/dart-sass-method
マクロウイルスとは？

## マクロウイルスとは
マクロウイルスとは主にExelやWordなどのオフィスソフトに搭載されている、定型的な繰り返しの作業を効率化するような機能であるマクロ機能を悪用して感染・増殖するウイルスです。ファイルの形式がオフィスのファイルと似ているため、ウイルスだと疑わずにクリックした人が悪意のあるスクリプトを実行してしまうことで感染してしまいます。また、ソフトウェア本来の機能であるマクロ機能を利用しているため、ウイルスとして一律に排除するのが困難という特徴を持ちます。

## 事例
マクロウイルスは自己増殖機能によって、感染者のアドレス帳から自動でウイルスを添付したメールを送信します。メールを受信した側は知り合いからのメールなので警戒せずにファイルを開いてしまい感染してしまいます。そしてその人のアドレス帳から他の人へウイルスメールを送るという繰り返しが起こって、マクロウイルスは拡大していきました。

## 対策
前述したようにマクロウイルスはソフトウェア本来の機能を利用している為、ウイルスと認識されずウイルス対策ソフトをすり抜けてしまうこともあります。したがってマクロウイルスに感染しないために一番確実な手段は、添付ファイル付きメールを簡単には開かないということです。たとえ仲の良い知人からのメールであってもファイルが添付されている際はマクロウイルスを警戒しましょう。

## 最後に
90年代から2000年代に流行ったマクロウイルスですが、最近でもマクロウイルスを知らない世代で感染する人がいるようです。ウイルスに対する知識は重要だと感じました。
pipenvの新しいバージョンの問題(>2022.8.5)



# 問題
* GWの後にソースコードが何も修正しなくて、docker buildが失敗になってしまう
* 現象
```
Traceback (most recent call last):
  File "/backend/./app/wsgi.py", line 12, in <module>
    from django.core.wsgi import get_wsgi_application
ModuleNotFoundError: No module named 'django'
unable to load app 0 (mountpoint='') (callable not found or import error)
```

# 分析
* docker buildのログを確認してpipenvのバージョンが更新されてしまう
* GW前のバージョン： 2022.8.5
* GW後のバージョン： 2022.8.19

* githubを確認してGW中にissueがいっぱいある
    * https://github.com/pypa/pipenv/issues

# 暫対策
* pipenvのバージョンを指定する

```
pip install pipenv==2022.8.5
```
Nintendo Switchの有線LANアダプターをMac OS Montereyで使う方法

![IMG_1941.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/f98aaa30-645f-d1a8-3f50-e3b4c1678c10.jpeg)
Nintendo Switchの有線LANアダプターをMac OS Montereyで使う方法です。


## 動作確認
- MacOS Monterey 12.5.1
- HORI LANアダプター for Nintendo Switch NSW-004（任天堂ライセンス品）

## LANドライバーのダウンロード
有線LANアダプターはASIX Electoronics Corprationのデバイスが使われているので、デバイスメーカー公式サイトのサポート（Download）より、MacOSのドライバーをダウンロードします。
https://asix.com.tw/en
![LAN_Driver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/8c14ffcf-1261-a5cc-2039-723873b78778.png)

## LANドライバーのセットアップ
LANドライバーのZIPファイルを解凍すると、PDFのドキュメントがありますので、それに従ってセットアップするだけで、簡単にMacOSで使用できるようになります。

## 補足
写真のインターネット速度が遅いのは、ADSL回線でテストしたからです。（笑）
JavaScriptで躓いたこと


## typeofで配列の型を調べるとObjectが返ってきてしまう

まれに配列操作がうまくいかないことありますよね！
そんな時はtypeofを使って本当にデータの型があっているのかを確認したりします。
しかし、
```
let array = []
console.log(typeof array)
// object
```
と出力されます。あれどこの処理で変わってしまっているのかと判断してしまい、意味のないデバッグが始まりました。

その型が配列がどうか確かめたい時は、
```
let array = []
console.log(Array.isArray(array))
// true
```
としましょう

## 数字を持った配列のソートの仕方
```
let array = [1,2,3,4,5]
console.log(array.sort())
/// [1,2,3,4,5]
欲しいデータ
/// [5,4,3,2,1]
```
となってしまう。
なので、javascriptを使用して数字のソートを行いたい場合は、

```
const sortIndex = a.sort((a, b) => b - a)
console.log(sortIndex)
///
[5,4,3,2,1]が入力される
```
SPSS Modeler ノードリファレンス 6-10 変換

# 6-10 変換ノード[出力タブ]
<img width="200" alt="194_161変換.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b8d4065b-3f2b-9906-bacc-f82924e4b16e.png">

## 1.ノードの目的
偏りのあるデータを対数変換/逆変換/指数変換/平方根変換して予測モデルのためのデータ準備を行います。


## 2.解説動画（60秒）

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

## 3.クイックスタート

顧客毎の合計売上金額を対数変換します。
＊入力データは[5.参考情報]からダウンロードできます。
![スクリーンショット 2022-03-11 9.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fdaf4ea2-efde-3532-a68a-22c554e85d94.png)

ストリームは以下の通りです。
![スクリーンショット 2022-08-22 14.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e225ac77-415a-c4f8-e627-a1d431a30d3b.png)

[レコード集計]ノードを編集します。顧客毎の売上合計金額を求めます。
![スクリーンショット 2022-08-22 14.03.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0776802d-af34-7afd-afc8-4d479dac153a.png)

[ヒストグラム]ノードを[実行]します。偏りのある分布になりました。
![スクリーンショット 2022-08-22 14.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e9f2064b-ed5f-5cd8-941d-da7b72f96566.png)

[変換]ノードを編集します。
![スクリーンショット 2022-08-22 14.06.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4de899d2-30b8-b3ac-9793-0cc3ac4e6ad0.png)

[実行]します。LogNを選択して[生成]メニューから[フィールド作成ノード]を選択します。
![スクリーンショット 2022-08-22 14.07.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e25d120f-2a9a-279b-84a2-7f03d9c9fe04.png)

[テーブル]ノードを[実行]します。値が対数変換されています。
![スクリーンショット 2022-08-22 14.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6793c1a3-75b5-2dad-94de-eee91f8013e2.png)

[ヒストグラム]ノードを[実行]します。
![スクリーンショット 2022-08-22 14.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/45ef039b-bd35-0a09-9e90-d2ab28714325.png)

## 4.Tips

複数フィールドを分布を見ながら変換タイプを確定し同時に変換可能です。

![スクリーンショット 2022-08-22 14.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bae02aae-0446-df40-5a54-ebff5421bb96.png)

対数変換を含むデータ変換について詳しく書かれた記事

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-17/

## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/sampletranDEPT2021mac.csv

#### 対数変換を解説した記事

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

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nodes-transform-node

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

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

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

https://qiita.com/416nishimaki/private/503037195081d3323eee
STM32G031とS-8120で温度計(秋月シリアル7セグに出力(SPI))(mbed-os)


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)

x SWDをいじるので上級者向け

x なぜか3秒ルールが適用できず1回書き込むとシリアル書き込みしか受け付けない

x 過去ログを見よ!!

x OBでGPIOとブートのレガシーピンが有効がわかる人よう

目的
SPIのテスト

![o_con700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/229a1318-3369-fc90-40c6-556a0e453285.jpeg)



```c++



//SPI_7SEG_S-8120C_float_031_1


#include "mbed.h"

//*******   ******   *****  *****
//     *         *   *      *
//    *         *    *****  *  ***
//  *       ****     *      *    *
//  *       *        *      *    *
//  *        *****   *****  *****


//アナログ入力の設定
//AnalogIn adc_vbat(D0); //PB_7 ADC1/11
AnalogIn adc_vbat(PB_7); //PB_7 ADC1/11


SPI spi( PB_5 , PB_4 , PA_1); // mosi, miso, sclk //031
DigitalOut en( PA_13 ); //031


char seg[32] = {
   0x00 , //0 @ -> ' '
   0x77 , //1 A  o
   0x7c , //2 B     　combined use "6"
   0x39 , //3 C
   0x5e , //4 D
   0x79 , //5 E  o
   0x71 , //6 F
   0x3d , //7 G

   0x76 , //8 H  o
   0x06 , //9 I    　combined use "1"
   0x1e , //10 J
   0x75 , //11 K 
   0x38 , //12 L  o
   0x15 , //13 M
   0x37 , //14 N  o
   0x3f , //15 O  o　combined use "0"

   0x73  , //16 P
   0x67  , //17 Q　combined use "9"
   0x50  , //18 R
   0x6d  , //19 S　combined use "5"
   0x78  , //20 T
   0x3e  , //21 U
   0x1c  , //22 V
   0x2a  , //23 W  o
   0x64  , //24 X

   0x6e  , //25 Y
   0x5b  , //26 Z　combined use "2"
   0x4f  , //27 [  --> "3"
   0x66  , //28 \  --> "4"
   0x27  , //29 ]  --> "7"
   0x7f  , //26 ^  --> "8"
   0x08    //31 _
};


char nn[]= {'O','I','Z','[','\\','S','B', ']','^','Q'};

int comma1=0; // コンマ(小数点)の有効フラグ　1で有効　0無効

SPI *_spi1;
DigitalOut *_en1;

//7segの一文字出力 nana_seg
int ns_putc(char ch) {

    if(ch == ' ') {
        ch = '@';
    } else if(ch == '.') {
        return(0);
    } else if (ch >= '0' && ch <= '9' ) {
        ch = nn[ch-'0'];
    }

    if( comma1 != 0 ) { comma1 = (0x80); }
    _spi1->write(seg[ch-64] | comma1  );*_en1=1;*_en1=0;
    comma1 = 0;

    //戻り値
    return(0);
}//ns_putc


//文字列の表示 nana_seg
int ns_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //コンマの処理
        comma1=0;
        if( (*(str1+1) ) == '.' ) { comma1=1; }

        //一文字出力
        ns_putc(*str1 ++);

    } //while

    //戻り値
    return(0);
}//ns_printf


//メイン関数
int main()
{

    // not delete  3s wait    
    wait_us(1000*1000); //1秒待つ
    wait_us(1000*1000); //1秒待つ
    wait_us(1000*1000); //1秒待つ

    SPI spi( PB_5 , PB_4 , PA_1); // mosi, miso, sclk //031
    DigitalOut en( PA_13 ); //031

    _spi1 = &spi;
    _en1  = &en;
    
    spi.format(8,0);
    spi.frequency(1000000);
    en=0;

    char data_read[256];  //バッファー

    //無限ループ
    while(1) {
 
        //センサーのADC値を電圧に変換
        float v = adc_vbat.read() * 3300;  
        
        //センサーの電圧を温度に変換
        // v = -8.2 * t + 1705  =>  t = (v - 1705.0) / -8.2;
        float t = (v - 1705.0) / -8.2;

        //整数と小数に分離
        int t_i = (int)t;
        int t_s = (int)(t*100);
        t_s = t_s - (t_i * 100);

        //数値の表示
        sprintf( data_read, "%2d.%02d", t_i, t_s);
        ns_printf(data_read);

        //1秒待つ
        wait_us(1000*1000);

    } //while

} //main



```
【夏休み企画】#IT用語一問一答【毎朝投稿13日目】FCS

# この記事を読むと、、
- 「関連用語」を使って「FCS」を説明できるようになる
- 「FCS」がもっと好きになる(多分)

# 関連用語
CRC / checksum / burst errors / IEEE 802

[**復習用**] 記事の内容を見る前に上記の言葉で「FCS」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/bb982aa64f18e73e6ae1

# FCSとは
FCS = Frame Check Sequence = フレームの末尾にエラー検出のために付加されるコード

- IEEE 802プロトコル(ex. Ethernet)やL2プロトコル(ex. PPP)の一部で用いられる
    - **IEEE 802** = LANなどの規格を定めるIEEEの機関
- 多くの場合、計算用のアルゴリズムにはCRCが用いられる
    - イメージとしては FCS = CRC(FCS以外のフィールド)
- エラー訂正はできない
    - コネクションレス型のプロトコルならそもそもエラー訂正しないから問題ない

- **CRC** = Cyclic Redundancy Check = 巡回冗長検査 = 除算した余りを用いたエラー検出符号の一種
    - 除算の際の「割る数」は生成多項式とよばれ、予め決められている
    - checksumよりエラーの検出精度が高い
    - 改竄への耐性はない
    - burst errorsの検出に向いている
        - **burst errors** = 短い区間に集中するエラー <-> random errors
- **checksum** = データを固定bit長のwordに分割しそれらのXORを用いるエラー検出符号の一種
    - 他の検出符号と比べて信頼性は低い
    - 計算が簡単
    - 改竄への耐性はない

# 参考資料
- [イーサネットフレーム - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0#%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9)
- [Cyclic redundancy check - Wikipedia](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
- [Error detection and correction - Wikipedia](https://en.wikipedia.org/wiki/Error_detection_and_correction)
- [IEEE 802 - Wikipedia](https://en.wikipedia.org/wiki/IEEE_802)
UNITY標準のDebug.Log()は使い辛い

# UNITY標準のDebug.Log()は使い辛い

## はじめに

ゲーム制作の基本は何といってもデバッグ作業である！
誰もがDebug.Log()という関数を使ったことがあるだろう。
しかしこの関数には不便な点がある。返り値がvoidである点だ。
これでは変数に代入をしながらデバッグ作業を行いたい時などは記述の量が増えて大変不便である。

NGコード例
```C#
void FixedUpdate ()
{	
if (Debug.Log(transform.grounddistances(targetLayer)>10)
{
	_isGrounded=false;
}
}
```
もちろんデバッグ結果出力のみを行う関数であるため返り値がなく比較対象がないため
if文の所でエラーが発生する

これをごり押しで解消しようとするとこうなる。

```C#
void FixedUpdate ()
{	
var debug=transform.grounddistances(targetLayer);
Debug.Log(debug);
if (debug>10)
{
	_isGrounded=false;
}
}
```
これはこれで悪くはないかもしれないが頻繁にデバッグ作業を行いたいときにはやはり非効率さを感じざるを得ない。

もっと簡単に書けないか試行錯誤した末次の拡張メソッドを記述すればうまくいくことに気が付いたので紹介をしたいと思う

## 解決策（拡張メソッド）
コンパイラにデバッグを走らせる処理と、値を返す処理、両方を入れた拡張メソッドを作成する。
```c#
public static T debug<T>(this T t){

Debug.Log(t);
return t;
}
```
この拡張メソッドを使うことで先ほどのコードと同等の処理を簡略化したコードで行うことができるようになる。

ちなみに拡張メソッドの記述法については以下の記事に記載されているのでわからない人は


実際の実用例
 
```c#
if (transform.grounddistances(targetLayer).debug() >10)
{
	_isGrounded=false;
}
```
# おわりに

なぜ標準の機能でこの関数に返り値が設定されていないのかが疑問である。
Windows環境へのAnacondaインストール２

Pythonのパッケージ管理に必要だったため、
AnacondaをWindows　64bit環境へインストールしました。

１．Anacondaからインストーラーをダウンロード
https://repo.anaconda.com/
image.png

２．Anaconda Installersをクリックしダウンロード
https://repo.anaconda.com/archive/

Anaconda3-2022.05-Windows-x86_64.exe

３．インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/7e3fef87-89c6-c114-3b16-e2751915ed17.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/e22f9cda-e37b-a210-cae8-ce7303f63785.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/803f30a8-639c-d3e2-c37b-e61b34aad776.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/01dfbd96-43e5-5028-0aa6-94c589be688f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/29a0c84e-1f31-d0fe-5970-3b1118138e7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/15211fb3-12f0-2bf0-4c45-0e8e8d335a14.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/772c2d6a-a1f8-e8dc-a701-ab608720a27f.png)
最低限のAACをデコードしてみた話

# 初めに

誰もが一度はやってみたい、著作権切れのコーデックのデコーダを書く、そうじゃありませんか?

AAC-LC であれば MPEG2 の特許が切れているので、大丈夫なはず!
一番簡単な AAC-LC の CPE なし、TNS 無しなモノラル音源をデコードしてみましょう!

というわけで、昨年やってみた AAC のデコーダ実装からエッセンスを抽出して紹介します。
https://github.com/monyone/AAC.ts
皆さんも実装してコーデックを理解し、一つ上のプログラマになりましょう!

## 全体の流れ

* AAC のビット列をパースする (仕様書を見て頑張りましょう)
* AAC のビット列のうち SCE 以外を無視する (特に CPE は面倒なので扱いません)
* SCE をデコードする
* 窓関数を使ってデータをつなぎ合わせる

## この辺の敵

### AACのビット列

AAC はビット列を逐次パースしなければ、何がどこにあるかわかりません。
(H264 の NALu みたいな構造ではないので、全てパースはする必要があります)
必要な物全ての構造を頭に入れてパースしましょう。

### ハフマン符号

scalefactor データと spectrum データ はハフマン符号にエンコードされます。
この符号のコードブックは頑張って仕様書から入力しましょう!
入力したものはこちらになります。

https://github.com/monyone/AAC.ts/blob/main/src/codebook.ts

### 逆修正コサイン変換

spectrum データを IQ した後に、IMDCT を行なって、
周波数領域から時間領域に変換を行う必要があります。
IMDCT は DCT-IV へ変換してから DCT-II に帰着するのが一番楽です。

https://github.com/monyone/AAC.ts/blob/main/src/mdct.ts

DCT-IV への変換は [独自の音声圧縮をJavaScriptで作ってみた](https://qiita.com/as_kuya/items/8acaa265bc740d925f4c) を参考にしており
コードに元の部分が少し残っています。(DCT-II への変換を変更して分かりやすくしています)

### 窓関数

SIN 窓と KBD 窓があります。
ics_info で指定されるので、どっちも対応しましょう。

https://github.com/monyone/AAC.ts/blob/main/src/window_function.ts

### 波形のつなぎ合わせ

MDCT で端の音声が揺らぐため、窓関数でつなぎ合わせます。
波形の表現が 4 種類ありますので、場合分けを頑張りましょう。

https://github.com/monyone/AAC.ts/blob/main/src/decoder.ts

## まとめ

そんな実装量はかからないので、皆さんやってみましょう。
たぶん、小一時間程度で実装できますので、ffmpeg 片手に let's try!

## あとがき

実際に WebAudio に接続するサンプルを作ればなと思いましたが
WebAudio で AAC は読めるので、劣後するなと思って未着手です...
本日の発掘動画：パスワード攻撃の現状とか

　・超入門：ウェブサイトのパスワード保護
　　～ウェブサイトへのパスワード攻撃の現状～【徳丸浩のウェブセキュリティ講座】
　　　https://www.youtube.com/watch?v=p_2tiP0qclQ

事例がいろいろと。

----
【情報・工学】青レンの良質解説動画 発掘一覧
　　https://qiita.com/aokiren8/items/965746f13ce27cb65ffa
2022/8/23主にITとかセキュリティの記事

Palo Alto製品の既知脆弱性、悪用に要警戒 - パッチ適用状況の確認を
https://www.security-next.com/139082

「Apache Traffic Server」に複数脆弱性 - キャッシュ汚染やスマグリングのおそれ
https://www.security-next.com/139089

一部店舗で無人チェックインシステムがランサム被害 - H.I.SホテルHD
https://www.security-next.com/139078

「フィッシング詐欺」報告 7月は過去最多の10万件超 新手口も(8/21)
https://www3.nhk.or.jp/news/html/20220821/k10013780561000.html

危機管理カンファレンス2022秋
リスクマネジメント・BCPの定着 ― 最前線の企業の取り組みから学ぶ ―(8/19)
https://www.risktaisaku.com/articles/-/71579

だから台湾各地のセブン-イレブンは混乱に陥った…｢中国製ネット機器｣の危険性を見くびってはいけない
今回のハッキングは｢テスト｣にすぎない(8/21)
https://president.jp/articles/-/60711

.htaccessとは？5つのできることや詳しい設置方法を解説(8/21)
https://lucy.ne.jp/bazubu/whatis-htaccess-42907.html

ホワイトハットSEOとは？ブラックハットSEOとの違いや施策を解説(8/22)
https://lucy.ne.jp/bazubu/white-hat-seo-42973.html

40代事務職Access触りたくないのでSQLを勉強してみた(8/19)
https://qiita.com/usagi-san/items/fd29a4e48407125c80fe

Cardano Testnet は「重大なバグ」であると、エコシステムの開発者は述べています(8/19)
https://portalcripto.com.br/ja/cardano-testnet-esta-com-bug-critico-diz-desenvolvedor-do-ecossistema/

米国版GDPR策定へ　個人情報の扱いに忠実義務求める(8/21)
https://www.nikkei.com/article/DGXZQOCD125BI0S2A810C2000000/

CIOが「片手間」「名ばかり」「お飾り」「邪魔者」、そんな組織にDXは無理だ(8/22)
https://xtech.nikkei.com/atcl/nxt/column/18/00205/081000074/

データカタログを作る、AWS Lake FormationとMicrosoft Purviewとは(8/22)
https://xtech.nikkei.com/atcl/nxt/column/18/01924/080900009/

「私がやるべき仕事」と思いNICTに転職、サイバー防御の研究主導し産学官を連携(8/22)
https://xtech.nikkei.com/atcl/nxt/column/18/01158/080500040/

建設情報の窃取で受発注者混乱、暗号化で復旧長引く恐れも(8/22)
https://xtech.nikkei.com/atcl/nxt/mag/ncr/18/00168/081200008/

現場で浮上する“建機暴走リスク”、ICT施工とサイバー対策は両輪で(8/22)
https://xtech.nikkei.com/atcl/nxt/mag/ncr/18/00168/081200006/

ダムの放流装置遠隔化も稼働ゼロ、サイバー攻撃懸念で難航(8/22)
https://xtech.nikkei.com/atcl/nxt/mag/ncr/18/00168/081200005/

サイバー攻撃で狙われるインフラ、不正操作で“災害級”の被害の恐れ(8/22)
https://xtech.nikkei.com/atcl/nxt/mag/ncr/18/00168/081200001/
Windows環境へのAnacondaインストール

Pythonのパッケージ管理に必要だったため、
AnacondaをWindows　64bit環境へインストールしました。

１．Anacondaからインストーラーをダウンロード
https://repo.anaconda.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/435ee8f0-cc71-0387-cdd8-87caa4b8ae0d.png)


２．Anaconda Installersをクリック
https://repo.anaconda.com/archive/

記載時点での最新バージョン（Windows　64bit)
Anaconda3-5.3.1-Windows-x86_64.exe
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/c9fd9315-a5b7-8ad6-03f4-0f6c007db082.png)


３．インストーラ―実行
デフォルトのまま進めた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/d5c56685-226c-9368-8c96-a6748c8dfd13.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/7f2dbccd-c5ef-a8f5-5f13-aeae855975d5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/c343cb38-589d-e80d-fd57-e6144497c6c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/8002e9f0-b5c8-52bb-57b0-e20ae780e486.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/5cc4d4a9-6355-2bf5-d1c7-95d26ca39035.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/ca4a7c01-831b-6195-0dd3-425d5ec54ba8.png)

5分程度インストーラに時間がかかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/7ee08167-fe26-dbcc-1d6d-e8632a5ae4af.png)

これはSkip(すでに入っている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/70a88fdd-361c-d37b-ff7a-4d8874219e97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/16a3e199-be4b-1c59-7987-39017305c39b.png)

４．インストール後、試しにAnaconda Promptで確認

>conda -V

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/11297d4c-2fca-1035-e970-900b56df1a60.png)

OK!!
#4 【 Unity の教科書 】 をマスターするまでの記録

# :star2:2021/08/22 の目標:star2:
① Unity の教科書 を286ページまで進める
⇒ 298ページまで進めることが出来た。

# :bulb:成果:bulb:

<details>
  <summary>👈ボタン（UI）の作成</summary>
P237 ～ P240<br>
① ヒエラルキー ⇒ ＋ ⇒ UI ⇒ Button-TextMeshPro<br>
② ボタンの画像挿入：Sorce Image<br>
③ ボタンのテキストの管理：Text(TMP)
</details>

<details>
  <summary>💎ボタンとプレイヤを紐付け</summary>
P240 ～ P242：<br>
① Playerのスクリプトにメソッドを記述<br>
② ボタンにメソッドを登録する<br>
⇒ ヒエラルキー ⇒ ボタンオブジェクト ⇒ インスペクター ⇒ Button ⇒ On Click() ⇒ ＋ ⇒ None(Object) <br>
⇒ ヒエラルキーからplayerをD&D（player にアタッチされたスクリプトのメソッドを登録できる）<br>
⇒ No Function をPlayerController ⇒ メソッド名<br>
</details>

<details>
  <summary>💪Physics とは</summary>
P253 ～ P266<br>
物理エンジン：
オブジェクトに物理挙動を与える<br>
① Rigidbody コンポーネント: 力(重力・摩擦)<br>
② Collider コンポーネント：物体の当たり判定<br>
</details>

<details>
  <summary>🏃オブジェクトをジャンプさせる</summary>
P267 ～ P272<br>
① スクリプトの作成<br>
② メソッドの記述（Rigidbodyコンポーネントのもつ，AddForceメソッド）<br>
🍎startメソッド内にGetComponent<Rigidbody2D>を書き，コンポーネントを取得しておく🍎 <br>
③ オブジェクトにスクリプトをアタッチ
④ 重力など微調整
</details>

<details>
  <summary>👀オブジェクトの向きを変える</summary>
P274 ～ P275<br>
</details>

<details>
  <summary>🏃アニメーションを学ぶ</summary>
P276 ～ P285<br>
</details>

<details>
  <summary>🏝ステージを作る</summary>
P286 ～ P290<br>
</details>

<details>
  <summary>📷カメラを動かす</summary>
P291 ～ P293<br>
</details>

<details>
  <summary>💥当たり判定</summary>
P294 ～ P298<br>
</details>

# 💯振り返り
お昼過ぎに何となく，アプリ開発を調べて，下の記事を見て，んーーってなって
眠って元気！
https://appmarketinglabo.net/rural-appdev/

blog初心者で，URL貼っていいか分からなかったから，一応調べた。
https://it-bengosi.com/blog/link-chosaku/

なんでリンクの色違うんだろう。
あ、クリックしたら色変わった。
SAML認証でSAP GUIを起動

以前SAP　SSOについては、以下の内容を投稿しましたが、
AzureADを利用しても構築できそうなので、取り急ぎ、整理して記載します。

https://qiita.com/j-dai/items/df09618bde0b7232561e

昔AZure　ADはKerberosをサポートしていないなので、
Kerberos-Base SSOは　OnpremiseのActiveDirectoryを利用するしかないです。

OnpremiseADを持っているお客様が該当構成を利用するのはシンプルかと思いますが、
セキュリティ面などAD参加できない端末がある、すべてAzureADでSSO構成を取りたいお客様も少なくないかと思います。
該当場合、考える案とそれぞれのやり方の参照資料を以下にメモしました。

- 案①
以下の記事によると、Azure　ADは　Kerberos認証もサポートになりましたので、
普通に考えると　AzureADベースSAPGUIのSSOはできるようになったかと思いますね。

https://syfuhs.net/why-we-built-azure-ad-kerberos

https://blog.hametbenoit.info/2021/12/03/azure-ad-you-can-now-use-kerberos-to-authenticate-against-azure-ad-preview/#.YwPF3XbP1hE


- 案②
色々調べたら、こちらのやりかたでは、SAML認証でのSAPGUIのSSOも実現可能らしいです。

First、ウェブブラウザーでSAML認証します。

「Tutorial: Azure Active Directory Single sign-on (SSO) integration with SAP NetWeaver」

https://docs.microsoft.com/en-us/azure/active-directory/saas-apps/sap-netweaver-tutorial

Second、ショットカットファイルを利用して、SAPGUI起動させる。
Web Page with Hyperlink to SAP GUI Transaction

https://blogs.sap.com/2022/01/10/web-page-with-hyperlink-to-sap-gui-transaction/


- 他（ご参考まで）：
Kerberos-based SSO
Application　Proxyを利用して少し工夫すれば対応可能ではないかと思いますが、こちらも要検討ですね。
https://docs.microsoft.com/en-us/azure/active-directory/app-proxy/application-proxy-configure-single-sign-on-with-kcd
JavaScript でのenum のような定義とそれを切り分けるSwitch

こんばんは、久々の投稿です。

### はじまり
JavaScriptで input の値　が'A','B','C'のどれかあるかチェックしたい時に

~~~~:JavaScript
if(input == 'A' || input == 'B' || input == 'C') {​​
   //処理
}​​
~~~~
何かいい方法はないですかと聞かれたので

最近の自分の書き方を紹介させていただいたので、こちらでも紹介させていただこうと思います。

### おすすめ

上記の質問だとすると、Switch文をオススメします。
またswitchの数字で切り分ける方法を避けるために、以下の方法をおすすめしました
それは、enum 定義（JavaScript）ではenum は無いので、連想配列で実施。

### ポイント
・Switch文を用いて場合分けを切り出す
・enum（の様な） 適切な定義を行う

コードは、以下の通り
~~~~:HTML
<h1>JavaScriptでEnumの振る舞いを実装する</h1>

<script>
// 定義 なので、constを用いる
const FRUIT_ITEMS_ENUM = {​ 
              ORANGE : {
                   rawValue : 1,
　　　　　　　　　　　 string : "オレンジ",
                   func : function () {
                       alert("オレンジ大好き");
                   }
              },
              BANANA : {
                   rawValue : 2,
　　　　　　　　　　　 string : "バナナ"
              },
              PEACH  : {
                   rawValue : 3,
　　　　　　　　　　　 string : "ピーチ"
              },
              STRAWBERRY : {
                   rawValue : 4,
　　　　　　　　　　　 string : "いちご"
              },
            }​;
var fruit = 1;
// スイッチ文
switch (fruit) {​ 
  case FRUIT_ITEMS_ENUM.ORANGE.rawValue: 
    /// 実行処理など
    FRUIT_ITEMS_ENUM.ORANGE.func();
    document.write(FRUIT_ITEMS_ENUM.ORANGE.string);
    break;
  case FRUIT_ITEMS_ENUM.BANANA.rawValue:
    document.write(FRUIT_ITEMS_ENUM.BANANA.string);
    break;
  case FRUIT_ITEMS_ENUM.PEACH.rawValue:
    document.write(FRUIT_ITEMS_ENUM.PEACH.string);
    break;
  case FRUIT_ITEMS_ENUM.STRAWBERRY.rawValue: 
    document.write(FRUIT_ITEMS_ENUM.STRAWBERRY.string);
    break;
  default: 
    document.write("その他　果物");
    break;
}​
</script>
~~~~

この書き方は個人的に最近ハマっており、上記のように定義（いわゆるenum 風にユニークな値）を作っておくことで、その処理に意味を持たせるために適切な名前をつける様に書いておくと、後でわかりやすく「Switch文と定義」と意味合いを持たせておくと可読性も上がり、後で、数字がなんの処理なのかということもないので、使い勝手がいいと思います。

### point 
定義は、const を用いる
定義を、大文字とアンダーバーを用いる
enum ぽさを出すためにrawValueを用いる
上記の形だと、function なども格納ができるので、用途としてはかなり便利です
### まとめ
Switch文と定義 を設定することで、後々読み直した際ややこしいことにならないように可読性が上げるメリットがありかなり便利です。ぜひよかったらやってみてください。
本日の発掘動画：光回線工事・光ファイバーケーブル

　・光回線工事を解説。これであなたも回線マニア！？【スマサポチャンネル】
　　　https://www.youtube.com/watch?v=6Y5G6fMFPjI
　・光ファイバーケーブルってどんな風に機能してるの？【Lesics 日本語】
　　　https://www.youtube.com/watch?v=5oGkSMRK2uI

　ONUとか責任分界点とか・・・

-----
【情報・工学】青レンの良質解説動画 発掘一覧
　　https://qiita.com/aokiren8/items/965746f13ce27cb65ffa
TypeScriptで式展開をする方法

はじめに
--
rails api + TypeScript（react)でポートフォリオを作成中にフロント側で式展開を行いたくなり、調べたことをざっくり備忘録にまとめます。

TypeScriptの式展開
--
「`${}`」で囲みます。

「`」の名前をバッククォートと言うらしいです。
「'」ではないので注意してください。
(ちなみにこれはシングルクォートです。)

~~~react
`${}`
~~~

実際に使った例
--
本来はデータによってリンクを動的に変えたい！という時に式展開は使用することが多いと思いますが、userIdを取得する記述の前提を書きすぎると式展開についての記事ではなくなってしまうので、一旦"userId"に2を代入します。

~~~react
const userId = 2

<Route exact path={`/users/${userId}/edit`} component={UserEdit} />
//"/users/2/editのリンクに飛ぶことができる
~~~

終わりに
--
typescriptはコードを書いている時にエラー箇所を教えてくれるからありがたいですね。
とは言ってもreactでわかってないことが多すぎてまだまだ苦戦してますが。。
systemdにおける環境変数「CATALINA＿HOME」の設定方法と確認方法

# 概要
知っている人からすると「何を当たり前のことを」と思うかもしれませんが、結構詰まって困ったので備忘録代わりに残しておきます。
systemdを使用してTomcat起動・停止を行う場合の環境変数「CATALINA_HOME」設定方法・確認方法について記載します。

# 環境変数の設定
tomcatを起動するためのサービスを設定する。
ポイントはEnvironmentFileで、別ファイルに設定した環境変数を読み込むようにしている。
(下記ファイル内に環境変数を直接定義しても読み込まれないらしい)

```systemd:/etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/tomcat/tomcat.pid
RemainAfterExit=yes

EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
ExecReStart=/opt/tomcat/bin/shutdown.sh;/opt/tomcat/bin/startup.sh

[Install]
WantedBy=multi-user.target
```


EnvironmentFileで読み込まれる設定ファイルは下記であるため、CATALINA_HOMEを設定する。
```config:/etc/sysconfig/tomcat
CATALINA_HOME=/opt/tomcat
```

:::note info
余談
CATALINA＿HOME以外の環境変数は下記のように
$CATALINA_HOME/bin/setenv.shで定義することが推奨されている。
最初は存在しないため、新規作成する必要がある。
```shell:$CATALINA_HOME/bin/setenv.sh
CATALINA_OUT=/var/log/tomcat/catalina.out
UMASK="0007"
CATALINA_OPTS="$CATALINA_OPTS -server -XX:PermSize=256M -XX:MaxPermSize=256M -Xms512M -Xmx2048M"
```
:::

# 環境変数の確認方法
tomcatを起動し
```bash
systemctl start tomcat
```
ステータスを確認する
```bash
systemctl status tomcat
````
すると下記のような結果が表示される。最終行に-Dcatalina.home=<設定した値>と表示されていればOK。ちなみにsetenv.shで設定した値もここで確認可能。
```text
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Mon 2022-08-22 18:27:12 JST; 8s ago
  Process: 33807 ExecStop=/opt/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 33843 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 33843 (code=exited, status=0/SUCCESS)
    Tasks: 27 (limit: 23182)
   Memory: 105.3M
   CGroup: /system.slice/tomcat.service
          mq33856 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties (中略) -Dcatalina.home=/opt/tomcat
```

# 感想
CATALINA＿HOMEの設定方法については豊富に記事があったのですが確認方法については当たり前過ぎたのかあまり無かったように見受けられたので、今回書きました。
普通に「CATALINA＿HOME」で出力されると思っていたからDcatalina.homeを見るべきだなんて思わなかったです‥。あとsystemctl statusで確認できることも知らず、ずっとcatalina.outとにらめっこしていました。恥ずかしい限りです。
本日の発掘動画：ネットワーク基礎

　・インターネットの仕組み入門～IPアドレス・DNS・MACアドレス
　　　https://www.youtube.com/watch?v=A11m1lWiUrs
　・インターネットの仕組みとは？【Lesics 日本語】
　　　https://www.youtube.com/watch?v=-jNFptYDc44

　ネットワークの基礎総復習。

-----
【情報・工学】青レンの良質解説動画 発掘一覧
　　https://qiita.com/aokiren8/items/965746f13ce27cb65ffa
paiza POH code_and_sql #異世界転職エンジニア


## SQL

同じデータベースを使う(取得する条件だけが徐々に複雑になっていく)のが面白く感じました。

### 魔法使いの街(d1)

```sql
SELECT id, name FROM Hell;
```

### 果ての平原(d2)

```sql
SELECT id, name, str FROM Hell ORDER BY str DESC LIMIT 5;
```

### 砂漠のオアシス(c1)

```sql
SELECT id, name, cost FROM Hell WHERE cost <= 10;
```

### 禁断の洞窟(c2)

```sql
SELECT Hell.id, Hell.name, Element.name AS element FROM Hell
  INNER JOIN Element ON Hell.element_id = Element.id
  WHERE Element.name = "Earth";
```

### 精霊の村(b1)

```sql
SELECT Hell.id, Hell.name, Element.name AS element, Grade.name AS grade FROM Hell
  INNER JOIN Element ON Hell.element_id = Element.id
  INNER JOIN Grade ON Hell.grade_id = Grade.id
  WHERE Element.name = "Air" AND Grade.name = "Boss";
```

### 獣の足跡(a1)

```sql
SELECT Hell.id, Hell.name, Element.name AS element, Grade.name AS grade FROM Hell
  INNER JOIN Element ON Hell.element_id = Element.id
  INNER JOIN Grade ON Hell.grade_id = Grade.id
  WHERE Grade.name = "Boss" AND Element.id in (
    SELECT ElementCompatibility.weakness_element_id FROM Hell
      INNER JOIN Element ON Hell.element_id = Element.id
      INNER JOIN ElementCompatibility ON Element.id = ElementCompatibility.element_id
      WHERE Hell.name = "Graffiacane"
  );
```

## CODE

### 原初の村(d1)

```rb
#!/usr/bin/ruby
puts'hello'*gets.to_i
```

### 氷の城(d2)

```rb
#!/usr/bin/ruby
n=gets.to_i
puts n>0 ? n : :freeze
```

### 火山島(c1)

```rb
#!/usr/bin/ruby
SIZES=%w(SS S M L LL)
n=gets.to_i
v=gets.split.map &:to_i
v.unshift v[0]/2
v.push v[-1]*2
r=0
n.times{r+=v[SIZES.index gets.chomp]}
p r
```

### 大海の渦(b1)

```rb
#!/usr/bin/ruby
n,x,*d=`dd`.split.map &:to_i
d<< 0
r=[x]
(n-1).times{|i|
	d[i]-=r[-1]
	d[i+1]-=r[-1]
	r<< d[i]
}
puts r*' '
```

### 龍の頭(a1)

島ごとにその島を囲む矩形を算出し、その矩形と島の形が一致していれば良い。

```rb
#!/usr/bin/ruby
h,w=gets.split.map &:to_i
m=['W'*(w+2)]+h.times.map{'W'+gets.chomp+'W'}+['W'*(w+2)]
r=0
(1..h).each{|y0|(1..w).each{|x0|
	if m[y0][x0]=='B'
		q=[[y0,x0]]
		v=[[y0,x0]]
		m[y0][x0]='G'
		while !q.empty?
			y, x = q.shift
			[[-1, 0], [1, 0], [0, -1], [0, 1]].each{|dy,dx|
				ny = y + dy
				nx = x + dx
				if m[ny][nx]=='B'
					q<<[ny,nx]
					v<<[ny,nx]
					m[ny][nx]='G'
				end
			}
		end
		ym, yM = v.map(&:first).minmax
		xm, xM = v.map(&:last).minmax
		next if (ym..yM).any?{|y_|(xm..xM).any?{|x_|
			m[y_][x_]=='W'
		}}
		r+=1
	end
}}
p r
```

### 暗黒の地(s1)

だめですねこりゃ^^;;;
(杭の順番を変更できるならソートするだけで交差を減らすことが普通にできる)

```rb
#!/usr/bin/ruby
n,k=gets.split.map &:to_i
v=(1..n).map{|i|gets.split.map(&:to_i)+[i]}
p 0
# 既存の杭の順番は変更できないのか〜
puts *1..n
```
MySQL8.0 でよく使うコマンド①

皆さん、こんにちは。<br>
今回は前回の記事に引き続きMySQL関連で私がよく使ったり忘れたりする基本コマンドについてまとめていきます。
なお、今回はデータベース定義関連のDDLを中心に書いていきます。


<h1>前提条件</h1>
まず、前提条件は下記のようなものです。<br>
mysqlはバージョンが8.0であること。<br>
CSVファイルをインポートするにはセキュリティで許可されたディレクトリに配置すること。<br>
CSVファイルは必ず文字コードは"UTF-8"改行コードは"LF（ラインフィールド）"であること。<br>
<h1>データベースの作成</h1>
何はともあれ一番基本になるデータベースの作成です。

```sql:Sql
create database データベース名;
```
このコマンドを打つことで任意の名前のデータベースを作成することができます。<br>

<h1>テーブルの確認</h1>
データベースの中にあるテーブルの確認を行うときに使うコマンドです。

```sql:Sql
show tables;
```
このコマンドを打つことでデータベース内にあるテーブルの確認が行えます。<br>

<h1>テーブルの作成</h1>
テーブルの中身が空だったり追加するときに使います。


```sql:Sql
create table テーブル名 as select (カラム名1 データ型 [制約等オプション],カラム名2 データ型 [制約等オプション],...) ;
```
このコマンドを使用することで新規のテーブルを作ることができます。<br>
<br>

また、既存のテーブルが存在し、その問合せ結果から表を作成するときには下記のコマンドを使う。<br>

```sql:Sql
create table テーブル名 as select カラム名1,カラム名2...From 既存のテーブル名 [where 条件];
```

表の複製を行いたいときは下記のコマンドで複製ができます。<br>

```sql:Sql
create table 新しいテーブル名 like 既存テーブル名;
```

このコマンドを打つことでテーブルの作成、変更等を行えます。<br>

<h1>テーブルの削除</h1>
データベースの中にあるテーブルの削除を行うときに使うコマンドです。

```sql:Sql
drop table 削除したいテーブル名;
```
このコマンドを打つことでデータベース内にあるテーブルの削除が行えます。<br>


<h1>カラムの属性変更</h1>
データベースの中にあるカラムの属性変更を行うときに使うコマンドです。

```sql:Sql
alter table テーブル名 modify カラム名 データ型;
```
また、カラム名とデータ型の変更を行う場合は下記のコマンドで行えます。
```sql:Sql
alter table テーブル名 change 変更前のカラム名　新カラム名 新データ型;
```
このコマンドを打つことでデータベース内にあるテーブルのカラムの属性変更が行えます。<br>

<h1>カラムの追加</h1>
データベースの中にあるカラムの属性変更を行うときに使うコマンドです。
<br>
<br>

<h3>カラムをテーブルの最後の位置に追加する場合</h3>

```sql:Sql
alter table テーブル名　add　カラム名　データ型；
```
<h3>カラムをテーブルの最初の位置に追加する場合</h3>

```sql:Sql
alter table テーブル名　add　カラム名　データ型　first；
```
<h3>カラムをテーブルの既存カラムの後の位置に追加</h3>

```sql:Sql
alter table テーブル名　add　カラム名　データ型 after　既存カラム名；

```

<h1>カラムの削除</h1>
データベースの中にあるカラムの削除を行うときに使うコマンドです。
<br>

```sql:Sql
alter table テーブル名　drop　カラム名；

```




<h1>データの挿入</h1>

値を入れるカラムを指定し、レコードを挿入するときのコマンドです。
<h3>レコードの挿入</h3>
<br>

```sql:Sql
insert intoテーブル名（カラム名１，カラム例２，･･･） values（値１，値２，･･･）；
```

値を入れるカラムを省略し、行を挿入するときのコマンドです。

```sql:Sql
insert into テーブル名 values（値１，･･･）；
```

あるテーブルに登録されているデータを別のテーブルにまとめてコピーするときのコマンドです。

他の表から取り出した行を挿入する
```sql:Sql
insert into 挿入先テーブル名（カラム名１，カラム名２，･･･）
select カラム名１，カラム名２，･･･ from 挿入元テーブル where 検索条件；
```

<br>

<h1>データの更新</h1>
テーブルに登録されているレコードの更新を行う。

条件を満たすレコードのみカラム名の値を更新するときに使うコマンドです。
```sql:Sql
update テーブル名 set カラム名１＝値１，カラム名２＝値２，･･･
　where 検索条件；
```

<h1>データの削除</h1>

テーブルに登録されたデータの削除を行うときに使用する。
指定した表の全ての行を削除するときに使うコマンドです。
```sql:Sql
delete　from　テーブル名；
```
条件を満たす行のみ指定した表から削除するときに使うコマンドです。
```sql:Sql
delete　from　テーブル名　where　条件；
```


<h1>最後に</h1>
いかがだったでしょうか。
私ががMySQLを触る上結構間違えていたり、忘れてしまっているコマンドの一覧の①がこれになります。<br>
結構、細かな書式等も忘れてしますので誰かのお役に立てば幸いです。
SQLインジェクション脆弱性とは

# はじめに
インジェクションはプログラミングではDI（依存性注入）の文脈で使われることが多い単語で、「注入」という意味です。
SQLインジェクション脆弱性で注入されるのは「悪意のあるSQL文」となります。
SQLインジェクション脆弱性によって以下の攻撃が可能になります。
- 不正取得
- 改ざん
- 認証回避
- プログラム実行
- ファイルの参照、更新

与える被害は甚大です。アプリケーション開発ではSQLインジェクション脆弱性を許さないことが必須で求められます。

# 具体例
よくSQLインジェクションの例として挙げられるのは下のようなログイン画面です。
![スクリーンショット 2022-08-22 23.13.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644746/49778984-5d4c-2e7c-3188-ee99f210b9e4.png)
この画面のコードが以下のようになっているとしましょう。
```html:login.html
    <html>
    (略)
    <body>
    <h1>Log in</h1>
    <form action="login.php" method=POST>
    <p>email</p>
    <input type="text" name="id"><br>
    <p>password</p>
    <input type="text" name="password"><br>
    <input type="submit" value="Log in">
    </body>
    </html>
```
```php:login.php
    <?php
      header('Content-Type: text/html; charset=UTF-8');
      $id = @$_POST['ID'];
      $pwd = @$_POST['PWD'];
      $db = new PDO("mysql:host=127.0.0.1;dbname=sample", "sample", "sample");
      $sql = "SELECT * FROM users WHERE id = '$id' AND PWD = '$pwd'";
      $ps = $db->query($sql);
    ?>
    <html>
    <body>
    <?php
      if ($ps->rowCount() > 0) {
        $_SESSION['id'] = $id;
        echo 'ログイン成功です';
      } else {
        echo 'ログイン失敗です';
      }
    ?>
    </body>
    </html>
```
このとき、入力値を以下のようにすると認証が通ってしまいます。
```
    email = test@gmail.com
    password = ' OR 'a'='a
```
これはSQLインジェクションによってSQLが以下のように書き換えられているからです。
```sql
SELECT * FROM users WHERE id = 'test@gmail.com' and pwd = '' OR 'a'='a'
```

# 対策
問題は文字列リテラルを「'」で抜けて、SQLの構造改変をユーザーに許してしまっていることにあります。
対策は色々なやり方が考えられますが、根本的な対策としては静的プレースホルダを使用して、パラメータをユーザーの入力値から受け取る前にSQL文をコンパイルし、SQL構造を決めておく方法が挙げられます。
この根本的な対策に抜けがあったり、ミドルウェアに脆弱性があり、正常に静的プレースホルダが実行できなかったりした場合の保険的対策として以下の対策もとったほうが良いとされています。
- 詳細なエラーメッセージの抑止
    SQLのエラーメッセージから情報が抜き取られることがあります。仮にユーザーによって機密情報が入ったエラーを出力するSQLが実行されたとしても、クライアント側にエラー内容をそのまま返さない実装が求められます。
- 入力値の妥当性検証（validation）
    今回の例ではpasswordの文字列の中に「'」を含めることができたことによって、SQLインジェクションが実行されてしまいました。これを英数字に限定しておけば、SQLインジェクションの実行可能性を減らすことができます。
- データベースの権限設定
    SQLインジェクションによって、データベースのドキュメントを全件削除処理を走らせるケースも存在します。その際にアプリケーションの機能として与える権限にDELETEが含まれていなければ、その操作は行われません。被害を最小限にする意味で、不要な権限をアプリケーションに与えないようにしましょう。

あくまで、上の3つは保険的対策であって、SQLインジェクションを完全に防げるということではありません。過信しないようにしましょう。

# 最後に
とりあえず、
___SQLインジェクション脆弱性は文字列リテラルを「 ' 」を使って抜けること___
と覚えておけばよいのではないでしょうか。(あくまで標語であって、正確ではありません。)
自分の書いたコードでドキュメント全件削除されてしまわないように気をつけて行きたいです。

# 参考図書
[体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 徳丸浩](https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%EF%BC%BB%E3%83%AA%E3%83%95%E3%83%AD%E3%83%BC%E7%89%88%EF%BC%BD-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8-%E6%B5%A9-ebook/dp/B01MR7MOT6/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1JK2YW214S7JB&keywords=%E5%BE%B3%E4%B8%B8%E6%B5%A9&qid=1661182444&sprefix=%E5%BE%B3%E4%B8%B8h%2Caps%2C415&sr=8-5)
【git rebase】汚いコミットログを一つにまとめて綺麗なコミットログを作る

めちゃくちゃ細かいコミットを作成してしまった時などに使える、コミットログを綺麗にするコマンドを記載しておきます。

※自分用の備忘録のため分かりづらいかもです。もっと詳しく書いてクレメンスの場合はコメントください。

改変したコミットログは元に戻す事はできないので、十分に注意した上で実行してください。
また、今回の方法では`git push -f`を使用しますが、強制pushして良いかはチームメンバーに確認しておいた方が不幸にならずに済むかもしれません。

強制pushはNGが基本かもしれませんが、私は駄々をこねまくってコミットログを偽装しまくっています。

## コマンド

```
// コミットログを確認する
git log --oneline

// 一つにまとめたいコミットを、まとめて指定する
git rebase -i HEAD~n

// 一番上のコミットを残して、pickと記述されている箇所をsに変更する
// コミットメッセージは変更する必要なし
// pickをsに変更して:wqすると、コミットメッセージの編集に移行するので好きなコミットメッセージを入力する

// remoteにpushする
git push -f origin HEAD
```

以上です。

## 参考

もっと詳しく教えてクレメンスな方は以下を見ると幸せになれるかもしれません。

https://dev.classmethod.jp/articles/git-commit-matomeru/

https://qiita.com/takke/items/3400b55becfd72769214
Windows 11 に WSL (Ubuntu) をインストール

# これは何

タイトルそのまま、Windows 11 に WSL をインストールしました（できました）という記録。
類似の既存記事がたくさんあるので情報の価値は薄いですが、「この時期にこの環境でもうまくいったよ」的な意味合い。

# で、どうだったの

ちょうどこちらの記事のとおりの内容をやってすんなりうまくいきました。出力結果なども載せてくれていて助かります。

https://qiita.com/falya128/items/f19b8b684a27f839c284

パワーシェル（管理者権限）で `wsl --install` 、Windows を再起動して、Linux の初期ユーザーとパスワード投入して `sudo apt update && sudo apt upgrade` までをやりました。

# 環境

* ハードウェア : Microsoft Surface Laptop Studio
* OS : Windows 11 Home (21H2)

# 時期

2022年8月20日に実施して成功しました。

# 参考サイト・記事

参考というか本家 Microsoft のドキュメントですが。

https://docs.microsoft.com/ja-jp/windows/wsl/install

https://docs.microsoft.com/ja-jp/windows/wsl/basic-commands

# 蛇足（所感など）

数年前に WSL が出始めたころは Ubuntu 一択だったのが、今では Debian や Kali Linux など色々なディストリビューションも選べるようになってるんですね。

勝手に / に 250 GB の仮想ディスクが割り当てられちゃうのが気に入らない（個人的には 20 GB も要らないくらい）のですが、今回これを変更する方法は見つけられませんでした。
＃ もしかしてこれ（方法を探したけど見つからなかったこと）がこの記事で一番オリジナリティーのある情報かも。。
そのうちこの辺もインストール時に指定できるようになったりするといいな。
【React / Next】gifを使わずにcssだけでオーバーレイスピナー(loading)を実現する

個人的な備忘録です。

# 環境
- react: 17.0.2
- next: 11.1.3
- sass: 1.47.0

# やりたいこと
- ローディング中は Overlay Spinner を表示させて画面操作ができないようにする
- gifなどの画像は使用せずに、cssだけでスピナーを実装する

# 完成イメージ
![spinner.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/a921712a-aedf-e7d8-81fc-4a0ede950711.gif)


# スピナーの実装
```tsx:OverlaySpinner.tsx
import styles from './overlaySpinner.module.scss';

export const OverlaySpinner = () => {
  return (
    <div className={styles.overlay}>
      <div className={styles.spinner}></div>
    </div>
  );
};
```

```scss:overlaySpinner.module.scss
.overlay {
  position: fixed;
  top: 0px;
  left: 0px;
  width: 100%;
  height: 100%;
  background: black;
  opacity: 0.5;
  z-index: 999;
}

.spinner {
  position: absolute;
  left: 50%;
  top: 50%;
  height: 60px;
  width: 60px;
  margin: 0px auto;
  -webkit-animation: rotation 0.6s infinite linear;
  -moz-animation: rotation 0.6s infinite linear;
  -o-animation: rotation 0.6s infinite linear;
  animation: rotation 0.6s infinite linear;
  border-left: 6px solid rgba(0, 174, 239, 0.15);
  border-right: 6px solid rgba(0, 174, 239, 0.15);
  border-bottom: 6px solid rgba(0, 174, 239, 0.15);
  border-top: 6px solid rgba(0, 174, 239, 0.8);
  border-radius: 100%;
  z-index: 999;
}

@-webkit-keyframes rotation {
  from {
    -webkit-transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(359deg);
  }
}
@-moz-keyframes rotation {
  from {
    -moz-transform: rotate(0deg);
  }
  to {
    -moz-transform: rotate(359deg);
  }
}
@-o-keyframes rotation {
  from {
    -o-transform: rotate(0deg);
  }
  to {
    -o-transform: rotate(359deg);
  }
}
@keyframes rotation {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(359deg);
  }
}
```

# 使用時のサンプルコード
```tsx:formComponent.tsx
import { OverlaySpinner } from '@/components/overlaySpinner';
import { useState } from 'react';

const FormComponent = () => {
  const [isLoading, setIsLoading] = useState(false);
  const [filesToUpload, setFilesToUpload] = useState<File[]>();
  // 省略

  const handleUpload = async () => {
    setIsLoading(true);
    await imageUseCase.upload(filesToUpload).finally(() => {
      setIsLoading(false);
    });
    onClose();
  };

  return (
    <>
      <button type="button" onClick={handleUpload}>
        アップロード
      </button>
      {isLoading && <OverlaySpinner />}
    </>
  );
};
```

# 参考
https://stackoverflow.com/questions/6091253/overlay-with-spinner
PythonでFusion360でexportしたstlファイルの単位をmm→mに変換する

# 問題点
Gazebo上で自分で作ったオブジェクトを出現させるときはstlファイルを読み込ませる必要がある。
Fusion360でstlファイルを出力する時はmm単位、ROSやGazeboはm単位であるため、mmからmに変換する必要があるが、フリーソフトを使ったり、Windowsにしか対応してない方法が多かったので、Ubuntu単体で変換できる方法を模索したところ、Pythonのnumpy-stlライブラリを使うことで解決できた。

## 追記
調べてみたところFusion360で直接メートル系に変換できました。無知で申し訳ない。。。
「メッシュで保存」→「単位のタイプ」でメートルを選択してください。
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017430/81a7c40f-478e-394e-c40e-af593bad606f.png)
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017430/620855ff-f19b-e8b5-d677-57b51484eb44.png)

自分は今まで「ファイル」→「エクスポート」で出力する方法しか知らなかったため、ためになりました。
以下の方法は、すでにmmで出力してしまった際に修正する方法として活用してください。


# インストール
```
pip install numpy-stl
```

# スクリプト
```python

from stl import mesh

# 変換したいstlファイル名
file_name = "sample.stl"
#出力ファイル名
output_file_name = "sample_m.stl"

mesh = mesh.Mesh.from_file(filename=file_name)

# 0.001倍することでmmからmに変換
mesh.x = mesh.x * 0.001
mesh.y = mesh.y * 0.001
mesh.z = mesh.z * 0.001

mesh.save(output_file_name)


```
influxdb 2.4 アップデートトラブルシューティング

# 管理サイトへログインしようとすると以下ログが出てログインできない
> http: accept error: accept tcp [::]:8086: accept4: too many open files; retrying in 1s" log_id=0ctw9sxl000 service=http

## 原因
ファイルディスクリプタが少ない

* systemdのinfluxdbに割り当てたファイルディスクリプタが少ない
* systemdのtelegrafに割り当てたファイルディスクリプタが少ない

私は2つ目だったので非常にわかりづらかった。

----
再発・・・・。

こちらの記事の全体のファイルディスクリプタ設定を上書きし解決。
http://blog.father.gedow.net/2016/03/28/limits-of-systemd/

結局どのサービスの限界に抵触していたか不明であった。
【PHP】【個人開発】メモアプリ

自由にメモを書いたり、管理できるサービスをリリースしました。
![メモアプリの流れ6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/40911e8b-4f55-0939-e24b-666ccdf05d67.gif)

# アプリの流れ
メモの投稿はヘッダーの`memo`から行います。
![メモ投稿.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/7efa7423-8742-68d0-0a84-1fb7f784bcda.gif)

削除、お気に入り登録、編集をメモのボタンから自由に行えます。
![メモ削除、編集、お気に入り.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/94d414fd-a958-dc1c-8a2c-7bc77bed43e9.gif)
グループごとにメモを管理することもできます。
![メモグループ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/a3ab9eb8-862d-8dd5-d5a9-d24b7199aa1c.gif)

# 実装機能
### ドラッグ＆ドロップ機能
指定の要素をドラッグ＆ドロップできる機能です。
![メモドラッグ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/81cebbbd-d4f6-1e60-5d8a-98b00732666a.gif)

https://qiita.com/ryouya3948/items/54527f6a790b9fdbecc5

# 使用技術
■フロントエンド
・HTML
・CSS
・Javascript

■バックエンド
・PHP
・FWなし

■インフラ/開発環境
・heroku
・Mysql
・VScode
・Git/GitHub

# URL
https://memoapp3948.herokuapp.com/user_login/user_top.php
【SwiftUi】StateObjectとObservedObjectの違い



# はじめに

`ObservedObject`を用いたページにおいて、その上位ページの値がeventlistenerによって変化する度に現在のページが初期化されることがあった。
ViewModelからデータを共有する方法は大きく`StateObject`と`ObvservedObject`の2つがある。
よってこの2つの使い方や特徴をまとめる。

# 環境
Xcode 13.3.1


# 構成
APP
| &nbsp; Mainview.swift
＼ーchildrenPages
　　|　　ObservedObjectView.swift
　　|　　StateObjectView.swift

# Code
```swift: MainView
class MainViewModel: ObservableObject {
    @Published var mainCount = 0
}

struct MaintView: View {
    
    @ObservedObject var viewmodel = MainViewModel()

    var body: some View {
        NavigationView {
            VStack{
                Text(viewmodel.mainCount.description)
                    .font(.title)
                
                NavigationLink("ObservedObject") {
                    ObservedOjectView(mainCount: $viewmodel.mainCount)
                }
                .font(.title)
                .padding()
                
                NavigationLink("StateObject") {
                    StateObjectView(mainCount: $viewmodel.mainCount )
                }
                .font(.title)
                .padding()
            }
        }
    }
}
```
```swift: StateObjectView
class StateObjectViewModel: ObservableObject {
    @Published var count = 0
    
    func addCount() {
        self.count += 1
    }
}

struct StateObjectView: View {
    @StateObject var viewmodel = StateObjectViewModel()
    @Binding var mainCount : Int
    
    var body: some View {
        VStack{
            Text("StateObject : \(viewmodel.count.description)")
                .font(.title)
                .padding()
                .onTapGesture {
                    viewmodel.addCount()
                }
            
            Button {
                self.mainCount += 1
            } label: {
                Text("change main view count")
                    .font(.title)
            }
            Text(self.mainCount.description)
                .font(.title)
        }
    }
}
```

```swift: ObservedObjectView
class ObservedOjectViewModel : ObservableObject {
    @Published var observedCount = 0
    
    func addCount() {
        self.observedCount += 1
    }
}

struct ObservedOjectView: View {
    @ObservedObject var viewmodel = ObservedOjectViewModel()
    @Binding var mainCount : Int
    
    var body: some View {
        VStack{
            Text("Observed : \(viewmodel.observedCount.description)")
                .font(.title)
                .padding()
                .onTapGesture {
                    viewmodel.addCount()
                }
            
            Button {
                self.mainCount += 1
            } label: {
                Text("change main view count")
                    .font(.title)
            }
            Text(self.mainCount.description)
                .font(.title)

        }
    }
}
```

# Screen
![Sep-11-2022 23-14-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/b729056f-dce2-b7bd-d370-685521725f63.gif)


`@Binding`によって上位ページの値が変化するようにした。

`@ObservedObject`: 画面に入る時、初期化されない。 上位ページによって初期化される。
`@StateObject`: 画面に入る時、初期化される。　上位ページによって初期化されない。

DBを用いたプロジェクトでは値が頻繁に変化するので、`@StateObject`を利用することが多いと思いました。
【Ruby】特定のレベルよりも重要なログのみを出力したい

# 概要
開発時にはデバッグログまで記録し、運用時には重要なログしか残さないという制御をするには、Logger#levelメソッドでログを記録するしきい値を指定します。

# LOGの段階
* 6段階のログレベルに分けてログを記録します。

* UNKNOWN
  * 常に記録されるべき不明なエラー

* FATAL
  * プログラムをクラッシュさせるような制御不可能なエラー

* ERROR
  * 制御可能なエラー

* WARN
  * 警告

* INFO
  * 一般的な情報

* DEBUG
  * 低レベルの情報

* Logger#levelメソッドにINFOを設定した記載例
```ruby
require 'logger'

log = Logger.new(STDOUT)
log.level = Logger::INFO #INFO以上のログのみ出力

log.debug("debug message")
log.info("info message")
log.warn("warn message")
```

上記の記載例だとINFOよりも重要度の低い情報は記録されなくなります。(DEBUGは表示されない)

# 参考
https://docs.ruby-lang.org/ja/latest/library/logger.html