OmniAICreator/Qiita-1.07M huggingface dataset:
ApexでSJIS指定バイト数まで文字列を切り詰め

```apex
  // SJIS指定バイト数まで文字列切り詰め
  private static String truncateToSjisByteLength(String str, Integer maxLen) {
    if (str == null) {
      return null;
    }
    Integer len = 0;
    for (Integer i = 0; i < str.length(); i++) {
      len += str.codePointAt(i) <= 127 ? 1 : 2;
      if (len > maxLen) {
        return str.substring(0, i);
      }
    }
    return str;
  }
```
VSCodeを用いたTang Nano 9K開発環境構築

## はじめに
Tang Nano 9KをVSCodeで使うための方法です
参考サイト：[Tang Nano 9K: Getting Setup](https://learn.lushaylabs.com/getting-setup-with-the-tang-nano-9k/)

## 準備
- WSL2：Ubuntuを使用
- VSCode：Ubuntuと連携させておく
- VSCode拡張機能：[Lushay Code](https://marketplace.visualstudio.com/items?itemName=lushay-labs.lushay-code&ssr=false&ref=learn.lushaylabs.com)，[Verilog-HDL/SystemVerilog](https://marketplace.visualstudio.com/items?itemName=mshr-h.VerilogHDL&ref=learn.lushaylabs.com)，[WaveTrace](https://marketplace.visualstudio.com/items?itemName=wavetrace.wavetrace&ref=learn.lushaylabs.com)
- [OSS-Cad-Suite](https://github.com/YosysHQ/oss-cad-suite-build/releases?ref=learn.lushaylabs.com)：linux-x64版をUbuntu内にダウンロードし，解凍しておく

## Toolchain
WSLでVSCodeを立ち上げ、"FPGA Toolchain"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604444/1e01379b-13ce-1629-f7e5-529fd4ba2024.png)
解凍した`oss-cad-suit`の`bin`フォルダを参照する

## USBを接続
参考サイト：[USB デバイスを接続する](https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb)
### Ubuntu操作
Ubuntu上のターミナルで以下のコマンドを実行
```sh
lsusb -t
```
実行結果
```sh
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=vhci_hcd/8p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=vhci_hcd/8p, 480M
```
Tang Nano 9Kが認識されていないことを確認
下記のコマンドを実行
```sh
sudo apt install linux-tools-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
```
### Windows操作
管理者権限PowerShellで以下のコマンドを実行
```powershell
PS C:\> winget install --interactive --exact dorssel.usbipd-win
```
接続されている`BUSID`を確認
```powershell
PS C:\> usbipd list
```
USBデバイスを接続
```powershell
PS C:\> usbipd bind --busid <BUSID>
PS C:\> usbipd attach --wsl --busid <BUSID>
```
Ubuntuで
```sh
lsusb -t
```
を実行すると，接続したデバイスが表示される

## コード作成
Ubuntu上の任意のフォルダで`counter.v`を作成
```verilog:counter.v
module top
(
    input clk,
    output [5:0] led
);

localparam WAIT_TIME = 13500000;
reg [5:0] ledCounter = 0;
reg [23:0] clockCounter = 0;

always @(posedge clk) begin
    clockCounter <= clockCounter + 1;
    if (clockCounter == WAIT_TIME) begin
        clockCounter <= 0;
        ledCounter <= ledCounter + 1;
    end
end

assign led = ledCounter;
endmodule
```

同じフォルダ内に`tangnano9k.cst`を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604444/33851893-7071-d58d-3ffc-1e7513c3b324.png)
"Add From Template"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604444/d15e1601-ef51-aea4-9c53-2a742f9b76ee.png)
"Clock"と"LEDs"にチェックを入れて"Add Constraints"をクリック

## 書き込み実行
"FPGA Toolchain"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604444/54b940aa-f647-ada3-03c6-75f863ca1149.png)
"Build and Program"を選択すると書き込みが実行される．

### エラーが出た場合
特に設定していなければ以下のエラーが出る
```sh
unable to open ftdi device: -4 (usb_open() failed)
JTAG init failed with: unable to open ftdi device
```
[こちら](https://github.com/trabucayre/openFPGALoader/issues/245)を参考に，Ubuntuで以下のファイルを作成
```/etc/udev/rules.d/99-ftdi.rules
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666"
```
- 自分の環境ではUbuntuの再起動が必要でした（再起動をするとUSBの接続が切れるので再接続が必要）
- 異なるボードを使用している場合は`idVendor`と`idProduct`を相応しいものに充ててください
VSCode で Intelephense 利用時の FuelPHP の Core Library 参照エラー解決法

# はじめに

VSCode などのエディタで PHP の LSP を提供してくれる Intelephense は、PHPで開発する人にとってなくてはならないツールです。
しかし、FuelPHP フレームワークを使って開発していると、FuelPHP の Core Library を利用している場所で参照エラーが発生し、とても不便な状態になります。

そこで、今回はこの状態を解決する方法をお伝えします！

# 問題の背景

FuelPHP で Core Library を利用する場合にエラーが発生する原因は `Fuel\Core\ClassName` を `ClassName` で参照しているためです。
FuelPHP ではデフォルトで `Fuel\Core\ClassName` を `ClassName` として参照できるようにエイリアスが設定されていますが、このエイリアスが貼られているかどうかは動的に解析しない限りわかりません。
そのため、Intelephense はそのようなクラスが存在しないとして参照エラーを発生させます。

# 解決策

この問題を解決するためには `fuel/app/config/development/alias.php` などのどこからも参照されないファイルを作成します。
例えば `Config` クラスが参照エラーになっている場合、`class Config extends Fuel\Core\Config {}` という一行を追記することで解決します。
このファイルは `Autoloader` で読み込まれる場所にある必要はなく、作業ディレクトリ以下のどこかに存在していれば問題ありません。
今回は `fuel/app/config/development` に置きましたが、直接作業ディレクトリに `alias.php` を配置しても解決します！
もちろん `alias.php` という名前である必要もないです。

# コード例

例えば `Config`、`Cookie`、`Session` がエラーとなっている場合、以下のように記述することで参照エラーが解決します。

```php:fuel/app/config/development/alias.php
<?php

class Config extends Fuel\Core\Config {}
class Cookie extends Fuel\Core\Cookie {}
class Session extends Fuel\Core\Session {}
```

独自クラスを `fuel/app/bootstrap.php` などで `\Autoloader::add_classes()` を利用して追加している場合は、独自クラスを継承することで解決します。

```php:fuel/app/config/development/alias.php
<?php

class Hoge extends My\ClassName\Hoge {}
```

# まとめ
これで Intelephense を使って快適な PHP 開発ができるようになります！是非試してみてくださいね！

Happy coding!

# 余談
自分は VSCode を利用したことがなく、常に vim で開発を行っております。
vim での開発時に Intelephense の参照エラーを解決した方法社内で共有したところ、VSCode で同じ問題に悩まされていた人たちも解決したようでした。
思った以上に社内で反響があったので記事に残しました！
ライトが透けるマテリアル備忘録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/a07384b9-1686-895b-9b5b-6f8974cbf3b5.png)
ライトと影を透過するマテリアルができたので備忘録（正しい使い方かどうかはわかりません）

# マテリアル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/325d66a3-06f5-eddc-97c3-03471148f25a.png)

Shading Modelをsubsurfaceにする
subsurface Colorにカラー情報をつなげる

Opacityの値によって影とライトの出方に差が出る。
左がOpacity0.1　右が1
※Opacityを0にすると影が消える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/14aa48f4-0c2e-f82b-5b80-c187d3e7494a.png)


# 使用した時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/85194363-0d14-cdd4-7241-f6fccbccbb85.png)
SpotLight→三角錐に従って減衰する
Pointslight→こちらも円に従って減衰する　内部においても発行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/9b5ff1fd-62ae-a894-89ce-e5a33b111234.png)
ライトカラーも反映される
MSYS2 を用いて ffmpeg+libfdk-aac のコンパイルする

注意
この記事は二年ほど前に下書きで書き留めていた記事で、勿体ないので公開してみるが、公開時点での追試は行っておらず聊か本筋とは別の不具合が有ったのかもしれないが、何かの参考になればと思い公開してみるので、疑問点はコメントでおねしゃすm(__)m

