OmniAICreator/Qiita-1.07M huggingface dataset:
gitlabのリポジトリを小さくする

# はじめに
gitlabのフリー版は2022-10-19から[最大5GB、５人までに制限される](https://about.gitlab.com/pricing/faq-efficient-free-tier/)ことになった。プロジェクトの「設定」-「割当使用率」から「Seats」タブを見ると割当て人数が、「ストレージ」タブを見ると使用サイズを確認できる。
間違えてあげてしまった画像などの影響でリポジトリが大きくなってしまっている場合のリポジトリサイズ削減手順をメモする。

基本的なことは[gitlabのdoc](https://docs.gitlab.com/ee/user/project/repository/reducing_the_repo_size_using_git.html)に書いてある。
gitlabに固有なのはリポジトリがデフォルトでロックされており、git push --forceが効かないこととクリーンアップ手順。
以下はmacOS 12.5での作業。
git version 2.32.0 (Apple Git-132)を使用。

## 警告
基本的にはリポジトリの履歴を書き換えるべきではありません。以下の手順では過去のコミット番号も変わってしまうため、Commit IDを記載したメッセージやリンクは役に立たなくなります。また、記事には誤記があるかもしれませんので、事前にリポジトリ全体をバックアップするなどの注意が必要です。本記事を参考にして作業する際は、**自己責任**で行なってください。

# 手順
やりたいこと：gitlabで管理されたリポジトリから大きなファイルを探して履歴から削除する。

## 0. 準備
同様のコマンドのgit-filter-branchを使おうとすると、git-filter-repoを勧められる。
```
brew install git-filter-repo
```

## 1. git cloneする
```zsh
git clone project_path.git
```
## 2. 巨大ファイルを探す
[git_find_big.sh](https://ja.confluence.atlassian.com/bitbucket/files/321848291/321979854/2/1587501654761/git_find_big.sh)を使って大きなファイルを探す。macOSのzshだと動かないのでbashで呼び出す。
```zsh
cd project_name
bash path/to/git_find_big.sh
```
## 3. git-filter-repoでローカルリポジトリでのファイル削除
ここからの作業は十分注意して行うこと。例えば、ファイル"file.ext"を削除する場合。--invert-pathsを入れないと"file.ext"以外が削除されてしまい、悲惨なことになる。フォルダを指定すればフォルダごと削除されてしまう。過去のコミット番号も変わってしまうため、Commit IDを記載したメッセージやリンクは役に立たなくなります。一度、git-filter-repoを呼び出したら、後の手順で利用するcommit-mapが書き変わるため、複数回git-filter-repoを呼び出したい場合は、毎回最後まで手続きを進める必要があります（もっと良い方法があるのかもしれませんが...）。

```zsh
git filter-repo --path path/to/file.ext --invert-paths
```

## 4. リモートリポジトリの設定変更（Allowed to force push）
デフォルトではgit push --forceが効かないので、次にgit push -fする前に[ここ](https://docs.gitlab.com/ee/user/project/protected_branches.html)にあるようにプロジェクトのサイトからSettings > Repository > Protected branches で表示される画面でブランチの"Allowed to force push"をONする

## 5. リモートリポジトリを再追加
git-filter-repoでリモートリポジトリの設定が削除されるので手動で追加する。
```zsh
git remote add origin project_path.git
```

## 6. リモートリポジトリを強制アップデート
```zsh
git push origin --force --all
```

## 7. commit-mapを作成する
commit-mapを作成し、取り出す。
```zsh
git filter-repo --analyze
cp .git/filter-repo/commit-map .
```
## 8. 30分待つ
gitlabでは次のステップのリポジトリのクリーンアップは30分以上前のオブジェクトに対してのみ実行されるので、３０分待つ。

## 9. リポジトリのクリーンアップ
gitlabのサイトでプロジェクトの設定へ行き、Settings > Repositoryから、Cleanupを選択する。
commit-mapファイルをアップロードして、"Start cleanup"ボタンを押す。

## 10. リモートリポジトリの設定変更（Allowed to force push）
手順４の設定を元に戻す（"Allowed to force push"をOFFにする）。

以上
AWS 関連メモ


##NextアプリのcircleCiで自動デプロイ


##### s3の設定

①bucket作成
- 静的ホスティング有効化
- ACL許可設定
- policy追加　例↓
```
{
    "Version": "2012-10-17",
    "Id": "Policy1661675250164",
    "Statement": [
        {
            "Sid": "Stmt1661675247450",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKET名/*"
        },
        {
            "Sid": "Stmt1661677462962",
            "Effect": "Allow",
            "Principal": {
                "AWS": "ユーザーARN"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET名/*"
        }
    ]
}
```

##### circleCi設定

- 環境変数の追加
```
AWS_ACCESS_KEY_ID: ユーザのAWSアクセスキー
AWS_SECRET_ACCESS_KEY: ユーザのAWSシークレットキー
AWS_DEFAULT_REGION: デフォルトリージョン
AWS_S3_BUCKET_NAME: バケット名
```
- .circleci/config.ymlファイル
https://nishinatoshiharu.com/next-ssg-circleci-s3/#GitHubCircleCI  

  
##### buildに失敗する場合
```
Treating warnings as errors because process.env.CI = true.
Most CI servers set it automatically.

Failed to compile.
```
↓
```package.json
    "build": "CI=false && react-scripts build",

```




##### https対応した独自ドメインのWebサイトをS3 + CloudFrontで運用する手順
https://nishinatoshiharu.com/cloudfront-s3-hosting/  
  
##### Amazon Route 53 がパブリックホストゾーンに作成する NS レコードと SOA レコード
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/SOA-NSrecords.html
Win11, RAM16GB, RTX3060Ti(VRAM8GB)でStable Diffusionを動かしたメモ

# 概要
Win11, RAM16GB, RTX3060Ti(VRAM8GB)でStable Diffusionを動かしたメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191114/093e4377-5789-8614-1f5b-6abe63151e84.png)

# WSLのインストール
通常通り行う。

```
wsl --install
```

PCを再起動して、初回起動セットアップ後、

```
sudo apt-install python3-pip
```

するのを忘れずに。

# スワップの拡張
RAM16GBの環境だと、WSLは8GBになる。
どっちにしろ、ものすごいRAMを食うのでStable Diffusionを動かしてもOOMで止められてしまう。

```
C:\Users\{ユーザー名}\.wslconfig
```

を新規作成し、以下を書き込む

```
[wsl2]
swap=32GB
```

```
wsl --shutdown
```

する。

参考文献

https://zenn.dev/d_pontaro/articles/wsl-config-swap

# 環境構築する

以下のサイトを参照
https://touch-sp.hatenablog.com/entry/2022/08/23/222916

下記をExplorerで開いてファイルを入れると良い
```
\\wsl.localhost\Ubuntu\home\{UNIXユーザー名}\stable-diffusion
```

しかし、環境構築が終わって実行しても、Out of Memoryで止まると思う。

# Out of Memory対策

下記のサイトの通り、text2img.pyを修正して、モデルをfp16にする

https://td2sk.hatenablog.com/entry/2022/08/24/001630

# 実行する

```
python3 scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms --ckpt sd-v1-4.ckpt --n_samples 1
```

以下のフォルダに出力される。

```
\\wsl.localhost\Ubuntu\home\{UNIXユーザー名}\stable-diffusion\outputs\txt2img-samples
```

150秒くらい掛かる。
formオブジェクト使用時のエラーメッセージの日本語化

# 概要

エラーメッセージの日本語化を実装したが、formオブジェクトを使用している箇所だけ実装できない。


# 前提
ja.ymlファイルの作成までは完了している。
Formオブジェクト以外のエラーメッセージについては日本語化ができている。

# 現状
ja.ymlに日本語入力の記述をしても日本語にならない

```
ja:
  activerecord:
    attributes:
      user:
        name: ニックネーム
        birthday: 誕生日
        family_name: 姓
        first_name: 名
        family_name_kana: 姓（カタカナ）
        first_name_kana: 名（カタカナ）

      item:
         item_name: 商品名
         image: 商品画像
         introduction: 商品の説明
         price: 価格
         delivery_days_id: 配送準備日
         item_condition_id: 商品の状態
         postage_payer_id: 配送料の負担
         category_id: カテゴリー
         prefecture_code_id: 配送元の地域

      purchase_sending:
         post_code: 郵便番号
         city: 市区町村
         house_number: 番地
         phone_number: 電話番号
         prefecture_code_id: 都道府県
         token: カード情報

```

formオブジェクトを使用している箇所のモデルに変更を加えました。

```
ja:
  activerecord:
    attributes:
      user:
        name: ニックネーム
        birthday: 誕生日
        family_name: 姓
        first_name: 名
        family_name_kana: 姓（カタカナ）
        first_name_kana: 名（カタカナ）

      item:
         item_name: 商品名
         image: 商品画像
         introduction: 商品の説明
         price: 価格
         delivery_days_id: 配送準備日
         item_condition_id: 商品の状態
         postage_payer_id: 配送料の負担
         category_id: カテゴリー
         prefecture_code_id: 配送元の地域

  activemodel:
    attributes:
      purchase_sending:
         post_code: 郵便番号
         city: 市区町村
         house_number: 番地
         phone_number: 電話番号
         prefecture_code_id: 都道府県
         token: カード情報
```

# 原因
formオブジェクトの記述を行なったforms/purchase_sendingファイルはActiveModelを継承しているファイルだった為、activerecord:（2行目）では反映されなかったみたいです。
【python】No module named '_lzma'でつまずいた話

## 環境
* Mac
* Homebrew
* pyenv

## librosa

librosaを使おうと思いインストールしたのだが、No module named '_lzma'が出てつまずいた。

どうやらpandasでも同じエラーがでるようで、pythonにlzmaが組み込まれていないのが原因みたいだ。

## 色々調べてみて

どうやらMacの場合、`ｘｚ`というのが無いといけないらしい。

`pyenv`でpythonをインストールする時に`xz`がないと組み込まれないとか。

## やってみたこと

* xzのインストール
* pythonの再インストール

まずは`xz`のインストールをしてみる。

```terminal:terminal
$ brew install xz
```
次にpythonをアンインストール。

後述するがここがだめだったみたい。（凡ミス）

```terminal:terminal
$ pyenv uninstall 3.9.0
```
そしてpythonをインストール。


```terminal:terminal
$ pyenv install 3.9.0
```
そして`lzma`が通るかチェック

```terminal:terminal
$ python
>>> import lzma

ModuleNotFoundError: No module named '_lzma'
```

見事にエラー。

1時間ほどいろいろ悩んだ結果再インストールできていなかった事が判明！笑

## 使ってるpythonのバージョンが違った

pyenvに入っているpythonをみてみたところ・・・

```terminal:terminal
$ pyenv versions
  system
  3.9.0
* 3.9.1 (set by /Users/hoge/.pyenv/version)
```

お主`3.9.1`を使ってるではないか！！！！！

つーことは`3.9.1`を入れ直せばいけるかもしれない！！！

```terminal:terminal
$ pyenv uninstall 3.9.1
$ pyenv install 3.9.1

$ pyenv versions
  system
* 3.9.1 (set by /Users/hoge/.pyenv/version)

$ python
>>> import lzma
>>>
```

いけたああああああ！！！

非常に情けないミスでしたが、もしかすると同じように悩んでいる方もいるかもしれないので一応記録として！
E資格対策_活性化関数


# ReLU関数


```py
def relu(v):
    x = np.maximum(0, v) 
    return x

```

# Softmax関数

```py

def softmax(x):
    x = x.T
    x = x - np.max(x, axis=0) 
    x = np.exp(x) / np.sum(np.exp(x), axis=0) 
    return x.T

```

# シグモイド関数

```py

def sigmoid(x):
    return 1.0 / (1.0 + np.exp(-x)) 

```

# tanh関数

```py

def tanh(x):
    sinh = (np.exp(x) - np.exp(-x)) / 2.0
    cosh = (np.exp(x) + np.exp(-x)) / 2.0 
    return sinh / cosh

```


# Leaky ReLU関数

alpha は自分で設定する必要がある。

```py

def lrelu(x, alpha=0.01):
    x = np.maximum(alpha*x, x) 
    return x

#別パターン
def lrelu(x, alpha=0.01):
    x = np.where(x > 0.0, x, alpha*x)
    return x 

```

Layer1 ＝　活性化関数（Layer0 * 重み1 ＋　バイアス1）

Layer1 = ReLU(Layer0 * w1 + b1)
self.layer1 = relu(np.dot(self.layer0, self.w1) + self.b1)



# GAN Generator

```py

class Generator(nn.Module):
    def __init__(self, z_size, feature_size, ngpu):
        #z_size: 一様乱数からサンプリングされるノイズzの次元数。
        #feature_size: 最初の全結合層の次元数。
        #ngpu: 使用できるGPUの数。
        
        super(Generator, self).__init__()
        self.ngpu = ngpu
        self.net = nn.Sequential(
            # Affine変換実施
            nn.Linear(z_size, feature_size), 
            # バッチ正規化の実施　Pytorchのnn.BatchNorm1dを使えばよい
            nn.BatchNorm1d(feature_size), 
            # negative_slope : LeakyReLUの引数　（今回は0.2とする）
            nn.LeakyReLU(0.2),    
          
            #次元数を倍にする
            nn.Linear(feature_size, feature_size * 2),
            nn.BatchNorm1d(feature_size * 2),
            nn.LeakyReLU(0.2),
            
            #次元数を倍にする
            nn.Linear(feature_size * 2, feature_size * 4),
            nn.BatchNorm1d(feature_size * 4),
            nn.LeakyReLU(0.2),
            
            #次元数を倍にする
            nn.Linear(feature_size * 4, 28 * 28),
            nn.Tanh()
          
        )
    
    def forward(self, input):
        x = input.view(-1, 100)
        x = self.net(x)
        x = x.view(-1, 28, 28)
        return x

```


```py
class Discriminator(nn.Module):
    def __init__(self, feature_size, ngpu):
        super(Discriminator, self).__init__()
        self.ngpu = ngpu
        self.net = nn.Sequential(
# 28*28次元のデータをfeature_size*4次元に変換する全結合層を実装する
            nn.Linear(28*28, feature_size * 4), 
            nn.LeakyReLU(0.2), 
            
            nn.Linear(feature_size * 4, feature_size * 2),
            nn.LeakyReLU(0.2),
            
            nn.Linear(feature_size * 2, feature_size),
            nn.LeakyReLU(0.2),
            
            nn.Linear(feature_size, 1),
            nn.Sigmoid()
        )
    def forward(self, input):
        x = input.view(-1, 28*28)
        x = self.net(x)
        x = x.view(-1)
        return x
```
PowerBI×Dr.Sumでダッシュボードの作成

# ・Dr.Sum と PowerBI の連携が可能に
Dr.Sum Ver.5.6 の5/26のアップデートから、Dr.Sum と PowerBI の連携が可能になりました。
これにより、PowerBIからDr.Sumに接続してデータの集計・分析が可能になります。
ニュースリリース：[データ分析基盤「Dr.Sum」がMicrosoft Power BIと連携](https://www.wingarc.com/public/202205/news1572.html "PoweBI連携")

# ・PowerBI 連携の効果
Dr.Sumのデータを高速に集計できるというメリットはもちろん、これまでDr.Sumの集計表のみで分析しているユーザーはPowerBIを利用することで、
チャートを利用した多様な表現でデータの分析が行えるようになります。
実際どのような表現ができるのか見ていきたいと思います。

# ・PowerBIで可能な表現
今回は、PowerBI Desktop を利用して実際に画面を作成してみたいと思います。
連携方法については、以下の記事が参考になります。
　[Power BI でDr.Sumにつないでみた](https://qiita.com/ilovehome/items/02891b875c56acaea0a1 "PoweBI連携")

PowerBIでDr.Sumと連携すると最初は以下のような画面になります。
※データはサンプルデータになります。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951479/c73a4843-198b-459b-26be-497ac519bcd9.png)

ここから、右側の[フィールド]にある項目を画面中央にドラック&ドロップで配置します。

![2_加工.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951479/bc6bcbd2-1f53-79ab-b246-4463c6b34aa9.png)

上記の画像では売上金額を配置しましたが、このように項目を配置すると自動でチャート表現した形で表示されます。
さらにここに分析したい軸を加えます。
同様にドラック&ドロップで、先ほど作成された売上金額のチャート上に項目を配置します。


![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951479/096cf4a4-74aa-26c8-4251-00c74a917ead.png)

項目を配置すると軸が追加されて表示されます。
このように直感的に項目を配置することで軸を変えながら集計を行うことができます。

また、視覚化の個所でチャートのアイコンを選択することで、自由にチャートの種類を変更することも可能です。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951479/0d7cbad0-cf9f-d7ae-97e3-86d0ee641e49.png)


もちろんチャートは複数配置可能で、ダッシュボードとして利用することが可能です。
その他の機能として、フィルターでデータを絞り込んだり、集計表で複数軸を配置することで、段階的なデータの表示も実現可能です。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951479/9fd998b2-da85-3310-ef6a-7a7061dbbffa.png)


このように様々な表現のチャートを複数配置して、データの分析がよりビジュアル的に行えるようになります。
是非Dr.Sumのデータをさらに活用するために、PowerBIでダッシュボードを作ってみましょう！
Jupyter Notebookでmatplotlibのグラフが表示されない

# はじめに
　Jupyter Notebookを使っているときに、matplotlibでグラフを描くと普通はインラインで表示されますよね。先日、シンプルなコードなのにグラフがなかなかインライン表示できずに、少し手こずったので現象と対策をまとめてみました。

 
# グラフが表示されない
　問題が発生したのはこんなコードです（わかりやすくするために簡略化しています）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957968/dc69474b-8db0-c5c3-57b0-1a7c01670462.png)


　セルを一番上から１個ずつ実行していくとこんな感じの画面になります。
グラフが表示されない（涙）・・・
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957968/d8eabc7b-7b8f-69d7-913c-c7cfc0036a95.png)

