OmniAICreator/Qiita-1.07M huggingface dataset:
ISUCON 13 に参加して20位でした (最終スコア: 91,400 なんかいい感じではやいやつ)

# ISUCON 13 に参加して20位でした (最終スコア: 91,400 なんかいい感じではやいやつ)

ISUCON 13に参加して20位になりました。
また、Tver賞として Firetv stick 4K max を獲得しました！
ありがとうございます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905557/d3b879c4-c570-8fc0-7355-245c21a9b540.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905557/7a83364f-5233-6c4c-6543-2091590801a9.png)

## 参加確定まで

ISUCON 参加はこれで3回目でした。
最初の難関が、申し込みです。
DOS攻撃ばりのアクセスするのは嫌だったので、参加確定券付きの個人スポンサーとして申し込みました。

割とチームメンバーは決まっていて、去年と同じメンバーで参加するかなーと考えていました。(リーダー、セキュリティ・ネットワークマスター、自分)
しかし、セキュリティ・ネットワークマスターが今年は一人で参加してみたい(多分)とのことだったので、新しく一人誘う必要がありました。

現職のCTOをなんとか説得しました。

## 競技前日まで

- リーダー
- CTO
- 自分

というチームメンバーが確定してからは、10月中旬くらいから4回練習しました。
練習した問題は、 ここら辺

1. private ISU
1. ISUCON Prior
1. ISUCON10 本線
1. ISUCON10 予選
1. ISUCON11 予選
1. ISUCON12 本線

## 当日

|時間|初期スコア|最終スコア|
|---|---|---|
|10時~11時|`3,816`|`2,224`|
|11時~12時|`2,224`|`6,766`|
|12時~13時|`6,766`|`7,570`|
|13時~14時|`7,570`|`11,218`|
|14時~15時|`11,218`|`19,875`|
|15時~16時|`19,875`|`31,206`|
|16時~17時|`31,206`|`50,472`|
|17時~18時|`50,472`|`91,400`|

### 9時-10時

当日は、9時にみんなで集まりました。
昼は買いに行く時間がないので、10時までに各々が買いに行きました。
YouTube 放送で、ライブが少し遅れた際に、「あれ、これ動画配信サイトの問題か？」と言ったのがまさか当たってしまいました。

- [x] モニターセットアップ
- [x] お昼買い出し
- [x] 作戦会議
- [x] リモートサーバー(開発用)のセットアップ 

### 10時-11時

初期: `3,816`
最終: `2,224`

10時10分くらいに、サーバーが全部立ち上がりました。
初期ベンチ　3,816点
プロファイラー等をまいたりして、一時的にベンチが下がる (`2,224` 点)

一旦、powerDNSとか水責め攻撃とかわからん...になっているので、通常通り、indexを貼る,N+1解消を進めていこうになった
この段階では、user周り等のN+1が重そうになっていた

- [x] CloudFormation で、サーバーを立ち上げる
- [x] プロファイラーを撒く (秘伝、netdata等)
- [x] 初期ベンチ(10:09:10: `3,816` 点)
- [x] DB周りを見る -> index貼りましょうになる
- [x] powerDNS ってなんや...になる

### 11時-12時

初期: `2,224`
最終: `6,766`

11時の頭に、アプリケーション、当日マニュアルを読む。
index貼り、N+1解消を進めていき、スコアが上がる

tagsが、N+1になっていたので、bulkにする

11:54:18, `6,766` 点

- [x] マニュアルの読み合わせ
- [x] インデックス貼り 
- [x] tagsのbulk

### 12時-13時

初期: `6,766`
最終: `7,570`

tagsは、insert が走っていないので、オンメモリで良さげという話になり実装する

- [x] user icon 周り
- [x] tags のオンメモリ化
- [x] theme のオンメモリ化 

### 13時-14時

初期: `7,570`
最終: `11,218`

13時くらいになると、themeのオンメモリ化を進めました。
user ごとの dark_theme 等ですが、ほぼほぼ更新がなく、データー数も1000くらいのオーダーでした。
失敗としては、insertがあったのですがここの永続化はすっ飛ばしてはいけなかったです。(後から気づいた)

ここで、ベンチマーカーの不調もありました。

- [x] theme のオンメモリ化 
- [x] mysql interpolate の有効化 

### 14時-15時

初期: `11,218`
最終: `19,875`

次は、そもそもuserがあんまりレコードが少なかったのでオンメモリ化を進めました。
ここは、iconとコンフリクトして、「うーん。なんでfailするんだろ...」となっていて悩んでいました。(結局、コードに問題はなかったがicon hash の永続化周りの問題そうだった)

- [x] user のオンメモリ化 

### 15時-16時

初期: `19,875`
最終: `31,206`

userのところで悩みつつ、サーバー分割を考え始めました。
また、

- [x] user のオンメモリ化 
- [x] db の max_con を変えてみる(app) 
- [x] サーバーの分割を考え始める -> (s1: app, s2: mysql, s3: powerdns)

### 16時-17時

初期: `31,206`
最終: `50,472`

- [x] サーバーの分割 -> かなりエラーが出て焦る

### 17時-18時

この時間は、やばいやばいになっていました。
サーバー分割が完了して、点数が安定するようになり安心しました。

まだ、ログを消しきれていない箇所もありましたが、もうやめておこうという判断になりました。

初期: `50,472`
最終: `91,400`


- [x] サーバーの分割完了
- [x] 再起動時のキャッシュが永続されていないエラーを直す
- [x] ベンチがちゃ 

### 18時以降

セブンにご飯を買いに行って、みんなで生放送を見守りました。
TVer賞が貰えてとても嬉しかったです。

## 最後に

このチームでできて、とても楽しかったです！

去年は、26位で順位が一桁足りずに本戦を逃したのが悔しかったです。
今年は、20位、去年の挽回ができました。(優勝したかった)

30位以上は、

- スポンサー企業ノベルティ詰め合わせセット
- ISUCON13オリジナルTシャツ
- ネームカード
- 認定証

が貰えるらしいので楽しみ！
Salesforce未経験者が最短1ヶ月1発で認定アドミニストレータを取得する勉強法

# はじめに
　株式会社OMJテクノソリューションズ Advent Calendar 2023 13日目の記事です。

　こんにちは、hideです。
　日頃の業務としてバックエンド中心の開発業務に携わっています。
　今回の記事では、Salesforceの資格を最短1ヶ月1発で取る方法を記載していきたいと思います。

## Salesforceの認定アドミニストレーターについて
勉強方法に入る前に、Salesforceの認定アドミニストレーターについて簡単に説明すると、"<font color="DarkKhaki">Salesforceの基礎資格</font>"となります。
Salesforceの概念や機能、一定のスキルを実践で使用できる程度のシステム管理者の資格です。

<details><summary>公式の説明概要</summary>

 　Salesforce 認定アドミニストレーター資格は、Salesforce 管理者としての経験を持つ個人を対象としています。このプログラムは、Sales Cloud、Service Cloud、Experience Cloud において、アプリケーション、エンドユーザが利用できる機能、システム管理者が利用できる設定および管理のオプションを幅広く網羅します。
  
</details>
また、Salesforceにはさまざまな上位資格が存在しますが、以下の上位資格など受験する際には、認定アドミニストレーターを取得している事が前提となります。

* Salesforce認定上級アドミニストレーター
* Salesforce認定SalesCloudコンサルタント
* Salesforce認定ServiceCloudコンサルタント

## 試験概要
【試験詳細】
* 内容: 多肢選択/複数選択方式の 60 問
* 試験の所要時間: 105 分
* 合格点: 65%
* 受験料: 20,000 円（税抜）
* 受験方法: テストセンターにおける監督下の試験、またはオンライン環境における監督下の試験。 

【試験概要】
* 設定とセットアップ:  20%
* オブジェクトマネージャとLightning アプリケーションビルダー:   20%
* セールス＆マーケティングアプリケーション:  12%
* サービス＆サポートアプリケーション:  11%
* 生産性向上とコラボレーション:  7%
* データ管理＆分析: 14%
* ワークフロー/プロセスの自動化: 16%

## 受験までの1ヶ月の道のり
以下の手順で試験に合格する事ができました。
1. Salesforceアカウントの登録
2. Trailheadの活用
Salesforce 認定アドミニストレーター資格に向けた準備
https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/prepare-for-your-salesforce-administrator-credential
3. Trailhead Playgroundの活用（ハンズオン）
実際にSandBox環境で各種設定やオブジェクトなどを作成していきます。
4. 試験問題を解く
公式サイトやその他ネットに載っている記事などを参考にひたすら試験問題を解いていきます。

基礎資格ということもあり、試験範囲は非常に多いです。
しかし、Apexコードなどは触らないためまだ良いのかと。。
実際に最短で取得していくためには、機能を知る→触れる→問題を解く　この順序が一番身についたなと思います。
ハンズオンの中の動画は、途中から日本語対応が無かったため、日本語翻訳をかけながら少しずつ理解してTrailheadを進めていました。

## わからない点はどうするか
* 公式のTrailbrazerなどを活用する
→自分はあまり活用していませんでした。
* Qiitaやネットで参考になる記事を探す
→この方法が一番多かったです
* YouTubeに上がっている動画など参考にする
→ハンズオンなどの短い動画も探すと出てきます。
## 試験まで必ず行うこと
* 1周でいいのでTrailheadで概要を知り、ハンズオンで触ってみる事
* 試験問題を反復して時、わからない点があればsandbox環境で触れて覚える

