OmniAICreator/Qiita-1.07M huggingface dataset:
【Vite+Firebase】プロジェクト作成からデプロイまで

# はじめに
Firebaseの初期化作業時の質問内容が最新化されている情報が少なかったので、その辺りの情報を含めてFirebaseにデプロイした時の手順を簡単にまとめます。

# Vite環境構築

① プロジェクトを作成したいディレクトリに移動して、以下のコマンドを実施
```
$ npm create vite@latest
```
プロジェクト名を入力して希望の言語を選択

② 完了したら、作成したプロジェクト配下に移動
```
$ cd プロジェクト名
```
③ package.jsonファイルを読み取り記載されているものをインストール
```
$ npm i 
```

ここまでで環境構築は一通り終わりです。

# Firebaseデプロイ

① [Firebase](https://firebase.google.com/ "Firebase")にアクセスをしてプロジェクトを作成します

② プロジェクトのページにいき、ウェブアプリのマークをクリック
![スクリーンショット 2024-07-17 4.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/e00760e2-e03a-7046-9d5b-470efbdf6d92.png)


③ ウェブアプリにFirebaseを追加する手順が出てくるため、手順に従って進める
![スクリーンショット 2024-07-13 8.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/0617488c-acf5-ddd1-aea8-ca13bd986adc.png)


途中Firebase initで初期化する手順がありますが、下記順番にみていきます。

```
? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices.
(Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
❯◯ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance
◯ Firestore: Configure security rules and indexes files for Firestore
◯ Functions: Configure a Cloud Functions directory and its files
◯ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
◯ Hosting: Set up GitHub Action deploys
◯ Storage: Configure a security rules file for Cloud Storage
◯ Emulators: Set up local emulators for Firebase products
```
今回はデプロイを行うので「 Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys」を選択します。

```
? Please select an option: (Use arrow keys)
❯ Use an existing project
Create a new project
Add Firebase to an existing Google Cloud Platform project
Don't set up a default project
```
すでに作成ずみのプロジェクトを使用するので「Use an existing project」とします。

```
=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to be uploaded with firebase deploy. If you
have a build process for your assets, use your build's output directory.

? What do you want to use as your public directory? dist
```
distを入力します。
私の場合は、ここをdistとしていないと後ほどデプロイした時に画面が表示されない事象につながりました。
（publicやbuildなどでも問題ない場合もあると思うので適宜自分のプロジェクトに合わせて選択してください）

```
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
```
SPAとして設定するか聞かれています。今回はReactを使用するプロジェクトなのでYesとしました。何かフレームワークを利用している場合はYesでいいと思います。

```
? Set up automatic builds and deploys with GitHub? No
```
もし自分でGithubActionsのワークフローファイルを作成する場合は、Noの方がいいです。
Yesとした場合、自動的にワークフローファイルなどを設定してくれるのですが裏でどのような作業をしているかわからずデバッグが必要な時に手こずる可能性があります。
私はここをYesとしたためエラーを解消するのにかなり時間がかかってしまいました。

```
✔  Firebase initialization complete!
```
と表示されれば、初期化の完了です。

④ 全ての手順が終わったら以下を実行しプロジェクトのビルドを行う
```
npm run build
```

⑤ その後デプロイを行う
```
firebase deploy
```
出てきたURLアクセスしてプロジェクトが表示されればデプロイ成功です。

おわりに
今回初めてFirebaseを利用してプロジェクトをデプロイしましたが、Firebaseホスティングの初期化作業の設定を間違えてしまい、のちのCD（自動デプロイ）作業でかなり手こずってしまいました。
同じような作業をする方の参考になれば幸いです！

# 参考
https://qiita.com/hiroki-harada/items/ca22ac177db68e3c3796#%E5%8F%82%E8%80%83
【Tips】Windows 11のHyper-Vで、固定IPのVMを作る方法

# 1.はじめに

本記事では、Windows 11 PC上に、Hyper-Vを利用して、固定IPのVM（Virtual Machine）を作る記事です。

Hyper-Vで、デフォルトのスイッチを利用して作ったVMのIPは、DHCPになります。
しかし、Active Directory やDNSといったサーバを作る場合は、固定IPを設定したいと思うでしょうから、そんな課題を解決するTipsです。

※Microsoft Learnにもある有名なやり方ですが...昔、やり方が分からなかったので、記事にいたしました。

https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network

# 2.Tips

今回のTipsは、以下となります。具体的な手順は次のセクションでご紹介します。

1. Hyper-Vで、内部ネットワークのスイッチを作る
2. ホストPC上で、PowerShellを利用し、```New-NetNat```を使う
3. VMを作り、VMに内部スイッチを割り当てる
4. VMに固定IPの設定をする

::: note
Hyper-Vの有効化
Windows PCで、Hyper-Vを利用する場合は、プロフェッショナルエディション以上（Pro、Enterprise、または Education)である必要があります。

もし、Windows 11 Proをご利用中で、有効化していない場合は、以下手順で有効化できます。

①「Windows + R」キーを押して「実行」ウィンドウを開き、「appwiz.cpl」と入力。
②「プログラムと機能」ウィンドウが開くので、左側のメニューから「Windowsの機能の有効化または無効化」を選択。
③チェックボックスの中から「Hyper-V」を選択し、「OK」をクリックし、再起動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/24e9cc99-1996-7de5-dea2-cc7ffaaa277f.png)

:::

# 3.手順
### 3-1.Hyper-Vで、内部ネットワークのスイッチを作る

Hyper-Vマネージャを開き、「仮想スイッチマネージャ > 内部 > 仮想スイッチの作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/caf6400d-6f87-88db-aa2a-a8f84b0de294.png)
<br>

任意の名前を付けて、「内部ネットワーク」を選び、「OK」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/c6fac109-add2-2dbe-6f0f-dd5e5392b152.png)
<br>

ホストPCの各NICを確認すると、仮想NICが作成されています。
この仮想NICが先ほど作った内部スイッチに接続しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/cd7af868-d582-171b-fbe7-248fddb80018.png)

この仮想NICに、IPアドレスを設定します。このとき、設定するIPアドレスは、仮想マシンのデフォルトゲートウェイになります。そのため、このネットワークセグメントをこの後設定するNATに利用します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/dc546360-223d-4973-0532-6bbd0ad24ea6.png)

### 3-2.ホストPC上で、PowerShellを利用し、```New-NetNat```を使う

ホストPC上で、管理者権限で、PowerShellを起動します。
そして、以下のようにコマンドを入力することで、WinNATの設定をすることができます。
NAT対象のIPレンジは、```-InternalIPInterfaceAddressPrefix```で定義されているため、192.168.100.0/24のセグメントとなっています。つまり、このセグメント内のIPをVMの固定IPに利用することが可能となります。

```
New-NetNat -Name "NAT-Internet" -InternalIPInterfaceAddressPrefix 192.168.100.0/24
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/0c571ff1-175f-f564-2715-90905a7f7657.png)
<br>

::: note alert
Windows NAT (WinNAT) 
仕様上、ホストごとに1つのNATネットワークのみを作成できます。

https://techcommunity.microsoft.com/t5/virtualization/windows-nat-winnat-capabilities-and-limitations/ba-p/382303
:::

### 3-3.VMを作り、VMに内部スイッチを割り当てる

次に、VMを作成した際に、「ネットワークアダプター」には、先ほど作成した内部SWを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/16d8fabd-155c-a927-956c-7dc1f101ca25.png)


### 3-4.VMに固定IPの設定をする

VMが起動したら、対象のNICのプロパティを開き、IPアドレスの設定をします。
このとき設定するIPアドレスは、NAT対象のIPレンジを利用し、デフォルトゲートウェイはホストPC上の仮想NICに設定したIPアドレスとなります。
なお、下記画像では、Active Directoryとしているため、127.0.0.1にDNS設定をしていますが、AD一台構成のテスト用の設定となりますので、注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/615ed9df-bf62-955c-71ae-a2a85ac4c3a0.png)
<br>

以上で、VMを固定IP化することができ、VMからインターネットにも抜けることができる状態になりました。

# 4.おわりに

お疲れさまでした。有名なTipsではありますが、もし何かのお役に立てれば幸いです。
Javaで「引数を使ってメソッドに値を渡す」の動作を確認してみた

# 概要

Javaで「引数を使ってメソッドに値を渡す」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/method/index3.html

# 実装

以下のファイルを作成しました。
```JSample3_1.java
class JSample3_1{
  public static void main(String args[]){
    int num1, num2;

    num1 = 10;
    num2 = 8;
    keisan(num1, num2);

    num1 = 23;
    keisan(num1, 7);

    keisan(15, 22);
  }