# 「%matplotlib inline」を付けてみた


 

　ネットで検索すると、Jupyter Notebookでmatplotlibのグラフが表示できないときの対策は、先頭に「%matplotlib inline」を付けましょうとか、最後に「plt.show()」を付けましょう、といった方法がよく出てきます。

　ところが、どちらをやってみてもダメなんですよね・・・

先頭に「%matplotlib inline」を付けた結果は下記。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957968/36edb16b-7a0a-619a-cbdf-dbd73fb1ff59.png)

　結果変わらずですね。ほかにもいろいろ試行錯誤してみました。
別の仮想環境を作ったり、jupyterやmatplotlibを入れなおしたり・・・

 
# グラフ描画成功!!
　結局、とあることをしたら表示できるようになりました。どうやったと思います？

　正解は **「複数のセルに分割して記述しているコードを一つのセルにまとめる」** でした。
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957968/460d82ec-c1b1-e865-081b-8dcf607d1c70.png)
 
　Jupyter notebookでは、プログラムを一つのセルにまとめて書こうが、複数のセルに分けて書こうが、セルを順番に実行していけば同じ動作をするものと信じていたのですが、matplotlibについては挙動が変わるようです。

# セルの分割位置を変えてみる 

　試しにセルの分割位置を変えてみるとこんな感じになります。