# 私的ビルドなメモ👏
巷のビルドメモが溢れちょるけ、ワシが google せんせーの教えを参考に、私的ビルドで aac-he なコーデックと https プロトコルの解釈出来よる ffmpeg ビルドメモじゃけ、ちんまいコトに矛盾点が有るかもしれんけ、何かの参考程度に公開しよる。

# 大前提
MSYS2 が既にインスコされているものとして記述しよるけ、未インスコの場合は先に MSYS2 をインスコしてから進めんさい。
[MSYS2 の取得先](https://msys2.github.io)
注：ix86 の開発環境インストーラーが 2020 年から更新されちょらんけ[MSYS2 ix86 インストーラー 2020/5/17版](https://sourceforge.net/projects/msys2/files/Base/i686/msys2-i686-20200517.exe/download)で最終版が公開されちょる。
# MSYS2 更新
```sh
% pacman -Syu
```
必要に応じて、数回更新する必要があるけ(大体三回)全ての更新を完了させておく。

次にビルドで必要とするパッケージをインスコする。

```sh:ix64版
% pacman -S --needed base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-glib-networking gcc
```
```sh:ix86版
% pacman -S --needed base-devel mingw-w64-i686-toolchain mingw-w64-i686-glib-networking gcc
```
次に、.bash_profileを編集し、次の行を追加します。

```sh
export PATH="$PREFIX/bin:$PATH"
export PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$PREFIX/lib:$LD_LIBRARY_PATH"
```

書き換えが終わりよったら .bash_profileをリロードしんさいよ～

```sh
% . .bash_profile
```
これで、MinGW の環境設定は完了。

# gmp のダウンロードとビルド並びにインスコ
```sh
% wget -O- ftp://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz | bsdtar xf -
% cd gmp-6.2.1/
% ./configure
% make install
% cd ../
```

# libfdk-aac のダウンロードとビルド並びにインスコ
```sh
% wget -O- https://github.com/mstorsjo/fdk-aac/archive/refs/tags/v2.0.2.tar.gz | bsdtar xf -
% cd fdk-aac-2.0.2/
% ./autogen.sh
% ./configure
% make install
% cd ../
```

# ffmpeg のダウンロードとビルド並びにインスコ
```sh
% wget -O- https://ffmpeg.org/releases/ffmpeg-4.4.1.tar.xz | bsdtar xf -
% cd ffmpeg-4.4.1/
% ./configure --enable-gmp --enable-version3 --disable-ffplay --disable-ffprobe --disable-doc --disable-htmlpages --disable-podpages --disable-txtpages --disable-manpages --enable-small --enable-openssl --enable-libfdk-aac
% make install
% cd ../
```

一応お終い。

gmp のビルドとインスコは不要鴨😉

# おまけ libx264 のダウンロードとビルド並びにインスコ
```sh
% wget -O- https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2 | bsdtar xf -
% cd x264-master/
% env CC=/mingw64/bin/gcc ./configure --enable-shared --enable-static --disable-asm
% make install
```
freebsd-update(8) でパッチが落ちてこない

注意
この記事は三年ほど前に下書きで書き留めていた記事で、勿体ないので公開してみるが、公開時点での追試は行っておらず聊か本筋とは別の不具合が有ったのかもしれないが、何かの参考になればと思い公開してみるので、疑問点はコメントでおねしゃすm(__)m

# FreeBSD RELEASE 13 系が出た影響で...
FreeBSD 12.x の i386 が Tier 1 から Tier 2 へ降格されたので、[freebsd-update(8)](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=freebsd-update&dir=jpman-12.2.2%2Fman&sect=0) が利用できなくなった(らしい)。

実際に実行しよると、以下の通りになる。

```text
# freebsd-update fetch install
Looking up update.FreeBSD.org mirrors... none found.
Fetching metadata signature for 12.2-RELEASE from update.FreeBSD.org... failed.
No mirrors remaining, giving up.

This may be because upgrading from this platform (i386)
or release (12.2-RELEASE) is unsupported by freebsd-update. Only
platforms with Tier 1 support can be upgraded by freebsd-update.
See https://www.freebsd.org/platforms/index.html for more info.
```

[web ページ](https://www.freebsd.org/ja/platforms/)の更新は執筆時点ではマダみたいじゃが、[アナウンス](https://docs.freebsd.org/cgi/getmsg.cgi?fetch=0+0+archive/2021/freebsd-announce/20210131.freebsd-announce)の予定通りに RELEASE 13 系がドロップした時点から、update 出来なくなったようじゃ。

セキュリティパッチは流れて来よるのか知らんけどw

# ほじゃ、[devel/git](https://cgit.freebsd.org/ports/tree/devel/git) 入れんのぉ🤔
開発に参加しよらん ***普通*** の人はいくら作業PCがパワフルになっちょるとは言え、パッケージのダウンロードやらビルドもデカいし時間もかかりよるご本尊をインスコするのも些か大儀い。
そこで [net/cvsup](https://svnweb.freebsd.org/ports/head/net/cvsup/Makefile?revision=367486&view=markup&pathrev=367786) の用に気軽なソースコード同期しよるカラクリが、[net/gitup](https://cgit.freebsd.org/ports/tree/net/gitup) が ports skeleton として用意されちょるので、使ってみる。

[gitup(8)](https://github.com/git-up/GitUp/blob/master/README.md)

# KY活動
御呪い的に、freebsd-update を実行してもスルーさせるために freebsd-update.conf を書き換えておく。

```shell
sed -i.ORIG 's|ServerName|#ServerName|' /etc/freebsd-update.conf
```

# ここから本番！
```shell:パッケージでバイナリインスコ
pkg install net/gitup
```

```shell:ports_skeletonでインスコ
cd /usr/ports/net/gitup && make install
```

```shell:12.2が対象じゃったら...
sed -iORIG 's|releng/11.4|releng/12.2|' /usr/local/etc/gitup.conf
```

freebsd-update で採取しよった作業ディレクトリとご本尊ディレクトリを削除じゃが、独自で kernel を作っちょったら、適宜 conf ディレクトリをバックアップする。

```shell
/rescue/tar cJf ORIGINKERNEL.tar.xz /usr/src/sys/i386/conf
```

```shell:一気に消し消し
rm -Rf /usr/src /var/db/freebsd-update
```

# gitup でソースコードを手元にコピー
段取りは整いよったけん、gitup でソースコードをご本尊から持ってくる。

```shell
gitup release
```

```text:作業中はこんな感じ
# Host: git.freebsd.org
# Port: 443
# Repository: /src.git
# Target: /usr/src
# Want: 81526c74d9cd16944ca240573680c358a031c989
# Branch: releng/12.2
# Action: clone
 + /usr/src/.arcconfig
 + /usr/src/.arclint
 + /usr/src/.cirrus.yml
 + /usr/src/.gitattributes
 + /usr/src/.gitignore
 + /usr/src/COPYRIGHT
 + /usr/src/LOCKS
 + /usr/src/MAINTAINERS
 + /usr/src/Makefile
 + /usr/src/Makefile.inc1
 + /usr/src/Makefile.libcompat
 + /usr/src/Makefile.sys.inc
 + /usr/src/ObsoleteFiles.inc
 + /usr/src/README
 + /usr/src/README.md
...snip
```
# 結局は...
ソースコードしか、当然じゃが取ってこれんけ、手元でバイナリを作る必要がある。

```shell:😢
cd /usr/src/ && make buildworld buildkernel installworld installkernel
reboot
```

はぁ...
mp4 ファイルにサムネイル付ける

# 前置き
ffmpeg コマンドは実に豊富なオプションが用意されちょるのだが、使う機会の低い引数群は忘れがち💦
じゃけ、今回は過去に書いちょる ffmpeg コマンドでサムネイルを埋め込むってヤツを、シェルスクリプト化して、手抜きをして見る作戦w
```shell:add_thumbnail.sh
#!/bin/sh
if test $# = 0
then
echo Usage `basename $0` \"aac or m4a file\" \"thumbnail file\"
exit
fi

FILE=$(basename $1 | awk -F. '{print$1}')
EXT=$(basename $1 | awk -F. '{print$2}')

if test ${EXT} = "m4a" -o ${EXT} = "aac"
then
ffmpeg -hide_banner -i ${FILE}.${EXT} -i $2 -map 0:a -map 1:v -c copy -disposition:1 attached_pic ${FILE}_thumbnail.${EXT}
else
echo Unsupported files.
fi

exit
```

# 余談
毎回書いちょるシェルスクリプトに一貫性が無いのは性格上の問題じゃけ、統一化に向けての提案お待ちしとりますm(__)m
独習C++ 1章 

- When I declare any variable, the value are not decided.

how to declare and initilize at the same time?

```
int a(0);
int b = 1;
int c{2};
int d = {3};
```

- const

```
const int a = 3;
int const a = 3;
```

- fall through

```
switch(a)
{
    case 1: FALL THROUGH:
    case 2: FALL THROUGH:
    case 3: 
        std:: cout <<~
}
```
In the above code, If a is 1, 2, or 3, we hit the same code.(std::cout~~)

### 1.5.4 const and pointer

1. What the pointer points to is const.(*a = 5ができない)
There is `const` to the left of `*`.
```
const int* a = 10;
int const* a = 15;
```
2. The pointer itself is immutable.(a = &bができない)
There is const to the right of `*`.
```
int *const a = 30;
```

これはダメ we cannot change what the pointer points to.
*ptr = 2でerror
```
    #include <iostream>
     int main()
     {
        int a = 42;
        const int* ptr = &a;
        *ptr = 2;
        std::cout << *ptr << std::endl;
     }

```

これはいい。we change the pointer itself.
```
    #include <iostream>
     int main()
     {
        int a = 42;
        int b = 10;
        const int* ptr = &a;
        ptr = &b;
        std::cout << *ptr << std::endl;
     }

```

we cannot assign const variable to not const pointer.
```
#include <iostream>

 int main()
 {
    const int a = 42;
    int b = 10;
    int* ptr = &a;
    ptr = &b;
    std::cout << *ptr << std::endl;
 }
```

## 1.5.5 null pointer
null pointer is a special address which does not point to any variable.
we can create null pointer by assigning 0 or nllptr.
```
    int *ptr = 0;
    ptr = nullptr; 
```

nullptr does not point to anything, so the following code causes segmentation fault.
```
int main()
 {
     int* ptr = nullptr;

     *ptr = 42; // ヌル参照

     std::cout << "ヌル参照のあと" << std::endl;
 }
```

### 1.5.6 cast

```
#include <iostream>

int main()
{
   char c = 99;
   std::cout << static_cast<int>(c) << std::endl;
}
```

## 1.6 配列と文字列

```
int arr[5];
int arr[5] = {1,2,3,4,5};
int arr[] = {1,2,3,4,5};
```

If array's length is larger than initialized size, the rest is initialized as 0.

```
int arr[5] = {1,2,3}
→arr is {1,2,3,0,0}
```

### 1.6.2 size of array

```
#include <iostream>

int main()
{
   int arr[5] = {};
   int size = sizeof(arr);
   std::cout << size << std::endl;
}
```

size is 20 because sizeof() returns the byte.
```
#include <iostream>

int main()
{
   int arr[5] = {};
   int size = sizeof(arr);
   std::cout << size/sizeof(int) << std::endl;
}
```

### 1.6.3 文字列
`\0` is null character.


```
#include <iostream>

int main()
{
   std::string string = "hello,\0 nullcharacter";

   std::cout << string << std::endl;
}
```
the output is "hello,".

### 1.7.2 range based for
```
 
```
投稿 37 RARP 2024/08/06

本日の勉強時間 0.5H

自身のIPアドレスをMACアドレスから求めるためのプロトコル。外部記憶装置を持たないデバイスがネットワークに接続した際に、IPアドレスを問い合わせるために使用する。
【超簡単解決】Next.js で Tailwind CSS が Storybook 上では適用されない

## この記事は以下の人へ向けた解決策です

1. **npx create-next-app@latest --typescript** で Next.js のプロジェクトを作成時に Tailwind CSS を使えるように選択した
2. そして実際に Next.js の自動生成した page.tsx などでは Tailwind CSS が適用されていることを確認した
3. 次に Storybook を使いたいので **npx storybook@latest init** で Storybook をインストールした
4. Next.js 上では Tailwind CSS が適用されたのに Storybook 上では適用されない。 ← イマココ

補足：今回 create-next-app 時に src フォルダを使用することにしているので使用していない方はフォルダ構成 src/app を app に読み替えて下さい。

## 解決時の依存関係のバージョン

- "typescript": "^5"
- "next": "14.2.5"
- "tailwindcss": "^3.4.1"
- "storybook": "^8.2.7"

## 解決手順

https://storybook.js.org/recipes/tailwindcss#2-provide-tailwind-to-stories

にしたがって .storybook/preview.ts を開いて以下のコードを追記する。

```ts
import "../src/app/globals.css";
```

もしこのファイルを消していたのなら、

https://nextjs.org/docs/app/building-your-application/styling/tailwind-css#importing-styles

にしたがって src/app/globals.css を作成し、以下のコードを記述する。

```src/app/global.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

# 追記

上記の内容を実行しても Storybook で表示されるコンポーネントに Tailwind CSS が適用されていない場合は **tailwind.config.ts** に以下の記述があるか確認する。

```ts
import type { Config } from "tailwindcss";

const config: Config = {
  content: [
    // この配列に適用されていないコンポーネントのパスが含まれているか確認する
  ]
};
```
GitHub ActionsでCI/CDとDevSecOps推進ツールの学習リポジトリを作った

[DevSecOps](https://speakerdeck.com/ryosukedtomita/cdturudao-ru-nosusume)についてまずこの資料で雑に理解してから進めると良い。

## INDEX

- [ABOUT](#about)
- [FEATURE](#feature)
- [ENVIRONMENT](#environment)

---

## ABOUT

- GitHub Actoins，CI/CD，DevSEcOps推進ツールの使い方を書いた学習リポジトリを作りました。
- リポジトリはこれ→☆https://github.com/RyosukeDTomita/devsecops-demo-aws-ecs
    - [README.md](https://github.com/RyosukeDTomita/devsecops-demo-aws-ecs/)に環境構築や概要
    - [doc/](https://github.com/RyosukeDTomita/devsecops-demo-aws-ecs/tree/master/doc)にいろいろなツール等の使い方をまとめてあります。

---

## FEATURE
このRepositoryで学べること。

### GitHub Actions等(git push後)で使用されるツールの使い方

- ghalint: GitHub Actionsで実行されるworkflows用のlinter
- github-comment: GitHub Actionsで実行されるCIが失敗したときにコメントとしてエラーを出力する。
- semgrep: GitHub Actionsで実行するSASTツール
- trivy: イメージのスキャンやdependency checkができる。dependency checkはGitHub Actionsで実行，イメージスキャンはTODO

### GitHub Actionsのテクニック

- matrixでバージョンや環境を変えて並列テスト
- pathsフィルター
- GitHub Environments variablesやsecretsの使い方
- WorkflowのバッチをREADME.mdにつける
- CodeQLを使ってスキャン結果等を出力する
- zipを作ってartifactとして配置する
- RepositoryのReleasesを自動作成
- github-pagesにデプロイする。

### GitHub Actions関連のバージョン管理ツールの使い方

- aqua: GitHub Actions等で使用するCLIツールのバージョン管理ができる。
- pinact: GitHub Actionsで使うactionsのバージョンをフルコミットハッシュに変換。

### pre commit(git committ前)に使うツールの使い方

- pre-commit: git commit前に特定のツールを実行し，失敗ならcommitさせない。
  - hadolint
  - ESLint
  - Prettier(Formatter)
  - Markdown linter
- git-secret: git commit時にクレデンシャルのパターンにマッチするものがあれば，commitさせない。

### VSCode Extensions(Securityに関係のありそうなものだけ抜粋)

- [hadolint](https://marketplace.visualstudio.com/items?itemName=exiasr.hadolint): Dockerfileのlinter
- [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint)
- [zenkaku](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku): 半角スペースを可視化
- [Code spell checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
- ESLint
- Prettier

### その他細かいGitHubのテクニック
- CODEOWNERSの使い方 TODO: そのうちドキュメント化する
- RepositoryのTemplates関連
  - pull_request_template
  - ISSUE_TEMPLATE
  - reply template]
- branchルールセットについて TODO: そのうちドキュメント化する

---

## ENVIRONMENT

### デプロイするアプリ

`create-react-app`で作られるデフォルトそのまま。

---
【C++】vectorの最大、最小値のインデックスを取得する

maxで最大値を取得すること自体は忘れないのですが、インデックスを取得する方法はよく忘れてしまうので、備忘録として記事にしてみました。
イテレータを取得するとインデックスと値の両方を取得できるので良いですね。


## max_elementで取得する
まずmax_elementでイテレータを取得して、それにdistanceを利用してインデックスを取得します。

ちなみにdistanceではvectorの最初の要素と見つかった最大値のイテレータとの差を取得しています。
```c++
// 最大値のイテレータを取得
auto iterator = std::max_element(vec.begin(), vec.end());
// 最大値のインデックスを取得
int index = std::distance(vec.begin(), iterator);
```

ちなみに、最小値の場合はmax_elementの代わりにmin_elementを利用します。

```c++
// 最小値のイテレータを取得
auto iterator = std::min_element(vec.begin(), vec.end());
// 最小値のインデックスを取得
int index = std::distance(vec.begin(), iterator);
```

## max_elementから最大値の値を取得する
先ほど取得したイテレータから値を取得することも出来ます！

```c++
// 最大値を取得
auto max_iterator = std::max_element(vec.begin(), vec.end());
int max_val = *iterator;

// 最小値を取得
auto min_iterator = std::max_element(vec.begin(), vec.end());
int min_val = *iterator;
```


## 最後に
競プロ初心者なので改善点や間違っている点などございましたら、ご教示いただけますと幸いです。
元々Pythonでやってましたが、c++だとなかなか難しいものですね。。。
「A - 高橋君とお肉」の簡単な解き方

# AtCoderのA問題が解けない
[A - 高橋君とお肉](https://atcoder.jp/contests/arc029/tasks/arc029_1)
A問題が解けなくて調べたら、
「bit全探索」を使用するとのことでした。

A問題だから簡単な解き方があるはずと試行錯誤しまして...
ソートを使ってシンプルに解くことができました。

# 解き方

各肉の調理時間を降順に並べて、
肉焼き器に調理時間を分配します。

```
#include<bits/stdc++.h>
using namespace std;

int main(){
  int N;
  cin >> N; // 肉の数
  vector<int> t(N); // 各肉の調理時間を格納する配列
  int sum1 = 0, sum2 = 0; // 2つの肉焼き器の合計調理時間
  
  // 各肉の調理時間を入力
  for(int i = 0; i < N; i++)
    cin >> t[i];
    
  // 調理時間を降順にソート
  sort(t.begin(), t.end(), greater<int>());
  
  // 2つの肉焼き器に調理時間を分配
  for(int i = 0; i < N; i++){
    if(sum1 > sum2)
      sum2 += t[i];
    else
      sum1 += t[i];
  }
  
  // 合計調理時間の大きい方を出力
  cout << max(sum1,sum2) << endl;
  return 0;
}
```
【GitHub】Markdownでアラートを表示する方法

以下のように記述するとアラートを表示できます。

```md
> [!NOTE]
> コンテンツをざっと読むときでもユーザーが知っておくべき有用な情報。

> [!TIP]
> 物事をより良く、より簡単に行うための役立つアドバイス。

> [!IMPORTANT]
> ユーザーが目標を達成するために知っておく必要のある重要な情報。

> [!WARNING]
> 問題を回避するためにユーザーがすぐに対応する必要がある緊急情報。

> [!CAUTION]
> 特定の行動のリスクや否定的な結果についてのアドバイス。

```

![スクリーンショット 2024-08-07 23.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d2822fc4-407b-1fa8-4e48-b2044a40ab59.png)

https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts
Pandasで標準化と元に戻す方法

pandasで標準化を元に戻すという意味のないことを考えてみました。
まず標準化の式はこうなので
```math
t=\frac{x-μ}{σ}
```
元に戻すにはこうなります。
```math
x=tσ+μ
```
では実際にやってみます
```Python3
import pandas as pd

df = pd.read_csv("iris.csv")
df.drop("category", axis=1).describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/c2b9605a-0e19-b70f-0021-ab9f146b4200.png)
※PCを変えたので画質が落ちています。

続いて標準化関数です。
```Python3
def standard(x):
    val = {}
    for col in x.columns:
        val[col] = {"std" : x[col].std()}, {"mean" : x[col].mean()}
        x[col] = (x[col] - x[col].mean()) / x[col].std()
    return x, val
```
そして元に戻す関数です。
```Python3
def reverse(x, val):
    for col in x.columns:
        x[col] = x[col] * val[col][0]["std"] + val[col][1]["mean"]
    return x
```
では実際に標準化と元に戻すのをやってみましょう。
```Python3
x, val = standard(df.drop("category", axis=1))
x.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/c5c1f8b3-0ace-24dc-20ed-09a900fa8832.png)
標準化されました。
続いて元に戻します。
```Python3
x = reverse(x, val)
x.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/dd2f6c4f-92d5-abfb-a7d6-5ee484790093.png)

というわけで元に戻りました。

# まとめ
Pandasでやらないといけないときの参考に
JavaでのStack, Queue, PriorityQueue, Map

Javaのコレクションフレームワークで、  

* Stack(スタック)  
* Queue(キュー)  
* PriorityQueue(優先度付きキュー)  
* Map(連想配列)  

を扱う時によく使うやつのメモ。  
早見表的に各コレクションの主要な操作をまとめただけ。  


## Stack

- **インスタンスの型**： `Deque<E>`
- **実装クラス**： `ArrayDeque<E>`
- **操作**:
  - **追加**： `push(e)`
  - **取得＆削除**： `pop()`
  - **参照**： `peek()`

**使用例**:

```java
Deque<String> stack = new ArrayDeque<>();
stack.push("Hello");
stack.push("World");
System.out.println(stack.peek()); // World
stack.pop();
System.out.println(stack.peek()); // Hello
```

## Queue

- **インスタンスの型**： `Queue<E>`
- **実装クラス**： `ArrayDeque<E>`
- **操作**:
  - **追加**： `add(e)` / `offer(e)`
  - **取得＆削除**： `remove()` / `poll()`
  - **参照**： `element()` / `peek()`

※ `add(e)`, `remove()`, `element()` は操作が不成功の場合に例外をスロー  
※ `offer(e)`, `poll()`, `peek()` は操作が不成功の場合に特定の戻り値(通常はnullまたはfalse)を返し、例外はスローしない

**使用例**:

```java
Queue<String> queue = new ArrayDeque<>();
queue.add("Hello");
queue.add("World");
System.out.println(queue.element()); // Hello
queue.remove();
System.out.println(queue.element()); // World
```

## PriorityQueue

- **インスタンスの型**： `Queue<E>`
- **実装クラス**： `PriorityQueue<E>`
- **操作**:
  - **追加**： `add(e)` / `offer(e)`
  - **取得＆削除**： `remove()` / `poll()`
  - **参照**： `element()` / `peek()`

※ `add(e)`, `remove()`, `element()` は操作が不成功の場合に例外をスロー  
※ `offer(e)`, `poll()`, `peek()` は操作が不成功の場合に特定の戻り値(通常はnullまたはfalse)を返し、例外はスローしない

**使用例**:

```java
// 要素を降順に並び替え
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
pq.add(5);
pq.add(15);
pq.add(10);
System.out.println(pq.element()); // 15
pq.remove();
System.out.println(pq.element()); // 10
pq.remove();
System.out.println(pq.element()); // 5
```


## Map

- **インスタンスの型**： `Map<K,V>`
- **実装クラス**： `HashMap<K,V>`
- **操作**:
  - **追加/更新**： `put(key, value)`
  - **取得**： `get(key)`
  - **削除**： `remove(key)`
  - **キーの存在チェック**： `containsKey(key)`
  - **値の存在チェック**： `containsValue(value)`
  - **キーのセット取得**： `keySet()`
  - **値のコレクション取得**： `values()`
  - **キー・値ペアのセット取得**： `entrySet()`
  - **サイズ取得**： `size()`
  - **全要素の削除**： `clear()`

**使用例**:

```java
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
System.out.println(map.get("one")); // 1
map.remove("one");
System.out.println(map.containsKey("one")); // false
```
カンマ区切りの文字列から最後の文字列のインデックスを取得する方法【TypeScript】

## 説明

1. `replace(/,+$/, '')`を使って、末尾の不要なカンマを削除します。
2. `split(',')`でカンマ区切りの文字列を配列に変換します。
3. `length - 1`で、最後のコードが入っている位置を取得します。
```typescript
const codes = "A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,,,,,A16,,,,";

const trimmedCodes = codes.replace(/,+$/, '');
const lastIndex = trimmedCodes.split(',').length - 1;

console.log(lastIndex); // 15
```
8x8の回転を考える(90度回転)


参考

https://qiita.com/caa45040/items/33c0928c37de62ccfeb9

x 過去ログを見よ
x ArduinoUnoの予定は、未定

結果


![o_coq296.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/00402d67-9543-59ee-3544-073607377a23.jpeg)


プログラム

オンラインコンパイラ

```c++



#define bit8_put(aa) for(int ii=8;ii!=0;ii--) \
{if(aa & 0x80){printf("1");}else{printf("0");}aa=aa<<1;}


// ビットマップデータ
unsigned char databytes[8] = 

{

0b01100110,
0b10101111,
0b10111111,
0b11011111,

0b01111110,
0b01111110,
0b00111100,
0b00011000

};

// ビットマップデータ
unsigned char databytes_90[8]={0,0,0,0, 0,0,0,0};


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    printf("START\n\n");
    int a; //一時ワーク

    printf("INPUT\n");
    for(int ii=0;ii<8;ii++){
        a = databytes[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");

    //int a; //一時ワーク
    int a_mask;
    for(int ii=0;ii<8;ii++){
        //処理
        
        //         12345678
        a_mask = 0b00000001  << ii;
        a = databytes[ii] << ii;
        
        databytes_90[7] = databytes_90[7]|(a_mask & a); a = a >> 1;  
        databytes_90[6] = databytes_90[6]|(a_mask & a); a = a >> 1;
        databytes_90[5] = databytes_90[5]|(a_mask & a); a = a >> 1;
        databytes_90[4] = databytes_90[4]|(a_mask & a); a = a >> 1;

        databytes_90[3] = databytes_90[3]|(a_mask & a); a = a >> 1;
        databytes_90[2] = databytes_90[2]|(a_mask & a); a = a >> 1;
        databytes_90[1] = databytes_90[1]|(a_mask & a); a = a >> 1;
        databytes_90[0] = databytes_90[0]|(a_mask & a);
    
    }//for ii

    printf("OUTPUT\n");
    for(int ii=0;ii<8;ii++){
        a = databytes_90[ii];
        bit8_put(a);
        printf("\n");
    }//for ii
    printf("\n");

}//main




```


```

START

INPUT
01100110
10101111
10111111
11011111
01111110
01111110
00111100
00011000

OUTPUT
00001110
00111001
01110111
11111100
11111110
01111111
00111111
00001110


```
AtCoder 勉強記録[C++] その44

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## C - Slot Strategy
[C - Slot Strategy](https://atcoder.jp/contests/abc252/tasks/abc252_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  int n;
  cin >> n;
  vector<string> s(n);
  rep(i, n) cin >> s[i];
  vector<vector<int>> cnt(10, vector<int> (10, 0));
  for(int i = 0; i < n; i++){
    for(int j = 0; j < 10; j++){
      cnt[s[i][j] - '0'][j]++;
    }
  }
  int res = INT_MAX;
  for(int i = 0; i < 10; i++){
    int mx = 0;
    for(int j = 0; j < 10; j++){
      mx = max(mx, 10*(cnt[i][j]-1)+j);
    }
    res = min(mx, res);
  }
  cout << res << endl;
}
```
### 解法
文字とその文字が何番目かを入れておく二次元配列`cnt`を用意することで結果を求めることができる。
## C - Max - Min Query
[C - Max - Min Query](https://atcoder.jp/contests/abc253/tasks/abc253_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll q;
  cin >> q;
  map<ll,ll> s;
  set<ll> num;
  for(int i = 0; i < q; i++){
    ll a, x, c;
    cin >> a;
    if(a == 1) {
      cin >> x;
      num.insert(x);
      s[x]++;
    } else if(a == 2){
      cin >> x >> c;
      ll sub = min(c, s[x]);
      s[x] -= sub;
      if(s[x]==0) num.erase(x);
    } else{
      int smin = *num.begin();
      int smax = *num.rbegin();
      cout << smax - smin << endl;
    }
  }
}
```
### 解法
多重集合`S`を`x`を`Key`、`x`の数を`Value`とするmapとして扱う。さらに、`S`に含まれている要素を管理する`set`型である`num`を用意する。クエリ1の場合、`num`に`x`を追加し、`S[x]`の`Value`を1つ増やす。クエリ2の場合、`S[x]`の`Value`から`min(c, S[x])`を引き、`S[x]`が0となった場合、`num`から`x`を削除する。最後にクエリ3の場合、`num`の最大値から最小値を引いたものを出力する。
デザインパターンメモ


## Dispose

```csharp
public static class DisposeSample {
    public static void Execute() {
        using (var obj = new DerivedClass()) {
        }
    }

    class BaseClass : IDisposable {
        private bool _disposed = false;

        ~BaseClass() {
            Dispose(disposing: false);
        }

        public void Dispose() {
            Dispose(disposing: true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing) {
            if (_disposed) return;

            if (disposing)
            {
            }

            Console.WriteLine($"BaseClass.Dispose({disposing});");
            _disposed = true;
        }
    }

    class DerivedClass : BaseClass {
        private bool _disposed = false;

        protected override void Dispose(bool disposing) {
            if (_disposed) return;

            if (disposing)
            {
            }

            Console.WriteLine($"DerivedClass.Dispose({disposing});");
            base.Dispose(disposing);
            _disposed = true;
        }
    }
}
```
Execute()実行結果
```
DerivedClass.Dispose(True);
BaseClass.Dispose(True);
```
Docker mysql-sever で日本語を対応させる。（文字化け:[??????????]の修正）

## はじめに
docker で立てたmysql serverを利用しようとしたところ、日本語が文字化けしたのですが、思っていたより日本語を対応させるのに苦戦し、適格な記事もなかったので備忘録


## 今回の現象
下記のsqlを実行
```sql
select * from work;
```
出力
```bat
+--------+-------------------+------+----------+--------------+
| workid | title             | week | time     | latestpartid |
+--------+-------------------+------+----------+--------------+
|  27259 | ????????????????? | ???? | 23:45:00 | 27259004     |
+--------+-------------------+------+----------+--------------+
```
完全に文字化けしてます。


## 本題(解決方法)
### docker run
docker run をする時に、 MySQLサーバーのデフォルト文字セットをutf8mb4に設定する必要があります。
> 指定するオプション
> * --character-set-server=utf8mb4
> * --collation-server=utf8mb4_unicode_ci
>
>　![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832781/b28c6b35-9bd7-1b18-b505-a42afa584e03.png)
訳) 多くの設定オプションをフラグとして mysqld に渡すことができる。 これにより、cnf ファイルを必要とせずにコンテナを柔軟にカスタマイズできるようになる。 たとえば、すべてのテーブルのデフォルトのエンコーディングと照合順序をUTF-8（utf8mb4）に変更したい場合は、以下を実行するだけでよい：
> 
> 詳しくは下記の公式ドキュメント参照

https://hub.docker.com/_/mysql

**具体的な例**
```bat
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

```
:::note warn
オプションは記者の場合のものなので、適宜カスタムしてください。
:::
<br>

### データベース,テーブルの文字コードを変更する
私の場合は、データベース、テーブルを作成後に以下のコマンドを実行し、うまく動きました。
```sql
ALTER DATABASE <データベース名> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
```sql
ALTER TABLE <テーブル名> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
```sql
SET NAMES utf8mb4;
```
<br>

## 結果
下記のsqlを実行
```sql
select * from work;
```
出力
```bat
+--------+---------------------------------+---------+----------+--------------+
| workid | title                           | week    | time     | latestpartid |
+--------+---------------------------------+---------+----------+--------------+
|  27259 | かつて魔法少女と悪は敵対していた。 | 木曜配信 | 23:45:00 | 27259004     |
+--------+---------------------------------+---------+----------+--------------+
```
ちゃんと出てくれました。良かった。


## 最後に
公式ドキュメントとchat-GPT君の共闘でなんとか解決しました。
【JavaScript】記事まとめ

私が投稿したJavaScriptに関する記事のまとめです

https://qiita.com/ramgap/items/f1857de32b6f4a1d0732

https://qiita.com/ramgap/items/2d481d8d6368dfeb5232

https://qiita.com/ramgap/items/efe77ec71fdd52d0063d

https://qiita.com/ramgap/items/37179490faea03030513

https://qiita.com/ramgap/items/26ff153f119248c11cca

https://qiita.com/ramgap/items/837832dc4291e43d8b1e

https://qiita.com/ramgap/items/880f48e46fb02f044e9b

https://qiita.com/ramgap/items/6eff9f1c436a73458e38

https://qiita.com/ramgap/items/2d175783777677abd571
【MySQL】rootユーザーのパスワードを忘れてしまった時

MacにインストールされているMySQLを久々に使おうとしたけど
rootユーザーのパスワードがわからずMySQLを使えない・・・。

他のユーザーもパスワードを忘れてしまっている完全に詰んだ状態でしたので、
いろいろ調べてrootユーザーのパスワードを初期化するやり方を共有します。

# 解決したい課題
rootユーザーのパスワード変更

# やり方
## Mysql Serverの停止
起動しているMySQLを停止します
```
mysql.server stop
```

## セーフモードで起動
パスワードなしでrootユーザーを使うためにセーフモードを使用します
```
mysqld_safe --skip-grant-tables
```

詳しくはMySQLのマニュアルをご確認ください

https://dev.mysql.com/doc/refman/8.0/ja/server-options.html


## rootユーザーでログイン
セーフモードで起動したままrootユーザーでログインします
```
mysql -u root
```

## パスワードの再設定
mysqlテーブルにあるユーザー情報を書き換えます。
以下のクエリでrootユーザーのパスワードを変更します。
```
use mysql;
ALTER USER 'root'@'localhost' identified BY '新しいパスワードをここに入力';
exit;
```
:::note warn
バージョンによってはパスワードポリシーにより再入力を求められるかもしれません。
:::

## 再度ログインする
先ほど入力したパスワードでログインできるか確認します。
以下のコマンドを実行後、パスワード入力を求められるので、先ほど設定したパスワードでログインします。
```
mysql -u root -p
```

無事ログインできれば終わりです！
どこかにメモっておきましょう！（戒め）
XIAO nRF52840の技適について

# 背景
XIAO nRF52840でZephyr RTOSに基づいて作られたファームウェアを書き込んで使用することについて販売元のSeeed Studioのサポートチームに問い合わせてみた。
具体的には
無線機能を持つハードとそれを制御するファームウェアがありそれらセットの条件で認証を受けているという認識で、それらが技適の認証時と異なった条件で使用すると技適マークが無効になってしまうのでは？
という疑問があったのでどういう条件でこのモジュールは技適が取得されたのかということが知りたかったんですよね。

:::note warn
無線も法律もド素人なので問い合わせ内容自体的外れな可能性、あります。
:::

# 問合せ内容（抜粋）
>What firmware was used when testing for technical compliance certification?
If it is not based on zephyr, is there any possibility that using firmware based on zephyr would result in a different radio performance than when the testing to obtain the certification was performed?
If zephyr causes a change in radio performance, it would invalidate the certification.
more detailed questions
It seems that Zephyr uses its own BLE stack (BlueZ) for communication, rather than Nordic’s “softdevice”.
>+ What protocol stack was used for testing during the certification process?
>+ Or is the certification of this module obtained solely at the physical layer, independent of the software?

英語が不自然だったらすみません。
メールの文脈で日本国内での使用ということは話しています。
色々書いてますが

+ どんな環境(ファームウェア)で技適の認証を受けたのか？
+ それとも物理層だけで認証を受けていてこの議論が不必要とかそういうことある？

みたいなことを聞きたかったです。
2つ目の疑問は[この記事](https://qiita.com/solitude_under_the_blue_sky/items/f18e0b280cbde969d09e)でそういうケースがあると知ったので聞いてみました。


# Seeed Bazaar Customer Support Teamの回答（原文）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3855752/b505d18d-0bbf-1db0-56ad-c6b6bd38cfc1.png)

>Here is the reply:
>1. We used nordic SDK during the certification process.
>2. The certification of this module obtained solely at the physical layer, so there is nothing to do with the software.

XIAO nRF52840は物理層で認証をとっていて、ソフトは認証に関係ないということらしいです。
技適、むずいよ～
サポートチームの方には色々質問してしまったのですが、丁寧かつ迅速に対応頂きまして大変ありがたかったです。
【JavaScript】プロトタイプチェーンについて

# はじめに
JavaScriptのプロトタイプチェーンの触りの部分についてまとめました。

# プロトタイプ
- JavaScriptのオブジェクトは、**プロトタイプ**と呼ばれる別のオブジェクトへのリンクを持つプライベートプロパティ（クラスの外部から参照することができないプロパティ。）を持っている

# プロトタイプチェーン
- あるオブジェクトのプロトタイプとして指されているオブジェクト（プロトタイプオブジェクト）もプロトタイプを持ち、それは`null`をプロトタイプとするオブジェクトに到達するまで続く。これを**プロトタイプチェーン**という
- `null`はプロトタイプを持たない
- あるオブジェクトのプロパティを参照すると、そのオブジェクトだけでなく、プロトタイプチェーンを辿って行き、一致する名前のプロパティが得られるか、プロトタイプチェーンの終端に到達するまでプロパティの探索が行われる
- プロトタイプチェーンの中に参照しようとするプロパティがない場合、`undefined`を返す
- あるオブジェクトでプロトタイプチェーン上のプロパティと同名のプロパティを定義すると、そのオブジェクトのプロパティが参照される

# コンストラクタ関数
- 複数のオブジェクトに共通なプロパティを定義したい場合、それらのオブジェクトに同じプロトタイプを持たせ、そのプロトタイプに共通に使いたいプロパティを定義するのが効率的
- コンストラクタ関数を用いて実現する。
- コンストラクタ関数は`new`を使って呼び出される。
- コンストラクタ関数から生成されたオブジェクトを**インスタンス**という
- インスタンスは、そのコンストラクタ関数の`prototype`プロパティを**自動的に**プロトタイプとして持つ
- 以上より、`Constructor.prototype`にプロパティを定義すれば、そのコンストラクタ関数から生成されたインスタンスに共通のプロパティを持たせることができる
- また、Constructor.prototypeは既定で`constructor`というコンストラクタ関数自身を参照するプロパティを持つので、あらゆるインスタンスから元のコンストラクタにアクセスできる
- 以下は、mdnからの引用

>```js:mdnからの引用
>// コンストラクター関数
>function Box(value) {
>  this.value = value;
>}
>
>// Box() コンストラクターで作成されたすべてのボックスには、
>// 以下のプロパティがあります。
>Box.prototype.getValue = function () {
>  return this.value;
>};
>
>const boxes = [new Box(1), new Box(2), new Box(3)];
>
>```

# 暗黙的なコンストラクタ
- オブジェクトのリテラルには、自動的に`Object.prototype`がプロトタイプとして設定される
- 配列リテラルでは、自動的に`Array.prototype`がプロトタイプとして設定される
- RegExpリテラルには、自動的に`RegExp.prototype`がプロトタイプとして設定される

# Object.create()
- `Object.create()`を呼び出すと、新しいオブジェクトが生成される
- `Object.create()`の最初の引数が、新しいオブジェクトのプロトタイプとなる

# 注意点
- プロトタイプチェーンの長さはパフォーマンスに影響する。あまりに長ければ、それを分割すること
- ネイティブのプロトタイプは、**決して**拡張してはいけない（新しいJavaScriptの機能との互換性をとる場合**のみ**が例外）

# 参考文献
- [MDN 継承とプロトタイプチェーン](https://developer.mozilla.org/ja/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)
【Reflex】バックエンド側から静的ファイルを読み込む

## はじめに
Reflexでは、assetsディレクトリに静的なファイルを配置するとスクリプト内から呼び出すことができますが、バックエンド(State)からだと、```reflex  deploy```でReflexサーバーにデプロイした際に```File not found```になります。
(ローカルでは参照できます。恐らく自身でコンテナ化しても参照できると思います。)

## 解決方法

以下のIssueにあるとおり、```assets```と同階層にバックエンド用のフォルダを作成するとアクセスできました。

```
proj
   |_proj
   |_assets
   |_backend_assets # ここに配置する 
      |_hogehoge.png
```

例えば↓の感じでアクセスできます。
```python:state.py
from pathlib import Path
from PIL import Image

BACKEND_ASSETS_DIR = Path("backend_assets")

class State(rx.State):
    xxx
    
    def fugafuga(self):
        image = Image.open(BACKEND_ASSETS_DIR / "hogehoge.png")

```

https://github.com/reflex-dev/reflex/issues/3483
Generative Image Dynamics

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/144880f7-e3a2-e8ef-de68-772d02ce1d26.png)

あるシーンの画像に対して対象物体のモーションフィールドを予測することで、静止画をシームレスにループする動画に変換したり、ユーザーが画像内の物体をインタラクティブに動かしたりすることを可能にした研究。従来手法では、動画の生成は計算コストが高く時系列に滑らかに連続した動画を作ることが難しかった。提案手法では、木々・花・ろうそくの火・風に揺れる衣類など、自然界における振動を撮影した動画から動きのある箇所の軌跡のデータセットを用いて学習を行っている。画像空間におけるシーンモーションの事前分布をモデリングするために、動き情報をフーリエ領域におけるスペクトルボリュームとしてモデル化し、拡散モデル(Diffusion model)を用いて動画全体に渡るモーションテクスチャを予測する。

*BEST PAPER AWARD

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/01f2b63b-d8fa-4311-e34e-78df446b0c49.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/50b56126-f166-96b2-dfb9-f668dac83762.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/1642dd00-0c16-6b5b-329c-67cd2d437b5c.png)

- 自然な振動運動に特化したモーションの事前分布予測
従来は物体やカメラの移動など一般的な動きを対象としていたが、提案手法では自然界に広くみられる振動運動に焦点を当てている。
- フーリエ領域におけるスペクトルボリューム
振動運動の周期性と空間的な相関を捉えるために、周波数空間で特徴量を表現するスペクトルボリュームを採用している。
- 拡散モデルによるモーション予測
スペクトルボリュームの予測に拡散モデルを用いており、複雑なモーションパターンを生成でき多様な動きの再現を実現している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/23fd9f8b-9d18-8f40-6699-5606da53caf3.png)

動き予測モジュールでは、周波数座標系におけるノイズ除去モデルを用いてスペクトルボリュームSを予測する。拡散ネットワークθの各ブロックでは、2次元空間層(Spatial layer)とアテンション層(Frequency Attention)を交互に配置しており、潜在特徴Zを段階的にノイズ除去していく。除去された特徴はデコーダDに入力され、スペクトルボリュームSが生成される。
学習時には、ダウンサンプリングされた入力画像Iと実際のモーションテクスチャからエンコーダEによって符号化されたノイズを含む潜在特徴を連結する。推論時には、ノイズを含んだ特徴の代わりにガウシアンノイズZを用いる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9231956d-e247-11a3-e3f9-cffda7ed8734.png)

