OmniAICreator/Qiita-1.07M huggingface dataset:
【Git Hub/GitHub Pages】ポートフォリオ作成手順

## 初めに

今回はGit Hubの 「GitHub Pages」でポートフォリオを作成する手順をまとめました。
作成したアプリを追加していくことができるよう方法を記録しています。

## 前提
・GitHubの登録が済んでいる
・GitHub Desktopのアプリをインストールが済んでいる

## GitHub Pagesとは？

GitHubが無料で提供している、静的Webページを公開するためのサービスです。
GitHubのリポジトリをそのままWebサイトとして公開することができ、
公開したWebサイトは誰でもアクセスできるようになります。


## 手順

### ①公開したい静的Webページを作成する

今回は「portfolio」ディレクトリに
HTMLとCSSのファイルを作成し、中身を編集していきます。

```
🗂 portfolio
 ∟index.html
 ∟style.css
```

##### 編集したページを確認する

先ほど作成したディレクトリに移動し、ローカルサーバーを起動します。

```
% cd 作成したディレクトリ

％ ruby -run -e httpd . -p 8000
```
サーバーを起動すると、ローカルホストのURLは以下になります。
http://localhost:8000/

正しく表示されることを確認したら、control + Cでローカルサーバーを停止します。

### ②Git管理できるようにする

git initコマンドでGit管理できるようにします。

```
% git init
```

### ③GitHub Desktop経由でpushする

※プッシュがお済みの方は飛ばしてください。

初めてプッシュする場合


１. GitHub Desktopを開き、先ほどgit initしたディレクトリを選択します。
2. 「first commit」でコミットする（privateのチェックを外す）

:exclamation:
GitHub Pagesとして公開する内容が含まれているリポジトリは、
Privateリポジトリだと、外部から閲覧することができないため
「Public」でプッシュする必要があります。

### ④GitHub Pagesとして公開する設定を行う

１. <a href="https://github.com/">ブラウザのGitHubサイト</a>にアクセスし、
先ほど作成したリポジトリページに移動します。
（今回の場合は「portfolio」リポジトリ）

２. Settings（設定）　から　Pages　を選択

３. その中にある、Sourceを「master」に設定し、「save」をクリック

４. 自動的にURLが発行される


## 公開されたURLを確認！

発行されたURLにアクセスし、ブラウザや携帯での表示を確認します。

:exclamation:
GitHub Pagesの仕様上、ページが表示できるようになるまでに、少なくとも5分以上、場合によっては20分以上かかる場合があります。
もし1時間以上経過してもページが表示されない場合は、なんらかの問題が考えられるため、リポジトリやファイルを削除して、最初からやり直すことをお勧めします。

## コードの修正をプッシュするときの注意点

:exclamation:
GitHub Pagesの仕様上、pushしてから変更が反映されるまでにも20分以上時間がかかること、
1時間あたり10回までしか変更反映はされないことがあります。
通常の作業においてはローカル環境で問題ないかしっかり確認したあとに、リモートリポジトリへpushすることをお勧めします。

## HTMLは表示されたが、CSSなどの反映がされない時

:exclamation:
変更が反映されない場合は、ブラウザのキャッシュが影響している可能性があります。
その場合は、command + Shift + Rでスーパーリロード（キャッシュを無視したブラウザ更新）を行うことで反映される可能性があります。

## まとめ

最後までご覧くださり、ありがとうございます。
今回はGit Hubの 「GitHub Pages」でポートフォリオを作成する手順をまとめました。

初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

こちらの記事がどなたかの参考になりましたら幸いです。
Acceptance Test Specification of Communication on FlexRay bus, No.668, AUTOSAR R21-11(305) CP

Acceptance Test Specification of Communication on FlexRay bus, No.668, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/tests/1-2/AUTOSAR_ATS_CommunicationFlexRay.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|AT| Acceptance Test
|CAN |Controller Area Network
|ECU |Electronic Control Unit
|LT |Lower Tester
|NM |Network Management
|PCO| Point of Control and Observation
|PDU |Protocol Data Unit
|RfC |Request for Change
|Rx |Reception
|SUT| System Under Test
|SWC |Software Component
|TCP| Test Coordination Procedures
|Tx |Transmission
|UT| Upper Tester
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Specification of Module Efficient COM for Large Data
AUTOSAR_SWS_LargeDataCOM.pdf
[2] Specification of RTE
AUTOSAR_SWS_RTE.pdf
[3] Specification of FlexRay ISO Transport Layer
AUTOSAR_SWS_FlexRayISOTransportLayer.pdf
[4] Specification of FlexRay Interface
AUTOSAR_SWS_FlexRayInterface.pdf
[5] Requirements on Runtime Environment
AUTOSAR_SRS_RTE.pdf
[6] Requirements on Communication
AUTOSAR_SRS_COM.pdf
[7] System Template
AUTOSAR_TPS_SystemTemplate.pdf
[8] Requirements on Acceptance Tests
AUTOSAR_ATR_Requirements.pdf
[9] Requirements on AUTOSAR Features
AUTOSAR_RS_Features.pdf
Acceptance Test Specification of Communication via bus, No.666, AUTOSAR R21-11(304) CP

Acceptance Test Specification of Communication via bus, No.666, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/tests/1-2/AUTOSAR_ATS_CommunicationViaBus.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|AT |Acceptance Test
|CAN |Controller Area Network
|ECU| Electronic Control Unit
|LT| Lower Tester
|NM| Network Management
|PCO |Point of Control and Observation
|PDU| Protocol Data Unit
|RfC| Request for Change
|Rx |Reception
|SUT| System Under Test
|SWC |Software Component
|TCP |Test Coordination Procedures
|Tx| Transmission
|UT |Upper Tester
|LdCom |Large Data COM
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)
Requirements and Specifications of Communication  should be listed.
Specification on test methods and test standards should be listed.
Zabbixサーバ構築メモ

# Zabbixサーバ構築メモ

とん挫したけど、Zabbixサーバの構築をやってみたのでそのメモ
https://www.zabbix.com/jp/download?zabbix=6.0&os_distribution=rocky_linux&os_version=8&db=mysql&ws=nginx

# 環境

- OS  : RockyLinux8
- WEB : nginx 1.22
- DB  : MySQL 8.0

## 必要なもの

Zabbixインストールする前に、WebサーバとDBサーバが必要である。
→WebはApache or NGIN, DBはMySQL or PostgreSQLを選ぶことになりそう。

インストール時にApacheで動かすかNGINXで動かすか,MySQLを使うかPostgreSQLを使うかによって
モジュールを使い分けられるようにしてくれているので便利。

## 手順

### インストールrpmパッケージをインストール

```
# rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
# dnf clean all
```

### rpmからdnfインストール

```
# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent
```

### DB に zabbix 用のユーザやDBを作成

```SQL
# mysql -uroot -p
password
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
mysql> create user zabbix@localhost identified with mysql_native_password by 'パスワード';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;
```

ユーザ作成の時、`mysql_native_password`のプラグインとしてパスワードを指定しないと、
後でZabbixの設定をブラウザから行うときに、PHPがMySQLにアクセスできなくなる。

MySQLのユーザのpluginがデフォルトでは`caching_sha2_password`になっていて、
これは古いPHPとかだと対応していないことがあるため。

↑ソースインストールしたローカルのMySQLサーバの設定の話。
AuroraとかCloud SQLはこの辺の設定は緩めに設定されてるっぽいから気にしなくていいかも？
※確認してないから憶測

### DBのZabbix構築コマンド実行

どうやらdnfでzabbix一式をインストールしたときに、
`/usr/share/doc/zabbix-sql-scripts`っていうのがインストールされているみたい。
ここにあるsql.gzを実行すれば自動でMySQLをZabbix用に構築してくれるみたい。

```
# zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
```

### Zabbixサーバ設定

`/etc/zabbix/zabbix_server.conf`の`DBPassword`のコメントアウトを外し、作成したzabbixのユーザのパスワードを入力しておく

### nginx設定

