OmniAICreator/Qiita-1.07M huggingface dataset:
【最新】Unity でiOS, Android バイブレーションを簡単に共通化！Nice vibration, Feelを使って手軽に！


Unityで人気のアセット、Nice Vibration（Feelに統合された）のプリセットバイブレーション一覧がこちら。

これらのメソッドを使うだけでいい感じになる。

```
 public virtual void SelectionButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.Selection);
    }

    public virtual void SuccessButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.Success);
    }

    public virtual void WarningButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.Warning);
    }

    public virtual void FailureButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.Failure);
    }

    public virtual void RigidButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.RigidImpact);
    }

    public virtual void SoftButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.SoftImpact);
    }

    public virtual void LightButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.LightImpact);
    }

    public virtual void MediumButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.MediumImpact);
    }

    public virtual void HeavyButton()
    {
        HapticPatterns.PlayPreset(HapticPatterns.PresetType.HeavyImpact);
    }
```

UnityでNice Vibration（Feel）の機能を利用して、特定のアクションに対して簡単にバイブレーションを設定できます。この方法を使えば、iOSとAndroidの両方で同じバイブレーション効果を得ることができます。
IFTTT で Google Drive 内の画像が File Not Found になる時の対処法


- [x] Google drive の共有URL を公開に設定する
- [x] IFTTT と　Google Drive を接続してあげる

![Screenshot 2023-08-22 at 13.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/bc714366-f438-04c1-af5e-b6ff205afa55.png)

詳しくはこちら。

https://ifttt-japan.club/ifttt-applets-errors
【Django】エラー "['“” value must be a decimal number.']" の原因と解決方法

# エラー内容

Djangoアプリケーションを実装していたら以下のエラーに遭遇しました。
本記事ではこちらの原因と解決方法を記載します。

```
['“” value must be a decimal number.']
```

# 原因と解決方法
原因は、`DecimalField`は空白文字列を有効な`Decimal`値に変換できないため。
サンプルコードを交えて説明します。

### サンプルコード

```models.py
class Sample(models.Model):
    sample_char = models.CharField(max_length=100, null=True, blank=True)
    sample_integer = models.IntegerField(null=True, blank=True)
    sample_decimal = models.DecimalField(max_digits=3, decimal_places=1, null=True, blank=True)
```

上記の`models.py`を作成した後、以下内容を実行します。

```py
from response.models import Sample
from decimal import Decimal


instance = Sample(sample_decimal='')
instance.save()
```

すると結果は以下になりました。

```
django.core.exceptions.ValidationError: ['“” value must be a decimal number.']
```

`sample_decimal`フィールドは、`DecimalField`なので空白値を許容しません。
そのため、もし空白値を指定したい場合は`None`を使います。するとエラーは無くなります。

ちなみに、`Integer`も空白値を入れるとエラーになりますが、
こちらのほうがエラーメッセージが丁寧です...フィールド名まで教えてくれます

```
ValueError: Field 'sample_integer' expected a number but got ''.
```


ちなみに`blank='True'`というのは、「Djangoのフォームからの投稿が空かどうかを判定するもの」です。`False`（デフォルト）だとそのフィールドが必須であることを示します。
「This field is required.」（このフィールドは必須です）などのエラーメッセージが発生します。

この辺は以下の記事が分かりやすかったのでご参考までに。

https://djangobrothers.com/blogs/django_null_blank/
InSpec のライセンスモデルが変わります。

## 公式アナウンス

https://docs.chef.io/release_notes_inspec/#5.22.29-end-user-license-agreement

原文：

>We’ve updated the Chef End User License Agreement (EULA). The terms of the EULA are the same as they were before, but we’ve created three licensing tiers: Free, Trial, and Commercial.
>The Free tier allows personal/non-commercial users to scan 10 targets for an unlimited period of time. The Trial tier allows trial users to scan unlimited targets for 30 days. The Commercial tier gives users the features and benefits that come with the subscription they’ve purchased.

和訳：

>Chef End User License Agreement （EULA）を更新しました。EULAの条件は以前と同じですが、3つのライセンスモデルを作成しました：Free、Trial、およびCommercial。
Freeは、個人や非営利ユーザーが無期限で10のターゲットをスキャンできるようにします。Trialでは、お試しで30日間、無制限のターゲットをスキャンできます。Commercialは、ユーザーが購入したサブスクリプションに付属する機能と利点を提供します。

上記の通り InSpec のライセンスが 3 種類（”Free” ”Trial” ”Commercial”）に分かれることになります。

## ライセンスの種類

|  | 期間 | ターゲット数 |
|:-:|:-:|:-:|
| Free  |  ∞ | 10  |   
| Trial  |  30日間 | ∞ |   
| Commercial  |  ∞ | ∞  |   

