OmniAICreator/Qiita-1.07M huggingface dataset:
ファームウェア ってなに？

## 勉強前イメージ

なんだろ・・・ちゃんとわかってないな・・・・
機器のHWの・・・？？？

## 調査

### ファームウェア とは

機器に内蔵されているソフトウェアの一種で、機器本体の基本的な制御を行うものになります。
機器の内部に組み込まれていてHWと密接に結びついており、通常は変更を行わずHWに近い性質を持っています。
PCでいうとファームウェアはBIOSにあたります。

ファームウェアもソフトウェアの一種なのでもちろんアップデートが必要になります。
脆弱性の対策や機器の性能を安定させるメリットがあるのでアップデートをする必要があります。

### ファームウェアが組み込まれているもの

一例として以下を出してみました。
他にもあるので、定期的に確認しアップデートをしないといけません。

- ネットワーク機器
- ネットワークプリンタ
- ドライブ

## 勉強後イメージ

ハードウェア寄りのソフトウェアなのか。
ファームウェアアップデートするのってなかなか怖いイメージある。

## 参考

- [ファームウェア 【firmware】 FW / F/W](https://e-words.jp/w/%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2.html)
- [ファームウェアとは｜更新しないとどうなる？搭載機器とアップデート方法を解説](https://koneta.nifty.com/koneta_detail/1141008012035_1.htm)
Rocky Linux 8にOpenJDK 17をインストール（Temurin）

# はじめに

Temurinを利用してRocky Linux 8にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2027-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)

# cat <<EOF > /etc/yum.repos.d/adoptium.repo
[Adoptium]
name=Adoptium
baseurl=https://packages.adoptium.net/artifactory/rpm/centos/\$releasever/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.adoptium.net/artifactory/api/gpg/key/public
EOF
# yum install temurin-17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment Temurin-17.0.3+7 (build 17.0.3+7)
OpenJDK 64-Bit Server VM Temurin-17.0.3+7 (build 17.0.3+7, mixed mode, sharing)
```
【Android】覚えておくと便利なExtension：Part3

# はじめに
何かしらの機能で必ず使用するExtensionですが、毎度実装している便利なExtensionを備忘録的に残しておこうと思います。

# その１
```
fun Context.shareMessage(text: String, subject: String = ""): Boolean {
    val intent = Intent()
    intent.type = "text/plain"
    intent.putExtra(EXTRA_SUBJECT, subject)
    intent.putExtra(EXTRA_TEXT, text)
    try {
        startActivity(createChooser(intent, null))
        return true
    } catch (e: ActivityNotFoundException) {
        return false
    }
}
```
上記は特定のメッセージなどを他サービスを通して送付したい場合などに使用する拡張関数です。
こちらはあくまで一例であり、メーラーを立ち上げたり、マップを表示したりなど、やりたいことに合わせて拡張関数として切り出すと良いかと思います。

# その2
```
fun Context.openPhone(number: String): Boolean {
    try {
        val intent = Intent(ACTION_CALL, Uri.parse("tel:$number"))
        startActivity(intent)
        return true
    } catch (e: Exception) {
        return false
    }
}
```
上記は指定した電話番号をもとに電話アプリを立ち上げるための拡張関数です。
電話アプリを正しく立ち上げる為には、番号の前に **tel:** を付与する必要があります。

# その3
```
val EditText.value
        get() = text?.toString().orEmpty()
```
EditTextから文字列を取得する際、textがEditableなので少々手間がかかったりしますよね。
微々たるものなのですが、こういった拡張関数を作っておくと実装が少しだけ楽になります。

# さいごに
第三弾でしたが、本当にたくさんあるので、今後は違う記事を書きつつ合間で拡張関数の続編もまとめていこうと思います。
Rocky Linux 8にOpenJDK 11をインストール（Temurin）

# はじめに

Temurinを利用してRocky Linux 8にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)

# cat <<EOF > /etc/yum.repos.d/adoptium.repo
[Adoptium]
name=Adoptium
baseurl=https://packages.adoptium.net/artifactory/rpm/centos/\$releasever/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.adoptium.net/artifactory/api/gpg/key/public
EOF
# yum install temurin-11-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment Temurin-11.0.15+10 (build 11.0.15+10)
OpenJDK 64-Bit Server VM Temurin-11.0.15+10 (build 11.0.15+10, mixed mode)
```
Rocky Linux 8にOpenJDK 8をインストール（Temurin）

# はじめに

Temurinを利用してRocky Linux 8にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Linux \(RPM/DEB\) installer packages \| Adoptium](https://adoptium.net/installation/linux/)

## サポート

本手法で導入した場合、[Support \| Adoptium](https://adoptium.net/support) より、~~2026-05~~ → 2026-11がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)

# cat <<EOF > /etc/yum.repos.d/adoptium.repo
[Adoptium]
name=Adoptium
baseurl=https://packages.adoptium.net/artifactory/rpm/centos/\$releasever/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.adoptium.net/artifactory/api/gpg/key/public
EOF
# yum install temurin-8-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_332"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_332-b09)
OpenJDK 64-Bit Server VM (Temurin)(build 25.332-b09, mixed mode)
```
Gitをインストールするときに叩くコマンド(個人用)

# 経緯
Gitをインストールする際、いつも「初期設定何するんだっけ？」となるので、コマンドを使い回せるようまとめる。(随時更新)

# コマンド
```powershell
# chocolateyがインストールされている場合
choco install git

# Git設定
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
git config --global  core.ignorecase false
git config --global init.defaultBranch main
git config --global core.autocrlf false
```

# 説明
```powershell
git config --global user.name "ユーザー名" # 設定しないとpushできない
git config --global user.email "メールアドレス" # 設定しないとpushできない
git config --global core.ignorecase false # falseにするとファイル名の大文字小文字の変更を検知するようになる
git config --global init.defaultBranch main # 最初のブランチ名をmainにする
git config --global core.autocrlf false # 自動改行コード変換を無効にする
```
シェルスクリプトのあるファイルの絶対パスをドットコマンドで読み込んだ場合も正しく取得する方法

シェルスクリプト (bashスクリプト、zshスクリプト等) を書いた時、 **そのファイルの絶対パス** を取得するケースはよくあります。
例えば、そのシェルスクリプトから設定ファイルを読み込みたい場合などによく使います。

例えば、このようなスクリプトが scripts ディレクトリの中に run.sh という名前で作ってあって、

```scripts/run.sh
#!/usr/bin/env zsh

. ./env.sh

(なにか処理...)
```

これを、
```sh
cd scripts
./run.sh
```
としても動作させる必要があり、 cd scripts しなくても

```
./scripts/run.sh
```
としても動作させたいのは、よくある要件でしょう。

その場合、定番として

```scripts/run.sh
#!/usr/bin/env zsh

cd "$(dirname $0)" || exit

. ./env.sh

(なにか処理...)
```

`$(dirname $0)` と書きます。大抵はこれで十分なのですが、もしドットコマンドで読み込む設定ファイル env.sh の中でも同じことをやりたくて

```scripts/env.sh
#!/usr/bin/env zsh

cd "$(dirname $0)" || exit

credentials_path=$(pwd)/credentials
```
とか

```scripts/env.sh
#!/usr/bin/env zsh

credentials_path=$(dirname $0)/credentials
```
とやってしまうと、特定の状況でうまくいきません。

使用者は、

```
cd scripts
./run.sh
```
とか
```
./scripts/run.sh
```
とする以外にも、設定ファイルだけ読み込みたくて、他のディレクトリにあるファイルから
```
. ../scripts/env.sh
```
のように、設定ファイルを適用してしまう場合もあるためです。


## 検証

以下のファイルを作り、検証してみます。

```scripts/run.sh
#!/usr/bin/env zsh

cd "$(dirname $0)" || exit

. ./env.sh
```

```scripts/env.sh
#!/usr/bin/env zsh

echo "arg0: $0"
echo "PWD: $PWD"
```

#### cd scripts/; ./run.sh の場合
```
% ./run.sh
arg0: ./env.sh
PWD: /Users/ytyng/my-project/scripts
```

#### ./scripts/run.sh の場合
```
% ./scripts/run.sh
arg0: ./env.sh
PWD: /Users/ytyng/my-project/scripts
```
上記2つはどちらも期待通りですが

#### ./scripts/env.sh の場合
```
% ./scripts/run.sh
arg0: ./env.sh
PWD: /Users/ytyng/my-project/scripts
```
上記2つはどちらも期待通りですが

### . ./scripts/env.sh
```
% . ./scripts/env.sh
arg0: ./scripts/env.sh
PWD: /Users/ytyng/my-project
```
env.sh を、他のディレクトリからドットコマンドで適用した場合、 `$0` などの結果が最初の例と変わってしまいます。

# シェルスクリプトの中で安定して現在のディレクトリを取得するには

```scripts/env.sh
#!/usr/bin/env zsh

cd $(dirname $0) 2>/dev/null || cd ${PWD}
env_pwd=$(pwd)
cd -
```

少し強引ですが、上記のように `dirname $0` が失敗したら `${PWD}` に `cd` すればうまくいくと思います。

### 応用
#### スクリプトのあるディレクトリの2つ上の /credentials ディレクトリを作る
```zsh
cd $(dirname $0) 2>/dev/null || cd $PWD
credentials_dir=$(dirname $(dirname $(pwd)))/credentials
cd -
```
M1 Mac + zplug + prezto な環境で enhancd が有効にならない

# 環境

OS: macOS Monterey 12.2.1
チップ: Apple M1
zsh: 5.8 (x86_64-apple-darwin21.0)
zplug: 2.4.2

# 現象

zplug 経由で enhancd を install したが、 enhancd を利用できない。
この現象が M1 固有かは未検証です。

```:.zshrc
export ZPLUG_HOME=~/.zplug
source $ZPLUG_HOME/init.zsh

zplug "b4b4r07/enhancd", use:init.sh
export ENHANCD_FILTER=peco
zplug "sindresorhus/pure"

if ! zplug check; then
    zplug install
fi

zplug load

if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi
```

# 原因

詳細は不明です、、、。

おそらく `source .zprezto/init.zsh` に原因があることまではわかりました。
`source .zprezto/init.zsh` をコメントアウトすると enhancd を利用できます。
が、その先を調べきれていません。

とりあえず下記の解決策を試したら直ったので共有です。

# 解決策

zplug よりも前に prezto を初期化する。

```:.zshrc
# 1. 先に prezto を初期化
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

# 2. 次に zplug を初期化
export ZPLUG_HOME=~/.zplug
source $ZPLUG_HOME/init.zsh

zplug "b4b4r07/enhancd", use:init.sh
export ENHANCD_FILTER=peco
zplug "sindresorhus/pure"

if ! zplug check; then
    zplug install
fi

zplug load
```

# おわりに

原因がわからないというなんともむず痒い形ですが、待望の enhancd が利用できたので良しとします。
Laravel Mamp環境構築

## 方法

[参考サイト](https://www.unagino-nedoko.com/laravel/mamp)
[Mampの立ち上げエラー時解消したサイト](https://qiita.com/crispypanda/items/5017e88cb13d9ec69de4)

Mampの場合composerが入っていれば

```terminal
Laravelインストール
$ cd /Applications/MAMP/htdocs/
$ composer create-project laravel/laravel --prefer-dist laravel
$ cd laravel/
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
```
上記を行えば後はMampのPHPのバージョンを8以上に設定を変えて、
ドキュメントルートを
```Applications ▹ MAMP ▹ htdocs ▹ laravel ▹ public```
に変更すれば立ち上がった（上記ドキュメントルートの「laravel」はディレクトリ名）。
while文について

## while文とは

Javaのwhile文についてまとめてみた。

- while文は繰り返し処理の構文
- 書き方
　　` while(繰り返し条件){繰り返し処理}`
- 繰り返し条件の記述はfor文より単純。条件がtrueなら繰り返し処理を行う。

```Java
class Sample1_11_1 {
	public static void main (String[] args) {
		
		/*コマンドライン引数で受け取った数字の累乗の数のうち、100未満のもののみを表示するプログラムを作る。
		**【例】コマンドライン引数での入力：3 → 表示される数：3 , 9 , 27 , 81
		*/
		
		int receiveNumber = Integer.parseInt(args[0]) ;  //ループ毎にcalcNumberに掛ける数（コマンドライン引数で受け取った値）
　　                                                        //receiveNumberは常に3が代入されている
		int calcNumber    = receiveNumber ;              //表示する数（初期値：コマンドライン引数で受け取った値
		
		while( calcNumber < 100 ){　        //①calcNumberが条件を満たしているか判定
			
			System.out.println("calcNumber：" + calcNumber);　　　//②上記判定がtrueなら、表示する
			
			calcNumber *= receiveNumber ;     //③表示した後、処理を実行→　①に戻る
            //calcNumber = calcNumber * reseiveNumber; と同じ意味
			//右辺は3*3となり、9が左辺に代入される
            //2回目の処理の時には右辺は9*3となり、左辺に27が代入される
		}		
	}
}
```

## for文との違い

for文はあらかじめ繰り返す回数が確定している

while文は繰り返す回数が変動的になる

※上記のコードの場合、3を入力すれば繰り返し処理は4回で終わるが、5を入力すると繰り返し処理は2回で終わる（5と25のみ）


以上。
iOSでちらつくvue-carousel

## Vue.js(Nuxt.js)でカルーセル作りたい
- カルーセル作りたい！！！って言われたので、素直に[vue-carousel](https://ssense.github.io/vue-carousel/)を導入した
- しかし、切り替わりのタイミングで、iOSの場合のみ、背景の要素が一瞬ちらつく

## よくあるiOSだけでチカチカするアニメーション
- CSSアニメーションとかで、少しリッチな表現を実装するとき、なんかよくわからん要素がチカっと一瞬出てきたり、イージングが効かなかったりする、事がある。
- opacityいじってると起こりがちみたいな話が多い印象がある

## 古の対処方法
- CSSで対象の要素に `transform: translate3d(0, 0, 0);` を追加すると、直る、という方法がある
- すでにいろんな人が教えてくれているので、詳しいことはその偉人たちに任せるとするが、この記述するとGPUアクセラレーションが有効になって、要は描画周りの潜在能力を最大限引き出せる、というような話

## Vue-carouselでもうまくいった
- プラグインを使用しているので、特定するのに苦戦したが、vue-carouselを使っているときにも似たようなちらつき現象が発生したわけなので、上記の記述をしたら無事解決した

## 最近はwill-changeを使う
https://dev.opera.com/articles/ja/css-will-change-property/
- 最近は `will-change` プロパティを使うことで、事前にアニメーションしまっせ、ということを明示することができ、実際にこれで解決する
- 今回の私の事例の場合は、プラグインでラップされており、結局何しているのか調べるのも面倒だったため、 `transform:translate3d(0,0,0);` で無理やり解決したが、本当は `will-change: transform`　とかしてあげた方が優しい世界なんだろうなと思う。

## 結び
- ということで、古の対応方法と最近の対応方法の備忘録でした。
- 「iOSで」という枕詞のバグレポートが上がってきたら脊髄反射でこの対処方法を思いつくようにならねば「CSSできる」とは謳えない。多分。
Chakra UI のModalOverlay を使ってローディングアニメーションを作成

## 概要

趣味でローディングアニメーションを作成したのですが、使わなくなったので、こちらにて供養したいと思います。

## Requirement

- Framer Motion
- Chakra UI

## Framer Motion x Chakra UI を使うためのコンポーネントの作成

https://qiita.com/shin_k_2281/items/72576b13b59b345b8103

↑を参考に、以下のようなコンポーネントをつくります。

``` motion-box.tsx
import { motion, HTMLMotionProps } from 'framer-motion'
import { chakra, HTMLChakraProps } from '@chakra-ui/react'
type Merge<P, T> = Omit<P, keyof T> & T
type MotionBoxProps = Merge<HTMLChakraProps<'div'>, HTMLMotionProps<'div'>>

export const MotionBox: React.FC<MotionBoxProps> = motion(chakra.div)
```

もしくは、

https://chakra-ui.com/guides/integrations/with-framer

上記の　motion-box については公式のようなコンポーネントの作り方でもOK。
(私は好みで前者の方をつかいました）

## ローディングアニメーション

``` loading-modal.tsx
import { MotionBox } from './motion-box'

import {
  Modal,
  Box,
  ModalOverlay,
  useBreakpointValue
} from '@chakra-ui/react'

const LoadingCircle = ({ animateScale }: {animateScale: Array<number>}) => {
  return (
    <MotionBox 
      width={'30px'}
      height={'30px'}
      borderRadius={'50%'}
      mr={6}
      ml={-3}
      bg={'white'}
      animate={{scale: animateScale}}
      transition={{
        duration: 1.5,
        ease: "linear",
        repeat: Infinity,
        repeatType: "reverse",
      }}
    />
  )
}

export const LoadingModal = ({ isOpen, onClose }: { isOpen: boolean, onClose: () => void}) => {
  const isPc = useBreakpointValue({base: false, md: true})
  return (
    <>
      <Modal isOpen={isOpen} onClose={onClose} scrollBehavior={'inside'} size={'xl'}>
        <Box position={'relative'}>
          <ModalOverlay>
            <Box
              display={'flex'}
              position={'absolute'}
              zIndex={10000} // ModalOverlayが 1300 程度
              top={'50%'}
              left={isPc ? '50%' : '40vw'}
            >
              <LoadingCircle
                animateScale={
                  [2, 1, 1]
                }
              />
              <LoadingCircle
                animateScale={
                  [1, 2, 1]
                }
              />
              <LoadingCircle
                animateScale={
                  [1, 1, 2]
                }
              />
            </Box>
          </ModalOverlay>
        </Box>
      </Modal>
    </>
  )
}
```

## 使い方

Chakra UI の `useDisclosure()` を使って、簡単に実装できます。

``` .tsx
import { useDisclosure } from '@chakra-ui/react'

export SampleComponent () => {
  const { isOpen, onOpen, onClose } = useDisclosure()

// 例えばページの遷移ならそれ依存配列に入れる

  useEffect(()=>{
    onClose()
  }, [某])

// 何かしらをトリガーにしてアニメーションを表示
  const onClick = () => {
    ...
    onOpen()
  }
 
  return (
    <>
      ...
      <LoadingModal isOpen={isOpen} onClose={onClose} />
    </>
  )

}
```

↓こんな感じになります
![hoge.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632997/2278a471-594b-5850-531a-367045bb0950.gif)
M1 macbookでnodebrew installできないとき

## いつも忘れること
- M1　macbookに変えてから、npm使っているとたまに下記サイトのようなエラーに出会う。

https://zenn.dev/catnose99/scraps/6c9e7ebabb6221

- それ自体は、Node.jsのバージョンを変えると動くという話なので、nodebrewでバージョンを変えれば良い
- しかし、目的のNode.jsをインストールしようしてできない、ということをいつも繰り返している

## 結局こちらにお世話になる

https://zenn.dev/naoki_oshiumi/articles/967ce342172ab8

- ということで備忘録。
- M1 macbookにして、 `nodebrew install v15.8.0` みたいなことができない時は　`nodebrew compile v15.8.0` みたいな感じにすると環境に必要なバージョンのNode.jsを作ることができる。
    - このコンパイルは記事にもある通り1時間くらいかかると思う（M1頑張ってくれ）
- あとは `nodebrew use v15.8.0` とかすれば使えるはず。


## ただ参考サイトを参照しただけ
- まじで備忘録なので、ふたつのサイトをまとめただけの記事でした。
- 有識者の皆さんいつもありがとうございます。
暗号技術

## ネットワーク上の脅威
盗聴・なりすまし・改竄などがある
## データの暗号化
<b><font color = blue>暗号化</font>とは、人が容易に解読できる平文を「暗号化アルゴリズム」と「暗号化鍵」を使って、容易に解読できない暗号文に変換すること。
逆に、<font color = blue>復合</font>とは「復号アルゴリズム」と「復号鍵」を使い暗号文を元の平文に戻すこと。
## 暗号方式
### 共通鍵暗号方式
<b>暗号化鍵と復号鍵が共通。送信者は「共通の秘密鍵」で暗号化し。受信者も「共通の秘密鍵」で復号する。
<font color = blue>秘密鍵暗号方式</font>とも言われている。
特徴：
安全に鍵を配布する必要がある。
鍵の管理が煩雑になる。
公開鍵暗号方式に比べて処理がはやい。
代表的なものに<font color = blue>AES</font>がある。
### 公開鍵暗号方式
<b>暗号化鍵と復号鍵が異なる暗号方式。
送信者は「受信者の公開鍵」で暗号化、受信者は対の「受信者の秘密鍵」で復号する。
特徴：
鍵の配布や管理が容易
共通鍵暗号方式に比べて処理が遅い。
代表的なものに<font color = blue>RSA</font>、RSAより短い鍵長で同等の安全性を提供できる<font color = blue>楕円曲線暗号</font>がある。
## ディジタル署名
<b>「送信者が本人であるかを受信者が確認できる」のと同時に、「電子文書の内容が改竄されていないことを受信者が確認できる」仕組みのこと。<font color = blue>電子署名</font>とも言われている。
「送信者の秘密鍵」で暗号化、受信者は対の「受信者の公開鍵」で復号する。
### ハッシュ関数
<b>電子文書から文字列を作成することを<font color = blue>ハッシュ化</font>という。
代表的なもの<font color = blue>SHA</font>・<font color = blue>SHA-256</font>・<font color = blue>SHA-512</font>。
## 認証局
<b>取引当事者から独立した信頼できる第三者機関のこと。ディジタル証明書を発行する。公開鍵の正当性を証明する。
## PKI
<b>認証局や公開鍵暗号方式、ディジタル署名などの仕組みを使って、インターネット上で安全な通信ができるセキュリティ基盤のこと。　
## メッセージ認証
<b>共通鍵を用いて、メッセージの内容が改竄されていなうか確認する仕組み。
## SSL
<b>インターネット上での通信を暗号化して、盗聴や改竄を防ぐ仕組み。<font color = blue>HTTPS</font>とはSSLでの暗号通信をHTTPに実装したもの。WebサーバーとWebブラウザ間の通信を暗号化する。
<font color = blue>TLS</font>とは、SSLをベースに標準化したもの。<font color = blue>SSL/TLS</font>とまとめて呼ぶこともある。
### ハイブリッド方式
<b>共通鍵暗号方式と公開鍵暗号方式の両者の特徴を組み合わせた方式。
### セキュアブートとTPM
<b><font color = blue>セキュアブート</font>は、PCの起動時にOSやドライバの署名を確認することで、OS起動前のマルウェアの実行を防ぐ技術。<font color = blue>TPM</font>は、PCなどに組み込むセキュリティチップのこと。
Oculus にVRMを入れるための下準備(忘備録)

# 目次

### VRM の顔を編集しよう

![face.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/98d242e2-91cb-dd75-2f1f-0e008a1ce150.png)

![mirror.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/d8c8fd11-d1c4-0eba-29d6-3ef8b160162a.png)

まず、VRMモデルの顔を整形します
やり方は
1.  顔の半分を選択する(編集モード>選択>Side of Active)
2.  選択されていない顔の部分を選択する
2.  選択した頂点を削除する
2.  ミラーモディファイアを適用する
2.  舌が切れているので、断面を選択して、gxで移動する(Mirror ModifireのClipingをうまく使う)
2.  shapeKeyの調節
2.  ShapeKeyUtilでミラーモディファイアを適用する

以上になります。

### アクセサリーを追加しよう

![accesary.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/bcc04250-d1b0-2a60-db8e-5fa59487f952.png)

次にアクセサリーを追加します

絶対に手首のアクセサリーを追加してください。
理由は次のOculusハンドの時に継ぎ目が隠れるようにするためです。

あと、今回は一夜さんの髪留めを追加しています。

### 腕を入れ替えよう

![oculushand.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/20ca54e4-19a2-d1bf-fe5f-db641fa603f1.png)

以前の記事で作成した、OculusHandをVRMに付け替えます。

注意点としては、

1. ArmatureをCtrl+jでjoinする前に必ず、Ctrl+AですべてのTransformを適用すること
1. 手首のアクセサリーが手の継ぎ目に来るようにすること
1. 手のメッシュと腕のメッシュは繋げないこと
1. b_l_wrist, b_r_wristの親にJ_Bip_L_LowerArm,　J_Bip_R_LowerArmを設定するが、そのときに親をインスペクタから設定すること
1. OculusHandのメッシュをVRMのボディのメッシュに適用すること

### Weightをやり直そう
![hand_weight.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/bbb8f05a-2fde-eccb-c78c-4772d5edd75d.png)

![スクリーンショット 2022-05-22 145329.PNG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/0acff92b-72c6-8ac5-7a11-93cf7e6e9a98.jpeg)

次に手首のボーンのWeightを調整します。
最初は新しく追加したOculus Hand のボーンに手首のアクセサリーのweightが載っていません。そのため、ポーズモードで手首のボーンを選択後、ウェイトペイントで手首のメッシュのウェイトを調整します。

あと、ほかにアクセサリーを追加した場合はそのアクセサリーのウェイトも調整してください。

### 微調整

あとは服のサイズとかいろいろと微調整して完了です。
CiscoIOSイメージをTFTPサーバにコピーする

## 環境
・TFTPサーバ(192.168.11.10)
・普段使いの市販ルータ(192.168.11.1/24)
・Ciscoルータ(今回はC890を使用)

## 実施手順
①PCにTFTPソフトウェアをインストール
※アクセス出来ない可能性があるのでWindowsファイアウォールを切断
②Ciscoルータを普段使いのルータに接続し、デフォルトゲートウェイと接続したインターフェースにIPアドレスの設定
~~~
Router(Config)#ip default-gateway 192.168.11.1
Router(Config)#int gig0
Router(Config-if)#no shutdown
Router(Config-if)#ip address 192.168.11.100 255.255.255.0
~~~

③CiscoIOSのイメージファイルを確認
 ~~~
Router#show version
~~~
④CiscoIOSイメージのコピー
~~~
Router#copy flash:c890-universalk9-mz.157-3.M4a.bin tftp
~~~
⑤保存場所を聞かれるのでTFTPソフトウェアをインストールしたPCのアドレスを入力。保存するファイルの名前を入力(今回はスルーするのでエンター)。
~~~
Address or name of remote host []?192.168.11.10
Destination filename [c890-universalk9-mz.157-3.M4a.bin]?
~~~
⑥コピー完了
コンソール上
~~~
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
59144268 bytes copied in 91.400 secs (647093 bytes/sec)
~~~
IOSイメージ保存場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196093/e1fdeae5-f9e1-0e08-1ab1-7bc412b72c85.png)
【個人メモ】Reduxのデータ正規化とnormalizerによる実装

# Redux
ReduxのStoreデータの正規化は、公式ドキュメントにおていも推奨される。
まずは公式ドキュメントのを丁寧に読む。

## Normalizing State Shape
### 正規化のコンセプト
- 各データは自分自身のテーブルを持つ。posts、comments、usersは並列に配置。
- オブジェクトのIDは、オブジェクト自身の名前が値になる。post1はidの値は、"post1"。
- データ同士はidによるリレーションで示す。authorは、user1というリレーションを持つ。
- テーブルは、idの配列を持つ。["post1", "post2"]
```typescript
{
    posts : {
        byId : {
            "post1" : {
                id : "post1",
                author : "user1",
                body : "......",
                comments : ["comment1", "comment2"]
            },
            "post2" : {
                id : "post2",
                author : "user2",
                body : "......",
                comments : ["comment3", "comment4", "comment5"]
            }
        },
        allIds : ["post1", "post2"]
    },
    comments : {
        byId : {
            "comment1" : {
                id : "comment1",
                author : "user2",
                comment : ".....",
            },
            "comment2" : {
                id : "comment2",
                author : "user3",
                comment : ".....",
            },
        },
        allIds : ["comment1", "comment2"]
    users : {
        byId : {
            "user1" : {
                username : "user1",
                name : "User 1",
            },
            "user2" : {
                username : "user2",
                name : "User 2",
            },
    },
```

### 正規化のメリット
- ネストから開放されており、ロジックが複雑にならない。また更新がその箇所のみで済む。
- ID指定のみのシンプルな取得や更新が可能になる。
- 親データの関連するオブジェクトのみ更新すればよいので、UIのレンダリングも最小限で良い。

# normalizer
## 使い方
各テーブル毎に```new schema.Entitiy```を定義するだけ。
``` typescript
import { normalize, schema } from 'normalizr';

// Define a users schema
const user = new schema.Entity('users');

// Define your comments schema
const comment = new schema.Entity('comments', {
  commenter: user,
});

// Define your article
const article = new schema.Entity('articles', {
  author: user,
  comments: [comment],
});

const normalizedData = normalize(originalData, article);
```
Rails7 Deviseのログアウトができない

<h1>発生したエラー</h1>

>Routing Error
No route matches [GET] 

Devise使用時に、ログアウトができず。。
コードには、method: :delete と記入しているのに get が反応する

```
【変更前】
<%= link_to 'ログアウト', destroy_owner_session_path, method: :delete %>

```



<h1>解決方法</h1>

:confetti_ball:ログイン成功:tada:

buttonスタイルなら
method: :deleteが機能してくれる

```
【変更後】
<%= button_to 'ログアウト', destroy_owner_session_path, method: :delete %>
```
ffmpeg-python で中間ファイルを作らずに動画を切り貼りする

# 皆さん

パソコンでエロいことをする時に欠かせないものといえば？

そう ffmpeg ですね

# 最近

https://qiita.com/c1z/items/e4fb196f047d9130031c

こういうシリーズをやってて、そこでも出てきたんですけど。

まあ、開発に限らず、エロ動画を ffmpeg で切ったり貼ったりすることが多いと思うんですよね。

このシーンカットしたいなー。この動画のこのシーンとこのシーンをつなぎたいなー。とか

まあ、色々あると思うんですよ

# ネットで調べると

細かいファイルを一旦作ってから、結合するみたいなやり方が多い気がする

参考

https://qiita.com/niusounds/items/c386e02ab8e67030bdc0

https://mattintosh.hatenablog.com/entry/20210503/1620039600

# 中間ファイルを作りたくない時は今までこうやってた

```bash
$ ffmpeg \
  -ss 00:00 -t 12 -i main.mp4 \
  -ss 01:00 -t 30 -i main.mp4 \
  -ss 00:00 -t 30 -i sub.mp4 \
  -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
  -map [v] -map [a] output.mp4
```

- `-ss 00:00 -t 12 -i main.mp4` は main.mp4 の 00:00 から 12 秒読みこむ
- `-ss 01:00 -t 30 -i main.mp4` は main.mp4 の 01:00 から 30 秒読みこむ
- `-ss 00:00 -t 30 -i sub.mp4` は sub.mp4 の 00:00 から 30 秒読みこむ
- `-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]"` の最初の鉤括弧の部分は concat フィルタに入力するストリームを列挙している、最後の鉤括弧の部分は concat フィルタから出力するストリームを列挙している
- `-map [v] -map [a] output.mp4` は output.mp4 にどのストリームを使うかを指定している

こうすると、カットと結合が一つのコマンドでかけて、中間ファイルもできないので、ディスク IO が減って場合によってはかなり高速化される。

正直 filter_complex は可読性悪いし、どの入力が何番のストリームだっけ？ってなるので、書きにくい。。。

# ffmpeg-python だとこう書ける

これが ffmpeg-python だとかなり書きやすいことに気がついた

```python
input_stream_main = ffmpeg.input('main.mp4', ss=0, t=12)
input_stream_main_2 = ffmpeg.input('main.mp4', ss=60, t=30)
input_stream_sub = ffmpeg.input('sub.mp4', ss=0, t=30)
concatenated_stream = ffmpeg.concat(
    input_stream_main.video,
    input_stream_main.audio,
    input_stream_main_2.video,
    input_stream_main_2.audio,
    input_stream_sub.video,
    input_stream_sub.audio,
    v=1, a=1, unsafe=True)
output_stream = ffmpeg.output(concatenated_stream, 'output.mp4')
ffmpeg.run(output_stream)
```

こんな感じ。そんなに簡単に見えないかもしれないが、 filter_complex にストリームの番号を書かなくてよくなったのが非常に大きい。 stream を 100 個結合したい場合などを想像してもらえるとわかりやすいかも

例えば、以下のように動画のシーンのリストを持っている時に以下のように書けるのも素晴らしい

```python
scene_list = [(10, 300), (350, 200), (700, 180)...]

input_stream_list = []
for start, duration in scene_list:
    input_stream = ffmpeg.input('input.mp4', ss=start, t=duration)
    input_stream_list.extend([input_stream.video, input_stream.audio])
concatenated_stream = ffmpeg.concat(*input_stream_list, v=1, a=1, unsafe=True)
output_stream = ffmpeg.output(concatenated_stream, 'output.mp4')
ffmpeg.run(output_stream)
```

めちゃくちゃ良い！

# まとめ

エロい男は ffmpeg 使いが上手ということですね。
パーティクルシステム - テクスチャシートアニメーションのやり方

こんにちは、ユーゴです。
今回は、アニメーションするパーティクルシステムを紹介します。
とても簡単なので、初心者の方でも多分お分かりいただけると思います。

本記事では、以下のようなものが作れるようになります。
![画面収録-2022-05-22-14.54.07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/d9b1cc26-ebfc-e417-9e3f-2b017c2025ff.gif)



# 1.パーティクルシステムを準備
1) まず、「ヒエラルキーの＋ボタン → エフェクト(Effect) → パーティクルシステム(Particle System)」を選択します。
![スクリーンショット 2022-05-22 14.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/b977555d-5d4d-18aa-c2bd-b41bb8d6a487.png)

2) 追加されたパーティクルシステムのインスペクタから、「形状 → スフィア」にし、半径を0にします。
![スクリーンショット 2022-05-22 14.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/073c7d1c-039b-c999-017a-de5bad99e423.png)
![スクリーンショット 2022-05-22 14.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/15da0ed4-1049-971b-064c-d3e16396fbbc.png)

3) 上の方にある項目で、「開始時の速度(Start speed)」を0、「最大パーティクル数(Max particles)」を1にしてください。
![スクリーンショット 2022-05-22 14.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/a05ff047-f4d2-9c7c-4329-6c6824a75196.png)


4) テクスチャシートアニメーションにチェックを入れ、タイルをx=3, y=3にします。
![スクリーンショット 2022-05-22 14.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/8f42a671-9bde-6895-79e1-54d051483728.png)