#### 1.「figureの生成」と「axesの追加 + グラフのプロット」の間でセルを分割
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957968/9a0b939b-db44-115d-1697-90fe67cc2426.png)
　この場合は、plot()を実行する前に空のグラフが描画されています。


 
#### 2.「figureの生成 + axesの追加」と「グラフのプロット」の間でセルを分割
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957968/b2dd7254-fe26-9b03-18ab-8a707dce8741.png)
　この場合は最初の結果と同じく何も描画されません。



　おそらく、matplotlibでは
- 「figureの生成」が入っているセルを最後まで実行した時点でグラフ描画が実行される
- それ以降はグラフの内容が更新されても描画は実行されない。

ということでしょうか？
　ちなみに、このコードの最後にfig.show()を付けて強制的に描画させると、こんな結果になります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957968/3a77d120-066b-25cd-877b-fe2f5733d099.png)

　「figureの生成」が入っているセルの実行が完了した時点で、matplotlibのバックエンドが非GUIのバックエンドに切り替わってしまっているようですね。

　これが仕様なのかどうかは定かではありませんが、同じような症状で困っている方は **「セルの結合」** お試しあれ。
【XSS】PHPからJSへ配列を渡しJSON.parseで解析すると脆弱性があるよという話

# はじめに

追記　2022/08/27
私の記事に間違っている部分がありました…
`JSON.parse`自体にXSSの脆弱性があるわけではありません。`JSON.parse`の`'...'`内に展開するという使い方が間違っているという話でした。
今回でいいますと
```php
// JSON.parseの()内でシングルクォーテーションを使用しているためでした。
// じゃあダブルクォーテーションを使えば良いかというと、そういうわけでもないです。
// ダブルクォーテーションだとエラーになります。
JSON.parse('<?php echo json_encode($array) ?>');

// また、下記の記述でもJSコードが認識されます。
const array = ['<?php echo json_encode($array) ?>'];
```

そのため、上記を念頭に記事を読んで頂けますと幸いです。
※コメント欄で[@tadsan](https://qiita.com/tadsan)さんに教えて頂きました。[@tadsan](https://qiita.com/tadsan)さんありがとうございます！
　また、もう一つの回避策も教えて頂きましたので、ぜひコメント欄を見て頂けますと幸いです。

PHPからJSへ配列を渡し`JSON.parse`にかけると脆弱性がある、この話はそこそこ前からある気がします。
ただ、最近もGoogleで検索すると`JSON.parse`を使用した記事を目にすることがあります。
そこで、PHPからJSへ配列を渡した時に`JSON.parse`を使用しなくても配列を渡せる方法を書いていきます。

# JSON.parseで解析するとXSSの脆弱性がある
XSSの脆弱性があるため配列内のJSコードが認識されます。
コードは下記のようなコードです。
```php
<?php
  $array = array("',alert('xss'),'");
?>

<!DOCTYPE html>
<html lang="ja">
<head></head>
<body>
  <script>
    // JSON.parseに読み込まれる値は、'["'、alert('xss')、'"]'、の三つの値になる
    const array = JSON.parse('<?php echo json_encode($array) ?>');
    console.log(array);
  </script>
</body>
</html>
```
結果、alert ダイアログが表示されます。
![alertダイアログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708185/9251e227-99af-75ff-2cdb-65a569b1fe42.png)

# JSON.parseを使用しない方法
じゃあどうやってJSコードではなく文字列として読み込ませるかというと`JSON.parse`を外すだけでいけます。
※ちなみに、配列内の要素が文字化けする人はjson_encodeの第二引数で調整できます。詳しくは[こちら](https://www.php.net/manual/ja/function.json-encode.php)
```php
<?php
  $array = array("',alert('XSS'),'");
?>

<!DOCTYPE html>
<html lang="ja">
<head></head>
<body>
  <script>
    const array = <?php echo json_encode($array) ?>;
    console.log(array);
  </script>
</body>
</html>
```
結果、きちんとconsoleに表示されました！
![console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708185/f8f602df-6f52-8313-96ca-376b4280ddb0.png)

# 番外編：Laravelでの書き方
Laravelでは下記のように書くことができます。
```php
<script>
  const array1 = <?php echo json_encode($array) ?>;
  console.log(array1);

  const array2 = {!! json_encode($array) !!};
  console.log(array2);

  const array3 = @json($array);
  console.log(array3);
</script>
```
結果、三つともconsoleに表示されました。
![console2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708185/f1882425-9a46-226a-fc8b-c32b5e066670.png)
[Flutter]数字を三桁ごとにカンマ区切りで表示する


### import

    import 'package:intl/intl.dart';
### 3桁ごとにカンマ区切り


    final formatter = NumberFormat("#,###.0");
    var result = formatter.format(30000000);
    print(result); // 30,000,000

### 3桁区切り小数点2桁まで

    final formatter = NumberFormat("#,###.0#");
    var value = (50101214 / 10000);
    var result = formatter.format(value);
    print(result+'万円'); //5,010.1万円

### Stringの文字列を3桁ごとにカンマ区切り

      String Function(Match) mathFunc = (Match match) => '${match[1]},';
    RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))');
    String result = '30000円'.replaceAllMapped(reg, mathFunc);
    print('$result');//30,000円


別の記事を参考にしたんですが、Stringの文字列をカンマ区切りにして使うことができず、確認したら、引数が変わってたので、修正して使えるものに変更しました。

これをしばらく使うことがあるなと思ったので、自身の忘備録を兼ねて残します。

どなたかの参考になれば幸いです。
IntelliJ 2022 以降では Gemfile に RuboCop が無いと使えない

# IntelliJ の RuboCop 統合機能
IntelliJ には RuboCop との統合機能があり、 RuboCop 的にまずい部分をコードエディタ上にハイライトで表示してくれる。
https://pleiades.io/help/idea/robocop.html
> IntelliJ IDEA は RuboCop(英語) との統合をサポートしており、コードエディターなどで IDE 内でその違反を直すことができます。

IntelliJ 2021 までは、RuboCop が対象プロジェクトの Gemfile に記載されていなくても使用できたのだが、
IntelliJ 2022.1 くらいから、 Gemfile に記載していないと使用できなくなった。