Commercialライセンスの取得は、[ChefSec株式会社](https://www.chef-sec.com/)にお問い合わせください。

## ライセンスの選択方法

まだ実装されていませんが、Chefではお馴染みの以下のEULA同意の際に、ライセンスの種類を選択するプロンプトが出力されるようになります。

```
mask@MBP:~$ chef install                                            
+---------------------------------------------+
            Chef License Acceptance

Before you can continue, 3 product licenses
must be accepted. View the license at
https://www.chef.io/end-user-license-agreement/

Licenses that need accepting:
  * Chef Workstation
  * Chef Infra Client
  * Chef InSpec

Do you accept the 3 product licenses (yes/no)?
```

ライセンス選択プロンプトが実装され次第記事更新していきます。

---

https://www.chef-sec.com/?p=439
垂直スケーリングと水平スケーリングの違い

## 垂直スケーリングと水平スケーリングの違い

垂直スケーリングと水平スケーリングは、システムの拡張方法を指しますが、アプローチにおいて大きな違いがあります。理解することで、システム設計や運用の戦略において大きな選択肢を与えます。

### 垂直スケーリング

垂直スケーリングは、システムの規模を拡大する際にリソースを単一のノードやマシンに追加することです。典型的なアプローチは、より強力なハードウェアへのアップグレード、メモリの増加、CPUの強化などです。これは単一のリソースを強化することで、システムの能力を向上させる手法です。

### 水平スケーリング

水平スケーリングは、複数のサーバーやノードを追加して負荷を分散することです。アプリケーションやデータベースを複数のサーバーに分散させることで、トラフィックを均等に分けることが可能です。これにより、システム全体の負荷が分散され、拡張性が向上します。

### マイクロサービスとの関連

水平スケーリングは、マイクロサービスアーキテクチャと非常によくマッチします。各サービスを独立したサーバーに展開することで、必要に応じて個別のサービスを拡張できます。垂直スケーリングは、単一のサーバー全体の能力向上に特化しています。

## まとめ

垂直スケーリングは、単一のリソースを強化してシステム全体の能力を向上させる手法であり、水平スケーリングは、複数のリソースを追加してシステムの負荷を分散する手法です。どちらの手法も、システムの需要やアーキテクチャに応じて使い分けることが重要です。
ヘルスチェックとモニタリングの違い

# ヘルスチェックとモニタリングの違い
情報システムやソフトウェア開発において、ヘルスチェックとモニタリングは非常に重要です。それぞれ異なる目的を持ちますが、システムの健全性と性能向上に寄与します。

## ヘルスチェック

**ヘルスチェック**はシステムの基本的な動作や機能を確認し、問題がないかどうかをテストする方法です。通常、アプリケーションやサーバーが正常に機能しているかどうかを簡単な方法で確認します。これは通常、単純な応答コード（HTTPステータスコード）の確認やシステムリソースの使用状況の監視といった形で行われます。具体的には、アプリケーションが要求された場合に正常に応答するかどうかを確認します。

## モニタリング

**モニタリング**は、システムやサービスを継続的に監視し、問題を事前に把握することを目的としています。モニタリングは、リアルタイムでメトリクス、ログ、およびイベントを分析し、システムの性能や異常の早期警告を提供します。例えば、システムの負荷が増える前に警告を出すことで、問題を事前に把握できます。

### まとめ
ヘルスチェックはシステムの基本的な機能を確認し、問題の有無を検出します。一方、モニタリングはシステムやサービスの継続的な監視を行い、異常を事前に把握することを目的としています。
Chef 有償化について改めて詳しく解説

## ”Introducing the New Chef”

2019年4月、Chef社（現：Progress 社）はブログ：「 [Introducing the New Chef: 100% Open, Always](https://www.chef.io/blog/chef-software-announces-the-enterprise-automation-stack)」の中で、Chef プロダクトは今後、商用利用する場合は、無償で使うことができなくなることを発表しました。
これまで無償で Chef を利用されていた日本のユーザーは公式 Chef パートナーである ChefSec株式会社 [問い合わせ窓口](https://www.chef-sec.com/)より、商用(法人用)ライセンスを取得することができます。

## 有償化されるプロダクト

Chef Infra Client (旧名: Chef Client)
Chef Infra Server (旧名: Chef Server)
Chef InSpec
Chef Habitat
Chef DK
Chef Workstation 

上記のプロダクトはそれぞれ、特定のバージョンから無償で利用することができなくなります。最も幅広く利用されている Chef Infra (chef-clientやchef-solo)は、 バージョン 14 までは引き続き無償版 Chef を利用することができます。InSpecは、バージョン　4.3.2　までは無償利用できます。

また、同ブログは主要プロダクトを全てオープンソースにすることも発表しました。
Chefプロダクトの有償化についてまとめていきます。

## ライセンスの適用方法

ライセンスキーやプロダクトキーがライセンス取得者に配布されるのではなく、End User License Agreement (EULA) への同意による法的拘束力を持たせるものになります。Agreement への同意の方法は様々ですが、商用バージョンの Chef プロダクトの初回実行する際に、次のようなプロンプトで同意する必要があります。

```
mask@MBP:~$ chef install                                            
+---------------------------------------------+
            Chef License Acceptance

Before you can continue, 3 product licenses
must be accepted. View the license at
https://www.chef.io/end-user-license-agreement/

Licenses that need accepting:
  * Chef Workstation
  * Chef Infra Client
  * Chef InSpec

Do you accept the 3 product licenses (yes/no)?
```

Agreement の中に以下の文言があり、ライセンスを取得せずに製品を利用することを法的に制限しています。Chef プロダクトを利用する前に、ライセンスを取得する必要があるため、Chef を継続利用する場合注意が必要です。


> IF YOU REPRESENT A CORPORATION, GOVERNMENTAL ORGANIZATION, OR OTHER LEGAL ENTITY, OR YOU INTEND TO USE THE PRODUCT FOR COMMERCIAL PURPOSES, YOU MUST CONTACT PROGRESS DIRECTLY TO OBTAIN A COMMERCIAL LICENSE FOR THE PRODUCT.

[End User License Agreement:EULA](https://www.chef.io/end-user-license-agreement)

## お問い合わせ

公式 Chef パートナーである ChefSec株式会社 [問い合わせ窓口](https://www.chef-sec.com/)より、商用(法人用)ライセンスを取得することが可能です。技術サポートやテスト駆動インフラ IaCについてもご相談ください。

---

https://www.chef-sec.com/?p=439
CoreBluetooth を学んだ上で参考になったサイトまとめ

## 本記事について

この記事は [CoreBluetoothForUnity Advent Calendar 2023](https://qiita.com/advent-calendar/2023/core-bluetooth-for-unity) の7日目の記事です。

CoreBluetoothForUnity を使って開発する上でより高度な実装をするためには、CoreBluetooth の知識が必要になります。

そこで、私が CoreBluetoothForUnity を開発する上で参考になったサイトをまとめました。

## リスト

#### 公式ドキュメント

https://developer.apple.com/documentation/corebluetooth

これが一番参考になります。Discussion のところもかなり大事です。

#### CoreBluetooth プログラミングガイド

[リンク](https://wiki.onakasuita.org/pukiwiki/?Core%20Bluetooth%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AC%E3%82%A4%E3%83%89)

公式ドキュメントだと、どう使えばいいのかわからないということがよくあります。
こちらのガイドでは再接続の方法等のベストプラクティスが書かれており、ある程度参考になります。

ただし、2013年と古い、スクリプト全文載ってない、読みづらいなど欠点も多めです。

#### 公式サンプルコード

https://developer.apple.com/documentation/corebluetooth/transferring_data_between_bluetooth_low_energy_devices

貴重な公式のサンプルコードです。

#### shu223さんの記事

https://qiita.com/shu223/items/78614325ce25bf7f4379

これだけでなく色々見ました。

## その他の調べ方で役立ったもの

- GitHub CodeSearch で keyword を検索
  - クラス名とかは参考になりました。
- ChatGPT に聞く
  - 間違ってることもよくありますが、脳に入りやすいです。

## おわりに

短いですが、CoreBluetooth 学び始めのタイミングでこれがほしかったためまとめました。他にも思いついたら追記しようと思います！
(D⇒C)大きな数値を 3 けたごとにカンマ区切りで出力(逆パターン）

今日は前回の逆パターン
今日はPythonでこの問題
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_boss
・出力された数値を3桁ごとにカンマ区切りするというやつ
　ただし、今度は前からではなく後ろから区切る
・前回教えてもらったf-stringを使えば簡単にできる・・・が、絶対意図と違う
　（とりあえず示しておく）
 ```
N = int(input())
print(f"{N:,}")
```
・意図はループからカンマを付けていくやつだとおもう

たとえば
3546373 => 3,546,373　と変えるとしよう
この場合、３桁で桁数７を割ると１余る。
左から数えると１桁の次が必ずコンマがつく。

では左から３桁ずつコンマが付く場合とどう調整するか。
下の通りやれば、左からi番目で３桁になれば、i%3=0となりコンマがつくので
354,637,3、となる。

 ```
for i in range(len(N)):
    if i % 3 == 0 and i != 0:
        print(",", end="")

    print(N[i], end="")
```

これだと右からのとあわない。
では、どうするか。
下記をみると２桁ずつずらせばいいことがわかる。

3,546,373
354,637,3

とすると、iに、- 1を引いて割ればいいのではないか？
そうすると、
仮にi = 0だとすると、こちらはifが不成立なので、スルーして 3がprint
次にi = 1だとすると、こちらはifが成立して,がつき、次に5がprint
次にi = 2だとすると、こちらはifが不成立なので、スルーして、次に4がprint
次にi = 3だとすると、こちらはifが不成立なので、スルーして、次に6がprint
次にi = 4だとすると、こちらはifが成立して,がつき、次に3がprint
,
,
,
となって正しく出力される。

iとちがって、i-1だと違う結果になるのが不思議だ。
というわけで、あとは法式化すると。。。。
これでロジック化できた。

 ```
N = input()
x = len(N) % 3
for i in range(len(N)):
    if (i - x) % 3 == 0 and i != 0:
        print(",", end="")

    print(N[i], end="")
```

これは回答を見たのだが、どうしてもよくわからなかったので、
１つずつ実例を出して、１桁ずつやってみた。
そしたら理解できた。

前に数学で規則性というのがあったのだが、詳しいことは忘れたのだが、
これこれこういう現象があり、それをルール化したらどうなるか？と
いうのをやったことがある。
それとよく似ているなと思った。

となると、色々な数値を相手にロジックを探し出して行く作業が大事なんだろうなと思った。
【SwiftUI】trimで図形の一部のみを表示させる

# はじめに
正方形をtrimを使って切り取ってみます。

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2023-11-13 at 22.50.32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7032ce18-0caa-6450-2e6e-db3a3fedf452.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State private var trim1: CGFloat = 0
    
    @State private var trim2: CGFloat = 0

    var body: some View {
        VStack {
            Rectangle()
                .trim(from: trim1, to: trim2)
                .frame(width: 300, height: 300)
            
            Slider(value: $trim1, in: 0...1)

            Slider(value: $trim2, in: 0...1)
        }
        .padding()
    }
}
```

# おわり
あんまり使ったことのない機能でした
これ使ってランダムで図形を生成して図形落としゲーム的なの作れるのでは？？
Leetcode 2785. Sort Vowels in a String

https://leetcode.com/problems/sort-vowels-in-a-string/description/

# アプローチ
- Priority Queue

```java
class Solution {
    public String sortVowels(String s) {
        PriorityQueue<Character> pq = new PriorityQueue<>();

        for (char a : s.toCharArray()) {
            if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' || a == 'A' || a == 'E' || a == 'I' || a == 'O' || a == 'U') {
                pq.add(a);
            }
        }


        String result = "";

        for (char a : s.toCharArray()) {
            if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' || a == 'A' || a == 'E' || a == 'I' || a == 'O' || a == 'U') {
                result += pq.poll();
            } else {
                result += a;
            }
        }
        return result;
    }
}

```
Angular DevTools 導入

Angular開発用のChrome拡張 Angular DevToolsの導入方法メモ。



## 手順

1. Dev Toolsのインストール
    - [Angular DevTools](https://chromewebstore.google.com/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh)
      - Edgeもこちらでいけるはず。
    - Firefox用の[アドオン](https://addons.mozilla.org/en-GB/firefox/addon/angular-devtools/)もある。
1. Angularサイトの立ち上げ
    - `ng serve --configuration development` 
1. 開発者ツールの「Angular」タブ
    - Composeなどが確認できるようになる。

![スクリーンショット 2023-11-13 223144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519800/d7e26e71-9e07-9a3a-526d-1e70c690c185.png)


## 注意点

Angularサイトを立ち上げるときは最適化オプションをオフにする必要がある。
- [DevToolsの概要](https://angular.jp/guide/devtools#devtools%E3%81%AE%E6%A6%82%E8%A6%81) の冒頭に書かれている。 
- angular.jsonで`optimization: false`とすると最適化をオフにできる。
  - [こんな感じ](https://github.com/shi-tak/angular_docker/blob/5862712d084204c5f555af2f77b4ca0bffc6a798/angular.json#L49C24-L49C24)

なお，`ng new`で作成したプロジェクトであれば，development環境は最適化をオフにしているのでこちらを利用すればよい。 
- 手順2において`--configuration development`としているのはこのため。
macOS版Goodnotesでテキスト入力ができなくなったときに強制終了する 

macOS版Goodnotesを使っていると，テキスト入力ツールが反応しなくなる（文字入力を受け付けなくなる）ときがあります。この場合，Goodnotesアプリを再起動する必要があります。

軽度の症状の場合，単に `Command`+`Q` で終了させれば解決するのですが，多くの場合，単に `Command`+`Q` で終了させて再起動するだけでは，同じ症状が再発してしまいます。このような場合，`ps -ax` コマンドで調べてみると，終了させたはずの Goodnotes のプロセスが残存しており，暴走状態になっていることが多いです。このような場合，`Command`+`Option`+`esc`からの画面でも強制終了できず，コマンドラインから暴走している Goodnotes プロセスを強制終了させる必要があります。

# `killall` や `pkill` による Goodnotes のプロセス終了

ターミナルから，Goodnotesのプロセスを，名前を指定して終了させるには，`killall` や `pkill` コマンドが使えます。

```sh
$ killall -KILL Goodnotes
```

```sh
$ pkill -KILL -i -f Goodnotes
```

`killall` と `pkill` はどちらもプロセスを終了させるコマンドです。`-KILL` で強制終了シグナル (`-9`や`-SIGKILL`でも同じ）を送っています。`killall` はプロセス名自体が完全一致したプロセスのみを終了します。`pkill` の場合は部分一致検索となります。`-i` を付けておくことで大文字・小文字を同一視しています。さらに，`-f` を付けることで，プロセス名本体のみならず，パス名などコマンドライン全体を見て，わずかにでも一致する部分があれば終了させます。

# `grep` & `kill` による古典的方法

便利な `killall` や `pkill` に頼らない，古典的方法も紹介しておきます。

## 古典的手法（手動）
まず，`ps -ax` の結果を `grep` することで，暴走しているGoodnotesのプロセスID (PID)を特定します。

```sh
$ ps -ax | grep -i Goodnotes
 1675 ??         0:57.00 /Applications/Goodnotes.app/Contents/MacOS/Goodnotes
 1677 ??         0:57.10 /Applications/Goodnotes.app/Contents/MacOS/Goodnotes
28487 ttys000    0:00.01 grep -i Goodnotes
```

このうち，`grep` 自身のプロセスは除いて，他のGoodnotes関連のプロセス（複数あれば全部）を強制終了させます。

```sh
$ kill -KILL 1675 1677
```

## PIDの特定と `kill` を自動化させる

GoodnotesプロセスのPIDを毎回目で探すのが面倒なので，これを自動化しましょう。

まず，`grep` 自身のプロセスを除くには，次のトリックを使います。

```sh
$ grep -i [^]]Goodnotes
```

`[^]]` の部分がトリッキーですね。ここは正規表現で，「`]` 以外の任意の1文字」を意味します。`grep -i [^]]Goodnotes` というプロセスは，`Goodnotes` という文字の直前に `]` が存在するので，この正規表現にマッチせず，`grep` の結果から除外されるわけです。

`grep` された結果からPID部分を取り出すには `awk` を使います。それを `kill -KILL` の引数として並べるには，`xargs` コマンドが使えます。

パイプでこれらをつなげると，以下のようになります。

```sh
$ ps -ax | grep -i "[^]]Goodnotes" | awk '{print $1}' | xargs kill -KILL
```

## シェル関数化してコマンド化する

Goodnotes以外にも使えるように，これをシェル関数にまとめておきましょう。自作の`pkill`コマンドが存在しない環境下であっても，`pkill` コマンドもどきとして使えます。

```sh
function taskkill () {
	if [ $# -ne 1 ]; then
		echo "Usage: taskkill <PROCESS_NAME>" 1>&2
		return 1
	fi
	ps -ax | grep -i "[^]]$1" | awk '{print $1}' | xargs kill -KILL
}
```

`.bashrc` / `.zshrc` などでこのように定義しておくことにより，

```sh
$ taskkill Goodnotes
```

のような指定ができるようになります。
【Webアプリ】毎日イライラするあなたへ、アンガーマネジメントする？

## 毎日イライラしています

いきなりすいません。**イライラしてます。**
子育て、家事、仕事、その他もろもろ。
現代人は何かとイライラすることが多い。**そんな~~現代人~~私を救いたい。**

## アンガーマネジメントって知ってる？
部下を持つ上司の方は知ってますよね。有名なやつです。

>アンガーマネジメントとは、
>イライラや怒りの感情を自ら整理し、コントロールするためのスキル

とのこと。
その方法の一つとして **「６秒ルール」** というものがあります
>「６秒ルールとは」
>怒りが生まれてから６秒あれば理性が働くと考えられています。
>6秒間待つことができれば、理性的になり怒りをコントロールできるようになります。

とのこと。

心が穏やかに、健やかな日々を送るために、
**６秒カウントして心を落ち着かせる何かを作ってみようと**
今回もチャレンジしました。

## アンガーマネジメントアプリ作ってみた！

### ■作ったものがこちら

https://6550e4e2df7bee0b8fd80b67--papaya-toffee-dca346.netlify.app/

こだわりをあえて言えば、心が落ち着くグリーンバックと自然の風景です。
（・・・センス？なにそれ？）

**＜使い方＞**
①イライラしたことを入力欄に記載し、投下ボタンを押す
　→入力内容が表示されます。言語化して整理しましょう。
②スタートボタン押して６秒カウントダウンする。
③６秒後、落ち着いたら「落ち着いた？」ボタンを押す（励ましメッセージ出るよ）
　→落ち着かなかったら「もう一度！」ボタン押す（再度カウントダウンします）
④イライラしたことは浄化させましょう「浄化」ボタンを押すと、書いたイライラが消えます。
（おまけ：「ストップ」ボタンでカウントダウンがいったん止まります）

**ほら、心が落ち着いたでしょう？**

### ■使ったもの
* CodePen　
--言語は以下--
* HTML
* CSS
* JavaScript
（ライブラリ：Veu.js、jQuery）
* Gyazo
### ■コードはこちら

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExrXNKq" data-user="sotan115" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sotan115/pen/ExrXNKq">
  アンガーマネジメント</a> by sotan115 (<a href="https://codepen.io/sotan115">@sotan115</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


### ■反省点・改善点
* 機能も持ったボタンの配置を変えようとして、上手く機能しなくなってしまい諦めた。
* サンプルを流用したが、コードの中身の理解が不十分でアレンジが難しかった。
* デザインをおしゃれにしたい。（センス・・！）
* 「落ち着いた？」ボタンを押すことで、ランダムに励ましのメッセージが出たり、癒しの画像が出るようにしたい。

## 結果イライラしてしまった

webアプリの基礎を学び、何か作ろうと考えていた時、
私生活で大変な事が重なり、毎日イライラで爆発しそうになっていました。
そんな私の心を落ち着かせるためにこのアプリを作り始めたものの、
Webアプリ難しすぎて、なかなか思うように作れず、
結果イライラしてしまいました。。

**アプリ使って、反省します。**
ストレージとデータベースの違い

# ストレージとデータベースの違い

ストレージとデータベースは情報管理において異なる役割を果たします。それぞれが異なる機能を担っています。

## ストレージ

ストレージはデータの永続的な保管を担当します。これは物理的な場所（ハードディスク、SSD）やクラウド上の仮想的な場所（クラウドストレージ）の両方が存在します。ストレージはファイルや情報を永続的に保存し、必要に応じて取り出すための場所です。

### 特徴
- 永続的なデータ保存を担当
- 物理的なファイル保存場所や仮想的な場所が存在

## データベース

データベースはデータを整理し、効率的に管理するためのシステムです。データベースはデータの作成、読み取り、更新、削除（CRUD操作）を可能にし、データを関連付けて効率的に管理します。リレーショナルデータベース（SQL）やノンリレーショナルデータベース（NoSQL）などの種類があります。

### 特徴
- データの作成、読み取り、更新、削除（CRUD）を可能にする
- リレーショナルまたはノンリレーショナルなどのデータベース種類が存在

## まとめ
ストレージはデータを保管し、データベースはデータを管理するシステムです。両者は情報の保管と管理を担当し、システム内で連携して情報を提供します。
ストレージとサーバーの違い

# ストレージとサーバーの違い

ストレージとサーバーは、コンピューティング世界において異なる役割を果たします。それぞれがシステム全体において異なる重要な機能を担っています。

## ストレージ

ストレージはデータの永続的な保管を担当します。ファイルやデータベース、アプリケーションの情報を永続的に保存するための場所です。ストレージは物理的な場所（ハードディスク、SSDなど）や仮想的な場所（クラウドストレージ）の両方が存在します。データはこのストレージに永続的に保存され、必要なときに取り出すことができます。

### 特徴
- 永続的なデータ保存を担当
- ファイルシステム、データベース、オブジェクトストレージなどの形態が存在

## サーバー

サーバーは情報の提供やリクエストの処理、プログラムの実行など、コンピュータネットワーク上でサービスを提供する役割を果たします。これは一般的に、ハードウェアやソフトウェアの両方で構成されるものです。ウェブサイトやアプリケーションをホストするために使用されます。

### 特徴
- リクエストの処理とサービス提供を担当
- 物理的なサーバーや仮想化技術によるクラウドサーバーが存在

## まとめ
ストレージはデータを保管し、サーバーはリクエストを処理してサービスを提供します。両者はシステム内で連携して、情報を提供するための重要な要素です。
ストレージとメモリの違いと特徴

# ストレージとメモリの違いと特徴

ストレージとメモリはコンピュータの基本要素であり、それぞれ異なる目的や機能を持っています。ここでは、これらの違いについて分かりやすく説明します。
## ストレージ
ストレージ（Storage）とは、データを永続的に保存するための装置で、ハードディスクドライブ（HDD）やソリッドステートドライブ（SSD）があります。これらは、ファイルやプログラムを保存する場所であり、電源を切ってもデータは保持されます。

## メモリ
一方、メモリ（Memory）は、コンピュータがデータを処理するために一時的に情報を保持する場所です。RAM（ランダムアクセスメモリ）がその代表です。メモリにはアプリケーションやOSが実行される間だけデータが保存されます。電源を切ると、メモリに保存されていた情報は消失します。

## ストレージとメモリの違い

### 機能と目的
ストレージはデータを永続的に保存し、後で読み書きするための場所です。これに対し、メモリはデータを一時的に保持して、コンピュータの実行中に利用します。

### 速度とアクセス
ストレージはメモリよりも遅く、データの読み書きに時間がかかります。メモリは高速で、プログラムやデータの迅速な処理を可能にします。

### 情報の保持
ストレージはデータを永続的に保存しますが、電源を切っても情報は保持されます。一方、メモリは電源供給が必要であり、電源を切ると情報は失われます。

## まとめ

ストレージとメモリはコンピュータの基本的な要素でありながら、役割や性質は異なります。ストレージはデータの永続的な保存を担当し、メモリはデータの一時的な保持と高速な処理を可能にします。それぞれの特性を理解することで、コンピュータの基礎的な仕組みを把握することができます。
アプリケーションとミドルウェアとOSの役割

# アプリケーションとミドルウェアとOSの役割

ソフトウェア開発とサーバー管理において、アプリケーション、ミドルウェア、OSの相互関係は重要です。これらの役割と関係性を理解することは、技術領域への初歩的な一歩です。ここでは、それぞれの機能や連携に焦点を当て、初心者に向けた詳細な解説を行います。

## アプリケーションとミドルウェア

### アプリケーションの役割
アプリケーションは、ユーザーが利用するソフトウェアのことを指します。例えば、ウェブブラウザやメールクライアント、ゲーム、ビジネスソフトなどが該当します。これらのアプリケーションは、ユーザーのニーズに合致した機能やサービスを提供します。

### ミドルウェアの機能
ミドルウェアは、アプリケーションを実行するための基盤を提供します。データベース、ウェブサーバー、アプリケーションサーバーなどがこれに該当します。ミドルウェアは、アプリケーションの実行に必要な機能を提供し、効率的な動作を可能にします。

## アプリケーションとOS

### アプリケーションとOSの連携
アプリケーションはOSを介して動作します。OSはアプリケーションにリソースやサービスを提供し、ハードウェアリソースを利用可能にします。メモリ、CPU、ファイルシステムなどのリソースにアプリケーションがアクセスできるのはOSのおかげです。

## OSとミドルウェア

### OSとミドルウェアの関係
OSは、ミドルウェアがハードウェアと通信するためのインタフェースを提供します。ミドルウェアはOSの上で実行され、必要なリソースにアクセスしてアプリケーションにサービスを提供します。OSはミドルウェアにリソースを提供し、アプリケーションの実行を支援します。

## まとめ

アプリケーション、ミドルウェア、OSはソフトウェア開発やサーバー運用において欠かせない要素です。それぞれが連携して、ユーザーのニーズに合致したソリューションを提供します。彼らの相互関係を理解することは、ソフトウェアの設計や運用において重要な役割を果たします。
【Rails】簡単！楽しい！お寿司のミニアプリを作ってみました！

## はじめに
こんにちは、あっぴー(@super-appy)と申します。
プログラミングスクールに通ってRuby on Railsを学習しています。
初学者ですが、宜しくお願い致します。

## 記事の概要
[先日の記事](https://qiita.com/super-appy/items/c13b6e80381f4a3e2b69)でチラッとお話しした、ミニアプリについてまとめました。

アプリの名前は.......**寿司るーれっと🍣**！
回転寿司で何を食べようか迷っている全ての人に捧げたいアプリです。

とってもシンプルな構成のアプリなので、ぜひお手元でも試してみてください！

### 完成イメージ
<a href="https://gyazo.com/0f637550168b529faa3b25f29f987773"><img src="https://i.gyazo.com/0f637550168b529faa3b25f29f987773.gif" alt="Image from Gyazo" width="３００"/></a>

## 使用技術
| カテゴリ | 技術 |
|:-:|:-:|
|  フロントエンド | CSS  |
|  バックエンド | Ruby 3.2.2 Rails 7.0.4  |
| データベース  | PostgreSQL  |
|  環境構築 | ローカル  |
| インフラ  |  render |

renderにデプロイする関係で、データベースにPostgreSQLを使用しましたが、
ローカルで動かすだけならデフォルトのSQLiteで構いません！

## 各ファイルについて
### 
### 全体構成
sushisのデータベースに入れたデータを
sushi_controllerのshowアクションでランダムに取得し表示しています

### sushiのテーブル

```ruby:XXXXXXXXXXXX_create_sushis.rb
class CreateSushis < ActiveRecord::Migration[7.0]
  def change
    create_table :sushis do |t|
      t.string :name, presence: true, uniqueness: true
      t.string :comment
      t.string :sushi_image

      t.timestamps
    end
  end
end
```
* 寿司の名前(重複禁止)
* 寿司について一言
* 寿司の画像

### Model
```ruby: sushi.rb
class Sushi < ApplicationRecord
  validates :name, presence: true
end
```
寿司の名前は必ず必要です。

### View
* トップページ
```html:top.html.erb
<div class= 'container'>
  <div class = 'child'>
    <%= image_tag 'nigirizushi_moriawase.png', width: '200', height: '200' %>
    <br>
    <h1>寿司るーれっと</h1>
    <br>
    <div>
      <%= link_to '回してみる', sushi_path, class: "btn" %>
    </div>
  </div>
</div>
```
* 寿司の表示用
```html:sushis/show.html.erb
<div class = 'container'>
  <div class = 'child'>
    <% if @sushi.present? %>
      <h2><%= @sushi.name %></h2>
        <%= image_tag "#{@sushi.sushi_image}.png", width: '200', height: '200'  %>
      <div>
      <br>
        <%= @sushi.comment%>
      </div>
      <br><br>
      <div>
        <%= link_to sushi_path do %>
          <%= image_tag 'mottotaberu.png' %>
        <% end %>
        <%= link_to "https://twitter.com/intent/tweet?text=#{@sushi.name} にしようかな！｜寿司るーれっと &url=https://sushi-roulette.onrender.com" do %>
          <%= image_tag 'sharesuru.png' %>
        <% end %>
      </div>
    <% else %>
      <h2>寿司情報が見つかりません</h2>
    <% end %>
  </div>
</div>
```

### Controller
```ruby:sushis_controller
class SushisController < ApplicationController
  before_action :set_sushi, only: [:show]

  def show; end

  private

  def set_sushi
    @sushi = Sushi.order("RANDOM()").first
  end
end

```

### その他

あとはimagesにお寿司の画像と、データベースに好きなネタを登録していくのみです！
筆者はcsvにデータをまとめていたので、こちらの方法で登録しました。

参考

https://qiita.com/Kunikata/items/61b5ee2c6a715f610493


### 完成！！ :sushi: 
あなただけの**寿司るーれっと**は完成しましたか？

寿司だけでなく、果物とか焼き肉とかでも楽しめそうですね！


## おわりに
簡単なアプリですが、初めてのアプリなのでこうして記事にできてよかったです！
もっと凝ったアプリが作れるように頑張ります :muscle: 


### Github
https://github.com/super-appy/sushi_roulette
TfidfVectorizer.fitでtokenizeとidf計算にかかる時間の計測

# 概要
TfidfVectorizer.fitにおいてtokenizeとidf計算にどのくらい時間を要しているのか調べました。

# 背景
TfidfVectorizerのidf辞書のなるべく高速なマージ方法を検討したく、その事前準備として、TfidfVectorizer.fitのどの工程に時間がかかっているのかを調査しようと思いました。fitで時間がかかるのは、形態素解析（tokenize）とidfの計算なので、それら2つの時間を計りました。

# 実装

ライブラリをインストールします。

```bash
pip install scikit-learn datasets
```

大きな日本語のデータセットを用意します。
今回は[miracl-corpus](https://huggingface.co/datasets/miracl/miracl-corpus/viewer/ja)を使います。700万件弱の文章です。

```Python3
import time
import MeCab
from sklearn.feature_extraction.text import TfidfVectorizer
from datasets import load_dataset
import tqdm
dataset = load_dataset("miracl/miracl-corpus", "ja")["train"]
dataset = [d["text"] for d in dataset]
print(len(dataset))
```

```
6953614
```

datasetから適当な件数を取得して、tokenizeとidf計算にかかる時間を計測し出力します。tokenizerは使い慣れたmecabを使用しました。

```Python
# 形態素解析器の初期化（MeCab）
mecab = MeCab.Tagger("-Owakati")

# 形態素解析を行う関数
def tokenize(text):
    return mecab.parse(text).split()

# 形態素解析の時間計測
for doc_num in [10**2, 10**3, 10**4, 10**5, 10**6]:
    start_time = time.time()
    tokenized_dataset = [tokenize(text) for text in dataset[:doc_num]]
    tokenize_time = time.time() - start_time

    # IDF計算の時間計測
    tfidf_vectorizer = TfidfVectorizer(tokenizer=lambda text: text, preprocessor=lambda text: text)
    start_time = time.time()
    tfidf_vectorizer.fit(tokenized_dataset)
    idf_time = time.time() - start_time

    print(f"文書数: {doc_num}")
    print(f"単語数: {sum([len(t) for t in tokenized_dataset])}")
    print(f"単語種類数: {len(tfidf_vectorizer.get_feature_names_out())}")
    print(f"形態素解析にかかった時間: {tokenize_time}")
    print(f"IDF計算にかかった時間: {idf_time}")
    print("")
```

# 結果
上記プログラムの実行結果は以下です。

```
文書数: 100
単語数: 6809
単語種類数: 1805
形態素解析にかかった時間: 0.07840418815612793
IDF計算にかかった時間: 0.003988027572631836

文書数: 1000
単語数: 75989
単語種類数: 9767
形態素解析にかかった時間: 0.03894186019897461
IDF計算にかかった時間: 0.021020174026489258

文書数: 10000
単語数: 652418
単語種類数: 38772
形態素解析にかかった時間: 0.3236968517303467
IDF計算にかかった時間: 0.15282797813415527

文書数: 100000
単語数: 7253378
単語種類数: 157076
形態素解析にかかった時間: 3.460052013397217
IDF計算にかかった時間: 1.8129661083221436

文書数: 1000000
単語数: 79557632
単語種類数: 538666
形態素解析にかかった時間: 48.29531979560852
IDF計算にかかった時間: 21.297609090805054
```

# 考察
以下の傾向が見て取れます。

- miracl-corpusの特徴
    - 1件あたり平均して70-80単語
    - 単語数が10倍になると単語の種類数は3-4倍
- 処理時間
    - 形態素解析もIDF計算も処理時間は文書数(あるいは単語数）に概ね比例している
    - 形態素解析はIDF計算の2倍くらい時間がかかっている。

# 制限事項
mecab以外のtokenizerを使ったらidf計算よりも高速になる可能性もあります。janomeやvibratoのほうがmecabより早いという記事もありました。

参考:[【2023年版】python環境で利用できる日本語形態素解析ライブラリを比較してみた](https://qiita.com/e10persona/items/fddc795e70a05f3bc907)
Linuxコマンド一覧

# はじめに
本記事では学習したLinuxコマンドを記載していきます。
内容は基本的なコマンドが多いですが、これからオプションや他のコマンドを随時更新していけたらと思います。


### ディレクトリの移動

```
//ホームディレクトリに移動
cd

//ひとつ上のディレクトリに移動
cd ‥

//Users配下のhogehogeディレクトリに移動
cd /Users/hogehoge
```
### ディレクトリの確認
```
//今いるディレクトリ(カレントディレクトリ)を表示
pwd

//ディレクトリの内容を表示
ls 
＊-lオプションを付けるとリスト形式になって見やすい
＊-aオプションで隠しファイルも表示される
```
### ディレクトリの作成・削除
```
//指定したディレクトリ名で作成
mkdir ディレクトリ名 

//階層化して作成
//dir1の配下にdir2、dir2の配下にdir3が作成される
mkdir dir1/dir2/di3

//中身が空のディレクトリを削除(中身があると削除されない)
rmdir ディレクトリ名 
```
### ファイルの作成・削除
```
//指定したファイル名で作成
touch ファイル名 

//ファイルを削除
rm ファイル名

//ファイルをコピー
//file1の内容をfile2にコピー。file2がなければ新規作成される
cp file1 file2

//ファイルを移動、名前変更
//file1の内容をfile2に移動する。file1は削除されると同義なので注意
mv file1 file2

//ファイルの中身を表示
cat ファイル名
```
### プロセスの確認
```
//実行中のプロセスを確認できる
ps
＊基本は「aux」オプションを付けて実行することが多い
```

### コマンドごとのマニュアルを調べる
```
//コマンドのオプションなどを調べることができる
//終了する際は「q」を入力する
man 調べたいコマンド
```
GoF（Gang of Four）デザインパターン：ファクトリメソッド（Factory Method）

GoF（Gang of Four）デザインパターンは、ソフトウェア設計における一連の再利用可能なソリューションです。GoFデザインパターンは、エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディスによって定義され、彼らの著書『デザインパターン要素再利用のためのソフトウェアのオブジェクト指向分析と設計』で紹介されました。以下に、GoFデザインパターンの23種類を示します。

1. デザインパターン: クリエーションパターン
   - 抽象ファクトリ（Abstract Factory）
   - ビルダ（Builder）
   - ファクトリメソッド（Factory Method）
   - プロトタイプ（Prototype）
   - シングルトン（Singleton）

2. デザインパターン: 構造パターン
   - アダプタ（Adapter）
   - ブリッジ（Bridge）
   - コンポジット（Composite）
   - デコレータ（Decorator）
   - ファサード（Facade）
   - フライウェイト（Flyweight）
   - プロキシ（Proxy）

3. デザインパターン: 振る舞いパターン
   - チェインオブレスポンシビリティ（Chain of Responsibility）
   - コマンド（Command）
   - イテレータ（Iterator）
   - メディエータ（Mediator）
   - メメント（Memento）
   - オブザーバ（Observer）
   - ステート（State）
   - ストラテジ（Strategy）
   - テンプレートメソッド（Template Method）
   - ビジター（Visitor）

これらのパターンは、異なるソフトウェア設計の問題を解決するためのガイドラインとして使用することができます。各パターンは、特定の問題領域に対して再利用可能なソリューションを提供し、コードの柔軟性、再利用性、保守性を向上させるのに役立ちます。ただし、すべての場合にこれらのパターンが最適であるわけではありません。問題の特性に合わせて適切なパターンを選択する必要があります。

ファクトリメソッドパターンは、オブジェクト指向プログラミングにおいて非常に便利なデザインパターンの一つです。これは、インスタンス化のロジックを特別なメソッド（ファクトリメソッド）にカプセル化し、サブクラスがどのクラスをインスタンス化するかを決定できるようにすることで、クラスの柔軟性を高めます。

Javaでファクトリメソッドパターンを実装する基本的な方法を見ていきましょう。以下のコード例では、`Product` インターフェースと、このインターフェースを実装する2つのクラス `ConcreteProductA` と `ConcreteProductB` を作成します。そして、`ProductFactory` クラスにはファクトリメソッド `getProduct` があり、引数に応じて異なる `Product` オブジェクトを生成して返します。

```java
// Productインターフェース
public interface Product {
    void use();
}

// Productインターフェースを実装するConcreteProductAクラス
public class ConcreteProductA implements Product {
    public void use() {
        System.out.println("ConcreteProductAのuseメソッドが呼ばれました。");
    }
}

// Productインターフェースを実装するConcreteProductBクラス
public class ConcreteProductB implements Product {
    public void use() {
        System.out.println("ConcreteProductBのuseメソッドが呼ばれました。");
    }
}

// ファクトリメソッドを持つProductFactoryクラス
public class ProductFactory {
    public Product getProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        }
        throw new IllegalArgumentException("不明なタイプ: " + type);
    }
}