# 2.テクスチャをインポート
白で見えにくいですが、以下にある写真をダウンロードしてください。↓
![hit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/1ab11c05-fa74-ddae-7868-d01df5be7136.png)
ダウンロードできたら、Unityにドラッグ＆ドロップでインポートしてください。

# 3.マテリアルを作成
1) プロジェクトの＋ボタンからマテリアルを作成します。
![スクリーンショット 2022-05-22 14.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/97b783da-d659-35e4-bf05-e49df8c6e166.png)

2) マテリアルのシェーダを、「Particles > Standard Unlit」にしてください。
![スクリーンショット 2022-05-22 14.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/441301f1-4178-6706-87d1-553049fb8833.png)

3) 「アルベド」の左隣にある四角に、先ほどの写真をドラッグ＆ドロップします。
![スクリーンショット 2022-05-22 14.46.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/2a2cbde1-eef0-ac7a-00e5-46722553df82.png)

4) 先ほどのパーティクルのインスペクタから、「レンダラー > マテリアル」を見つけて、マテリアルをドラッグ＆ドロップします。

# 3.確認
うまく動いています。
速度が遅い時は、「開始時の生存期間(Start Lifetime)」パラメータをいじるといいでしょう。
![画面収録-2022-05-22-14.54.07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/b0e36cb2-8a38-a772-99f5-fa8d2573c9e6.gif)