レンダリングモジュールでは、ディープラーニングを使ったレンダリングで欠損領域を補完し、画像を動かして引き伸ばされた領域の詳細を精緻化する。入力画像Ioからマルチスケールで特徴量が抽出され、次に予測した時間0からtまでのモーションフィールドFtを用いて、抽出された高次元特徴量に対してモーションブラーやオクルージョンによる欠損を考慮した画像合成手法であるソフトマックススプラッティングを適用する。対象を動かして引き伸ばされた領域の特徴量をソフトマックス関数を使うことで滑らかにすることができる。マルチスケールな特徴量を合成してレンダリング画像Itを生成する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8c49d43a-d50c-a4cf-50aa-ebd540a835b4.png)

生成された動画は従来手法よりも時系列に沿って滑らかに連続しており、動きも自然界の周期性を学習しているため非常に自然に見える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c2321b2d-cc2a-82b3-bac2-e9516242270f.png)

画像をある行のピクセル(青線)だけ抽出し時間方向に沿ってどのように動きが生成されたかを示した図。参照画像に対し、提案手法は動きのバリエーションが多く最も近しい結果になっているのが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/38a7aea4-2713-284e-d124-56d66e1d6e8b.png)

画像合成・動画合成の品質評価では、従来手法と比べて最もエラーが少ないことが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/aee647cd-5fa3-0d93-fc13-4755a470135d.png)