// 実行クラス
public class FactoryMethodDemo {
    public static void main(String[] args) {
        ProductFactory factory = new ProductFactory();
        
        Product productA = factory.getProduct("A");
        productA.use();
        
        Product productB = factory.getProduct("B");
        productB.use();
    }
}
```

このコードを実行すると、`ProductFactory` を使用して `ConcreteProductA` と `ConcreteProductB` のインスタンスが生成され、それぞれの `use` メソッドが呼び出されます。このパターンの美しさは、新しい `Product` タイプを追加するときに、既存のコードを変更する必要がないことです。新しいクラスを作成し、ファクトリメソッドに新しいケースを追加するだけで済みます。

ファクトリメソッドパターンは、クライアントが直接コンストラクタを呼び出す代わりに、オブジェクトの作成を抽象化することで、コードの柔軟性と再利用性を向上させます。
【JavaScript・初学者】Reactでよく使われる頻出記法 / forEachについて

# はじめに
`React`を学習していましたが、`JavaScript`の記法についてフワッとしている部分がよくあったので、簡単ですが今回は**forEach**について少し調べました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach


# forEachの使い方

基本的な使い方は**配列に対して要素を1つずつ取り出し処理を実行をします。**

```javascript
let fruit = ['Apple', 'Melon', 'Orange'];