# 4.まとめ
いかがだったでしょうか。
今回は、簡単にパーティクルでアニメーションする方法を紹介しました。

このように、簡単な技術の紹介や、難しくコアな技術まで紹介していく予定です。
気に入っていただけましたら、フォローの方よろしくお願いいたします。
【AtCoder】ABC252 F問題 解説

# 問題
蟻本によく似た問題が載っている(P.75)。
$1$ つのパンを分割して必要な長さのパンたちに分けるときの最小コストを求める問題。

https://atcoder.jp/contests/abc252/tasks/abc252_f

# 解き方

貪欲法で解ける。
分割したいパンたちのうち、短いものから $2$ つ選び、それらを結合していく、という処理をパンが $1$ つに復元されるまで行う。

ソートの部分を高速化するため、```priority_queue```を使って解く。

まずは作りたいパンの長さを ```priority_queue```を用いてソートする。
作りたいパンの長さの合計値が元のパンより少ない(余ったパンができる)なら、余る部分の長さも```priority_queue```に入れる。
```priority_queue```の先頭の2つの要素を取り出し、結合して```priority_queue```に```push```し直す。

# 実装

```priority_queue``` を用いることで、ソートが高速に行えるため、計算量は$O(NlogN)$ となる。

```cpp:ABC252_F.cpp
int main() {
	
	int n; ll L;
	std::cin >> n >> L;

	priority_queue<ll, std::vector<ll>, std::greater<ll>> pq;
	ll sum = 0;
	ll x = -1;
	rep(i, n) { (void)scanf("%lld", &x); sum += x; pq.push(x); }
	if (sum < L) { pq.push(L - sum); }

	ll ans = 0;
	while (pq.size() > 1) {
		ll L1 = pq.top(); (void)pq.pop();
		ll L2 = pq.top(); (void)pq.pop();
		ans += L1 + L2;
		pq.push(L1 + L2);
	}

	cout << ans << endl;

	return 0;
}
```
React Hooks と TypeScript で子コンポーネントに state を渡す方法