生成する動画のフレーム数を増やした場合でも、提案手法は既存手法と比べてエラーが少なく高品質な動画を生成できていることが分かる。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Li_Generative_Image_Dynamics_CVPR_2024_paper.pdf>

last updates: June. 17 2024
SAP S/4 HANA 在庫/購買管理（MM）基本知識７：品目評価／棚卸

### 移動タイプについて
![品目評価1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/4bc9053e-df5c-b5b8-eba6-b2cda6ea0ff6.png)
- 発注品が納入されると、棚卸資産の増加により、在庫勘定が借方に計上されます。
- では、その金額はいくらになるでしょうか？いくら棚卸資産が増えたかという在庫評価の方法として、SAP ERPでは、移動平均原価法と標準原価法の2通りがあります。

### 標準原価
![品目評価2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/30702894-6265-339e-e0ae-00b6a602df16.png)
- 標準原価法は、購入価格の変動に関わらず、ある一定の価格で品目の評価を行います。
- 通常、標準原価は、「品目＋プラント」ごとに、設定します。
　言い換えると、ひとつの品目に対して、プラントごとに異なる標準原価を設定可能です。

※パラメータ設定により
             ・「品目＋会社コード」に、標準原価の設定も可能です。（SAP非推奨なので、通常不使用）　
             ・「品目＋プラント＋評価タイプ」に、標準原価の設定も可能です。（要件により、標準原価の設定を、より細かく管理したい場合に使用します）