fruit.forEach(element => console.log(element));

// Apple
// Melon
// Orange
```
また、`forEach`の引数はこのように取れます。

```javascript
配列名.forEach( コールバック関数(要素の値, 要素のインデックス, 配列) )
```
```javascript
let fruit = ['Apple', 'Melon', 'Orange'];

fruit.forEach(function(element, index, array){
  console.log('Index:' + index);
  console.log('Element:' + element);
  console.log('Array:' + array);
});

//  Index:0
//  Element:Apple
//  Array:Apple,Melon,Orange
//  Index:1
//  Element:Melon
//  Array:Apple,Melon,Orange
//  Index:2
//  Element:Orange
//  Array:Apple,Melon,Orange
```
Azure DevOps REST API の git/repositories/items は、ブラウザで実施するとエラーだが気にしない。

# 背景

Azure DevOps の wiki のページ一覧を取得して、Teams に投稿したくなった。

OneNote なんかだと、ページ・サブページ一覧を取得出来るので、同様のことをしたいって話。

だが、そんなアクションが無かった・・。

が、wiki は git 管理されているので、REST API で取得すればいいじゃんってなったが、何故か上手くいかずに悩んだ記録

# 現象

https://learn.microsoft.com/ja-jp/rest/api/azure/devops/git/items/list?view=azure-devops-rest-7.2&tabs=HTTP

> https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/items?api-version=7.2-preview.1

この確認の為に、ブラウザで実行したところ、何故か、recursionLevel=Full オプションが効いてくれない。

## 実際の例

> https://dev.azure.com/shimakuma/SharePointTools/_apis/git/repositories/{repositoryID}/items?n=7.2-preview.1&recursionLevel=full&versionDescriptor.versionOptions=firstParent

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/922e81d5-8d18-80c7-55fc-2b2edc136416.png)

# 対処

色々試しつつ、検索もして対処法を試してみたが、どれも上手くいかない。

悩んでた中で、ふと、そのまま Logic Apps で Call してみたら・・

なんのことはない、上手くいった・・ :sweat: 

単に、ブラウザ上でやる何故か反応しないってだけでした・・

※以下は、Power Automate での Call 例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7570f460-af79-403d-8465-6cfaba431439.png)

# あとがき

ということで、Wiki のページ構造を取得して、あとは更新投稿するだけだ :laughing: 

# 参考

https://stackoverflow.com/questions/76813648/azure-devops-rest-api-list-items-is-not-returning-all-items-when-using-full-recu/77473934#77473934
Playwright で外部サービスにリクエストが飛ばないようにする

# 概要

`Playwright` を用いて本番環境やステージング環境に対して E2E テストを実行する際に、 `Sentry` や `Karte` といった、分析などのための外部サービスにリクエストを送らないようにしたい。

# 対応方法

`Page` インスタンスを生成したら以下の関数でモックする。

```ts
import { Page } from "@playwright/test";

