OmniAICreator/Qiita-1.07M huggingface dataset:
[python] Excelの散布図グラフを作成する

# はじめに
グラフの作成は範囲の指定だったり、タイトルの追加だったり、単純作業として時間がかかってしまう。
私の会社では古い機械で測定をすることが多く、エクセルのフォーマットが複雑で`pandas`で扱いにくい場合が多い。
`openpyxl`を用いて`.xlsx`のグラフの作成を自動化することを目標とする。

# 環境
python 3.7.8
window 10

# Data
![スクリーンショット 2022-09-18 235948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/aa07349d-edb4-7835-1bc8-03ef39b578b8.png)
自分が会社で扱うデータを再現したエクセルでデータ同士が離れている。（実際はもっと複雑で前処理が必要）



# Code


### ファイルの開いてシートを選ぶ
```python
import openpyxl

file_path = './excel_file.xlsx'

## .xlsxの場合
wb = openpyxl.load_workbook(file_path)
##  xlsmの場合
wb = openpyxl.load_workbook(file_path , keep_vba=True)


## 名前でシートを指定
ws = wb['Sheet1']
## indexでシートを指定
ws = wb.worksheets[0]
```


### グラフ生成およびタイトルの指定
```python
# create a graph
chart = openpyxl.chart.ScatterChart('marker')

# data titles
chart.title = 'Rheometer'
chart.x_axis.title = 'Time'
chart.y_axis.title = 'torque'
```

### グラフにデータを追加
x軸は`data`、y軸は`time`としてデータを追加した。
また、散布図を目標とするので、`series.graphicalProperties.line.noFill = True`とする。


```python
# add series
print('adding serials')
for i in range(2):

    #titleを含む範囲
    data = openpyxl.chart.Reference(ws, min_col=4 + i*2 , min_row=2, max_row=22)

    #titleを含まない範囲
    time = openpyxl.chart.Reference(ws, min_col=2, min_row=3, max_row=22)

    series = openpyxl.chart.Series(data, time, title_from_data=True)
    series.graphicalProperties.line.noFill = True
    series.marker.symbol = "circle"

    chart.series.append(series)
```

### 範囲指定とファイル保存

```python
# 値の範囲を指定
chart.y_axis.scaling.min = 0
chart.y_axis.scaling.max = 10

chart.x_axis.scaling.min = 0
chart.x_axis.scaling.max = 20

# このセルに貼り付け
ws.add_chart(chart, 'B8')

wb.save('./excel_file isDone.xlsx')
```

# 結果


![スクリーンショット 2022-09-19 001101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/75c16207-50a6-7946-5e8f-0634bffdd406.png)


# まとめ
グラフ作成は以下の手順で行われる。
ファイル読み込み → グラフ作成 → データ追加 → 保存



https://openpyxl.readthedocs.io/en/stable/charts/introduction.html
PySpark で パーティショニングされた parquet ファイルを扱う

データの読み込み

```python
path = "gs://bucket/table/year=*/month=*/day=*/location=*/*.parquet"
base_path = "gs://bucket/table/"

df = spark.read.option("basePath", base_path).parquet(path)
```

ちょっとデータ見たり、件数確認したり。

```python
df.head()
df.count()
```

スキーマの確認

```python
df.printSchema()
```

カラムの追加

```python
from pyspark.sql.functions import *
df_new = df.withColumn('timestamp', from_unixtime('ts_unix'))
```

書き出し

```
path = "gs://bucket/table/"
df.write.option("compression", "snappy").partitionBy("partition_col1","partition_col2").parquet(path)
```
shopify-api-ruby の ShopifyAPI::ResourceName.all でデータを全件取得する方法

## 背景