## 合格後の所感
Trailheadのハンズオン1周だけでは、実務として使用していくには経験不足だと感じましたが、幅広く機能に触れられる点では良いものかと思います。
試験自体も実際105分ありますが、そこまで時間がかからず終わるはずです。
Curvature等曲率概要

# 等曲率の概念

## 曲率の定義
曲率(curvature)は、ジオメトリ曲げプログラムの量を表します。
- 曲線が線をオフセットする量(プログラム)
- サーフェスオフセット平面の量(プログラム)

## 円の曲率
曲げ手順は円上の各点で同じであり、半径が小さいほど曲がるようになるため、半径の逆数を使用して円の曲げ手順を定量的に記述できます。

## 直線の曲率
直線は無限大の半径を持つ円と見なすことができるため、直線の曲率は0です。

## 曲線の曲率
任意の形状の任意の曲線の場合、各点での曲げ手順は一般に異なり、曲線C上の任意の点Pに対して、その近くのC上の2つの点P1 / P2を見つけます。
これらの3つの点は常に円を決定することができ、P1、P2が点Pに無限に近い場合、対応する円にも限界があり、この極限円は点Pの線Cに最も近い円であり、近接円と呼ばれます。
直円の曲率は、点 P における曲線 C の曲率です。
【メモ】Laravel Token認証機能

### 概要
1. 参考サイトを利用した認証機能の作成方法
1. 迷った点などをまとめて、今後に生かせるようにする

### 参考サイト
https://reffect.co.jp/laravel/laravel-sanctum-token/

現在だとほとんどスキップ可能であるので、それに合わせて記述する。

### 環境構築
laravelのインストール
```terminal:Terminal
docker compose exec php composer create-project laravel/laravel
```
元の記事では、
```terminal:Terminal
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
```
を行って、インストールをしていますが、**laravel 10.10**の場合は、元からインストールされているため、スキップが可能です。
### 認証の設定
**laravel 10.10**の場合は、元からインストールされているため、スキップが可能です。

### ユーザーの追加
```terminal:Terminal
% php artisan tinker
Psy Shell v0.10.6 (PHP 7.4.10 — cli) by Justin Hileman
>>> $user = new App\Models\User;
=> App\Models\User {#3341}
>>> $user->name = 'John Doe';
=> "John Doe"
>>> $user->email = 'john@example.com';
=> "john@example.com"
>>> $user->password = bcrypt('password');
=> "$2y$10$m6bOlfPYxvradWHyMqcVX.i0WMIgYgKG9y.IAbrN6ogu0f9EpbIkO"
>>> $user->save();
=> true
>>> $user;
=> App\Models\User {#3341
     name: "John Doe",
     email: "john@example.com",
     updated_at: "2021-02-19 14:06:39",
     created_at: "2021-02-19 14:06:39",
     id: 1,
   }
```

### ルートの変更
```php:/routes/web.php
<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;

Route::get('/', function () {
    // return view('welcome');
    $user = Auth::loginUsingId(1);

    $token = $user->createToken('test');

    dd($token);
});
```

### 確認
localhost:8000など、起動したポートにアクセスして**accessToken**などを取得できていたら成功です。
え！GASでディレクトリを作成できるんですか！

## GASで多数のファイルを使用するとき
こんなことありますよね。
自分は関数ごとにファイルを作成して、後から見返しやすいようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081238/e1abffcb-c648-173b-6089-fe4f305a5d51.png)
このとき、画像のように4ファイルくらいであれば問題はないのですが、ファイル数がかさんでくるとサイドバーを上下に行ったり来たりしないといけなくなって大変です。
特に、自分はAPI関連のJSONを関数で呼び出すようにしていたため、もうなんかえらいこっちゃになってしまうこともありました。
こんな解決方法もあると思います。
### ファイル名に番号をつける
画像のような番号をつけることにより、アルファベット順にソート（サイドバー上部のAZボタン）することでいい感じに並び替えを行う、という手もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081238/0d1f7437-3708-bb9a-57ef-08db9c1685a6.png)
これで一応並び順は担保されるので、比較的保守はしやすくなります。
ですが、サイドバーが縦にはみ出した場合、見にくいのは変わりません。
### ディレクトリで管理する
ここで、ディレクトリ管理の方法をお伝えします。
ファイル名を以下のように設定します。
```
[ディレクトリ名]/[ファイル名]
```
例えば、今回の例では
```
Sub/sub1
```
と設定します。すると、こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081238/f14249f4-6152-a48c-f02b-9a8fb0fed981.png)
階層構造ができています。これ、左にあるフォルダマークをクリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081238/e07ebeaa-bcac-4d47-23bf-efdd98d6c271.png)
このように折りたたむこともできます。
## おわりに
便利なので使ってみてください。
あと、同じディレクトリのフォルダのディレクトリ名をまとめて変更出来る機能、作ってくれないですかね、、、
echoとcatの使い分け

# echoとcatの役割って理解してる？
今回，卒業研究のシェルスクリプトを作成した．スクリプトの書き方を調べる過程で，サイトによってファイルに書き込みを行う処理をechoコマンドとcatコマンドのどちらを使用するかばらつきがあった．ここでそもそも自分自身がこれらのコマンドの違いを理解できていない事に気づいたため，本投稿にまとめる．
### 先に結論
スクリプトのファイル書き込み処理を書く場合は，どちらでも良い．
## 各コマンドの根本的な違い
### catコマンド
ファイルや標準入力装置のデータを取得し，そのデータを標準出力装置に表示する．
### echoコマンド
文字列を画面に表示する．
## ファイル書き込みの書き方の違い
### catコマンド
書き込み先のファイルを先に指定し，書き込む内容をEOFで囲む．
```
# ファイルに上書きする場合
cat > cat_text.txt <<EOF
Line 1
Line 2
EOF

# ファイルに追記する場合
cat >> cat_text.txt <<EOF
Additional line
EOF
```
### echoコマンド
書き込み先のファイルを後に指定し，書き込む内容をダブルクォーテーションで囲む．
```
# ファイルに上書きする場合
echo "sample text" > echo_text.txt

# ファイルに追記する場合
echo "Additional text" >> echo_text.txt
```
※echoコマンドは一行ずつの書き込みしかできないという情報があるが，実際には複数行でも問題なく書き込める．
## 結論
- 書き方の違いがあるが，できることに違いはない．
- 視認性や好みで選んでよい．
VScodeとPlaywrightで自動テスト作成　（更新中）

## 環境準備

### VSCode Editor
公式サイトからダウンロードとインストール

https://www.javadrive.jp/vscode/install/index1.html

### Node.js

公式サイトからダウンロードとインストール

https://nodejs.org/en

![node-install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/84e2e861-6f76-6aa2-ce7c-34b6f3dc82e7.png)


### Playwright の VSCode 拡張
#### VS codeに"Playwright Test for VSCode"をインストールする
1. 以下のページでインストール場合

https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright

2. VScodeからインストール場合 
![node-install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/83a8ad25-3e8f-7e5c-92a8-0233749ab9e4.png)
[VS code]拡張機能 > "Playwright"で検索 > "Playwright Test for VSCode" を選択 > インストール でインストールする。

### Playwright

#### インストール
表示 > コマンドパレット > "Install Playwright"を検索 > Install Playwrightを選択 > OKをクリックする。
![install playwright.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/8ba78111-e64a-3e37-c336-1444eb1149a6.png)
![install playwright 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/7c79aa0e-70ad-1a8e-d3b5-800d0b1feb06.png)


#### フォルダ構成
![playwright-folder.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/43bd859a-adc6-5c8e-014f-262f0e187563.png)
playwright.config.ts	設定ファイル			
tests/			テストファイル置いてるフォルダ	
	example.spec.ts			
tests-examples/			サンプルコード	
	demo-todo-app.spec.ts			

#### サンプルテスト実行
Testing →　TestExporerにテストリスト表示する。実行したいテストの横に▷ボタン押したらテスト実行する
![run-test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/49956b26-8e01-4b7e-a248-f4558ea8e874.png)


## テスト作成
Testing → Show browerチェック（ブラウザー表示させるため）→ Record new（新しいテスト作成）
![run-test-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505194/4b3bab96-1be7-dc0a-614e-2fddd491695b.png)
SQLで最新レコードを取得する3つの方法

## 概要
データベースの特定のテーブルから最新の情報を取得するケースがしばしばあります。
私が知っている代表的な2つやり方について、架空の例で説明します。

## テーブルの状態
ChatGPTで出力した適当な例なので不自然さがありますが、そこは目をつぶってください🙇‍♂️

| product_id | name           | price | updated_at         |
|------------|----------------|-------|--------------------|
| 1          | スマートフォン | 50000 | 2023-11-01 09:30:00|
| 2          | ノートPC       | 80000 | 2023-11-02 10:15:00|
| 3          | イヤホン       | 15000 | 2023-11-01 11:20:00|
| 1          | スマートフォンX | 55000 | 2023-11-03 08:45:00|
| 2          | ノートPC Pro   | 120000| 2023-11-05 12:00:00|
| 4          | タブレット     | 45000 | 2023-11-04 14:30:00|
| 3          | イヤホンPlus   | 20000 | 2023-11-03 16:00:00|



## Group ByとJOINを使用するやり方

製品IDごとに最新の名前と価格を取得するには、以下の手順が必要です。

### 手順
1. 各製品IDの最後の更新日時をサブクエリで特定する。
2. このサブクエリの結果を元の`product`テーブルとJOINする。
3. 最後に、必要なカラム（製品ID、名前、価格）を選んで結果を取得する。