export async function setupRequestMock(page: Page) {
  const mockUrlList = [
    'https://*.karte.io/**',
    'https://*.intercom.io/**',
    'https://*.sentry.io/**',
    'https://*.newrelic.com/**',
  ]
  for (const url of mockUrlList) {
    await page.route(url, async (route, request) => {
      console.log(`prevent request to ${request.url()}`)
      await route.fulfill()
    })
  }
}
```

`fulfill()` にすることでリクエストは成功するけど空のレスポンスを返すように。

`abort()` にすることでリクエスト自体無効になるけど、リクエスト失敗扱いでコンソールエラーが表示されるのが気になった。

# バージョン情報

- playwright 1.39.0

# 参考

https://playwright.dev/docs/mock
CSSのportrait/landscapeにやられた話

この記事は [ここのえ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/99no_exit) Day 4の記事です。

# CSS版ウミガメのスープ

> ある男が、とあるWebサイトでTailwindを使用し、**portrait** と **landscape** でデザインが変わるようなCSSを実装していた。<br/>
> FullHDのディスプレイを使用し、デザインの確認をするため、ブラウザのサイズを画面の半分にして、縦向きにした。
> しかし、**portrait** として認識されない。一体、なぜ？

<br/><br/>...<br/><br/>

**答え: ブックマークバーがONになっている。**

# 経緯

先日、SNSから飛んできたときに使う[**いい感じのリンク集**](https://rirfee.com/links)を作っていたのですが、Tailwind CSSの`portrait:`, `landscape:` を使って、縦画面と横画面でデザインのレイアウトを変えようと試みました。

FullHD画質のディスプレイを使用し、画面の左右にスナップして画面サイズを半分にしました。
この状態はだいたい `960 x 1080` になるため、縦画面になるはずなのですが、一向に `portrait` になる気配がありません。

ここでDevToolsの`Computed`の項目を確認してみると、どうやら実際に `width > height` になってしまっていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/69788e3b-a468-3ac8-e2c4-ca499e66e011.png)

CSSが取り扱うのは **ビューポートのサイズ** なので、ブックマークバーが表示されていると、ビューポートを押し込んでしまい、こういったことが発生してしまいます。泣いちゃった…!!!


# 対策例

確かにこの状態では `portrait` ではないのですが、人間の体感的には縦画面なので、そこでレイアウトがスカスカになって違和感を感じてしましました。

加えてモバイルのサイズでは文字が小さくなってしまう事から、別の配置にしたかったため、

- Mobile
- Desktop (Portrait)
- Desktop (Landscape)

の3パターンに分けて実装を行いました。Vue + Tailwindで実装すると、こんな感じになります。

「体感で縦画面なら縦」で取り扱うために `width/height` した値が `1.1` 未満の画面比率になっていた場合、portraitとみなします。

```vue
<script setup lang="ts">
import { onMounted, ref } from 'vue'