- Shopify の 公式 Ruby 用 API クライアント「[shopify-api-ruby](https://github.com/Shopify/shopify-api-ruby)」を使って Shopify 各リソースのデータを全件取得したい。
- `ShopifyAPI::ResourceName::all` を実行しても一部データしか取得できなかった。

```ruby
# 例） 商品データを全件取得したい
products = ShopifyAPI::Product.all
products.size

=> 50
```

## 原因

どうやら、`all` メソッドで取得できるのは最初の50件までみたいです。（おそらく裏側で limit 句みたいなものが働いている？）

## 対策

`fetch_next_page` メソッドを使う事で次の50件が取得できました。

```ruby
products.fetch_next_page
```

また、次のデータが存在するかどうかは `next_page?` メソッドで確認できます。

```ruby
products.next_page?
=> true
```

したがって、全てのデータを取得したい場合、次のようなコードでいけるはず。

```ruby
product_aray = []

products = ShopifyAPI::Product.all
product_array.concat(products)

while products.next_page?
  products = products.fetch_next_page
  product_array.concat(products)

  sleep 1
end

product_aray.size
=> 2500
```

## まとめ

以上、shopify-api-ruby の ShopifyAPI::ResourceName.all メソッドでデータを全件取得する方法でした。
とりま何か公開してぇならChrome拡張もええんでない？

# はじめに
タイトル生意気ですみません。とりあえずタイトルで目を引こうという魂胆です。
ただ、サービスを取りえず公開したいという場合にChrome拡張の開発という選択肢もありですよ、という話です。

# そもそもChrome拡張機能ってなんぞ？
Qiita見ている人で知らない人はほとんどいないと思われますが、一言で説明すると「Chorme上のサービスを強化・向上させる機能を提供するプログラム」といったところです。
有名どころだと、広告をブロックしてくれる「AdBlock」や動画翻訳の「Language Reactor」などがありますよね。

https://chrome.google.com/webstore/detail/adblock-%E2%80%94-best-ad-blocker/gighmmpiobklfepjocnamgkkbiglidom

https://chrome.google.com/webstore/detail/language-reactor/hoombieeljmmljlkjmnheibnpciblicm

# どうやって作る？？
作り方については、文章下手な私が説明するより以下を参照してもらった方が早いのですが、ざっくり言うと「JavaScriptとmanifest.jsonを書くだけ」で簡易な拡張機能なら作成することができます。
詳しくは以下を参照くださいませ。

https://qiita.com/punkshiraishi/items/5eca74202f6445025650

https://www.tohoho-web.com/ex/chrome_extension.html

# Chrome拡張開発のなにがええん？
ほんでChrome拡張開発のなにがええんや。という話ですが、一番は公開のハードルが低いことだと思っています。
ウェブサービスの開発だと、機能実現まではできていても「世に公開するぞ！」となった時、ホスティングやインフラ辺りでもう一山超える必要が出てきます。
もちろん超えるべき課題ではあるのですが、「とりあえずサービスを世に送りだしたい」「公開した実績が欲しい」といった場合にはかなりありな選択肢だと個人的には思っています。

# で。どうやって公開するん？
とても簡単。以下の手順を踏むんでChromeウェブストアに公開するだけ。

１. デベロッパー ダッシュボードに登録する。

https://developers-jp.googleblog.com/2020/04/chrome.html

一応登録料がかかるのですが、１度きり約５００円のお支払いでずっと公開し続けることができます。かなり良心的です。

https://developer.chrome.com/docs/webstore/register/

２. 作成したフォルダをZipに変換する。
アップロード時にZipファイルしか選択できないため必須です。

３．アップロードの準備
ダッシュボードへ移動し`+新しいアイテム`⇒先ほど圧縮したのZipファイルを選択。
![qiita.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838672/74025ea0-2a35-4cf0-6254-00fbb5f61181.png)
後は、公開情報やらプライバシーへの取り組みやらの必須項目に入力をしていき、`下書き保存`⇒`審査のため送信`を選択すればOKです。
ここで色々警告が出てくるかもしれませんが、身構えず一つ一つ対応していけば問題ありません。
早ければ１日以内には公開されています。やったね。

## 作ったもの

ちなみに私自身が作成した公開したもの。

https://chrome.google.com/webstore/detail/create-groups-in-netflix/bicnagkkmhehedgogcopdadkakldblfk

Netflixの拡張機能で、映画やドラマを自分で作成したグループに分類し、サイドバーで確認できるといったものです。個人的には割と使いやすいと思っているので良ければ使っていただけると幸いです！

# 参考
- [はじめての Chrome 拡張 最小構成ハンズオン](https://qiita.com/punkshiraishi/items/5eca74202f6445025650)
- [とほほのChrome拡張機能開発入門](https://www.tohoho-web.com/ex/chrome_extension.html)
GCP Cloud Spanner をローカル環境で動かすための手順

## ゴール

- Cloud Spanerをローカル環境で立ち上て操作する

### 前提

- MacOS
- [Docker Desctop](https://www.docker.com/)をインストール済み
- [gcloud ツール](https://cloud.google.com/sdk/gcloud?hl=ja)をインストール済み

### 準備

gcloudツールの設定にCloud Spannerエミュレータ用の設定を追加する．

```bash
gcloud config configurations create emulator
gcloud config set project test-project
gcloud config set auth/disable_credentials true
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
```

### Cloud Spanner エミュレータサーバーの初期化

#### エミュレータサーバーの起動

gcloudツールからエミュレータを立ち上げる（別タブでの実行を推奨）
※ DockerDesctopの起動が必要です．

```bash
gcloud emulators spanner start
```

以下の表示がされれば起動に成功しています．
```
[cloud-spanner-emulator] 2022/09/18 15:26:06 gateway.go:140: Cloud Spanner emulator running.
[cloud-spanner-emulator] 2022/09/18 15:26:06 gateway.go:141: REST server listening at 0.0.0.0:9020
[cloud-spanner-emulator] 2022/09/18 15:26:06 gateway.go:142: gRPC server listening at 0.0.0.0:9010
```

この時点でサーバーは起動しているもののインスタンスとデータベースはまだ作成されていません．

#### インスタンスの作成

以下のコマンドでインスタンスを作成します．
（例では test-instance という名前で作られます）

```bash
gcloud spanner instances create test-instance \
         --config=emulator-config --description="Test Instance" --nodes=1
```

#### データベースの作成

gcloudツールを使う場合は以下のようなコマンドを入力します．
作成時にDDLを適用するなどの詳細な使い方は公式の[データベースの作成](https://cloud.google.com/spanner/docs/create-manage-databases?hl=ja#gcloud)に紹介されています．

```bash
gcloud spanner databases create your-database-name --instance=test-instance
```

### エミュレータサーバーへの手動アクセス

#### spanner-cliを利用する

mysqlなどの一般的なcliライクで接続したい場合は[spanner-cli](https://github.com/cloudspannerecosystem/spanner-cli)を使うことを検討するかもしれません．
初期化プロセスで設定したインスタンス名とデータベース名を読み替えて以下のコマンドでアクセスできます．

```bash
spanner-cli -p test-project -i test-instance -d test-database
```

#### IntelliJ IDEAと統合する

データベースを開く

<img width="300" alt="e1be7ce0-e3ad-f4bc-cdbf-65643986ec59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/e1be7ce0-e3ad-f4bc-cdbf-65643986ec59.png">

設定の追加をクリック

<img width="300" alt="7e807dfd-065f-17ae-b404-f992207da82e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/7e807dfd-065f-17ae-b404-f992207da82e.png">

データソース → その他 → Google Cloud Spanner を選択

<img width="300" alt="06841646-231f-221e-1720-ac39aaa8e78b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/06841646-231f-221e-1720-ac39aaa8e78b.png">

↓の赤字を修正． URLの末尾に `?autoConfigEmulator=true` を追記して，接続のテストがパスすることを確認する．
※ プロジェクト〜データベース名は自分の環境に合わせて修正すること．

<img width="700" alt="464e65bd-fdbf-e8d8-b984-0997dcdfdc48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/464e65bd-fdbf-e8d8-b984-0997dcdfdc48.png">

### アプリケーションとエミュレータサーバーの接続

GCPのCloud Spannerライブラリにはアプリ起動時にエミュレータ用の環境変数を読み込む処理があります．
その環境変数が設定されている場合，通常のエンドポイントではなく環境変数先のエンドポイントに接続が切り替わります．

以下の環境変数が設定された環境でアプリを起動するとエミュレータサーバーに接続されます．

```bash
export SPANNER_EMULATOR_HOST=localhost:9010
```

以上となります．
お読みいただきありがとうございました．
【AWS】Lambdaコンテナイメージ利用に対する覚え書き


## はじめに

機械学習用のライブラリを利用したAPIをLambdaで構築しようとした場合など、
デプロイパッケージサイズ制限（250MB）により利用できないケースがあります。

その場合の対応方法としてコンテナイメージをLambdaで利用できるようになっていますが、
実際にLambdaコンテナイメージを使って構築/動作確認するまでに結構ハマったところがあるのでdockerfile作成からAmazon ECRへのプッシュまでを本記事にまとめます。同じくハマっているひとの参考になればと。

※リポジトリの作成等の操作はSKIPしています

***

## 環境

    Windows 10 Pro (WSL2を利用)
    Docker v20.10.17

## 目次

1. dockerfileを用意する（例としてPythonが動作するコンテナを作成）
2. dockerでコンテナを作成する
3. 作成したコンテナをAmazon ECRにプッシュする
4. ハマったところ

### 1. dockerfileを用意する

```dockerfile:dockerfile
# Define function directory
ARG FUNCTION_DIR="/function"

FROM python as build-image

USER root

# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Create function directory
RUN mkdir -p ${FUNCTION_DIR}

# Copy function code
COPY app.py ${FUNCTION_DIR}
COPY aws-lambda-rie ${FUNCTION_DIR}

# Install the runtime interface client
COPY requirements.txt  /
RUN pip install --upgrade pip && \  
    pip install awslambdaric && \
    pip install --target ${FUNCTION_DIR} --no-cache-dir -r requirements.txt 

# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# (optional) for TEST
COPY aws-lambda-rie /usr/bin/
RUN chmod 755 /usr/bin/aws-lambda-rie

ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "app.lambda_handler" ]
```

### 2. dockerでコンテナを作成する

#### コンテナの作成

```
docker build -t serverless-function:latest .
```

#### デバッグ作業用に立ち上げ

```
docker run  -p 9000:8080 --entrypoint /usr/bin/aws-lambda-rie  --name serverless  --rm serverless-function:latest  /usr/local/bin/python -m awslambdaric app.lambda_handler
```

### 3. 作成したコンテナをAmazon ECRにアップロードする

#### Amazon Elastic Container Registry　に接続するための認証を実施

```
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {Amazon ECRのリポジトリURI}.dkr.ecr.ap-northeast-1.amazonaws.com
```

#### コンテナの一覧を表示

```
docker images
```

#### dockerコンテナのタグ名称をAmazon Elastic Container Registry用に変更

```
docker tag {docker imagesで確認したIMAGE ID} {Amazon ECRのリポジトリURI}.dkr.ecr.ap-northeast-1.amazonaws.com/{Amazon ECRのリポジトリ名}
```

#### Amazon Elastic Container Registryにpushする

```
docker push {Amazon ECRのリポジトリURI}.dkr.ecr.ap-northeast-1.amazonaws.com/{Amazon ECRのリポジトリ名}
```

### 4. ハマったところ

- [ERROR] ValueError: Could not reserve memory block

    関数が起動せず、メモリ不足のErrorがCloudWatchで確認できた。AWS初心者のため、ソースコード側でswapファイルを作成したりしていたが解決せず。最終的にはLambda側の設定で利用メモリ設定を大きくすることで解消できた。

- [ERROR] OperationalError: (sqlite3.OperationalError) unable to open database file

    関数が起動せず、機械学習用のデータベースが開けない旨のErrorがCloudWatchで確認できた。コンテナにDBファイルをあらかじめ用意しておいても同様のErrorが発生する。最終的にはLambda処理内では/tmp配下のみ書き込み可能との記載を発見し、データベースファイルを/tmpに格納することで正常動作を確認できた。

## 振り返り

詰まったときはAWSの公式ドキュメントをまず確認すべきだったなと。。今回初めてAWSを触ってみましたがドキュメントや機能の充実を実感しました。構築したAPIを外部公開するまでがスムーズにできるので、今後も様々な場面で活用できそうです。
Git CheatSheet

# はじめに
忘れがちなgitコマンドの備忘録です。
都度、メモしていこうかと思います。
誰かのお役に立てれば幸いです。

# コマンド
リモートブランチ一覧を表示
```terminal
git branch -r
```

リモートブランチをフェッチ
```terminal
git checkout -b develop origin/develop
```

ブランチを新規作成して切り替える
```terminal
git switch -c ブランチ名
```

編集内容を取り消す
```terminal
# ステージングエリアから下ろす
git restore --staged ファイル名
# ワーキングツリーの変更を直前のコミットまで戻す
git restore ファイル名
```

未コミットの変更をすべて破棄する。
```terminal
# 追跡されているファイルはすべて編集前の状態 （HEAD）に戻る。
git reset --hard
```

直前のコミットに含め忘れた変更を追加
```terminal
git commit --amend
# コミットメッセージを変更しない場合は以下
git commit --amend --no-edit
```

マージしていないブランチを表示
```terminal
git branch --no-merged
```

ローカルからリモートのブランチを削除
```terminal
git push --delete <branch>
```

リモートで削除されたブランチのローカル参照を削除する
```terminal
git fetch --prune
```

巨大なリポジトリを高速でクローンする
```terminal
# 最新の指定コミット分を取得
git clone --depth=コミット数
```

コンフリクト時に片方を適用する
```terminal
# 今いるブランチの変更を適用する
git checkout --ours ファイル名
# マージ先のブランチの変更を適用する
git checkout --theirs ファイル名
```

別のブランチのファイルを参照する
```terminal
git show ブランチ名:ファイル名
```

シンプルなログを見る
```terminal
git shortlog
```

# ワーキングツリー/ステージングエリア/レポジトリ/リモートレポジトリ
![スクリーンショット 2022-09-19 1.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239825/4c5cd2ab-322a-b090-c689-d7f9b4b8f2ea.png)


# 参考
Git コマンドリファレンス（日本語版）：
[https://tracpath.com/docs/](https://tracpath.com/docs/)
pandasで同じコラムで結合(左右どっちかを優先)

<h1>Memo</h1>
こちらの記事はメモとして、記載しました。

内容はとても簡単であり、pandasのドキュメントに書いてあることを書いただけです。
<b>[pandasのドキュメント]</b>
https://note.nkmk.me/python-pandas-merge-join/


<h2>code</h2>

```python

import pandas as pd

df_left = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3'], 'b': ['b_1', 'b_2', 'b_3']})
df_right = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4'], 'c': ['c_1', 'c_2', 'c_4']})

print(df_left)
#      a    b
# 0  a_1  b_1
# 1  a_2  b_2
# 2  a_3  b_3

print(df_right)
#      a    c
# 0  a_1  c_1
# 1  a_2  c_2
# 2  a_4  c_4

"""
Key:1
howをleft又はrightとして因数に指定する場合
"""
pd.merge(df_left, df_rifht, on='a', how='left')

print(pd.merge(df_left, df_right, on='a', how='left'))
#      a    b    c
# 0  a_1  b_1  c_1
# 1  a_2  b_2  c_2
# 2  a_3  b_3  NaN

"""
Key:2
howをleft又はrightとして因数に指定しない場合
デフォルトは、howはinnerに指定されている。
"""
pd.merge(df_left, df_right, on='a')

print(pd.merge(df_left, df_right, on='a'))
#      a    b    c
# 0  a_1  b_1  c_1
# 1  a_2  b_2  c_2

```

<h2>解説</h2>
コード内にある<b>Key1</b>では、how="left"に指定しています。

その結果、mergeで左側に指定しているデータフレーム(df_left)のデータを全て結合します。
df_rightはdf_right[df_right["a"] = Noneであるため、結合したデータフレームの二行目はNaNとなっています。

<b>Key2</b>では、howはデフォルトのinnerに指定されています。

その結果、二つのデータフレーム(df_left, df_right)の共通コラム("a")に対して、同じ値をとる行のみを結合しています。
python で別のアプリのウィンドウハンドルを取得

何かしら windows の作業を自動化をするときは、特定のアプリのウィンドウだけ扱うことが少なくない。ウィンドウ操作について最小限のコードをメモしておく。

---

方法2つ記載する
・外部アプリを開始してそのウィンドウハンドルを取得
・既に起動しているアプリのウィンドウハンドルを取得

( 「# %%」の行は jupyter notebook 形式のセル区切りに相当します)

```py:window_test
# %%
import subprocess
import time
import pyautogui

import win32gui
import win32con
import win32process

# %%
# プロセスIDからウィンドウハンドルを取得する関数
def get_hwnds_from_pid(pid):
    def callback(hwnd, hwnds):
        if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
            _, found_pid = win32process.GetWindowThreadProcessId(hwnd)
            if found_pid == pid:
                hwnds.append(hwnd)
        return True

    hwnds = []
    win32gui.EnumWindows(callback, hwnds)
    return hwnds


# %%
# メモ帳を実行＆ウィンドウハンドル取得する例
process = subprocess.Popen([r"notepad.exe"])
time.sleep (0.1)
hwnds = get_hwnds_from_pid(process.pid)
print(hwnds[0])
# 1638968

# %%
# 既に開いているメモ帳のウィンドウハンドル取得する例
hwnd = win32gui.FindWindow(None, "無題 - メモ帳")
print(hwnd)
# 1638968

# %%
# ウィンドウを常に最前面にする
win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
```

・win32gui, win32con, win32process は C:\Windows\System32\user32.dll のラッパーみたいなものと考えている。
https://www.tokovalue.jp/API_INDEX_F.htm でできることを確認したら、win32gui ではどんなコマンドになっているか探す感じでいろいろできると思われる。
GitHub Actions で簡単なビルドチェックを作る

# この記事は？

最近、GitHub Actions をちょっと勉強し、その練習ついでにつくったものを紹介。

Linux コマンドの基礎が分かっている前提です。また、GitHub Actions の詳しい使い方などについては説明していません。

# C/C++ のビルドチェック

さして難しいことはありません。全ての `.c` ファイルを gcc にかける、ただそれだけです。

```yml
name: Build Check

on: push

jobs:
  build_test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Building test in GCC
        run: find * -type f -name '*.c' | xargs -r -t -L 1 gcc -c -o /dev/null
```

1. `actions/checkout@v3` で、リポジトリのファイルをワークスペースに出力
2. `find` コマンドで `~~.c` ファイルを検索
3. 見つかったファイルを GCC に入れてコンパイル

:::note
C++ に対応させるには、`*.c` を `*.cpp` に、`gcc` を `g++` に変えるだけで OK です。
:::

:::note warn
このままだと、変更の有無を問わず、push される度に全てのファイルをコンパイル (チェック) することになってしまいます。ソース数が多い場合はまともに使えなくなることも考えられます。
:::

最後の行 `run: ...` がメインの箇所です。`find` や `xargs` の概要は割愛して、オプションの説明をします。

## `find`

まずは、`find` で `.c` ファイルの検索をします。

| オプション | 意味 |
| --- | --- |
| `*` | カレント上のファイル (ディレクトリ内含む) 全てのファイルを選択 |
| `-type f` | ファイルのみ表示 (ディレクトリは除外される) |
| `-name '*.c'` | ファイル名が `~~.c` である (`*` はワイルドカード) |

これで、`~~.c` という名前のファイル一覧が出力されます。

## `xargs`

次に、`xargs` で各ファイル名を引数にコマンドを実行します。ここでは、ファイル名 1つ 1つに対して、`gcc -c -o /dev/null {ファイル名}` というようなコマンドが実行されることになります。

| オプション | 意味 |
| --- | --- |
| `-r` | 入力が無いとき、コマンドを実行しない (つまり、`find` でファイルが見つからなかったとき何もされない) |
| `-t` | 実行されるコマンドを標準出力 |
| `-L 1` | パイプなどから複数行の入力があっても、コマンドに 1引数ずつだけ入れる |

## `gcc`

最後に、`gcc` のオプションは次の通り。

| オプション | 意味 |
| --- | --- |
| `-c` | コンパイルとアセンブルは行うが、リンクを行わない (これにより、複数ファイルにまたがるコードでも、1ファイルずつテストを行える) |
| `-o /dev/null` | 出力ファイルの指定 (`/dev/null` に書き込まれたデータは即時削除、これによりビルドはするがファイルを保存しないという動作を実現する) |

# Python のビルドチェック

## `py_compile` を使う

やることは 9割同じです。オプションが少し異なるので、そこだけ紹介。`run: ...` の部分だけ書くと、次のようになります。

```yml
      - name: Building test in py_compile
        run: |
          find * -type f -name '*.py' | xargs -r -t -L 1 python3 -m py_compile
```

`-m py_compile` により、Python コードのコンパイルを行います。これにより、構文解析をするが、実行はしないという動作を実現します。

参考元:

https://zafiel.wingall.com/archives/8308

## `pylint` を使う

ちなみに、全く同じ要領で `pylint` を用いて、より高度な構文チェックを行うことができます。(同様の linter は他にもあります。)

```sh
pip install pylint
```

```yml
      - name: Building test in py_compile
        run: |
          find * -type f -name '*.py' | xargs -r -t -L 1 pylint
```

:::note warn
しかし、pylint は評価結果が 10点満点でないと、ステータスコードが 0以外で終了するようです。そのため、満点でないと GitHub 上で結果が Failure として扱われることになってしまいます。
:::
Flaskを開発サーバーで起動させてみた

# 準備
flaskと、jinja2が必須となります。
```
# pip install flask
# pip install jinja2
```
# 基本構成
最低限の機能だけで動かすのであれば、以下の構成だけでよいです。
- index.py : 裏処理プログラム、ルーティングを書いたり、色々な処理を書く
- templates : HTMLテンプレートを保存するディレクトリ（名称変更不可）
- index.html : HTMLテンプレートファイル
```
# tree
.
├── index.py
└── templates
    └── index.html
```
# プログラムを書いてみる
設定したブックマークを表示させるだけのページを作成する。
```python:index.py
from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route('/')
def index():
    site = {
        'title':'ブックマーク'
    }
    pages = [
        {
            'title':'Google',
            'url':'http://google.com'
        },
        {
            'title':'Yahoo!',
            'url':'http://www.yahoo.co.jp'
        },
    ]
    return render_template(
        'index.html',
        site = site,
        pages = pages,
    )
```

**index.py**から引数として受け取った**site**や**pages**のデータは、
マスタッシュ構文を使って、`{{ site.title }}`のように呼び出すことができます。
テンプレートタグ`{% if ~ %}`や、`{% for ~ %}`を使って、HTMLテンプレート内で条件分岐させたり、ループ処理させたりすることができます。
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ site.title }}</title>
</head>
<body>
    <h1>{{ site.title }}</h1>
    {% if pages == [] %}
        <p>データがありません。</p>
    {% else %}
        <table border="1">
            <tr>
                <th>タイトル</th>
                <th>URL</th>
            </tr>
            {% for page in pages %}
                <tr>
                    <td>{{ page.title }}</td>
                    <td><a href="{{ page.url }}">{{ page.url }}</a></td>
                </tr>
            {% endfor %}
        </table>
    {% endif %}
</body>
</html>
```

# 開発サーバーを起動
## 事前準備
環境変数を設定します。
```
# export FLASK_APP=index
```
## 開発サーバーを起動する
以下のコマンドで開発サーバーを起動します。
特に何も指定しなければ、デフォルトで127.0.0.1:5000で起動するので、
localhostで動かしている場合は、`http://127.0.0.1:5000`でWEBサーバーに接続できます。
```
# flask run
```

## アドレスやポートを指定して起動
コンテナで起動する場合など、アドレスやポート指定したい場合もあると思います。
以下のオプションを指定することで、任意のアドレス、ポート番号で起動することができます。
こちらは、0.0.0.0のアドレスで、80番ポートで起動させる例になります。
```
# flask run -h 0.0.0.0 -p 80
```

## Pythonファイル内に記述して起動する
`app.run()`をPythonファイル内に記述して実行するという手段もあります。
`python index.py`コマンドで、index.pyを実行すると、
0.0.0.0のアドレスで、80番ポートで起動します。
```python:index.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)
```
RaspberryPi4BにPython3.10をインストールした

# やること
RaspberryPiにPython3.10をインストールして使えるようにする。

# 背景
WSL2で作ったPythonスクリプトをRaspberry Pi 4Bで実行しようとしたらエラーがでた。
よくよく観察すると、Pythonのバージョンが古いことが原因っぽい。
Pythonのバージョンを見てみたら、3.7xxとかだった。


# RaspberryPi のバージョンとか
HW: Raspberry Pi4B
OS: RaspberryPiOS(64bit)
```
$ uname -a
Linux raspberrypi 5.10.17-v8+ #1421 SMP PREEMPT Thu May 27 14:01:37 BST 2021 aarch64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
$ cat /proc/cpuinfo
processor	: 0
:(省略)
Hardware	: BCM2835
Revision	: c03112
Serial		: xxxxxxxxxxxxxxxx
Model		: Raspberry Pi 4 Model B Rev 1.2
```

# 解決策
Googleで検索したら、
[こちらのサイト](https://itheo.tech/installing-python-310-on-raspberry-pi)に記述があった。

## やりかた
次のコマンドを実行するだけ。たぶんコマンド末尾の"3.10.0"を入れ替えると、そのバージョンがインストールされるんだと思う。
```
wget -qO - https://raw.githubusercontent.com/tvdsluijs/sh-python-installer/main/python.sh | sudo bash -s 3.10.0
```
※コマンドは上記のWEBサイトから抜粋

## 結果
コマンドを投入してから完了まで30分くらいかかった。
指定したバージョンがインストールできた。
```
$ python --version
Python 3.10.0
```

作ったpythonスクリプトも無事動いた。

以上
閏年か否かを求めるコード

# 閏年か否かを求めるコード
```閏年.py
import tkinter as tk

def dispLabel():
    a = int(EditBox.get())
    str_a=str(a)

    if a%400 == 0 :
        lbl3.configure(text = str_a + "年は閏年です。")

    elif a%100 == 0 :
        lbl3.configure(text = str_a + "年は閏年ではありません。")

    elif a%4 == 0 :
        lbl3.configure(text = str_a + "年は閏年です。")

    else :
        lbl3.configure(text = str_a + "年は閏年ではありません。")
    
root = tk.Tk()
root.geometry("300x200")

EditBox = tk.Entry(width=6)
EditBox.place(x = 230, y = 20)

btn = tk.Button(text = "調べる", command = dispLabel).place(x = 60, y = 50)

lbl1 = tk.Label(text = "調べたい年は何年ですか？").place(x = 20, y = 20)
lbl2 = tk.Label(text = "年").place(x = 260, y = 20)
lbl3 = tk.Label(text = " ")
lbl3.place(x = 20, y = 100)



tk.mainloop()

```

## 感想
* どのような順で割り算を行ったら、閏年か否かを判別できるかを考えるのに頭を悩ませた。
[python] 存在するファイルを探す方法 -glob-

# はじめに
業務の自動化を進めるにあたって`glob`を使用してファイルのパスを得る方法をまとめる。

# 環境
python 3.7.8
window 10
# Code

### 特定のパスに属するファイル
文字の長さに関係なく、文字を含む場合は`*`をつける
```python
import glob

## listとして結果を得る
file_list =glob.glob(r'C:\Users\junsa\Desktop\paison\*.py')
print(file_list)
# ['C:\\Users\\junsa\\Desktop\\paison\\labo.py', 'C:\\Users\\junsa\\Desktop\\paison\\9abo.py']

## 下位フォルダも含めたファイルを探す
file_list =glob.glob(r'C:\Users\junsa\Desktop\paison\**\*.py', recursive=True)
print(file_list)
# ['C:\\Users\\junsa\\Desktop\\paison\\labo.py', 'C:\\Users\\junsa\\Desktop\\paison\\9abo.py', 'C:\\Users\\junsa\\Desktop\\paison\\paison2\\labo1234.py']
```

### 特定の一文字を含むファイル: []
`[]`で囲む一文列の中の一文字を含むファイルを探す。
`[0-9]`なら0から9までの数字のそれか一文字、[a-z]ならaからzまでの一文字を含むファイルを探す。
```python
import glob

file_list =glob.glob(r'C:\Users\junsa\Desktop\paison\[a-z]abo.py')
print(file_list)
# ['C:\\Users\\junsa\\Desktop\\paison\\labo.py']

file_list =glob.glob(r'C:\Users\junsa\Desktop\paison\[0-9]abo.py')
print(file_list)
# ['C:\\Users\\junsa\\Desktop\\paison\\9abo.py']
```

### 任意の一文字を含むファイル: ?
`?`は任意の一文字として扱われる。
ファイル名が3文字のファイルをすべて探したい場合：`???.*`
ファイル名の頭にtを含む3文字のテキストファイルを探したい場合：`t??.txt`
```python
import glob

file_list =glob.glob(r'C:\Users\junsa\Desktop\paison\????.py')
print(file_list)
# ['C:\\Users\\junsa\\Desktop\\paison\\9abo.py', 'C:\\Users\\junsa\\Desktop\\paison\\labo.py']

file_list =glob.glob(r'C:\Users\junsa\Desktop\paison\l???.py')
print(file_list)
# ['C:\\Users\\junsa\\Desktop\\paison\\labo.py']
```

# まとめ
`os`も一緒に使用することによってほとんどのファイル処理はできると思う。

[[python] ファイルの場所（パス）を得る方法](https://qiita.com/junzai/items/05d2ffab903e57b47233)
[python 公式Document -glob-](https://docs.python.org/ja/3/library/glob.html)
マテリアルをURPに適用する方法

# はじめに
通常のプロジェクトで制作したマテリアルはURPプロジェクトにインポートするとマテリアルエラーを起こし、ピンク色になってしまいます。今回はそれの解決方法載せていきます。

![2022-09-18 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532480/c766c556-8c32-0324-999d-72fdf357b31b.png)

こちらが使用しているバージョンです。

**Unity：** 2021.3.0f1

# マテリアルエラーの直し方1
この直し方Unityに搭載されている自動で直してくれる機能を使ったやり方です。
しかし、上手くいく時といかない時があるので、うまくいかなかった時は __直し方２__ を見てください

こちらの　__古いマテリアルをアップグレードする方法__　参照してください。
https://kurokumasoft.com/2022/01/06/unity-howto-use-urp/

# マテリアルエラーの直し方2
こちらは手動のやりかたです。

まずマテリアルの __Shader__ の欄が __`Standard`__ になっていると思うのでこれを __`UniVersal Render Pipeline > 
Lit`__ にします。
![2022-09-18 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532480/29cf087f-2a3f-e999-5c1d-13457b8ad265.png)

![2022-09-18 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532480/e9c91eb7-9410-0818-a891-d65a6b629e3d.png)

そうすることでまっピンクの状態では無くなり、表示されるようになります

![2022-09-18 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532480/bf1a9166-6737-4371-c185-de883d859fd4.png)

URPに対応させたことで __`Standard`__ にあった __Albedo__ が __BaseMap__ に変更されているので、Albedoにあったテクスチャがはがれているので、色がない状態で表示されています。

なのでBaseMapにAlbedoにあったテクスチャを入れることで...

![2022-09-18 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532480/0ee96820-55f2-952b-c147-9177d072fbaf.png)

このようになります。
ですがこの状態だと __BaseMap__ の色や __HigthMap__ の値など __Insoector__ が初期値のままなのでそれを調整してあげれば...

![2022-09-18 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532480/1f2a7f32-4cda-6b7a-9a3c-e336cd2fb140.png)


URPに対応させることができました。



# 参考文献
https://help.qiita.com/ja/articles/qiita-article-guideline

https://qiita.com/hachihacchi/items/46ea7251f1e5675b1ecb

https://kurokumasoft.com/2022/01/06/unity-howto-use-urp/
お店選びのお供に！　「食べログスター拡張」を作ってみた

# 食べログスター拡張(Chrome拡張)とは？
お店選びのときによく使われる「食べログ」。その店舗ページには、そのお店の評価を示す評価点（スター）がつけられています。この点数は、単純な口コミ評価の平均点ではなく、食べログによって独自の重みづけがされたものであることが知られています。

この重みづけの後の評価によると、開店して間もないお店であったり、口コミの件数が少ないお店にとってはどうしても辛口の点数になってしまうような気がしました。

食べログスター拡張(Chrome拡張）は、食べログによる評価点の下に、**ユーザーによる口コミ評価平均点** を表示するChrome拡張機能です。

![screenshot2022-09-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221909/a96b257c-9978-f5e3-d189-989760b09083.png)


## Chromeウェブストア
https://chrome.google.com/webstore/detail/%E9%A3%9F%E3%81%B9%E3%83%AD%E3%82%B0%E3%82%B9%E3%82%BF%E3%83%BC%E6%8B%A1%E5%BC%B5/jbmklcaaopcdiifkcnkljlbkebfklfmo

## ソースコード
https://github.com/yoshihisamurakami/tabelog-star-extension

## 口コミ平均点はどうやって算出しているか？
口コミの評価を1件づつ拾って割り算しているわけではなく、店舗ページの「口コミ」 → 「平均・分布」ページにある数字を拾っています。

![スクリーンショット 2022-09-18 22.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221909/6a12d51f-8d69-6d3e-f79e-52fa5e638dfa.png)

![スクリーンショット 2022-09-18 22.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221909/4cb7f014-6a32-aac5-0f65-203574b92693.png)

また、該当店舗のページを初めて開いたときに「口コミ」→「平均・分布」ページのHTMLを取得し、とってきた平均点を（制限時間つきで） LocalStorage へ保存。2回目以降のページロード時はLocalStorageから取得する・・というような工夫（？）をしています。

# 開発について（雑記）
- 私は今回初めてChrome拡張を作ってみましたが、けっこう簡単でした！　ある程度プログラミング経験があれば誰でもできるんじゃないでしょうか。
- 私は昼間の仕事ではバックエンド（Rails）メインで、ES2015のJSを書くのは実は久しぶりで、いい経験でした。JSベテランの方からみれば変な書き方をしているところがあるかもしれません。お気づきの点がありましたら、教えていただけると幸いです！
- Googleウェブストアで公開するためには審査が必要になります。このとき、1回目の審査では、説明が足りなかったためRejectされました。審査を提出してから、１時間かからない程度でRejectされました。
その後説明を追記し、再申請したところ、１週間経ってもメールの連絡が来ず。ディベロッパーダッシュボードを確認したところ、無事公開されていたことがわかりました。許可されたときは連絡が来ないので、定期的にディベロッパーダッシュボードを確認したほうがよさそうです。

## 使われ方について（雑記）
- このChrome拡張を使ってじっくり一つの地域のランキングや、特定のジャンルの一覧ページをみていると、食べログ評価点に対して口コミ平均が大きく上回るお店があったり、差がそれほどついていないページがあったりで、なかなか興味深いものがありました。
口コミ平均点が高いお店が必ずしも良いお店とは限らないかもしれませんが、少なくとも判断材料のひとつとしてあってもよいかな、と思いました。
食べログ評価による点数が低く、口コミ評価平均点が高い・・というお店であれば、私は行ってみたくなります。
- こちらはGoogle Chrome拡張なので、PCでの閲覧を前提としています。なので、今のところスマホでは使えません。スマホでChrome拡張を使う方法があるのか？　または別の方法を探るか？　引き続き探っていきたいと思います。 

## 参考にしたページ
Chrome拡張を作るにあたり、以下のページを参考にさせていただきました。ありがとうございました！
Qiitaのユーザーをブロック(非表示)にするChrome拡張を作りました
https://qiita.com/standard-software/items/7ee380f86c2816d4f263
React.JSアプリケーション Deploying to Vercel ④

# 参考動画
https://youtu.be/FJDVKeh7RJI

https://github.com/piyush-eon/react-typescript-taskify

# 完成したアプリケーション

https://react-typescript-tutorial.vercel.app/



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/a041c4da-3d10-1a9f-acd9-8e417eeb5c53.png)




# ソースコード
https://github.com/iwasaki-hub/react-typescript-tutorial





# ドロップ操作

https://www.npmjs.com/package/react-beautiful-dnd

https://www.npmjs.com/package/@types/react-beautiful-dnd
html フォームタグ備忘録

# テキスト入力
```html
<div>
  <label>お名前<input type="text"></label>
</div>
<div>
  <label>パスワード<input type="password"></label>
</div>
<div>
  <label>数量<input type="number"></label>
</div>
<div>
  <label>日付<input type="date"></label>
</div>
```
![スクリーンショット 2022-09-18 22.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/67da8edf-fa95-3c32-c1f2-e02a48326015.png)
# 複数行のテキスト入力
```html
<label>内容<textarea></textarea></label>
 ```
![スクリーンショット 2022-09-18 22.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/e6e32f90-9ce7-31c8-2768-1184a32244ff.png)

# チェックボックス
複数選択できるものに使用する。
```html
<label><input type="checkbox">商品A</label>
<label><input type="checkbox">商品B</label>
<label><input type="checkbox">商品C</label>
```
![スクリーンショット 2022-09-18 22.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/d304da57-18f8-0499-be6c-a7f804747e9b.png)

# ラジオボタン
１つだけ選ばせるものに使用する。
同じnameを付けることにより１つだけ選択できるようになる。
```html
<label><input type="radio" name="warranty">加入済み</label>
<label><input type="radio" name="warranty">未加入</label>
<label><input type="radio" name="warranty">わからない</label>
```
![スクリーンショット 2022-09-18 23.00.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/b6f0cd13-233b-82af-489e-1a06edf88e79.png)

# グループ化
チェックボックスやラジオボタンを枠で囲うことができる。
```html
<!-- グループ化 -->
<fieldset>  
    <!-- フィールド説明/-->
    <legend>対象の商品</legend>
    <label><input type="checkbox">商品A</label>
    <label><input type="checkbox">商品B</label>
    <label><input type="checkbox">商品C</label>
</fieldset>
```

# ドロップダウンリスト
```html
<select>
  <option>-- お問合せ種別を選択してください --</option>
  <option>商品が届かない</option>
  <option>商品が壊れた</option>
  <option>間違えて注文した</option>
  <option>決済手段を変えたい</option>
  <option>その他</option>
</select>  
```
![スクリーンショット 2022-09-18 23.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/e9cf8e63-4ebb-0cd1-1f42-f13fc340b0ae.png)

# リストボックス
```html
<!-- multipleと記述することで複数選択が可能になる。 -->
<select size="3" multiple>
  <option>商品が届かない</option>
  <option>商品が壊れた</option>
  <option>間違えて注文した</option>
  <option>決済手段を変えたい</option>
  <option>その他</option>
</select>  
```
![スクリーンショット 2022-09-18 23.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/37d67c92-7f83-9cb2-c3ff-0fe52adf1717.png)

# ボタン
```html
<!-- 画像を含めることができる -->
<button>送信</button>
<!-- テキストのみ -->
<input type="submit" value="送信">
```
![スクリーンショット 2022-09-18 23.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672823/120411bd-898a-44db-2ee3-67a8a3a54cd7.png)
WebViewの設定について

# はじめに
今回はwebViewを触る機会があり少し調べたりもしたので、そこで調べて見つけたものを記事にします。

# 設定一覧

**JavaScriptを有効にする**

```
webView.settings.javaScriptEnabled = true
```

**リンク先をブラウザにせず、WebView内でリンクさせる**
```
webView.webViewClient = WebViewClient
```

**スクロールバー領域を消す**
```
webView.scrollBarStyle = View.SCROLLBARS_INSIDE_OVERLAY
```
または、
```
webView.setVerticalScrollbarOverlay(true)
```

**ローカルのHTMLファイルを表示させる**
```
val padh = "/data/index.html"
webView.loadUrl("file://$padh")
```
ローカルのファイルをwebViewに表示させるには　http://　の代わりに　file://　にします。
ハードウェア記述言語学習の足掛かり

# この記事の目的
この記事の目的はこれからハードウェア記述言語を勉強する人に向けて、少しでも取っ付きやすくするためになるべく平易な表現でハードウェア記述言語を紹介することです。

## 読み進める際の注意点
この記事は以下の事柄を分かっている前提で書かれています。
- 論理演算(and, or, not, nand, nor, xor)
- 論理回路記号

## ハードウェア記述言語とは
ハードウェア記述言語はアルファベット3文字でHDLと略されます。
HDL(Hardware Discription Language)：ハードウェア記述言語
ハードウェア記述言語は簡単に述べると論理回路を記述する言語です。
集積回路(IC：Integrated Circuit)、PLD(Programmable Logic Device)、FPGA(Field Programmable Gate Array)の開発に使用されます。

## 主に使用されるハードウェア記述言語
ハードウェア記述言語での開発では主に下の2種類が使われます。
- Verilog HDL(読み方：べリログエイチディーエル)
- VHDL(読み方：ブイエイチディーエル)
個人的には、初学者ならばVerilog HDLの方をおすすめします。。。(より平易に感じます)

## ハードウェア記述言語の記述例
簡単な論理回路をVerilog HDLとVHDLを使って記述してみます。
使用するのは以下の回路とします。
a、b、c、dはそれぞれ1bitの信号とします。
![log_circuit_ex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849808/eb977ebc-15c6-5ae7-3bfa-0957ededc335.png)
各言語の解説はこの記事では割愛します。

### Verilog HDL
Verilog HDLで記述した例が以下となります。
```verilog
module AB_or_CD ( a, b, c, d, g);
    input a;
    input b;
    input c;
    input d;
    output g;

    wire e;
    wire f;

    assign e = a & b;
    assign f = c & d;

    assign g = e | f;
endmodule
```
### VHDL
VHDLで記述した例が以下となります。
```VHDL
entity AB_or_CD is
port (
    a : in std_logic;
    b : in std_logic;
    c : in std_logic;
    d : in std_logic;
    g : out std_logic
);
end AB_or_CD;

architecture RTL of AB_or_CD is

signal e : std_logic;
signal f : std_logic;

begin

    e <= a and b;
    f <= c and d;
    g <= e or f;

end RTL;
```

## 最後に
ここまで読んでいただき、誠にありがとうございます。
なるべく簡単にハードウェア記述言語の紹介をしてみました。
少しでもハードウェア記述言語が簡単そうだと思ってもらえたら幸いです。

勉強する際は本を一冊手に取って勉強することをお勧めします。
筆者が勉強したときに使用した本は参考資料に載せておきますので、参考にしてみてください。

## 参考資料
- [改訂新版 わかるVerilog HDL入門](https://shop.cqpub.co.jp/detail/96)
- [改訂 VHDLによるハードウェア設計入門](https://shop.cqpub.co.jp/detail/190)
React Hooks （状態のフック）

## 概要
React Hooks 状態のフックについてまとめました。

## 状態のフック
内部の状態を保持して、その状態の変化を表示するフック

### ■useState
状態を扱うためのフック

第1引数に渡した値が初期値となる。
戻り値は配列となっており、1つ目が現在の状態、2つ目が更新関数。

```tsx
import { useState } from 'react'
// typescript
type DispStrProps = {
    initValue: string
}

const Display = (props: DispStrProps) => {
    const { initValue } = props
    const [dispStr, setDispStr] = useState(initValue)

    return (
        <div>
            <p>input: {dispStr}</p>
            <input type="text" onChange={(e) => setDispStr(e.target.value)} />
        </div>
    )
}

export default Display
```

### ■useReducer
状態を扱うもう1つのフック
配列やオブジェクトなどの複数のデータのまとまりを扱うことが多い。
第1引数にReducer関数、第2引数に初期値
useStateのセット関数と比べて下記メリットがある。
・関数を切り出せる。
・具体的な状態に依存しない
```tsx
import { useReducer } from 'react'

type Action = 'INCREMENT' | 'MULTIPLICATION' 
const reducer = (count: number, action: Action) => {
    switch (action) {
        case 'INCREMENT':
            return count + 1
        case 'MULTIPLICATION':
            return count * 2
        default:
            return count
    }
}


const Counter = () => {
    const [count, dispatch] = useReducer(reducer, 0)

    return (
        <div>
            <p>count: {count}</p>
            <button onClick={() => dispatch('INCREMENT')}>+</button>
            <button onClick={() => dispatch('MULTIPLICATION')}>×</button>
        </div>
    )
}

export default Counter
```
CSR、SSR、SSG、ISRを簡単にまとめてみた

<h1>SSR  クライアントサイドレンダリング</h1>
初回アクセス時にアプリケーションに必要なリソースを全て取得します。<br/>
SPAはアプリーケーションの種別、CSRはレンダリング技術なので別物のようです。

<h2>メリット</h2>
・レスポンスとして静的なファイルを返すだけなので高速
<h2>デメリット</h2>
・初回ロードが重い<br/>
・JavaScriptで描画するため、初期状態でコンテンツがなくSEOが不利

<h1>SSR サーバーサイドレンダリング</h1>
特徴
サーバーにレスポンスを投げてサーバーからDBやAPIからデータを取得してファイルを生成してクライアントに返します。

<h2>メリット</h2>
・SEOに有効<br/>
・常に最新の情報を表示できるので、頻繁に更新されるコンテンツにも対応
<h2>デメリット</h2>
・リクエストレスポンスのやり取りが多くスピードが遅くなる<br/>
・ローディングスピードがクライアントのPCに依存しない

<h1>SSG スタティックサイトジェネレーション</h1>
ビルドの段階で動的なファイルが生成されます。

<h2>メリット</h2>
・SEOに有効<br/>
・CSRと同じようなスピードが出る
<h2>デメリット</h2>
・常に最新の情報を表示できないので更新が頻繁なサイトに対応できない

<h1>ISR インクリメントスタティックリジェネレーション</h1>
SSG の挙動ぬ加えて、一定時間ごとにデータの再取得を行い、HTMLを再生成します。

<h2>メリット</h2>
・更新の間隔を調整できるのでSSGより最新の情報を表示できる
<h2>デメリット</h2>
・常に最新の情報を表示することはできない

<h1>最後に</h1>
レンダリングを詳細に解説してくれる記事がたくさんあるので、そちらの記事をたくさん読ませていただきました。知識として、まだしっかり理解できていない気がしています。<br/>
Next.jsで比較的簡単に実装できるようなので、実際に実装してみて理解を深めようと思います。
immerを使うのは？　……今でしょ！

## イミュータブルにオブジェクトを更新したいなぁ

イミュータブルにオブジェクトを更新したいときってあるよね。たとえば雛形のオブジェクトがあって、それをもとにいくつもオブジェクトをつくりたいとか。

僕はだいたいこんな感じでやります。

```TypeScript
/* まずは型をつくり */
type User = {
	id: string;
	name: string;
	hand: number[];
};

/* 基本となるオブジェクトを作成し */
const basicUser: User = {
	id: '',
	name: '',
	hand: []
};

/* そのオブジェクトをシャローコピーして更新する */
const user1: User = {
	...basicUser,
	id: 'user1',
	name: 'Tanaka',
	hand: [0, 1, 2]
};

/* user1_2をつくるならこんな感じ */
const user1_2: User = {
	...user1,
	hand: [0, 1]
};
```

こんな感じでUserを更新する関数をつくるかなぁ……という感じなのです。再代入はしません。

ただ、スプレッド構文の問題点はシャローコピーであることです。シャローコピーはコピー元のオブジェクトの中身が変更された場合、新しく作ったオブジェクトの中身がうっかり変わってしまう可能性があるのです。

じゃあどうするかっていうと、immerに出会うまではこうしてました。

```TypeScript
import { clone } from 'ramda';

const user1: User = {
	...basicUser,
	id: 'user1',
	name: 'Tanaka',
	hand: [0, 1, 2]
};

const user1_2: User = {
	...clone(user1),
	hand: [0, 1]
};
```

ramda.jsを使うとちゃんとディープコピーしてくれます。で、これでもいいんだけど……。
immerを使うとこんな感じで書けます。

```TypeScript
const user1: User = produce(basicUser, (draft) => {
	draft.id = 'user1';
	draft.name = 'Tanaka';
	draft.hand = [0, 1, 2];
});

const user1_2: User = produce(user1, (draft) => {
	draft.hand = [0, 1];
});
```

一見、記述量が増えてる〜っていう気もする。でもこのimmerの良いところは、うっかりディープコピーを忘れないことだと思う。手癖でスプレッド構文を使ってシャローコピーしてしまってバグを起こしたことがあって、必ずcloneするようにはしているんだが抜けることがある。そしてその手癖のミスは型とかで防げない。ということでimmerを使えば必ず差分だけアップデートしたオブジェクトを返してくれるので重宝しております。

そんなわけで、immerを使うのは……今でしょ！

あ、あとTypeScriptを使っておりreadonly関係のts(2322)エラーが出るときはcastDraftを使ってあげましょう。このcastDraftに気づくまではimmerとTypeScriptは相性悪いのかな〜と勝手に思ってました。ちゃんとドキュメントを読むことが大事ですね。

```TypeScript
const nextHand: readonly Card[] = [monster1, monster1, trainer1];

const user1: User = produce(basicUser, (draft) => {
	draft.id = 'user1';
	draft.name = 'TANAKA';
	draft.hand = castDraft(nextHand);
});
```
こんな感じでTS使っているとreadonlyなオブジェクトをつくったりすると思うんだけど、それをimmerで入れようとすると型エラーが起こるのね。それをcastDraftは解消してくれるわけです。いいね！
Salesforce：HTTP コールアウトのテストクラス

Apexから外部サービスを呼び出すような処理を開発し、いざテストクラスを作成。
あれ・・・テストが失敗している・・？となった。
それもそのはず、Apexテストメソッドは HTTP コールアウトをサポートしていないのである。

そこで、
静的リソースでMockを作成し、StaticResourceCalloutMockを使用してテストクラスを実行する方法を書いていく。
※今回は、[Salesforce：Apexから外部サービス呼び出しをする（API）](https://qiita.com/O__O/items/e2ce88236b9c87ff8b08)のテストクラスとして作成していく:smiley_cat:


### 事前準備
①レスポンスボディを含むテキストファイルを作成。
今回は異常の場合のレスポンス（TestMock_error）と
正常の場合のレスポンス（TestMock_normal）のテキストファイルで計２個。

:::note warn
コンテンツタイプの指定

コンテンツタイプを指定する場合はそのタイプと一致するようにテキストファイルを作成。
例えば、JSON形式の場合は、JSON文字列を書く必要がある。（※ここではJSON形式の場合を想定して書いていく。）

:::

②静的リソースに①で作成したファイルをアップロードする。


### 実装 
今回は、正常のコールアウトと異常のコールアウトの2パターンを実装。

```apex:sampleTest.cls
static testMethod void testMethod1() {
    /* テスト対象のVisualforcePageとコントローラの設定 */
    PageReference testPage = Page.sampleTestPage;
    Test.setCurrentPage(testPage);
    ObjectName obj = new ObjectName();
    TestController TestController = new TestController(new ApexPages.StandardController(obj));
        
    /* コントローラのアクション呼び出し */
    TestController.onLoadAction();

    /* 異常の疑似レスポンスを作成 */
    createMock('TestMock_error');
    TestController.inputZipcode1 = '111';
    TestController.inputZipcode2 = '1111';
    TestController.SearchZipcode();
    System.assertEquals(TestController.isError, true); 

    /* 正常の疑似レスポンスを作成 */
    createMock('TestMock_nomal');
    TestController.inputZipcode1 = '150';
    TestController.inputZipcode2 = '0011';
    TestController.SearchZipcode();
    System.assertEquals('{"sample":"xxxxxxxxxx"}', res.getBody());
    System.assertEquals(200,res.getStatusCode());
    System.assertEquals('application/json', res.getHeader('Content-Type'));   
}

/* 疑似レスポンスを作成するメソッド */
static void createMock(String mockName){
    /* Mock を作成し、プロパティを設定 */
    StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
    mock.setStaticResource('testMockName');
    mock.setStatusCode(200);
    mock.setHeader('Content-Type', 'application/json');

    /* 擬似コールアウトモードを設定 */
    Test.setMock(HttpCalloutMock.class, mock);
}
```



### 最後に
JSON形式でテキストファイル作成するの大変だったので、実際にコールアウトした時のレスポンスBodyを画面に描画し、それをコピペして作成しました。
複雑なJSON形式の場合はこうするしかない(笑)
System.debug()で返却値見ようと思ったら、レスポンスが長すぎて全部出てこないのよね・・・
[Unity] joystickとbuttonの作り方

今回はjoystickを使って、オブジェクトの操作とジャンプボタンを作る機能についてまとめていきます！

:::note info
使用PC： MacBook Pro (13-inch, M1, 2020)
OSバージョン: 11.5.2
Unityバージョン：2021.3.2f1
:::

# 実際にプレイすると
![画面収録-2022-08-06-16.27.52_out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890419/80678511-44cc-a7e8-bfc5-544b2792ef2b.gif)
こんな感じになったら完成です！

サンプル動画では
①Sphere→Rigidbodyを加えておく
②Plane
③Material（緑色）→Planeにつける
④[joystick](https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631)→unityにインポートしておく
⑤Canvas
をアセットとして使用しています。

# オブジェクトの準備
オブジェクトを画面のようにいい感じに収まるように配置します。笑
![スクリーンショット 2022-09-17 1.27.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890419/dac6b4af-135e-d613-b04d-fbde54797810.png)

# 移動用のjoystickとジャンプ用のボタンを作成
**①canvasにjoystickを入れる**
今回は`Fixed Joystick`を使います。
![スクリーンショット 2022-09-17 1.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890419/2e56ce05-4a7d-4aa2-4149-30a619cfcb10.png)
joystickのパッケージの中から`Fixed joystick`をcanvasの中にドラッグ&ドロップします。
画面左側にいい感じの位置になるように調整します。

**②ボタンの作成**
Hierarchyビューから、`Create`→`UI`→`Image`を作成し、こちらも画面右側にいいな感じになるように調整します。今回は名前をFixed Joystickにしました。
![スクリーンショット 2022-09-18 21.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890419/83ecd3dd-ccf0-6ce1-c8f1-8aa210ed1968.png)

Source ImageにはJoystickのパックに付属しているものを使用します。
ここは以下の動画を参考にして、お好きなものを選択してください！
![画面収録-2022-09-18-21.13.56_out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890419/0042030d-d642-e381-a864-b8d1b61d5cec.gif)



# スクリプトの作成
`MyScript`と`Joybutton`の二つのスクリプトを作成し、それぞれ以下のコードを入力します。

`MyScript`はSphereにアタッチします。
```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    protected Joystick joystick;
    protected Joybutton joybutton;

    protected bool jump;

    // Start is called before the first frame update
    void Start()
    {
        joystick = FindObjectOfType<Joystick>();
        joybutton = FindObjectOfType<Joybutton>();
    }

    // Update is called once per frame
    void Update()
    {
        var rigidibody = GetComponent<Rigidbody>();

        rigidibody.velocity = new Vector3(joystick.Horizontal * 10f, rigidibody.velocity.y, joystick.Vertical * 10f);

        if(!jump && joybutton.Pressed)
        {
            jump = true;
            rigidibody.velocity += Vector3.up * 10f;
        }

        if(jump && !joybutton.Pressed)
        {
            jump = false;
        }
    }
}

```

`Joybutton`はImageのFixed Joystickにアタッチします。
```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Joybutton : MonoBehaviour, IPointerUpHandler, IPointerDownHandler
{
    public bool Pressed;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Pressed = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Pressed = false;
    }
}
```

# 以上！

# 参考
・https://www.youtube.com/watch?v=8-X3BmvtXT0
Square Subscriptionを訳して理解する

アプリ界隈ではよくstripeの導入を見かけるが、squareを使う必要性が出てきたので要所を整理する。
https://developer.squareup.com/docs/subscriptions/overview
今回はこの記事やっていく。

## squareの利点
squareの利点については、以下の3点が挙げられている。
##### 1. シンプルな課金
Squareは定期購入（サブスク）の請求を簡素化する。
いつ請求するか、誰が支払ったか、誰が未払いかを気にする必要はない。
Squareは、顧客のメールアドレスに請求書を送ったり、自動的に課金したりと、購読プランに応じたフォローアップを行う。

##### 2.顧客、カード、請求書のシームレスな管理
サブスクリプションAPIは、サブスクリプションのサービスを提供する場合、顧客、顧客カード、請求書の作成と管理を解決するCustomersやInvoicesなどのAPIを含むSquareプラットフォームの他の部分と統合しています。

##### 3.Square Seller Dashboardで利用できる請求書
販売者は、Square Seller Dashboardでサブスクリプションによって生成された請求書を確認することができます。

## squareでのサブスクリプションの管理方法
squareでのサブスクリプションの管理の仕方について、以下の2stepが挙げられている。

##### 1. サブスクリプションプランを設定するCatalog API を使用して、サブスクリプションプランをセットアップします。プランは、カタログオブジェクトとして保存されます。詳細については、「購読プランのセットアップと管理」を参照してください。


##### 2.サブスクリプションを管理します。Subscriptions API を使用して、サブスクリプションを作成および管理します。詳細については、「Subscriptions API を使用したサブスクリプションの管理」を参照してください。

カタログAPIを利用して、サブスクリプションのプランを作成し、誰のどのカードに対してサブスクを契約するか、についてはsubscription apiを利用するみたい。
VSCodeのおすすめ拡張機能

最近良く使ってるVSCodeの拡張機能をまとめました！
今回は5つです〜。

# Partial Diff

https://marketplace.visualstudio.com/items?itemName=ryu1kn.partial-diff

エディタ上で範囲選択した2つの箇所のdiffを新しいタブ上に表示してくれます。

<img width=500 alt="PartialDiff" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/7600e695-489f-764b-5591-7cca7507fa5e.png" />

こんな感じで手軽にdiffを見れるので重宝してます。

# Bookmarks

https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks

コード上の行を指定してブックマークできます。
リストでどこをブックマークしたか確認できたり、ショートカットキーで順番に移動したりできます。
複数ファイル間で関連する箇所を移動したりするのに使っています。

# Todo Tree

https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree

ファイルツリーでどこにTODOコメントがあるのか確認できます。
確認後、たくさんTODOあるなぁって凹むまでがルーティーンです。

# VSNotes

https://marketplace.visualstudio.com/items?itemName=patricklee.vsnotes

作業中どこにメモ取っておこうかなぁって悩んでいたのですが、この拡張機能で解決しました。
コマンドからタイトルを入力すると日時フォーマットの付いたファイル名でマークダウンファイルを作成してくれます。
`yyyy-MM-dd_hh_mm_title.md`
作成したファイルは特定のディレクトリに保存されて、拡張機能のタブでリスト表示されます。

# vscode-styled-components

https://marketplace.visualstudio.com/items?itemName=styled-components.vscode-styled-components

styled-componentsとかEmotionでtsxファイルにスタイルを実装してるときにあると便利なやつですね。
ハイライトとインテリセンスをしてくれるので、タイポが避けられるのはもちろんなんですが、なんだっけあのプロパティ？とかなったときも入力候補が提示されて助かります。

# まとめ

vscode-styled-components以外は言語に関係なく使えるものでした。
作業効率が全然違うのでこういうツールは色々試して自分に合うものを探したいですね〜。
Raspberry Pi Pico 用の mruby を Build するためのコンテナ作成用 Dockerfile を書いてみた

# はじめに

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

最初にいつも通りのお断りをば。

自分、仕事では一切マイコンボードを利用した業務に携わったことがございません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

… はい。

# Raspberry Pi Pico 用の mruby を使えるようになっていた（凄い！ 嬉しい！）

いつものごとくネットをサーフィンしていて、[Raspberry Pi Pico](https://www.raspberrypi.com/products/raspberry-pi-pico/) 用の mruby を使えるようにしてくださった方がおられることに、先日気が付きました。

Raspberry Pi Pico って [MicroPython](https://micropython.org/) とか使って弄くっても良いんですが、やっぱり Ruby 言語使って操作したいんですよ、自分は。

早速、使えるようにしてくださった方が書かれた [qiita の記事](https://qiita.com/k-mana/items/c64967b88e9bf50f760b) と  [Github の記事](https://github.com/k-mana/pico-mruby)を拝見して、Raspberry Pi Pico 用の mruby 実行環境を作成してみました。

実行環境は前述の各記事で説明された操作をそのまま繰り返すだけであっさり作成でき、自分所有の Raspberry Pi Pico でもあっさり動作しました。

# 今回やったこと

上記の通り、Raspberry Pi Pico 用の mruby の実行環境に相当するアプリケーションを Build してみました。

色々試したところ、上記の各記事には明記されていないんだけど、作業時に Python3 がいることがわかったり、前述の各記事を読んでいくと色々なツールチェーン（クロス開発用の gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 等）を導入しないといけなかったりすることが見えてきました。

それらを物理マシンに直接導入しちゃうと、他のものとコンフリクトしちゃったりしそうだったので、仮想環境（今回はコンテナを利用）に入れて、その中で Build を行うことで、Raspberry Pi Pico 用の mruby の実行環境に相当するアプリケーションを作成してみました。

コンテナの構築は手作業で行わず、Dockerfile 化して、別環境での利用も容易化してみましたが、誰か再利用されますか？

※ Dockerfile は[こちら](https://github.com/YoshihikoHara/Dockerfile-for-pico-mruby)で公開してます。

# Dockerfile について

Dockerfile の中では特に難しいことはしていません

上から見ていくと

```
#
# Last Updete: 2022/09/16
#
# Author: Yoshihiko Hara
#
# Overview:
#   Create a container containing development environment of pico-mruby (mruby for Raspberry Pi Pico).
#

# Specify the image (Ubuntu 22.04) to be the base of the container.
From ubuntu:22.04

# Specify working directory (/root).
WORKDIR /root

# Update applications and others.
RUN apt -y update
RUN apt -y upgrade
```

① Ubuntu 22.04 のコンテナを作る
②  "/root" ディレクトリに移動して（ここが開発ディレクトリの起点）
③ OS（というかコンテナのユーザランド）を最新化

```
# Install working tools (vim, wget, curl, git, python3).
# Note: Ubuntu:22.04 container images do not have Python3 installed by default.
RUN apt -y install vim wget curl git python3

# Install build tools.
RUN apt -y install cmake build-essential gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib rake
```

④ 開発に必要そうなツール類と、ツールチェーンをごそっと導入

```
# Get "pico-mruby" source code & Build.
RUN git clone https://github.com/k-mana/pico-mruby.git --recursive
WORKDIR /root/pico-mruby
RUN mkdir build
WORKDIR /root/pico-mruby/build
RUN cmake ..
RUN cmake --build .
```

⑤ Github から Build 用のリソース一式を Get
⑥ 作業に必要なサブディレクトリ作成し、移動
⑦ Build を実行

```
# Specify the locale.
RUN apt -y install locales
RUN echo "ja_JP UTF-8" > /etc/locale.gen
RUN locale-gen
```

最後は、自分の趣味。
コンテナのロケールに "ja_JP UTF-8" を追加しただけです（蛇足です♪）。

この Dockerfile が誰かのお役立ちとなると良いなぁ。

では、また。
3分で python仮想環境作成 ～ ダブルクリックで実行 できるようにする

windows 10 で python スクリプトをダブルクリックで動かすまでためのテンプレート。
全部スクリプトでセットアップするので早い。

---

PowerShellの設定

```ps1:管理者powershellで叩く
Set-ExecutionPolicy -ExecutionPolicy Bypass
# 大丈夫か？と聞かれたら「A」や「Yes」を叩く
```

1. [python 3.6.8](https://www.python.org/downloads/release/python-368/)をインストール
   バージョンは不問。例として3.6系。
   「Pathに通すか？」というチェックがあったらチェックを入れます。

2. python仮想環境
   [create_venv.zip](https://www.dropbox.com/s/75n4rd7jj2hzolw/create_venv_v07.zip?dl=1)をダウンロードして展開する。
   フォルダの中身を仮想環境を設置したいフォルダにコピー
   python3仮想環境作成.ps1 をダブルクリック
　　　仮想環境に名前をつける
   仮想環境ショートカット作成.vbs をダブルクリック

3. .py ファイルの実行サンプル
   「venv」ショートカットで開いたウィンドウに「pip install pandas」を叩く   
    (適当にライブラリリをインストールした。例としてpandas)
   「pythonスクリプトを実行.ps1」をダブルクリックすると 「test.py」が実行される
    (「df.tsv」ファイルが生成されたり、「log.txt」ファイルが生成される)

この test.py を書き換えて python に好きな作業をやらせます。


---
■蛇足
インターネットでゲットしたps1を簡単に実行できてしまうのはセキュリティ的にはよろしくない、
と思うようなら以下でリスクが減ります。ローカルで作成したps1しか実行できなくなります。

```ps1:管理者powershellで叩く
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
```

この記事は以上です。