![品目評価3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/a8a1fdb3-da8b-1db9-f58a-d66bea935242.png)
- 発注品入庫により、在庫金額は、入庫数量 × 標準原価 分だけ増加します。
- 標準原価は、ある一定期間変わることはありません。
- したがって、在庫金額は、あくまで品目マスタで設定されている標準原価 × 在庫数量 によって評価されることになります。
- 入庫請求仮勘定は、仕入先に対する債務の予定金額ですので、購買発注金額になります。
- 発注金額と「標準原価 × 入庫数量」が一致しない場合、その差額分が、借方、または、貸方に購入価格差異という費用勘定で発生します。
- 標準原価に設定されている品目を出庫した場合の消費金額は、「標準原価 × 出庫数量」で計算されます。

### 移動平均原価
![品目評価4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/99af6866-81c8-2aef-388d-2820e834feb1.png)
- 移動平均原価法は、購入価格を品目の評価に、常にリアルタイムで反映させる方法です。

![品目評価5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/58b79227-e8cb-8367-6225-95f554ea9fa1.png)
- 発注品入庫により、在庫金額は、購買発注金額により評価されます。
- 入庫請求仮勘定は、仕入先に対する債務の予定金額ですので、同様に購買発注金額となります。
- 借方、または、貸方においても購入価格差異は発生しません。
- 移動平均原価法においては、購買発注金額がリアルタイムで在庫勘定に反映されます。