const layout: ref<'mobile' | 'portrait' | 'landscape'> = ref('mobile')

onMounted(() => {
  window.addEventListener('resize', () => {
    const width = window.innerWidth
    const height = window.innerHeight
    if (width < 768) {
      layout.value = 'mobile'
    } else if (width / height < 1.1) {
      layout.value = 'portrait'
    } else {
      layout.value = 'landscape'
    }
  })
})
</script>

<template>
  <div :class="['test', layout]" >
    This is a test.
  </div>
</template>

<style scoped lang="sass">
.test
  @apply bg-black text-white

  &.mobile
    @apply text-lg

  &.portrait
    @apply text-red

  &.landscape
    @apply text-xl
</style>
```

# まとめ

今回のようにブックマークバーなどでビューポートが押されると、一見縦画面のように見えても横長になっている場合があります。

特にwidthとheightの差が数pxだった場合は、コンピュータ的には正しくても、人間の体感としてはレイアウトに違和感を感じる、という事も起きます。

JSも使いながら、柔軟にレイアウトをカスタマイズしていきましょう。
明日から使える「リーダブルコード」テクニック3選


#
:::note
本記事は「リーダブルコードってなに？」「よく名前を聞くけど、どんな本なの？」という方のための記事です
:::
# はじめに
こんにちは、株式会社Kakukakuの駆け出しエンジニアsatoです。
今回は、「リーダブルコード」という本についてご紹介します。あまりにこの「リーダブルコード」という本を先輩エンジニアの方からお勧めされまして、気になりすぎて夜も眠れなかったので、実際に読んでみて明日からすぐに使えるテクニックについて記事にしました。

# 「リーダブルコード」ってなに？


「リーダブルコード」

https://www.oreilly.co.jp/books/9784873115658/

リーダブルコードという著書をご存知でしょうか？
「良いコード」「悪いコード」という表現については、人間目線か、機械目線かによって違うと思いますが、「リーダブルコード」は「人間が読めるコード」に主題を置いた本です。「人間が読めるコード」、あるいは「人間が読みやすいコード」を目指す。その考え方、実際の手法について書かれていて、以下のような4つの部に分かれていました。


第一部：表面上の改善：変数、関数の命名法
第二部：ループとロジックの単純化：分岐、繰り返しの簡略化
第三部：コードの再構成：大きく複雑なロジックの整理方法
第四部：選抜テーマ：具体例2題について

簡単なものから始まり、複雑なロジックに立ち向かっていくという構成になっていてました。今回はその中から明日からすぐ使えるテクニックについて３つ紹介します。


# １：変数には自分に名乗らせる！
「第一部：表面上の改善」で紹介されていたテクニックになります。
人が目にした時点でどういう処理に使われ、どういう値を扱うのかを想像できるような命名にする。
例えば、時間やバイト数など計測できるものであれば下記のように単位をつけて、代入される値が想像できるような命名をする。
<dl>
<table>
  <caption></caption>
  <thead>
    <tr>
      <th>改善前</th> 　<th>改善例</th>
    </tr>
  </thead>
  <tr>
    <td> int start </td> 　<td>int start_ms</td>
  </tr>
  <tr>
    <td> int size </td> 　<td>int size_mb</td>
  </tr>
</table>

他には下記のように状況を付与して役割を明確にする。


<dl>
<table>
  <caption></caption>
  <thead>
    <tr>
      <th>改善前</th> <th>状況</th>　<th>改善例</th>
    </tr>
  </thead>
  <tr>
    <td> data </td> <td>dataは整形されていないもの</td>　<td> data_plaintext</td>
  </tr>
  <tr>
    <td> html </td> <td>htmlの文字コードをUTF-8に変換したもの</td>　<td>　html_utf8</td>
  </tr>
</table>

といった簡単なテクニックです。
他にも勘違いされないように、
限界値は min,maxを使う。範囲は first,lastを使う。
などの具体例も多々紹介されていたので、命名で悩んでしまう方はリーダブルコードを一読していただけると一助になるかもしれません。

# ２：説明変数をうまく活用する
上記の命名方法で読みやすくする手法以外にも、変数の使い方でさらに読みやすくできるテクニックが紹介されていました。
以下紹介されていた改善の余地のあるPythonのコードと、改善例です。
(こちら索引記載すれば商用利用以外フリーと記載ありました、ありがとうございます🙇)
* * *
```javascript:改善前
    if line.split(':')[0].strip() == "root":

```

if文の中に条件と処理をそのまま書いてあります。
コーディング中は楽なのでやりがちですが、
* * *
```javascript:改善例
    username = line.split(':')[0].strip()
    if username == "root":