こっちも、zabbix一式インストールしたときに、`/etc/nginx/conf.d/`配下にzabbix.confが自動的に作られている。
nginx.confから、conf.d/*.confを読み込むようにincludeしてあげて、

```
# listen 80;
# server_name example.com;
```

↑ここの部分をコメントアウト外して、
`server_name`はわかりやすく`localhost`とかにしておく

本構築ならSSL化もしてちゃんとドメイン書く。

### 再起動

最後に全部再起動して完了!

```
# systemctl restart zabbix-server zabbix-agent nginx php-fpm
# systemctl enable zabbix-server zabbix-agent nginx php-fpm
```

## フロントエンド設定

`http://IPアドレス`にアクセスしたら、Zabbixの設定画面に飛ぶ。
画面の指示に従っていろいろ設定を詰めていく。

ここでt2.microインスタンスがメモリ不足でぶっ壊れたので終了。
ZabbixよりPrometheusのほうがどちらかというと極めたいので、
Zabbixはこの辺にして終わる。

# 感想

Zabbixサーバを初めてインストールしてみた(構築完成してないけど)。
気になったのは、php(php-fpm?)がMySQL8.0と相性悪く、mysqlのzabbixユーザ関連で躓くことが多かったことかな。
パスワードのルールが厳しくなってたり、ハッシュアルゴリズムに対応してなかったり。
この辺りはマネージドのDB使えばあまり気にならないかもしれない。
(少なくともCloudSQLのMySQL8.0ではユーザのパスワードで複雑なものは要求されなかった)

インストール自体は公式のインストール手順が単純明快でよかった。
Rockyに対応しているのも〇
塞がっているportを解放する

firebaseのエミュレーターを使っているのですが、エラーでエミュレーターが落ちた時にportが塞がりっぱなしで再度立ち上げることができない事象が頻繁に起きました。

毎回portを変えても解決しますが、めんどくさいのでportを解放しましょう。

# 解決法
```bash
$ lsof -i:8000 -P
// java   5558  User   41u  IPv6 0x100000000000     0t0  TCP localhost:8000 
```
この5558プロセスをkillすればOK

ちなみに
`lsof`は現在開いているファイルを一覧表示するコマンドです
-iオプションはportを指定
-Pオプションはport番号を表示
Rails6 fields_forとhidden_fieldを解説

[Rails DM機能4](https://qiita.com/W2020T/items/dc10ad85fb9e6fa72c29)のコードで気になった部分があったので掘り下げていきます。
## 解説するコード
```rooms/show.html.erb
 <%= form_for @room do |f| %>
 <%= fields_for @entry do |e| %>
 <%= e.hidden_field :user_id, :value=> @user.id %>
 <% end %>
  <%= f.submit "チャットを始める" %>
  <% end %>
```
## fields_forの解説
form_for内で異なるモデルを編集できるようになります。
<form>タグを実際に作成せずにフォームとオブジェクトを同様に紐付けできます。

##  hidden_fieldの解説
第一引数にはパラメータで渡すname属性を指定します。今回の第一引数はuser_idとなります。
第二引数にはvalue属性を指定します。user_idに対して@user.idとする。
@user.idはusersテーブルのid（つまりログインしているユーザーのid)をvalueに指定しています。
hidden_fieldで値をパラメーターで渡すときはname属性とvalue属性を指定します。
アクションでhidden_fieldで渡されたパラメーターを受け取ることができます。

## 引用記事
[Railsドキュメント](https://railsdoc.com/page/fields_for)
[Rails Guide](https://railsguides.jp/form_helpers.html#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E7%B5%90%E3%81%B3%E4%BB%98%E3%81%91%E3%82%8B-fields-for%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)
[hidden_fieldの使い方](https://qiita.com/yukiweaver/items/8e1e01fd6dcadf36d420)
[]()
[]()
[]()
[]()
DockerのMySQLでローカルのdumpファイルを読み込ませる方法

## 前提
- dumpファイルがPCのローカルに保存されていること

## ローカルにあるdumpファイルをdockerコンテナ内にコピーする

①dumpファイルがあるディレクトリに移動

②下記コマンドを実行
```
docker cp (dumpファイル名) (コンテナ名):/(コピー先のdumpファイル名)

# 例えばこんな感じ
docker cp ~/Desktop/dump.sql mysql_db_1:/dump.sql
```
- dumpファイル名：ローカルのどこにあるか指定。正確なパスはFinderから確認できる（下記記事参考）

https://qiita.com/chimayu/items/90c9421067d76696a050#mac%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%81%8B%E3%82%89%E3%83%91%E3%82%B9%E3%82%92%E7%A2%BA%E8%AA%8D


- Dockerのコンテナ名：```$docker ps```で```NAMES```欄にあるDBのコンテナ名
- コピー先のdumpファイル名：何でもいい


## MySQLにdumpファイルを読み込ませる
①下記コマンドでDockerのMySQLのコンテナに入る
```
docker exec -it (コンテナ名) bash
```

②dumpファイルを読み込ませる

```
mysql -u (MySQLユーザ名) -p(MySQLパスワード) (dumpファイルを読み込むDB名) < (dumpファイル名)

# 例えばこんな感じ
mysql -u root -ppassword db < dump.sql
```

- MySQLユーザ名、MySQLパスワード：envファイルに大体書いてある
- dumpファイルを読み込むDB名：```show databases;```して表示されるDB名
- dumpファイル名：コピー先のdumpファイル名で指定したもの

## 参考

https://qiita.com/miriwo/items/683ad0fd65cf85cafb6f
Testability Protocol and Service Primitives, No.778, AUTOSAR R21-11(303) CP

Testability Protocol and Service Primitives, No.778, 2021-11

https://www.autosar.org/fileadmin/standards/tests/1-2/AUTOSAR_PRS_TestabilityProtocolAndServicePrimitives.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|IUT| Implementation Under Test that is located inside the DUT
|SP |Service Primitive (for triggering actions or observations on the IUT)
|UT| Upper Tester (Part of TS that contains the SPs located within the DUT on top of the IUT)
|TSB|Test Stub (same as UT)
|TM| Testability Module (same a UT)
|LT| Lower Tester (Part of TS located outside the DUT on bottom of the IUT)
|UC| Upper Test Channel (channel between UT and IUT within the DUT)
|LC |Lower Test Channel (channel between LT and IUT that can be accessed from outside the DUT)
|CC |Control Channel (The channel between TS and UP used to call SPs that can be accessed from outside the DUT)
|TS| Test System (The system that contains the test cases and control for UT and LT)
|EVB |Event Bit (Protocol field that is set in case of an event)
|GID| Group Identifier (Protocol field: determines a group of services)
|PID |Service Primitive Identifier (Protocol field: determines a service)
|TID |Type Identifier (Protocol field: to determine the message type)
|RID |Result Identifier (Protocol field: similar to a Return Error Code)
|DUT| Device Under Test (contains the UT and IUT that is tested)
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] AUTOSAR SOME/IP Protocol Specification
AUTOSAR_PRS_SomeIPProtocol.pdf
[2] AUTOSAR Standard Datatypes
AUTOSAR_SWS_StandardTypes.pdf
[3] IETF RFC 793 “TRANSMISSION CONTROL PROTOCOL”
Safety Requirements for AUTOSAR Adaptive Platform and AUTOSAR Classic Platform, No.986, AUTOSAR R21-11(302) FO

Safety Requirements for AUTOSAR Adaptive Platform and AUTOSAR Classic Platform, No.986, 2021-11

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_RS_Safety.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

## 用語(terms)
|Term|Description|
|:--|:--|
|PHM |Platform Health Management
|EM| Execution Management
|SM| State Management
|OS| Operating System
|PER |Persistency
|CM |Communication Management
|UCM |Update and Configuration Management
|S2S |Signal to Service
|SG |Safety Goal
## 英日
日本語は仮訳

T.B.D.

## 参考(reference)

[1] ISO 26262:2018 (all parts) – Road vehicles – Functional Safety
http://www.iso.org
[2] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[3] Glossary
AUTOSAR_TR_Glossary
[4] Explanation of Safety Overview
AUTOSAR_EXP_SafetyOverview
[5] Main Requirements
AUTOSAR_RS_Main

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 関連文書(Related document)

Safety Requirements for AUTOSAR Adaptive Platform and AUTOSAR Classic Platform, AUTOSAR R22-11, FO, No.986

https://qiita.com/kaizen_nagoya/items/0325c16e30afa84a2e9b

# 文書履歴(document history)
ver. 0.01 初稿 20221229
ver. 0.02 URL追記　20221229
Requirements on AUTOSAR Network Management, No.927, AUTOSAR R21-11(301) FO

Requirements on AUTOSAR Network Management, No.927, 2021-11

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_RS_NetworkManagement.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|NM |Network Management
|PN |Partial Network
|PNI| Partial Network Information
|NM Message| Refers to the payload transmitted on the bus. It contains the User Data as well as the Control Bit Vector and may contain the Source Node Identifier.
|NM Node| A ECU (electornic controll unit) which is connected to one or more
|NM clusters|NM cluster Set of NM nodes coordinated with the use of the NM algorithm.
|NM instance| A NM instance represents the current status of one NM cluster inside one NM node

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[2] Glossary
AUTOSAR_TR_Glossary
[3] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture
Explanation of System Health Monitoring, No.993, AUTOSAR R21-11(298) FO

Explanation of System Health Monitoring, No.993, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/foundation/21-11/AUTOSAR_EXP_SystemHealthMonitoring.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|SHM |System Health Monitor
|HI| Health Indicator
|SOME/IP| Scalable service-Oriented MiddlewarE over IP
|PHM |Platform Health Management
|SM| State Management
|BswM| Basic Software Mode Manager
|WdgM| Watchdog Manager
|GSS |Global Supervision Status
|LSS |Local Supervision Status
|Health Indicator| Health Indicator provides an evaluation metric of current system performance with regard to safety requirements.
|System Health Monitor| System Health Monitor component allows sytem wide coordination of error handling across several Classic, Adaptive or any third party platforms.
|Global Supervision Status| Status that summarizes the Local Supervision Status of all Supervised Entities.
|Local Supervision Status| Status that represents the current result of Alive Supervision, Deadline Supervision and Logical Supervision of a single Supervised Entity.
|Alive Supervision |Kind of supervision that checks if a Supervised Entity executed in a correct frequency.
|Deadline Supervision|Kind of supervision that checks if the execution time between two Checkpoints is within minimum/maximum time limit.
|Logical Supervision| Kind of online supervision of software that checks if the software (Supervised Entity or set of Supervised Entities) is executed in the sequence defined by the programmer (by the developed code).
|Health Channel |Channel providing information about the health status of a (sub)system. This might be the Global Supervision Status of an application, the result any test routine or the status reported by a (sub)system (e.g. voltage monitoring, OS kernel, ECU status).
|Checkpoint |A point in the control flow of a Supervised Entity where the activity is reported.
|Supervised Entity| A software entity which is included in the supervision. A Supervised Entity denotes a collection of Checkpoints within a software component. There may be zero, one or more Supervised Entities in a Software Component. A Supervised Entity may be instantiated multiple times, in which case each instance is independently supervised


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Requirements on Health Monitoring
AUTOSAR_RS_HealthMonitoring
[2] Specification of Health Monitoring
AUTOSAR_ASWS_HealthMonitoring
[3] Specification of Watchdog Manager
AUTOSAR_SWS_WatchdogManager
[4] Specification of Basic Software Mode Manager
AUTOSAR_SWS_BSWModeManager
[5] Specification of Abstract Platform
AUTOSAR_TPS_AbstractPlatformSpecification
PHP・Rubyのスタックトレースの出し方

## スタックトレース
スタックトレースとは、実行中のコンピュータプログラムにエラーが発生した際に、直前に実行していた関数やメソッドなどの履歴を表示すること。
ログよりも詳しいエラー箇所を特定することができる。

https://e-words.jp/w/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9.html

## Ruby
ドキュメントには載ってないが、```join("\n")```しないとかなり見づらいのでした方がいい。
```ruby
def methd
  raise
end

begin
  methd
rescue => e
  logger.error e.backtrace.join("\n")
end
```

https://docs.ruby-lang.org/ja/latest/method/Exception/i/backtrace.html

## PHP
```php
debug_print_backtrace();
```

https://www.php.net/manual/ja/function.debug-print-backtrace.php
PyQtのconnect()の引数にはlambdaを使うべき パート２

## 結論

PyQtのconnect()の引数にはlambdaを使うべき。特に、QtCore.pyqtSlot()をdecorateしている場合。  
この記事は[PyQtのsignalとconnectとlambda式について](https://qiita.com/Kanahiro/items/8075546b2fea0b6baf5d)を補強する情報として、なぜconnect()の引数のlambda式を使うべきなのかの具体例を例示しています。

## はじめに

騙されたと思って以下のコードをコピペして実行してみてください。

```python
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QPushButton, QVBoxLayout, QApplication, QWidget


def Error_Handling(func):
    def Try_Function(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except TypeError as e:
            print(f"{func.__name__} wrong data types. ", e)
        except Exception as e:
            print(f"{func.__name__} has any Error. ", e)
    return Try_Function


class Window(QWidget):
    def __init__(self):
        super().__init__()
        b1 = QPushButton('1-f1')
        b1.clicked.connect(self.f1)
        b2 = QPushButton('2-f2')
        b2.clicked.connect(self.f2)
        b3 = QPushButton('3-f1(lambda)')
        b3.clicked.connect(lambda: self.f1())
        b4 = QPushButton('4-f2(lambda)')
        b4.clicked.connect(lambda: self.f2())
        layout = QVBoxLayout(self)
        layout.addWidget(b1)
        layout.addWidget(b2)
        layout.addWidget(b3)
        layout.addWidget(b4)
        self.setLayout(layout)

    @QtCore.pyqtSlot()
    @Error_Handling
    def f1(self):
        print(self.sender().text())
        return self.name

    @QtCore.pyqtSlot()
    @Error_Handling
    def f2(self):
        print(self.sender().text())
        return self.name


app = QApplication([])
window = Window()
window.show()
window.raise_()
sys.exit(app.exec_())
```

ボタンを上から下に押していった出力が以下の通り。

```bash
1-f1
f1 has any Error.  'Window' object has no attribute 'name'
2-f2
f1 has any Error.  'Window' object has no attribute 'name'
3-f1(lambda)
f1 has any Error.  'Window' object has no attribute 'name'
4-f2(lambda)
f2 has any Error.  'Window' object has no attribute 'name'
```

おかしいのは、"2-f2"を押した際の挙動。"f2"をconnectしたはずの"2-f2"を押しているのに、なぜか"f1"が実行されている。

## 解決策

上記の"2-f2"の挙動を解決するには、lambda式を使えばよい。

## 原因の推測

公式のドキュメントをろくに読んでいないので、(見つかるのは[これ](https://doc.qt.io/qtforpython-5/PySide2/QtCore/Slot.html)ぐらいで"PyQt5"のドキュメントではない)、あくまで予想です。  

挙動から推測すると、Class Objectの生成時のconnect()にQtCore.pyqtSlot()でdecorateされた関数が引数として与えられたときに、"1-f1"ではQtCore.pyqtSlot()(*)というlambda式で構成された関数が定義され、その引数のDefault値が"f1"として作られる。その後、"2-f2"でも同様にQtCore.pyqtSlot()(*)というlambda式で構成された関数が定義されるが、そのときに引数のDefault値が"f1"のままになっている。なぜDefault値が"f1"のままかというと、QtCore.pyqtSlot()が引数なしで呼び出され結果、最初に与えられた引数がそのまま使いまわされたのではないか？と邪推しています。connect()の引数をlambda式で与えれば、event発生時にlambda式として評価されるまで、入れ子状の関数の列として維持されるため、正しい関数が呼び出される。

どうも、QtのSlotとPythonを組み合わせた結果として得られる挙動に見えるためドキュメントを調査したいのだが、あるのはQtのドキュメントのみで、PyQt5のドキュメントがなかなか見つからない。。。

<!-- "Error_Handling"をなくすとErrorがなければ、実行できるが "self.sender()" が取得できない。 -->
jetson nanoでPiのHQcamera、IMX477を使用する。

# Jetpack4.6
Jetpack4.6以降はドライバは標準で入っている。
ただし、sudo /opt/nvidia/jetson-io/jetson-io.pyでドライバを変更する必要がある。
imx477とimx219を同時に使用する場合は、J13にIMX477を、J49にIMX219を接続する。

Rapberry PiのHQcameraを使用する場合は、R8(20Ω?)が不要のようだ。
外した後も、Pi3B+では利用できた。元に戻せないので、再確認できない。
Arducamのカメラは、PiもNanoも動作保証されているようだ。

# Jetpack4.6以前
Jetpack4.5、4.4ではRidgerunのドライバが必要
4.5では動作確認済み。

https://developer.ridgerun.com/wiki/index.php?title=Raspberry_Pi_HQ_camera_IMX477_Linux_driver_for_Jetson#Installing_the_Driver_-_Option_A:_Debian_Packages_.28Recommended.29


Arducamのドライバインストール方法を間違ったJetpackに入れるとブートできなくなった。

https://www.arducam.com/docs/camera-for-jetson-nano/native-jetson-cameras-imx219-imx477/imx477-how-to-install-the-driver/

# Linix for Tegraと Jetpackの関係
|Linux for Tegra|JetPack|
|:-:|:-:|
|L4T R34.1.1|JetPack5.01DP(Xavier)|
|L4T R32.6.1|JetPack 4.6|
|L4T R32.4.3|JetPack 4.4?|

# Jetpackの確認方法
`ls /lib/modules`
|JetPack|ディレクトリ|
|:-:|:-:|
|JetPack5.01DP(Xavier)|/lib/modules/5.10.65-tegra|
|JetPack4.6|/lib/modules/4.9.253-tegra|
|JetPack4.5|/lib/modules/4.9.201|

**Jetpack4.6と4.6.3は同じ


`uname -a`
|JetPack|値|
|:-:|:-:|
|JetPack5.01DP(Xavier)|Linux hostname 5.10.65-tegra #1 SMP PREEMPT Mon May 16 20:58:07 PDT 2022 aarch64 aarch64 aarch64 GNU/Linux|
|JetPack4.6.3|Linux hostname 4.9.253-tegra #1 SMP PREEMPT Sat Feb 19 08:59:22 PST 2022 aarch64 aarch64 aarch64 GNU/Linux|
|JetPack4.6|Linux hostname 4.9.253-tegra #1 SMP PREEMPT Wed Apr 20 14:25:12 PDT 2022 aarch64 aarch64 aarch64 GNU/Linux|
|JetPack4.5|Linux hostname 4.9.201 #4 SMP PREEMPT Wed Feb 3 12:11:04 CST 2021 aarch64 aarch64 aarch64 GNU/Linux|

`cat /etc/nv_tegra_release`
|JetPack|値|
|:-:|:-:|
|JetPack5.01DP(Xavier)|# R34 (release), REVISION: 1.1, GCID: 30414990, BOARD: t186ref, EABI: aarch64, DATE: Tue May 17 04:20:55 UTC 2022|
|JetPack4.6.3|# R32 (release), REVISION: 7.3, GCID: 31982016, BOARD: t210ref, EABI: aarch64, DATE: Tue Nov 22 17:30:08 UTC 2022|
|JetPack4.6|# R32 (release), REVISION: 7.2, GCID: 30192233, BOARD: t210ref, EABI: aarch64, DATE: Wed Apr 20 21:34:48 UTC 2022|
|JetPack4.5|# R32 (release), REVISION: 5.1, GCID: 26202423, BOARD: t210ref, EABI: aarch64, DATE: Fri Feb 19 16:45:52 UTC 2021|
cscの作法 その180

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
datatableを抽出してcsvに落とせ。

# 方針

StreamWriter、String.Format、使う。

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data.OleDb;
using System.Data;
using System.IO;
using System.Text;

class form1: Form {
	private Button button1;
	private DataGridView gd0;
	private DataTable dt;
	private OleDbConnection con;
	form1() {
		Text = "DataGridView";
		ClientSize = new Size(700, 400);
		this.button1 = new Button();
		this.button1.Location = new System.Drawing.Point(540, 60);
		this.button1.TabIndex = 0;
		this.button1.Text = "test";
		this.button1.Click += new System.EventHandler(this.button1_Click);
		this.Controls.Add(this.button1);
		this.gd0 = new DataGridView();
		this.gd0.Location = new System.Drawing.Point(30, 30);
		this.gd0.Size = new Size(500, 370);
		this.Controls.Add(this.gd0);
		con = new OleDbConnection();
		con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb;";
		con.Open();
		OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM sisyutu;", con);
		dt = new DataTable();
		oda.Fill(dt);
		gd0.DataSource = dt;
		//con.Close();
	}
	private void button1_Click(object sender, System.EventArgs e) {
		SaveFileDialog dialog = new SaveFileDialog();
		DialogResult result = dialog.ShowDialog();
		if (result == DialogResult.OK)
		{
			StreamWriter CsvWriter = new StreamWriter(dialog.FileName, false, Encoding.GetEncoding("shift-jis"));
			DataRow[] dRows = dt.Select("項目 = '雑費'", "金額 DESC");
			foreach (DataRow row in dRows)
			{
				CsvWriter.WriteLine(String.Format("{0},{1},{2},{3}", row[1], row[2], row[3], row[4]));
			}
			CsvWriter.Close();
		}
		Console.WriteLine("ok");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
npmコマンドまとめ

## はじめに
取りあえず使うのってこれくらい？
他につかたいコマンドがあれば都度調べるなり、付け足して使うなりしてください

## ローカル
**npmを初期化**
`npm init` `npm init -y`
**install**
`npm install <package>`
**localのcommandを呼び出す**
`./node_modules/.bin/コマンド`
**簡単に呼び出す**
`npx コマンド`
**packageをdevDependenciesに記録する**
`npm install --save-dev <package>`
`npm i -D <package>`*省略記法*
**uninstall**
`npm uninstall <package>`
**dependenciesも消す**
`npm uninstall --save <package>`
**devDependenciesも消す**
`npm uninstall --save-dev <package>`
**install済みのpackageを表示**
`npm list`

**特質事項**
過去のnpmのversion`(v 5.0.0未満)`
`npm install --save パッケージ名`
のように `--save`をつけることで、`package.json`の`dependencies`にpackage名を記述させていた現在はデフォルトで着くので不要

## グローバル
**globalにinstall**
`npm install -g <package>`
**globalのものをuninstall**
`npm uninstall -g <package>`
**globalのpackageを表示**
`npm list -g`

## npm自体のversionをupgradeする
```js
// npm自体をupgrade
npm install -g npm

// 下記はnpmのpackageをupgrade
npm upgrade <package>
```

## 特質事項
globalにインストールしたpackageは他の言語同様に言語のversionに紐づいていそう。
他のversionに切り替えるとglobalは消えるかも
`npm list -g`でglobalのパッケージ一覧を表示すると、同時にインストール先も表示できる

## 終わりに
1年ほど前に初めてJavaScriptを学習しました。というか初めてのプログラム言語がJavaScript
そこからRuby/Railsでポートフォリオを作って、今の会社に勤めると同時にpyhotnの学習開始。
落ち着いたので、JavaScript/TypeScript/Reactの学習に戻ってきたわけですが、PC内に当時右も左もわからずゴニョゴニョしていたのであろう残骸がありました笑。
Nodeはよくわからないpathから取ってきていてnodebrewのnode使えてなかったし、homeディレクトリにpackage.jsonがありました。 でもglobalは綺麗でした笑
１年間他の言語の勉強をする中で、shellの扱いにも随分と慣れたんだなぁと感動しちゃいましたね。

こうやって過去の遺物を見て成長を実感できるのも良いですねぇ
carrierwaveで動的に画像サイズを変更する

## 結論

- 結論としては自作でメソッドを追加し、そこから標準の加工メソッドにサイズを指定して渡すようにする（今回はmodel classに値を渡してそこから取得するようにしました）

```app/models/user.rb
class User < ApplicationRecord
  mount_uploader :image, ImagesUploader

  attr_accessor :width, :height
end

```

```app/uploaders/images_uploader.rb
class ImagesUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  ## 独自メソッドでサイズを指定できるメソッドを作成してそれをprocessで呼び出す
  def dynamic_resize_to_fil
    resize_to_fill model.width, model.height
  end

  process :dynamic_resize_to_fil
end

```

## はじめに

Railsで画像アップロードする機能を実装するときに使われるcarrierwaveですが、いざ実装しようとすると場合によっては複数箇所で使う場所がありその都度画面によって画像サイズを変えたい要件があったりします(ユーザーの小さいアバターやサムネイルのように様々な用途でサイズを変えたい etc...)。

そんなときは上記のような方法でuploaderで良い感じにするとこんな形で動的にサイズを変更することができます。

![carrierwave_sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/62a8b269-4a92-561a-8161-8a8836d2ab6f.gif)


## 気をつけること

uploadarでそのmodelの値を参照する実装を進めるときはそのimageとサイズを決めるための値を同時にinitializeするとuploadarのメソッドが走りmodelの値を取れないです。

なので画像を入れる前にあらかじめサイズを決める値をインスタンスに入れました。

```
...
@user = User.new(user_params[:size])
@user.image = user_params[:image]
if @user.save
...
```

## 終わり

今回はcarrierwave内で動的に画像サイズを変更する方法を紹介しました。
実装したRailsサンプルアプリは以下に公開しておきます。

- https://github.com/saku888/rails_sandbox_app/tree/tips/1/dynamic-image_size-carrierwave
M5Paper で温度と湿度を測る

こちらを参考にしました。
[SHT30](https://docs.m5stack.com/en/api/m5paper/sht30)

![IMG_20220602_194329.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fb9bab4f-5cfe-432d-b256-ceca793c8560.jpeg)


```text:temp_humidity.ino
// ---------------------------------------------------------------
//	temp_humidity.ino
//
//					Jun/02/2022
// ---------------------------------------------------------------
#include <M5EPD.h>

char temStr[10];
char humStr[10];
float tem;
float hum;

M5EPD_Canvas canvas(&M5.EPD);
// ---------------------------------------------------------------
void setup(){
    M5.begin();
    M5.SHT30.Begin();
    M5.EPD.Clear(true);
    canvas.createCanvas(960, 540);
    canvas.setTextSize(5);
}

// ---------------------------------------------------------------
void loop(){
    M5.SHT30.UpdateData();
    tem = M5.SHT30.GetTemperature();
    hum = M5.SHT30.GetRelHumidity();
    Serial.printf("Temperature: %2.2f*C  Humidity: %0.2f%%\r\n", tem, hum);
    dtostrf(tem, 2, 2 , temStr);
    dtostrf(hum, 2, 2 , humStr);
    canvas.drawString("Temperature:" + String(temStr) + " *C", 100, 100);
    canvas.drawString("Humidity:" + String(humStr) + " %", 100, 200);
    canvas.pushCanvas(0,0,UPDATE_MODE_A2);
    delay(1000);
}

// ---------------------------------------------------------------
```

Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5fa1bde0-53ac-3922-79d6-244f62005215.png)

シリアルへの出力

```text
$ cu -s 115200 -l /dev/ttyACM0
Connected.
���������������������������������������������������������������������������������������Temperature: 28.21*C  Humidity: 49.39%
Temperature: 28.24*C  Humidity: 49.43%
Temperature: 28.25*C  Humidity: 49.43%
Temperature: 28.24*C  Humidity: 49.44%
Temperature: 28.25*C  Humidity: 49.47%
Temperature: 28.24*C  Humidity: 49.46%
```
昔作ってたクソVBAを紹介する

# はじめに

私は文系の学部出身で、少なくとも現在は職業プログラマーではありません。学生のころ縁故でコーディングができるアルバイトをやらせてもらい、はじめて実用的なプログラムを書いたのはVBAでした。ひとは孵って最初に使った言語を親と思って付いていく習性があって、VBAでいろんなものを作った記憶があります。

この記事では、私がプログラミングを始めてから日が浅い頃に書いた、役に立たないけど愛おしいプログラムたちをご紹介します。

# 画像デコーダー

https://twitter.com/U_1F992/status/1530185805855002625

ビットマップ画像ファイル `*.bmp` を解析して各画素の色を取得し、セルを小さな正方形に整形して背景色で画像を表現しています。

こんなエクストリームな用途でないと再現できないことですが、あるブックに設定できる背景色数には限度があるようで、フルカラーの写真などを読み込ませようとするとエラーが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/82cf7001-ca74-927d-16cb-20e66c3c5276.png)

# 迷路ソルバ

https://twitter.com/U_1F992/status/1530189143216517121

迷路生成と探索です。これもセルの背景色で表現しています。

たしかアルゴリズムの勉強をしていて作りました。画面の更新を切れば生成速度は早くなるんですが、うねうね動いて面白い方を優先しました。その代わりステータスバーで進捗を見せています。

# MIDIプレイヤー

https://twitter.com/U_1F992/status/1530191946420875264

再びバイナリファイルの解析です。ここではMIDIファイル `*.mid` から音符や発音タイミング情報をシートに書き出し、それを順番に送ることで再生しています。マルチトラック対応なのでピアノ曲だけでなく、オーケストラでも大丈夫です。

https://twitter.com/U_1F992/status/1532300227662581763

がっつりWindowsAPIプログラミングです。VB6の資料をたくさん読みました。この頃あたり、並行してVB.NETを書いていました。いま日曜プログラマーとしてできることの大体はこの時期に身に着けたと思っています。

# ライフゲーム

https://twitter.com/U_1F992/status/1530197313913692161

2次元セルラーオートマトン、いわゆるライフゲームです。虹色なのはHSVとRGBの相互変換を書いたからです。この時調べたサンプルコードをきっかけにJavaScriptを書き始めたような。

とりあえず乱数で初期値を与えています、十分見ていて面白いです。

~~ところで、VB6系の疑似乱数生成器は作りが粗悪なのはご存知でしょうか。私の取り出し方にも問題があるのですが、VBA組み込みの`Randomize`と`Rnd`を使うと、初期値は同じパターンの繰り返しになります。~~

**6/10 訂正します。**

https://qiita.com/U-1F992/items/bc1083b84765ece88a00

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/2ecad8a6-c458-a006-48d4-97422157a023.png)

上の動画では.NETの`System.Random`を借りて来ています。

# おわりに

以上、VBAが大好きだった頃に書いたクソプログラムたちでした。VBAが親だとするなら、さしずめ今は反抗期といったところ。しばらく書いていませんが、どこか懐かしくて面白いプログラミング言語です。

上記のプログラムはいずれもGitHubに置いてあります。はじめたての頃作ったもので今では見てられないので、リンクは特に貼りません。気になった方は他の記事から辿ってみてください。
【まとめ】npm install と npm audit とnpm-check-updates

## npm install の概要

npm install を実行すると、 package.json に記載したパッケージと、
そのパッケージを使用するために必要な関連モジュールをまとめてインストールしてくれる。

なお、この際にpackage-lock.jsonが自動作成され、
実際にインストールされたモジュールのバージョン等が記載される。

package-lock.jsonが存在している状態で再度 npm install を実行した場合、package.json ではなく package-lock.jsonを元にインストールが実行される。
package-lock.jsonの存在意義としては、チームで開発する場合などに関連モジュールのバージョンまで揃えられる、という点が主かと思われる。
そのあたり下記記事様がわかりやすく解説してくださってます。

https://qiita.com/sasao3/items/b794c1e44715bb6f834f

## パッケージのセキュリティに問題がある場合

上記 npm install でインストールしたパッケージやモジュールのセキュリティに問題がある場合、
以下のように`npm audit fix`で解決するか`npm audit`で詳細を確認するよう勧めてくれる。
```
found 1 high severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details
```
audit fixを行った場合、package.jsonに書かれている範囲内で
脆弱性をクリアにするために必要な関連パッケージやモジュールのアップデート等を行ってくれるらしい。
（アップデートされた内容はpackage-lock.jsonに書き込まれる。）

audit fixを行っても脆弱性が残っている場合、
`npm update`や`npm dedupe`で解決できる可能性がある。
そのあたり含めて下記記事様がかなり詳しくまとめてくださってます。

https://qiita.com/riversun/items/7f1679509f38b1ae8adb

audit fixやupdateやdedupeを行ってもまだ脆弱性が残っている場合は
package.jsonやpackage-lock.jsonに書かれている内容を修正する必要がある。

この際、手動でpackage.jsonを更新する方法と
コマンドで一括変更する方法がある。

手動での更新方法については下記記事様がわかりやすく解説してくださってます。

https://ichi-station.com/npm-audit-manual-fix/

ちなみに、例えばglob-parentというモジュールに脆弱性があることがわかった場合
```
npm ls glob-parent
```
上記コマンドを実行すると、下記画像のような形で依存関係を確認することができる。
![スクリーンショット 2022-06-03 120841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985396/5e3788b1-4129-0f46-b669-4aebff02dbb8.png)
## npm-check-updates で一括アップデート

npm-check-updatesというライブラリを使用すると
package.jsonを一括で最新のものにアップデートできる。
下記記事様がわかりやすくまとめてくださってます。

https://hirooooo-lab.com/development/npm-check-updates/

メジャーバージョンを固定して、マイナーバージョンのみ更新することもできるとのこと。
下記記事様がわかりやすくまとめてくださってます。

https://qiita.com/wm-ytakano/items/bade7c6ab9aba97ff100

※全てのパッケージを一気に最新までアップデートするとコード書き換えの必要が大量に発生してしまうかもしれないので注意。


ちなみに、
上記記事中のncuコマンドを実行した際に
```
Hmmmmm... this is taking a long time. Your console is telling me to wait forinput
on stdin, but maybe that is not what you want.
Try specifying a package file explicitly with --packageFile package.json.
```
このようなエラーが出た場合は、エラーメッセージにも書かれてますが
```
ncu --packageFile package.json
```
上記のようにpackage.jsonを明示的に指定するとうまくいくようです。


## audit fix --force で一括アップデート

`npm audit fix`は、上述した通りpackage.jsonに書かれている範囲内でモジュールのアップデート等を行ってくれるが、`npm audit fix --force`コマンドを実行すると、脆弱性をクリアにする形でpackage.jsonの書き換えが行われる。
ただし、場合によっては意図しないパッケージのバージョンダウンなどが発生してしまうこともあるようなので、どのような書き換えがなされたのかをpackage.jsonを確認して実行するなどの注意が必要。
【Rails】csvファイルをインポート→整形してDBに保存する

# やりたいこと
csvファイルをアップロードして、必要なデータを抽出し、DBに保存
データが重複している際は既存データにアップロードしたデータを上書きする

# 前提条件
rails7系
DB作成済み

# 実装手順

### ① gemを追加

```Gemfile
gem 'roo'
```

Gemfileにcsvを読み込むためのgemを追加し、bundle installする。

### ② ルーティングの設定

```config/routes.rb
get    'data_upload'          => 'data_upload#index'
post   'data_upload'          => 'data_upload#create'
```

### ③ 標準ライブラリを追加
```config/application.rb
require 'csv'
```

### ④ viewにアップロード用のformを作成
Rails5.1より導入されたform_withを使ってアップロード用のフォームを作成します。
指定したpathに対してpostリクエストを投げます。

```app/views/data_upload/index.html.erb
<%= form_with url: data_upload_path do |f| %>
  <%= f.file_field(:upload_file) %>
  <%= submit_tag "インポートする" %>
<% end %>
```

### ⑤ controllerにactionを追加
```app/controllers/data_upload_controller.rb
class DataUploadController < ApplicationController

  # get => data_upload
  def index
    upload_file = params[:upload_file]
  end
  
  # post => data_upload
  def create
    if params[:upload_file].present?
      upload_file = params[:upload_file].tempfile

      # ファイルの内容によってはEncodingErrorが出ますので適宜調整してください
      CSV.foreach(upload_file.path, headers: true, encoding: 'cp932') do |row|

        # recruiting_idがあった場合はレコードを呼び出す、ない場合は新しく作成
        recruiting = Recruiting.find_by(recruiting_id: row["求人ID"]) || Recruiting.new
        recruiting.attributes = convert_csv_to_hash(row)
        recruiting.save
      end
      redirect_to root_path
    end
  end

  private

  # csvの欲しいデータがある列とDBのカラムを指定してデータを入れます。
  def convert_csv_to_hash(row)
    params = {
      recruiting_id: row['求人ID'],
      title: row['求人名(募集職種)'],
      salary: row['給与'],
      office_hours: row['勤務時間'],
      skills: row['必須スキル'],
      place: row['勤務地']
    }
    return params
  end
end

```

# 参考文献
https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4
なぜ !1 なのか？

プロジェクトの古いソースコードを眺めていると次のような記述があった。

```javascript
{
    hoge: !1
}
```

`!1` ！？！？

そのコードを見た時、正直笑いました。
なんでそうなるの？？って。

そして理由を考えてみたのです。
かのプログラマーがそう書かないといけなかった理由を……。

### 推測① 短くしたかった

まっさきに思いついたのがこれです。
`false` ５文字に対して、 `!1` ２文字ですからね。

わからなくない。
わからなくはないんだけど……なぜ！　なぜ `0` にしない。
１文字いけただろ！

そこ妥協すんなよ！！

ということで、この推測は却下しました。

### 推測② 俺JSに詳しいんだぜって言いたかった

ほら、あるじゃないっすか！
三項演算子覚えたプログラマーが、やたらめったら三項演算子使っちゃうやつ。
めっちゃ見にくいからやめれ！！！

って感じで、 JavaScript の `1` が `true` として評価されるのを覚えた人が書いた、と。

これは普通にありそうだ。
……でもなぜ `0` にしない！！　同じタイミングで `0` が `false` になること覚えたはずだろ！
そっち使えよ！！

ということで、この推測は却下しました。

### 推測③ Minify したコードからコピペしてきた

同じコードを見ていた人と会話していたのですが、

「自力でミニマムしたかったんじゃない？」
「ミニマム……ああ Minify のこと？　そんなの自力でするわけ……はっ！！！」

僕は気づいてしまったのです。
Minify されたソースコードからコピペしてきたのではないかと。

気になったので Minify で `false` がどう変換されるのかググったら、やっぱり `!1` になっているみたいでした。
（参考： [minify - Javascript minification why is false replaced with !1 and true with !0 - Stack Overflow](https://stackoverflow.com/questions/20567523/javascript-minification-why-is-false-replaced-with-1-and-true-with-0) ）

そして、 `0` だと整数として扱われるので、 `true` の場合も `!0` のように `!` をつけるとのこと。

かなり有力ですが、この理論だと推測①も復活しそうな気がしてきたぞ……むむむ。

### 結論

よくわからん！
とりあえず他のところ Minify してないんだし `false` と書いてくれ！！

### P.S.

こういう理由があるんじゃね？　って推測してくれる人がいたらコメントくださいなー。
ヘッダ固定テーブル(縦横スクロール)（むりやり）

## DEMO
codepen
https://codepen.io/kkosuke/pen/yLvjGyJ

## イメージ
そのままの状態 |上や左が固定
--|--
![スクリーンショット 2022-06-02 19.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106666/c1c672cb-b657-a302-8d89-dadc8907f292.png)|![スクリーンショット 2022-06-02 19.00.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106666/3d9c2fc8-2442-93fa-a540-cd743ff15345.png)

## 気にしたこと
- position sticky だと作れなかった。
- 上や左を固定で置くために、tableを複数個置いた。
- HTML的には、いいコードではないけど、見た目重視。
- jQueryを使わない。
ご機嫌斜めなリポジトリ

# GIF
![Screen Recording 0004-06-02 at 5.47.09 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304979/ff186083-ea86-ed4f-f8c9-89614ed454cf.gif)

https://github.com/matoruru/-_-
タグ付きテンプレートリテラルを理解したい

## はじめに

MDNによると、

>テンプレートリテラルは非公式にテンプレート文字列と呼ばれることもありますが、文字列リテラルではないので、文字列リテラルが使えるところならばどこでも使えるわけではありません。

恥ずかしながら、文字列リテラルだと思ってました。
MDNを読んでいると日々新しい発見があって面白いです。

## テンプレートリテラルのおさらい

文字列リテラルは、シングルクォートとダブルクォートで文字列を囲みますが、
テンプレートリテラルは、バッククォートで囲みます。

通常の文字列リテラルと違うのは主に2点。

:::note
1.改行できる。
2.プレースホルダーを含めることができる。
:::

## 改行について

```TypeScript
// 文字列リテラル
const hoge: string = "Hello, \nworld!";
console.log(hoge);

// テンプレートリテラル
const fuga: string = `Hello, 
world!`;
console.log(fuga);
```

結果

```
Hello,
world!
Hello,
world!
```

文字列リテラルの場合は、エスケープ記法を用いることで改行していましたが、
テンプレートリテラルはリテラル中で改行可能です。

:::note warn
余談ですが、
テンプレートリテラルでエスケープ記法を用いても結果は同じです。
:::

```TypeScript
const fuga: string = `Hello, \nworld!`;
console.log(fuga);
```

```
Hello,
world!
```

## プレースホルダーを含める

文字列の中にドル記号と波括弧で囲んで値や式を記載できます。


```TypeScript
const a: number = 2;
const b: number = 3;

// 文字列リテラル
const hoge: string = "2+3=" + (a + b) + "\nです。";
console.log(hoge);

// テンプレートリテラル
const fuga: string = `2+3=${a + b}
です。`;
console.log(fuga);
```

結果

```
2+3=5
です。
2+3=5
です。
```

シンタックスシュガーとして使えます。

## タグ付きテンプレートとは

>タグ付きテンプレートは、テンプレートリテラルのより高度な形式です。
タグを使用すると、テンプレートリテラルを関数で解析できます。タグ関数の最初の引数には、文字列リテラルの配列を含みます。残りの引数は式に関連付けられます。
タグ関数は、これらの引数に対して何でも望み通りの操作を実行することができ、加工された文字列を返します。（または、以下の例の一つで示しているように、まったく異なるものを返すこともできます。）
タグに使用される関数の名前は、自由に指定できます。

つまりテンプレートリテラルの前にタグの関数を置き、
値の前処理を行うことができるということです。

ちょっと試してみます。

```TypeScript
function setUser(strings :TemplateStringsArray, id: number) {
    let userName: string = "ゲスト";
    switch (id) {
        case 1:
            userName = "島尻";
            break;
        case 2:
            userName = "山田";
            break;
        case 3:
            userName = "田中";
            break;
        default:
            break;
    }
    return `${strings[0]}${userName}${strings[1]}`;
}

const userId: number = 1;
const result: string = setUser`こんにちは${userId}さん`;

console.log(result); // -> こんにちは島尻さん
```

第一引数のTemplateStringsArrayは、テンプレートリテラルの固定の文字部分を区切った配列となります。
この場合だと、以下のような中身になります。

```
[ 'こんにちは', 'さん' ]
```

そして第二引数で受け取ったuserIdでuserNameを判断し、
引数として受け取ったTemplateStringsArrayの値と、
userNameをテンプレートリテラルで組み立ててreturnしています。

## まとめ
先に結論は出てしまっていますが、テンプレートリテラル前のタグ関数で、
値の前処理を行えるというものでした。

タグ付きテンプレートリテラルは、使いどころも結構限定されるかと思うので、
こんなことができるぐらいで覚えておくと良いかもしれません。

## 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals
Takahashi's Information [AtCoder Beginner Contest 088 C]を数学的に解説

問題は以下を参照
https://atcoder.jp/contests/abc088/tasks/abc088_c

## 概要
3×3 のグリッドがあり、上から i 番目で左から j 番目のマスを (i,j) で表すとき、マス (i,j) には数 ci,jが書かれている。
Ci,jが標準入力として与えられる。
この時以下の命題が成立するかを判定せよ。
Ci,j=ai+bj(1<=i<=3,1<=j<=3)が成り立つ定められた整数a1,a2,a3,b1,b2,b3が存在する・・・①

①が真ならばYesを偽ならばNoを出力せよ。


 <table>
    <tr>
      <td>C1,1</td>
      <td>C1,2</td>
      <td>C1,3</td>
    </tr>
    <tr>
      <td>C2,1</td>
      <td>C2,2</td>
      <td>C2,3</td>
    </tr>
    <tr>
      <td>C3,1</td>
      <td>C3,2</td>
      <td>C3,3</td>
    </tr>
 </table> 
 <table>
    <tr>
      <td>a1+b1</td>
      <td>a1+b2</td>
      <td>a1+b3</td>
    </tr>
    <tr>
      <td>a2+b1</td>
      <td>a2+b2</td>
      <td>a2+b3</td>
    </tr>
    <tr>
      <td>a3+b1</td>
      <td>a3+b2</td>
      <td>a3+b3</td>
    </tr>
 </table>
つまり、上記の表を等しくできるようにai,bjを設定できればYes,できなければNoを出力する。

## 解説
①が成り立つと仮定して矛盾する場合を考える。

①が成り立つと仮定する。
1列目から2列目を引くとどの行でもb1-b2となる。
その為、C1,1-C1,2=C2,1-C2,2=C3,1-C3,2・・・②
また同様に1列目から3列目を引いてもb1-b3になることから
C1,1-C1,3=C2,1-C2,3=C1,1-C3,3・・・③
が成り立つ。
これは列だけでなく行についても同じことが言えるため、同様に
C1,1-C2,1=C1,2-C2,2=C1,3-C2,3・・・④
C1,1-C3,1=C1,2-C3,2=C1,3-C3,3・・・⑤

以上の事から、①が成り立つならば②、③、④、⑤も成り立つ。

:::note info
回答としては上の②、③、④、⑤をコードにすれば十分だが漏れがないかを確認する為に下で逆も示す。
:::

次に②、③、④、⑤が成り立つならば、①も成り立つことを示す。

②、③、④、⑤が成り立つと仮定する。
以下のように整数s,t,u,wを置く。
s=C1,2-C1,1
t=C1,3-C1,1
u=C2,1-C1,1
w=C3,1-C1,1
すると、グリッドは
 <table>
    <tr>
      <td>C1,1</td>
      <td>C1,1+s</td>
      <td>C1,1+t</td>
    </tr>
    <tr>
      <td>C1,1+u</td>
      <td>C1,1+s+u</td>
      <td>C1,1+t+u</td>
    </tr>
    <tr>
      <td>C1,1+w</td>
      <td>C1,1+s+w</td>
      <td>C1,1+t+w</td>
    </tr>
 </table> 
となる。

ここで、
C1,1=a1+b1
a2=a1+u
a3=a1+w
b2=b1+s
b3=b1+t
と置くと。

 <table>
    <tr>
      <td>a1+b1</td>
      <td>a1+b2</td>
      <td>a1+b3</td>
    </tr>
    <tr>
      <td>a2+b1</td>
      <td>a2+b2</td>
      <td>a2+b3</td>
    </tr>
    <tr>
      <td>a3+b1</td>
      <td>a3+b2</td>
      <td>a3+b3</td>
    </tr>
 </table>
となる。
よって、②、③、④、⑤→①が示された。

以上より、①⇔②、③、④、⑤が成り立つ。

## コード
```python
dlist_input=[]
 
for i in range (0,3):
  row = list(map(int,input().split()))
  dlist_input.append(row)
 
if (dlist_input[0][0]-dlist_input[0][1]==dlist_input[1][0]-dlist_input[1][1]==dlist_input[2][0]-dlist_input[2][1])\
and (dlist_input[0][0]-dlist_input[0][2]==dlist_input[1][0]-dlist_input[1][2]==dlist_input[2][0]-dlist_input[2][2])\
and (dlist_input[0][0]-dlist_input[1][0]==dlist_input[0][1]-dlist_input[1][1]==dlist_input[0][2]-dlist_input[1][2])\
and (dlist_input[0][0]-dlist_input[2][0]==dlist_input[0][1]-dlist_input[2][1]==dlist_input[0][2]-dlist_input[2][2]):
  print("Yes")
else:
  print("No")
```

## 記事作成の理由
アルゴリズム実技検定の公式テキスト内の解説で①→②、③、④、⑤が示されていたが、
仮にも大学で4年間数学を勉強していた者からすると逆も示す必要があると思い作成した。
[GAS] 新エディタでGUIからスクリプト プロパティを設定

# スクリプト プロパティについて

Google Apps Script で API キーなどハードコーディングしたくない情報をコードから分離できる機能です。
なお、AWS Lambda は環境変数という同等機能があります。

# 設定方法

歯車マークをクリックし「プロジェクトの設定」を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/7cc63569-37bf-584b-b3ef-3e760d28ae26.png)

一番下に「スクリプト プロパティ」があり、こちらから設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/a041a8d7-5980-496e-6772-84cba0bcc209.png)

スクリプト プロパティは PropertiesService オブジェクトを使って取得できます。

```javascript:code.gs
const API_KEY = PropertiesService.getScriptProperties().getProperty("API_KEY");
```

# 以前は

新エディタの GUI ではスクリプト プロパティを設定できませんでした。
2022年4月13日の公式ドキュメントに記載があるので最近できるようになったようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/6dc6f54e-38a9-e897-f48e-6081868f2b0a.png)

公式ドキュメント

https://developers.google.com/apps-script/guides/properties
UnityでgeometryシェーダのSingle Pass Instanced対応方法

Unityの自作シェーダをHoloLens2などのXR環境で動かすと、右目だけ描画されないことがある。
一番簡単な対応方法はレンダリング方式を「Multi Pass」にすること（[参考ページ](https://tips.hecomi.com/entry/2018/11/04/232219)）だが、
パフォーマンスなどの理由で「Single Pass Instanced」方式にシェーダを対応させたい場合に必要な作業についてまとめる。

[公式ドキュメント](https://docs.unity3d.com/ja/2019.4/Manual/SinglePassInstancing.html)にはvertexシェーダとfragmentシェーダだけの例は載ってるが、geometryシェーダを含むものを作ろうとして難儀したため。


# 対応方法の原則
各シェーダ関数間で`UNITY_VERTEX_INPUT_INSTANCE_ID`および`UNITY_VERTEX_OUTPUT_STEREO`の値がうまく受け渡されればよい。
（試してはいないが、おそらくテッセレーションシェーダを書く場合でもこのルールを守ればうまくいくと思われる）
以下、シェーダ関数への入力値を`i`、出力値を`o`とする。

## 構造体への対応

* シェーダ間で受け渡すすべての構造体に`UNITY_VERTEX_INPUT_INSTANCE_ID`を追加する。
* appdata以外のシェーダ間で受け渡す構造体に`UNITY_VERTEX_OUTPUT_STEREO`を追加する。
  
## 関数への対応

* vertexシェーダでは以下を実行
    * 最初に`UNITY_SETUP_INSTANCE_ID(i)`を実行
    * どこかで`UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o)`を実行
* vertexシェーダ以外では、`i`を使う前に`UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i)`を実行
* fragmentシェーダ以外で以下を実行
    * `UNITY_TRANSFER_INSTANCE_ID(i, o)`
    * `UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i, o)`



# 単純なジオメトリシェーダの例

以下はジオメトリシェーダでtriangleをいじりたいような場合の例：

```
#pragma vertex vert
#pragma geometry geom
#pragma fragment frag

// vertexへの入力構造体
struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

//vertexの出力でありgeometryの入力となる構造体
struct v2g
{
    float2 uv : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
    UNITY_VERTEX_OUTPUT_STEREO
};

//geometryの出力でありfragmentの入力となる構造体
struct g2f
{
    float2 uv : TEXCOORD0;
    float4 pos : SV_POSITION;
    UNITY_VERTEX_INPUT_INSTANCE_ID
    UNITY_VERTEX_OUTPUT_STEREO
};

v2g vert (appdata v)
{
    v2f o;
    
    UNITY_SETUP_INSTANCE_ID(v);
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
    
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = v.uv;
    return o;
}

[maxvertexcount(3)]
void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream)
{
    g2f o;
 
    // サンプルなので入力をそのまま出力
    for(int j = 0; j < 3; j++)
    {
        v2g i = IN[j];
        // 個々のiとoに対してSingle Pass Instanced対応を実施
        UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i)
        o.pos = i.pos;
        UNITY_TRANSFER_INSTANCE_ID(i, o);
        UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i, o);
        triStream.Append(o);
    }
}

UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);

fixed4 frag (g2f i) : SV_Target
{
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
    
    fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
    
    return col;
}
```

以上。誰かの役にたてば幸いです。
STM32G031でI2Cを受信して遊ぶ(STM32-I2C-USART) PA2ハードウェアシリアル


x 動作確認済み2022/6/2 20:54


目的
I2Cのテスト


![o_con515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6d4efda9-fb6c-f437-a787-bfc9333590db.jpeg)



I2C_USARTコンバータのArduinoバージョン

STM32G031とVSCode+STM32CubeでI2Cスレーブの受信文字をシリアル出力(受信)(STM32-I2C-USART)(CH340N)


https://qiita.com/caa45040/items/5032e6905c9425f41495


名前は、まだない


```c++


//I2C_SERIAL_CONVERTER_031_2

#include <Arduino.h>
#include <Wire.h>
#include <HardwareSerial.h>


#define LED1     PB7  // 1pin

#define DW   digitalWrite


//初期化
void setup()
{

  delay(3000); //not delete

  //シリアルの初期化
  Serial.setTx(PA2_ALT1);
  Serial.setHalfDuplex();
  Serial.begin(9600);

  //i2cの初期化
  Wire.setSDA(PA12);
  Wire.setSCL(PA11);
  Wire.begin(); //pa12 pa11
  Wire.begin(0x40);  //I2Cスレーブアドレスの設定
  Wire.onReceive(receiveEvent); //データが来ると呼ばれる関数

  //LEDの初期化
  pinMode(LED1, OUTPUT);
  DW(LED1, HIGH); //debug
  delay(500);     //debug
  DW(LED1, LOW);

} //setup


//メインループ
void loop(){
} //loop


//レシーブイベント
void receiveEvent(int howMany) {

  int x = Wire.read(); //I2C受信データの読み込み

  //  char c_hex[] = {
  //    '0', '1', '2', '3', '4', '5', '6', '7',
  //    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  //  };
  //
  //  char buf[] = { c_hex[(x >> 4) & 0x0f], c_hex[x & 0x0f]  , 0 };
  //
  //  char buf[] = { x, 0  };

  DW(LED1, HIGH);

  //I2Cスレーブの受信データの表示
  Serial.print( (char)x );

  DW(LED1, LOW);

}//receiveEvent



```
SNS画像フォーマット

## LINE公式アカウント
（2022年6月2日時点）
### プロフィール画像
アカウントのアイコン。画像は自動的に円形に表示されるので、正方形の画像の方がキレイに表示される。
- ファイル形式：JPG、PNG
- ファイルサイズ：3MB以下
- 推奨画像サイズ：640px x 640px
### 背景画像
プロフィール画像の背景に表示される横長の画像。
- ファイル形式：JPG、PNG
- ファイルサイズ：3MB以下
- 推奨画像サイズ：1080px x 878px

:::note info
バージョン11.9.0以上のLINEアプリでは背景画像が表示されません。
:::
GitLab CIでタグ名またはブランチ名を取得したいとき


GitLab CIでタグ名またはブランチ名を取得したいとき、どの変数を使うか迷って調べたので、備忘録として残しておきます。

|変数名  |ver.  |中身  |
|---|---|---|
|CI_COMMIT_TAG  |9.0～  |タグがPushされたときはタグ名が代入される。それ以外のときは未定義  |
|CI_COMMIT_REF_NAME  |9.0～  |タグPushのときはタグ名が代入され、それ以外のときはブランチ名が代入される  |
|CI_COMMIT_BRANCH  |12.6～  |CI_COMMIT_TAGが未定義のときブランチ名が代入される  |


CI_COMMIT_TAGとCI_COMMIT_BRANCHはどちらかしか定義されない。
CI_COMMIT_REF_NAMEは常に定義される。

与えられたのがタグなのかブランチなのかで処理を分けたいときは CI_COMMIT_TAG / CI_COMMIT_BRANCH を参照すると便利だと思います。
それ以外は、常に CI_COMMIT_REF_NAME を見れば良いと思います。