![品目評価6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/c7300e89-5538-8fdb-b1b9-3245374007a4.png)
- 在庫評価額は、購買発注金額分だけ増加し、在庫数量は入庫数量分だけ増加します。
- この時、品目の単価（つまり、移動平均原価）は、在庫合計金額 ÷ 在庫合計数量によって計算され、入庫と同時にリアルタイムで計算されます。
- 移動平均原価に設定されている品目を出庫した場合の消費金額は、「（出庫時点での）移動平均原価 × 出庫数量」で計算されます。

※入出庫伝票登録の重要項目である「移動タイプ」のパラメータ設定によっては、出庫金額を指定しての出庫も可能です。（但し通常、出庫金額指定は行いません。）

### 実地棚卸
![品目評価7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/ec74af1f-b3d9-0482-b722-ac8e62600262.png)
- 実地棚卸は、以下のステップからなります。
	①実地棚卸伝票登録
	    棚卸対象の品目を選択して、実地棚卸伝票を登録する。
	②検数入力
	    棚卸実施後、検数結果をシステムに入力する。
	③差異確認
	    差異一覧で帳簿在庫と検数結果の差異を確認します。
	    確認の結果、検数入力をやり直す場合、再検数処理を行います。
	④差異決済
	    差異転記を行うと、在庫数量と在庫金額が更新されます。
	    差異分の入出庫伝票と会計伝票が自動登録され、棚卸差異が計上されます。