```
　
上記のように処理を変数化して追い出して、「username」という変数にする。この追い出す手法のことをリーダブルコードでは説明変数と呼んでいました。これによって「ユーザーの名前に関係のある値なのだな」と推測を立てながら読み進められると思います。これも明日から使える！
# ３：コメントの改善
最後にもう1つ。
「リーダブル」なコメントの仕方についても例があったのでご紹介。
なんとコメントまでも改善の余地があるとのこと。
以下はC++でマップを定義するコードとそのコメントです。
* * *
```C++:改善前
        //intはCategoryType。
        //pairの最初のfloatは'score'
        //2つ目は’weight’。
        typedef hash_map<int,pair<float,float>> ScoreMap;
```
詳細に書かれていて悪くないコメントだと思うのですが、
* * *
```C++:改善例
        //CategoryType　->　(score,weight)
        typedef hash_map<int,pair<float,float>> ScoreMap;
        
```

上記のように具体的に扱う値を代入処理とともにコメントすれば、行数も、理解にかかる時間も少なく読めるようになり、より「リーダブル」になるという手法の紹介でした。






# 最後に
:::note
目指せ「リーダブルコード」マスター！
:::
最後まで読んでいただきありがとうございました。
自分の中でぼんやりとしていた命名規則の方針や、コメントの仕方を
思考の過程と共に明確に言語化してくれていてためになった一冊でした！
ここでの紹介はごく一部なので、気になった方は上記のリンクから実際に手に取ってみて読んでいただきたいと思っております。

また私達、株式会社Kakukakuでは一緒に開発を行ってくれるスタッフ、パートナーを募集しております。
「リーダブル」な取り組みをしたい、「リーダブル」になりたい方をお待ちしております！
https://kakukaku.app/


# 参考文献


「リーダブルコード」https://www.oreilly.co.jp/books/9784873115658/
個人的おすすめなTailwind CSS系のUI

# はじめに
この記事は、個人的にUIがおしゃれで使いやすいかつTailwind CSSをベースに作られたUIキットをいくつか紹介していきます。いい感じのものがあれば随時追加していきたいと思います。
有料版のものも紹介していますが、日本円換算は2023/11/13 現在の相場です。円安って怖いですねぇ...すんごいお高くなっています。

:::note warn
完全に個人の好みで選定したものですのでこのUI入ってないぞというのがあると思いますがご了承ください。
:::
また、TailwindベースのUIキットの一覧は次のリンクから見ることができますので紹介していないものを含め是非参考にしてみてください。

https://www.tailwindawesome.com

## Daisy UI
https://daisyui.com/

Tailwind CSS系のUIの中でもモダンなコンポーネントがたくさんあり、Tailwind CSSのクラスを使わずともDaisy UI独自のクラスだけでおしゃれなサイトが構築できそうな気がしました。難点として、レスポンシブ対応が大変でDrawerを使う際にチェックボックスで状態が管理されているため実装が若干大変だったので気合で頑張るしかないです...

## Myna UI
https://mynaui.com/

追加のJSファイルを使わずともおしゃれなコンポーネント例が用意されています(一部コンポーネントは、`tailwind form` 等が必要)。量はそこまで多くないですが、簡単なWebアプリを作るぐらいであれば重宝する気がします。

## Meraki UI
https://merakiui.com/components

一部コンポーネントでJSファイルが必要になりますが、上二つにはないおしゃれなボタンやログインフォーム、サイドバーやナビゲーションバーなどが構築できます。量も多くほとんど無料で扱えるので足りなかったらこれ入れろと言わんばかりにおススメです。

## Flowrift
https://flowrift.com

他と比べて、コンポーネントごとではなくテンプレートごと用意されているものです。例えば、ヒーローセクションが欲しいなとなったときにこのサイトのHeroページを使えば簡単に作ることができます。

## TailGrids
https://tailgrids.com/components

Flowriftに比べてモダンなテンプレートが多いイメージがあるサイトです。モダンなものが多い分各項目1個しか無料のものが提供されておらず、すべて使いたい場合は有料版($199 大体18020円ぐらい?)で買い切りです。

## Tailwind Stamps
https://tailwindcss.5balloons.info/

Bootstrapに近いコンポーネントキットです。Bootstrapに似たデザインでTailwindのクラスを自由自在に扱いたい場合はおススメだと思います。また、チェックボックスがブラウザデフォルトのものだったのでチェックボックスを使う場合は注意かもです。

## Flowbite
https://flowbite.com/

TailwindのUI探しに困ったらとりあえずこれを使えばいいというぐらい多種多様なコンポーネントが揃っています。有料版も$269(日本円で約40774円ぐらい?)で提供されていますが、正直無料版だけで事足りてしまうと思います。

## Tail-kit
https://www.tailwind-kit.com/

コンポーネントとテンプレートどっちも無料で用意されているサイトで、特にダッシュボード関連のものを作りたい方には重宝するようなコンポーネントやテンプレートが用意されています。

## (番外編)Tailwind UI
https://tailwindui.com/

Tailwindの開発元が出しているUIキットでどれも見た目が美しい一方ですべて有料のため、ある程度お金に余裕があるのであればこれを買うのがおすすめだと思います。オールアクセスverで$299(日本円で約45277円?)と一番お高いですが試してみる価値はありそうです。
【JavaScript・初学者】Reactでよく使われる頻出記法 / findについて

# はじめに

`React`を学習していましたが、`JavaScript`の記法についてフワッとしている部分がよくあったので、簡単ですが今回は**find**について少し調べました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find



# findの使い方
**配列から条件に一致した最初の値を返すメソッドです。**
その為、**1つしか値を取得できない**ことを覚えておきましょう。
```javascript
const numbers = [1,2,3,4,5]
const foundNumber = numbers.find((number) => {
  return number > 3
})
console.log(foundNumber); //4
```

`オブジェクト`の`配列`にも使うことができます。
```javascript
const inventory = [
  { name: "apples", quantity: 2 },
  { name: "bananas", quantity: 0 },
  { name: "cherries", quantity: 5 },
];

function isCherries(fruit) {
  return fruit.name === "cherries";
}

console.log(inventory.find(isCherries));
// { name: 'cherries', quantity: 5 }
```
補完の効かないDjango HTMLで爆速に開発を進める方法

どうもこんにちは、たくびー(@takubii)です。

私は普段ほとんどのコーディングをVScodeで行なっています。
VScodeは様々な言語でも補完が効いたり、予測変換を行ってくれるとても頼もしい相棒です。

今回はVScodeの設定を編集してコーディングスピードを上げるちょっとした小技を書きたいと思います。

経緯としましては、DjangoプロジェクトでHTMLを書いている時に中々かゆい所に手が届かないもどかしさを感じたのでそこを改善しました。

## Emmetの設定

VScodeの設定からEmmetの設定を行います。
今回はDjango HTMLにHTMLと同じEmmetを適用させます。

```jsonc:settings.json
// 他の設定
"emmet.includeLanguages": {
  "django-html": "html"
},
```

Django HTML(素のHTMLも同様)で以下のようなタグを書く場合を想定します。

```html
<div id="app" class="app-test">
```

次のように入力すると先ほどのコードが生成されます。

```html
div#app.app-test
```

基本的には、idは`#`、classは`.`で指定します。
複数のクラスを指定したい場合は次のように`.`で繋げるだけです。(`div.class-1.class-2.class-3`)
`title`などの他の属性については`[]`で囲んで書きます。(例: `div[title="Some title word"]`)

## Emmetの使い道

HTMLのEmmetを使うことで補完の効かない言語でもid指定、class指定しながら閉じタグを自動で生成してくれます。
Djangoの独特の記法はDjango拡張機能に任せ、HTMLについてはEmmetで開発をしていくという方法が今の所ベストだという落としどころになりました。

普段のHTMLでも使えるのでEmmet記法を覚えることで開発スピードを上げつつコーディングが楽しくなってくると思います。

私は最近使い始めたばかりなので、まだまだ種類を覚えていませんが様々な記法があるので是非調べてみてください。
こちらとか参考になると思います。

https://docs.emmet.io/cheat-sheet/

## 所感

Visual Studio Codeのコード補完やEmmetは開発環境をとても良くしてくれるので、積極的に覚えて使っていきたいです。
今回はDjango HTMLでHTMLのコード補完が効かないという機会がありEmmetという存在を調べました。
トラブルや上手くいかないときこそ色々と調べてみると新しい発見があります。

それでは今回はこの辺りで締めたいと思います。
また機会があればお会いしましょう。良いエンジニアライフを！
PowerAutomateで配列からランダムに値を取り出す

## リストの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208579/51c3243e-6f8b-5fcd-0a90-2bc8dd02baef.png)

## ランダムな数を出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208579/48e72d5c-b094-74db-22c0-182b9929ccff.png)

```
rand(0,length(variables('participantList')))
```

## 配列から値を取り出す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208579/1ebffd58-7e61-4ee3-8097-84302f98bf57.png)

```
variables('participantList')[variables('rand')]
```
【JavaScript・初学者】Reactでよく使われる頻出記法 / filterについて

# はじめに

`React`を学習していましたが、`JavaScript`の記法についてフワッとしている部分がよくあったので、簡単ですが今回は**filter**について少し調べました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter


# filterの使い方
`filter`は**条件に合致した値を配列で返す**メソッドです。

```javascript
let array = [1,2,3,4,5]
array = array.filter((num) => {
    return num >= 2
  }
)
console.log(array) // [2,3,4,5]
```

`オブジェクト`の`配列`に対しても使うことができます。