  private static void keisan(int n1, int n2){
    System.out.println("num1 = " + n1 + ",num2 = " + n2);
    System.out.println("num1 + num2 = " + (n1 + n2));
    System.out.println("num1 - num2 = " + (n1 - n2));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample3_1.java 
$ java JSample3_1 
num1 = 10,num2 = 8
num1 + num2 = 18
num1 - num2 = 2
num1 = 23,num2 = 7
num1 + num2 = 30
num1 - num2 = 16
num1 = 15,num2 = 22
num1 + num2 = 37
num1 - num2 = -7
```

# まとめ

何かの役に立てばと。
Qiita Engineer Festa 2024完走~長いようで短いような~

## はじめに
Qiita Engineer Festa 2024完走しました。
38記事投稿完了しました！
今回の記事では記事投稿マラソンにチャレンジした経緯やこれからのことを話していきたいと思います。

## Qiita Engineer Festa 2024を終えて
私はQiitaのこのようなお祭りに参加するのは初めてでした。
今までは、ただの一読者であり、自分が38記事こつこつ投稿できることは予想できなかったです。

なぜ、今回お祭りに参加したかというと、一言で言うと今の現状を変えたかったからです。

学びたいことを学んだだけで終わり、そこからアウトプットするという習慣がついていませんでした。

その現状を変えたくて、今回お祭りに参加してみました。

**参加するからには完走したい**

私は強く決意しました。自分の信念というか意志として、**決意したことをやり通す**ということをモットーにしているので、今回も信念に従い投稿を続けました。

<font color="red">投稿していくうちに、学んで、記事に書いて、投稿するということが楽しくなっていました。</font>

学ぶことってこんなに楽しいんだと感じました。

## これから
お祭りは終わっても、記事投稿は続けていきたいと思います。
ただ、頻度を週一くらいにし、もっと記事の質を高めていきたいです。

やりたいことも、学びたいことも色々あります。

ただ、純粋に学びたいことを学んで、楽しんで投稿していこうと思います。
ロードバランサー振り返り

# はじめに
普段、何気なく使ってるロードバランサー。
簡単に言うと負荷分散の装置ですが、具体的に何をしているのか、いまいちピンと来ない…って人も多いのではないでしょうか？

技術的な説明を読むと、専門用語も多く、理解するのが難しいと感じてしまうかもしれません。

この記事では、初学者向けに、ロードバランサーをふわっとイメージできることを目指します。

# ロードバランサーの役割

ロードバランサーは、以下の役割を担っています。

### 「待ち時間ゼロ」を実現する案内役

例えば、レストランの入り口に長蛇の列ができていると、お客様はイライラしてしまいますよね？

ロードバランサーは、まるで優秀な案内役のように、複数のサーバーを巧みに使い分け、お客様をスムーズに案内し、待ち時間を最小限に抑えます。

具体的には、ユーザーのリクエストを複数のサーバーに分散することで、一つのサーバーに集中する負荷を軽減し、高速なレスポンスを実現します。

人気ブログにアクセスした際など、ロードバランサーがリクエストを複数のサーバーに分散することで、サーバーがダウンするのを防ぎ、ユーザーはストレスなくコンテンツにアクセスできます。

### 「サーバーの健康管理」を担うお医者さん

サーバーは、人間と同じように、疲れてしまうこともあります。

ロードバランサーは、サーバーの状態を常に監視し、調子が悪いサーバーを休ませたり、別のサーバーに負荷を移したりすることで、システム全体の健康を保ちます。

例えば、あるサーバーが異常なアクセスを検知すると、ロードバランサーは、そのサーバーへのリクエストを一時的に停止し、他のサーバーに負荷を分散させます。
これによって、システム全体の安定性を保ちます。

# 参考

ロードバランサーには、様々な種類があり、それぞれに特徴があります。

* **ハードウェアロードバランサー** 

物理的な機器として設置され、高性能な処理能力を持つため、大規模なシステムに適しています。

* **ソフトウェアロードバランサー**

ソフトウェアとして動作するため、柔軟性が高く、コストを抑えたい場合に適しています。

* **クラウドロードバランサー**

クラウドサービスに組み込まれているため、簡単に設定し、スケールアップ・ダウンが容易です。

# まとめ
この記事では、ロードバランサーをふわっとイメージできるように、簡単な説明を行いました。

どのロードバランサーを使うかはケースバイケースなので、運用に合ったロードバランサーを選び、適切なコストで、適切なシステム運用を行いましょう🙂
Spring FrameworkのHttpHeaders型を使用してHTTPヘッダーを設定する場合も、改行コードや余分な空白を除去する例

## HttpHeaders型 の場合の改行コード除去

```java
import org.springframework.http.HttpHeaders;

public class HttpHeaderCleaner {

    public static void main(String[] args) {
        // ヘッダーキーと値のペアを定義
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/json\n");
        headers.add("User-Agent", "Mozilla/5.0\n");

        // 改行コードを除去
        HttpHeaders cleanHeaders = new HttpHeaders();
        headers.forEach((key, values) -> {
            values.forEach(value -> {
                String cleanValue = value.replaceAll("\\r\\n|\\r|\\n", "");
                cleanHeaders.add(key, cleanValue);
            });
        });

        // 結果を表示
        cleanHeaders.forEach((key, values) -> {
            values.forEach(value -> System.out.println(key + ": " + value));
        });
    }
}
```

## Spring MVCのコントローラでretrunの時にhttpヘッダーの値に改行コードが含まれている場合の改行コード除去

```java
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.http.HttpStatus;

@RestController
public class HeaderController {

    @GetMapping("/test-header")
    public String testHeader(@RequestHeader HttpHeaders headers) {
        HttpHeaders cleanHeaders = new HttpHeaders();

        // 各ヘッダーの値から改行コードを除去
        headers.forEach((key, values) -> {
            values.forEach(value -> {
                String cleanValue = value..replaceAll("\\r\\n|\\r|\\n", "");
                cleanHeaders.add(key, cleanValue);
            });
        });

        // クリーンなヘッダーを使って処理を続ける
        return "Processed headers: " + cleanHeaders.toString();
    }
}
```

## 参考URL

https://www.ipa.go.jp/security/vuln/websecurity/http-header.html
[web.xmlの設定]セッション管理に使用されるクッキーにSecure属性追加

Spring MVCでweb.xmlの<cookie-config>セクションに<secure>を指定すると、セッション管理に使用されるクッキーにSecure属性が追加され、HTTPS接続でのみ送信されるようになります。具体的な動作は以下の通りです。

設定例
web.xmlで以下のように設定します：
```xml
    <session-config>
        <cookie-config>
            <secure>true</secure>
        </cookie-config>
    </session-config>
```


## 動作概要
#### セッション管理クッキーのSecure属性追加:

上記の設定を追加すると、セッション管理に使用されるクッキー（通常はJSESSIONID）にSecure属性が設定されます。
これにより、セッションIDクッキーはHTTPS接続の場合にのみ送信されます。HTTP接続では送信されません。
#### セキュリティの向上:

Secure属性を設定することで、セッションIDが平文のHTTP接続で送信されることを防ぎ、クッキーの盗聴を防ぐことができます。
これは特に機密性の高いデータを扱うアプリケーションにおいて重要です。
#### HTTPSの使用が必須:

アプリケーションはHTTPSを使用するように構成されている必要があります。HTTPのみの環境では、セッション管理クッキーが送信されないため、セッションが正しく機能しません。

--- 
## 参考URL

https://qiita.com/opengl-8080/items/6dc37f8b77abb5ae1642
Operation OrchidのWriteup

Sleuth Kitのコマンドを使って問題文にあるディスクイメージからフラグを探していく。

手始めにmmlsコマンドでパーティションテーブルをダンプする。
```
$mmls disk.flag.img 

DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

      Slot      Start        End          Length       Description
000:  Meta      0000000000   0000000000   0000000001   Primary Table (#0)
001:  -------   0000000000   0000002047   0000002048   Unallocated
002:  000:000   0000002048   0000206847   0000204800   Linux (0x83)
003:  000:001   0000206848   0000411647   0000204800   Linux Swap / Solaris x86 (0x82)
004:  000:002   0000411648   0000819199   0000407552   Linux (0x83)
```

4つ目のパーティションが最も容量の大きいメインのパーティションぽいのでここを掘っていく。
```
$fls -o 411648 disk.flag.img 

d/d 460:        home
d/d 11: lost+found
d/d 12: boot
d/d 13: etc
d/d 81: proc
d/d 82: dev
d/d 83: tmp
d/d 84: lib
d/d 87: var
d/d 96: usr
d/d 106:        bin
d/d 120:        sbin
d/d 466:        media
d/d 470:        mnt
d/d 471:        opt
d/d 472:        root
d/d 473:        run
d/d 475:        srv
d/d 476:        sys
d/d 2041:       swap
V/V 51001:      $OrphanFiles
```

順番にflsで見ていくとrootにそれっぽいファイルが見つかる

```
$fls -o 411648 disk.flag.img 472

r/r 1875:       .ash_history
r/r * 1876(realloc):    flag.txt
r/r 1782:       flag.txt.enc
```

flag.txtとflag.txt.encという明らかにフラグを持ってそうなファイルがあるので
それぞれicatで覗いてみる
```
$icat -o 411648 disk.flag.img 1876

           -0.881573            34.311733
```
```
$icat -o 411648 disk.flag.img 1782

Salted__0!-6V0Ul&:pj_10|h
                         Ȥ7 ؎$'%
```
flag.txtは何か処理されて数字になってしまっている
flag.txt.encはファイル名からも中身の文字列からもSaltされてエンコードされている

flag.txt.encをデコードすればよさそうなので、手掛かりを探す。
同じフォルダに`.ash_history`があるbashの履歴は`bash_history`ファイルに保存されるので
おそらく`.ash_history`にもシェルのコマンド履歴がありそうな予感がする。

icatで覗いてみる。
```
$ icat -o 411648 disk.flag.img 1875   

touch flag.txt
nano flag.txt 
apk get nano
apk --help
apk add nano
nano flag.txt 
openssl
openssl aes256 -salt -in flag.txt -out flag.txt.enc -k unbreakablepassword1234567
shred -u flag.txt
ls -al
halt
```

opensslでflag.txtをエンコードした結果をflag.txt.encに保存しているので
同じキーを使ってopensslでデコードしてやればよさそう。
flag.txt.encの中身を別途ファイルに書き出してopensslのコマンドをたたいてデコードすると
WARNINGの後にフラグ文字列が現れる


```
$openssl aes256 -d -in flag.txt.enc -k unbreakablepassword1234567
```
仕事を任せてもらうための方法6選

# 多様な仕事を任せてもらうための努力

私は実力は大したことないですが、率先して上の仕事を取りに行ったり、自発的に行動したり、記事にあるような6選を実践することで、色々なことを任せてもらえるようになりました。
具体的には、下記の内容です。
- **チームリーダー**
- **見積もり**
- **BP面談**
- **社内の経営会議**

このような重要な仕事を任せてもらえるようになりました。
本来役職持ちの方が行ったり、参画するようなことをさせて頂いて感謝しています。
もちろん会社規模や文化によって異なると思いますが、共通する何かいいと思うことがあれば幸いです。

以下に、そのための具体的なアクションプランを紹介します。

## 1. コミュニケーションをとる

職場でのコミュニケーションは、単に仕事に関する話題だけではなく、プライベートな話題も含めて円滑に進めることが重要です。同僚や上司との信頼関係を築くためには、仕事以外の話も積極的に交わすことが大切です。例えば、趣味や週末の過ごし方など、ちょっとした話題を共有することで、関係が深まります。

## 2. 自己アピールする

自己アピールは、自分の存在をアピールするための重要な手段です。最近学んだことや達成したこと、取得した資格について積極的に話すことで、周囲に自分の成長をアピールしましょう。また、仕事について質問することで、自分が積極的に学び続けている姿勢を示すことができます。これにより、信頼を得やすくなります。

## 3. 謙虚である

謙虚さは、人間関係を円滑に進めるための基本です。自分の意見を押し付けず、他人の意見にも耳を傾ける姿勢を持つことが重要です。謙虚な姿勢で仕事に取り組むことで、周囲からの信頼を得ることができます。また、失敗を恐れず、他人からのフィードバックを素直に受け入れることも大切です。

## 4. 一つ上の職位の仕事を奪う意識

先輩から教えてもらったことの一つとして、常に一つ上の職位の方の仕事を奪っていく意識を持つことが挙げられます。これは、自分のスキルを高めるための挑戦でもあり、上司に対して自分が次のステップに進む準備ができていることを示すことができます。自発的に新しいタスクを引き受け、責任を持って遂行することで、信頼を得ることができるでしょう。

## 5. やり切る力

どんなに難しいタスクでも、最後までやり切る力が重要です。途中で投げ出さず、困難に直面しても解決策を見つけるために粘り強く取り組む姿勢が求められます。この「やり切る力」があると、上司や同僚からの信頼が高まり、さらに多くの仕事を任されるようになります。

## 6. 運を引き寄せるための努力

成功には運も重要な要素ですが、その運を引き寄せるためには、日々の努力が必要です。常にベストを尽くし、自分の仕事に対して真摯に取り組む姿勢を持ちましょう。運は努力している人に訪れることが多いと言われています。自分のスキルを磨き続け、新しいことに挑戦することで、チャンスが訪れたときにそれを活かすことができるようになります。

## まとめ

多様な仕事を任せてもらうためには、技術力の向上だけでなく、コミュニケーション能力や謙虚さ、自己アピールの力も必要です。

この記事が、多様な仕事を任せてもらうための参考になれば幸いです。これからも努力を続け、エンジニアとしてのキャリアをさらに発展させていきましょう。
Microblaze備忘録(仮)

MicroBlazeアプリケーションのSPI Flashロードを調べた際のメモ

# 参考サイト一覧メモ

## DDR3 SDRAMとMicroblazeの接続

https://www.hackster.io/vnikolov/tutorial-microblaze-with-ddr3-sdram-f97bdc#toc-project-files-5

## Microblaze SREC SPI BootLoader

https://shadowcode.io/microblaze-srec-spi-bootloader-hardware/

https://shadowcode.io/vitis-srec-spi-bootloader-software/

### SRECとは？

Motoload S-Recordの略語。
バイナリデータをASCII形式で表現するためのフォーマット。

https://ja.wikipedia.org/wiki/S-record

# 今後

とりあえずVivado 2023.2でSREC SPI Bootloaderが可能か試す。
[Joke] 最大の圧縮率を誇るtmcompの復号プログラムtmdecomp

最大の圧縮率を誇るtmcomp用復号プログラムtmdecompです。
非可逆圧縮なので、元のファイルは戻りませんが、同じ名前のファイルを出力します。
ファイル内容はどんなファイルを復号しても0x0aです。
あれだけ非可逆圧縮と断っていたので、元のファイルが戻らなくても、怒らないで下さい。
`cc tmdecomp.c -o tmdecomp`でコンパイルし、
`./tmdecomp file.tmc`で実行して下さい。

```tmdecomp.c
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
void main(int argc,char *argv[]) {
    if (argc!=2) {
        fprintf((stderr),"Error invalid argument.");
        exit(1);
        }
    char *s=argv[1];
    if (strcmp(&(s[strlen(s)-4]),".tmc")!=0) {
        fprintf((stderr),"It is not .tmc file.\n");
        exit(1);
        }
    char spi[strlen(s)-4];
    strncpy(spi,s,strlen(s)-4);
    FILE *efp=fopen(s,"r");
    if (efp==NULL) {
        fprintf(stderr,"File does not exsist.\n");
        exit(1);
        }
    FILE *ofp=fopen(spi,"wb");
    fputc((int)0xa,ofp);
    fclose(efp);
    fclose(ofp);
}
```
ubuntuにSRware ironをインストールする

どうもubuntu初心者です。
ブラウザをインストールしようとして公式リポジトリからダウンロードしたものはいいものの何故か使えない( ﾟдﾟ)
説明を見てもわからない用語だらけで、てんてこ舞いで困ったもんですよ(-_-メ)

# １　公式からdebパッケージをインストール
SRware ironの公式
ダウンロードのところをクリックしてください
[^KEY]: 
https://www.srware.net/iron/ja
![Screenshot from 2024-07-17 01-28-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673746/138e1da0-786e-9ff0-d7d9-c88dd34690e4.png)

次に下から２行目のリンクをクリックすればdebパッケージがインストールされます。
![Screenshot from 2024-07-17 01-30-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673746/18febad4-1569-59ed-4e6f-43f019bf1a03.png)

debパッケージがインストールされていますね。
![Screenshot from 2024-07-17 01-32-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673746/2b81afad-828f-e9dd-c761-ee9511a88096.png)

# 2 GDebiをインストールする
インストールされたままのdebパッケージは使えないので
GDebi（Debian 実行可能パッケージをインストールするためのパッケージ インストーラー）をインストールします
```
  sudo apt inatall gdebi
```
iron.debをgdebiで開いてあげれば使えるようになります
![Screenshot from 2024-07-17 01-44-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673746/0d1be61a-2c91-6bb8-68a8-6b3602ff34ad.png)

”パッケージをインストール”をクリックすればアイコンが追加されているはずです。
![Screenshot from 2024-07-17 01-45-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673746/2346c7c8-0ca2-66fe-a8f1-f08581d60d0f.png)




![Screenshot from 2024-07-17 01-12-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673746/29bef7f7-6977-b704-82e1-b17a6e3e1fa3.png)
下の方にアイコンが追加されていますね

# 追記
Gdebiを初めて使いました　debパッケージからアイコンが追加されて何故か使える
なんででしょうね　詳しい方いらしたら教えてほしいです！　
これからもubuntuを使って学んでいこうと思います^_^
type-challenges 中級編11: Drop Char、MinusOne、PickByType

# type-challenges 中級編11: Drop Char、MinusOne、PickByType

## はじめに

[GitHubのtype-challengesリポジトリ](https://github.com/type-challenges)は、TypeScript型システムの理解を深めるための型クイズ問題集です。高品質な型を作成することで、バグを減らし、プロジェクトの保守性を向上させることができます。今回は中級編から3つの問題に挑戦します。

### 1. Drop Char

この課題では、文字列から指定された文字を削除する型を実装します。

#### 例

```typescript
type Butterfly = DropChar<' b u t t e r f l y ! ', ' '> // 'butterfly!'
```

#### 私の回答

```typescript
type DropChar<S, C extends string> = 
  S extends `${infer L}${C}${infer R}` ? `${L}${DropChar<R,C>}` : S
```

#### 解き方

- 文字列型 `S` を分解し、指定された文字 `C` が見つかった場合にその文字を取り除いて再帰的に処理します。
- 基本的にテンプレートリテラル型を使用して文字列を分割し、不要な文字を削除します。

:::note info
いつもの文字列操作ですね
:::
`${infer L}${C}${infer R}`
で取り出すのを覚えておけば簡単！

### 2. MinusOne

この課題では、数値型を1減らす型を実装します。

#### 例

```typescript
type Zero = MinusOne<1> // 0
type FiftyFour = MinusOne<55> // 54
```

今回は答え見ちゃいました（難しくない..?）

```typescript
type Pop<T extends any[]> = T extends [...infer Head, any] ? Head : never;

type MinusOne<T extends number, A extends any[] = []> = A['length'] extends T
  ? Pop<A>['length']
  : MinusOne<T, [...A, 0]>
```

#### 解き方

- 数値 `T` を配列の長さとして取り扱い、1減らす操作を再帰的に行います。
- `Pop` 型を使用して配列の最後の要素を取り除きます。
- 再帰的に配列を拡張していき、配列の長さが `T` に達した時点で1減らした結果を返します。

:::note warn
文字列リテラル型の操作、オブジェクト、配列操作、Unionの型操作はできるが数値をいじるのはかなり難しい
一度配列に直さないといけない、、
:::


### 3. PickByType

この課題では、指定された型 `U` に割り当て可能なプロパティのみをピックする型を実装します。

#### 例

```typescript
type OnlyBoolean = PickByType<{
  name: string;
  count: number;
  isReadonly: boolean;
  isEnable: boolean;
}, boolean>; // { isReadonly: boolean; isEnable: boolean; }
```

#### 私の回答

```typescript
type PickByType<T, U> = {
  [K in keyof T as U extends T[K] ? K : never]: T[K];
}
```

#### 解き方

- オブジェクト型 `T` の各プロパティ `K` が型 `U` に割り当て可能かをチェックします。
- 割り当て可能なプロパティのみを新しいオブジェクト型に含めます。

:::note info
as でオブジェクトのプロパティをいじる事ができればできる！(`as never`でプロパティを削除することもできる)
:::

## まとめ

これらの課題を通じて、TypeScriptの型システムをより深く理解することができます。特にテンプレートリテラル型や再帰的な型の使用法について学ぶことで、より柔軟で強力な型を作成するスキルが身につきます。ぜひこれらの課題に挑戦して、型の理解を深めてください。

### 参考記事

- [TypeScript公式ドキュメント](https://www.typescriptlang.org/docs/)
- [type-challenges GitHubリポジトリ](https://github.com/type-challenges/type-challenges)
エンジニアになる前に学んでおけば良かったこと5選！！

# エンジニアになる前に学んでおけば良かったこと5選！！
ここでいうエンジニアはWebアプリケーション開発におけるエンジニアを指しています。
エンジニアとしてキャリアを積む中で、もし過去に戻れるなら学んでおきたかったことがいくつかあります。これからエンジニアを目指す方々や、キャリアをスタートしたばかりの方々に参考になればと思い、この記事を書きました。

## 1. CSの知識や基本情報、応用情報

### CSの基礎知識
コンピュータサイエンス（CS）の基礎知識は、エンジニアとしての土台を築くために非常に重要です。アルゴリズムとデータ構造、オペレーティングシステム、ネットワークなどの基本概念を理解することで、問題解決能力が向上します。これらの知識は日々の開発業務でも役立ちます。
スポーツでもそうですが基礎・土台がしっかりしているとその後の伸び代にもつながって来ると思います。

### 基本情報技術者試験・応用情報技術者試験
これらの資格試験は、日本におけるITの基本的な知識を網羅しています。基本情報技術者試験は、IT業界のエントリーレベルの知識をカバーし、応用情報技術者試験は、さらに高度な内容を扱います。これらの試験の勉強を通じて、システム開発の基本的な考え方やプロジェクト管理、セキュリティなどの重要な知識を身につけることができます。

特に私は情報系の学習を高校や大学で行なっていなかったので、汎用的に理解するっていう観点でよかったです。
資格取得はしなくても良いですが、一通り書籍を眺めてどのような内容が記載されているのか確認するのでもいいと思います。

## 2. AWSやクラウドの知見

クラウドコンピューティングは現代のITインフラの中心です。AWS（Amazon Web Services）はその代表格であり、AWSの基本的なサービス（EC2、S3、RDSなど）についての知識を持っておくことは非常に有益です。クラウドの利用方法やコスト管理、セキュリティのベストプラクティスを理解することで、インフラ構築や運用がスムーズになります。

かなりクラウドサービスが活用されているので、実際に現場に入る前に汎用的な理解や実際にサービスを触れているといいなと思います。

## 3. サービス作成、運用

### サービスの作成
実際に自分でサービスを作成する経験は非常に価値があります。企画から設計、開発、テスト、デプロイまでの一連の流れを経験することで、プロジェクト全体を見渡す力が養われます。また、ユーザーのフィードバックを受けて改善を繰り返すことで、実践的なスキルが身につきます。

### サービスの運用
運用フェーズでは、サービスを安定して提供するための様々な技術や知識が必要になります。モニタリング、ロギング、アラート設定、スケーラビリティの確保、バックアップなど、運用に関するスキルは長期的なサービス提供には欠かせません。
一通り開発から運用まで一貫するっていう経験があるといいなと思います。

## 4. インターン

インターンシップは、実際の現場での経験を積む絶好の機会です。企業の文化を学び、現場のエンジニアから直接指導を受けることができます。また、インターンを通じて業界のネットワークを築くことができ、将来の就職活動に役立つことも多いです。

私はIT系のインターンをしたことがないですが、周りのエンジニアが推しているのもあり、私がもし戻ったら確実にインターンの参加を行います。

## 5. アウトプット

qiitaやGithubなどアウトプットとして、何かあるといいと思います。
他者へのアピールもそうですが、自分自身のアウトプットや学習の習慣などを身につけておけると尚いいのかと思います。

## まとめ

エンジニアになる前に学んでおけば良かったことは多岐にわたりますが、基礎的な知識や実践的な経験、そしてソフトスキルの向上が重要です。これからエンジニアを目指す方々にとって、この情報が少しでも役に立てば幸いです。これからも常に学び続け、成長していきましょう。
macOSのコマンドで最長文字数のコマンドは？平均文字数は？という疑問をcompgen + AWKで検証してみた

# 事の起こり
先日、筆者の友人の@jouleさんが以下の大変面白い記事を投稿していました。

https://qiita.com/joule/items/e74011c279e6c7ac566f#comments

https://qiita.com/joule/items/78679e7ee0098920967c

コマンド(compgen、AWK)を駆使して、Ubuntuにおける最大文字数のコマンドやコマンドの平均文字数、そして1文字コマンド(最小文字数)、各文字数のコマンドがどれぐらい存在するかなど、なかなかユニークな内容です。筆者はふと思いました。macOSのコマンドを調べたら、どの様な結果が得られるだろうか？と。そこで、友人に聞いてみたところ、この調査で必要なcompgenコマンドはbashで利用出来るコマンドであり、友人が愛用しているzshの環境では利用出来ないとのことでした。(厳密には以下の参考記事に記載されているおまじないを利用すればzshでも実行可能です。)筆者はMacでbashを利用しているのですぐに検証が出来ます。よって、compgen + AWKを駆使して、macOSのコマンドで最長文字数のコマンド、コマンドの平均文字数、等々を調査してみようと思います。

* 参考

https://orebibou.com/ja/home/201805/20180503_001/

# 環境情報
以下の環境を用いて調査しました。
* macOS 14.5 Sonoma
* bash 5.2.26

# compgenコマンド
compgenコマンドの本来の用途は、bashの補完候補生成です。ターミナル上でコマンドを入力する時に、途中まで入力した後に、TABキーを打鍵すると補完されますが、その候補を生成するのが、compgenコマンドです。ここで、compgenコマンドの今回用いるオプションは以下です。

|オプション|詳細|
|---|---|
|-c|実行できるコマンド|
|-b|実行できるビルトイン|
|-k|実行できるキーワード|

https://atmarkit.itmedia.co.jp/ait/articles/1907/18/news009.html

# 最長文字数のコマンドを調査
まずは最長文字数のコマンドを調査します。以下のコマンドを実行してみます。

```bash
compgen -bck | awk 'max<length($0){max=length($0);c=$0} END{print max, c}'
```

以下の結果が得られました。これは通常のユーザー実行コマンドでは無い様です。

```bash
$ compgen -bck | awk 'max<length($0){max=length($0);c=$0} END{print max, c}'
50 __git_compute_second_level_config_vars_for_section
```

各オプションを1つずつ使った場合の結果

```bash
$ compgen -b | awk 'max<length($0){max=length($0);c=$0} END{print max, c}'
9 readarray
```

```bash
$ compgen -c | awk 'max<length($0){max=length($0);c=$0} END{print max, c}'
50 __git_compute_second_level_config_vars_for_section
```

```bash
$ compgen -k | awk 'max<length($0){max=length($0);c=$0} END{print max, c}'
8 function
```

readarrayはファイルから行を読み込み、配列に格納するビルトインコマンド、functionはbashのfunctionの様です。

# 平均文字数の調査
以下のコマンドを実行します。

```bash
compgen -bck | awk '{c=c+1;lc=lc+length($0)} END{ print lc/c }'
```

最大文字数のコマンドが50文字であるにしては平均文字数が小さい様な。。。

```bash
$ compgen -bck | awk '{c=c+1;lc=lc+length($0)} END{ print lc/c }'
10.3159
```

# 文字数の分布を調査
コマンドの文字数毎の分布を出してみます。

```bash
compgen -bck | awk 'BEGIN{split(0,ar)} {p=length($0);ar[p]+=1} END{for(i=1;i<=50;i++){printf("%02d, %d\n", i, ar[i])}}'
```

```bash
$ compgen -bck | awk 'BEGIN{split(0,ar)} {p=length($0);ar[p]+=1} END{for(i=1;i<=50;i++){printf("%02d, %d\n", i, ar[i])}}'
01, 18
02, 84
03, 142
04, 244
05, 250
06, 283
07, 310
08, 297
09, 196
10, 176
11, 155
12, 121
13, 95
14, 84
15, 90
16, 53
17, 50
18, 55
19, 42
20, 53
21, 61
22, 45
23, 24
24, 26
25, 26
26, 19
27, 14
28, 12
29, 21
30, 6
31, 5
32, 8
33, 7
34, 9
35, 5
36, 7
37, 2
38, 3
39, 1
40, 2
41, 1
42, 0
43, 0
44, 0
45, 1
46, 0
47, 0
48, 0
49, 1
50, 1
```

コマンドの文字長に随分と偏りが有ることが分かります。最も数が多いのは7文字のコマンドの様です。実はこれはUbuntuも同様です。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/1318a406-2590-3aa0-3acf-918631a76cfc.png)

# 1文字コマンド
最後に1文字コマンドを検索してみます。

```bash
compgen -bck | awk 'length($0)==1{printf("%s ", $0)} END{printf("\n")}'
```

以下の結果となりました。

```bash
$ compgen -bck | awk 'length($0)==1{printf("%s ", $0)} END{printf("\n")}'
. : [ { } ! ! . : R X [ [ l w { }
```

# まとめ
macOS Sonomaにおけるコマンド文字数に関する素朴な疑問を検証してみました。面白いアイディアを提供してくれた友人の@jouleさんには感謝です。
Raspberry Pi AI Kit 使ってみた

## Raspberry Pi AI Kit
イスラエルのHailoが出しているHailo 8LというNPUです。
ラズパイ5向けで13TOPSとのことです。

![https://www.switch-science.com/cdn/shop/files/74012faf-a369-44bc-9fc0-928a99ecb107_360x360.jpg?v=1720761431](https://www.switch-science.com/cdn/shop/files/74012faf-a369-44bc-9fc0-928a99ecb107_360x360.jpg?v=1720761431)

スイッチサイエンスのページ

https://www.switch-science.com/products/9695

日本では軒並み売り切れ状態です。いつ入荷されるのでしょうか？

今回はwaveshareで運よく買えたので香港から船でどんぶらこと運んでいただきました。

## 組み立て
簡単でした。
イカツイGPIO拡張を付けたのでイカツイ(語彙力)
![Image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/f41652bb-6c3d-d7a5-ec67-e7f9c3fb76d5.jpeg)

## 環境構築
今回は以下のRepositoryで遊んでみます。

https://github.com/hailo-ai/hailo-rpi5-examples

セットアップは以下で行う。
```sh
->  Raspberry Pi Bookworm 64bit をインストール (Raspi Imager, MicroSD)

->  Raspberry Pi AI Kit を装着

sudo apt update && sudo apt full-upgrade
sudo rpi-eeprom-update

  (2023 年 12 月 6 日以降の ファームウェアなら OK、古ければ
  sudo raspi-config
  sudo rpi-eeprom-update -a
  sudo reboot now
  を実行　)

sudo reboot now

sudo apt install hailo-all
sudo reboot now

sudo raspi-config
 -> Advanced Options
   -> PCIe Speed
     -> Yes (enable PCIe Gen 3 mode.)
       -> Finish
       
sudo reboot now

```

https://www.raspberrypi.com/documentation/accessories/ai-kit.html

## 動作
先ほどのgithub repositoryをcloneして移動します。
その後、
```sh
source setup_env.sh

pip install -r requirements.txt

./download_resources.sh

python basic_pipelines/detection.py --input resources/detection0.mp4
```

![out_hailo(1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/b47c5130-5215-4bca-fce4-dffae3b2f6b0.gif)

YOLOv6nで30FPSほど出ています。速い！
ラズパイカメラモジュールも使えました。
※```--input rpi```にすると使える。

今回はサンプルをそのまま使いましたが、カスタムモデルをコンバートできるかとか落ち着いたら見てみたいと思います。
【教養】3分でわかるSQLのN+1問題

## なぜ必要か
- データを効率的に管理する方法としてSQLがある。
- SQLサーバへの負荷を最小にしたい --> クラウドサービスならコストも安くなるし単純に動作も早くなるため。

---

## SQLのN+1問題とは

### SNSを例に

タイムラインに表示する投稿を集めるスクリプトを作る必要があるとする。
この際以下のようなテーブルになっているとする。

|id|投稿内容|ユーザID|
|--|-------|-------|
|1 |わわわ  |1      |
|2 |なんとかなれー   |2      |
|3 |ふ   |1      |


|ユーザID|ユーザ名|
|--------|--------|
|1       |ちいかわ|
|2       |ハチワレ|

そして，タイムラインに`ユーザ名`と`投稿内容`をセットにして表示したい!という要件を満たす必要がある。

普通にSQLを使おうとするとこんな感じになる。
1. 投稿内容が含まれるテーブルから`投稿内容`と`ユーザID`を取得するSQLを実行する。

```sql
SELECT * FROM 投稿内容テーブル;
```
2. ユーザデータのテーブルにアクセスして`ユーザID`から`ユーザ名`
を取得するSQLを実行する。

```sql
SELECT ユーザ名　FROM ユーザテーブル WHERE ユーザテーブル.ユーザID = 1;
SELECT ユーザ名　FROM ユーザテーブル WHERE ユーザテーブル.ユーザID = 2;
SELECT ユーザ名　FROM ユーザテーブル WHERE ユーザテーブル.ユーザID = 1;
```

すると，投稿数ユーザ数が増えると2のSQL文を実行する量がとてつもなく増えてしまう。これがN+1問題である。

### ではどうすればよいのか?

1. 投稿内容が含まれるテーブルから`投稿内容`とユーザIDを取得するSQLを実行する。ここまでは同じで良い。
2. プログラム等でユーザIDの一覧を作る。 --> 今回の場合は[1, 2]
3. ユーザIDの一覧を渡してまとめてユーザ名の一覧を受け取る。

```sql
SELECT ユーザ名 FROM ユーザテーブル ユーザーテーブル.ユーザID IN (1, 2);
```

> INを使うと特定の列の値が指定されたリストのいずれかに一致するかをチェックできる。つまり，今回のケースだとユーザIDが1と2のユーザ名が取得できる。

## あとがき: そもそも一つのテーブルに全部入れてしまえば解決するのでは?
ここまで読んだ勘のいい読者はそもそもテーブルを一つにまとめてしまえばこんなこと考えなくていいし，SQLの実行も一回で住むのでは?と考えたかもしれない。

なぜ，このようなテーブル構造になるのかというと，SQLには正規化という概念があり，適切にテーブルを分割することでデータの冗長性を減らし，一貫性を保ちやすくなるのである。

近年だとNOSQL等が流行っており，これを使うとテーブルの構造等をきにしなくてもなんでもぶち込むことができる。
アジャイル開発の場合は一生懸命データベースの構成を考えてもそれがいらなくなる可能性も考慮してとりあえず，NOSQLを使えば楽で早いのかなと思うが，保守のことを考えると通常のSQL(RDS)も捨てたものでは無いと思う。
JWTを使用した認証フロー

## ユーザーのログイン

1. ユーザーはログインフォームにユーザー名とパスワードを入力します。
2. フロントエンドアプリケーションはこれらの認証情報をバックエンドサーバーに送信します。

## サーバーでの認証

1. バックエンドサーバーは、受け取ったユーザー名とパスワードを検証します。
2. 認証情報が正しい場合、サーバーはユーザーに対応するJWTを生成します。このJWTには、ユーザーIDやロール、トークンの有効期限などの情報が含まれます。

## JWTの発行

1. サーバーは生成したJWTをクライアントに返します。通常、これはHTTPレスポンスのボディに含まれます。

## クライアント側でのJWT保存

1. クライアントは、受け取ったJWTを保存します。一般的には、ブラウザのローカルストレージやセッションストレージに保存されますが、セキュリティを考慮してクッキーに保存することもあります。

## 認証されたリクエストの送信

1. クライアントは、保護されたリソースにアクセスする際に、保存されたJWTをHTTPヘッダーに含めてリクエストを送信します。このヘッダーは通常、以下のように設定されます：

```plaintext
Authorization: Bearer <JWT>
```

## サーバー側でのJWT検証

サーバーは受け取ったリクエストのJWTを検証します。具体的には、以下の手順を行います：

1. **トークンの構文解析**：
   - トークンをデコードし、ヘッダーとペイロードを抽出します。

2. **署名の検証**：
   - ヘッダーのアルゴリズムを使って、トークンの署名が正しいかを確認します。これにより、トークンが改ざんされていないことを確認します。

3. **トークンの有効期限の確認**：
   - ペイロードの`exp`クレームを確認し、トークンがまだ有効であることを確認します。

4. **その他のクレームの検証**：
   - 必要に応じて、その他のクレーム（例えば、ユーザーIDやロール）を検証します。

### リクエストの処理

- トークンが有効である場合、サーバーはリクエストを認証されたユーザーとして処理します。
- トークンが無効である場合、サーバーは適切なエラーレスポンス（例えば、401 Unauthorized）を返します。

## まとめ
この記事が、JWTを使用した認証フローの基本的な理解に役立てば幸いです。
JWT（JSON Web Token）の基礎

# JWT（JSON Web Token）の基礎

## 1. JWTとは？
JWT（JSON Web Token）は、ユーザー認証と情報交換のために広く使用されるコンパクトでURLセーフなトークン形式です。JWTはJSON形式のクレーム（情報）を含むトークンで、セキュリティを保ちながらデータの転送を簡単に行うことができます。

## 2. JWTの構造
JWTは3つの部分から構成されており、それぞれがドット（`.`）で区切られています。これらの部分は、以下の通りです。

1. ヘッダー（Header）
2. ペイロード（Payload）
3. 署名（Signature）

### 2.1 ヘッダー（Header）
ヘッダーには、トークンのタイプ（JWTであること）と使用する署名アルゴリズム（例えばHMAC SHA256またはRSA）を指定します。

```json
{
  "alg": "HS256",
  "typ": "JWT"
}
```

このヘッダーはBase64URLエンコードされ、トークンの最初の部分を構成します。

### 2.2 ペイロード（Payload）
ペイロードには、トークンのクレームが含まれています。クレームには、登録済みクレーム、公開クレーム、非公開クレームの3種類があります。

- 登録済みクレーム：トークンの有効期限（exp）、発行者（iss）、対象者（sub）などの標準的なクレーム。
- 公開クレーム：定義されたクレームで、共有が推奨されるもの。
- 非公開クレーム：定義したクレームで、アプリケーション固有のもの。

例：

```json
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
```

このペイロードもBase64URLエンコードされ、トークンの二番目の部分を構成します。

### 2.3 署名（Signature）
署名部分は、エンコードされたヘッダー、ペイロード、秘密鍵を使用して生成されます。これにより、トークンの改ざんが防止されます。

署名の作成例（HMAC SHA256を使用）：

```plaintext
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)
```

署名部分は、トークンの最後の部分を構成します。

## 3. JWTの使用例
### 3.1 認証
JWTは、認証の文脈で最も一般的に使用されます。ユーザーがログインすると、サーバーはJWTを生成し、クライアントに返します。クライアントは、このトークンを以降のリクエストのヘッダーに含めて送信します。

例：

```plaintext
Authorization: Bearer <token>
```

サーバーは、受け取ったトークンを検証し、リクエストを処理します。

### 3.2 情報交換
JWTは、安全に情報を交換する手段としても使用されます。トークンの内容は署名によって保護されているため、送信されたデータが改ざんされていないことを確認できます。

## 4. JWTの利点
- コンパクト：JWTはコンパクトなため、URLやHTTPヘッダーに容易に含めることができます。
- 自己完結型：JWTはクレーム情報を自分自身に含むため、データベースアクセスが不要になります。
- セキュリティ：適切な署名アルゴリズムと秘密鍵の管理により、安全な情報交換が可能です。

## 5. JWTのセキュリティ
JWTの使用においては、いくつかのセキュリティベストプラクティスを守る必要があります。

- 秘密鍵の保護：署名に使用する秘密鍵は、厳重に管理する必要があります。
- 短い有効期限：トークンの有効期限を短く設定し、定期的に更新することで、リスクを軽減します。
- HTTPSの使用：トークンを送受信する際には、常にHTTPSを使用して通信を暗号化します。



## JWTの構成部分を復元
JWTは3つの部分（ヘッダー、ペイロード、署名）から構成されており、それぞれの部分はBase64URLエンコードされています。以下はその各部分を復元した例です。

### ヘッダー（Header）
JWTの最初の部分で、トークンのタイプと署名アルゴリズムを示しています。

エンコードされたヘッダー部分：

```plaintext
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
```

デコードすると、以下のようなJSONになります：

```json
{
  "alg": "HS256",
  "typ": "JWT"
}
```

### ペイロード（Payload）
JWTの中央の部分で、ユーザーやトークンに関する情報（クレーム）が含まれています。

エンコードされたペイロード部分：

```plaintext
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGgRG9lIiwiaXNTb2NpYWwiOnRydWV9
```

デコードすると、以下のようなJSONになります：

```json
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
```

### 署名（Signature）
JWTの最後の部分で、トークンの整合性を検証するために使用されます。

エンコードされた署名部分：

```plaintext
4pcPyMD09olPSyXnrXCjTwXyr4BsezdI1AVTmud2fU4
```

署名は以下のように生成されます：

```plaintext
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)
```

### JWTの完全な例
画像のJWTをテキスト形式で表現すると：

```plaintext
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGgRG9lIiwiaXNTb2NpYWwiOnRydWV9.4pcPyMD09olPSyXnrXCjTwXyr4BsezdI1AVTmud2fU4
```

これは、次のように構成されています：

- ヘッダー：eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- ペイロード：eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGgRG9lIiwiaXNTb2NpYWwiOnRydWV9
- 署名：4pcPyMD09olPSyXnrXCjTwXyr4BsezdI1AVTmud2fU4

これらの3つの部分がドット（.）で区切られた形式がJWTです。Base64URLデコードを行うことで、各部分の内容を人が読める形に復元することができます。

## まとめ
JWT（JSON Web Token）は、認証と情報交換のための強力で柔軟なツールです。そのコンパクトな構造と自己完結型の特性により、様々なアプリケーションで広く利用されています。適切なセキュリティ対策を講じることで、安全かつ効果的にJWTを活用することができます。
JSONとオブジェクトの違い

### JSONとは？

JSON（JavaScript Object Notation）は、データを軽量かつ人間が読みやすい形式で表現するための標準的なフォーマットです。主にウェブアプリケーションでデータをやり取りする際に使用されます。JSONはテキスト形式で、構造化されたデータを簡単に記述できます。

### オブジェクトとは？

オブジェクトは、プログラミング言語（特にオブジェクト指向言語）におけるデータ構造の一つで、データとその操作をカプセル化したものです。オブジェクトはプロパティ（属性）とメソッド（操作）を持つことができ、プログラム内でデータとその処理を一体化して扱うことができます。

### JSONとオブジェクトの違い

#### 1. 表現形式

- **JSON**：文字列形式でデータを表現します。構文が厳密に定義されており、テキストデータとして保存や送信が可能です。

  例：
  ```json
  {
    "name": "John",
    "age": 30,
    "isStudent": false
  }
  ```

<br>

- **オブジェクト**：プログラミング言語内で使用されるデータ構造です。言語ごとにオブジェクトの表現や操作方法が異なります。

    例（JavaScriptのオブジェクト）：
    
    ```javascript
    let person = {
      name: "John",
      age: 30,
      isStudent: false
    };
    ```

### 2. 使用目的

- **JSON**：主にデータのシリアライズ（データ構造を文字列に変換すること）とデシリアライズ（文字列からデータ構造を復元すること）に使用されます。ウェブアプリケーションやAPI間でデータを交換する際に利用されます。

- **オブジェクト**：プログラム内でデータを操作するために使用されます。オブジェクト指向プログラミングの基礎的な概念であり、データとその操作をカプセル化します。

### 3. データの操作

- **JSON**：純粋なデータ形式であり、操作するためにはパース（解析）してオブジェクトに変換する必要があります。パース後は、言語の標準的な方法で操作できます。

  例（JavaScriptでのパース）：

  ```javascript
  let jsonString = '{"name": "John", "age": 30, "isStudent": false}';
  let jsonObject = JSON.parse(jsonString);
  console.log(jsonObject.name); // John
  ```

<br>

-  **オブジェクト**：プログラム内で直接操作できます。メソッドを定義してオブジェクトの操作を容易にすることができます。

    例（JavaScriptのオブジェクト操作）：
    
    ```javascript
    let person = {
      name: "John",
      age: 30,
      isStudent: false,
      greet: function() {
        console.log("Hello, my name is " + this.name);
      }
    };
    person.greet(); // Hello, my name is John
    ```

## まとめ
JSONとオブジェクトは、それぞれ異なる目的と使用方法を持つデータ構造です。JSONはデータの交換や保存に適しており、テキスト形式で記述されます。一方、オブジェクトはプログラミング言語内でのデータ操作に適しており、データとその操作を一体化して扱います。これらの違いを理解し、適切に使い分けることで、効率的なデータ処理が可能になります。

この記事が、JSONとオブジェクトの違いについての理解に役立てば幸いです。
JSONとは？

## 1. JSONとは？

JSON（JavaScript Object Notation）は、データを軽量かつ人間が読みやすい形式で表現するための標準的なフォーマットです。主にウェブアプリケーションでデータをやり取りする際に使用されます。JSONはテキスト形式で、構造化されたデータを簡単に記述できます。

## 2. JSONの構文

JSONの構文は、以下のようにシンプルで直感的です。主にオブジェクトと配列の2つのデータ構造を使用します。

### 2.1 オブジェクト

オブジェクトは、キーと値のペアの集合です。キーは文字列で、値は文字列、数値、オブジェクト、配列、true、false、nullのいずれかです。

例：

```json
{
  "name": "John",
  "age": 30,
  "isStudent": false
}
```

### 2.2 配列

配列は、値の順序付けられたリストです。値はオブジェクト、配列、文字列、数値、true、false、nullのいずれかです。

例：

```json
[
  "Apple",
  "Banana",
  "Cherry"
]
```

## 3. JSONの利用例
JSONは、さまざまな用途で利用されます。以下に代表的な利用例を示します。

### 3.1 データ交換
JSONは、ウェブアプリケーションとサーバー間でデータを交換するための主要な形式の一つです。例えば、APIレスポンスとしてJSONを使用することで、クライアント側のJavaScriptがデータを簡単に解析できます。


例：

```json
{
  "userId": 1,
  "id": 101,
  "title": "Introduction to JSON",
  "completed": false
}
```

### 3.2 設定ファイル
JSONは、設定ファイルとしても広く利用されています。構造化されたデータを簡単に記述できるため、アプリケーションの設定情報をJSON形式で保存することが多いです。

例：

```json
{
  "server": "localhost",
  "port": 8080,
  "useSSL": true
}
```

## 4. JSONのメリット

JSONには、以下のような多くのメリットがあります。

- **軽量**：シンプルなテキスト形式であるため、データの転送量が少なくなります。
- **可読性**：人間が読みやすい形式であるため、デバッグや開発が容易です。
- **相互運用性**：さまざまなプログラミング言語でサポートされており、異なるシステム間でのデータ交換が容易です。
- **パーサーの存在**：多くの言語でJSONを扱うためのパーサーが標準で提供されています。

## 5. JSONのデメリット

JSONにはいくつかの制限やデメリットもあります。

- **データ型の制限**：JSONでは、日付やバイナリデータなどの特殊なデータ型を直接サポートしていません。これらを扱うには、文字列としてエンコードする必要があります。
- **スキーマの欠如**：JSONには、XMLのようなスキーマ定義がありません。そのため、データの構造や型を厳密に定義する必要がある場合には不便です。

## まとめ

JSONは、データをシンプルかつ効率的に表現するための強力なツールです。その可読性と軽量性から、ウェブ開発やデータ交換に広く利用されています。基本的な構文を理解し、適切に活用することで、JSONを使った効果的なデータ処理が可能になります。
Bowring for short lines（精度良好な地理的距離の短距離近似法）

こんにちは。
精度良好な地理的距離の短距離近似法として、[Bowring's method for short lines](https://en.wikipedia.org/wiki/Geographical_distance#Bowring's_method_for_short_lines) (Wikipedia)[^1] を見つけました。

[^1]: [Bowring, B. R., "The direct and inverse problems for short geodesic lines on the ellipsoid". Surveying and Mapping](https://books.google.co.jp/books?id=eEI4AAAAIAAJ&pg=PA36&lpg=PA36&dq=Bowring+Surveying+and+Mapping+1981+degrees+radians&source=bl&ots=g_-TH3_hvQ&sig=ACfU3U01xtWe6_63kQoU_j2PKetjNk180Q&hl=ja&sa=X&ved=2ahUKEwjissjb9auHAxVoaPUHHfGoApwQ6AF6BAgVEAM#v=snippet&q=Bowring%20short%20geodesic%20ellipsoid&f=false) (1981), p.135.

精度評価[^2]を行うと、[Gauss_mid_latitude](https://en.wikipedia.org/wiki/Geographical_distance#Gauss_mid-latitude_method_for_short_lines)（同じく短距離近似）よりも誤差は表半球内では小さいです（下記のプロット内の```bowring_short```）。

* ただし、裏半球では誤差の増大が顕著です。
* 改善した続編は、「[Bowring for short lines（精度良好な地理的距離の短距離近似法）をさらに精度改善（中間緯度を利用）](https://qiita.com/kkdd/items/f4ca002cc66637453f38)」です。
[^2]: 参考： [二点間測地線距離（地球上）：各計算方法の誤差評価](https://qiita.com/kkdd/items/987e79d1bbf38fd84e71)

### ソース
```bowring_short.js
// Bowring, B. R. (1981). "The direct and inverse problems for short geodesic lines on the ellipsoid". Surveying and Mapping. 41 (2): 135–141.
function bowring_short(lat1, lon1, lat2, lon2){  // in degrees
  "use strict";
  const a = 6378137.0;  // GRS80
  const f = 1 / 298.257223563;  // WGS84
  const e2 = f * (2 - f);  // first eccentricity squared
  const ep2 = e2 / (1 - f) ** 2;  // second eccentricity squared; epsilon

  const degree = Math.PI / 180.0;
  const sin = Math.sin;
  const cos = Math.cos;
  const sqrt = Math.sqrt;
  const hypot = Math.hypot;
  const asin2 = x => x < 1 ? 2 * Math.asin(x) : Math.PI;

  const londiffhalf = (lon2 - lon1) / 2 * degree;
  lat1 = lat1 * degree;
  lat2 = lat2 * degree;
  const latdiffhalf = (lat2 - lat1) / 2;
  
  const lat0 = lat1;  // Bowring
  const cos_lat0 = cos(lat0);
  const cos_lat0_squared = cos_lat0 ** 2;

  const C = sqrt(1 + ep2);
  const B2 = 1 + ep2 * cos_lat0_squared;
  const B = sqrt(B2);
  const A = sqrt(1 + ep2 * cos_lat0_squared ** 2);

// radius, longitude, and latitude on the conformal sphere
  const Rp = C / B2;
  const lonpdiffhalf = A * londiffhalf;
  const latpdiffhalf = latdiffhalf / B * (1 + (3 / 2 * ep2 / B2) * latdiffhalf * sin(2 * lat0 + 4 / 3 * latdiffhalf));  // D
  const cos_latp0 = (B * cos_lat0 * cos(latpdiffhalf) - sin(lat0) * sin(latpdiffhalf)) / A;

// great circle formula
  const E = cos(lonpdiffhalf) * sin(latpdiffhalf);
  const F = sin(lonpdiffhalf) * cos_latp0;
  return a * Rp * asin2(hypot(E, F));  // geodesic distance
}
```

### 精度評価
![bowring_short.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/af334318-c418-ec47-94d3-42015de80b61.jpeg)
【Go言語】パニック

# はじめに

Goにはtry/catchがないが、panicやrecoverをむやみにつかってはいけない。一般的には、error型で返すのが好ましい。

# panicとは

[Go Playground](https://go.dev/play/p/AQKptHYU6SO)

```go
func main() {
	fmt.Println("a")
	panic("foo")
	fmt.Println("b")
}
```

パニックが発生すると、現在の goroutine がリターンするか、recover でパニックが捕捉されるまで、パニックはコールスタックをさかのぼる。

以下はrecoverで捕捉する例である。

```go
func main() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("recover", r)
		}
	}()

	f() // パニックが発生するfをコールする
}

func f() {
	fmt.Println("a")
	panic("foo")
	fmt.Println("b")
}
```

`recover`で捕捉されると、goroutineは終了しない。
`recover`を呼び出すのは、deferに与えられた関数内だけで有効。recover関数はnilを返し、何も効果はない

# パニックを発生させるべきとき

* 純粋なプログラマーエラー
* アプリケーションが必須依存関係を必要とするにも関わらず、初期化に失敗するとき

## 純粋なプログラマーエラー

net/httpパッケージのWriteHeaderでは、ステータスコードが有効化どうかを検査するために`checkWriteHeaderCode()`が呼ばれる。

```go
func checkWriteHeaderCode(code int) {
	if code < 100 || code > 999 {
		panic(fmt.Sprintf("invalid WriteHeader code %v", code))
	}
}
```

ステータスコードが不正な値をとるとパニックを起こす。

その他にも`database/sql`パッケージのRegister()が０位に挙げられる。

## アプリケーションが必須の依存関係の作成に失敗するとき

新たな顧客アカウントを作成するためのサービスを公開するとき、提供された電子メールアドレスの検証を正規表現を用いて行う。

regexpパッケージには、文字列から正規表現を作成する関数として、以下の２つがある。

* Compile : *regexp.Regexpとエラーを返す
* MustCompile : エラーが発生したらパニックを発生させる

# まとめ

ほとんどの場合は、最後の戻り値として、error型を返すべきである。

# 参考文献

1. [100 Go Mistakes and How to Avoid Them](https://100go.co/ja/)
【2024マラソン34】雑談時間に話す内容を吟味すると仕事が進めやすくなった

# 何の記事？
qiita企画にのって、自分のチーム内でのコミュニケーションについて書いてみることにしました。

# 雑談を「あらゆる会話をしていい時間」として使う
仕事の切れ目ができると、唐突に挟まれる雑談の時間。
もちろん、休憩時間に雑談が始まることもありますが、「そういえば」というふとしたきっかけで始まる時もあります。
そういった話を聞く姿勢ができているタイミングで、話す内容を吟味して報告できると、仕事が進みやすくなったなぁと感じたので、どういったことを話しているかを書いていこうと思います。

# 10時のコーヒーブレイクで進捗を話す
- 厄介な電話を多く引いた後輩に「今日は大変な電話が多いね」と話をする
- 割り込み作業が多く発生したとき「今日はここまで終わらせたいがここまでしか進んでいないむという進捗を共有する
- 順調にスタートを切れているときには「今日終わらせたいことの何%まで終わっているか」を話す
10:00〜10:30位を目安に、コーヒーを入れて少し休憩を挟んでいます。
その時に、なんとなく朝イチで、どんなことができたか、ここまでの進捗をふわっと共有しておくと、助けあえる感じになっています。


# お昼時間に家の話をする
仕事の話も良いのですが、家庭での話もよく雑談にあがります。
特に私のチームは全員子供がいて、その子供の年齢も様々です。
なので、子育ての相談から、家庭での自分の状況、それに伴う今の自分のコンディションなどをこの雑談の時間に共有しています。

お昼ご飯を食べた後の時間と言うのは、誰に話しかけてもリラックスしているので
協力して欲しいことや進捗が良くない作業の共有などをこのタイミングで行うようにしています。
ちょうど1日の折り返し地点と言うところもあるので、そこからそこで状況を共有することで、午後もまたもうひと頑張りしようと仕事に集中できたりもします。

# 15時の休憩で進捗を再共有
仕事が詰まっていると、3時の休憩を忘れてしまいがちと言う時もありましたが、結局のところ、休憩をしっかり挟んだ方がコンディションも高く保てるので、みんな休むようになってきました。
休憩時間自体は、スマートフォンをいじったり、読書に勤しんだりとここで過ごすことが多いですが、この休憩が終わったタイミングで、また少し雑談を挟むことも多いです。
休憩時間で雑談をしようと言うよりは、休憩が終わって仕事に取り掛かるまでの空白の時間には話を聞いてもらえるタイミングをとりやすいので、そこで進捗を共有するようにしています。

# 結果
雑談という、何を話しても聞いてもらえる時間をうまく使って進捗を共有するようになったおかげで以前よりも仕事をしやすくなったなと感じています。
具体的には、作業がここまで進んでいること以外にも、その状況に対して自分のコンディションが今どの程度なのかというのを話しやすくなり、また周りの状況も聞きやすくなったので、チームで仕事を進めやすくなりました。

1on1やミーティングなどで情報や進捗を共有するのも悪くはありませんが、情報共有や進捗の報告などを、特に気取らず小出しでやっていくことで、チームでのコミニケーションが取りやすくなるので、業務時間中の雑談時間は有効に使えると良いかと思います。
【2024マラソン33】こんなデジタルとアナログを繋ぐ技術が欲しい

# 何の記事？
Qiitaマラソンの企画、ユーザ──お客様とのコミュニケーション手段について、こんなことができたらいいのに！……を考えてみることにしました。

# 実現できたらいいなという案
## 郵便　開封率UP+好感度UP
### 季節がわりの封筒デザイン
Qiitaのアドベントカレンダーの時期はクリスマスの模様替えがwebサイトで起こります。
そこで、日本ならではかもしれませんが、季節変わりの封筒デザインと言うのは意外とお客さんに興味を持ってもらうきっかけになるのかなと感じました。

具体的には、宛先以外に窓が余分に空いている封筒にし、中の用紙デザインを季節感のあるものに変えることで、季節のデザインなどが入れられる封筒が増えるといいのかなと思いました。


## FAXの送信忘れリマインド
メールや郵送のように堅苦しい挨拶をせず、用件だけをダイレクトに送れるというのがFAXの強みです。
ただし、送ったか送っていないかというものが双方に記録として残らないので、送ったつもりが届いていないということが起こりやすいのもこのFAXかと思います。

そこで定期的にFAX送信がある先に、FAXを送っていなければ、送っていませんよと自動で通知する仕組みがあると良いのではないかと思いました。


## 電話のフェーズ確認機能
お客様に連絡をした場合、会社であればどんな電話番号でも概ね出てくれるのですが、個人のお客様の場合は営業の携帯電話からかけるととっていただけないと言うことがやはりあります。
また、お客様から連絡がないんだけれど……という連絡が来て、担当に確認をすると、かけてるんだけれどもつながらない……と言うこともあります。

そこで、営業がいつお客様にかけたかどうかが自動でシステム上に記録され、今連絡をとっている最中……ということが他の人にも伝わる仕組みがあると良いのではないかと思いました。
これがわかることで、連絡を取っているけどつながらないのか、連絡がついてお話ができたらしい……ということも記録からわかると、一次対応をしたスタッフも安心して他の業務を続けることができるかと思います。

# 感想
基本的にはデジタル機器などに慣れなくても、手軽に連絡が取れると言うのがアナログの強みなので、なかなかゼロにはなっていかないように思います。
みんながデジタル機器に慣れて、デジタルツールで情報をやり取りできれば、それに越した事は無いのですが、なかなかそうは行きません。

そこで、アナログのコミュニケーションの形を変えずに、いかにデジタルにデータを載せて活用するかというのがこれからは重要になってくるのかなと思いました。
これからも「ここがこうなったらいいのに」と言う考えを持ち続けて、情報収集や業務の改善に活かしていきたいです。
バイアスなしの範囲内整数乱数

# はじめに
[[0,1)の浮動小数点数乱数](https://qiita.com/taqu/items/3c14626de091c75b623a)については以前にコードを書きました.
`[0,N)`の範囲の整数乱数を生成する方法について書きます. 非常に詳しい説明と実装が[[1]](#ref1)にあります.

# バイアスありの方法
次のように余りを計算する方法では偏ることは有名ですね. 2^32個の数字をrange個にマッピング仕直す計算なので, `2^32/range`が割り切れない場合小さな数字から多くマッピングされます.
```cpp
uint32_t bounded_rand(rng_t& rng, uint32_t range)
{
    return rng() % range;
}
```

次のように, [0 1)の浮動小数点数を介する方法も偏りますね. 上の方法と違い偏りの出方が異なります.
```cpp
uint32_t bounded_rand(rng_t& rng, uint32_t range)
{
    double zeroone = 0x1.0p-32 * rng();
    return range * zeroone;
}
```

次のものは, `32:32`の固定小数点数で上の方法と同じことをしています. 偏りはありますが多くのシステムで最速になります. GPGPUで偏りが許容できるなら, これでもありかもしれません.
高速に計算しようとすると, 結果のビット数の倍精度を計算する命令が必要なので, システム依存になってしまいます.

```cpp
uint32_t bounded_rand(rng_t& rng, uint32_t range)
{
    uint32_t x = rng();
    uint64_t m = uint64_t(x) * uint64_t(range);
    return m >> 32;
}
```

# バイアスなしの方法
私は[[1]](#ref1)にある実装の中から, ポータビリティとパフォーマンスのバランスがよさそうなもの使っています.
次は, Lemire's Method[[2]](#ref2)の32bit版になります.

```cpp
uint32_t bounded_rand(rng_t& rng, uint32_t range)
{
    uint32_t t = (-range) % range;
    uint64_t m;
    uint32_t l;
    do {
        uint32_t x = rng();
        m = uint64_t(x) * uint64_t(range);
        l = uint32_t(m);
    } while (l < t);
    return m >> 32;
}
```

# まとめ
乱数関係の偏りについては, 大体計算式が間違っていることが多いように思います. スマートフォンゲームのガチャなど, エンジニアの技術力不足で偏っていることなどよくありますね.

# 参照
- <a id="ref1"/>[1] [Efficiently Generating a Number in a Range](https://www.pcg-random.org/posts/bounded-rands.html)
- <a id="ref2"/>[2] [Nearly Divisionless Random Integer Generation On Various Systems](https://lemire.me/blog/2019/06/06/nearly-divisionless-random-integer-generation-on-various-systems/)
最高のUIとは、持論を紹介

## 最高のUIとは
最高のUIを考える前に**最低なUI**を考えてみる。
それは、**ストレスの溜まるUI**だと私は考えます。

**最高のUI**とは、ストレスの溜まる逆つまり、**楽しいUI**だと私は考えました。
<br?>
## 楽しいUI の例
下のUIをホバーしてみてください。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ZEdbVzP" data-pen-title="Untitled" data-user="kosupe" 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/kosupe/pen/ZEdbVzP">
  Untitled</a> by TAKAT (<a href="https://codepen.io/kosupe">@kosupe</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

クルクル回るだけですが、無意味に何回もホバーしませんでしたか？
実装自体は、360度回すだけのシンプルなものです。
それでも、「ホバーした」という情報に加えて、「少しの楽しさ」をユーザーに伝えることができます。

<br?>
## まとめ
最高のUI = 分かりやすさ + 楽しさ(ノンストレス)
という持論と簡単な例を紹介しました。

最高のUIとは、UIに最低限必要な「わかりやすさ」だけでなく、そこに「楽しさ」などの**付加価値**をつけることで生まれる。これは間違いないでしょう。

参考になれば幸いです。
下手な変数名をつけるくらいなら大人しくcodicを使おう

# はじめに
コードを書いていくなかで変数名を考える時間、割と長くないですか？
私は、英語があまり得意ではないこともあり、変数名を考えるのにかなりの時間を要しており、コーディングをする時間の大半を占めているまであります。

どういった機能を持ち、どういった処理を行うのかを分かりやすくしようと時間をかけて考えた変数名がいい感じであればまだ救われるのですが、伝わるかどうか微妙な下手な変数名を付けてしまうことも多々あります。

そんな悩める私が教えてもらったのが[Codic](https://codic.jp)というサービスです。

https://codic.jp

# Codicって何よ
Codicは日本語でテキストを入力するとそれっぽい良い感じの変数名を生成してくれるツールです。
変数名は、単語単位で表現(？)を調整することもできて、柔軟性の高い生成ができるため、作業効率が爆増します。しあわせです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/4c2545bf-6258-3a80-5205-bca52a81ebe4.png)

ちなみに、連結方法は6つ用意されており、仕様に沿った命名を行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/bb130a47-3ad6-fccf-71b2-679cb84c345b.png)



# 拡張機能、あるよ。
Codicはブラウザ上だけではなく、いくつかのIDE上で動作する拡張機能が存在するようです。
Visual Studio, Eclipse, Excel VBAなどをはじめとしたメジャーどころは概ねありそうな感じです。

Codicの拡張機能をショートカットとして登録しておくと、簡単に呼び出せて使えるので開発が大きく捗るかと思います。



# さいごに
私は英語が非常に苦手なので、weblioを漁りながら命名する作業から開放されてとても楽になりました。
変数名や関数名の命名に悩むことがあれあ、是非Codicを使ってみてください。

それでは。