FlutterのアプリをAndroidエミュレーターで起動すると2回目から画面が真っ白になってハマった話

# 事象
Flutterで作成したアプリをAndroidエミュレーターで起動すると、初回はちゃんとアプリ画面が表示されますが、2回目以降に画面が真っ白になってしまう事象が発生しました。
![1回目は「MyApp」というタイトルバーと「Hello,world!」というコンテンツが表示されているが、2回目は真っ白な表示になっている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670611/af88e634-5dcc-48df-39c8-5bf463eb7db9.png)

アプリをアンインストールすると次の1回目は正しく起動できるようになりますが、次回以降は同じく真っ白です。
ボタンを配置して勘でクリックしてみるとタップイベントは発生するため、描画に原因があるのではないかと推測しました。
試しにハードウェアアクセラレーションを無効にしてアプリを起動すると2回目以降も正常に表示できました。
```
flutter run --enable-software-rendering
```

# 解決方法
Androidエミュレーターの設定を変更し、~~ハードウェアアクセラレーション~~ ソフトウェアアクセラレーションのみ使用するようにしました。
![Androidエミュレーターの設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670611/3c36b874-8d38-3748-d1c3-f8f21d7d230d.png)

1\. エミュレーターのツールボックスの「…」をクリック
2\. Settingsを選択
3\. Advancedタブを選択
4\. OpenGL ES renderを ~~「Desktop native OpenGL」~~ 「ANGLE (D3D11)」に設定
5\. エミュレーターを再起動（ツールボックスの右上の×で閉じて起動し直した）

