OmniAICreator/Qiita-1.07M huggingface dataset:
kintoneにレコード追加されたときにzapier経由でLINE WORKSに通知する

# はじめに
この記事は「[kintone Advent Calendar 2022](https://qiita.com/advent-calendar/2024/kintone)」の20日目の記事です！

データを貯めたり、データに関わるコミュニケーションとしてkintoneを使いつつも、社内のコミュニケーションとしてLINE WORKSを使っているという方は結構いるのではないのでしょうか？？

LINE WORKSに2024年6月頃に追加になった「Incoming Webhook アプリ[(概要)](https://line-works.com/blog/solution/incoming-webhook-app/)」を使い、iPaaSと連携することで、比較的容易にノーコードでLINE WORKSのトークルームに通知を飛ばすこそが出来ます！！

# 今回のシナリオ
kintoneに作った「入金登録アプリ」にレコードを追加したら、LINE WORKSのトークルームに通知を投稿する
 

# 今回使ったアーキテクチャ
* [kintone](https://kintone.cybozu.co.jp/)
* [zapier](https://zapier.com/)
* [LINE WORKS](https://line-works.com/)とIncoming Webhook アプリ[(詳細)](https://developers.worksmobile.com/jp/docs/webhook)

# 処理イメージ
![ブログ用 - Frame 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/d17445fe-a2bd-685a-5e0f-96ce69afcdd1.jpeg)


# やったこと
## kintoneでの設定
* zapierから接続するためのAPIトークンの作成
* 詳細については **[コチラ](https://jp.cybozu.help/k/ja/user/app_settings/api_token.html)** を参照

## LINE WORKSでの設定
* Incoming Webhookアプリを登録する
* トークルームにIncoming Webhook Botを招待
* Webhookリストに追加
* zapierで設定するためのWebhook URLを取得できる
* 詳細については **[コチラ](https://developers.worksmobile.com/jp/docs/webhook#usage)** を参照

## zapierでの設定
* zapierからkintoneへの接続設定
    * ドメイン、アプリID、APIトークンなど
* 下記の設定を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/42ae71a1-6956-0547-6e27-6bf664bd441a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/4538a1ae-0f2c-cf0b-afb7-f761cf2566a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/66d7e3ad-9038-1028-7ff5-ff61962ef990.png)

**※Setupでは「Custom Request」で設定します。**
![2024-12-11_06h55_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/eecabcdd-486a-f22c-3ec0-d5f957278db2.png)


# 実行結果
![2024-12-11_06h29_441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/818dd167-90fe-9809-6ca5-feace3847336.png)


# まとめ
* Incoming Webhookの使い方、勉強になった
* Incoming Webhookへ投げるDataの書き方でちょっとハマったけども、全体としてはサクッとできましたー
* LINE WORKSに通知だけしたいというニーズは結構あるので、使いどころはたくさんありそうですね！
* LINE WORKSへのIncoming Webhookの追加は5つまでという事なので、通知できるトークルームが5つという事になるが、通知のトリガとなるkintoneのアプリは沢山あっても問題ないので、複数のkintoneアプリからの通知を受け取る用のトークルームを用意するのが良いかもしれないですね。
[番外編 #8] 「jpeg」と「png」どちらにしましょうか

<!--
<font color="c00000"></font> 赤
-->
## はじめに
:desktop: 皆様お疲れ様です。今回は **「画像の保存形式」** について見ていきたいと思います。その中でも **「jpeg」** と **「ping」** について見ていきます。どちらも**画像を圧縮して保存する**ファイル形式ですが、適切な用途がそれぞれあります。

## 「JPEG」「PNG」は拡張子の１つ
**拡張子**とは、ファイルの種類を識別するための文字列。ファイル名と拡張子を「.（ドット）」で区切ります。（イメージは👇の図です）
![スクリーンショット 2024-12-09 234108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/ad7a0db4-e8c1-cc7e-382a-692061d47257.png)
:rolling_eyes: 画像ファイルだと他に「.GIF」もありますよね動画じゃないけど動きのあるもの

:::note info
ファイルを開くためには、<font color="c00000">**拡張子によっては専用のアプリケーションが必要**</font>です。例えばWordは「.doc」、Excelは「.xsx」「.xlsx」「.csv」などで開きます
:::
:::note warn
ファイルデータは拡張子によって**作成したアプリケーションを判断**しています。安易に変更してしまうと、<font color="c00000">**データが開けなかったり、破損する可能性が高まります**</font>
:::

## JPEG形式
「.jpeg」は **「Joint Photographic Experts Group（JPEG）」** であり、デジタル写真の最も一般的な保存方法の一つでです。JPEGは、圧縮プロセスより、画像ファイルのサイズが大幅に削減されるため、webページでの保存と読み込みが容易になります。（最大約1600万色を使用できます）

:::note info
:pencil2: フルカラーに対応しているので**色数が多い画像やイラスト**に適しています
:::


## PNG形式
「.png」は **「Portable Network Graphics（PNG）」** であり、圧縮可能です。JPEGと同様に約1600万色に対応しています。高品質の写真ではなく、主にwebのグラフィック、イラストなどに使用されます。これはJPEGよりも**多くの保存スペースを使用するため**です。そして<font color="c00000">**画像透過**</font>、透明な背景のグラフィックを処理する機能があります。

:::note info
:pencil2: **色数が少ない画像**にはPNGが適しています（色と色との境目までハッキリと表現でき、粗が少なく綺麗に仕上げられるからです）
:::


### JPEGとPNGの違い①「可逆と非可逆」
JPEGは **「非可逆圧縮」**、PNGは **「可逆圧縮」** です。画像データは一般的にサイズが大きく、データ圧縮は非常に重要な技術となります。

**「可逆圧縮」** は<font color="c00000">**再び元の画像に復元ができ**</font>、**「非可逆圧縮」** は<font color="c00000">**完全な復元はできません。（画質の劣化が生じるためです）**</font>

### JPEGとPNGの違い②「ファイルのサイズ」
PNGは、可逆圧縮のために**ファイルのサイズがJPEGよりも大きくなります。（多くの情報が保持されているからです）** 通常、JPEGやGIFよりもサイズが大きくより多くのストレージスペースを使用します。

### まとめ
それぞれの違いをまとめてみました
|  | JPEG | PNG |
|:-:|:-:|:-:|
| 画像の透過 | ×  |  〇 |
| 圧縮方式 | **非可逆圧縮**  | **可逆圧縮**  |
| 容量 | 軽い  | 重い  |
| 主な用途 | フルカラーの写真やカメラ写真など| Webサイトの写真、ロゴ、イラストなど  |

画像の綺麗さは、ユーザーに与える印象も左右してしまいます。JPEGとPNGの違いを理解して最適な方を使うことが大事と理解できました。
最後まで読んで頂きありがとうございました！
> 参考元

https://n-works.link/blog/marketing/difference_between_jpeg_and_png#:~:text=PNG%E3%81%AF%E5%8F%AF%E9%80%86%E5%9C%A7%E7%B8%AE%E3%82%92,%E3%81%8C%E9%87%8D%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82

https://www.adobe.com/jp/creativecloud/file-types/image/comparison/jpeg-vs-png.html

>>過去の番外編はこちら

https://qiita.com/aoiku/items/bebee0d898a4971a3146

https://qiita.com/aoiku/items/19cf51605f80c60d4004

https://qiita.com/aoiku/items/c500c4cb65499d11027a

https://qiita.com/aoiku/items/24a63ba63349c07a235c

https://qiita.com/aoiku/items/586f74ac39e1c9e3f816

https://qiita.com/aoiku/items/06059f13aa6782cb7ab8

https://qiita.com/aoiku/items/02b1e4ba816e4910d488

https://qiita.com/aoiku/items/8185c15c75d864586cbc
TypeScriptのコードをESLintでComplexity使って複雑性を算出し、ChatGPTに簡潔にしてもらうTips

TypeScriptでHooksやService（APIとの連携や型変換、返り値のハンドリングなど）、UIコンポーネントの汎用化を書いていると、コードがどんどん読みづらくなったり理解しづらくなったりするのではないでしょうか。私はします。

しかし、具体的にどういう読みづらさなのかは、行数が多いとか分岐やPromiseなどによるネストあたり以外にパッと答えづらいと思います。

このようなときは「複雑性（Complexity）」を算出してしまいましょう！
さらに複雑化してしまったコードをリファクタリングするにあたり、ChatGPTを使ってしまおうという話です。

## Complexityの設定

Complexityについての説明は以下のQiitaがとても参考になります。

https://qiita.com/shisama/items/557a68e0aaafc4858be1

※上記記事中に書かれているTypeScript向けの `cyclomatic-complexity` は、2020年にTSLintが非推奨となったため個人的にも推奨はしません。

これに加えて `sonarjs` が提供しているプラグインも追加すると尚良しです（重複して検出されてしまう部分はありますが、それはそれで）

以下手順です。

### eslint-plugin-sonarjsのインストール

https://github.com/SonarSource/eslint-plugin-sonarjs

以下はnpmですが、yarnでもpnpmで読み替えてください。

```
npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-prettier prettier　eslint-plugin-sonarjs
```

### ESLintの設定

以下は.jsにしてますが、.jsonの場合はそのフォーマットに従ってください。
また、 __ESLint8__ が前提です。自身のプロジェクトから掻い摘んで最小の構成にしているので、動かなかったらごめんなさい……。

```json:.eslintc.js
module.exports = {
  "env": {
    "browser": true,
    "es6": true,
    "node": true,
  },
  "extends": [
    "eslint:recommended", 
    "plugin:@typescript-eslint/recommended",
    "plugin:sonarjs/recommended",
    "prettier"
  ],
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "import",
    "sonarjs",
  ],
  "rules": {
    "complexity": ["error", 10],
  },
};
```

complexityの詳細な説明：

https://eslint.org/docs/latest/rules/complexity

これで完了です。

## 実際にlinterを実行したときの例

こんな感じで出力されます。

```shell
/Users/bon/work/test/aaa.ts
  3:3  warning  Replace this if-then-else flow by a single return statement  sonarjs/prefer-single-boolean-return

/Users/bon/work/test/bbb.ts
  5:8  warning  Function 'checkValid' has a complexity of 17. Maximum allowed is 10  complexity
```

1行目が `sonarjs/prefer-single-boolean-return` で、 2行目が `complexity` のLinterの警告です。

## ChatGPTに仕事をさせる

ここからはAIの出番です。
LLMが出てくるまでは、人が頑張ってリファクタリングしていたと思うのですが、ある程度であればChatGPTに雑に聞くだけでなんとかなります。
プロンプトの例は以下のような感じです。

```
これから入力するコードはESLintによってComplexityが10以上と判断された複雑性のあるコードです。
このコードをリファクタリングして、Complexityが9以下となるように修正してください。修正してもらったコードを再度Linterを実行して検証します。
なお、その際に改めてComplexityが10を超えてしまった場合は再度コードを入力するのでその都度リファクタリングをしてください。

発生している警告は以下です。
（ESLintの警告文を貼る）

対象のコードは以下です。
(コードを貼る）
```

これだけでなんかいい感じにComplexityが減っていきます。
あとは変数名やコメントなどを適宜人間が加筆修正するだけです。生産性バク上がりですね。ぜひお試しください。

ちなみに所感ですが、10程度ならギリギリコードリーディング可能な印象を受けます。13あたりになるとPropsの指定でどう出し分けができるのかわからなかったり、分岐が多くて組み合わせによる条件網羅が把握しづらかったりします。総合するとComplexityを11くらいにするとちょうどよいかもしれません。

なお、例で出ている 17 という数値は使ってみても出し分けがどうなるかわからん闇鍋メソッドです。（所感）
c#で、なでしこ その6

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
湯婆婆を書け。

# サンプルコード

```

「
契約書
甲は油屋当主として、乙を油屋に雇用することを契約し、
労働に伴う対価の支払いを右の通り、約定する。
なお、一日の労働の対価は金百円とする。
甲　油屋当主　湯婆婆

乙
契約書だよ。そこに名前を書きな」と入力。
それを名前に代入。
4の乱数をあに代入。
あ＋１をあに代入。
#あを表示
「フン。{名前}というのかい。贅沢な名だねぇ。」と表示。
名前のあから1文字抜き出して新しい名に代入。
「今からお前の名前は{新しい名}だ。
いいかい、{新しい名}だよ。
分かったら返事をするんだ、{新しい名}!!」と表示。

```

# 実行結果

```
>cnako2 yuba.nako

契約書
甲は油屋当主として、乙を油屋に雇用することを契約し、
労働に伴う対価の支払いを右の通り、約定する。
なお、一日の労働の対価は金百円とする。
甲　油屋当主　湯婆婆

乙
契約書だよ。そこに名前を書きな
腹美恵子
フン。腹美恵子というのかい。贅沢な名だねぇ。
今からお前の名前は腹だ。
いいかい、腹だよ。
分かったら返事をするんだ、腹!!

```

以上。
c#で、なでしこ その5

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
zundokoを書け。

# サンプルコード

```

nは0
wは0
(wは0)の間
　もし、(2の乱数)=0ならば
　　nはn + 1
　　「ズン」と継続表示
　違えば
　　「ドコ」と継続表示
　　nは0
　もし、n=4ならば
　　「ドコ　キ・ヨ・シ！!」と表示
　　wは1


```

# 実行結果

```
>cnako2 zun.nako
ズンドコドコズンズンズンドコドコズンズンドコドコズンズンドコズンドコドコドコドコズンドコドコズンズンドコズンドコドコズンズンドコズンドコドコズンズンドコズンドコドコズンドコドコドコドコドコドコズンズンズンドコドコドコズンドコズンドコズンドコズンドコドコドコズンドコドコドコズンズンズンズンドコ　キ・ヨ・シ！!
```

以上。
c#で、なでしこ その4

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
fizzbuzzを書け。

# サンプルコード

```

iを１から99まで繰り返す
　ｆは0
　もし、i％15＝0ならば
　　「fizzbuzz」と表示
　　ｆは1
　もし、i％3＝0 && f=0ならば
　　「fizz」と表示
　　ｆは1 
　もし、i％5＝0 && f=0ならば
　　「buzz」と表示
　　ｆは1
　もし、ｆ＝0ならば
　　iを表示



```

# 実行結果

```
>cnako2 fizz.nako
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
31
32
fizz
34
buzz
fizz
37
38
fizz
buzz
41
fizz
43
44
fizzbuzz
46
47
fizz
49
buzz
fizz
52
53
fizz
buzz
56
fizz
58
59
fizzbuzz
61
62
fizz
64
buzz
fizz
67
68
fizz
buzz
71
fizz
73
74
fizzbuzz
76
77
fizz
79
buzz
fizz
82
83
fizz
buzz
86
fizz
88
89
fizzbuzz
91
92
fizz
94
buzz
fizz
97
98
fizz
```

以上。
c#で、なでしこ その3

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
九九を書け。

# サンプルコード

```

iを１から9まで繰り返す
　jを１から9まで繰り返す
　　i * jを継続表示
　　「 」を継続表示
　「」を表示


```

# 実行結果

```
>cnako2 kuku.nako
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
```

以上。
オンライン決済による農家の直接収入の可能性

# はじめに
一次産業から販売者へではなく消費者に来てもらうためにはどうしたら良いか考えていました。
そこで耕作地で作業中でもオンラインで決済可能ならば現金の用意が要らないのではと思いつき検討してみることにしました。

## 1 実行できるか考えよう
### 1.1 PayJPの導入
#### PAY.JPの登録

PAY.JPのアカウントを作成
https://pay.jp/

### 1.2 決済用ホームページの作成
#### 屋外でその場で決済の使用を考えているからQRコード支払いみたいに出来ないか。
ちょうど良い参照先が https://qiita.com/S_H_/items/80b2b11aa24b5679f865
農産物だし返金処理はなくても問題ないかも？
PRのためにもホームページは必要だと感じるからそっちにはギフト用のページにしようか。

## 1.3 現状の課題
#### PAY.JPを使うのはクレジットカード支払い前提なのでカード情報の入力が必須のため購入完了までの間に商機を逃す可能性がある。
事前にカード情報のトークンを作成してもらう方法を考えたい。

# 以上検討中
これから書き足していきたい


# 終わりに
コードを調べる前にNO学系農家だからか必要な要素を考えるだけでも大変です。
このままでは未来は明るくない・・・(｡ŏ﹏ŏ)・・・
[備忘録]　Youtubeを見ながらUnityの勉強　2日目

# はじめに
　こんにちは，Umamusume22です。最近、業務でUnityを使っているのですがUnityが分からないので自主的に勉強を始めました。とりあえず、Youtubeを見ながらUnityの勉強を行います。学んだことはここの記事にアウトプットしていきます。
 今日は以下の動画を見てUnityの勉強を行いました
 
https://youtu.be/uVinvDdxKKA?si=ddidH_Wjy3PiPA9i

 # 備忘録
 - 物体を動かすことでtransformの値も変動する
 - scaleは物体の大きさを変える。倍率を表す
     - 右斜めの矢印を表すアイコンは物体の大きさを変える
 - 右クリックで視点を回転
 - 左クリックで並行ドラッグ
 - Duplicateで複製


# 最後に
　勉強した内容を備忘録にしました。

 

ここまで記事を読んでいただきありがとうございました！

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteもやっています．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!
c#で、なでしこ その2

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
調査してみた。

# ナデシコバージョンの表示

```
0.001
```

# OSバージョンの表示

```
6.2.9200.0

```

# OSの表示

```
Microsoft Windows NT 6.2.9200.0

```

# 利用中プラグイン列挙の表示

```
Libnako.NakoAPI.NakoBaseSystem
Libnako.NakoAPI.NakoPluginArray
Libnako.NakoAPI.NakoPluginString
NakoPluginFile.NakoPluginFile
NakoPluginFile.NakoPluginStream
NakoPluginConsole.NakoPluginConsole

```

# 利用中関数列挙の表示

```
GetEnumerator
MoveNext
Current
Dispose
ナデシコバージョン
OSバージョン
OS
利用中プラグイン列挙
利用中関数列挙
関数ルビ取得
表示
継続表示
足す
足
足す!
足!
引く
引
引く!
引!
掛ける
掛
掛ける!
掛!
割る
割
割る!
割!
余り
余
割った余り
割余
乗
乱数
絶対値
ABS
等しい
等
大きい
大
小さい
小
以上
以下
BEEP
整数部分
小数部分
四捨五入
切り下げ
切下
代入
終わり
終
配列追加
配列ポップ
配列要素数
配列削除
配列結合
配列逆順
配列検索
配列ハッシュキー列挙
要素数
配列一括挿入
配列キー存在?
配列コピー
文字数
文字列検索
置換
単置換
文字左部分
トリム
文字右部分
切り取る
切取
文字抜き出す
文字抜出
全角か判定
全角判定
文字削除
文字右端削除
文字挿入
文字列分解
区切る
区切
数字か判定
数字判定
追加
英数半角変換
ゼロ埋め
ゼロ埋
半角変換
小文字変換
大文字変換
何文字目
出現回数
カナローマ字変換
かな変換
範囲切り取る
範囲切取
開く
開
読む
読
保存
毎行読む
毎行読
起動
起動待機
隠し起動
隠起動
隠し起動待機
隠起動待機
コマンド実行
存在?
フォルダ存在?
母艦パス
ランタイムパス
作業フォルダ取得
作業フォルダ変更
SYSTEMパス
テンポラリフォルダ
デスクトップ
SENDTOパス
スタートアップ
スタートメニュー
マイドキュメント
マイピクチャ
マイミュージック
ユーザーホームフォルダ
個人設定フォルダ
ファイルコピー
ファイル移動
ファイル削除
フォルダ作成
フォルダ削除
ファイル列挙
フォルダ列挙
全ファイル列挙
パス抽出
相対パス展開
ファイル名抽出
拡張子抽出
ファイルサイズ
追加保存
ファイル更新日時
ドライブ種類
ファイルストリーム開く
ファイルストリーム開
ファイルストリーム閉じる
ファイルストリーム閉
ファイルストリーム一行読む
ファイルストリーム一行読
ファイルストリーム一行書く
ファイルストリーム一行書
表示
継続表示
入力
標準入力取得

```

以上。
記事を書くときに気を付けるのは対象読者像を最大限可能な限り明確に定義すること

今日はお仕事で書いた記事を基に自分がものを書くときに意識していることを言語化してみようと思います。今年を振り返る「なんかかく」アドベントカレンダー 11 日目です。

## 対象読者

仕事でものを書くときに自分の成果物をもっと底上げしたいと思う人へ。


## 結論

以下ステップを踏んでいます。

1. 対象読者像を最大限可能な限り明確に定義する。
2. 結論を述べる。
3. その根拠を分解して述べる。
4. 参考文献をまとめる。
5. 1 ～ 4の内容をまとめる。
7. タイトルを決める。


## 解説

### <対象読者像を最大限可能な限り明確に定義する>

細かければ細かいほど書きやすくなります。いわゆるバズる記事は対象が広いわけですが、対象が広いと話がぼやけることが多いのでそこを目的としないほうが良いです。

```:例
- 〇〇に困っている
- 〇〇というエラー メッセージに直面している
- 社内向け・社外向けの〇〇向け
- 経験者向け・初心者向け
```

### <結論を述べる>
対象読者が解決したい問題・課題への答えを冒頭で述べます。


### <その根拠を述べる>
箇条書きにして、それを節に分けます。

### <参考文献をまとめる>
参考にした記事 URL を書きます。

### <内容をまとめる>
内容を締めくくります。

### <タイトル>
「結論を述べる」で書いたことを 1 つのフレーズにします。


## 解説の背景

今年お仕事で書いたもの。今週は [Logic Apps と Logic App とロジック アプリ #Azure - Qiita](https://qiita.com/e99h2121/items/f6313c2eabaa2d2b70f6) を書いたのでこちらも読んでいってください。

### Logic Apps 関係の記事

[Logic Apps をこれから使い始めようという方へ | Japan Azure Integration Support Blog](https://jpazinteg.github.io/blog/LogicApps/LogicApps-HeadFirst/)
[Standard Logic Apps で Azure OpenAI アプリ内コネクタがパブリック プレビュー | Japan Azure Integration Support Blog](https://jpazinteg.github.io/blog/LogicApps/LogicApps-AOAI/)
[従量課金版 Azure Logic Apps の料金体系を理解するポイント | Japan Azure Integration Support Blog](https://jpazinteg.github.io/blog/LogicApps/LogicApps-ConsumptionPricing/)
[Logic Apps で日付や時刻を判定してワークフローを制御する | Japan Azure Integration Support Blog](https://jpazinteg.github.io/blog/LogicApps/LogicApps-Functions/)
[Logic Apps で日付や時刻を判定してワークフローを制御する (2) - 毎月第 1 月曜日に起動したい | Japan Azure Integration Support Blog](https://jpazinteg.github.io/blog/LogicApps/LogicApps-Functions2/)

### MSMQ 関係の記事

[MSMQ のトランザクション メッセージ | Japan Azure Integration Support Blog](https://jpazinteg.github.io/blog/MSMQ/MsmqTransaction/)


### 意外と気を遣っている

「料金体系を理解するポイント」ってやつは結構考えに考えたタイトルです。料金体系の解説じゃなくて「料金体系を理解するための要点」ということです。「ここに気をつけて読んでくれ」ということを書きたいわけで「This is 料金体系」というわけではないのです。

同じように意外と私は想定読者に気を配るようになりました。ワークフローの制御の説明も決してコードゴルフをしたいわけじゃなく、読みやすさ伝わりやすさの公約数を考えて粒度を調整したり、仮定で話しておいてヒアリングにつなげることをしたりしてします。文書は文学ではなく「読み手」に伝わるかどうかでしかないという当たり前のことに気づくわけです。

### たとえ話

1. 「新宿に行きたい」という読者がいたとして
1. 新宿の「どこ」かによる、が答えになってしまうので、その人が最短で行きたい新宿に行けるように指示する。例えば〇〇まで行って次の人に聞けなど。



### その他に役に立つ記事

https://zenn.dev/microsoft/articles/f0ad86348bc9ac

https://jpaztech.github.io/blog/other/azure_technical_support_explained/

https://qiita.com/aktsmm/items/7256a4a71345d894eea5


## まとめ

読者と読者の求めていることを明確にして答えていきたい。「ものを書いてお金を頂きたい」が人生の野望の一つであった私にとっていま携わっている自分の仕事は結構悪くないなと常々感謝しています。一応自分で書いたステップに従ってこの記事も書き直してみました。と言いつつ「仕事でものを書くときに自分の成果物をもっと底上げしたいと思う人、または、筆者はこうやってるんだなー、ということをご参考にお手並み拝見したい方へ。」くらいの方が正確かもしれないです (話の真のオチ)。

以上です！！
SSHとは

## はじめに
リモートサーバーへの安全な接続を可能にする**SSH (Secure Shell)** は、開発者やサーバー管理者にとって欠かせないツールです。
本記事では、SSHの概要からキーの作成、ログイン手順、設定カスタマイズ、よくあるトラブルの解決方法までをまとめてみました。

## SSHとは何か？
SSHはネットワークを介した安全な通信を実現するプロトコルです。
主に以下の用途で利用されます

- リモートサーバーへの安全なログイン
- ファイルの転送
- コマンドのリモート実行

暗号化技術を用いるため、第三者による通信内容の盗聴や改ざんを防ぐことができるのが大きな特徴です。

## SSHキーの作成方法
### 公開鍵認証とは？
SSHでは公開鍵認証を使用することで、パスワードよりも安全かつ便利なログインが可能です。
この方式では、以下の2つの鍵を使います

- 公開鍵: サーバーに登録する鍵
- 秘密鍵: クライアントに保管する鍵

### SSHキーを作成する手順
ターミナルで以下のコマンドを実行することでSSHキーが作成できます
```zsh:zsh
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
コマンドを順に解説してみます
`-t rsa`: RSAアルゴリズムを指定
`-b 4096`: 鍵の長さを指定（4096ビット）
`-C  "your_email@example.com"`: メールアドレスを設定

次に保存先とパスフレーズを入力します。
保存先についてはデフォルトの保存先（~/.ssh/id_rsa）を推奨します。
パスフレーズを設定すると、秘密鍵のセキュリティが向上します。

最後に下記コマンドで公開鍵をサーバーに登録します（サーバーの~/.ssh/authorized_keysに保存される）
user: サーバー上のユーザー名
remote_host: サーバーのIPアドレスまたはドメイン名

```zsh:zsh
$ ssh-copy-id user@remote_host
// ssh-copy-id ユーザー名@接続先
```

## SSHログインの手順
SSHキーを登録したら、以下のコマンドでリモートサーバーにログインできるか確認してみましょう
```zsh:zsh
ssh username@192.168.1.100
// ssh user@remote_host
```


## SSH設定のカスタマイズ
複数のサーバーにログインする場合、~/.ssh/configファイルを設定することで作業効率が向上します。

### 設定例
以下の内容を~/.ssh/configに記述します：

```text:~/.ssh/config
Host myserver
    HostName 192.168.1.100
    User username
    IdentityFile ~/.ssh/id_rsa
```
このように書くことで
```zsh:zsh
ssh username@192.168.1.100
```
これが
```zsh:zsh
ssh myserver
```
こうなります！
何度も接続するサーバーなどはこのように設定しておくと効率よく作業を進められるようになります。


## おわりに
SSHを使いこなすことで、安全かつ効率的にサーバー管理が可能になります。
機会があれば~/.ssh/configのところはもう少し深掘りしてみようと思います

## 参考記事
https://qiita.com/gama1234/items/5c97b1c106e3f0d093c0
出力: LEDマトリクスのお絵描き

### 背景
昨日のスクリプトは繰り返しの回数が見た目ではわかりませんでした。
Sphero boltのLEDマトリクスは点や線、矩形を描くことができます。
今回はドットを繰り返し回数を表示してみます。

### Scratch
ループのブロックはコントロールのところにありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/4fb1b17a-eb72-9cb9-a41e-42b226122be6.png)

「12回くりかえして30度ずつ回転させる。
　回転する前にマトリクスLEDが1つずつドットを増やして表示する。
　ただし4つずつドットを表示したら改行する。」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/edc6570d-906d-0111-afd7-140ca57c7480.png)

回転角から表示するマトリクスのドットの位置を計算する式のところが分かりにくいかもしれません。

### spheroV2
ループ変数をiとしてfor文にしました。

```
import time

from spherov2 import scanner
from spherov2.sphero_edu import EventType, SpheroEduAPI
from spherov2.types import Color

print("Testing Starting...")
print("Connecting to Bolt...")
toy = scanner.find_BOLT()

if toy is not None:
    print("Connected.")
    with SpheroEduAPI(toy) as droid:
        print("Testing Start...")
        
        droid.calibrate_compass()
        time.sleep(1)
        droid.set_main_led(Color(r=0,g=0,b=0))

        a = 0
        droid.set_compass_direction(a)
        time.sleep(1)
        print(a)

        for i in range(12):
            droid.set_matrix_pixel(int(i/4), int(i%4), Color(250, 250, 250))          
            droid.set_compass_direction(a + 30)
            time.sleep(1)
            a += 30  
            print(a)

        print("Testing End...")
```

実行結果はこちらのようになりました。
```
git\spherov2.py\spherov2\test>python BoltTest_compass4.py
Testing Starting...
Connecting to Bolt...
Connected.
Testing Start...
0
30
60
90
120
150
180
210
240
270
300
330
360
Testing End...
```


### まとめ
LEDマトリクスにドットを描く作業を作成してみました。
ドットの表示と動きのタイミングに違和感を感じにくくする工夫はもっと頑張ってみたくなります。
【アイディア】お嬢様専用SNS


## アイディアの概要

ツイートをいたしますと、その文章がAIによってお嬢様言葉へと変換されますのよ。

これにより、チクチクしたお言葉や過激な発言も気高く優雅になりまして、心理的安全性が高まりますわ。

どうぞお試しくださいませ。
[SwiftUI] 複数回同じmodifierを記述するパターンをまとめるmodifier

# 背景

SwiftUIでアプリを作っていると同じmodifierを複数回記述するパターンに遭遇する。問題設定としては

- modifierの引数は同じ型で違う値
- クロージャーは同じ

これを簡潔に書きたい。

```swift
enum MyError: Error, Equatable {
    case network
    case badRequest
    case notFound
}

// ある画面で3つのアクションがあり、それぞれからエラーが帰る可能性がある
struct ContentView: View {
    @State var error1: MyError?
    @State var error2: MyError?
    @State var error3: MyError?

    var body: some View {
        Text("app")
            .onChange(of: error1, perform: onError)
            .onChange(of: error2, perform: onError)
            .onChange(of: error3, perform: onError)
    }

    func onError(error: MyError?) {
        guard let error else { return }
        /// ...
    }
}
```

また、(要件にもよるが) `onChange(of: error1 ?? error2 ?? error3)` のような手法だと、例えば`error1`と`error2`がほぼ同時に発生した時に片方しか呼ばれないので不適とする。

```swift
struct ContentView: View {
    @State var error1: MyError?
    @State var error2: MyError?
    @State var error3: MyError?

    var body: some View {
        Text("app")
            .onChange(of: error1 ?? error2 ?? error3, perform: onError)
    }
}
```

# 解決策: forEach

あるmodifierを配列の要素分繰り返すmodifier。AnyViewを使っているので多少オーバヘッドはありそうだが、意味的には記事冒頭のコードと等価のはず。

```swift
extension View {
    func eraseToAnyView() -> AnyView {
        AnyView(self)
    }

    func forEach<T, ModifiedView: View>(_ elements: [T], modify: (AnyView, T) -> ModifiedView) -> some View {
        elements.reduce(self.eraseToAnyView()) { view, element in
            modify(view, element).eraseToAnyView()
        }
    }
}

struct ContentView: View {
    @State var error1: MyError?
    @State var error2: MyError?
    @State var error3: MyError?

    var body: some View {
        Text("app")
            .forEach([error1, error2, error3]) { view, element in
                view.onChange(of: element, perform: onError)
            }
    }
}
```

# おまけ

実際onChangeが頻出パターンなのでonChange専用のmodifierを作るのが丸いかもしれない。(onChange以外で使えそうなケースがあったら教えてください)


```swift
extension View {
    func onChange<T: Equatable>(each elements: [T], perform: @escaping (T) -> Void) -> some View {
        self.forEach(elements) { view, element in
            view.onChange(of: element) { element in
                perform(element)
            }
        }
    }
}

struct ContentView: View {
    @State var error1: MyError?
    @State var error2: MyError?
    @State var error3: MyError?

    var body: some View {
        Text("app")
            .onChange(each: [error1, error2, error3], perform: onError)
    }
}
```

そして`onChange(each:)`を作るだけなら配列にonChangeを行うアプローチでもいけそう。ただし使っているonChangeがiOS17+。
（その他の違いはパフォーマンスだけだと思うが、どちらのパフォーマンスが良いかはわからない）

```swift
extension View {
    func onChange<T: Equatable>(each elements: [T], perform: @escaping (T) -> Void) -> some View {
        self.onChange(of: elements) { before, after in
            after.changedElements(from: before).forEach(perform)
        }
    }
}

private extension Array where Element: Equatable {
    func changedElements(from before: [Element]) -> [Element] {
        zip(before, self).filter(!=).map(\.1)
    }
}
```
ANAで3Dプリンター教室が開かれているだと！

## 技術スタック
3DCAD(Autodesk社 Fusion 360)
3Dプリンタ(Flashforge社 Adventurer 5M)

# やってみた

こんにちは、ものづくり大好き滝沢です。

皆さんは、3Dプリンターを触ったことはありますか？
なんと航空会社のANAが3Dプリンター教室を開いておりました。

まなびのマーケット：ストリートアカデミーから応募することができるので、是非、皆さんも体験されてはいかがでしょうか。
![PXL_20241208_043448271.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283248/1da88cc6-467e-516a-81e3-91d129861623.jpeg)

なかなか入る事のできないANAの訓練施設（ANA Blue Base）にて、ジャッキーさんに教わることができました。
普段は、仕事で使われる機材の仕組みなどを理解するために、模型作成などに活用しているらしいです。

## 今回気にしていたこと

#### 角は立つのか

CADのような3Dソフトでモノを作った場合、四角ならきっちり90度、正三角形なら60度というように、尖って洋服などに引っ掛かるのではないか？と考えていました。
そこでギザギザの物体を印刷してみました。
結果はつるつる。
インクが液体であるため、液体には角はありませんから滑らかになるようですね。

![PXL_20241208_044658103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283248/fa40b71c-e717-e793-0096-c6a7782637e1.jpeg)

#### 細かさはどこまで

ノズル、インクを出す先っちょによるようです。
今回は文字の高さ3mmだとアルファベットがつぶれてしまいました。
文字の高さ4㎜ならばOKでした。

![PXL_20241208_050022826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283248/e3c3af7c-021b-4c91-4c78-442eb7117bb8.jpeg)

#### 重力を考慮すべし

印刷は下から順に行っていきます。

例えば鳥居⛩のようなものを立てた状態では、横棒が垂れて、造形が壊れてしまうことでしょう。
今回は、円柱状の物体で中身が空洞の物体を印刷してみましたが、
直径3cmを耐えて橋渡しすることができました。
これは3Dプリンターの描く速度が早ければ早いほどうまくいくようです。

![PXL_20241208_050609577.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283248/14fabc80-c617-a775-b68e-f32b5065103c.jpeg)
![PXL_20241208_051534509.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283248/75e7391d-7073-4be1-ad6d-ecac60ad8438.jpeg)

#### 時にはサポート材も

サポート材とは、柱を作ることで印刷時の重力を支え、印刷後にニッパーで切り取り捨てるというもの。
ソフトウェアで自動作成してくれるものもあるようです。


## 所感
![PXL_20241208_054928670.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283248/5417de3b-1443-7760-cf33-6a76602433ca.jpeg)

今回の経験を通じて、私は自分の手で触れることの重要性を改めて実感しました。実際に体験することで、知識が身になり、思考の礎が築かれていくのを感じています。
AKS068 で 親指シフト

### Alice 配列
「エルゴノミクスキーボード」と呼ばれる、両手をハの字型に置いた時に打ちやすくなるよう配列されたキーボードジャンルがあり、 Alice キーボードはその中の一系統と言える。
多くの Alice 配列キーボードはファンクションキーが無く（省スペース）、スペースキーが左右に分割されている特徴がある。

AKS068 は EPOMAER が販売している Alice 配列キーボードである。
有線のみの AKS068 と、無線（2.4G+Bluetooth）にも対応した AKS068 Pro がある。

https://epomaker.jp/products/ajazz-aks068-pro

EPOMAKER には AKS068 Pro の商品ページしかないが、Amazon では両機種とも販売しており、 AKS068 は6000円前後、 AKS068 Pro は8500円前後で販売されている。

両機種とも VIA を用いたキーカスタマイズが可能であり、左右のスペースキーに別々の機能を割り振ることができる。 US キーホードであるが、親指シフト用のキーボードにも使えるのではないかと思って購入およびキーカスタマイズをすることにした。

### キー設定には VIA を用いる
AKS068 / AKS068 Pro のキーカスタマイズには Web アプリの VIA を用いる。

https://usevia.app/

使い方はこのサイト等を参照する。

https://salicylic-acid3.hatenablog.com/entry/via-manual

VIA を使うためには、予めキーボード用の JSON ファイルを用意しておく必要がある。

公式サイト配布の JSON ファイルにいくつか不備があるため、Jorge氏・堕落猫氏が修正版を配布しているが、いずれも **AKS068 Pro** 用のものである。

https://jorge-chang.hatenablog.com/entry/2024/04/05/123040

https://x.com/daraku__neko/status/1775448865782861981

一方、 **AKS068** 用の JSON ファイルは、以下のサイトにある `AJAZZ-AKS068 Single Mode RGB_Keyboard Drive_V1.0.rar` をダウンロードするとよい。 RAR ファイルを展開すると EXE ファイルと JSON ファイルが出てくるが、 VIA で設定するのであれば JSON ファイルのみ使う。

https://www.a-jazz.com/en/search.jsp?id=422&q=AKS068

AKS068 用と AKS068 Pro 用の JSON ファイルを VIA に読み込ませると、以下のような違いがある（配列図は LAYER 1 = fn コンビネーション）。
![aks068_via_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/62fd9b51-512f-4fcc-5e66-57a313c960c0.jpeg)
![aks068_via_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/cafa47d0-ea67-539a-b244-31a11ff53b04.jpeg)

## 親指シフト用の配列
以下のようにキー設定をするとよいだろう。

US キーボードなので、 `変換` ・ `無変換` キーは無い。親指キーとして少なくともどちらか一つはスペースキーに割り当てる必要がある。
さらに、JIS 配列からすると足りないキーがあるので（ `￥` キーと `Ro` キー）、 fn キーコンビネーションに割り当てる。
これら JIS 配列用のキーは SPECIAL タブ内に入っている。

今回は `変換` キーを右親指キーとして設定を進めるが、`無変換` キーや `かな` キーも必要であれば左右 Alt キーに割り当て、 Win キーに左 Alt を割り当て…と、下部のキーを入れ替えていくのが一案である。
![aks068_via_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/29311649-7e39-b8e7-9a60-d45ec5baa037.jpeg)
![aks068_via_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/796ac6a4-bd6f-1f00-a25b-2a7882c7a608.jpeg)
配列を保存した後、 Windows の設定は106/109キーボードとして認識させる。
あとは、親指シフトエミュレータソフトで 左親指シフトキー=Space 、右親指シフトキー=変換 と設定すれば普通に親指シフトキーボードとして使えるようになる。
Windows 10 + やまぶきR + ATOK 2020 で動作することを確認した。

http://yamakey.seesaa.net/

JIS キーボードとして機能させるので、 US キーボードの刻印と一部記号の位置が異なる（VIA で表示される記号の位置とも異なる）ことに注意。

## 元に戻したくなったら
VIA を起動するまでもなく、 Fn + スペースキーの3秒押しで初期化できる。
気楽にお試しあれ。
Unityでマリオ風3Dアクションゲームを作る: 基礎から完成まで

# Unityでマリオ風3Dアクションゲームを作る: 基礎から完成まで

Unityを使用して、簡単な3Dアクションゲームを作成したいと考えている方のためのガイドです。本記事では、プロジェクトのセットアップからキャラクター操作、ステージデザイン、敵のAI設定までを、実際のコード例を交えて説明します。

---

## 必要な準備

### 環境設定

1. **Unity Hubをインストール**  
   Unity公式サイトからUnity Hubをダウンロードします。

2. **新規プロジェクトを作成**  
   - テンプレート: **3D**  
   - プロジェクト名: `MarioStyle3D`

### 必要なリソース

- キャラクターと敵のモデル（Unity Asset Storeからダウンロード可能）
- 基本的なC#スクリプトの理解

---

## キャラクター操作の実装

まず、プレイヤーキャラクターを操作可能にします。

### モデルの設定

1. **モデルのダウンロード**  
   Unityアセットストアで無料のキャラクターモデル（例: Robot Kyle）をダウンロードします。

2. **モデルの配置**  
   ダウンロードしたモデルをシーンにドラッグして配置します。

### 移動スクリプト

以下のスクリプトを作成し、キャラクターにアタッチします。

```csharp
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 5f;
    public float jumpForce = 7f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        rb.AddForce(movement * speed);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
```

## ステージデザイン

次に、ゲームの舞台となるステージを作ります。

### 地形の作成

1. **Terrainオブジェクトを追加**  
   `GameObject > 3D Object > Terrain`を選択します。

2. **地形ツールを使用**  
   ペイント機能で起伏をつけ、リアルな地形を作成します。

### 足場の配置

1. **Cubeオブジェクトを追加**  
   `GameObject > 3D Object > Cube`を選択します。

2. **足場を配置**  
   複数の足場を配置し、ジャンプが必要なステージを作成します。

   ## 敵キャラクターの設定

敵が巡回する簡単なAIを実装します。

### 巡回AIのスクリプト

以下のコードを敵に適用します。

```csharp
using UnityEngine;

public class EnemyPatrol : MonoBehaviour
{
    public Transform[] patrolPoints;
    private int currentPoint = 0;
    public float speed = 3f;

    void Update()
    {
        if (patrolPoints.Length == 0) return;

        Transform target = patrolPoints[currentPoint];
        transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);

        if (Vector3.Distance(transform.position, target.position) < 0.1f)
        {
            currentPoint = (currentPoint + 1) % patrolPoints.Length;
        }
    }
}
```
## ビルドとデプロイ

### ビルド設定

1. `File > Build Settings`を開き、ターゲットプラットフォームを選択します。
2. 必要に応じて解像度や設定を調整します。

### ビルド実行

1. プロジェクトをビルドして、PCやスマートフォン用にエクスポートします。
2. エクスポート後、動作確認を行い、必要に応じて調整します。

## さらなる学習リソース

Unityでのスキルを向上させるには、[Unity入門の森](https://feynman.co.jp/unityforest/game-create-lesson/2d-action-game/)が非常に役立ちます。  
2Dゲームの基礎を学ぶことで、さらに洗練された3Dゲームを作成するスキルを得られます。

## まとめ

- Unityでマリオ風3Dアクションゲームを作成する基礎手順を学びました。
- キャラクター操作や敵AIの設定を行うことで、動的なゲームを完成させられます。
- 次のステップは、さらなるカスタマイズや高度な機能の実装です。

ゲーム開発の楽しさを存分に味わってください！
WordPressの自動更新で本番環境のファイルが書き換わった話

## はじめに
[こちらの記事](https://qiita.com/matsumura_zyyx/private/bd50ef7295d2d3238108)でWordPressのデータ移行を記したが、その中の1サイトでデータ移行後にWordPressの自動更新によって本番環境の一部ファイルが書き換わる障害が発生した
その教訓としてWordPressの自動更新を制御する方法を記す

## 障害の詳細
### 経緯
- 移行元はWordPressがインストールされておらず、別途静的ファイルのみでサイトを構築していた
- 移行先のサイトではWordPressがインストールされていたが、初期設定のままで放置されていた（諸事情によりアンインストールはしない）
- 移行時に、静的ファイルの```index.php```がWordPressインストール時の```index.php```の同名であったため上書き保存した

### 発生時
- しばらくしてWordPressの自動更新が実行された
- 他のファイルについては影響がなかったが、```index.php```についてはWordPress初期のコードに上書きされてしまったしまった
- 結果、サイトのトップページがWordPress初期表示になってしまった

## 各対応方法
### function.phpでの制御
```function.php```で以下のフィルターフックを追加すると、WordPressバージョンチェックの際に新しいバージョンがないと認識させることができる

#### バージョン通知を無効化
```php
add_filter( 'pre_site_transient_update_core', '__return_zero' );
```
これにより、管理画面で新しいバージョン通知が表示されなくなる

#### コアバージョンの定期チェックを無効化
```php
remove_action( 'wp_version_check', 'wp_version_check' );
```
WordPressが定期的に行うコアバージョンチェックを停止できる

### wp-config.phpでの制御
```wp-config.php```に以下の記述を追加することで、自動更新を制御できる
#### 自動更新を完全に停止
```php
define('WP_AUTO_UPDATE_CORE', 'false');
```
#### マイナーアップデートのみを自動更新する
```php
define('WP_AUTO_UPDATE_CORE', 'minor');
```

### WP Downgradeプラグイン
「WP Downgrade | Specific Core Version」プラグインを使用すると、WordPressのバージョンを指定したバージョンにアップグレードまたは、ダウングレードできる

#### バージョンアップ・ダウングレード手順
1. プラグイン > 新規追加 から「WP Downgrade | Specific Core Version」をインストールして有効化する
2. 設定 > WP Downgrade で「```WordPress Target Version```」に指定したいバージョンを入力し、「変更を保存」をクリック
3. WordPressの更新画面に移動し、「再インストール」をクリックしてバージョンを切り替える

#### 注意事項
- 実行前にバックアップを取ること推奨（特にダウングレード時）

## まとめ
特に利用しなくても、WordPressの設定はちゃんと確認しよう
Rustで学術論文からテキストを抽出する #23 応用編 - arXiv論文収集システム構築11 - システム完成 

:::note
## Summary
- arXiv論文収集システムの完成型と運用イメージの紹介

| crate | GitHub |
|:-----:|:------:|
|[rsrpp](https://crates.io/crates/rsrpp)|[rsrpp](https://github.com/akitenkrad/rsrpp)
|[rsrpp-cli](https://crates.io/crates/rsrpp-cli)|[rsrpp](https://github.com/akitenkrad/rsrpp)
|[arxiv-tools](https://crates.io/crates/arxiv-tools)|[rs-arxiv-tools](https://github.com/akitenkrad/rs-arxiv-tools)|
|[ss-tools](https://crates.io/crates/ss-tools)|[rs-ss-tools](https://github.com/akitenkrad/rs-ss-tools)|
|[keyword-tools](https://crates.io/crates/keyword-tools)|[keywords](https://github.com/akitenkrad/keywords)|
|[openai-tools](https://crates.io/crates/openai-tools)|[rs-openai-tools](https://github.com/akitenkrad/rs-openai-tools)|
|-|[rs-notion-tools](https://github.com/akitenkrad/rs-notion-tools.git)|

:::

## 前回までのあらすじ

[前回：Rustで学術論文からテキストを抽出する #22](https://qiita.com/akitenkrad/items/8af7bb934ca9b75400d2)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933655/5e69d390-a9bd-dc15-5545-44d7f82cf605.png)

前回まででシステムのパーツの実装が完了しました．
今回はパーツを繋ぎ込んだ後の完成型と運用のイメージを紹介します．

## システムの完成型

改めて今回のシステム開発の目的を振り返っておくと，今回実装したarXiv論文収集システムの目的は，日々arXivに上がってくる数百本の中から自分にとって重要な論文を効率的に仕分けすることでした．

そこで，①〜⑥を繋ぎ込んだ上で，日次でバッチ処理を実行し，毎日Notionのデータベースに論文が登録されるようにします．

各レコードには`Status`を割り振っていて，登録されたばかりの論文は`Ready`となるようにします．
日々の論文チェックでは，`Ready`となっている論文を順番にチェックしていって，興味の対象外の論文は`Complete`に，後から詳しく確認したい論文は`Deep Dive`というステータスに割り振るようにしています．

![スクリーンショット 2024-12-25 2.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933655/9479b7e1-9084-5a05-f27a-10b7c6e162b6.png)

これまでは，Notionに論文を手動で登録⇨論文の確認が追いつかずに積読が増えていく...という悪循環でしたが，今回のシステムが回り始めれば論文の確認は飛躍的に楽になる...ハズ．

## 運用イメージ

Notionでは，データベースに対してViewを設定することができるので，日々の論文確認用のViewを作成してできる限り高速に論文をチェックできるようにします．

試しに設定してみているViewが以下．

確認には基本的にタイトルとカテゴリ，リサーチクエスチョンがあれば十分なので，それ以外のデータはパッと見で表示されなくても問題ありません．
画像のような形式で論文のリストが表示されていれば，リサーチクエスチョンに軽く目を通すだけでよく，必要な論文かどうかは数秒で簡単に判別ができます．
一本ずつAbstractを読み込んでいた時代に比べると天国のような環境です...！

![スクリーンショット 2024-12-25 2.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933655/65c14b77-a065-3a70-832b-7c2bba4a937c.png)

日々の論文チェックでは興味対象外の論文の方が数が多いので，興味がある論文以外はまとめて選択して`Complete`に放り込むようにしました．

結果残っている`Deep Dive`の論文だけをじっくりとチェックすればよくなったので，重要な論文だけに集中することができるようになります．

2025年からはこのシステムをフル活用して，論文を効率的に読んでいこうと思います！

ちなみにパーツのつなぎ込みのところはローカルな実装なので公開していないのですが，これはこれで楽しかったので，機会があればまたどこかのブログで内容を紹介しようと思います．

## 次回

残りの2回は，実装を紹介する中で説明を端折っていた部分をAppendix的に紹介していこうかなと思います．

[次回：Rustで学術論文からテキストを抽出する #24](https://qiita.com/akitenkrad/items/873df15a6d4085b9939d)
全部ア段にすると古典インドっぽくなる言葉 ジェネレーター

# ナマステ〜

クソアプリ Advent Calendler 2024 Series 2 の記事でナマステ。

https://qiita.com/advent-calendar/2024/kuso-app

## お前は誰

なんかWebエンジニアやってるやつ。新卒でナマステ。
Twitter最近始めて、無限にスパムフォロワーをブロックするアプリになってるからフォローしてくれ。

https://x.com/waonpad

# 作ったやつ

https://zenbu-a-dan.vercel.app/

見た目こんな感じ。特にデザイン意図は無い。

![スクリーンショット 2024-12-11 2.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078615/c9b83141-32ff-6a26-74a3-cd00cfe5c0a8.png)

はてな匿名ダイアリーのこちらの投稿から着想を得て作りました。

https://anond.hatelabo.jp/20240801082705

機能は文字列中の仮名の段を置き換えるだけの単純なもの。
流石に元ネタ通りア段だけにしか出来ないと寂しかったので全段対応にしました。

もはやア段以外だとインドっぽさは全く無いけど、このネーミングはゴリ押ししたかった。

ア段が多いとインドっぽいというのは、実際に言語の歴史的に母音がアに収束していったからだとかなんか見ました。
興味ある人は調べてみるといいんじゃないですか。知らんけど〜。

Twitterに共有とかできるからクイズ形式にしたりして遊んでみると良いんじゃ無いですかね〜。

## 技術的なアレ

リポジトリあるんで、見たけりゃ見せてやるよ。

https://github.com/waonpad/convert-ja-syllabary-column

next@15.0.4-canary.46・・・普通だな！

### 変換ロジック

なんか上手く出来ないか一瞬考えたんですけど、正規表現的なのでバグ出さずやれる気がしなかったので愚直に配列作って対象文字からindexをズラしてるだけです。ナマステ〜。

天才的な方法があったら教えてください。

![スクリーンショット 2024-12-11 2.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078615/4d56f75e-186f-3bae-c716-6343ef035023.png)

### DB

クソアプリの癖に、画面が余りすぎるからって理由で投稿機能つけたせいでDBも用意しないといけなくなったんですよ。余計な事するな。

試しにNeon使ってみたらめちゃくちゃ遅くてびっくりして、Prisma Postgresを使ってます。
でもこれも遅かったんで投稿時は楽観的更新をかけるようにしました。ナマステ。

# 終

うん、じゃあ俺はバーフバリのリンクを貼って寝るから。コップンカ〜。

[Amazon.co.jp: バーフバリ　伝説誕生＜完全版＞（字幕版）を観る | Prime Video](https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%95%E3%83%90%E3%83%AA-%E4%BC%9D%E8%AA%AC%E8%AA%95%E7%94%9F%EF%BC%9C%E5%AE%8C%E5%85%A8%E7%89%88%EF%BC%9E%EF%BC%88%E5%AD%97%E5%B9%95%E7%89%88%EF%BC%89-%E3%83%97%E3%83%A9%E3%83%90%E3%83%BC%E3%82%B9/dp/B0B2RG8CRT?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2CAKEYCF6R59I&dib=eyJ2IjoiMSJ9.YxvzaP7jCKGn--7MbJf2Cg9ZwGzIJhu2Dlqxrp0QH9FDG2EIQ0R4QFgU51S4iX0woUFNdKjE2l_Kd61jhgVW5rJRH0xn_fPwBu44sk6S2yJavU9nXCpLZv7NhEM7C5nh9twvzZ56lCEm9mcx4HVHeiy35T4U1fPlCYJss7PCnyjjUbeREPP4eq8SZwM9kwPcijA1avSdhQzbKGXJdM-TbDA7PL9lPqfEM0IFx3B2CHQ.L_88v9XPpmfpCzgdCiKvRS2MwvX5eY9BgqYdb1STcRo&dib_tag=se&keywords=%E3%83%90%E3%83%BC%E3%83%95%E3%83%90%E3%83%AA&qid=1733852855&s=instant-video&sprefix=%E3%83%90%E3%83%BC%E3%83%95%E3%83%90%E3%83%AA%2Cinstant-video%2C166&sr=1-3)
Rustで学術論文からテキストを抽出する #13 応用編 - arXiv論文収集システム構築①

:::note
## Summary
- 応用編ではarXivから日次で新しい論文をスクレイピングして生成AIで要約→Notionに保存するライブラリを開発する

GiHub -> https://github.com/akitenkrad/rsrpp
crates.io -> https://crates.io/crates/rsrpp-cli
:::

## 前回までのあらすじ

[前回：Rustで学術論文からテキストを抽出する #12](https://qiita.com/akitenkrad/items/14c68808b6cce6c9152e)

前回までで`rsrpp`が完成したので，今回からは`rsrpp`の応用編です．

## 応用編のゴール: `rsrpp`を用いたarXiv論文収集システム

応用編では，`rsrpp`を使ってarXivの論文を効率的に収集するシステムを構築します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933655/6b2fd241-43af-403f-4d4e-9607655b166e.png)
 
arXivではcsカテゴリに絞っても100本以上の論文が毎日新しく公開されています．
最近では，査読付き論文もarXivで公開されるようになってきているので，arXivから面白い論文を効率的に収集できるようになると便利です．
とはいえ，arXivで公開される論文は文字通り玉石混交なので，できれば石ではなく宝石の方に時間を割きたいです．

arXivの論文収集の仕組みは調べるといろいろ提案されており，実は個人的にもこれまで論文のAbstractをSlackに通知したりしてチェックしようとしていました．
が，Abstractだけとはいえ，毎日100本以上の論文を継続してチェックし続けるのはムリでした...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933655/1571c8ef-e39d-9f3a-1c98-108da2129962.png)

そこで，今回実装した`rsrpp`を使って，公開された論文を毎日スクレイピングし`rsrpp`を使ってテキストを抽出したのち自分が使いやすいように要約し，Notionなどを使ってMy論文データベースを構築するシステムを考えます．

理想的には，論文のリサーチクエスチョンなど確認したい観点が箇条書きレベルになっていて，論文1本あたり数秒で内容の当たりがつくようにしたいです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933655/7ace6a33-375e-35ab-c90f-1cd0220af2c8.png)

## 実装の方針と必要なライブラリの確認

arXiv論文収集システムに必要な機能をざっと確認します．

| | |
|:-|:-|
|① arXivからの論文のスクレイピング| → [本家のAPI](https://info.arxiv.org/help/api/index.html) を使用 |
|② 論文のメタ情報取得|→ [arXiv API](https://info.arxiv.org/help/api/index.html) および [Semantic Scholar API](https://www.semanticscholar.org/product/api)を使用|
|┗ 論文のタイトルからidを取得する機能|→ 実装します |
|┗ 論文のidからメタ情報を取得する機能|→ 実装します |
|┗ 論文の著者情報を取得する機能 |→ 実装します |
|③ 論文からのキーワード抽出|→ 実装します |
|④ 論文からのテキスト抽出|→ [`rsrpp`](https://crates.io/crates/rsrpp)|
|⑤ 論文の要約|→ [gpt-4o-mini](https://openai.com/index/openai-api/)|
|⑥ Notionへのデータ格納|→ [Notion API](https://developers.notion.com/) を使用して実装します |

基本的には色々なAPIを駆使すれば実装できそうです．
ただし，②のメタ情報抽出および③のキーワード抽出ではちょっとした自然言語処理が必要になります．

②では，論文のタイトルからidを引く必要があるのですが，APIの仕様上似たタイトルの論文がいくつかピックアップされて返ってくるようになっています．そのため，探している論文のidを引き当てるためには，論文のタイトル同士の類似度計算が必要になります．

③では，論文のテキストから目的に沿ったキーワードを抽出するために品詞タグ付け等ができると便利です．

## Rustにおける自然言語処理エコシステム

Rustでは，まだそれほど自然言語処理のクレートが充実していない印象です．
特に，今回必要になるテキスト同士の類似度計算にはレーベンシュタイン距離かRougeを使用する予定ですが，どちらも主だったクレートが存在しません．

そのため，主だったクレートが存在しない機能に関しては一から実装することにしました．
たまには車輪の再発明も楽しいのでヨシ．

## 次回

次回から早速①〜⑥のパーツを実装していきます．2025年からは，超効率的なarXiv論文ライフが待っています．

[次回：Rustで学術論文からテキストを抽出する #14](https://qiita.com/akitenkrad/items/d4a80127c0a085a22803)
テスト自動化あるある：効果の薄いテストの量産をやめよう

# はじめに

https://qiita.com/advent-calendar/2024/t-dash03

今回は「テスト自動化あるある言いたい」への記事投稿をします。

テスト自動化あるあるとして、「単体テストを作り過ぎてしまう」というのがあると思います。
もちろん、作って悪いことはないのですが、以下のような状況なっていることも多くあります。
- カバレッジのためのテストを作り過ぎている
- カバレッジが高い割に、結合テストでバグが多い（本質的なテストができていない）
- 単体テストの作成に時間をかけて、結合テストは一部のケースしか自動化できていない

こうなってしまうのは、自動テストを作る際に「Test Pyramid (テスト・ピラミッド)」の考えが根底にあるのが１つの要因になっていると思います。
そこで今回は、「Test Pyramid」に変わる「Testing Trophy (テスティング・トロフィー」について紹介します。

# 「Test Pyramid」と「Testing Trophy」

自動テストを作る際に、単体テストや結合テストといった各種テストをどのようなバランスで作成すべきか？ という課題があります。
「Test Pyramid」と「Testing Trophy」はそれぞれ作成すべきテストケースの配分を示す概念です。

## Test Pyramidとは？
Test Pyramidの方はその名の通り、作成すべきテストの配分をピラミッド型で表したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/227f6c84-497c-9904-3038-b9fd409b83ae.png)

画像の通り、Unit Tests (単体テスト) => Integration Tests (結合テスト) => End-to-End Tests (E2Eテスト) の順の分量でテストを作っていきます。

低コストな「Unit Tests」を多数作成し、高コストな「End-to-End Tests」は少量に抑えるべき、という考えです。

## Testing Trophyとは？

こちらも名前の通り、作成すべきテストの配分をトロフィー型で表したものです。
フロントエンド向けに提唱されたものですが、バックエンド開発でも共通して適用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/82c97c69-7203-0e9d-c5b2-eff4853e07c1.png)
from: https://kentcdodds.com/blog/the-testing-trophy-and-testing-classifications

1. Static Testing
   型チェックやLintツール、静的解析ツールを使って少ないコストで品質を担保できるので必ず入れる。トロフィーの基盤という位置付け

2. Unit Tests
   作成し過ぎないようにする。カバレッジでいうと100%を目指すのではなく、70%程度に留めておく

2. Integration Tests
   最も重視する

3. End-to-End Testsを絞るべき理由  
   システム全体のテストは高コストであるため、クリティカルなパスだけに限定する

## Testing Trophyの特徴とユースケース

Test PyramidはUnit Testsを重視しますが、Testing TrophyではIntegration Testsを最も重視します。

もちろん「Unit Tests を書かなくて良い」というわけではなく、「書き過ぎないように」ということです。(カバレッジでいうと100%を目指すのではなく、70%程度に留めておく)
※ 共通部品などはきちんとテストするとして、単体であまり意味をなさない部品に労力をかけ過ぎない

また、昨今では導入が当たり前となった静的解析についても言及しています。

Integration Testsを重視する大きな理由は、部品単体でうまく動いていても、ソフトウェア全体が正しく動くことを確認できないためです。
[提唱者のブログ](https://kentcdodds.com/blog/write-tests)で紹介されている以下のPostがその理由を巧く表しています。

https://x.com/erinfranmc/status/1148986961207730176


# どのあたりから始めるか

「Testing Trophyの考えを取り入れてみようかな」と思っていただけたら、以下のあたりから取り組んでみてください。

1. 静的解析ソフトを入れていなければ入れる
1. Integration Testのツールやライブラリを使ってテストを作成する（例：Playwright、Cypressなど）
1. 上記をCIに組み込む

:::note
本記事では紹介レベルに留めております
深い部分や、具体的な実践については別の詳しい記事をご参照いただけると幸いです
:::

# まとめ

Testing Trophyは、コンポーネント化されたフロントエンド開発や、モジュール化の進んだバックエンド開発にも適したテストの考え方だと思います。
興味を持っていただけたら、テスト計画時の参考にしていただけたら幸いです。

# 参考

https://kentcdodds.com/blog/the-testing-trophy-and-testing-classifications

https://kentcdodds.com/blog/write-tests
プログラム考：「自分」というプログラム

**「なんか寂しいな」**
**「哀しいな」**

とSNSなど、ネットの世界を見てても、外で電車に乗ったり街を歩いたりしてても思うことが多いです。
人が目に映ってても、何か切り離されてる感覚というか、下手すると「友人」や「家族」といても同様の感覚に襲われたりもします。

目の前の相手を思い遣ったり、「世の中をちょっとでも良くできるように」とか、「後世にちょっとでもいいモノやいい社会、いい環境を残せるように」みたいな考えが弱いというか（企業理念とか履歴書の志望動機など表向き公の場ではそういうことを言いはするけど）、

```c
for (;;) {
    /*「今だけ金だけ自分だけ」（東京大学　鈴木宣弘先生）*/
    printf("「自分さえ良ければいい」\n");
    printf("「俺の方が正しい」\n");
    printf("「私の方がすごい」\n");
    printf("「自分の方が頭いい」\n");
    /*「相手を認めたら負け」「謝ったら死ぬ病」等*/
    printf("「お前なんか認めないぞ」\n");
    printf("「お前は間違っている。俺の正義でお前をただしてやる」\n");
    printf("「自分ガ自分ガー」\n");
    printf("「本質ガー」\n");
}
```

みたいな自己愛（ナルシシズム）やプライドやコンプレックスの塊を延々互いに投げつけてぶつけ合ったり、「バズった」とかそういうことを追いかけすぎたりしてるような、そういう感じがするたびに、冒頭の感情に襲われます。

コーディングではないという意味では、プログラミングとは直接関係ないように思えるかもですが、私たちの思考や行動も教育やメディア、これまでの言動や経験などによって少しずつ入力されアップデートされてきたプログラムだと考えると、私たち自身はかなり歪なプログラムに基づいて日々を送っているのではないかと思ったりします。

「テレビやスマホやPCの画面を覗いても、「幸せ」や「答え」「ソリューション」は出てこないのではないか」とも思います。結局私たちがスクリーン、モニターを通して見ているのは「自分自分」「自分の欲」「エゴ」「満たされない自己愛」といったものであるのならば、それも当然と言えるのかもしれません。

技術も人間の社会のためにあるべきだとするなら、そこに私たちの人間性を介在させる以上、私たち自身のことを時に振り返って、私たち自身の中にあるコード、プログラムを修正したりスケールしたりするという意識も大切というか、役に立つのではないかとふと思いました。

エゴばっかりで、相手に対する思いやりや自分の短絡的な感情のためだけじゃなく、中長期的に自分や他の人のため、社会のためにもなるように、という意識が希薄だと、コミュニティ・その場の空気も悪くなって濁って毒素も充満していくし、そうなるとそのコミュニティ（共同体）は衰退していくのでは。
SNSやコミュニティサイトであれば、それによってユーザー数が伸び悩んだり、投稿やユーザー同士の交流も減ったり劣化したりすることで廃れていくのでは、とも思います。
社会や集団、サービスの質を作る、左右するのは、サービスを提供する企業や国家や地域を運営する行政などだけではなく、他ならない私たち一人一人なのでは。

SNSにしろ、会社の職場にしろ、学校にしろ、地域社会にしろ、サイバー空間にしろ、それを作っていくのは日々の私たちの思考や発言や行動のはずなので、やはり自分というプログラムも時には見つめ直したいと思いました。

日本の社会が結構今危ない状況にあるんじゃないかと思いますし、陰謀論ぽいものもありますが、「近い将来、早ければ来年、遅くても１０年以内に日本という国がなくなってしまう可能性が高い」みたいな説もあります。去年か一昨年にそんな話を聞いても私は真に受けなかったろうと思いますが、今は結構現実味があるように感じてます。
そうなってほしくない。日本という国が続いてほしいし、もっと良くなってほしい。

そのために私たち自身が自分の中のプログラムを一旦見直して、リファクタリングしたりして、リーダビリティ、スケーラビリティ、メンテナビリティ、セキュリティ、リライアビリティなどを高め、お互いを大切にして、尊重して、危機意識も持ちつつ信頼できる人たちと支え合いながら乗り越えていくことが大切なのではないか。そして技術、テクノロジー、文明はそのためにあるべきなのではないか。と思いました。

変な長文すみません。読んでくれてありがとうございました。
Googleスプレッドシートで英文をスネークケースに変換

1人アドベントカレンダーの10日目です。9日目はこちら！

https://www.d0nchan.com/entry/2024/12/10/030153

# 定義されていない関数を自作したいなぁ

弊社ではエンジニア以外のメンバーもプロダクトで使用するデータを入力することがあるので、データ管理にGoogleスプレッドシートを使用しています。

この運用方では、扱いたい指標が増えたときに、英名→DBで扱うプライマリーキーに自動変換する必要が出てきました。

というわけで、こんな感じで変換していく仕組みを作ったので、備忘録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/d9b1c2c9-7ecc-6f03-cbe4-20d17c1a2c3f.png)


# GoogleAppsScriptに関数を定義する
`拡張機能 > Apps Script`からGASのコードを書きます。

![スクリーンショット 2024-12-11 1.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/faf96d0c-4949-fc49-e90e-5588d96e6dcf.png)


```javascript:util.gs
function toSnakeCase(str) {
    return str && str.match(
/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
        .join('_')
        .toLowerCase();
}
```

# スプレッドシートで通常の関数のように呼び出す
応用すればなんでもできますね。
![スクリーンショット 2024-12-11 1.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/176fefec-31a8-5c84-ad57-5c073b850870.png)

確定すれば、少しの読み込み後、スネークケースに変換されます👏

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/d9b1c2c9-7ecc-6f03-cbe4-20d17c1a2c3f.png)

# エンジニア募集中！
ほぼフルリモートで、月1~4回ぐらい大手町のオフィスに出社します。認証機関でエンジニアとして働いてみませんか？
カジュアル面談はこちらから！

https://meetings-eu1.hubspot.com/suyama-daichi

https://www.d0nchan.com/entry/2024/12/02/012846
具体と抽象を使いこなす！日常の思考法

この記事は[カオナビ Advent Calendar 2024 (シリーズ2)](https://qiita.com/advent-calendar/2024/kaonavi) の11日目の記事です。

## はじめに
みなさんは **「具体と抽象」** という言葉を聞いて、どんなイメージを持ちますか？
例えば、「具体的」や「抽象的」、「実体」や「概念」といった言葉はよく聞きますが、これらが私たちの日常生活や思考にどのように影響しているかを意識することは少ないのではないでしょうか？

私自身、具体と抽象を使って考えることが苦手でしたが、いまも練習している最中です。

この記事では、日常の色んな場面で「具体と抽象」を考えるきっかけになればよいと思い書いていこうとおもいます。

## 具体と抽象とは？
**「具体」** とは、目に見えるもの、実際に体験できる事柄、感じるものです。
例えば、目の前にあるスマートフォンや、昨日行ったカフェの風景などがそれにあたります。
具体的な情報は、わかりやすく感覚的で、理解しやすい性質があります。

**「抽象」** とは、物事の本質や共通点を捉えた、直接的には見えない考え方やアイデアのことです。例えば、「自由」や「愛」といった感覚的な概念がそれにあたります。
抽象的な表現は、視野を広げ、さまざまな解釈や深い洞察を促してくれます。

このように私たちの日常生活の中には、具体と抽象で溢れています。

## 具体と抽象が苦手なあなたへ
ここで一つ例を挙げて考えてみましょう。
例えば、あなたが新しいプロジェクトを始めようとするとき、「具体的に何をすればよいか」はわかりますよね。
けれど、「このプロジェクトが何を意味しているのか」といった大きな目的や意義が抽象的で、どう捉えていいのか分からないことがあるかもしれません。
ここで重要なのは、**なぜその抽象的な部分を理解することが大切なのかを自分に問いかけてみることです。**
抽象的な概念は一見難しく感じますが、それを理解することで、目の前の具体的な行動に深い意味を見出し、やる気や方向性が見えてきます。

## 具体と抽象を使い分けるコツ
まず段階的に考えてみましょう。
ステップ１：**まず具体的なことを考える**　→「今日何をするのか？何を決める必要があるか？」
ステップ２：**抽象的な意味や目的を考える**　→「その行動は、最終的にどんな意味を持つのか？自分にとって、どう価値があるのか？」
ステップ３： **両方を繋げて考える**　 → 「具体的な行動が、抽象的な目標にどう繋がるのかを意識して実行する」

このステップの順番で考えてみると、より深く物事に対しての理解度が高くなると思います。

## 苦手でもできる！具体と抽象を使うための簡単な練習法

**具体から抽象に昇華する練習**　: 「今日1日を振り返り、何をしたかを書き出してみましょう。それを通じて、自分の行動が何を意味するのかを考えてみてください。」

**抽象から具体に落とし込む練習**　: 「目標を抽象的に考えてみましょう（例えば『健康を大切にしたい』）。
それを実現するために、今日できる具体的な行動は何かを考えましょう（例えば、『野菜を多く食べる、朝起きてウォーキングをする』）。」

**少しずつ習慣にする**　: 最初は意識的にやることが大切。1日5分でも、具体と抽象を意識して考えてみることが大切です。

## まとめ
具体と抽象は、どちらも思考の中で重要な役割を果たしています。両方を意識的に使いこなすことで、より深く物事を理解できるようになります。

「少しずつでも、具体と抽象を意識して使ってみることで、日常の些細なことから大きな目標まで、効果的に判断できるようになり、日々の生活がより豊かになるでしょう。」
制御工学でよく使う式のLaTeX表記まとめ

## 前提
プリアンブルで`\usepackage{amsmath}`をしておくこと。

もっと良い書き方があればぜひ教えてください。

## 線形システムの表記
### 状態方程式
#### 連続時間
```tex
\begin{align}
  P :\begin{cases}\begin{aligned}
      \dot{x}(t) & = Ax(t) + Bu(t) \\
      y(t)       & = Cx(t) + Du(t)
    \end{aligned}\end{cases}
\end{align}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/87c8aef9-fb2f-3e51-4fbd-e3c485d23e5a.png)

```tex
\begin{align}
  P :\begin{cases}\begin{aligned}
      \dot{x}(t) & = \begin{bmatrix}
                       A_{11} & A_{12} \\
                       A_{21} & A_{22}
                     \end{bmatrix} x(t) + \begin{bmatrix}
                                            B_1 \\
                                            B_2
                                          \end{bmatrix} u(t) \\
      y(t)       & = \begin{bmatrix}
                       C_1 & C_2
                     \end{bmatrix} x(t) + \begin{bmatrix}
                                            D_1
                                          \end{bmatrix} u(t)
    \end{aligned}\end{cases}
\end{align}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/c4f27f9c-1d13-8f42-6ed6-1552c8d65602.png)

#### 離散時間
```tex
\begin{align}
  P:\begin{cases}\begin{aligned}
      x[k+1] & = Ax[k] + Bu[k] \\
      y[k]   & = Cx[k] + Du[k]
    \end{aligned}\end{cases}
\end{align}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/2ea78bf1-18a6-030f-9afa-4086e293a1a8.png)

```tex
\begin{align}
  P:\begin{cases}\begin{aligned}
      x[k+1] & = \begin{bmatrix}
                   A_{11} & A_{12} \\
                   A_{21} & A_{22}
                 \end{bmatrix} x[k] + \begin{bmatrix}
                                        B_1 \\
                                        B_2
                                      \end{bmatrix} u[k] \\
      y[k]   & = \begin{bmatrix}
                   C_1 & C_2
                 \end{bmatrix} x[k] + \begin{bmatrix}
                                        D_1
                                      \end{bmatrix} u[k]
    \end{aligned}\end{cases}
\end{align}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/492d0f36-ca29-9bc6-802d-3f045a284c80.png)

### 伝達関数
```tex
\begin{align}
  P(s) & = \frac{Y(s)}{U(s)}                                                                   \\
       & = \frac{a_0 + a_1s + a_2s^2 + \cdots + a_ns^n}{b_0 + b_1s + b_2s^2 + \cdots + b_ms^m} \\
       & = \frac{\sum_{i=0}^{n}a_is^i}{\sum_{j=0}^{m}b_js^j}                                   \\
       & = k\frac{(s - z_1)(s - z_2) \cdots (s - z_n)}{(s - p_1)(s - p_2) \cdots (s - p_m)}    \\
       & = C(sI - A)^{-1}B + D                                                                 \\
       & =\left[\begin{array}{c|c}  % Doyleの表記
                    A & B \\ \hline
                    C & D
                  \end{array}\right]
\end{align}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/696dc0fd-57d7-e7dc-1a85-cff0a579e812.png)

## 非線形

そのうちやります…
Arch Linuxで色温度を下げてブルーライト対策【Redshift】

Arch Linuxで画面の色温度を下げるためには、Redshiftを導入すれば良いです。

（ちなみに「色温度を低くする→赤に近づく」なので注意。紛らわしいですね）

# インストール
公式リポジトリから普通に入れましょう。
```
sudo pacman -S redshift
```

# 色温度の設定
下記コマンドで色温度を設定できます。
（数値を下げるほど画面が赤色に近づきます）
```
redshift -O 4800
```
解除するにはxオプションを指定します。
```
redshift -x
```