### SQLの例
```sql
SELECT p.product_id, p.name, p.price
FROM product p
JOIN (
    SELECT product_id, MAX(updated_at) AS latest_update
    FROM product
    GROUP BY product_id
) latest_product ON p.product_id = latest_product.product_id AND p.updated_at = latest_product.latest_update
```

このクエリにより、各製品IDごとの最新の名前と価格を取得できます。

## Order ByとLIMITを使用

特定の製品IDに関して、最新の状態（名前と価格）を知りたい場合、以下の方法が便利です。更新日時で降順にソートし、`LIMIT`を使って特定製品の最新の1件を取得します。

### SQLの例
```sql
SELECT product_id, name, price
FROM product
WHERE product_id = [特定の製品ID]
ORDER BY updated_at DESC
LIMIT 1;
```

このクエリでは、指定した製品IDの中で最も最近更新された名前と価格の情報を取得します。

以下に、あなたのブログのスタイルとトーンを維持しながら、「ウィンドウ関数を使う方法」セクションを追記しました。コピペで追加できる形式にしています。

## ウィンドウ関数を使用するやり方

各製品IDごとに最新の情報を取得するもう1つの強力な方法が「ウィンドウ関数」を使うやり方です。

### 概要

ウィンドウ関数の ROW_NUMBER() を使うことで、「製品IDでグルーピングし、更新日時が新しい順に並べ、先頭の1件だけを取得する」という処理を、シンプルかつ高速に実現できます。

### 手順
1. ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY updated_at DESC) で、各グループ内の最新レコードに「1番」を振る。
2. WHERE row_number = 1 で最新だけを取り出す。

### SQLの例
```sql
SELECT product_id, name, price
FROM (
    SELECT product_id, name, price,
           ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY updated_at DESC) AS rn
    FROM product
) ranked
WHERE rn = 1;
```
このクエリでは、各 product_id グループ内で updated_at の降順に並べた上で、最初の1件だけを取得します。
factory_bot_rails 6.3.0 から factory に ID を書くとエラーになる（対策あり）

factory_bot_rails を 6.3.0 以降にアップデートすると以下のようなエラーがでるようになりました。

```
Do not define "id". Instead, rely on the database to generate it.
```

"id" はそのテーブルのプライマリキーに変化します。

# 解説と解決方法

### reject_primary_key_attributes という機能が追加された

以下で説明されているように

https://github.com/thoughtbot/factory_bot_rails#active-record-configuration

```
config.factory_bot.reject_primary_key_attributes = false
```

を設定しないと、プライマリキーを factory_bot_rails で指定するとエラーになるようになりました。

### 注意点
ただし、この記事は `reject_primary_key_attributes = false` を推奨するものではありません。
factory_bot でプライマリキーを指定しないでいいのであれば、そちらの方が良いでしょう。

### 該当プルリクエスト