ReactとTypeScriptを使った子コンポーネントにstateを渡す際に以下のエラーに手こずったので、備忘録として残します。

```
Type '{ setStateProp: Dispatch<SetStateAction<string>>; }' is not assignable to type 'IntrinsicAttributes'.
  Property 'setStateProp' does not exist on type 'IntrinsicAttributes'.
```

エラーの概要としては「型を割り当てることができない」というエラーでした。

次項が、エラーが発生したコードです。

# 親コンポーネント

```react:Parent.tsx
import React, { FC, useState } from "react";
import { Child } from "./Child";

export const Parent: FC = () => {
	const [stateProp, setStateProp] = useState<string>("");
	return (
		<div>
			<Child
				setState={setState}
			/>
		</div>
	);
};
```

この記述でJSXならば、StateをPropsとしてエラーなく子コンポーネントに渡せますが、**TypeScriptでは型を子コンポーネントで割り当てて渡すようにしないと**、上記のエラーが出ます。

そして、エラー発生時の子コンポーネントの記述はというと、以下のようになっていました。

# 子コンポーネント

```react:TaskAddInput.tsx
import React { FC } from "react";

export const Child: FC = ({
   setStateProp
}) => {

	return (
		<div></div>
	);
};
```

上記のコードでは、Propsとして渡した**Stateの型を定義できていない状態**になっています。