# なんで使えなくなったの？
このあたりの経緯は YouTrack のこの issue を見るとなんとなくわかる。
[Rubocop should run on `bundler exec` if available](https://youtrack.jetbrains.com/issue/RUBY-26915/Rubocop-should-run-on-bundler-exec-if-available)

複数のバージョンの RuboCop がシステムにインストールされている場合、どのバージョンの RuboCop が使用されるのかが曖昧で、そのために問題が発生するケースがあったらしい。
そのため、RuboCop を使用する際は、常に `bundle exec rubocop` が実行できるように、  Gemfile に記載することが必須となった模様。

しかし、チームで開発しているプロジェクトの場合、チームやチームリーダーの意向で RuboCop が導入されていないが、個人的に RuboCop を使用したい、というケースは往々にしてあるのでは無いかと思う。(実際自分がそうなのだが)
また、 OSS プロジェクトの開発でも似たようなケースが発生することがある。
自分と同じ様に感じている人はいるようで、 [Rubocop doesn't work unless added into Gemfile](https://youtrack.jetbrains.com/issue/RUBY-29232/Rubocop-doesnt-work-unless-added-into-Gemfile) という issue が立てられているが、
State が As designed (仕様です) になっているので、受け入れるしか無さそうだ。

# どうするか
下の2つの案を思いついた。

1. IntelliJ 2021 に留まる
1. 諦めて各プロジェクトの Gemfile に RuboCop を記載する

しばらくは 案1 で凌いでいたが、やはりエンジニアたるもの、常に新しいバージョンを使用するべき、という考えから 案2 に移行した。

# Rubocop 関連 gem をまとめて Gemfile に記載する
自分は、本体の RuboCop 以外に、 extension の RuboCop Minitest や RuboCop Performance なども使っているので、それらの gem をいちいち全てのプロジェクトの Gemfile に書くのは少し面倒だと思ったので、一箇所にまとめて書いておいて、各プロジェクトの Gemfile からそれを読み込むようにした。
結局大したことはしていないが、多少は省力化できたと思う。

1. `Gemfile_rubocop` を用意する
    ```ruby:Gemfile_rubocop
    source 'https://rubygems.org'
    
    gem 'rubocop'
    gem 'rubocop-minitest'
    gem 'rubocop-performance'
    gem 'rubocop-rails'
    ```
    上記ファイルはホームディレクトリ配下など、わかりやすいところに置いておく。

1. 各プロジェクトの `Gemfile` の末尾で `eval_gemfile` する
    ```ruby:各プロジェクトのGemfile
    ...(truncated)...
    
    eval_gemfile File.expand_path('~/Gemfile_rubocop')
    ```

これで IntelliJ 2021 の頃と同じく RuboCop が使えるようになった。
こうすると `Gemfile_rubocop` に他の RuboCop extension を追加した場合も、全てのプロジェクトで使用できるという利点もある。

# 補足
なぜか IntelliJ の設定で RuboCop の Inspections が無効になっていたので、それのチェックを入れ直した。
(久々にこの設定をいじったので、どこにあるか探すのに少し手間取った。)
![inspections_0823114227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183718/18df0283-85f3-8b45-fa51-3e6129b4b0ef.png)
AWS-CDKで生成されるテンプレート上の論理ID(LogicalID)を自由に書き換える

## はじめに
AWS-CDKで生成されるCloudformationテンプレートは`<ユーザーが指定したID>A1B2C3`といった感じで末尾にランダムな文字列が付与される。
通常であれば問題ないが今回DeletionPolicyにRETAINを指定したDynamoDBを含んだStackを更新しようとしたところ、論理IDが変わって(`tableA1B2C3`→`tableX1Y2Z3`)別のDynamoDBのリソースとして認識された。
そのためすでにあるDynamoDBと名前が被っているのでエラーとなりStackが更新できなくなった。

## TL;DR
該当のStackを定義しているClassでallocateLogicalIdをオーバライドして独自実装する

## 実装例
大体はallocateLogicalIdやmakeUniqueId内の処理を丸コピしたもの
ちゃんと期待通りのものになっているかはデプロイ前にSynthコマンドで要確認

```typescript
import { CfnElement, RemovalPolicy, Stack, StackProps } from 'aws-cdk-lib'
import { Construct } from 'constructs'
import * as DynamoDB from 'aws-cdk-lib/aws-dynamodb'

export class TableStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props)

    new DynamoDB.Table(this, `table`, {
      tableName: `table`,
      partitionKey: { name: 'id', type: DynamoDB.AttributeType.STRING },
      billingMode: DynamoDB.BillingMode.PAY_PER_REQUEST,
      removalPolicy: RemovalPolicy.RETAIN
    })
  }
  // Class「Stack」から継承されたallocateLogicalIdメソッドを再定義
  protected allocateLogicalId(cfnElement: CfnElement): string {
    // allocateLogicalIdと同じ実装
    const scopes = cfnElement.node.scopes
    const stackIndex = scopes.indexOf(cfnElement.stack)
    const pathComponents = scopes
      .slice(stackIndex + 1)
      // .replaceからはmakeUniqueIdを参考
      .map((x) => x.node.id.replace(/[^A-Za-z0-9]|Resource/g, ''))
    return pathComponents.join('')
  }
}

```

## 参考
- [Stackのドキュメント](https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_core.Stack.html#protected-allocatewbrlogicalwbridcfnelement)
- [allocateLogicalIdの実装](https://github.com/aws/aws-cdk/blob/main/packages/%40aws-cdk/core/lib/stack.ts#L985)
- [makeUniqueIdの実装](https://github.com/aws/aws-cdk/blob/main/packages/%40aws-cdk/core/lib/private/uniqueid.ts#L32)
-カルマン フィルター

カルマン フィルターは、移動するターゲットを追跡し、その将来の値を予測するための再帰的な手法です。 魅力は、ノイズや統計エラーを無視することです。 代わりに、それらを予測計算に組み込みます。 カルマン フィルターはナビゲーションやエンジニアリングで長い間使用されてきましたが、資産管理にも非常に役立ちます。 カルマン フィルターは、すべての金融セクターの時系列データを分析するためによく使用されます。 カルマン フィルターは、トレーディングおよびテクニカル分析に存在するラグ テクニカル インジケーターの一部を削減する平滑化ツールです。 まだチャートを表示している場合、目標が可能な限りラグのない値動きを滑らかにすることである場合、カルマン フィルターが移動平均よりも優れていることがわかります。

![kalman.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812547/85351be8-e4c8-cd5e-b36b-abbc5ccab8d7.jpeg)

[-カルマン フィルター](https://www.altcointrading.net/scriptspotlight-kalman-filter-technical-analysis/)
ScriptableObject のコンストラクターいろいろ

`UnityEngine.ScriptableObject` のコンストラクターの扱いは厄介です。

`ScriptableObject` を継承しなきゃ良い話なんですが、とりあえず数値をインスペクターに表示したいときなんかには便利なんですよねぇ。

便利なんですが、引数無しのコンストラクターは制限したいので、どうにかしたいです。


👇 👇 👇


# 試した方法

`public class MyObject : ScriptableObject`


## `private`

`private MyObject() { }` であっても、`CreateInstance<T>()` によって `System.Reflection` 経由で実行されてしまいます。

残念。


## `new`

`static new T CreateInstance<T>() where T : MyObject` すると、、、


`ScriptableObject.CreateInstance<MyObject>()` が引き続き使えます。残念。




## `OnValidate()`


根本的な解決は不可能、無理矢理 `CreateInstance<T>()` が使われたか感知するしかなさそう。

でも `OnValidate()` は実行されるタイミングがちょっと謎。インスペクターで表示しなくても実行はされるがインスタンス直後じゃない。


```csharp
[SerializeField]
private bool _invalid = true;
void OnValidate()
{
    if (_invalid) throw new System.Exception("OnValidate()");
}

public static T Instantiate<T>(object requirement) where T : MyObject
{
    var so = CreateInstance<T>();
    // initialization
    so._invalid = false;
    return so;
}
```



--

`ScriptableObject` はコンストラクターの扱いだけ何とかしてくれれば便利なんですが、、、。

ScriptableObject を直に使うことはないから、Visual Studio 上で `ScriptableObject.CreateInstance` をエラーとして扱えたら便利そう、、、



以上です。お疲れ様でした。
コミットに対するSSH署名にGitHubが対応したそうなので設定してみた

先日参加したセキュリティキャンプ全国大会で[sigstore](https://www.sigstore.dev/)の紹介があり、gitのcommitに対して署名を行いました。ただ、開発中ということもあってか僕の環境ではうまくいかず、かといってGPG鍵を新しく作ると鍵管理が面倒で放置していました。そんな中Twitterを徘徊していたらGitHubがSSH署名に対応するようになったことを知ったので早速試してみました！！

https://github.blog/changelog/2022-08-23-ssh-commit-verification-now-supported/

https://twitter.com/reimei_dev/status/1562313372330512385

# 準備
macだとxcode経由でgitをインストールしていることがあり、その場合バージョンの関係でSSHで署名できないことがあるので、brew経由でインストールしていきます。
```
$ git --version
git version 2.32.1 (Apple Git-133)
```
▼ brew経由でgitをインストール
```
$ brew update
$ brew install git
$ echo 'export PATH=/usr/local/bin:$PATH' >> ~/.zshrc
$ source ~/.zshrc
$ git --version
git version 2.37.2
```

▼ 署名を確認できるようにするために[SSH鍵の登録ページ](https://github.com/settings/ssh/new)にアクセスして、鍵の名前、Key typeに `Signing Key`、公開鍵を設定
![スクリーンショット 2022-08-24 22.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680126/a31f188b-c113-21a8-b67f-636632b02515.png)



# 設定
▼ 署名に使用する鍵を管理
ファイル名や場所はどこでもいいのですが、今回は `~/.config/git/allowed_signers` に作ります
```
# ~/.config/git/allowed_signers
# コミットで使用するメールアドレス 公開鍵の中身
# ↓ 例)
hoge@example.local ssh-ed25519 AAAA.........
```
▼ 残りの設定等
```
$ ssh-add ~/.ssh/id_rsa
$ git config --global gpg.format ssh
$ git config --global user.signingKey '公開鍵の中身'
$ git config --global gpg.ssh.allowedSignersFile "$HOME/.config/git/allowed_signers"

# コミットする際に自動で署名を行うための設定
$ git config --global commit.gpgsign true

# テスト用のリポジトリでコミット&プッシュ
$ git commit -am "signature test"
$ git push
```

# 結果
プッシュしたリポジトリのコミット一覧を見てみると以下のように `Verified` の文字が表示されると思います。
![スクリーンショット 2022-08-24 22.07.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680126/a6099cdb-b2ea-9761-86d1-44f7611da209.png)


# 参考URL
http://calebhearth.com/sign-git-with-ssh

https://blog.dbrgn.ch/2021/11/16/git-ssh-signatures/
[SQLServer]テーブルの作成

#自分用のメモ

```sql:create_table.sql
--社員
CREATE TABLE employees (
    id         INT IDENTITY(10001,1) NOT NULL,
    name       VARCHAR(20) NOT NULL,
	mail       VARCHAR(20),
	created_at DATETIME NOT NULL DEFAULT GETDATE(),
	updated_at DATETIME,
	PRIMARY KEY(id)
);

--組織
CREATE TABLE organizations (
    id         INT IDENTITY(10001,1) NOT NULL,
    name       VARCHAR(20) NOT NULL,
	created_at DATETIME NOT NULL DEFAULT GETDATE(),
	updated_at DATETIME,
	PRIMARY KEY(id)
);

--所属
CREATE TABLE belongs_to (
    employee_id     INT NOT NULL REFERENCES employees (id),
	organization_id INT NOT NULL REFERENCES organizations (id),
	from_date       DATE NOT NULL DEFAULT GETDATE(),
	to_date         DATE NOT NULL DEFAULT '2050-12-31',
	created_at      DATETIME NOT NULL DEFAULT GETDATE(),
	updated_at      DATETIME,
	PRIMARY KEY(employee_id, organization_id, from_date)
);

```
【初心者が教える超入門】Pythonによるデータサイエンス③（最小値、最大値、標準偏差の算出）

# はじめに
こんにちは！
技術・プログラミング初心者のTim（てぃむ）です。
最近は、比較的時間に余裕のある「夏休み」を利用してデータサイエンスやweb3などのこれまで触れてこなかった分野の技術を学んでいます。
この「夏休み」を利用して、当ブログの記事もどんどん発信していこうと思います！


↓過去のデータサイエンス入門の記事はこちらから
第１回「[要素数、ユニーク数の確認](https://qiita.com/Tim_Beginner/items/a64a7e506842c2648e88)」
第２回「[合計値・代表値の算出](https://qiita.com/Tim_Beginner/items/526cde3a861c063da634)」



# 本題
第3弾の今回は、データ集計を行う際に必要な「合計値・代表値の算出」について書いていこうと思います！


データ分析を始める最初のステップである「基本統計量」の確認は大切です。
最小値や最大値を把握する事で、データに含まれる値の範囲をすることができ、また、極端に大きい数字など本来存在し得ないデータのエラーを見つけることができます。


# 最小値の算出
## df["カラム名"].min()
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["カラム名"].min()
print("商品の在庫数", df["在庫数"].min())
```
出力例
```python
商品の在庫数 7
```


# 最大値の算出
## df["カラム名"].max()
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["カラム名"].max()
print("商品の在庫数", df["在庫数"].max())
```
出力例
```python
商品の在庫数 15
```


# 範囲の算出
## データの範囲 = 最大値 - 最小値
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#最小値
min = df["在庫数"].min()
#最大値
max = df["在庫数"].max()

#データの範囲
print("在庫の変動幅", max - min)
```
出力例
```python
在庫の変動幅 8
```


# 標準偏差の算出
## df["カラム名"].std()
標準偏差は、「標準と言える範囲」を把握することにも有効です。
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["カラム名"].std()
print("年齢の標準偏差", df["年齢"].std())
```
出力例
```python
年齢の標準偏差 9.898
```
win10にVcXsrvをいれて、X Serverとして動かしたメモ

次回のインストールに困りそうなのでメモ

:::note info
環境情報
Ubuntu側
・Nipogi AM02 (AMD ATHLON U300, 8GB RAM)
・Ubuntu Desktop 22.04LTS
Windows側
・Windows10 21H2
:::
:::note warn
2022/08/24 時点の情報
:::

# VcXsrvをインストール

VcXsrvを[公式サイト  "https://sourceforge.net/projects/vcxsrv/"](https://sourceforge.net/projects/vcxsrv/) からDLしてインストール。
インストールオプションなどは、標準。

Xlaunchを起動。
* Display Setting
    * Multiple window
     * Display number　"-1"
* Client startup
    * Start a program
* Start program
    * Start program on remote computer
        - Remote program "xterm"
        - Password ""←空欄でOK
        - Connect to computer "xxx.xxx.xxx.xxx"←接続先コンピューターアドレス
        - Login as user "hogehoge"←ログイン先ユーザー名  
* Extra settings
    - [x] Clipboard
    - [x] Native opengl
    - [ ] Disable access control 
* Finish configuration
    * Save configuration にて、設定ファイルをセーブ     

保存した設定ファイルから、起動して接続

# 私の場合のエラー対策

初回起動時、以下のようにエラー
```
plink: unknown option "-ssh"
```

とりあえず。[ここ"Download PuTTY: latest release (0.77)"](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)から、plink.exe入手して
VcXsrvのインストールフォルダにある、plink.exeを上書き。
エラー解消。

---
再度、起動して接続
あとは、メッセージに従って、無事動作。
【Unity】OnDrag関数でピンチ処理を作る


# 実装

``` C#
using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class PinchControl : MonoBehaviour, IDragHandler, IBeginDragHandler
{
    public event Action<float> OnPinchDelta = delegate { };

    private float prePinchInterval = float.NegativeInfinity;

    public void OnBeginDrag(PointerEventData data)
    {
        prePinchInterval = float.NegativeInfinity;
    }

    public void OnDrag(PointerEventData data)
    {
        if (Input.touchCount < 2)
        {
            prePinchInterval = float.NegativeInfinity;
        }
        else
        {
            var interval = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
            if (float.IsInfinity(prePinchInterval)) prePinchInterval = interval;
            OnPinchDelta(interval / prePinchInterval);
            prePinchInterval = interval;
        }
    }
}
```

**OnDrag**関数で２つのタッチ座標から距離を取得し、前フレームとの差を使用します。

前フレームとの差はだいたい `0.9 ~ 1.1` になるので使うスクリプトで乗算しましょう。

# サンプル

``` C#
using UnityEngine;

public class Sample : MonoBehaviour
{
    [SerializeField] private PinchControl pinch;

    public void OnEnable()
    {
        pinch.OnPinchDelta += OnPinch;
    }

    public void OnDisable()
    {
        pinch.OnPinchDelta -= OnPinch;
    }

    private void OnPinch(float scale)
    {
        transform.localScale *= scale;
    }
}
```

モバイル端末にビルドして動作確認をすると、Raycastに反応するuGUIでピンチイン・ピンチアウトができるようになります。
未経験が読む「コンピュータシステムの理論と実装」#4

### はじめに
本記事は「コンピュータシステムの理論と実装」の勉強会の記録第4回となります。

3章まででハードウェアのパーツが完成し、5章でPCを完成させます。
4章ではその前準備として、低水準言語のプログラミングの理解をしていきます。

実装の部分についてはこれまでと同様、私が詰まった部分をヒントとして残していきます。

## プロジェクトの準備
今回からアセンブラとCPUエミュレータを使います。

アセンブラチュートリアル
https://www.nand2tetris.org/_files/ugd/44046b_759f4f811ad14e12ac45bc60dd679fa3.pdf
CPUエミュレータチュートリアル
https://www.nand2tetris.org/_files/ugd/44046b_f63aba2611944e82974c9c5d5a3821fe.pdf

アセンブラの起動とCPUエミュレータの起動
```
~/Desktop/nand2tetris/tools/Assembler.sh
~/Desktop/nand2tetris/tools/CPUEmulator.sh
```

## 実装方法とアドバイス
Multを例に話します。
1. 編集するのは.asmファイル
今まで通りprojects>04>multに編集するファイルがあります。
今回編集するのはmult.asmなので、エディターでmult.asmを編集します。
私は試しに4.2.1末尾のコードを模写しました。

2. CPUエミュレータで開き、実行する
このとき、AnimateオプションをProgram & data flowにしてみてください。
オプションの位置↓
![スクリーンショット 2022-08-24 10.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633406/82c50fc8-22db-e7b2-9e1a-ea1ebc2fbecd.png)

M,D,Aの動きが極めて分かりやすくなります。
![nand2tetris4animate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633406/c56552b8-1172-24b1-f933-30687a49f6ae.gif)

<b>逆に、テストはNo animationにしなければ膨大な時間がかかりますので、お気をつけて。</b>


# 4章実装のヒント
作る順序は本書通りMult, Fillにしました。

#### 各プログラムのヒント
※以下に答えは載せていません。あくまでヒントです。
※テストはNo animationにしなければ膨大な時間がかかりますので、お気をつけて。(2回目)
<details><summary>Mult</summary><div>
とにかくM,D,Aの動きを理解すること。それに尽きます。
Animateで動きをよく見て書いていくといいと思います。
</div></details>

<details><summary>Fill</summary><div>
チュートリアルや5章のプログラムを参考にしました。<br>
慣れないwhile文を書くことと、M,D,Aを使いこなすことが鍵です。<br>
"スクリーンの該当位置を真っ黒にするためには、メモリにどんな値を入れれば良いか"を知っておく必要があります。<br>
<details><summary>答え</summary><div>
-1
</div></details>

<details><summary>「黒くなるのにテストは通らない」という方へのヒント</summary><div>
もしかして：ずっと黒のままではないですか？
</div></details>
</div></details>

## 感想
低水準言語でのプログラミングは非常に時間がかかりました。
「Rubyならすぐなのに！」というもどかしさがありましたが、今自分が作っているコンピュータがどう動くのかを見られたのは非常におもしろかったです。

私事ですが、9月からエンジニアに転職することとなり、更新頻度は下がると思いますが、
どうぞよろしくお願いいたします。
Tableau　LOD計算の私の理解

# 一言でいうと？
Group Byを明示的に指定する計算のこと．

# LODとは？
私がTableauを初めて触ったときの感想は「勝手にグルーピングされて便利！」でした．
例えば，行に「地域」，列に「売上」を指定すればそれだけで，「地域」でグルーピングされた「売上」を表示してくれます．
ここの，「何でグルーピングするか」がまさしく**LOD**(**L**evel **O**f **D**etail)です．

# そもそもTableauの計算フィールドはどう制御されている？
何も指定しなければViz上に存在するディメンション(VizLOD)を用いて，計算がなされます．
VizLODに影響を与える場所は以下です．
- 行
- 列
- マーク

# どういうときにLOD計算が必要なの？
上記のVizLODとは異なる単位でグルーピングした結果が見たいときに必要です．
つまり，
- VizLODより多い要素でグルーピングがしたいとき(INCLUDE)
- VizLODより少ない要素でグルーピングがしたいとき(EXCLUDE)
- VizLODに存在しない要素で，もしくは独立したグルーピングがしたいとき(FIXED)

の3パターンです．
ReactでChakraUIのスタイルが効いていない

# はじめに

Chakraを利用してReact開発を行おうと導入したところつまずいたのでまとめます

# 問題

ChakraUIを導入したのですが、<Button>などを利用してもCSSが効いておらず、ボタンはでているもののシンプルなボタンしか表示されませんでした

# 解決方法

公式の[スタートページ](https://chakra-ui.com/getting-started)を読み飛ばしていました

```jsx:App.jsx
import * as React from 'react'

// 1. import `ChakraProvider` component
import { ChakraProvider } from '@chakra-ui/react'

function App() {
  // 2. Wrap ChakraProvider at the root of your app
  return (
    <ChakraProvider>
      <TheRestOfYourApplication />
    </ChakraProvider>
  )
}
```

`<ChakraProvider>`で利用するコンポーネントを囲む必要がありました
囲んでいないのでCSSが効いていないのは当然かなというところで凡ミスでした

# おわりに

なんとなくの記憶たどりの手順で導入をするとどこかのステップを忘れてしまうこと実感しました
調べても出てこなかったのでなかなか時間を取られました
React / ChakraUIで画像が読み込めない

# はじめに

ChakraUIを利用していて地味に時間がかかった個所だったのでまとめています
Reactでローカルの画像をページに表示したいときも同じ方法で解決できます

# 問題

`App.tsx`と同じ階層に`test.png`を用意して以下のようなコードを書きました

```tsx:App.tsx
<Box boxSize='sm'>
  <Image src='./test.png' alt='ローカルの画像' />
</Box>
```

これでローカルの画像が読み込めると思ったのですが読み込めませんでした

# 解決方法

ローカルの画像をインポートする必要がありました

```App.tsx
import img from "./test.png"

(省略)

<Box boxSize='sm'>
  <Image src='./test.png' alt='ローカルの画像' />
</Box>
```

これで読み込めるようになりました

# おわりに

Reactでローカル画像の読み込みをしたことがなかったのですがインポートが必要だったとは
調べてみてもChakraUIをいれてしまうとなかなか解決できなかったです
[SQLServer]テーブルの列情報を出力

#自分用のメモ

```sql:columnInfo.sql
select 
	 s.name+'.'+t.name AS TableName 
	,c.name            AS ColumnName 
	,d.name            AS DataType
	,c.max_length      AS Length
	,c.is_nullable     AS [Nullを許容]
from sys.tables t
join sys.schemas s on t.schema_id = s.schema_id
join sys.columns c on c.object_id = t.object_id
join sys.types   d on d.system_type_id = c.system_type_id
--対象テーブルの指定も可能
--where t.name      = 'tablename'
order by s.name, t.name, c.column_id;
```
chromedriver のダウンロードスクリプト（macOS, Linux）


# 概要

[Selenium](https://www.selenium.dev/ja/) などで Chrome を動かす際、[chromedriver](https://chromedriver.chromium.org/downloads) が必要になります。
ローカルにダウンロードすることが多いのでスクリプトとしてまとめました。

記事後ろにコメントとカスタマイズ可能な点を記載します。

# スクリプト

curl, unzip に依存あります。

```bash
#!/bin/bash -xe

SCRIPT_DIR=$(dirname "$0")
SCRIPT_DIR=$(cd "${SCRIPT_DIR}"; pwd)
cd "${SCRIPT_DIR}"

CHROME_DRIVER_VERSION=$(curl -s http://chromedriver.storage.googleapis.com/LATEST_RELEASE)
MAC64_FILE=chromedriver_mac64.zip
MAC64_URL="http://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VERSION}/${MAC64_FILE}"
LINUX64_FILE=chromedriver_linux64.zip
LINUX64_URL="http://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VERSION}/${LINUX64_FILE}"
DRIVER_BIN_FILE=./chromedriver

if [ "$(uname)" = "Darwin" ]; then
	CHROME_DRIVER_FILE=${MAC64_FILE}
	CHROME_DRIVER_URL=${MAC64_URL}
else
	CHROME_DRIVER_FILE=${LINUX64_FILE}
	CHROME_DRIVER_URL=${LINUX64_URL}
fi

echo $CHROME_DRIVER_FILE

rm -rf ${DRIVER_BIN_FILE}
curl -O -L "${CHROME_DRIVER_URL}"
unzip ${CHROME_DRIVER_FILE}
chmod u+x ${DRIVER_BIN_FILE}
rm ${CHROME_DRIVER_FILE}
```

# 各コメント

## 配置場所

```bash
SCRIPT_DIR=$(dirname "$0")
SCRIPT_DIR=$(cd "${SCRIPT_DIR}"; pwd)
cd "${SCRIPT_DIR}"
```

このスクリプトはファイルにして扱うことを前提にしています。コピペだけで実行するならこの行はいらないです。

スクリプトの存在する位置で作業するようにしています。別の位置にしたい場合は `cd` を書き換えてください。

シェルでの文字列の扱いは [ShellCheck](https://github.com/koalaman/shellcheck) を利用して気をつけています。

## chromedriver バージョンの指定

```bash
CHROME_DRIVER_VERSION=$(curl -s http://chromedriver.storage.googleapis.com/LATEST_RELEASE)
```

chromedriver の最新のバージョンコードを取得しています。最新とは言っても Chrome の Official Build の最新です。
LATEST_RELEASE_105 などにキーを変更することでバージョンを変えられます。キーは、 http://chromedriver.storage.googleapis.com のXMLを見て確認できます。

バージョンを固定したいなら直値にします。

```bash
$ curl -s http://chromedriver.storage.googleapis.com/LATEST_RELEASE
104.0.5112.79
$ curl -s http://chromedriver.storage.googleapis.com/LATEST_RELEASE_105
105.0.5195.19
```

## OSごとの差分吸収

```bash
MAC64_FILE=chromedriver_mac64.zip
MAC64_URL="http://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VERSION}/${MAC64_FILE}"
LINUX64_FILE=chromedriver_linux64.zip
LINUX64_URL="http://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VERSION}/${LINUX64_FILE}"
DRIVER_BIN_FILE=./chromedriver

if [ "$(uname)" = "Darwin" ]; then
	CHROME_DRIVER_FILE=${MAC64_FILE}
	CHROME_DRIVER_URL=${MAC64_URL}
else
	CHROME_DRIVER_FILE=${LINUX64_FILE}
	CHROME_DRIVER_URL=${LINUX64_URL}
fi
```

OSごとにファイル名がちがうので吸収しています。
URLには chromedriver のバージョンコードを含めています。

実行ファイル名はどちらも `chromedriver` で固定です。

## 実行部分

```bash
rm -rf ${DRIVER_BIN_FILE}
curl -O -L "${CHROME_DRIVER_URL}"
unzip ${CHROME_DRIVER_FILE}
chmod u+x ${DRIVER_BIN_FILE}
rm ${CHROME_DRIVER_FILE}
```

作業ディレクトリにて以下を行います。

- 古いものがあれば削除
  - `-rf` にすることでファイルがなくてもエラーにならない。雑でもいいときに使う。
- ダウンロード
  - リダイレクトするので `-L` を付けている。
- 展開
- 実行権限付与
- zip ファイル削除

実行後 `chromedriver` が利用できます。
PowerQuery: 乱数系関数を使う時も、遅延評価を意識しないと、乱数として使えなくなっているので注意

# 背景
会社にて、Number.Random() で乱数が生成出来ない。との発言有。
以前使った際は困った記憶がなかったので、現状での対応策の備忘録

# 対象関数
- [Number.Random()](https://docs.microsoft.com/ja-jp/powerquery-m/number-random)
- [Number.RandomBetween()](https://docs.microsoft.com/ja-jp/powerquery-m/number-randombetween)
- [List.Random()](https://docs.microsoft.com/ja-jp/powerquery-m/list-random)


# 概要
最適化によって、全行が同一値になってしまう。

詳細は以下記事が分かりやすいと思います。

https://qiita.com/PowerBIxyz/items/a7035202e7f4d9c6a472#%E9%81%85%E5%BB%B6%E8%A9%95%E4%BE%A1

# 対応策

[上の記事](https://qiita.com/PowerBIxyz/items/a7035202e7f4d9c6a472#%E9%81%85%E5%BB%B6%E8%A9%95%E4%BE%A1) にあるように、以下を対処する
> 行ごとの処理(Table.AddColumn)で再評価が行われるようにするにはどうしたらよいか。カレント行を参照すればよいのだ。

具体的には以下太文字のようにする

> = Table.AddColumn(変更された型, "Random", each **{ Number.Random(), _ }{ 0 }**)


# 参考
以下の記事をみても、昔は、特に問題なかった様子

https://qiita.com/tanuki_phoenix/items/d7f23350b582abdc77e1

# あとがき
ちゃんと勉強していかないとこういう時に困っちゃうけど、情報交換出来る仲間や相手がいると解決せず放置、にならなくてありがたいなぁと改めて思いました。
会社で如何に情報共有の仕組みを作るかって大切ですね。
UICollectionViewでドット絵表示（画像から読み込む）

![Xcode-13.1](https://img.shields.io/badge/Xcode-13.1-brightgreen) 

## はじめに
下記の記事で `UICollectionView` でドット絵を表示する方法を紹介したのですがやっぱりドット絵配列を作るのがめんどくさすぎるので今回は画像から読み込む方法をご紹介します。  
[UICollectionViewでドット絵表示](https://qiita.com/am10/items/490ed3563cd8dae18cb5)

こんな感じで表示します。

<img width="300" alt="ex" src="https://user-images.githubusercontent.com/34936885/186407614-56ceb69d-9dfc-48fc-8697-a34bf0ca2f31.gif"/>

## 画像読み込み
画像の読み込み方法はこんな感じです（たまにうまく読み込めない画像もあります）。

```swift
extension UIImage {

    func colorsData() -> [[UInt8]] {
        let pixelDataByteSize = 4
        let pixelData = self.cgImage!.dataProvider!.data
        let length = CFDataGetLength(pixelData)
        var rawData = [UInt8](repeating: 0, count: length)
        CFDataGetBytes(pixelData, CFRange(location: 0, length: length), &rawData)
        return rawData.chunked(by: pixelDataByteSize)
    }
}

extension Array {

    func chunked(by chunkSize: Int) -> [[Element]] {
        return stride(from: 0, to: self.count, by: chunkSize).map {
            Array(self[$0..<Swift.min($0 + chunkSize, self.count)])
        }
    }
}
```

画像の読み込み方法は下記の記事を参考にさせていただきました。

* [UIImage の画素データを Array で取得する方法](https://qiita.com/lovee/items/74c0310a50d1b752ceb8)
* [[Swift] 画像の特定のピクセルの色を調べる](https://qiita.com/ohkawa/items/71db370b5a6b75bae517)

配列の分割は下記を参考にしました。

* [sumitokamoi/Array+chunked.swift](https://gist.github.com/sumitokamoi/22b8f30c2c1a3ef93cb1f03d4a7e8066)

## ドット絵表示
今回使った画像はこちら。

|たけのこ|きのこ|
| --- | --- |
|![bambooshoot](https://user-images.githubusercontent.com/34936885/186407011-0ebfde4c-4e06-4a7b-b661-f7f3da72de42.png)|![mushroom](https://user-images.githubusercontent.com/34936885/186407037-279730ca-f3ae-424d-8376-68c23637e0cd.png)|

表示処理以外はほぼ[前回](https://qiita.com/am10/items/490ed3563cd8dae18cb5)と同じです。

```swift
// 型を[[UInt8]]に変更
private var dataList: [[UInt8]] = []
private var mushroom: [[UInt8]] = []
private var bambooshoot: [[UInt8]] = []

// データを画像から読み込み
mushroom = UIImage(named: "mushroom")!.colorsData()
bambooshoot = UIImage(named: "bambooshoot")!.colorsData()

// 表示処理修正
dataSource = UICollectionViewDiffableDataSource<Section, Int>(collectionView: collectionView) {
    (collectionView: UICollectionView, indexPath: IndexPath, item: Int) -> UICollectionViewCell? in
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
    let data = self.dataList[item]
    if data.isEmpty {
        cell.backgroundColor = .systemGreen
    } else {
        let r = CGFloat(data[0]) / 255
        let g = CGFloat(data[1]) / 255
        let b = CGFloat(data[2]) / 255
        let a = CGFloat(data[3]) / 255
        cell.backgroundColor = UIColor(red: r, green: g, blue: b, alpha: a)
    }
    return cell
}
```

## おわりに
これでより手軽に `UICollectionView` を使ってドット絵をシュバババと表示できるようになりました:v:

64×64 の画像でもやってみましたがリロード処理が重すぎてうまくアニメーションしなかったので 32×32 の画像がちょうどいいかもしれません。
aliasでコマンドを簡略化してみた

本日は、インターン先で習ったShellScriptのaliasを備忘録的に残します！
便利にターミナル使いたいぞ！っていう人やかっこよく使うぞ！という人は読んでみてください🔥

# 内容
1. aliasとは
1. ShellScriptにおけるalias
1. 使ってみよう！

# 1. aliasとは
`alias`とは、英語の意味では`偽名、別名、通称`といった意味を持つ単語です。
情報技術的には、ショートカットに類似した機能になります。例えば、command+Cは、実際にファイルをコピーする命令を使っているわけではないのに、クリップボードにコピーしてくれます。このように、命令を簡略化するような使い道で、aliasを使います🙌

# 2. ShellScriptにおけるalias
ShellScriptでは、以下のように記述して使用できます。
```zsh:~/.zshrc
# alias = "[コマンド]"
# 具体例:クラウドストレージBoxの「Box Drive」のディレクトリに移動するコマンド
alias box="cd /Users/yuuki/Library/CloudStorage/Box-Box"
```
これだけの内容を`.zshrc`に記述するだけで、`box`というコマンドで
`/Users/yuuki/Library/CloudStorage/Box-Box`に移動できる代物です！

## 操作の比較
通常の操作では、`cd`を入力して、階層まで全部打ち込むか
ドラッグ＆ドロップをする必要があります。
階層まで打ち込む場合は、
文字列数:**`44`**
0.2sで1文字タイピングできたとして、8.8秒かかりますが
`box`のみであれば、**0.6s**で終わりますね⭐️

ドラッグ＆ドロップの場合、あらかじめBoxまでの階層を
Finderで開く必要があります。
ユーザ名のルートディレクトリから移動するとして
クリック数：**`4`**
待機時間：**0.4s**（１回あたり0.1sと仮定）
ここから、ドラッグ＆ドロップをするので、流石に0.6sには勝てませんね😅

# 3.  使ってみよう！
そんな素晴らしいaliasを実際に使ってみましょう！
aliasの始め方
```zsh:ターミナル
# 「alias cdDtp="cd Desktop"」を .zshrcに書き込む
echo 'alias cdDtp="cd Desktop"' >> ~/.zshrc
# zshrcの設定を反映させる
source ~/.zshrc
```
上記のコマンドに対して、解説します！
1. `echo`コマンド
1. 今回設定した`alias`
1. `>>`の意味

## 1. echoコマンド
`echo`コマンドは、UNIX系ではよく知られるコマンドで、ターミナルにechoの次に記述した文字列を返したり、`echo $PATH`などのように、OSの環境変数を確認したりするために使います。

## 2. 今回設定したalias
今回設定したものは、`alias cdDtp="cd Desktop"`ですが、
デスクトップディレクトリに移動するといったものです。
他のコマンドなどの簡略化にも活用できますので、ここは今後のカスタマイズ次第です🔥

## 3. >>の意味
`>>`は、リダイレクトと言って、出力先を指定するために使います。
今回は、`~/.zshrc`に書き込みたいので、指定しました。
（他にも入力先を指定するリダイレクトや、関連の知識として、パイプもあるので
興味がある方は調べてみてください🌸）

# 最後に
上記の手順で簡単にaliasを作成できるのではないでしょうか！
UNIX系のコマンドを使えば、OS標準のファイル管理アプリよりも
速く操作ができて時短なので、興味がある方は勉強してみてくださいね✨

それでは！

# 参考文献

https://e-words.jp/w/%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9.html

https://eng-entrance.com/linux-redirect#i-4
figmaで便利なプラグイン

***Figmaで簡単にテキストや図形を斜めに変形する方法***
https://www.figma.com/community/plugin/741472919529947576/SkewDat

![スクリーンショット 2022-08-24 20.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514867/2e09f07c-4cc1-baa2-8036-531f6f41a0f5.png)

***
親クラスはinstanceofでtrueになるよね？を確かめた話

## 概要

- 親クラスを継承した子クラスをインスタンス化したオブジェクトを`小クラスのインスタンス変数 instanceof 親クラス`としたときにtrueになるよね！？を実際に実行して確認した。

## 確認

- 当たり前のことを確認するためにめっちゃ単純なコードを書いてみた。

```php
<?php
class A {
    public string $str_a = 'a';
}

class B extends A {
    public string $str_b = 'b';
}

$b = new B();

var_dump($b instanceof A);
```

- 上記を実行したら`bool(true)`が返された。もちろん当たり前である。それが継承なのだから。
- ただちょっと確認のために実行してみた。

## 参考文献

- [https://www.php.net/manual/ja/language.oop5.inheritance.php](https://www.php.net/manual/ja/language.oop5.inheritance.php)
WHOIS ってなに？

## 勉強前イメージ

たまにチェックで見るけど、なんのためにあるんだろう・・・

## 調査

### WHOIS とは

ドメインやIPアドレスの登録に関する情報を検索するサービスになります。
WHOIS情報の目的としては以下が挙げられます。

- 同一のドメインや類似のドメインがないか確認できるようにする
- 技術的な問題が発生した際に連絡できるようにする
- 商標に関するトラブルが発生した際に本人同士で解決できるようにする

WHOISで公開されている情報は、 [レジストリ・レジストラ](https://qiita.com/miyuki_samitani/items/ac8bf32554872a701735) が提供しています。

WHOISで見れる情報は登録ドメイン名や登録年数、有効期限などを見ることができます。
個人情報が含まれるので、正しい利用方法以外は許可されていません。

WHOIS情報は一定情報を提供することが義務付けされています。
変更が発生すると更新する必要があります。
変更はレジストラやリセラーで変更が必要です。

### WHOIS情報を検索してみる

- whoisコマンドのインストール

```
yum install whois
```

- 検索

```
whois yahoo.co.jp
==========
[root@localhost ~]# whois yahoo.co.jp
....

Domain Information: [ドメイン情報]
a. [ドメイン名]                 YAHOO.CO.JP
e. [そしきめい]                 やふーかぶしきがいしゃ
f. [組織名]                     ヤフー株式会社
g. [Organization]               Yahoo Japan Corporation
k. [組織種別]                   株式会社
l. [Organization Type]          Corporation
m. [登録担当者]                 HT46858JP
n. [技術連絡担当者]             KM56800JP
p. [ネームサーバ]               ns01.yahoo.co.jp
p. [ネームサーバ]               ns02.yahoo.co.jp
p. [ネームサーバ]               ns11.yahoo.co.jp
p. [ネームサーバ]               ns12.yahoo.co.jp
s. [署名鍵]                     
[状態]                          Connected (2022/09/30)
[登録年月日]                    2019/09/27
[接続年月日]                    2019/09/27
[最終更新]                      2021/10/01 01:02:14 (JST)
==========
```

## 勉強後イメージ

何であるんかなって思ってたけど、基本的にはトラブル解決のためなのか・・・・・

## 参考

- [WHOISとは](https://www.nic.ad.jp/ja/whois/)
- [WHOIS（フーイズ）とは？概要や注意点なども解説します](https://jetb.co.jp/12237)
Guacamole経由でWindows Serverとのファイル受け渡しを実現する

## やりたいこと
Guacamole経由で接続したWindows Serverへのファイルの受け渡し（アップロード/ダウンロード）

## 前提
- Guacamole経由でWindows ServerにRDP接続できること

## 実行環境
GuacamoleとRDP接続先がWindowsであればヨシ!ですが参考までに。
- Guacamole-VM
  - Ubuntu 20.04
  - Docker上に構築
- Windows Server
  - 2019 DC
  - 10.0.0.10

## Windows Server側の設定
管理者アカウントで、Windows ServerにOpenSSHのクライアント／サーバ両方インストール・設定します
手順は、以下を参考にPoserShellでおこないます
[PowerShell を使用して OpenSSH をインストールする](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse#install-openssh-using-powershell)

設定後の接続確認をしたら次に進みます
私の場合は、以下のようになります
- `ssh aki-nasu@10.0.0.10`

## Guacamole側の設定
- Windows Serverの設定を開いて、SFTPの設定を次のようにします
  - SFTPの有効化: チェックを付ける
  - ユーザー名: `<Windows Serverのアカウント>`
  - パスワード: `<Windows Serverのアカウントパスワード>`
    ![](https://i.imgur.com/Ck1CTD1.png)

## GuacamoleからWindows Serverに接続する
ファイルのアップロード・ダウンロードができるか確認します

- Windows Serverに接続する
  - 接続したまま設定変更をした場合は、一度切断して再接続してください
  - 接続エラーになる場合は、設定したアカウント・パスワードに誤りがある可能性があります
- Ctrl+Shit+Altメニューに、デバイスが追加されています
  ![](https://i.imgur.com/1wqroDX.png)
- 「ファイルアップロード」でWindows Serverにファイルをアップロードします
- ファイルをダブルクリックすると、自端末にファイルをダウンロードします
  ![](https://i.imgur.com/yaABGeb.png)

## おわりに
Windows ServerへのRDP接続の場合はこのようにひと手間必要ですが、
LinuxへのSSH接続の場合は、Guacamoleのサーバ設定画面でSFTPの有効化にチェックをつけるだけでファイルの受け渡しができるようになります
RPGツクールMZのセルフスイッチはどれぐらいの容量を消費するのか。

タイトル通りです。備忘録です。
結論だけ言うと20万個ほどセルフスイッチを保存しても0.02KB程度でした。
これは無視できるほどの小ささです。

別のプラグインを作る最中にビット演算で圧縮する処理があったのでセルフスイッチへ応用できるか検討したのですが、ここまで容量が小さいなら不要です。
メモリの断片化 とは

## 勉強前イメージ

断片化？？

## 調査

### メモリの断片化 とは

断片化はフラグメーションともいいますが、メモリの管理上単位が小さく分割されてしまって
有効活用できない状態を指します。
イメージとしては以下になります。

![12022-08-24 # メモリの断片化 とは - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a06af5f3-69e1-dbb7-5144-dc0d62dd47d2.png)


上記のように5MBと7MBが開放されたので10MBのプログラムは計算上稼働できるのですが
空き容量がバラバラになっているため、プログラムEはロードできない状態になっています。
この状態を `断片化` と言います。

### 断片化を解消する

この断片化を解消させるには `メモリコンパクション`  という手法があります。
これは分割しているプログラムを再配置して空き容量を一つにします。

イメージとしては以下のように再配置することで12MB確保できるので
10MB必要なプログラムをロードできるようになります。

![22022-08-24 # メモリの断片化 とは - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/669b5390-1adf-2242-1cf4-f3e3c7b44310.png)

## 勉強後イメージ

バラバラに空きがあるから大きなものは入れないのか・・・

## 参考

- [メモリコンパクションとは](https://medium-company.com/%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/)
- [フラグメンテーション 【fragmentation】 フラグメント / fragment](https://e-words.jp/w/%E3%83%95%E3%83%A9%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html)