まーじされた該当プルリクエストはこちら
https://github.com/thoughtbot/factory_bot_rails/pull/419
Ruby on Railsアップデート(ErrorReporter#unexpected/with_routingテストヘルパー  他 2023-11-24)

## 引用元
https://world.hey.com/this.week.in.rails/errorreporter-unexpected-with_routing-test-helpers-and-more-1b2c56f6

## 今週のトピック

### [ErrorReporter#unexpectedを本番環境ではreportし開発環境ではraiseするようにする](https://github.com/rails/rails/pull/49951)
https://railsguides.jp/error_reporting.html
この変更により、前提条件違反を報告する`ErrorReported#unexpected`が追加された。

例えば、以下のコードではdevelopment環境とtest環境ではエラーをraiseするが、production環境ではエラーをreportする。
```
def edit
    if published?
      Rails.error.unexpected("[BUG] Attempting to edit a published article, that shouldn't be possible")
        return false
    end
      # ...
  end
```

### [with_routing テストヘルパーを統合テストで使えるようにする](https://github.com/rails/rails/pull/49819)
[with_routing](https://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html#method-i-with_routing)テストヘルパーのサポートが ActionDispatch::IntegrationTest に追加された。
(with_routingはさまざまなルーティングを簡単にテストするためのヘルパー)


### [Active Storageアップロードにおけるボタンタグ内の入れ子要素のサポート](https://github.com/rails/rails/pull/48290)
ボタンやsubmitタイプの入力に、スパン、アイコン、その他のHTML要素などの子要素が含まれている場合に発生する可能性のある問題に対処するもの。

### [非推奨コードの削除](https://github.com/rails/rails/pull/50144)
Rails 7.2で非推奨とされたコードをすべて削除するための進行中の取り組み。

### [MySQLでDBクエリに警告があってもActiveRecord.db_warnings_actionが呼び出されない場合の処理](https://github.com/rails/rails/pull/50049)
SHOW WARNINGSクエリが実行されたときに警告を返さない場合、MySQLがwarning_countを0より大きく返しても、ActiveRecord.db_warnings_action procは警告を無視するのではなく、一般的な警告メッセージとともに呼び出される

### [登録されたActive Recordアダプタの検証を遅らせ、アダプタのエイリアスを許可する](https://github.com/rails/rails/pull/50093)
DB アダプタの名前によるエイリアスを許可するためのもの。最終的な状態はとしては、アプリケーションレベルでmysqlをtrilogyまたはmysql2のいずれかにマップできるようにするところを目指している。

### [ActiveStorage::Representations::ProxyController が プレビュー可能なファイルに対して適切なプレビュー画像のバリアントを返さない問題を修正](https://github.com/rails/rails/pull/50098)
「俺のP*nterest」作ってみた

自分のPCで使えるPi\*terestもどきをUnityで作ったのでご紹介です。

- Githubリンク
    
https://github.com/Yocchi3191/IllustGrid_Unity/tree/main

# IllustGridとは

↓実行画面スクショ
![illustgrid_scr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114109/cab61524-48e8-2770-bda8-756e2ec4dbec.png)

IllustGridとは、「P\*nterestっぽい画像ビューワーを自分のPCでできるようにしたい」というコンセプトで開発したデスクトップアプリです

任意のフォルダを選択すると、フォルダ内の画像ファイル(.pngだけ)をランダムに並べ替えて表示します。

自分の集めたお気に入り画像を新旧織り交ぜてみることで、「昔こんなの集めてたんだなー」と懐かしんだり、ものづくりのインスピレーションに使いたいなと思って開発しました。

「俺のP*nterest」といいましたが、本アプリの正式名称は"IllustGrid"です

P\*nterestは普段から愛用していますが、痒いところに手が届かなかったのでその部分だけ満たすようなアプリとして開発しました。

「じゃあ拡張機能でつくったらええやん」って？
拡張機能の作り方わかんないんだもん...

# 解説
いるかわからないけど同じことをやりたい人向けに簡単な解説を残しておきます。スクリプトとつきあわせてご確認ください

- 環境・使用ツール
    - Windows11
    - Visual Studio
    - Unity 2022.3.10f1


本アプリは以下の4つの機能でできています

1. フォルダパスを取得
2. フォルダパスからファイルリスト生成
3. ファイルリストからパネルを生成
4. パネルに画像をアタッチ

### 1. フォルダパスを取得
`FolderPathManager`が担当しています。
Unityプラグインの[StandaloneFileBrowser](https://github.com/gkngkc/UnityStandaloneFileBrowser)を使用して、フォルダ選択ダイアログを表示しています。このプラグインのフォルダ選択機能では、フォルダ選択時に大きさ1の`string[]`を返します(おそらく複数選択機能のために配列にしている)。0番目の要素にフォルダパス(string)が入っているので、これを他のプログラムにわたすことで、「任意のフォルダ選択」機能を実装しています。

### 2. フォルダパスからファイルリスト生成
`FileManager`が担当しています。
`FolderPathManage`rがフォルダパスを持っているので、それを参照して、フォルダ内にある全画像ファイルのパス(string)を取得します。
取得したファイルパスリストをシャッフルして返すことで、「ランダム順表示」を実装しています。
正規表現でフィルタリングが可能とのことだったので、`"*png"`としてpngファイルだけを抽出するようにしましたが、可能であればその他の画像ファイル(.jpg, .jpeg, .gif)も同時に抽出できるようにしたかったです


### 3. ファイルリストからパネル生成
`ViewManager`が担当しています。
`FileManager`が取得したファイルリストの数だけ画像をアタッチするためのUIを生成します。インスタンスを変数に代入すると、`Instantiate`したあともデータを渡すことができるので、1つ1つのファイルパスを渡しています

### 4. パネルに画像をアタッチ
`ImagePanel`が担当しています。
`ViewManager`から生成された`ImagePanel`は、それぞれが画像ファイルのパスを1つ持っているので、それをもとにテクスチャをロード、スプライトの形式にしてから自分にアタッチさせています。


デリゲートが使えれば、フォルダ選択をイベント化してつくれたのでしょうが


# 完走した感想ですが
いままで自分で「これ作るぞ！」ってやって、まともにアプリを完成させたことがない人間でしたが、なんだかんだ手を動かしてたら出来ました。11月目処だったので間に合ってよかったです。

たぶんプログラミングちからが上がったというよりも、最近勉強してたモデリング(UMLのほう)の影響が大きいと思います。モデリングをちょっとかじっただけでも、「アプリの実行シナリオ」とか、「誰が何をするのか」とかを考えるのがすごくラクになって、流石にコピペとはいきませんでしたが、安定して実装していけたと思います。

モデリングの勉強に使っていたのは[「UMLモデリング入門」](https://www.amazon.co.jp/UML%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E5%85%90%E7%8E%89-%E5%85%AC%E4%BF%A1/dp/4822283585)と大学の先生でした。本のほうで「どうやってモデリング」するのかをじっくり勉強したことで、モデリングの考え方的なものを少しだけ身につけることができました。(大学の先生は1の質問をすると10くらい返してくれるので大好きです)
初心者プログラマーの皆様は、プログラミングを覚えてきたらモデリングも勉強してみると、ものづくりの見通しがかなり立てやすくなると思うので、よければ勉強してみてください。
UWSCRのインストールおよび実行方法

# UWSCRをインストールする

## githubからダウンロード

UWSCRはexeファイルだけで動作するポータブルアプリケーションです。
最新版は以下からダウンロードできます。

https://github.com/stuncloud/UWSCR/releases/latest

ページ下部のAssetsにあるリンクのうち

- UWSCRx64.zip
- UWSCRx86.zip

のいずれかをダウンロードしてください。その後、zipファイル内の`uwscr.exe`を任意のフォルダに展開してください。必要であればuwscr.exeのパスを`%PATH%`に登録しましょう。

## wingetによるインストール

UWSCRはwingetによるインストールが可能です。

```console:powershell
PS> winget install UWSCR
```

インストールに成功すると`%LOCALAPPDATA%\Microsoft\Winget\links\uwscr.exe`にシンボリックリンクが作成されます。

# UWSCRを実行する

UWSCRはバージョン`0.14.0`コンソールアプリケーションとして動作します。コマンドプロンプトやPowerShellから実行してください。Explorer等から実行した場合はコマンドプロンプト等のコンソールが表示されます。

:::note warn
バージョン`0.14.0`未満のバージョンではウィンドウアプリケーションとして動作していました。コンソールから実行した場合は擬似的にコンソールアプリケーションのように動作させていましたが、`0.14.0`よりコンソールアプリケーションとしてビルドされるようになりました。
:::

## スクリプトの実行

スクリプトファイル (*.uws) を実行します。

```cmd:powershell
PS> uwscr C:\path\to\script.uws
```

スクリプト実行中のカレントディレクトリはスクリプトが置かれているディレクトリになります。

スクリプトにパラメータを渡す場合はスクリプトファイルパスの後に値を入力します

```cmd:powershell
PS> uwscr C:\path\to\script.uws foo bar baz
```

```php:script.uws
print PARAM_STR // [foo, bar, baz]
```

## Replの実行

```console:powershell
PS> uwscr
```

コマンドラインオプションなしで実行するとReplモードで起動します
または`--repl`を付与することで明示的にReplモードを起動します

```cmd:powershell
PS> uwscr --repl
```

Replモードでは、コンソールへの入力を文としてその都度評価します。また、式を評価した場合はその式が返す値を実行後に出力します。

```console:repl
uwscr> 1 + 1
2
```

予めモジュールファイル等を読み込ませてReplを実行することも可能です。

```php:module.uws
module MyModule
    function DoSomething()
        result = "I did it!"
    fend
endmodule
```

```cmd:powershell
PS> uwscr --repl C:\path\to\module.uws
```

```console:repl
uwscr> print MyModule.DoSomething()
I did it!
```

`exit`と入力するか`Ctrl+C`を押すことでReplを終了します。

## ワンライナー

`--code`に続けてUWSCRの式を示す文字列を渡すことで、その結果を出力します。

```cmd:powershell
PS> uwscr --code "print 123"
123
```
地方におけるエンジニアリング

# はじめに

これまで地方でしか働いたことがないのですが、時々都市部のエンジニアと交流を持つことがあります。
やはり名だたる企業の方々は高い水準の話をされるので自分の未熟さを痛感するばかりです。
全員が全員そのような高い水準ではないと思いますが、都市部と地方でどんな差があるのでしょうか。

# 考察

①スタートアップが少ない
スタートアップ企業におけるメリットとして、現在なにもないので新しい技術を取り込むことが容易である。（もちろんその苦労があるのはその通りです）
基本的に現在稼働中の自社システムがある場合、それをひっくり返すのは容易ではありません。予算は？費用対効果は？顧客への説明はどうする？誰がリーダーとしてやる？など乗り越える壁はいくつも存在します。
チャレンジしたくてもその機会を与えてくれる企業はなかなか多くはないのかなという印象です。
②教育面
もちろん学校教育のレベルのさ差はあるでしょうが、企業側の教育レベルも差があるでしょう。わたしも他県でとある親会社のネームバリューがある企業に務めていましたが、まず研修期間が長いです。半年近く（記憶が曖昧）におよぶ研修の後、ようやく配属されます。つまり、そのくらい費用を投入しているのです。
一方中小企業でここまでやるのは難しいのではないでしょうか？実践の中で学ばせていくもんだ。という考えはもちろん否定しませんが、ロードマップを考えた上でなのかそうでないのか。
③そもそも人がいない
地元が大好きだ！！という人以外はだいたい都市部、地方の中でも中心的な都市に流れてしまいます。給料高い方がいいですし、一人でやっていきたい！と思うことはそれもいいことだと思います。
また、地方のまったりした企業も中には少数ありますでそこで生涯でもいいとは思います。が１回くらいは仕事が辛くて仕方ないというのは経験してみてもいいんじゃない？とも個人的には思ってます。
ということで私は１回くらい都市部に行って叩かれてから帰っておいで（笑）と思ってますのでこれについては仕方ないなと。

# 地方だからといって何も出来ないわけじゃない
昨今はリモートワークの仕事も増えてきましたし、フリーランスの方も増えてきました。都市部の技術者と沢山関わって切磋琢磨できる機会も増えたと思います。
また、自宅で仕事をしろと言うわけではないですが、プログラミングを生業とするエンジニアって「〜を作ってみたかった」から入ったのではないでしょうか？
まずは今からでも、小規模でもやってみると良いでしょう。
何かこの記事を通してやってやるぞという気分に少しでもなればなと思います。
TypeScript で kintone のフィールドを取り扱いやすくする

kintone プラグインを作る場合はアプリのフィールド情報が必要になるケースがあります。

文字列1行フィールドやスペースフィールドを取得する場合は複数の API を実行しなければなりません。
また、テーブル内フィールドやグループ内フィールドの判定には一手間必要になります。

そこで、TypeScript で kintone のフィールドを取り扱いやすくするライブラリを作りました。

## 作ったもの
kintone-pretty-fields という名前で npm に公開しました。
https://www.npmjs.com/package/kintone-pretty-fields

## できること

### 1. kintone のフィールドとスペースフィールドをまとめて取得

```ts
import { KintoneRestAPIClient } from "@kintone/rest-api-client";
import { kintonePrettyFields } from "kintone-pretty-fields";

const client = new KintoneRestAPIClient();
const { fields, spacers } = await kintonePrettyFields.get({ client, app: 1, lang: "en", preview: false });
console.log({ fields, spacers });
```

### 2. フィールドの並び順をソート

「1」で取得したフィールドは、フォーム設定のフィールドの並び順になっています。（画面の左上が先で、右下が後）

フィールド数が 100 を超えるアプリは少なくありません。
フィールドを検索できるようになっているのがベストですが、そうではない場合少し役に立ちます。

### 3. テーブル内フィールドの判定

table プロパティが存在する場合はテーブル内フィールドです。

```typescript
{
  type: 'SINGLE_LINE_TEXT',
  code: '文字列__1行_',
  label: '文字列 (1行)',
  noLabel: false,
  required: false,
  minLength: '',
  maxLength: '',
  expression: '',
  hideExpression: false,
  unique: false,
  defaultValue: '',
  table: 'テーブル' // table field code
}
```

### 4. グループ内フィールド

group プロパティが存在する場合はグループ内フィールドです。

```typescript
  {
    type: 'SINGLE_LINE_TEXT',
    code: '文字列__1行_',
    label: '文字列 (1行)',
    noLabel: false,
    required: false,
    minLength: '',
    maxLength: '',
    expression: '',
    hideExpression: false,
    unique: false,
    defaultValue: '',
    group: 'グループ' // group field code
  }
```

### 5. ルックアップのコピー先フィールドの判定

isLookupCopy プロパティが true の場合はルックアップのコピー先フィールドです。

```typescript
{
  type: 'SINGLE_LINE_TEXT',
  code: '文字列__1行_',
  label: '文字列 (1行)',
  noLabel: false,
  required: false,
  minLength: '',
  maxLength: '',
  expression: '',
  hideExpression: false,
  unique: false,
  defaultValue: '',
  isLookupCopy: true // If true, lookup copy destination field
}
```

### 6. 選択肢のソート

sortedOptions プロパティに選択肢を index でソートした配列をセットします。

```typescript
{
  type: 'CHECK_BOX',
  code: 'チェックボックス',
  label: 'チェックボックス',
  noLabel: false,
  required: false,
  options: {
    sample1: { label: 'sample1', index: '0' },
    sample4: { label: 'sample4', index: '3' },
    sample3: { label: 'sample3', index: '2' },
    sample2: { label: 'sample2', index: '1' }
  },
  defaultValue: [],
  align: 'HORIZONTAL',
  sortedOptions: [ 'sample1', 'sample2', 'sample3', 'sample4' ] // sorted options
}
```

## インストール方法

```sh
$ npm install kintone-pretty-fields
```

## 使い方

```typescript
import { KintoneRestAPIClient } from "@kintone/rest-api-client";
import { kintonePrettyFields, kintonePrettyType } from "kintone-pretty-fields";

const client = new KintoneRestAPIClient();
const { fields, spacers } = await kintonePrettyFields.get({ client, app: 1, lang: "en", preview: false });
console.log({ fields, spacers });

const checkBoxFields = fields.filter(kintonePrettyFields.isCheckBox);
console.log(checkBoxFields);

const myFunction1 = (fields: kintonePrettyType.OneOf[]) => {
  // do something
};

const myFunction2 = (field: kintonePrettyType.CheckBox) => {
  // do something
};
```
簡単にテスト自動化  - Visual Regression Testing



## ビジュアルリグレッションテストとは？

ビジュアルリグレッションテストは、ウェブアプリケーションやウェブページの視覚的な側面が、変更前後でどのように変化するかを確認するテスト方法です。
このテストは、特にウェブサイトのデザインやレイアウトに関する変更を検出するのに有効です。

## 主な目的

- **デザインの一貫性の確保**:
  - コード変更による意図しないビジュアルの変更を検出します。
- **自動化されたフィードバックの提供**:
  - 手作業による確認作業を減らし、迅速なフィードバックを提供します。

## テストプロセス

1. **基準画像の作成**:
   - テスト対象ページのビジュアル基準となるスクリーンショットを取得します。
2. **変更後の画像の取得**:
   - コード変更後のページのスクリーンショットを取得します。
3. **画像比較**:
   - 両画像を比較し、ビジュアル上の変更点を検出します。

## ツールとテクノロジー

- **一般的なツール**:
  - Selenium、Puppeteer、Cypressなどのブラウザテストツールと組み合わせて使用されます。
- **画像比較ツール**:
  - ピクセルレベルでの比較や差分の視覚化を行うツールが利用されます。

## 注意点

- **偽陽性のリスク**:
  - 微細なレンダリングの違いも検出されるため、偽陽性のリスクがあります。
- **環境の影響**:
  - ブラウザやディスプレイの違いがテスト結果に影響を与えることがあります。

👉 ポイント: ビジュアルリグレッションテストは、ウェブアプリケーションやページの視覚的変更を検出するための強力なツールですが、偽陽性や環境による影響を考慮する必要があります。
Codecovの一般的な設定

## 概要

Codecovを使用する際によくあるタスクや設定について、簡単なガイドを作成しました。

`{プロジェクトルート}/codecov.yml`ファイルを調整することで実現できます。

設定変更時はバリデーションエンドポイントで設定の妥当性を検証することをおすすめします（実際、ci 上（GitHub Actions など）でうまく動かない原因はここで落とせます）

CodecovのYAMLを変更する際は、新しいYAMLを以下のコマンドを使用して検証してください。

```css
curl -X POST --data-binary @codecov.yml https://codecov.io/validate
```

## 設定事例

### プルリクエストにおけるカバレッジのブロック状態を設定する

```yaml
coverage:
  status:
    project:
      default:
        target: 80%    # 目標（must）数値
        threshold: 1%  # 許容比率（この例だと 79% まで許容）
```

### 各プルリクエストで全体のカバレッジを増やす

```yaml
coverage:
  status:
    project:
      default:
        target: auto  # 前回のコミットと比較
```

### カバレッジ目標を緩和する

```yaml
coverage:
  status:
    project:
      default:
        target: auto
        # テストの不安定さに応じて調整
        # 前回の基本コミットからの10%の低下を許容
        threshold: 10%
```

### **すべてのコードをカバーする（あまり現実的ではない）**

```yaml
coverage:
  status:
    patch:
      default:
        target: 100%
```

### ブロックしない状況で、ステータスチェックを設定する

```yaml
coverage:
  status:
    project:
      default:
        informational: true
    patch:
      default:
        informational: true
```

## **プルリクエストコメントの形式を変更する**

```yaml
comment:
  layout: "diff, flags, files"  # 形式を変更するにはここから項目を削除
```

### **カバレッジの変更時のみコメントを表示する**

```yaml
comment:
  require_changes: true
```

### **CIテストの失敗時にカバレッジを表示する**

```yaml
codecov:
  require_ci_to_pass: false
```

### **すべてのCIステータスが完了しなくてもカバレッジ通知を送信する**

```yaml
codecov:
  notify:
    wait_for_ci: false
```

### **カバレッジを分離する**

```yaml
flags:
  projectA:
    paths:
      - src/projectA/
  projectB:
    paths:
      - src/projectB/

# フラグに基づいてステータスチェックを表示するには
coverage:
  status:
    project:
      default:
        flags:
          - projectA
          - projectB
      projectA:
        flags:
          - projectA
      projectB:
        flags:
          - projectB
```

各カバレッジレポートにフラグを割り当てる必要があります。同じレポートに複数のフラグを使用することは強くお勧めしません。代わりに、レポートを2回アップロードしてください。

```bash
./codecov  -f coverage.xml -F projectA
./codecov  -f coverage.xml -F projectB
```

### プルリクエストのコメントを無効にする

```yaml
comment: false
```

このガイドは、Codecovの一般的な設定を簡単に適用するためにメモしたレベルのものです。より詳細な情報や追加の設定については、[Codecovの公式ドキュメント](https://docs.codecov.com/docs)を参照してください。
laravelで環境構築時にstrageのpermissionエラーが発生する件について

### 現状
- laravelをコマンドで初期作成した。
- 実行すると、permissionエラーが発生した。
### 解決方法
- 権限を与えて、書き込みが可能なようにした。

### 具体的な解決策
**一番楽ではあるが、最大権限であるのでセキュリティリスクが上がってしまう。**
```curl
chmod -R 777 storage
```
**若干セキュリティリスクを下げたもの**
```
chmod -R 755 /var/www/html/storage
chown -R www-data:www-data /var/www/html/storage
```
所有者を変更し、権限を付与するようにしている。

### まとめ
権限周りのことをほとんど理解していない人間なので、もっと権限を絞りながら行う方法を学んだ場合は追記する。
日本語プログラミング言語 スミレ Java C# で関数を介した整数カウントアップ実行時間を仲良く競う（スミレ代入式で再計測）

# はじめに
日本語プログラミング言語 プロデル とJava C# とで関数呼び出しを介した整数カウントアップの反復実行時間を仲良く競い合わせてみます。いわゆるファンクションコールのオーバーヘッドとはどんなものなのかを切り分けます。スミレはプロデルコンパイラ2.0で検証したソースコードをスミレコンパイラ1.9でコンパイルし、C#と同じ.NET Core 6で実行してみます。プロデルの２つの手順呼び出しの構文の違いで有意差があり、スミレでも影響はあるようでしたので代入式構文で再計測しました。


## この記事内容の作業環境
Windows11 Pro 22H2
VSCode(Visual Studo Code)　1.78.2
java Eclipse Adoptium jdk-20.0.2.9-hotspot
C# 10 dotnet-sdk-6.0.404-win-x64
sumire Version 1.9.1191
CPU Intel(R) Core(TM) i3-5005U 2.00 GHz


## この記事内容の保証
※この記事の実行結果は参考情報です。実行環境に大きく依存します。

## 参考記事
### プロデルの結果
[日本語プログラミング言語 プロデル Java C# で関数を介した整数カウントアップ実行時間を仲良く競う](https://qiita.com/mylifewithviolin/items/d7f8b5b94ce1d40ee904)

### スミレ とは
[日本語プログラミング言語 スミレ とは](https://qiita.com/mylifewithviolin/items/8f90f8452d65439fd825)
# お題のソースコード
#### Java
お手数ですが[参考記事 プロデルの結果](https://qiita.com/mylifewithviolin/items/d7f8b5b94ce1d40ee904)をご参照ください。

#### C#
お手数ですが[参考記事 プロデルの結果](https://qiita.com/mylifewithviolin/items/d7f8b5b94ce1d40ee904)をご参照ください。

#### スミレ
```mind:callfunc.rdr
※コンソール
    【count:整数】は、0
    【countMax:整数】は、0
    
    もしプログラムのコマンドライン引数が無なら
    　　countMax=0
    そうでなければ
       例外監視
    　　  countMax=プログラムのコマンドライン引数(1)
    　　発生した場合
     　　 countMax=0
        監視終わり
    もし終わり
    
    開始日時は、今日
    count < countMaxの間、繰り返す
    
       	//countをカウントアップしたものをcountに代入する
    	count =　countをカウントアップする
    繰り返し終わり
    終了日時は、今日
    時間差は、終了日時-開始日時
    
    「処理回数：」＆ count＆ 「回」をコンソールへ表示して改行する
    「処理時間：」＆ 時間差の合計ミリ秒数＆ 「ミリ秒」をコンソールへ表示して改行する

【c:整数】をカウントアップする手順
     c = c +1
     cを返す
終わり

```
プロデルと同一のソースコードです。
代入文形式の
```
count =　countをカウントアップする
```
の方です。

# 実行結果
#### Java
お手数ですが[参考記事 プロデルの結果](https://qiita.com/mylifewithviolin/items/d7f8b5b94ce1d40ee904)をご参照ください。

#### C#
お手数ですが[参考記事 プロデルの結果](https://qiita.com/mylifewithviolin/items/d7f8b5b94ce1d40ee904)をご参照ください。

#### スミレ

```:
C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 40
処理回数：40回
処理時間：40.673ミリ秒

C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 400
処理回数：400回
処理時間：43.7571ミリ秒

C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 4000
処理回数：4000回
処理時間：58.7187ミリ秒

C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 40000
処理回数：40000回
処理時間：220.2294ミリ秒

C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 400000
処理回数：400000回
処理時間：1235.7707ミリ秒

C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 4000000
処理回数：4000000回
処理時間：10316.0762ミリ秒

C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 40000000
処理回数：40000000回
処理時間：106097.3538ミリ秒

C:\sumire\evalution>\sumire\sumire.exe callfunc.rdr 400000000
処理回数：400000000回
処理時間：1041675.9982ミリ秒

C:\sumire\evalution>
```
スミレの公式サイトにある実行方法に準じて実行してみましたが、この方法ですと最初にソースコードを中間コードに事前コンパイルするオーバーヘッドが乗っかってしまいますので、中間コードファイルの生成オプションがないか確認してみましたが、なさそうでしたので、この結果を比較対象とします。

# 実行結果まとめ
表3　関数経由の整数カウントアップの反復実行時間（ミリ秒）
| 実行回数 | Java | C# | スミレ |
|-:|-:|-:|-:|
|  40 |  0 | 6  | 40 |
| 400  | 0  | 6  | 43 |
| 4,000  | 0  | 6  | 58  |
| 40,000  | 0  | 6  | 220  |
| 400,000  | 2  | 11 | 1,235  |
| 4,000,000  | 3  | 62  | 10,316  |
| 40,000,000  | 5  | 538  | 283,792  |
| 400,000,000  | 6  | 5,304  | 1,041,675  |

※ナノ秒台は切り捨て

# おわりに
いかがでしたでしょうか？整数カウントアップの関数呼び出しを単純にループさせているだけですので、各言語、実装によってはいろいろな差異がでるものと思われますので、この件はあくまで参考情報です。
サーバーレスはなぜ人気なのか



サーバーレスアーキテクチャが近年人気を集めているのには、いくつかの大きな理由があります。

## 管理の簡素化

サーバーレスは、サーバーやOS、ミドルウェアなどの提供や管理をクラウド提供事業者が行うため、開発者はコードの作成に集中できます。
これにより、アプリケーションの開発とデプロイのプロセスが簡素化されます

## 課金方式の柔軟性

サーバーレスは利用単位で課金され、処理のリクエスト数と実行時間に応じて料金が決まります。
これにより、サービスの利用頻度に応じてコストを削減できる可能性があります

## スケーラビリティ

サーバーレスアーキテクチャは需要に応じて自動的にリソースがスケールするため、トラフィックの急増にも迅速に対応できます

## 用途の多様性

サーバーレスは動的なWebサイトやモバイルアプリのバックエンド、簡単なデータ処理、新規サービスのスタートアップ、マイクロサービスアーキテクチャの実現など、さまざまな用途に適用可能です

## 注意点

ただし、サーバーレス単体ではプログラムの実行しかできず、データベースやストレージなどの他のサービスとの組み合わせが必要です。

また、長期的な大量の処理にはコストが高くなる可能性があり、運用管理も一定程度必要です

👉 ポイント: サーバーレスの人気は、管理の簡素化、課金方式の柔軟性、スケーラビリティ、用途の多様性によるものですが、長期的な使用や複雑なシステムには注意が必要です。
[redux]redux-persistの使い方

# はじめに
redux-persistの使い方について簡単に書いていきます。

# redux-persistとは
redux-persistは、storeに保存したデータを永続化してくれるライブラリです。

https://github.com/rt2zz/redux-persist

# 使用方法
使い方の説明をしていきます。

## インストール
まずはインストールです。
```:npm
npm install redux-persist
```

```:yarn
yarn add redux-persist
```

## 実装コード
コードを書いていきます。
まずは、ルートファイルに以下のコードを書きます。
```index.tsx
import { store, persistor } from "../src/store/store";
import { PersistGate } from "redux-persist/integration/react";
import { Provider } from "react-redux";

root.render(
  <Provider store={store}>
    <PersistGate loading={null} persistor={persistor}>
      <App />
    </PersistGate>
  </Provider>
);

```
これは、redux-persistを使う際に、storeの情報をPersistGateを使って、永続的に管理できるようにするためのコードです。

次に、store.jsファイルで以下のように書いていきます。
※redux-persistに関係のないコードは省いています。
```/store/store.js
import { configureStore } from "@reduxjs/toolkit";

import AsyncStorage from "@react-native-async-storage/async-storage";
import { persistReducer, persistStore } from "redux-persist";

// ストレージ エンジンを明示的に渡す
const persistConfig = {
  key: "root",
  storage: AsyncStorage,
};

const persistedReducer = persistReducer(persistConfig, rootReducer);

export const store = configureStore({
  reducer: persistedReducer,
});

export const persistor = persistStore(store);
```
各コードについて解説します。

#### persistConfig オブジェクト
```/store/store.js
const persistConfig = {
  key: "root",
  storage: AsyncStorage,
};

```
**・key**
このキーは永続化ストレージ内での保存領域を指定します。"root" として指定されています。
**・storage**
Redux Persistが使用する永続化ストレージを指定します。このコードでは AsyncStorage が指定されています。AsyncStorage はReact Native環境で使用される、非同期にデータを永続化するためのストレージです。

#### persistedReducer

```/store/store.js
const persistedReducer = persistReducer(persistConfig, rootReducer);
```
**・persistReducer**
Redux Persistが提供する関数で、指定された構成に基づいてルートリデューサー（rootReducer）を変更し、永続化機能を持たせた新しいリデューサーを作成します。これにより、アプリケーションの状態がストレージに永続的に保存されるようになります。

#### ReduxのconfigureStore関数:
```/store/store.js
export const store = configureStore({
  reducer: persistedReducer,
});
```
**・configureStore**
Redux Toolkitが提供する関数で、Reduxストアを構成します。このコードでは reducer プロパティに persistedReducer を指定しています。これにより、永続化機能が組み込まれたReduxストアが作成されます。

#### Redux PersistのpersistStore関数
```/store/store.js
export const persistor = persistStore(store);
```
**・persistStore**
Redux Persistが提供する関数で、与えられたReduxストアを永続化します。persistor は後で、Reactコンポーネントで PersistGate コンポーネントに渡すことができ、アプリケーションの描画が永続化されたデータを読み込むのを待つようになります。

# 最後に
redux-persistは簡単にデータの永続化ができるので、便利だなと思いました。
他にも色々な記事を書いているので、よければ読んでいってください、、、

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/265c676d17fe21e75242

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
【ChatGPT無】に作詞を頼んでみたら、意外なことが判明。スマホでweb版利用の方は、注意が必要かも。

  
　どうも、カーブミラーです。

　今回は、ChatGPTに、作詞を頼んでみました。が、思わぬことが起こったので、報告します。

:::note info
本記事は、ChatGPT無料版有料版
で確認を行なっております。
あしからず。
:::

　まず、
　　10月に歌詞をお願いしました。
***
***User***
歌を書こうと思っています。
歌詞を考えてください。
リズミカルな曲にしたいです。
秋をテーマにお願いします。
愛を求める歌をお願いします。

***ChatGPT***
もちろん、お手伝いできます。秋をテーマにした愛を求める歌詞を考えてみましょう：

(Verse 1)
秋風が心をさらりと包む
赤や黄色に染まる葉が揺れる
君の笑顔、秋の陽のよう
心は奏でる、愛のメロディー

(Chorus)
秋の夜、星空の下
君と共に歩む未来に憧れ
愛の歌、この心から
君に捧げよう、永遠に続く歌

(Verse 2)
紅葉が語る、季節の変わり目
君と共にいれば、寒くはない
手を取って、歩いていこう
秋の愛、永遠に育てよう

(Chorus)
秋の夜、星空の下
君と共に歩む未来に憧れ
愛の歌、この心から
君に捧げよう、永遠に続く歌

この歌詞がお役に立てれば幸いです。リズムに合わせてメロディーを付けることができるでしょう。
***
　次が、
　　ゆうべ、同じプロンプトで
　　　やってみたところ
***
***ChatGPT***
秋風に乗せて　心揺れる
色づく木々の中　君を探してる
季節の移り変わり　愛を求める
君と共にいたい　この秋を抱きしめて
***
　これで
　　終わってしまいました。

　プロンプトを
　　変更しても
　　　この出力スタイルです。

　NewChatしても
　　同様です。
***
　ふと、最近X-Twitter上で
　　“スマホでweb版を
　　　使うと、回答が短くなる”
　　　　というつぶやきがあったのを
　　　　　思い出しました。

　そこでブラウザで
　　PCモードに変更して
　　　同じプロンプトを
　　　　投げてみました。

　回答内容の量が
　　明らかに違います。
　　　NewChatしても
　　　　同様です。

　ブラウザのPCモードを
　　解除すると、短い回答に。
***
　GPT-4でも
　　確認してみました。

　こちらは、
　　切り替えても
　　　出力量に変化がありません。
***
　どうやら、無料版だけ、
　　意図的に、そういう風に
　　　セッティングされている
　　　　ようですね。

　でも、
　　PCモードとスマホモードの
　　　回答の量が変わる、と
　　　　ユーザー（ブラウザ）ごとに
　　　　　出力が変わってしまい、
　　　　　　本来、得たい内容には
　　　　　　　ならないことに
　　　　　　　　なります。

　しかし、
　　切り替えを
　　　頻繁に行なうのも手間。
　　　　操作手順も手間が増えます。

　妥協点は、
　　各人で違うので、
　　　そこの判断は、
　　　　お任せするしかありません。

　ChatGPTさんの回答として、
　　何を求めるのか、を
　　　見極める必要がありますね。

　それこそ手間、
　　なんですけどねw

　まぁ、無料版だから
　　仕方ないのかな。

　ということで、
　　今回は、ここまで。
DynamoDBとAmazon RDSの料金体系


2023/11/27時点

## DynamoDBの料金体系
DynamoDBの料金は、データの読み込み、書き込み、およびストレージの使用量に基づいて計算されます。
読み取りには4KBごと、書き込みには1KBごとに単位が計算されます。
また、使用するGSI（Global Secondary Index）によっても料金が変わることがあります。DynamoDBには以下の2つの料金体系があります

1. **オンデマンド容量モード**: アプリケーションのトラフィックに基づいて料金が計算されます。データベースのトラフィックが予測不可能な場合や、使用した分だけを支払いたい場合に適しています。

2. **プロビジョンド容量モード**: ユーザーが秒間の読み書きの量を指定する必要があります。トラフィックが予測可能で一定の場合に適しています。

https://aws.amazon.com/jp/dynamodb/pricing/#How_to_calculate_costs


## Amazon RDSの料金体系
Amazon RDSの料金は、使用するデータベースインスタンスごとに月額が課金されます。使用するデータベースエンジン（MySQL、Auroraなど）とサーバーの容量に基づいて、複数の料金ティアがあります。
Amazon RDSにはオンデマンド料金モデルがありますが、これは予約インスタンスの料金よりも高いことが一般的です。予約インスタンスでは、1年または3年の長期契約で支払いを行います


Amazon RDSのオンデマンドDBインスタンスは、インスタンスのクラス（例えば、db.t3.smallやdb.m5.large）に基づいて請求されます。
請求はインスタンスが利用可能になった時点から開始され、料金は時間単位で表示されますが、秒単位で計算され、最小10分間の使用が課金されます


予約DBインスタンスには、次の3つのオプションがあります

1. **前払いなし**: 予約DBインスタンスにアクセスするための前払いは不要で、期間中の使用にかかわらず割引された時間単位の料金が請求されます。

2. **部分前払い**: 一部を前払いし、残りの時間については割引された時間単位の料金が請求されます。

3. **全額前払い**: 契約期間の開始時に全額を支払い、それ以降は使用時間に関わらず追加のコストは発生しません。

例えば、Amazon RDSの予約DBインスタンス（前払いなし）の場合、月額は次のようになります

- MySQLのSingle-AZ db.r5.large DBインスタンスクラスの場合、US East (N. Virginia)でインスタンスのコストは時給$0.12、月額$90です。
- 400 GiBの汎用SSD（gp2）ストレージは、GiBあたり月$0.115、合計で月$45.60です。
- 600 GiBのバックアップストレージは、月$19です（400 GiB無料）
- これらを合計すると、月額は$154.60となります。

オンデマンドDBインスタンスを利用する場合、上記のインスタンスは時給$0.1386、月額$101.18となり、合計で月額は$165.78になります。

これらの情報から、DynamoDBとAmazon RDSの料金体系には大きな違いがあり、使用状況に応じて最適な選択を行うことが重要です。

DynamoDBはトラフィックの予測が難しい場合や、特定の読み書き量を要求するアプリケーションに適している一方で、Amazon RDSは長期的な安定した使用が見込まれる場合にコスト効率が良いことがわかります。
i2cでデモ

PICのADCとMSP430のKeypadの値をLCDに表示するデモをFreeBSD/mipsなモジュールで作ってみました。

一行目にKeypadの入力を表示して二行目にADCの値を表示します。Keypadの#キーでクリアします。

```ruby
#!/usr/local/bin/mruby

MSPADDR = 0x48
LCDADDR = 0x3e
PICADDR = 0x04

LCD_CLEARDISPLAY = 0x01
LCD_RETURNHOME = 0x02
LCD_ENTRYMODESET = 0x04
LCD_DISPLAYCONTROL = 0x08
LCD_CURSORSHIFT = 0x10
LCD_FUNCTIONSET = 0x20
LCD_SETCGRAMADDR = 0x40
LCD_SETDDRAMADDR = 0x80

def getvol(t)
  t.write(PICADDR, 0, 0)
  vol = t.read(PICADDR, 1, 0) << 8 |  t.read(PICADDR, 1, 1)
  t.read(PICADDR, 1, 2)
  vol
end

def dispvol(t, v, c)
  t.write(LCDADDR, [0x00, LCD_SETDDRAMADDR | 0x40])
  usleep 2_000
  sp = " " * (8 - v.to_s.length)
  arr = [0x40]
  arr += sp.bytes
  arr += v.to_s.bytes
  t.write(LCDADDR, arr)
  t.write(LCDADDR, [0x00, LCD_SETDDRAMADDR | 0x00 + c])
end

t = BsdIic.new(0)

count = 0

t.write(LCDADDR, [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c])
usleep 200_000
t.write(LCDADDR, [0x38, 0x0d, LCD_CLEARDISPLAY])
usleep 2_000

vol = getvol(t)
dispvol(t, vol, count)
lastvol = vol

lastkey = 0
loop do
  key = t.read(MSPADDR, 1, 2)
  if key != 0 && key != lastkey
    if key == "#".ord
      t.write(LCDADDR, [0x38, 0x0d, LCD_CLEARDISPLAY])
      usleep 2_000
      count = 0
      dispvol(t, lastvol, count)
    else
      arr = [0x40]
      arr.push(key)
      t.write(LCDADDR, arr)
      count += 1
    end
  end
  vol = getvol(t)
  if lastvol != vol
    dispvol(t, vol, count)
    lastvol = vol
  end
  lastkey = key
  usleep 100_000
end
```

MSP430にもADCはあるので、MSP430だけでもできます。

![IMG_20231127_113159.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/58334b2f-4b26-631b-baec-77219d85129c.jpeg)
SAP for Meにアシスタントがつきました。

SAP for Meに新しいボタンができていました。
Fiori LaunchpadのUser Assistantと同じものですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2587098/7e5d93ac-895c-a4e3-c215-124b7e829b54.png)

メニュー等のヘルプは出ますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2587098/dfb6bf16-ca6c-e4b4-b781-820216dfc476.png)
個別アプリ（タイル）のヘルプはないっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2587098/8453ac41-f160-1b6e-52c2-68d1c2402c8e.png)

私は、ブラウザを英語で使っているのですが、
日本語の場合、ヘルプの内容は英語のまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2587098/6ddd9383-9dd6-371e-757d-2ca057e8c393.png)

が、右下のコンテンツ翻訳ボタンを押すと表示言語に翻訳されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2587098/b7cc4328-cbd0-dfc2-6d8f-609a423e21a9.png)
NoSQLを使おう



NoSQLデータベースは、従来のリレーショナルデータベース（RDB）とは異なるアプローチを採用しており、多様なデータ型の管理や大規模なデータセットの操作に適しています。


この記事では、NoSQLの特徴、利点、そしてリレーショナルデータベースとの違いについて解説します。

## NoSQLデータベースの特徴

1. **柔軟なスキーマ**:
   - NoSQLデータベースは固定されたスキーマを持たず、様々な形式のデータを格納できます。

2. **スケーラビリティ**:
   - 大量のデータや高いトラフィックに対応できるように設計されており、水平スケーリング（サーバーの追加）が容易です。

3. **高いパフォーマンス**:
   - シンプルなクエリ操作や大規模なデータセットへの高速なアクセスを提供します。

4. **多様なデータモデル**:
   - キー・バリューストア、ドキュメント指向、カラムファミリー、グラフベースなど、多様なデータモデルをサポートしています。

👉 ポイント: NoSQLは柔軟なスキーマ、高いスケーラビリティ、パフォーマンス、多様なデータモデルを特徴としています。

## NoSQLの利点

1. **柔軟性**:
   - さまざまなデータ型を扱いやすく、変更が頻繁にある環境に適しています。

2. **大規模データの取り扱い**:
   - ビッグデータやリアルタイムのデータ処理に強みを持っています。

3. **低コスト**:
   - オープンソースの選択肢が多く、水平スケーリングによりコスト効率が良いことが多いです。

4. **開発のスピード**:
   - 柔軟なスキーマのため、開発プロセスが早く進むことがあります。

👉 ポイント: NoSQLは柔軟性、大規模データの取り扱い、低コスト、開発のスピードが利点です。

## NoSQLとRDBの違い

- **スキーマの柔軟性**:
  - RDBは固定されたスキーマを必要とし、事前にテーブルの構造を定義する必要があります。
- **スケーリング方法**:
  - RDBは垂直スケーリング（サーバーの性能向上）が一般的ですが、NoSQLは水平スケーリング（サーバーの追加）に適しています。
- **トランザクション**:
  - RDBは強力なトランザクション処理を提供しますが、NoSQLはこれを犠牲にしてパフォーマンスを向上させています。
- **データモデル**:
  - RDBは表形式のデータを扱い、関連を結合で表現します。一方、NoSQLはドキュメントやキーバリューなど、より多様なデータモデルを採用しています。

👉 ポイント: NoSQLとRDBの主な違いは、スキーマの柔軟性、スケーリング方法、トランザクション処理、データモデルにあります。

このようにNoSQLは特定の用途や環境において非常に有効なデータベースソリューションです。
その柔軟性とスケーラビリティは、現代のデータ駆動型アプリケーションの開発において重要な役割を果たしています。
開発でよく使うショートカット(🚧編集途中)


# はじめに

私のためのあんちょこ

# 方針(戒め)

- あまりカスタマイズしないでデフォルトのショートカットを使うこと

# 記号

|Cmd|Opt|Shift|Ctrl|Tab|Esc|Backspace|
|:---:|:---:|:---:|:---:|:---|:---:|:---:|
|⌘|⌥|⇧|⌃|⇥|⎋|⌫|

# Intellij

|description|command|my custom|
|:---|:---:|:---:|
|パンくずリストに移動|cmd + ↑||
|エディターペインを最大化する|⌘cmd + ⇧shift + F12||
|型を表示|ctrl + shift + p||
|暗黙の型を表示|cmd + shift + p||
|Surround With(式をstatementで囲む)|cmd + opt + t||
|選択範囲の拡大/縮小|opt + ↑/↓||
|実装クラスへジャンプ|cmd + opt + b||
|エラーへジャンプ|F2||
|refactorメニュー|ctrl + t||
|実装クラスへジャンプ|cmd + shift + t||
|折りたたみ/展開|cmd + -/+||
|全て折りたたみ/全て展開|cmd + shift + -/+||
|再起的に展開|cmd + opt + -/+||
|次のメソッド|ctrl + shift + ↓/↑||
|basic complitioon|ctrl + space|ctrl + c||
|エラーの説明|cmd + F1||
|Problem Windowを開く|cmd + 6||
|開いているWindowを上/下に広げる|opt + ctrl + ↓/↑|cmd + ctrl + shift + K/J|
|ウィンドウからエディターにフォーカスを切り替える|esc||
|terminalにフォーカスを切り替える|opt + F12|cmd + ctrl + t|
|最後のアクティブウィンドウに移動する|F12||
|矩形選択 Optを2回押してからリリースせずに上下の矢印キー|opt -> opt ↑or↓||
|クイックフィックス|opt + enter||
|マルチカーソル(選択箇所と同じ次のテキストを選択)|ctrl + g||
|マルチカーソル(選択箇所と同じテキストを全て選択する)|ctrl + shift + g||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||

# macOS

|description|command|my custom|
|:---|:---:|:---:|
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||

# VSCode

|description|command|my custom|
|:---|:---:|:---:|
|コマンドパレットを開く|⇧⌘P||
||cmd + P||
|ラインを上下に移動|⌥ ↓ / ⌥ ↑||
|下 / 上に行を挿入|⌘ + Enter / ⇧ ⌘ + Enter||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||

# iterm

|description|command|my custom|
|:---|:---:|:---:|
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||

# vim

|description|command|my custom|
|:---|:---:|:---:|
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||
|text|cmd + a||

# vim dein

surround.vim

|description|command|shortcut|
|:---|:---:|:---:|
|文字を記号で囲む|(文字を選択) shift + s + (囲みたい記号) <br />ex) shift + s + `記号` -> 文字を`記号`で囲む||
|囲われた文字の記号を削除| ds + `記号`||
|両端の囲み文字を変更|cs + `記号`||

xxxxxxxxxxxxxx

|description|command|shortcut|
|:---|:---:|:---:|
||||
||||
||||
Qiitaでよく使いそうなマークダウン記法を一例とともに紹介

# 概要

せっかく書くなら**伝わりやすい記事**を書きたい！
そのためにまず自分なりのQiitaフォーマットを作ろう。
それにはQiitaでも利用されている[マークダウン記法](https://ja.wikipedia.org/wiki/Markdown)を習得する必要がある。
以下で実際に記法と結果を書きながら覚えていく。
<details><summary>今回使う記法（クリックで展開）</summary>

| 記法 | 使う場面の例 |
|:-----------|:------------|
| [見出し](#見出し) | 目次になるところで区切る |
| [リンク](#リンク) | 参考になる別のサイトにつなげる |
| [太字](#太字)  | 文字を強調する |
| [取り消し線](#取り消し線) | 変更記録を残す |
| [折り畳み](#折り畳み) | 詳細を隠す |
| [脚注](#脚注) | ちょっとした説明を別で書く |
| [順序付きリスト](#順序付きリスト) | 順番で説明する |
| [補足](#補足) | 要点を強調する |
| [表](#表) | それぞれの項目で比較する |
| [画像](#画像) | 文字以外で説明する |

:::note
HTMLタグ内では上の表は **[この記法](#表)** を使う
:::

![gifExample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444417/3e6bd279-ce15-b1d1-6cf6-58e044aa33a8.gif "表の出し方")

:::note alert
~~divタグで囲めば動画のやり方もできる？~~
できませんでした
:::

</details>

# 見出し
~~~txt:記法
# 一番大きい見出し
### 小見出し
~~~
# 一番大きい見出し
### 小見出し
本文（大きさ比較用）

# リンク
~~~txt:記法
[Qiita](https://qiita.com/)
~~~
[Qiita](https://qiita.com/)

## 同ページ内リンク（ジャンプ）
~~~txt:記法
[概要に戻る](#概要)
~~~
[概要に戻る](#概要)

# 太字
~~~txt:記法
**強調したい文字**
~~~
**強調したい文字**

# 取り消し線
~~~txt:記法
~~取り消したい文字~~
~~~
~~取り消したい文字~~

# 折り畳み
~~~txt:記法
<details><summary>（クリックで展開）</summary>
隠れテキスト
</details>
~~~
<details><summary>（クリックで展開）</summary>
隠れテキスト
</details>

# 脚注
~~~txt:記法
脚注を入れるところ[^1]
[^1]:脚注です（※記事の一番下に脚注が追加されます）
~~~
脚注を入れるところ[^1]
[^1]:脚注です（※記事の一番下に脚注が追加されます）

# 順序付きリスト
~~~txt:記法
1. 半角数字.（半角スペース）と入力
1. 横に文字を入力
1. 改行すると自動で次の数字が出てくる
~~~
順序付きリストの作り方
1. 「半角数字. （半角スペース）」と入力
1. 横に文字を入力
1. 改行すると自動で次の数字が出てくる

# 補足
~~~txt:記法
:::note
推奨
ここに書いてあることをやればOK！
:::

:::note warn
注意
ここに書いてあることに注意！
:::

:::note alert
禁止
ここに書いてあることはやっちゃダメ！
:::
~~~
:::note
推奨
ここに書いてあることをやればOK！
:::
:::note warn
注意
ここに書いてあることに注意！
:::
:::note alert
禁止
ここに書いてあることはやっちゃダメ！
:::

# 表
~~~txt:記法
|左|中|右|
|:-|:-:|-:|
|ひだり|なか|みぎ|
|かくにん|かくにん|かくにん|
~~~
|左|中|右|
|:-|:-:|-:|
|ひだり|なか|みぎ|
|かくにん|かくにん|かくにん|

|:-|で左揃え、|:-:|で中央揃え、|-:|で右揃え

# 画像
~~~txt:記法
![ドラッグアンドドロップ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444417/de662b3f-3194-a37c-a424-f94952609500.gif "ドラッグアンドドロップ")
~~~
![ドラッグアンドドロップ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444417/de662b3f-3194-a37c-a424-f94952609500.gif "ドラッグアンドドロップ")

画像ファイルを編集画面へドラッグアンドドロップでも可能

# まとめ
今回は、これから使いそうなマークダウン記法を覚えるために、実際の記事の形でまとめました。
今後は実際にこれらの記法を用いた記事を書いていき、自分なりのQiita記事のまとめ方を身に着けていこうと思います。

| 記法 | 使う場面の例 |
|:-----------|:------------|
| [見出し](#見出し) | 目次になるところで区切る |
| [リンク](#リンク) | 参考になる別のサイトにつなげる |
| [太字](#太字)  | 文字を強調する |
| [取り消し線](#取り消し線) | 変更記録を残す |
| [折り畳み](#折り畳み) | 詳細を隠す |
| [脚注](#脚注) | ちょっとした説明を別で書く |
| [順序付きリスト](#順序付きリスト) | 順番で説明する |
| [補足](#補足) | 要点を強調する |
| [表](#表) | それぞれの項目で比較する |
| [画像](#画像) | 文字以外で説明する |

### 参考元サイト
1. [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
1. [一番簡単なキータ記事の書き方](https://qiita.com/himartmusume/items/cb05525beae58b1614fc)
AndroidStudio: プロジェクトのコピー

Project01 というプロジェクトを、Project02 にコピーします。

前提条件
元のパッケージの名前に、プロジェクト名を含めないで下さい。
（含めるとコードの修正をする必要が発生します。
ですから、再利用の可能性がある時は、開発のスタート時に注意する必要があります。）

次は、Project01 の MainActivity.kt です。

```MainActivity.kt
package org.ekzemplaro

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4a4c34fd-e18e-f415-ad0b-1af706199431.png)

## フォルダーのコピー

```bash
cp -r Project01 Project02
```

Project02 を開くと　左上が、Project01 と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/158b2ed0-0243-85f1-0232-64e618d11ea8.png)

## 環境の修正

```xml:res/values.xml
<resources>
    <string name="app_name">Project02</string>
</resources>
```

```settings.gradle.kts
（省略）
rootProject.name = "Project02"
（省略）
```

## 修正の反映

File -> Invalidate Caches
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a2b14df5-2bd8-988a-ef9d-c41f360ca5e3.png)

Invalidae and Restart をクリック

左上が、Project02 と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/74aaecef-bd64-724d-9847-3af18cd03538.png)
ESLintのチェックを無効にする方法

# はじめに
ESLintを特定の箇所のみ無効にする方法について書いていきます。

# 設定方法
以下がサンプルコードです。
※「node-schedule」のコードに対して、設定していきます。

```
const rule = new schedule.RecurrenceRule();
rule.tz = "Asia/Tokyo"; // 日本時間
rule.hour = 14;

// eslintを無効にするコメント
/* eslint-disable */
const job = schedule.scheduleJob(rule, function () {
  pdf.deletePdfFolder(APP_NAME);
});
/* eslint-disable */

```
このようにすることで、「/* eslint-disable */」で囲った部分は、eslintが適用されないようにできます。
どうしてもeslintが邪魔だなっていう部分に適用させたい時に使えるのかなと思います。
また、ファイル全体で、eslintを無効にしたい場合は、ファイルの先頭で「/* eslint-disable */」を使用すれば、そのファイル全体でeslintが無視されます。

# ドキュメント
https://eslint.org/docs/latest/use/configure/rules