これだと、例のエラーがでます。

## 解決法
解決方法としては、子コンポーネント側でStateの型を定義してあげることで解決できます。
そして、定義する型ですが、エラーの中に実は記載されています。

```
Type '{ setState: Dispatch<SetStateAction<string>>; }' is not assignable to type 'IntrinsicAttributes'.
```
このエラー情報の中の`Dispatch<SetStateAction<string>>`を定義するだけで、エラーを解決できます。

```react:Child.tsx
import React { FCDispatch, SetStateAction } from "react";

export const Child: FC<{ Dispatch<SetStateAction<string>> }> = ({
   setStateProp
}) => {

	return (
		<div></div>
	);
};
```

このようにすることでエラーを解決でき、子コンポーネント側にstateを渡すことができます。

他にも、やり方があるので、気になった方は以下の参考文献を読んでみてください。

# 参考文献
> [React Hooks と TypeScript で子コンポーネントに state を渡す方法まとめ](https://qiita.com/akifumii/items/ec9fdb9dd7d649c2f3dc)
シェルスクリプトを使ってHTMLファイルの作成する

本ページではシェルスクリプトを使ってHTMLファイルを作成する方法を紹介します。
HTMLファイルの作成は、ヒアドキュメントを使って記載している内容をファイルに保存する方法です。
今回はWEB時計を作ってみます。
ヒアドキュメント内でバッククオーテーション(`) を使ってdateコマンドを実行して結果をファイルに記載させるようにします。
シェルスクリプトによって作成されたHTMLファイルはPythonの簡易webサーバ機能を使って確認してみました。
以下手順になります。

**1. シェルスクリプトの作成**

シェルスクリプトを作ってみます。
内容はヒアドキュメントでHTMLファイル(time.html)を作成するもので、OSのコマンドdateを実行させてその結果も含めるというものです。

ファイル名: heredoc.sh
```
#!/bin/bash

#ここからヒアドキュメントtime.htmlファイルとして作成する

cat << EOT > time.html
<!DOCTYPE html>
<HTML lang="ja">
<meta charset="UTF-8">
<HEAD>
<TITLE>日本の現在時刻</TITLE>
</HEAD>
<BODY>
日本の現在時刻は、
<BR>
`date`
<BR>
です。
</BODY>
</HTML>

EOT
 
#ヒアドキュメントを終了する
```
※dateコマンドは両端にバッククォーテーション(`) で囲んでおきます。そうすると生成されたhtmlファイルにコマンドの結果が表示されます。

**2.シェルを実行してHTMLファイルを作成**

作成したシェルスクリプトを実行します。
```
$bash heredoc.sh
```
実行後に同ディレクトリ内にtime.htmlファイルが生成されます。
```
$ ls
 time.html
```

**3. Pythonの簡易webサーバ機能を使ってブラウザから確認**
pythonでwebサーバを立ち上げます(ポートは8080)
```
$python3 -m http.server 8080
```
ブラウザからアドレスを指定してページを開いてみます。
http://ローカルIPアドレス:8080/time.html
![here.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075298/53b4eb51-1eee-381a-fcf5-14db0196920c.png)
このように表示されました。

**まとめ**
今回はdateコマンドを使ってWeb時計のHTMLページを作成しましたが、他のコマンドにも置き換えていろいろ試せます。
crontabやJenkinsなどを使用して定期的にコマンドを実行させたりしてファイルを更新させていく利用もよいとおもいます。
ffmpeg-python で一時ファイルを使わずに音声生データを読み込む

# パソコンでエロいことをする時に欠かせないものといえば

ffmpeg です

# 最近

https://qiita.com/c1z/items/e4fb196f047d9130031c

こういうシリーズをやっていて、音声の生データを機械学習に食べさせるのに色々めんどくさいことをやっていた

# 今まではこうやってた

エロ動画 -> wav ファイル -> numpy.ndarray という変換をずっとやってた

```python
# wav ファイルを作る
input_stream = ffmpeg.input('input.mp4', ss=start, t=duration)
output_stream = ffmpeg.output(input_stream.audio, 'tmp.wav', ar=16000, ac=1)
ffmpeg.run(output_stream, overwrite_output=True)

try:
    # int16 の numpy.ndarray で読み込む
    sample_rate, wav_data = scipy.wavfile.read('tmp.wav', 'rb')
    wav_data = wav_data / tf.int16.max # int16 -> float64
finally:
    # 読み込んだら消す
    os.remove('tmp.wav')
```

# こうすると wav ファイルの書き出しがいらない

エロ動画 -> numpy.ndarray という変換になり、中間ファイルがいらない

```python
# stdout に音声の生データを書き出し、それをキャプチャする
input_stream = ffmpeg.input('input.mp4', ss=start, t=duration)
output_stream = ffmpeg.output(input_stream.audio, '-', format='s16le', acodec='pcm_s16le', ar=16000, ac=1)
wav_data, _ = ffmpeg.run(output_stream, overwrite_output=True, capture_stdout=True, capture_stderr=True)

# キャプチャした音声の生データを numpy.ndarray にする
wav_data = np.frombuffer(wav_data, dtype=np.int16)
wav_data = wav_data / tf.int16.max
```

# 実行速度も速くなった

ディスクアクセスが減ったからだと思う

# まとめ

エロい男は ffmpeg 使いが上手ということですね。
Next.jsでError: EPERM: operation not permitted発生時の対処法


## 操作内容

```bash
npm run build
```

```package.json
{
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "buffer": "^6.0.3",
    "next": "latest",
    "react": "17.0.2",
    "react-dom": "17.0.2"
  }
}
```

## エラー内容
```bash
Error: EPERM: operation not permitted,
```

## 原因
以下コマンドでローカルでサーバを起動していたため

```
npm run dev
```

## 対処法
ローカルサーバを止めて、再度以下を実行する
```bash
npm run build
```
SwiftUIでスプラッシュ画面を実装する

## 実装方法
モディファイアでスプラッシュ画面を実装していきます。

## スプラッシュ画面用モディファイア
カスタムビューを表示し、時間が立つと、モディファイア自身でスプラッシュが消えます


```swift:SplashModifier.swift
import SwiftUI

private let defaultTimeout: TimeInterval = 2.5

struct SplashModifier<SplashContent: View>: ViewModifier {
    private let timeout: TimeInterval
    private let splashContent: () -> SplashContent
    
    @State private var isActive = true
    
    init(timeout: TimeInterval = defaultTimeout,
         @ViewBuilder splashContent: @escaping () -> SplashContent) {
        self.timeout = timeout
        self.splashContent = splashContent
    }
    
    func body(content: Content) -> some View {
        if isActive {
            splashContent()
                .onAppear {
                    DispatchQueue.main.asyncAfter(deadline: .now() + timeout) {
                        withAnimation {
                            self.isActive = false
                        }
                    }
                }
        } else {
            content
        }
    }
}

extension View {
    func splashView<SplashContent: View>(
        timeout: TimeInterval = defaultTimeout,
        @ViewBuilder splashContent: @escaping () -> SplashContent
    ) -> some View {
        self.modifier(SplashModifier(timeout: timeout, splashContent: splashContent))
    }
}
```

## 使い方
アプリのコンテンツビュー（一番トップの親ビュー）にスプラッシュのモディファイアを適応する

```swift:ContentView.swift
        // スプラッシュ画面
        .splashView {
            // カスタムビュー
            ZStack {
                   Color.blue
                   Text("スプラッシュ")
                     .fontWeight(.bold)
                     .font(.system(size: 24))
                     .foregroundColor(.white)
                 }
            .edgesIgnoringSafeArea(.all)
        }

```

## 参考
https://swiftuirecipes.com/blog/swiftui-splash-screen

## GitHub
[TDD](https://github.com/TakanobuSano/TDD)
php7.3 → php8.1へバージョンアップする方法

## 相当詰まってようやく解決
[解決した記事](https://zenn.dev/yuzuyuzu0830/articles/347b76de0ced70）

### やった事
1.```php -v```
現状のバージョン確認
2.```brew install php@8.1 && brew link --force php@8.1```
php8.1のインストールとHomebrewを8.1にリンク
3.```open ~/.zshrc ```
パスを通すために.zshrcを開く。
開いたら、以下を追記しパスを通す。
```zsh
export PATH="/usr/local/opt/php@8.1/bin:$PATH"
export PATH="/usr/local/opt/php@8.1/sbin:$PATH"
```
4.```source ~/.zshrc```
パスを反映させる。

上記を行うと、```php -v```を再度行うとphpのバージョンが8.1へ上がっている。
RealityKitでMetalを使ったCustomMaterialを作る

##### RealityKitではMetalをCustomMaterialとして使用する場合、SurfaceShaderとGeometryModifierが必要になる

#### SurfaceShader
描画対象となるエンティティの見た目をレンダリングするためのピクセルを決定できる。
#### GeometryShader
描画の対象となるモデルの頂点を操作することができるので、サイズ、形状を動的に操作できる。

AppleのRealityKitのMetalApiのドキュメント。

https://developer.apple.com/metal/Metal-RealityKit-APIs.pdf

それぞれの二つのMetalファイルを作成して作るたいシェーダーを記述する。下記例
```
#include <metal_stdlib>
#include <RealityKit/RealityKit.h>
using namespace metal;

[[visible]]
void waveMotion(realitykit::geometry_parameters params)
{
    float xSpeed = 1;
    float zSpeed = 1.1;
    float xAmp = 0.01;
    float zAmp = 0.02;

    float3 localPos = params.geometry().model_position();

    float xPeriod = (sin(localPos.x * 40 + params.uniforms().time() /40) + 3) * 2;
    float zPeriod = (sin(localPos.z * 20 + params.uniforms().time() /13) + 3);

    float xOffset = xAmp * sin(xSpeed * params.uniforms().time() + xPeriod * localPos.x);
    float zOffset = zAmp * sin(zSpeed * params.uniforms().time() + zPeriod * localPos.z);
    params.geometry().set_model_position_offset(
        float3(0, xOffset + zOffset, 0)
    );
}

[[visible]]
void waveSurface(realitykit::surface_parameters params)
{
  auto surface = params.surface();
  float maxAmp = 0.03;
  half3 oceanBlue = half3(0, 0.412, 0.58);
  float waveHeight = (
    params.geometry().model_position().y + maxAmp
  ) / (maxAmp * 2);

  surface.set_base_color(
    oceanBlue + min(1.0f, pow(waveHeight, 8)) * (1 - oceanBlue)
  );
}

```
その後下記のようなコードでCustomMaterialをイニシャライザする際の引数にセットしてあげればMaterialとして扱う。

```swift
// deviceを取ってくる。
guard let device = MTLCreateSystemDefaultDevice() else { return }
        // metalLibraryを取ってくる
        guard let library = device.makeDefaultLibrary() else { return }
// ここで作成したGeometry ModifierとsurfaceShaderを用意してセットしてあげる。
        let geometryModifier = CustomMaterial.GeometryModifier(named: "myGeometryModifier", in: library)
        let surfaceShader = CustomMaterial.SurfaceShader(named: "mySurfaceShader", in: library)
        
        let customMaterial: CustomMaterial
        do {
            try customMaterial = CustomMaterial(surfaceShader: surfaceShader, geometryModifier: geometryModifier, lightingModel: .lit)
        } catch {
            fatalError()
        }
        
        let mesh = MeshResource.generateSphere(radius: 0.5)
        let modelEntity = ModelEntity(mesh: mesh, materials: [customMaterial])
```


意外とシンプルにCustomMaterialにセットすればできるが、そもそもMetalのAPIが難しい。。
そこさえできればいろんなMaterialを自在に扱えそう。
Lambdaでのアクセス許可追加方法の備忘録

# Lambdaでのアクセス許可追加方法
わざわざIAMに行かなくても、Lambda関数の設定>アクセス権限>実行ロール>ロール名から、許可ポリシーで適宜アクセス許可を追加することができる
![スクリーンショット 2022-05-22 13.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/f7168afb-9142-89fc-4020-5617dd596f67.png)

![スクリーンショット 2022-05-22 13.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/7a8d2405-2d11-7e30-3242-97808a5408e4.png)

参照
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-intro-execution-role.html

https://techblog.nhn-techorus.com/archives/19100?cfv=&model_id=&pos=6&nonce=1652397882
zsh 使いが nushell を使ってみて困った基礎的なコマンドたちとその代替法

- nushell -> https://www.nushell.sh/
  - https://github.com/nushell/nushell

※気づきが増えたらこの記事を更新して追記するかもしれません。

# `pwd`

```zsh
# zsh
pwd
```

```nu
# nu
$env.PWD
```

- https://github.com/nushell/nushell/issues/4761

# `pushd` & `popd`

```zsh
#zsh
pushd .. ; pwd ; popd ; pwd
```

```nushell
# nu
enter .. ; $env.PWD ; exit ; $env.PWD
```

- https://github.com/nushell/nushell/issues/4269
- `enter ..` で fork 的な、あるいは screens/tmux(/byoubu) 的な状態の別シェルへ移る。
- `shells` で `enter` で増えたシェルの一覧を視認できる。
- `n` と `p` で `enter` で増えたシェルを切り替えできる。
- `shells` で複数のシェルがある状態で `exit` するとシェルが1つ消えてお隣へ移る。

# `alias`

```zsh
# zsh
alias hoge='echo nyanko'
```

```nu
# nu
alias hoge = 'echo nyanko'
```

- `nu` では `alias` の後ろに続ける "引数群" は `command-alias` `=` `alias-entity` 的な具合なので `hoge='echo nyanko'` だと失敗します。 `hoge = 'echo nyanko'` だと成功します。


# `zsh --help` | `bash -c help`

```zsh
# zsh
zsh --help
# bash
bash -c help
```

```nu
# nu
help
```

- https://github.com/nushell/nushell/issues/347

# `code .` ( vscode via WSL with nushell )

```zsh
# zsh
code .
```

```nu
# nu
code .
```

- 但し、 vscode 側の実装が原因で nu-0.62.0 & vscode-1.67.2 の執筆時点では対話型とそうでない場合のトリックを仕込むなどして `nu` を擬似的なデフォルトのシェルに仕立てる必要があります。
  - https://github.com/nushell/nushell/issues/5043
  - https://github.com/microsoft/vscode-remote-release/issues/6615
nl2br関数使用時のブラウザ画面の挙動まとめ

# 経緯
nl2br関数を文字列に適用させる際に、''と""で囲んだ際のソースコード画面およびブラウザ画面の挙動の違いを整理したかったため。

# 環境

* 言語　php　7.4.29
* ブラウザ　Google Chrome
* macOS Monterey 12.1 (M1チップ)


# 検証結果まとめ

|テストケース|テスト文字列|nl2br適用|Webページでのソースコード表示|ブラウザ画面|
| :---: | :---: | :---: |:---: | :---: |
| 1 | '\n'| なし | 改行なし(\nがそのまま表示)|改行なし(\nがそのまま表示)|
| 2 | '\n'| あり | 改行なし(\nがそのまま表示)|改行なし(\nがそのまま表示)|
| 3 | "\n" | なし| 改行あり(\nが消失) |改行なし(\nが消失し、半角スペースが入る)|
| 4 | "\n" | あり| 改行あり(\nが消失し、\<br />タグが出現) |改行あり(\nが消失)|


# 検証コード


```php5:検証テスト1〜4
<?php
$singleQ = 'ここで\n改行です';
$doubleQ = "ここで\n改行です";
?>

<?php echo 'テスト1:' . $singleQ; ?>
<p></p>  <!-- 空白行挿入のため(テスト2~4も同様) -->

<?php echo 'テスト2:' . nl2br($singleQ); ?>
<p></p>

<?php echo 'テスト3:' . $doubleQ; ?>
<p></p>

<?php echo 'テスト4:' . nl2br($doubleQ); ?>
<p></p>

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2558202/77060861-5e34-58fe-0eef-cb022de7bc58.png)






## 余談

htmlspecialcharsを絡めた話は複雑になるので検討対象から外しました。
忘備のため、ちょっとしたことをメモとして記載しておきます。

```
＜メモ＞
htmlspecialcharsとnl2brを併用する場合は、順番に留意すること

htmlspecialchars → nl2br  brタグとして認識されブラウザ画面で改行が反映
nl2br → htmlspecialchars 　brタグの<>がエスケープされブラウザ画面で改行が未反映
```
goでChatworkにメッセージを送るサンプル


```golang
package main

import (
	"net/http"
	"net/url"
	"strings"
)

func main() {
	roomID := "xxxxxxxxxx"
	apiUrl := "https://api.chatwork.com/v2/rooms/" + roomID + "/messages"
	apiToken := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
	ChatworkMessagePost(apiUrl, apiToken, "testmessage")
}

func ChatworkMessagePost(apiUrl, apiToken, message string) error {
	values := url.Values{}
	values.Set("body", message)

	req, err := http.NewRequest(
		"POST",
		apiUrl,
		strings.NewReader(values.Encode()),
	)

	if err != nil {
		return err
	}

	req.Header.Set("X-ChatWorkToken", apiToken)
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}

	defer resp.Body.Close()

	return err
}
```
useIdを用いてidの重複を防ぐ

# はじめに
これまでid属性の重複を嫌って、htmlを書くときはidを極力使わないようにしてきた。しかし、React18のリリースにあたって[useId](https://ja.reactjs.org/docs/hooks-reference.html#useid)が使えるようになり、ハイドレーション時にクライアント・サーバー間で一意なidを割り振ることができるようになった。そのためReact18以降を用いる場合はid属性が重複する問題がなくなった(書き方によっては重複する)。この記事ではuseIdの紹介と、useIdを使用した簡単な例を紹介する。

# useIdとは
useIDは[React18のリリース](https://github.com/facebook/react/releases/tag/v18.0.0)で追加されたフックAPIの一つで、[useTransition](https://ja.reactjs.org/docs/hooks-reference.html#usetransition)などと同時に追加されたものである。
機能自体は簡潔で公式に書かれていることに尽きる。

> useId はハイドレーション時の不整合を防ぎつつサーバとクライアント間で安定な一意 ID を作成するためのフックです。

useIdを呼び出すと`:r0:`や`:ra:`のように`:`で挟んだような文字列が生成される。

```js
// 関数コンポーネントのトップレベルで実行
const id = useId()
console.log(id) // :r0:
```
1ページに複数のルートがある場合はIDの重複が起きるのでそれを防ぐために`createRoot`や`hydrateRoot`の段階で第二引数のoptionsにidentifierPrefixを設定することができる。ちなみにReactDOMのrenderはReact18ではサポートされておらず、`createRoot`などを使う必要があります([詳細はこちら](https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#updates-to-client-rendering-apis))。

```js
const container = document.getElementById('root')
const root = ReactDOM.createRoot(
  container,
  {
    identifierPrefix: 'vv'
  }
)
```
このように設定することで、`:r0:`となるはずだったIDは`:vvr0:`となる(与えた文字列がprefixになる)。

※`:`が含まれるためCSSセレクタやquerySelectorAllで使用することはできません。
※配列によって生成した要素のkeyとして与えることはかえってパフォーマンスが下がるのでやめましょう(なぜなのか知りたい場合は[差分検出処理](https://ja.reactjs.org/docs/reconciliation.html)を読んでください)。

# 例
簡単な例としてinputフィールドを紹介する。labelとinputの紐付けと[aria-errormessage](https://a11ysupport.io/tech/aria/aria-errormessage_attribute)の設定、この二つの場面でidを使用したコードを紹介する。aria-errormessageについて詳細は述べないが、他の[WAI-ARIA](https://www.w3.org/WAI/intro/wcag)にもidを使用する属性もあるのでそれらにも使えるだろう。これらのa11yを考慮したwebサイトの構築は[Reactも全面的にサポートを行なっている](https://ja.reactjs.org/docs/accessibility.html)ので是非積極的に導入していただきたい。

今回紹介する例のコードはこちら

<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="VwQWEVw" data-editable="true" data-user="kokisakano" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kokisakano/pen/VwQWEVw">
  useIdInput</a> by KokiSakano (<a href="https://codepen.io/kokisakano">@kokisakano</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

ボタンを押すことでエラーの表示非表示を変更できるだけのシンプルなページである。
labelの`htmlFor`とinputの`id`はuseIdによって生成したIDによって紐づけることができ、inputの`aria-errormessage`はp(エラー文)の`id`と別に生成したuseIdと紐づけることができている。
レンダリング部分(25行目以降)は基本的に教科書通りの設定をしているが、`createRoot`を呼び出す際は第二引数のoptionsに`identifierPrefix`を設定した。こうすることでuseIdによって生成される文字列にprefixを与えることができる。この例はrootが単一なので設定する必要がないが、例として書いた。

# おわりに
useIdはシンプルに書けて特に解説する部分もないので例の説明もコンパクトなものになった。それだけシンプルなhookを使うことでクライアント・サーバー間で一意なIDを生成することができるので、これまでhtmlのid要素を使うことを避けていた人も使用してみるのはいかがだろうか。
ブラウザの開発者ツールで家庭用ごみ袋の外装を作った

## 🧑‍🎨🎨💻コンソール出力を装飾する

みなさんはもう普通の開発者ツールには飽きましたよね❓🤔
（飽きた方もそうでない方も、ここではとりあえず飽きたという体でお願いします🙇🙇‍♂️）

ブラウザの開発者ツールにコンソールがありますが、コンソールの出力には、フォントサイズや色など、一部のスタイルを適用することができます💡

https://developer.mozilla.org/en-US/docs/Web/API/console#styling_console_output

みなさんが開発者ツールで用いる `console.log` 関数を以下のように使います。
第一引数には表示する文字列を指定するのですが、ここで `%c` 以降に文字列を書き、第二引数以降でスタイルを記述していきます。

```javascript
// このコードをいきなり実行するとびっくりするので注意してください！
console.log('%cわぁ！', 'font-size: 100px;');
```

`%c` は一度に複数定義することが可能です。
複数定義したら、後の引数で順番にスタイルを指定します。

```javascript
// このコードをいきなり実行するとびっくりするので注意してください！
console.log('%cわ%cぁ%c！', 'font-size: 100px; color: red;', 'font-size: 100px; color: blue;', 'font-size: 100px; color: green;');
```

## 🏘️🚮ごみ袋を作る

この機能を利用して、燃えるゴミ袋の外装を作ってみました。
以下のコードを開発者ツールのコンソールに貼り付けて実行してみてください。
コンソールを十分に広げた方がうまく表示できる可能性が高いです。

```javascript
console.log(
    '%cごみ袋%c\n燃 え る ご み%c\nBurnable%c\n家庭用%c\n %c45ℓ/10枚入り%c %c\nごみ収集・処理の費用は税金でまかなわれています。',
    'line-height: 40px; color: red; background-color: aliceblue; font-size: 20px; padding: 0 192.3px; font-weight: bold; border-radius: 20px 20px 0 0;',
    'line-height: 60px; font-size: 40px; background-color: red; color: aliceblue; padding: 0 80px;',
    'line-height: 30px; font-size: 20px; font-family: "Times New Roman"; font-style: italic; background-color: red; color: aliceblue; padding: 0 186.8px;',
    'line-height: 37.5px; font-size: 25px; background-color: aliceblue; color: red; padding: 0 186.3px;',
    'line-height: 30px; font-size: 20px; background-color: aliceblue; color: red; padding: 0 70px;',
    'line-height: 30px; font-size: 20px; background-color: red; color: aliceblue; padding: 0 10px;',
    'line-height: 30px; font-size: 20px; background-color: aliceblue; color: red; padding: 0 70px;',
    'line-height: 22.5px; font-size: 15px; background-color: aliceblue; color: red; padding: 0 31.8px; border-radius: 0 0 20px 20px;'
);
```

こんな感じで表示されたでしょうか😊

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/4aaed315-fc52-beb6-80e2-8f935519f508.png)

## 📝まとめ

開発者ツールのコンソールでは、ちょっとした工夫とか遊び心とかを表現するにはいいと思います。
でもちゃんとしたデザインを作るにはやっぱり Figma や Adobe Illustrator などを使った方が良さそうですね🥰