選択項目の意味はAndroid Studioの説明を参照してください。
（「OpenGL ES renderer」でページ内検索）

https://developer.android.com/studio/run/emulator-extended-controls?hl=ja

軽く説明しておくと次の通りです。
- Autodetect besed on host (default)：ソフトウェア・ハードウェアのどちらを使うか自動で選択される
- ANGLEとSwiftShader：ソフトウェアによるアクセラレーション
- Desktop native OpenGL：GPUを使用したハードウェアによるアクセラレーション

最初はハードウェアアクセラレーションである「Desktop native OpenGL」を選択して直った直ったと喜んでいたんですが、アプリのアンインストール→再インストールすると同じ事象が発生することに気が付きました😨
ソフトウェアアクセラレーションやオートを選択した状態でインストール済みだった場合は、ハードウェアアクセラレーションでも2回目以降もちゃんと画面が表示されるので気付きませんでした。

というわけで手順のほうはソフトウェアアクセラレーションに設定する手順に訂正しました。

ただ、ハードウェアアクセラレーションのほうがパフォーマンス的にはいいっぽいので、アプリの入れ直しをしないのであればハードウェアアクセラレーションでも大丈夫かもしれないですね。

# 原因

FlutterのGithubにIssueがあがっていました。

https://github.com/flutter/flutter/issues/146890

ここに書かれていることによると、AndroidエミュレーターVer.35の不具合らしく、古いバージョンでは発生しないようです。
↓ダウングレードの方法

https://developer.android.com/studio/emulator_archive?hl=ja

と、ここで私のAndroidエミュレーターのバージョンを確認してみたらVer.34.2.16-12038310だったので、それ以上ダウングレードしないとダメかも。

ちなみに、私はハードウェアアクセラレーションに固定することで解消しましたが、ソフトウェアアクセラレーションを使用しないと解消しない人も見受けられました。謎です。

# 背景
パソコンを買い替えたため、Flutterの開発環境を作り直しました。
すると古いパソコンで動いていたアプリが正常に起動できなくなってしまいました。
旧マシンのCPUはIntelで新マシンはAMDという違いがあるため、絶対AMDのせいだと思って買い替えたことを後悔しました。
この事象はIntelでも起きるそうなので完全な濡れ衣なのですが、面白いのはFlutterのIssueのスレッドにもAMDが原因だと思っている人がいたことです。
AndroidエミュレーターはかつてAMDでの実行に支障があったようなので、その名残で印象が悪くなっているのでしょうか。

ちなみに最初はFlutterの環境構築に失敗したと思っていたので、解決に2日くらいかかりました。

試したこと：Androidエミュレーターの同一バージョンの再インストール、Flutterの再インストール・バージョン変更、キャッシュのクリア、Kotlinで確認用アプリの作成（こっちは問題なく動いた）

## 正常動作していた環境
HP / Pavillion wave Desktop PC 600-a1xx
- OS: Windows 10 HOME
- CPU: Intel Core i7-7700T CPU @ 2.90GHz 2.90GHz
- RAM: 16GB
- Android
  - Emulator Version: 33.1.23-11150993 
  - Android Version: 14.0 (U) - API 34

## 今回の事象が発生した環境
Lenovo / ThinkPad E14 Gen 6 AMD
- OS: Windows 11 HOME
- CPU: AMD Ryzen 7 7735U with Radeon Graphics 2.70GHz
- RAM: 32GB
- Android
  - Emulator Version: 34.2.16-12038310
  - Android Version: 15.0 (V) - API 35
REACT HTTP アクセス安全性について(CORS,CSP,CSRF)

### クロスオリジンリソースシェアリング（CORS）について
まず、CORSはWebブラウザ内でJavaScriptコードによって発行されるリクエストにのみ適用されます。

次に、このポリシーはリクエストの提出を阻止するものではありません。単にスクリプトがレスポンスにアクセスすることを阻止します。

POSTMANは開発ツールであるため、CORSの影響を受けません。もしPOSTMANからもURL APIにアクセスできない場合、その提供されたURL APIは全く役に立たないことを意味します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/fe1aa671-dad6-684a-121c-1bab25288253.png)

### コンテンツセキュリティポリシー（CSP）について
コンテンツセキュリティポリシー（CSP）は、ウェブサイト自体がサードパーティ（つまり、異なるオリジン）からのコンテンツを読み込むのを防止します。これは、Content-Security-Policy HTTPヘッダーを使用するか、HTMLメタタグを使用して定義されます：<meta http-equiv="Content-Security-Policy">。

CSPは、サードパーティのコンテンツ(第三者のJS等)の読み込みを防止するためのものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/185708f2-a720-c181-02cc-a8d3f6d5b626.png)

### CSRF（クロスサイトリクエストフォージェリ、跨站请求伪造）について
CSRFは、信頼されたユーザーからのリクエストを装うことで信頼されたウェブサイトを悪用する攻撃の一種です。攻撃者は、ウェブサイトのバックエンドの特定の機能インターフェースのリクエストアドレスを構築し、ユーザーをそのリクエストアドレスをクリックするよう誘導するか、特別な方法でそのリクエストアドレスを自動的に読み込ませます。ユーザーがログイン状態でそのリクエストがサーバーに受信されると、サーバーはそれをユーザーの正当な操作と誤認します。

GET形式のインターフェースアドレスは容易に攻撃される可能性があり、POST形式のインターフェースアドレスも完全に安全ではありません。攻撃者は、ユーザーをフォームが含まれたページに誘導し、POST方式でパラメータを送信させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802240/0ec6c64e-e752-9cfa-3299-cd999286e72f.png)

CSRF防御
現在、CSRF攻撃の防御には主に三つの戦略があります：

HTTP Refererフィールドを検証する；
リクエストアドレスにトークンを追加して検証する；
HTTPヘッダーにカスタム属性を追加して検証する。