```javascript
const heroes = [
    {name: “Batman”, franchise: “DC”},
    {name: “Ironman”, franchise: “Marvel”},
    {name: “Thor”, franchise: “Marvel”},
    {name: “Superman”, franchise: “DC”}
];

const marvelHeroes =  heroes.filter((hero) => {
    return hero.franchise == “Marvel”;
});

// [ {name: “Ironman”, franchise: “Marvel”}, {name: “Thor”, franchise: “Marvel”} ]
```
Git rebase で履歴をクリーンに保つ

### はじめに

Gitのリベースは、ブランチの履歴を整理し、よりクリーンな状態で保つための強力なツールです。この記事では、リベースの基本的な手順と、それを効果的に使う方法を解説します。

## リベースのプロセス図解

```
[リモートリポジトリの状態]
origin/develop
|
| (1) 最新のdevelopをフェッチ
v
A---B---C origin/develop
 \
  D---E feature/next-gen-update

[ローカルリポジトリでの作業]
|
| (2) ブランチをfeature/next-gen-updateに切り替え
v
A---B---C origin/develop
 \
  D---E feature/next-gen-update

|
| (3) developを現在のブランチにリベース
v
A---B---C origin/develop
       \
        D'--E' feature/next-gen-update

[コンフリクトの解決]
|
| (4) コンフリクトが発生した場合、解決してリベースを続行
v
A---B---C origin/develop
       \
        D'--E' feature/next-gen-update

[リモートリポジトリへのプッシュ]
|
| (5) リベースしたブランチをリモートにプッシュ（必要に応じて--force使用）
v
A---B---C origin/develop
       \
        D'--E' feature/next-gen-update

```

## リベースの手順詳細

1. 最新の`develop`ブランチをローカルに取得する
    
    ```bash
    git fetch origin develop
    ```
    
    これにより、リモートの`develop`ブランチがローカルのリポジトリに取り込まれます。
    
2. ブランチを`feature/next-gen-update`に切り替える
    
    ```bash
    git checkout feature/next-gen-update
    ```
    
3. `develop`ブランチを現在のブランチにリベースする
    
    ```bash
    git rebase origin/develop
    ```
    
    これにより、**`develop`**ブランチの最新の変更が現在のブランチの変更の前に適用されます。
    
4. ブランチを`feature/next-gen-update`に切り替える
    
    ```bash
    git checkout feature/next-gen-update
    ```
    
5. `develop`ブランチを現在のブランチにリベースする
    
    ```bash
    git rebase origin/develop
    ```
    
    これにより、`develop`ブランチの最新の変更が現在のブランチの変更の前に適用されます。
    
6. コンフリクトの解決
    
    コンフリクトが発生した場合は、手動で解決します。
    
    ```bash
    git add [衝突が解決したファイル]
    git rebase --continue
    ```
    
7. リベースしたブランチをリモートにプッシュする
    
    ```bash
    git push origin feature/next-gen-update --force
    ```
    
    強制プッシュは慎重に使用してください。
    

## まとめ

Gitのリベースは、ブランチの履歴を整理し、より管理しやすくするための強力なツールです。このガイドがあなたのGit操作をより効果的でスムーズなものにする手助けとなれば幸いです。
rails, deviseを使って仮登録・本登録を実装するときのアプローチ

## はじめに
railsの認証まわりの実装についてメモを残します。
ユーザーの登録の時は入力画面と確認画面があることが多いですよね。
deviseを使って上記の実装をしようとしたのですが、思った以上に大変でした。
どのようなアプローチで実装しようかと考えたので記事にしようと思います。

## 環境
`rails 6.1.6`
`ruby 3.0.6`
`devise 4.9.3`

## 仕様
仕様は下記のようになっています。
1. 入力画面でユーザーが入力する
1. 入力画面から確認画面への動線がある
1. 確認画面で入力した内容を確認できる
1. 確認画面から入力画面へ遷移できる
1. 確認画面から入力画面へ遷移するときはフォームの初期値に入力した値がセットされている


## 実装
下記でそれぞれの内容について詳しく紹介しようと思います。

### 入力画面
入力画面はrailsのフォームビルダーを使って作成しました。
この箇所は通常のユーザー新規作成の箇所とあまり変わりません。

### 確認画面
確認画面では入力画面で入力した内容を表示します。
DBに保存してない値をどのように表示するか悩みました。
session, flashに値を一時的に保存するなども考えたのですが`redis`を使うことにしました。
確認画面に遷移する前にredisにユーザーが入力した値を保存し、確認画面では保存した値を表示します。

### 確認画面から入力画面への遷移
確認画面から入力画面へ遷移したときはフォームの初期値に値を設定しておきたいです。
これにはflashを使いました。
画面リロードでフォームに設定した値は消えてしまいますが、動作としては問題ないと思います。

## まとめ
一般的な認証機能ですが実装してみると悩む箇所が多かったです。
他の実装例など興味あるので教えてもらえると嬉しいです。
【JavaScript・初学者】Reactでよく使われる頻出記法 / mapについて

# はじめに

`React`を学習していましたが、`JavaScript`の記法についてフワッとしている部分がよくあったので、簡単ですが今回は**mapメソッド**について少し調べました。


# mapメソッドの使い方

mapは**配列**の繰り返しをしてくれる関数です。
**mapはオブジェクトには使用できないことを覚えておきましょう。**
```javascript
const data = [1,2,3,4]
const result = data.map((num) => {
    return num + 1;
  }
)
```
```javascript
const data = {id:1, number: 2}
const result = data.map((num) => {
    return num + 1;
  }
)
// Uncaught TypeError: data.map is not a function
```

`React`でよくある使い方は、`API`にリクエストを送り記事一覧を取得して`map`メソッドで使うなどが考えられます。

```jsx:React
const App = () => {
  const todos = [todo1,todo2,todo3,todo4]
  return (
    <>
      <ul>
        todos.map((todo, i) => {
          <li key={i}>{todo}</li>
        }
      </ul>
    </>
  )
)
}
```
# mapとforEachの違い
一番の違いは**戻り値を持つかどうか**です。
`map`は戻り値として配列を返すのに対し、`forEach`は**単純にコールバック関数の処理を実行するだけです。**

```javascript
const arr = [1, 2, 3, 4, 5];

// forEachの場合
const forEachResult = arr.forEach(value => {
  return value * 2;
});
console.log(forEachResult); // undefined

// mapの場合
const mapResult = arr.map(value => {
  return value * 2;
});
console.log(mapResult); // [2, 4, 6, 8, 10]
```
負の実数の実数冪乗について

Fortran では負の実数の実数冪乗は禁止されている件、裏とりをするとわかることがあります。

# Fortran90

§7.1.7 演算の評価 3パラ

> 演算結果が数学的に定義されない数値演算は、実行可能プログラムの実行に現れてはならない。
> 　例1　ゼロによる除算
> 　例2　一次子の値がゼロでべき指数の値がゼロ又は負のべき乗
> 　例3　実数型一次子の値が負で、べき指数が実数型のべき乗

一次子というのは二項演算子であれば左辺のことです。

# Fortran95

手元にないのであとで。たぶん、 Fortran90 と同じでしょう。

# Fortran2003

§7.1.8 演算の評価　2パラ

> 処理系が採用している算術で定義されない数値演算は、実行してはならない。
> 実数型一次子の値が負であって、べき指数が実数型であるべき乗は、してはならない。

負の実数の実数冪乗については変わりませんが、３つあった禁止例が１つになってしまったことに気づきます。

ゼロによる除算はがなくなったのは、おそらく、Fortran2003 で IEEE モジュールを導入して、フラグを設定してゼロ割りで異常終了しないことが選択できるようになったから、実数型のゼロ割りを禁止したままだと辻褄が合わなくなるからですね。

ゼロの冪乗についても同様で、異常終了させないことができるようになりました。

そのへんは、IEEE754 そのものではありませんが、C言語のpow(3) のマニュアルからも読み取れます。
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/pow.3.html
浮動小数点例外 FE_INVALID が上がる場合はフラグでは止められません。いっぽう、FE_DIVBYZERO や FE_OVERFLOW が上がる場合はフラグで止められるわけです。

# Fortran2018

JIS規格は出ていませんが、Fortran2003 と同じです。

§10.1.5.2.4 para 1

> The execution of any numeric operation whose result is not defined by the arithmetic used by the processor is prohibited.
> Raising a real negative value to a real power is prohibited.
【Node.js+Express】HTTP通信 POST受信

<br>
毎回、忘れるので備忘録

<br>

初期設定

```
$ npm init
$ npm i express
```


サーバー側のプログラム

```app.js
const express = require('express');
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

app.listen(3000);
console.log('Server is online.');

app.post('/', function(req, res) {
    // リクエストボディを出力
    console.log(req.body);
    // パラメータ名、nameを出力
    console.log(req.body.name);

    res.send('POST request to the homepage');
})

```

サーバーを立ち上げて
```
node app.js
```

ターミナルウィンドウをもう１つ開いて
以下curlで叩く

```
$ curl -X POST http://localhost:3000 -H "Accept: application/json" -H "Content-type: application/json" -d '{ "name" : "tatsuya" }'

```

VSCodeだとこんな感じ
![スクリーンショット 2023-11-13 20.35.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/92844fc7-61a8-67c1-06f0-49e5bb136c5f.png)

<br<>
出力結果 ( node app.js の方）
```
{ name: 'tatsuya' }
tatsuya

```


以上です。