OmniAICreator/Qiita-1.07M huggingface dataset:
二脚ロボット制作記録

※これはCAMPHOR- Advent Calendar 2023の3日目の記事です
CAMPHOR- Advent Calendar 2023についてはこちら：https://advent.camph.net

# 記事の内容
[鴨川ハッカソン](https://camphor.connpass.com/event/299236 "鴨川ハッカソン")で制作した二脚ロボットの設計やその動かし方について書いています．

# 環境・システム
- Windows 11
- VSCode 1.84.2
- CubeMX 6.9.2
- PlatformIO IDE v3.3.1
- STM32F446RE
- サーボモータ8つ（FT5330M×2，FT1117M×4，FS90MG×2）
- 3Dプリンタ Ender3 V2

# ロボットの概観
何はともあれ，まずはロボット本体を示しましょう．
![biped_robot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628897/b0fc7892-9f6b-3900-df28-b87ad65ae696.jpeg)

配線丸出しやないかいとか，脚が左右非対称やろがいとかいろいろと突っ込みどころはありますが，ハッカソンの中であわてて作ったので妥協点満載です．それでも期限内にちゃんと動くものができたという点に価値があると思います．

# ロボットの筐体
ロボットの筐体については，自宅の3Dプリンタで印刷したものを使っています．パーツについてはノギスでの採寸等をした後に3DCADで1から設計しています．
部品を印刷するときのポイントとして，単純な板パーツだと少し強度が心もとないので，板の面がジグザグするようにしています．これは，「かける工房」さんのこちらの動画を参考にさせていただきました．

https://www.youtube.com/watch?v=9fZAUu9o-XE



# ロボットの動作
ロボットの動作を設計するにあたり，VSCodeとCubeMXで構成した環境でコーディングしました．CubeMXでSTM32F446RE用のプロジェクトファイルを生成し，生成されたファイルのmain.cを編集するという形で開発をしていました．STM32用の開発環境としてSTM32CubeIDEというものがありますが，こちらは予測変換が出てきません．VSCodeでは予測変換が出てくるので，そういう意味でVSCodeに一日の長があります．プロジェクトの生成に関してはすでにわかりやすい記事がありますのでそちらをご参照ください．

https://qiita.com/yosihisa/items/8830adf65022d21465c4

さて，今回は屈伸動作とお辞儀をやらせてみました．とはいっても，今回は逆運動学を使うわけではなくPWMの指令値を通じて関節の角度を転倒しないように設定するだけのことですから，コード自体は複雑ではありません．PWMの指令値を決めるためには以下のようなコマンドを使えます．
```C
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 75)
```
（参考：[HALコマンドリファレンス](https://www.stmcu.jp/design/document/users_manual/53059/)）
ここで出てくるHALというのは，ハードウェア抽象化を意味します．すなわち，具体的に扱っているマイコンの種類を考慮することなくコマンドを書くことができます．
アドレス演算子`&`が付いている`&htim3`というのは，STM32のタイマー3を利用しているという意味になります．`TIM_CHANNEL_1`は，PWM信号をチャンネル1から出力するということです．
タイマーとチャンネルの関係は，[mbedのリファレンス](https://os.mbed.com/platforms/ST-Nucleo-F446RE/)から確認します．このリファレンスの紫色のところに，「PWMx/y」と書いてあれば，そのピンはタイマーxのチャンネルyによる出力先だということになるわけです．そこと繋がっているPB_xやPA_yといったピンが，CubeMXで表示されるピンの名前になります．

![スクリーンショット 2023-12-02 231311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628897/021c0938-e9c0-db18-f232-bdaf1861f25d.png)
![スクリーンショット 2023-12-02 234018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628897/89247a01-b171-59da-8ffc-0694b76a024a.png)

さて，サーボとSTM32を直付けしているので，ピンアサインさえ間違えなければ`__HAL_TIM_SET_COMPARE`でサーボを動かすことができます．サーボのデータシートを読めばPWMの周期やパルス幅の範囲を知ることができますので，それをもとにCubeMX上からPWMの設定をしていきます．
Prescalerは分周器のことで，この値を$P$としたとき周波数が$1/P$倍されます．そして，Counter Periodは文字通り1カウントがどのくらいの周期かということです．
本来なら，割り込み周期（何秒に1回，原稿のタスクとは別タスクをやらせるか）をちゃんと考えるべきです．ただ，今回は丁寧に制御するわけでもなく，また時間の都合もあって前に使っていた設定（Prescaler=840，Counter Period=999）をそのまま読み込みました．

組付け時の微妙なずれを修正しつつ，実際に屈伸とお辞儀をしている様子がこちらです．

![無題の動画 ‐ Clipchampで作成 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628897/4cff56f5-63ae-144c-0d6c-ea80ff6b1dea.gif)


本当は鴨川沿いで撮った動画もあるのですが，思いっきり他の参加者さんの顔が映っているので室内で取り直したものを使っています．

# 反省点
ハッカソンで取り急ぎ作ったとはいえ，改善すべき点や反省点は多くあります．
- 配線がむき出しであり何かに引っ掛けてピンが抜けうる
- バッテリをロボット本体に乗せられない
- PCA9685のような多数のサーボを制御する基盤を使用していないため配線が煩雑である
- 本来使用予定だったサーボの故障により，トルクの不足しているサーボがある（SG90MD）
- 手前の6軸センサを使えていない
【Ruby on Rails】dependabotを設定しよう

# まえがき

本記事は、**[DMM WEBCAMP Advent Calendar 2023](https://qiita.com/advent-calendar/2023/infratop)** 3日目記事です。

Ruby on Railsを中心に、DWCメンター・卒業生が記事を投稿しておりますので、是非他の記事もご確認ください！

# はじめに

こんにちは、DMM WEBCAMP メンターの @ukwhatn です。

昨日に引き続いての担当となりますが、今日はRuby on Railsにおけるdependabotの使い方について説明していきます。

# Depandabotとは？

Depandabotとは、GitHubが提供しているボットツールで、プロジェクトが依存しているパッケージ(Gemなど)の脆弱性やバージョンアップを自動で検知し、アップデートのためのPull Requestを自動作成してくれるものです。


また、非常に多くの言語やパッケージ管理システムに対応しており、Gemfileやpackage.jsonなどを読んで依存パッケージを解析してくれます。

使い方もシンプルで、`.github/depandabot.yml`に構成設定を記載し、リポジトリの`Settings`から`Dependabot`を有効化することでセットアップできます。

# RailsにおけるDependabotの構成設定

私がよく使う`.github/depandabot.yml`の内容を示します。

```yml
version: 2
updates:
  - package-ecosystem: "bundler"
    directory: "/"
    schedule:
      interval: "daily"
    ignore:
      - dependency-name: "rails"
        update-types: ["version-update:semver-major"]
```

おそらく読めばわかるのではないかと思いますが、

> - `package-ecosystem: "bundler"`
>    - bundler(Gemfile)によってバージョン管理されたプロジェクトであることを示す
>        - これにより、Gemfileを勝手に読みに行くようになります
> - `directory: "/"`
>    - Gemfileが置いてあるディレクトリを指定
> - `schedule:`
>    - Dependabotの起動タイミングを指定
>        - 今回は1日1回にしています
> - `ignore:`
>    - `dependency-name: "rails"`
>        - `update-types: ["version-update:semver-major", "version-update:semver-minor"]`
>            - ここでは、Gem"rails"のmajor-update(5.x→6.xなど)/minor-update(6.0から6.1など)の両方をignoreしています
>                - この場合、`6.0.1`→`6.0.2`などのアップデートは検出されます
>                - 必要であればminorだけignoreから外すなど、適宜変更してください

.... までの設定をこの数行で行っています。

更にカスタマイズしたい場合は、 [公式docs](https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file)を確認してください。


# 導入手順

ここからは、具体的な導入手順について説明します。

まず、導入したいリポジトリの`Settings`から`Code security and analysis`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428968/94988c23-fea2-2f71-9693-cd4c2f775691.png)

`Dependabot version updates`を`Enable`にするとエディタが開きますので、上記の構成設定を投入し、commitします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428968/2cf91c02-4da8-838d-5cb3-78d508356587.png)

これだけで`Dependabot version updates`の導入は完了です。

脆弱性の検出まで行いたい場合は、先程のページから`Dependabot security updates`を有効化しましょう。
`security updates`は`Dependency graph`および`Dependabot alerts`に依存しているので、勝手に全部`Enable`になります。

このような状態になったら全て完了となります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428968/be0c7a53-a490-3885-b25b-295ae906dc8f.png)

あとは、Dependabotが定期的にバージョンアップの検出を行い、PRを作ってくれるのを待つだけです。
ほっとくと一瞬で貯まるので、定期的に確認しましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428968/97e210b5-5dbb-7a54-4e5a-a7a5b8104bb6.png)

----

以上、ハンズオン的な紹介となりましたので、詳しく知りたい方は以下の公式ドキュメントを確認してみてください！

- [Dependabotアラートについて](https://docs.github.com/ja/code-security/dependabot/dependabot-alerts/about-dependabot-alerts)
- [Dependabotのセキュリティ アップデート](https://docs.github.com/ja/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates)
- [GitHub Dependabotのバージョンアップデートについて](https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates)
【新人向け】 .txtより.md (markdown) でメモを書こう：書き方編

## 背景

学生のころmarkdownを毛嫌いしていた．そんな学生だった自分にこの記事を読んで欲しいと思う．
gitに公開されているREADME.mdはすべてマークダウンで記載されているが，
「怖くない？図があったり，色々きれいに表示されているあれ．上級すぎる..」というのが学生の自分の感想だった．
実際のところそこまで難しくない．所詮テキストベースのドキュメントだからだ．
6個の機能・書き方さえ押さえていれば何も怖くない．
テキスト平文で書くよりもはるかに見やすいと思う．


## 使い分けについて

メモに関して，他のツールもあるので，用途別で使い分けるようにしている．
議事録などツール指定がなければ．markdown，PowerPoint，OneNoteのどれかにしている．

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/03ca9a5b-a80e-ebf9-d8cf-fd411f527d0e.png)

Onenoteは，自分用のメモで外部に公開しない用．
PowerPointは，図解の必要があり，外部に公開する用．
Markdownは，図解の必要が無く，外部に公開する用．


## 環境準備について

Markdownは，VSCodeで作成するのが一番楽だと思う．
自分は以下の拡張機能を使っている．
1. Markown All in One
![スクリーンショット 2023-12-02 233220.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/62ee63d5-5895-1412-11ec-267cf49a87d2.jpeg)

リスト(箇条書き)の自動補完機能や，キーボードのショートカットに関する拡張機能をメインに利用．
キーボードのショートカットで太字にできるので，OneNoteを使い慣れていたらめっちゃ楽．

2. Markdown Preview Enhanced
![enhanced.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/7244ded5-6e18-dd53-a791-d45d236b4bb3.jpeg)
 
プレビューの表示・ファイルに関する拡張機能をメインに利用．
markdownに慣れてない人だった場合，「情報整理したものを提出して」と言われた際に
拡張機能で画像に変換してから提出したりする．

## マークダウンでよく使う要素

マークダウンで使うものなんて，基本6つくらいだと思っている．

### 見出し
```
# ファイルタイトル
## 大章
### 節
#### 項
```
`#`と半角スペースで，見出し部分を作る．
#1個に，ファイルタイトルを入力する理由は，
vsでファイルとして保存する際一番上の行がファイル名になるためである．
自分の怠惰が良く出ている．
`#`が多くなるほど，字が小さくなると思っていい．

### 太字
```
**大事な部分**
```
アスタリスク2つセットで囲む．
議論の結論や疑問点などを太字で囲んでおくことで後で質問に行けるようにしておく．

### 箇条書き
```
- 項目1
    - 項目1-1
- 項目2
```
ハイフンで箇条書きを表す
手前にtab改行を入れると，レベルを下げることができる．
情報を一覧として羅列する際に利用する．

### チェックボックス
```
- [x] タスク完了
- [ ] タスク未完了
```
ハイフンとブラケット(四角いかっこ)で箇条書きを作る．
ブラケット無いにx(エックス)を入力するとチェックが付けられる．
拡張機能を入れておくと，プレビュー画面のチェックボックスをクリックして編集できたりする．
残っている宿題項目の整理などで利用したりする．

### リンク
```
[ここを押すとリンク](http://URL)
```
ブラケットに表示テキスト，かっこ内にURLを入れることでリンクを貼ることができる．
会議の録画URLや，話題に上がった情報が載ったサイトのURLをこの形式でメモしておくことで，
後で参照しやすくなる．

### 画像
```
![代替テキスト](画像URLかファイルの相対パス)
```
サイトのリンクを貼る書式の前に`!`(エクスクラメーション)を付けると，画像をそのまま貼ることができる．
拡張機能の入ったVSCodeだと，画像をコピーして任意行に張り付けると，この書式で貼り付けされて，
mdファイルと同じフォルダに画像が保存されるようになる．
【VSCode】.envファイルに記述した環境変数を補完する方法

拡張機能をインストールすることで`.env`などに記載した環境変数が補完されるようになります。

https://marketplace.visualstudio.com/items?itemName=dotenv.dotenv-vscode

インストールのみで設定は不要です。

インストールすると以下のように環境変数の値が非表示になります。
表示・非表示を切り替えるにはエディタ左上の`Toggle auto-cloaking`をクリックします。

![toggle_itemcq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e4c87d3c-eb4f-8725-382f-07cb2c1af534.gif)

 また、以下のように補完候補が表示されるようになります。
 変数の値も表示されます。

 ![autocomplete_snic6t.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f66f804b-4a25-c5c5-5960-f714267e33a2.gif)

 記述した環境変数にホバーすると値が表示されるようになります。

![secret-peeking_byzwex.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/51858f80-94f2-31d7-2ab7-a0a339857166.gif)
宮廷プロファイラの紹介

# 宮廷プロファイラの紹介

## リポジトリ

<https://gitlab.com/RenonT1805/kyuuteiprofiler>

devcontainerを用意しているので、

1. VSCodeで「コンテナーでフォルダを開く」
2. .env.templateの中身を変更して.envにリネーム
3. ```go run cmd/main/main.go```

で動きます。
DiscordBotなので、
<https://discord.com/developers/applications>
で、TOKENを発行する必要があります。
権限はCommandとAdministratorを渡しておけば大丈夫です。

## 概要

ISUCON用に作成したpprofのプロファイル結果をS3にアップロードするDiscordBotです。
ISUCON当初はプロファイルの画像をDiscord上にあげていましたが、
将来的にもっと詳細なプロファイルを取得したいのと、Webページでいろいろ見れるようにしたいのでS3にアップする方針にしました。

(イメージは以下のサイト。ISUCON12,13優勝チームが作ったもの)
<https://pprotein.isucon13.to-hutohu.com/#/group/2023-11-25_08-07-43.526172/index/>

## 使い方

宮廷プロファイラには以下の機能があります。準に説明していきます。

- チャンネルの登録機能 (register)
- チャンネルの設定機能 (hots,https)
- 各種プロファイル機能 (profile, heap, threadcreate, goroutine, block, mutex, trace)

### registerコマンド

チャンネルを宮廷プロファイラーに登録します。
以降、登録したチャンネルでのみ宮廷プロファイラは有効になります。
(複数のチャンネルを登録することもできます。)

``` bash
/register
```

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213727/fb26b4c6-af5c-50b5-aa4e-117fd7a63cc8.png)

### hostコマンド

プロファイルを取得する対象のホストを指定します。
パラメータを指定して実行すると、Hostを登録し、
![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213727/f97dd7b1-1788-5591-171e-9aeceb158d2d.png)


パラメータを指定せずに実行すると現在登録されているHostを返します
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213727/24b07800-2628-261f-a05f-70702e16a0db.png)


### httpsコマンド

プロファイルを取得する際、httpsを使用するかどうかをTrue/Falseで設定します。
Falseならhttpが使用されます。
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213727/4ce8e728-1f2d-8a0c-c2ab-31ca24babc57.png)


### 各種プロファイルコマンド (profile, heap, threadcreate, goroutine, block, mutex, trace)

各種プロファイルを取得し、S3にアップロードします。
種類については以下を参照してください。
<https://github.com/golang/go/wiki/CustomPprofProfiles>
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213727/cdb9a87e-fbae-ef58-95e3-3f6c27892dbb.png)


## 将来の展望

将来的にはSlowQueryや、nginxの設定ファイルなどもいい感じにできるようにしたい。
また、S3にアップロードしているので、Webページからインタラクティブな感じでプロファイルを見れるようにしたい。

## おわり

来年こそはISUCON上位獲ります
ランナービギナーがつくばマラソン2023参加してみた

先日、茨城県つくば市においてつくばマラソン2023が開催されました。マラソンランナーとして参加した結果の所感を共有させていただければと思います。
ちなみにですが、
私は、昨年2022年に人生初のマラソンを4時間45分で完走し、今回が2回目となるフルマラソンです。
そのため、今回の記事を見ていただく場合には、フルマラソンをしたことがない人向けに書かせていただきます。

## 構成
- コース
- 私が準備したもの
- 私の準備期間と実態
- 初めてフルマラソンする方へ

### コース
つくばマラソンのホームページ：
https://www.tsukuba-marathon.com/

当日の天候は良くなく、小雨の中でマラソンをすることになりました。

コースは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632172/904f1710-cba1-4706-1275-efb140df4215.png)

給水内容は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632172/974e028f-64d6-5736-142e-453a2755e52d.png)


### 私が持って行ったもの

- コースマップ、会場マップ
- 軽食（パン、エナジードリンク）
- 充電器

以下ランニング中に持ってたもの
- カイロ（背中に貼、ポッケ）
- 手袋
- ビニール袋（頭と腕が通るように穴をあける）
- 携帯
- GPSランニング時計（自分のペースがわかるものであれば何でも）


### 私の準備期間と実態
今回のマラソンでは準備期間を十分設けることができず、
4日日前に5kmのランニングをキロ7分ペースで流し、
その後、筋肉痛を抑えるために休息をとり、当日を迎えました。
私の目標ペースはキロ7kmで5時間完走です。

案の定、マラソン開始後15km当たりから異変があり、両足の大腿部が鋼ように筋が固まっていました。
本来なら、このような状態は、30km当たりから現れるのですが、ずいぶん早くに来てしまいました。
しかし、給水スポットでお水またはスポーツドリンクを飲むことを欠かせず行い、
最悪の展開である脚をつることだけを回避することを考えて走る続けました。

25km辺りからだんだんと回りのランナーから歩き始める人が盛られるようになります。
個人の意見ですが、一度歩き始めると、体が冷えてしまいますので、どんなにペースは落ちてもいいですが、歩くことだけは極力しない方が良いと思います。

30kmからはもう精神的に屈しないように歩を進めるのみです。
沿道からの応援がとても励みになる時間帯です。

ゴールとなる筑波大学に戻ってくると、感無量で達成感を感じ、「もう少しだから」と自分に言い聞かせて歩を進めておりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632172/f4b0fa72-c785-3bd7-98f3-aa4ddecdd72c.png)

### 初めてフルマラソンする方へ
ビギナーランナーの私ですが、もし皆様のなかでフルマラソンしたいという方に向け簡単にアドバイスをさせていただければと思います。
#### 食事制限
初めてのフルマラソンであれば、筋肉痛を確実に起こします。
しかし、筋肉痛よりも怖いのは、脚がつることと腹痛です。
予防として、以下のことを考えてください。

前日の夜の食事において、玄米やパスタといった糖質をとることとバナナ、オレンジといった果物をとること、お水を普段よりたくさん飲むことです。
良くないのは、食物繊維をたくさん含んだ野菜や胃に負担をかけるたべものです。
また、食べすぎもよくありません。

当日の朝はランニング3時間前には食事を済ませるようにするととても良いです。

#### 理想的な準備期間
|スケジュール |練習内容|頻度[/週]|目的|注釈|
|:-----------------:|:-----------------:|:-----------------:|:-----------------:|:-----------------:|
|6か月前|1時間/30分 歩き続ける|1回|連続で歩き続けられる時間を知る|走る必要はありません。止まらないことを意識|
| |1km/3km ランニング|1回|快適なペースを知る|景色を楽しみながら走りましょう|
|5か月前|30分 快適なペースで走り続ける|1回|連続で走り続けられる時間を知る|同じペースを維持することと、止まらないことを意識|
| |5km ランニング|1回|走る習慣作り|継続して走る機会を作りましょう|
|4か月前|30分 快適なペースで走り続ける|2回|走ることを好きになる|止まらないことを意識|
| |10km ランニング|1回|達成度を感じましょう|景色を楽しみながら走りましょう|
| |フルマラソンの目標タイムを設定|-|具体的な時間を設定しモチベーションを高めましょう|10km走った後に設定しましょう|
| |10km 大会に参加|-|マラソン会場の雰囲気を知る|マラソン会場に親しみを持ちましょう|
|3か月前|1時間 快適なペースで走り続ける|1回|走り続ける忍耐力を養う|止まらないことを意識|
| |10km-15km ランニング|1回|距離感覚を掴みましょう|どのくらいでハーフマラソンを走れるか意識|
| |ハーフマラソン大会に参加|-|走り切れる自信を持つ|足の痛みに気を付けてください|
|2か月前|30分 設定ペースで走り続ける|3回|フルマラソン開始後を意識する|早く走る必要はありません。同じペースを維持すること|
| |10km-15km ランニング|1回|距離感覚を掴みましょう|どのくらいでフルマラソンを走れるか意識|
|1か月前|1時間 設定ペースで走り続ける|2回|ペースを乱す感情を抑える|同じペースを維持すること|
| |30km ランニング|-|走り終わった後の痛みを知る|同じペースを維持すること|
|2週間前|1時間 設定ペースで走り続ける|2回|フルマラソンを想像|同じペースを維持すること|
|1週間前|30分 設定ペースで走り続ける|2回|フルマラソン準備|同じペースを維持すること|
|1日前|5km ランニング|-|温度や走る環境を知る|同じペースを維持すること|

## 終わりに
準備期間がほぼない中で、フルマラソンを走り切ることができました。これは、私がまだ20代であることが大きく影響しておりますので、30代、40代や運動をあまりしてこなかった方には、今回の私のやり方は非常に危険なものです。マラソン後、4か日間は筋肉痛に悩まされ、階段の上り降りで苦労する羽目になります。
そのため、十分な準備期間を持ってマラソンには参加することを推奨いたします。
私のつくばマラソンでの経験が皆様にランニングを始めるきっかけになっていただけると幸いです。
研究開発でめっちゃ痛い目見た話

:::note info
この記事は、[木更津高専 Advent Calender 2023](https://qiita.com/advent-calendar/2023/nit_kisarazu) 7日目の記事です。
:::

<< prev @Nimono-sleep-well さんの [VCTを楽しく観戦するDiscordBotをつくった話](https://qiita.com/Nimono-sleep-well/items/7660ef5dcfb9d961bc8f) ←すごい
\>> next @maikuradentetu さんの [距離減衰式で長周期地震動階級を推定してみた](https://qiita.com/maikuradentetu/items/a16b1f75174224d37bbf) ←すごい

# 「先生！研究が！一生終わりません！！」

こんにちは、絶賛地獄を見ているとれいすです。

今年、とある短中期研究に採択されました。
時期的には現在70%くらいの段階ですが、多分私だけ進捗が35%くらいです。

しかも、応募時に出した資料はほぼ改変した研究が進んでいます…

なぜでしょうか、原因を一緒に見ていきましょう。

## 原因1. 着手時期が遅れた

思えば、採択決定後、1ヶ月ちょいしてから研究に着手しています。

試験期間に採択が決まり、そこから2週間くらいして試験が終わり、確実に1人だとモチベが保てないため、周りを巻き込むのに2週間…

当たり前のように1ヶ月着手遅延していますが、普通にしわ寄せが来ています。
当時の私を許しません。

## 原因2. 仕事などが重なりまくった

作業に集中しやすい夏休みですが、1ヶ月程度は本当に地獄みたいに仕事していました。
自分でも信じられないくらい仕事しました。

インターンとか、仕事とか、あと仕事とか仕事とか仕事とか…
余力が残らず、研究に初めて向き合ったのは9月の2週目とかだったと思います。

## 原因3. 理論が崩壊していた

審査資料には、ほぼ実現できない理論をつらつらと書いていました。
背景こそ伏せますが、軽い調査のみで実現できると思いこんで書いていたのが原因です。

電気系に強い友人を本研究に巻き込んだときに初めて判明したので、1人で進めようとしたら本当に進捗が終わっていたと思います。
友人には感謝。

## 原因4. 適度な休息を取っていなかった

土日祝返上で毎日学校に通い、研究を進めていましたが、数週間して本気で進捗が生まれなくなる日が出てきました。
私自身やる気はあるんですが、気が散ることが増えて、進捗がほんっとーに全く出ないんです。

ということで、「明日は休んでみたらいいと思うぜ～」という指導教員の提案もあり、デジタルデトックスも兼ねて1日スマホも触らず外でのんびりしていました。

翌日からすごい集中できました。休憩って大事。

ちなみにこの前も風邪でダウンしましたが、丸2日寝たあと、風邪気味で研究したときのほうが頭が回って進捗が出ました。
休憩ってほんと大事。

## 原因5. 立てた計画が全部頓挫した

これまでの総括でもありますが、もうそのままです。
計画立てる能力こそ正義です。

## 原因6. 時間の流れが早すぎる

じっとノーパソに文字を打っているだけなので、相対性理論的に私の時間の流れが早いみたいです。
光速に耐えるノーパソ募集してます。

## Conclusion

***ちゃんと　中身を　詰めて　計画的に　楽しく　研究　しよう！***

おわり
10の割り算　割られる数が1000ぐらいまで正しい(おまけ3)


10の割り算　割られる数が1000ぐらいまで正しい(おまけ3)


補足
M0/M0+は、32x32の乗算器を持っている
2桁の掛け算のようなもの

いろいろ
たぶん、わからな過ぎて、ねむくなる?


![o_cop823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cb0b120f-a2cb-41ed-3ec7-1187f5184abd.jpeg)



オンラインコンパイラ

https://paiza.io/ja

```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int x = (1<<16)+2; //65538
    int y = (3<<16)+4; //196612
    //             4 8
    //           3 6
    //          3 10 8
    //    12885557256
    //      3000A0008H
    
    
    int xh = x >>16;
    int xl = x & 0xffff;
    int yh = y >>16;
    int yl = y & 0xffff;
    
    int e1 = xl * yl; //2x4=8
    int e2 = (xl*yh)+(xh*yl); //(2x3)(1x4)=10;
    int e3 = xh * yh; //1x3=3
    
    long long r1 = ((long long)e3<<32) + ((long long)e2<<16) + (long long)e1;
    
    printf(" %ld\n",r1);
    printf(" %lx\n",r1);
    printf("(%lx)\n",  (long)( ((long)x) * ((long)y) )  );
}


```

結果


```

 12885557256
 3000a0008
(3000a0008)


```
SwiftUI　RGBで色を指定する方法

# RGBで色を指定する方法

```swift
Color(red: 0.3, green: 0.5, blue: 0.2)
```

で指定することができます。
0~1の数字を使う必要があります。
そのため、よく0~255の数字で表現されていることが多いと思いますが、そういう時は**数字/255**で指定することもできます！

透明度も指定したい時は、opacityを足せば使えます。

```swift
Color(red: 0.3, green: 0.5, blue: 0.2,opacity:0.4)
```

これで透明度も指定できます。
2023アドカレ04:有料フォントを手に入れて、執筆がめちゃくちゃ楽しくなった話

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/77a8d470-a735-09e4-406d-6abb0dde8f6c.png)

有料フォント x 執筆BGM x ループ設定で君もつよつよに執筆しよう！

# 何の記事？
[ぐらだけアドカレ2023](https://qiita.com/advent-calendar/2023/c9h11o2) 、4日目の記事です。
フォント力と音楽力で自作品を装飾し、テンションアゲアゲで文章を書こう！……というやり方を紹介します。

# 誰むけ？
- PCで文章を入力するも、なんだかフォントが気に入らない人
- 手書きよりもタイピングの方が速度は出るが、ブラウザのフォントが気に入らず、PCでの執筆に抵抗がある人
- 入力時から仕上がりのフォントが気になる人
- 執筆中に気分に合わせて音楽を変えたい人
- 執筆中BGMをループさせるのが面倒な人
- できあがりのフォントと同じ見た目で執筆を進めたい人

# あらすじ
先日、MOJICITYまちづくり部に入部した特典で、mojimo MOJICITYパックという有料フォントをいただきました。
通常であれば創作をメインで行うiPadにインストールするのですが、PCのみインストール可だったのでPCでの活用方法を色々と探すことに。

同人誌に使える……の前に、PCの表示フォントを変更できたらいろいろとはかどりそう？
──であれば、執筆フォントを変更できたりするのでは？……というのがきっかけです。

# 具体的に何を使ったか
### いろはエディタ
WEBブラウザで稼働するエディタです。
エディタの背景画像と執筆中のループBGMを選択して執筆に集中することができます。
シャッフル再生もでき、ループ再生もできるのが優れもの。

https://proto-iroha.underxheaven.com/

### mojimo
欲しいフォントを少額で少量ずつつまみ食いできるフォントライセンスパックです。
今回は無料でいただいた有料フォントを使いました。

https://mojimo.jp/

### Chrome

みんな大好きちょろめ君。

# 何をやったか
### 1. mojimoなどで執筆に使いたいフォントをインストール
やり方はそれぞれ異なるのでこの手順は割愛します。
### 2. いろはエディタをChromeで開く
いろはエディタ自体はブラウザを選ばないサイトですが、フォント変更を行う為、Chromeで開きます。
### 3. Chromeの設定画面を開く
Chromeを立ち上げたあと、右上の…から「設定」＞「デザイン」＞「フォントをカスタマイズ」と進みます。
### 4. フォント設定で変更を行う
今回は「Serif フォント」のフォントを変更します。
一度フォントを選択してプルダウンが選択状態になったあと、矢印キーで選択していくと、フォントプレビューを見つつ変更できて便利です。

基本は一番上の「標準フォント」を変更するとWebサイトのフォントが変わります。
サイトでフォントが設定されていなければですが。
### 5. いろはエディタで背景や音楽を選ぶ
「音楽を選択する」「画像を選択する」からそれぞれ執筆BGMと背景画像を選択することができます。
「設定を変更する」から縦書き・横書きと、フォントの大きさも変更できる他、今何文字入力したかの文字カウントをリセットすることができます。

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/a0eb2d3e-623b-5c3c-4c79-bb1c03f4e346.png)

エモい……！！！　[私の文章](https://kaku-app.web.app/p/tRFpgNL8UkImqtPdpHOh)のくせに！！！
コレは個人の感想ですが、筑紫アンティーク明朝は艶が出るので、そういう文章を書くときにおすすめです。
ルンルン書きたい時は意外とカラットにして書くのも楽しいです。
ちなみに、この文章はSkipでタイプしています。
フォントワークスさんの有料フォントはどれだけ個性が強くても可読性を損なわないクオリティなので、文章や気分に合わせて選ぶことができます。
~~さすがにラグランパンチは読めねぇ……となりましたが~~


# 応用事例
### iPadやiPhoneなどのアプリで執筆フォントを変える場合
#### Tatediter
縦書きソフトですが、執筆フォントを選択できるため、iPhoneやiPadで執筆をしていてフォントを変えたい……！という方はフォントを変更できるアプリ経由がよいと思います。

### TRPGでテキストセッションをすると幸せになります
ココフォリアを使ってオンラインでテキストセッションをやった際のお部屋が眼福でした。めっっっっっっっちゃエモい……！フォント力を目の当たりにした。

### Qiitaのエディタはこんな感じに変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/d67b9939-d81a-a2ea-cdc1-74a862805015.png)

標準フォント：タイトルなど、画面上部部分
固定幅フォント：エディタ部分のフォント

……に対応しているようです。
ベビーポップにしたらかわいい記事を書いている印象になりました。ラグランパンチにするとつよつよ記事に見えたり見えなかったり。
JetsonNano超入門2 RDP + CUDAでも

JetsonNano超入門 からあげさん他著　を読んでJetsonNanoで遊んできます。

# WindwosからRDP
## Jetson側の設定
- IPアドレス確認`ip a` 　
- `sudo apt install xrdp`をインストール
- ログイン時に起動するよう設定　`echo lxsession > ~/.xsession`
## Windows側
リモートデスクトップ接続で、　JetsonのIPに接続。

# CUDAデモ
リモートのJetsonのデスクトップ　LXTerminakl
```
$ cp -a /usr/local/cuda-10.2/samples/ .
$ cd samples/
$ cd 5_Simulations/
$ cd fluidsGL
make
./fluidsGL
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b016241c-a64d-e18d-d163-e0ce39eb46be.png)

無事流体シミュレーションっぽい画面が動きました。ぱちぱち
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/dcc460b7-ec92-7ae2-1be3-312109b25412.png)
【Next.js】CSR・SSR・SSG ・ISRの違い

# はじめに
CSR・SSR・SSG ・ISRの違いについて簡単にまとめて見ました。

# CSR (Client-Side Rendering)

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3335313230352f34366561656133372d313532642d313666342d646163312d6539613165326139656331662e6a706567.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517817/62f131e6-c549-8f26-32a9-be29de47ec0c.jpeg)

**ブラウザ上で JavaScript を実行して DOM を生成しコンテンツを表示させる方法。**
### 流れ
1. レンダリングのトリガーを検知
    - **コンポーネントの初期レンダリング（画面の初期ロード）やコンポーネントの状態（state）の更新があった場合**に検知。
2. 対象のコンポーネントの呼び出し
3. 以前のコンポーネントの状態との比較コミット
4. ブラウザレンダリングする内容の決定
5. 差分があった場合に `DOM` に適用(変更)


**ページの初期ロード時にはコンテンツは何も表示されず、ブラウザでの JavaScript の実行後に初めて画面が表示される。**



# SSR (Server-Side Rendering)
![スクリーンショット 2023-12-03 17.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517817/01d5c8c8-c7ac-d2da-2bb5-c8a36b78fd85.png)

### 流れ

1. サーバー側で生成された生の `HTML(DOM)` が `JavaScript` の実行前にブラウザで表示される。

2. サーバー側からレンダリングされた `HTML` に紐付けられた `JavaScript` を実行し、対象のページを完成される。

**UI/UXの向上はもちろんのこと、SEO にも効果があると言われている。**


# SSG (Static Site Generation)

静的なページで`SSG` を使用する場合、ページの `HTML` はビルド時に生成(`npm run build`など)、HTML はリクエストごとに再利用され、`CDN` によってキャッシュすることも可能。

**SSGではリクエストのたびにサーバーがページをレンダリングする必要がないため、レンダリングが高速。**

# ISR (Incremental Static Regeneration)

`ISR` を使うことで、`SSG`で静的ページがあらかじめ生成された後も、一定の時間間隔でそのページを再生成することができる。

**SSG による高速レスポンスを実現しつつも、ある程度のリアルタイム性も提供することができる。**



# 参考

https://qiita.com/newbee1939/items/7ce919f9a1a7153582b8

https://zenn.dev/suzu_4/articles/2e6dbb25c12ee5

https://react.dev/learn/render-and-commit
【体験記】私がモバイルエンジニアを続ける理由

こちらはアドベントカレンダーの２日目です。
まだ１日目の内容を見てない方はこちらを先にご確認いただけると幸いです！
https://qiita.com/minomusi/items/2e256e441654889bbbbd

それでは始めます:smiley:

## エンジニアを続けるか悩んだ数年とそこから
1日目の記事の最後に記載しましたが、私が新人の時は全く役に立たない新人だったなぁ〜と今考えると思います。

そんなこんなで1年、2年とエンジニアの仕事をし続けていた毎日ですが、常に「自分はエンジニアでずっと食べていくのだろうか？」、「向いてないのではないか？」ということを考えていた日々でした。
しかし、面白いことに最初は全くわからなかったモバイルアプリの開発ですが、2年もほぼ毎日してると少しずつですがわかるようになり思っていることを実現もできるようになって行きました。
(上司、先輩、同期などの支えが多くあったのは事実です。私一人の力では絶対に無理でした。)

そして3年目で初めて、携わっていたAndroidアプリの技術責任者をすることになります。

## モバイルアプリ超楽し〜
3年、4年とモバイルアプリの開発を続けてきた時には、既にモバイルアプリ開発の虜になっていました:thumbsup_tone1:

そして、「この深くて沼なモバイルという業界で自分の力がどこまで通用するのか知りたい！」という願望が出てくるようになり、後にフリーランスという道を選ぶことになりました。

## 今後の展望について
これまでは、過去に目を向けた内容を記載して行きましたので、最後に少しだけ未来に目を向けたことを記載してみようと思います。

今後についてですが、自分は以下の事を実現していきたいと考えています。
- 英語を使った環境に身を置いてみたい。
- 自身が昔から興味がある教育業界に何かしらの形で貢献したい。
- 個人開発で少しでも多くの人をとよっとでも幸せにしたい。
- ~~愛犬と戯れながらずっと暮らして行きたい。~~

上記の目標?を実現するために、今ある時間をどう使ってどうやって過ごしていくのか。これは常に考えて行動していかなけれ
ばならないと思っています。(時々できていない日もありますがそれはノーカンとしてます。休むことも立派な仕事ですよね？笑:innocent:)

## 最後に
長くなりましたが、この2日間の記事で伝えたかったことを記載して終わりたいと思います。
私は全くプログラミングに興味がない状態から、紆余曲折あり現在モバイルエンジニアになってそこそこ楽しく暮らしています。

もしかしたら、この記事を読んでいる人の中で、「プログラミングやってみたいけど難しいそう」、「やってるけどセンス無さすぎて泣けてくる」、「他の強強エンジニアさんの足元にも及ばない自分なんて・・・」などと考えている人がいるかもしれません。
しかし、私からしたら「プログラミングが好きか？」という問いの答えによるのでないかと思っています。
「好き！」と言えるような人であれば、そのまま足掻いてみる価値が十分にあると思います。
好きという気持ちが全てを支える力になり、未来の理想の自分に連れて行ってくれる力になる思っています。
一緒に強強エンジニアになれるように頑張って行きましょう:muscle:

最後にこの記事により一人でも多くのエンジニアの背中が押せたら、そんな幸せなことはないと考えています！

明日からは技術系のネタになってくると思いますので、引き続き楽しんでいただけたら幸いです！！:stuck_out_tongue_closed_eyes:
AWS Certified Cloud Practitioner取得とその後の感想など

AWS Certified Cloud Practitioner(以下CLFと呼びます)の取得及びその後についての雑記となります。
※取得してから2年近くが経過していますのであえて学習法などの内容を省かせていただいており、感想や後日談・ポエムとしての性質が強いです。

### 試験の概要
[AWS認定の公式ページ](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)での記載の通り、AWSにおいて踏み出す最初の一歩をサポートしてくれる資格といった印象が強いです。主要なサービス群とその主要な用途について広く浅く問われます。
> AWS Certified Cloud Practitioner は、AWS クラウド、サービス、用語の基礎的かつ高度な理解を持っていることを証明します。 これは、IT やクラウドの経験がまったくない個人でクラウドのキャリアに切り替えるか、基礎的なクラウドリテラシーを求めている基幹業務の従業員にとって、AWS 認定ジャーニーの良い出発点となります。

### CLFを取得してみた感想や個人的に感じた利点など
- AWSの全体像を掴むことが出来、今後の学習の方針立てに活かせた
    - AWS利用の第一歩目として広く浅く知ることが出来る性質が非常に有用かと思いました
        - 殆ど何もわからない状態⇒AWSの概要について体系的に理解している状態まで持っていける
        - もちろん当資格の取得≠ゴリゴリに利用できる であるため、当資格の学習を通して概要について学べたらそこを起点に気になるサービスをハンズオン等で実際に立ててみる、個人開発/案件利用してみるなどして深掘っていくのが良いかと思います
    - AWS認定の申し込み方法やテストセンターの利用法が分かるといった側面もあり、最初の成功体験として最適ではないかと思います。
- AWSサービスに関する視野が広まる
    - 組織内での私のロールは開発者にあたりますので、その興味や関心もコンピューティング/ストレージ/データベース(EC2/S3/RDS等)あたりに集中します...というかそれしか見ていない半ば視野狭窄のような状態でした。それ自体は必ずしも悪いことではないかと思いますが、普段使っていないAWSサービスにはこのようなものがあるのかといった気づきは非常に有用だったかと思います
    - 開発に使っていないサービスでも何となく概要程度は知っている...といった状態によって一番利点があると感じたのは社内のAWS利用を統括しているSRE部署との会話がスムーズになった点になります
        - 以前はAWS利用において開発から少しでも外れた話題になると完全に子守りしていただいているような状況でした笑 
    - 今では組織内でのAWS利用の全体像は非常に広大であり、私は小さな1OU内の1開発者に過ぎないのだ...といった視野が養えてきている気がします
- AWS 認定〇冠にカウントされる・維持コストが低い
    - AWS認定の基礎/アソシエイト/プロフェッショナルには上位/下位の関係が存在していますが、上位資格だけを取得しても下位資格を取ったことにはなりません(更新はされます)そのためAWS全冠などを目指している場合は個別で取得する必要があります  
    - AWS認定には3年間の有効期限が存在しますが、上位資格(SAA/SAP等)の取得・更新時に下位資格も更新されるという性質があります。例えばSAP/DOPの2資格の更新で6資格を維持することが出来ます。
    - CLFは基礎レベルに位置しており、上位に5つ(DEAを含めて6つかも知れません)もの資格が存在しているので、学習のステップアップの過程で上位資格を得た際や、その更新時に巻き込む形で再認定を得ることが出来ます。そのため個人的にではありますがCLFの維持コストについて意識した事はありません
    - APN企業に所属している場合、勿論CLFもAWS 〇〇 APN Certification Distinction(APN企業内でのAWS認定総保有数に対する表彰制度)にカウントされます
- 合格時に50％割引のバウチャーが貰える
    - AWS認定では合格時に次回以降の受験時に使用できる50％割引バウチャーが貰えます
        - 連続合格により2回目以降ずっと受験料半額というのも夢ではありません 
    - そのために受験料の安いCLFを最初に持ってきてバウチャーを得るという手法が有効で、例えばSAA単品とCLF+SAA(50%割引適用)ではそれぞれ16500円、20350円とさほど差が出ません
    - 個人的には、十分な実力があるなどして最初から上位の資格受験を検討されている場合でもCLFから段階を踏んだ方が色んな意味でお得ではないかと考えています。
    - 金銭面については合格時に得られる割引バウチャーの他にも[AWS 認定取得:Cloud Practitioner チャレンジ](https://pages.awscloud.com/jp-cloud-practitioner-certification-challenge-tnc.html?trk=f10c8af5-958b-4119-823e-ddefc3074468&sc_channel=el)といったイベントのようなものがそれなりの密度で行われており、例として挙げたものでは以下のような割引バウチャーを得ることが出来ます。割引率はチャレンジによって異なり、また割引の他にも「落ちた場合の再受験が1回無料」といった性質のチャレンジが行われていることもありますので受験を検討されている場合は確認してみると良いかと思います。
        - 2023/12/31までの受験でのみ有効
        - 適用対象はCLFのみ
        - 割引率25％(12100円⇒9075円、3025円off！)

### まとめ
振り返ってみるとCLFの取得はAWSにおける私の最初の一歩を強力にサポートしてくれていて、なおかつその後の方向性にも強い影響を与えていると改めて感じました。個人的には非常に良い資格かと思いますので、受験しようか迷われている方には是非ともオススメしたいです。
Sony Spresense 用 CAN AddOnボードの動作確認方法の情報共有

この記事は[Spresense Advent Calendar 2023](https://qiita.com/advent-calendar/2023/spresense)の2日目（12/2分）です。

# この記事は何?
Spresense + CAN AddonボードでCAN通信が確認できたので情報共有する記事です。

# CAN Addonボードとは?
Spresenseメインボードに挿して使うボードです。

https://nextstep.official.ec/items/38434337

# どうやって使うのか?
手順をつぎの記事に書きました。よければ参考にしてください。

https://qiita.com/juraruming/items/cc8609aa14ce0782049f
【勉強法】Ruby Gold3.1

# はじめに
Ruby Gold3.1受験にあたり取組んでいた勉強法が3つあるので簡単にまとめていければと思います。

# 勉強法①
まずは「ポモドーロテクニック」です。
ポモドーロテクニックは有名な勉強法で、[こちらの記事](https://qiita.com/moromi25/items/e54d6205e41b8ffb1324#:~:text=%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%83%BB%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%81%A8%E3%81%AF%E3%80%81%E9%9B%86%E4%B8%AD,%E3%81%93%E3%81%A8%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82)から一部抜粋させていただきます。

>1.その日に達成したい1つのタスクを細かく分割する
2.分割した1つのタスクを25分間集中して行う（タイマーセット）
3.5分休憩を取る

基本的なやり方は↑の通りです。実際に勉強してた際は、[Focus To-Do](https://www.focustodo.cn/)というアプリをスマホにダウンロードしてポモドーロテクニックを実行していました。このアプリはタスクの作成と25分の中での設定もでき、今取り組んでいるタスクが可視化されるので重宝しています。5分休憩時は立つことと水をのむことを必ず実行し、メリハリがつくように心がけていました。

# 勉強法②
次は「家以外の場所で勉強する」です。
私は家にいるといろんな誘惑で勉強が捗らないことが多々あります。そのため、家以外で勉強しようと思い図書館に通っていました。図書館は周りに人がいて勉強しかできない環境なので、家よりも圧倒的に捗っている感覚がありました。

# 勉強法③
最後に「Ruby実行アプリを活用する」です。
Rubyを実行できる環境が家にしかなく、図書館でどうにかしてRubyを実行したいと思っていました。そんな中、スマホでRubyを実行できるアプリ[どこでもRuby](https://fruc-tus.co.jp/mobileapp/dokodemoruby/)があると知り即ダウンロードしました。実際に使ってみると、アプリ上で直接コードを入力しようとした際に思ったように入力されない所があったので、メモ帳でコード作成しコピーしてアプリ上にコードを貼り付けて実行していました。Rubyの実行が家以外でもできるようになり、非常に有難かったです。

# おわりに
Ruby Gold3.1で上記3つの勉強法を用いた結果、自分に非常にあっているなと感じたので今後も取り入れていきます。ポモドーロテクニックは資格のみではなく仕事にも取り入れていければと思いました。

# 参考記事

https://qiita.com/moromi25/items/e54d6205e41b8ffb1324#:~:text=%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%83%BB%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%81%A8%E3%81%AF%E3%80%81%E9%9B%86%E4%B8%AD,%E3%81%93%E3%81%A8%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82

https://www.focustodo.cn/

https://fruc-tus.co.jp/mobileapp/dokodemoruby/
DTL vs Jinja2 ：Djangoテンプレートエンジンの選択

DTL(Django Template Language)とJinja2は、PythonのウェブフレームワークであるDjangoで使用される2つの異なるテンプレートエンジンです。
それぞれに独自の特徴と利点があります。

## DTL（Django Template Language）
DTLはDjangoのデフォルトのテンプレートエンジンであり、プレゼンテーションとロジックを分離することを目的として設計されています。これにより、テンプレートはよりシンプルで読みやすく、保守が容易になります。複雑なロジックは、独自のテンプレートタグやコンテキストプロセッサなどで作成する必要があります。これにより、テンプレートの変更が必要な場合、ロジックを変更せずにテンプレートだけを修正することができます。

## Jinja2
Jinja2は、DTLにインスパイアされたテンプレートエンジンであり、より複雑なロジックをテンプレート内で扱うことができます。これにより、開発者はテンプレート内でより多くの制御を行うことが可能になりますが、これは同時にテンプレートとロジックの密接な結合を意味します。そのため、仕様変更が発生した場合、ロジックとテンプレートの両方を書き直す必要があるかもしれません。

## 結論
Jinja2はテンプレートで複雑なロジックを実装できるが、ロジックとテンプレートが分離されていないため、保守性が悪く、スパゲッティコードになりやすいが、DTLを使えば、ロジックとテンプレートが分離されているため、保守性も良く、独自のテンプレートタグやコンテキストプロセッサなどを追加することで拡張性も高くなる

## 参考資料
https://docs.djangoproject.com/en/4.2/ref/templates/language/

https://docs.djangoproject.com/en/4.2/ref/templates/api/

https://jinja.palletsprojects.com/en/3.1.x/intro/
CSSのlight-dark()でWebサイトを楽にダークモード対応させられそう

:::note info
この記事は[NTTテクノクロス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ntt-tx)シリーズ１の14日目の記事です。
:::

# はじめに
こんにちは。NTTテクノクロスの鈴木雅貴です。当社製品やソリューション、受注案件を中心とした成果物をはじめとして、イベントやらコミュニケーションといった社内のあれこれを、デザインの力でよくしていくというチームのリーダをしています。個人としてはWeb標準技術まわりのスキルで生きており、[HTML5プロフェッショナル認定試験 レベル1 対策テキスト＆問題集　Ver2.5対応版](https://book.mynavi.jp/ec/products/detail/id=132028)のいち著者だったりします。

今回ですが、2019年のアドベントカレンダーで書いたダークモード記事「[CSSでWebサイトをダークモード対応させよう](https://qiita.com/suzukima/items/652dfc7e811525fe8fd5)」がまだまだ読まれて活用されているようです。その記事に関連して、CSSに新しく登場したダークモード対応機能`light-dark()`関数を紹介します。

# 事前のおことわり

今回紹介する機能は、2023年12月1日現在、Firefox 120でのみ対応しています。

# 今回紹介するCSSでのダークモード対応

まず最初にやり方を書いてしまいます。

```css
:root {
    color-scheme: light dark;
}

h1 {
    /* 普段は文字色が水色#4885ff、ダークモードでは緑色#36a300 */
    color: light-dark(#4885ff, #36a300);
}
```

これだけで、`h1`の文字色が、ライトモード時に#4885ff、ダークモード時に`#36a300`となります。`@media`とか書かなくていいんです。楽ですね！

ちなみにFirefoxでは、開発者モードの「インスペクター」で三日月型のアイコンをクリックすると、ダークモード時の表示をテストできます。

![ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16939/447c6336-1266-4bbc-532d-10e06b2b52b7.png)


今回の見た目はこんな感じになりました。

![dark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16939/c8788178-a7f4-7043-88c1-7a3558a22669.png)


書き方と見た目がわかったところで、機能について解説していきますね。

# `light-dark()`関数とは

まず`light-dark()`関数から。[仕様の日本語訳はこちら](https://triple-underscore.github.io/css-color5-ja.html#light-dark)

ライトモードとダークモード時の色を指定できます。

書き方ですが、`light-dark(ライトモードもしくは不明のときの色, ダークモードのときの色)`と書けばいいです。わかりやすいですね。ん？不明のときの色って？

# `color-scheme`プロパティとは

ここで関係してくるのが先に書いている`color-scheme`プロパティです。[仕様の日本語訳はこちら](https://triple-underscore.github.io/css-color-adjust-ja.html#color-scheme-prop)

`color-scheme`プロパティで、カラースキーム(配色)を定義することができます。

`color-scheme: light dark;`と書くと、ライトモードのカラースキームとダークモードのカラースキームが定義されます。

~~ここへ新たに別のカラースキームを追加することもできます。`hoge`を追加するなら`color-scheme: light dark hoge;`みたいに。~~ ←2024.12訂正。ユーザーがカラースキームを定義することは想定していないそうです。

ただ、現在はWebブラウザで`dark`と`light`しか想定してしない状態だそうです。ですので、`light-dark()`の使い方が前述のような説明になるんですね。今のところ我々は気にしなくて大丈夫、ということで。関数名からして`light-dark`ですもんね。

~~ちなみに、それ以外のカラースキームが登場したときの関数として、`schemed-value(light 色, dark 色, hoge 色)`のようなものが検討されているようです。~~ ←2024.12訂正。現状はなくなっているようですね。

# `light-dark()`の注意点

2023年12月1日現在、Firefox 120でしか対応していないので、まだ安心して使える状況ではありません。が、おそらくそう遠くないうちに他のブラウザにも実装されることでしょう。

また、`light-dark()`は色を使い分けることしかできません。色以外を変更することはあまりないと思いますが。ダークモードで色以外も変えたいときには、[こちらの記事](https://qiita.com/suzukima/items/652dfc7e811525fe8fd5)で紹介した`@media`を使ってください。

# おわりに

まだFirefoxでしか使えない`light-dark()`ですが、知っておくとダークモード対応がより気軽にできるのではないでしょうか。覚えておいて損はないかと！

明日の[NTTテクノクロスアドベントカレンダー](https://qiita.com/advent-calendar/2023/ntt-tx)シリーズ１は、@akiba-kh さんです。お楽しみに！
Power Automate で毎日SharePointに日付のフォルダを作成する

## 何をするか
タイトル通り、SharePointに日付のフォルダを自動で作成したいだけです。
以前はVBAでもドライブ上のフォルダと同じようにフォルダ作成できたはずですが、今はAPIを使うかPowerAutomateを使う必要がありそう。APIは設定が難しそう、というか、自分が管理者でない場合、設定の確認が面倒なので、PowerAutomateで実装してみる。

## How To
1. Power Automate を開き、「＋作成」を選択
1. 「スケジュール済みクラウド　フロー」を選択
1. フロー名、開始日、繰り返し間隔を入力し、「作成」を選択
今回は繰り返し間隔を１日にする
1. フローの編集画面が表示されるので、「Recurrence」の下の「＋」を選択し、アクションの追加を選択
1. アクションの追加メニューで、検索欄に「SharePoint」を入力、SharePointコネクタの横の「さらに表示」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281116/f680676f-d1a5-039e-760f-0f21efed5d95.png)
1. 「新しいフォルダーの作成」を探し、選択
1. 各設定項目を入力
    1. サイトのアドレス：https://[ドメイン名].sharepoint.com/sites/[サイト名]　とか、https://[ドメイン名].sharepoint.com/[サイト名]
    1. 一覧またはライブラリ：リスト名またはライブラリ名の意味だが、ここではライブラリ名を入力。私の利用している環境では、サイト標準のライブラリの場合「ドキュメント」を指定する。「Shared Documents」や「Shared%20Documents」では次のエラー表示が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281116/ab5a6174-fa67-e938-915b-d418eb8a6748.png)
    1. フォルダーのパス：日付部分については、「/」を入力するか「fx」を選択して式エディタに「formatDateTime(utcNow(),'yyyyMMdd')」を入力する。
1. 保存を選択、問題なければ「フローを開始する準備ができました。テストすることをお勧めします。」のメッセージが表示される。
1. 「テスト」を「手動」で実行。フォルダができていることを確認する。

## 完成
分単位で実行した場合の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281116/18e188d8-b7ca-6cf6-edb0-3be0072f58c9.png)
ABC331をPythonで（A～E）

大和証券プログラミングコンテスト2023（AtCoder Beginner Contest 331）

https://atcoder.jp/contests/abc331

# A
問題文のとおりに実装
```python:A
M, D = map(int, input().split())
y,m,d = map(int, input().split())
d += 1
if d > D:
    d = 1
    m += 1
    if m > M:
        y += 1
        m = 1

print(y, m, d)
```
# B
dpで実装した
```python:B
n, s, m, l = map(int, input().split())

dp = [0] + [float("inf")] * (n + 12)
for i in range(1, n + 12):
    if i >= 6:
        dp[i] = min(dp[i], dp[i - 6] + s)
    if i >= 8:
        dp[i] = min(dp[i], dp[i - 8] + m)
    if i >= 12:
        dp[i] = min(dp[i], dp[i - 12] + l)

print(min(dp[n:]))
```
# C
大きい順に累積和をとる
そのあと値の境目になったところを辞書に記録して答えを出す
```python:C
n = int(input())
a = list(map(int, input().split()))

b = sorted(a) + [float("inf")]
c = [0] * (n + 1)
for i in range(n - 1, -1, -1):
    c[i] += b[i] + c[i + 1]

d = dict()
last = -1
for i, b_i in enumerate(b):
    if last < b_i:
        d[last] = c[i]
        last = b_i

ans = [d[a_i] for a_i in a]
print(*ans)
```
# D
黒の数を2次元累積和で計算する
クエリは包除原理で計算
[公式解説](https://atcoder.jp/contests/abc331/editorial/7822)がわかりやすい
```python:D
n, q = map(int, input().split())
p = [input() for _ in range(n)]

data = [[0] * n for _ in range(n)]
for i in range(n):
    for j in range(n):
        if p[i][j] == "B":
            data[i][j] += 1

for i in range(n):
    for j in range(n - 1):
        data[i][j + 1] += data[i][j]
for i in range(n - 1):
    for j in range(n):
        data[i + 1][j] += data[i][j]

def calc(x, y):
    if x < 0 or y < 0:
        return 0
    res = 0
    if x >= n and y >= n:
        res += data[-1][-1] * (x // n) * (y // n)
    if x >= n:
        res += data[-1][y % n] * (x // n)
    if y >= n:
        res += data[x % n][-1] * (y // n)
    
    return res + data[x % n][y % n]

for _ in range(q):
    a, b, c, d = map(int, input().split())
    print(calc(c, d) - calc(c, b - 1) - calc(a - 1, d) + calc(a - 1, b - 1))
```
# E
各副菜に対して最大になる主菜を求める
ただし、愚直に行うと間に合わない

1. 主菜を値段の高い順にソート
1. 高いほうから順に取り合わせが問題がないか調べる
1. 問題がなかったらそれで決定して次から調べないようにする

これをすると$L+M$回調べるだけで全通り求めることが出来る
```python:E
n, m, l = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
NG = [set() for _ in range(n)]
for _ in range(l):
    c, d = map(lambda x:int(x) - 1, input().split())
    NG[c].add(d)

A = [(a_i, i) for i, a_i in enumerate(a)]
A.sort(reverse=True)

lst = [i for i in range(m)]
d = [-float("inf")] * m
for a_i, i in A:
    new_list = []
    for j in lst:
        if j not in NG[i]:
            d[j] = a_i
        else:
            new_list.append(j)
    lst = new_list

print(max(d_i + b_i for d_i, b_i in zip(d, b)))
```
【SwiftUI】LinkPresentationを使ってURLからタイトルを取得する

# はじめに
以前にURLからWebページのタイトルを取得するという記事を書きました。
https://qiita.com/SNQ-2001/items/7af62a202a6fbbf5167b

しかし、より良い方法を見つけたので記事にしておきます。

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2023-12-02 at 23.00.26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/637629f5-dc2e-a415-5892-5d8a2f03ec3c.gif)

# 実装
```swift
import SwiftUI
import LinkPresentation

struct ContentView: View {
    @State private var url = ""
    
    @State private var metadata: LPLinkMetadata?
    
    var body: some View {
        List {
            Section {
                TextField("URLを入力してください", text: $url)
            }
            
            if let title = metadata?.title {
                Section {
                    Text(title)
                } header: {
                    Text("タイトル")
                }
            }
        }
        .onChange(of: url) {
            Task {
                if let url = URL(string: url) {
                    metadata = try await fetchMetadata(url: url)
                }
            }
        }
    }
    
    private func fetchMetadata(url: URL) async throws -> LPLinkMetadata {
        let metadataProvider = LPMetadataProvider()
        return try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<LPLinkMetadata, Error>) in
            metadataProvider.startFetchingMetadata(for: url) { metadata, error in
                if let error {
                    continuation.resume(throwing: error)
                } else if let metadata {
                    continuation.resume(returning: metadata)
                } else {
                    continuation.resume(throwing: LPError(.unknown))
                }
            }
        }
    }
}
```

# おわり
LinkPresentationはOGPも表示できるようなのであとで試してみます
SOLID インターフェース分離の原則の勉強会で学びを得た話

この記事は[設計こばなし Advent Calendar 2023](https://qiita.com/advent-calendar/2023/software_design_talk)の2日目（12/2分）です。

# 概要
今年度SOLID原則の勉強会を開催してきました。インターフェース分離の原則の勉強会を実施したときに参加者の方のフィードバックが学びになったので共有します。

# インタフェース分離の原則の勉強会について
## 勉強会概要
インターフェース分離の原則の勉強会の概要はこちらです。

https://k-abe.connpass.com/event/291538/


## 勉強会の資料
勉強会の資料はこちらです。

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/KJLWEM/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/juraruming/KJLWEM-2023-08-28-005645">ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則 by @juraruming</a></div>

## 勉強会の録音データ
Xのスペースの録音です。ご興味あれば資料を一緒に見ながら聞いてみてください。

https://twitter.com/i/spaces/1lDGLnPowBZxm?s=20


# 学びになったフィードバック
勉強会を実施し、参加者からのフィードバックは下記がありました。

## 課題があるからインターフェースを分離する、という方針はどうか?
勉強会ではインターフェース分離の原則の原則違反、原則に則った例のコード例を話しました。
参加者からつぎのようなフィードバックをもらいました。

* ただインターフェースを分離するのではなく複雑な構造を改善するなど課題を解決するためにインターフェースを使うという方針が良いのではないか

このフィードバックを聞いた時に納得感がありました。
勉強会のためにWebのサンプルコードを見たり、ChatGPTに聞いたりして情報収集をしました。
情報収集した結果をサンプルコードとして掲載して勉強会で発表しました。
しかしそれはあくまで説明用のサンプルコードで実際の開発現場の課題がある、カオスな状況のコードを解決するためのコードではありませんでした。

インタフェース分離の原則の技術を使うという視点ではなく、課題を解決するための原則を使うという観点を持つことは大事ではないかと感じたフィードバックでした。


## インターフェース分離の利点について具体性がいまいちだった
インタフェース分離の利点について具体性がいまいちだった、というフィードバックをもらいました。
前述のフィードバックと重複しますが、実際の開発案件のコードで課題を探し、インターフェース分離の原則を適用した場合の効果・効用をシミュレーションしていくなどの姿勢が大事と感じました。
実際に原則に則り課題を解決し、効果・効用を身をもって体感できたときに理解力が増すと思いました。

## 例題のコードが単純すぎるためメリットがわかりずらい
前述のフィードバックと重複しますが、説明のためのコードでは単純すぎて原則を適用した場合の効果を体感できない面はあるだろうなと思いました。
ChatGPTで学習をすすめていましたが、ただ原則の説明を求めるのではなく、プロンプトを工夫するなどするのも手かなと思いました。
インタフェース分離の原則違反で課題がある状況を指示し、インターフェース分離の原則で課題を解決してください、などすると生成AIを設計の学習に役立つパートナーにできるかもしれないと思いました。
5Gが誰かの役に立っている気配がない。ローカル5Gは役立つのか？4GのMVNOと何かが似ている。L5G普及の鍵を探る回。

ローカル5Gは金さえあれば、免許を取得して機材を購入し構築すれば、
自営の5Gをふけるようになる。

ローカル5Gはオレ様5Gとも言えるスタンスだ。
MEC構成にしてしまえば、電波の干渉攻撃を受けない限りは、取得した免許帯域とネットワークを独占できるわけだ。

よく考えてみると、これは4Gの頃から出来上がったMVNOが
MNOに設備を借りるのにかかるお金に似ている。

MNOに設備を借り受けて、独自のサービスを提供し、
その無線リソースは複数のユーザーで共有することになる。

小さな土管を借りるスタイルだが 1ユーザに専有させると月額数百万ほどの月額料を取らないといけなくなるだろう。

そのため、MNOより借り受けた一つ、または複数の土管を何百、何千というユーザーで共有することになる。

そのため、ユーザの基本料は安くなるが、同時刻に他のユーザがサービスを利用していると、通信速度が遅くなる仕組みだ。

このことをローカル5Gと対比した場合、MVNOサービスがユーザーで共有するのに対し、ローカル5Gは電波の免許〜設備までを自前で準備することになる。　

そうすることで、所有者が独占することも可能なオレ様5Gが完成するというわけだ。

しかし、現在のローカル5Gには次に挙げる3つの弱点がある。

1. 設備が初期費用で、概ね1,000万円以上は必要となり高額。
2. 電波の飛ぶ範囲がやってみないとわならない。(sub6やミリ波の電波特性の影響)
3. テクノロジーが高度なため、設計・構築や障害時のトラブルシュートに技術者が必要。

ローカル5Gは上記のような問題に直面しており、ゆるやかに問題解決を行う社会姿勢は垣間見えるものの、いつ頃、実際の改善が成されるかは未知な状況が続いてるのである。

現在、パブリック5G が必要とされなくて、ローカル5Gも利用用途が不明なのも当然といえば当然な状況とも言えよう。

しかし、今後、通信業界はローカル5Gでお金を流動させる使命があるだろう。

では、こんな弱点だらけのローカル5Gをどう売ったらよいか？
 
答えは一つ。お金持ちの「玩具」、おもちゃとして売り出せばいいのだ。
車と同じで、所有してるのをステータスとして顧客を満足させる道が残されていることに筆者は気づいたのだ。

故に、私達は、極太客を見つけていく必要があると言えよう。これが真の5Gスタイルと筆者は考えた。

今後の 5G, 6G, 7G の発展を楽しんで行こうじゃないか。
2023アドカレ03: 卓感想やSSを電書化して持ち歩こう

TEXと喧嘩したのででんでんコンバーターさんと付き合い始めました。

# 何の記事？
この記事は[ぐらだけアドカレ2023](https://qiita.com/advent-calendar/2023/c9h11o2)の3日目の記事です。
自分の文章を手軽にepub電書にして取っておく手順を整理しました。

# 誰向け？
- TRPGの卓感想やSSを伝書化して振り返ったりしたい人
- 時間をかけずにepubデータを作りたい人
- ちょっとしたSSや文章をスマホで電書として取っておきたい人
- 字書きで電子書籍の表紙データをあまり時間をかけずに作りたい人
- 自作品をちょっと形にしてみたい人
- TEXと喧嘩したけどWordとも喧嘩してしまう人

# あらすじ
今までふせったーやベッター、カクヨムなど色々な媒体に卓感想やSSなどをあげていました。
ただ、いちいちどこにあったっけなー……ではなく、自分の見やすいところに綺麗な形で保存できないかなーと思い、電書にしてもいいな、となり。
Wordさんとは仲良くできず、TEXとずっと付き合ってきたのですが、色々書かなくてもさっくりepubにしたいんだけど……ということでこの度でんでんコンバーターさんと付き合い始めました。

# 使用ツール
#### でんでんコンバーター
みんな大好きでんでんコンバーター。
テキストファイルと画像を投げるとepubにしてくれます。

https://conv.denshochan.com/

#### 同人誌表紙メーカー
色、季節、雰囲気などで画像を探して、フォントを指定してタイトルドン！……で表紙が作れるツールです。
とてつもなくありがたい……。

https://dojin-support.net/

#### Canva

epubデータの表紙サイズを調整するのに使用しました。
使い慣れた画像編集ソフトがあればそれでよいと思います。

https://www.canva.com/

# 手順

### 1. epub化したいテキストをtxtファイルにしておく
プライベッターなら編集画面からtxtファイルに保存ができます。
他だと文章をコピーしてテキスト保存になるかと。
そのままだとルビは上手くいかないことが多いので、適宜置換などを行って保存しましょう。
### 2. 同人誌表紙メーカーで表紙を作る
#### 2.1表紙デザインを選ぶ
色、季節、雰囲気などから表紙デザインを検索できるので、作品にしっくりくるものを選びます。
#### 2.2 タイトルや入れたい文章を入力する
R18とかも入れられます……強い……。基本はフォントを選んでタイトルを入れればOK
### 3. 表紙サイズを好みで加工する
今回、epubデータの先頭に見開き表紙が来るのが嫌だったので、表紙データを半分にトリミングしました。
否、半分だとちょっと余白ができるのも気になったので、1:1.6位の縦長になるように調整しました。
トリミングに使うアプリはCanvaでも写真アプリでもイラスト編集ソフトでも、使いやすいものでよいと思います。
### 4. でんでんコンバーターにアップロードする
#### 4.1 表紙データのファイル名を変更する
表紙データはcover.png等にファイル名を変更します。
「表紙ページをスキップする」にチェックを入れると、アプリ画面のサムネイルとしては表紙が表示されつつ、読むときにはすぐ本文を読み始めることができます。
文章は複数ファイルにわかれていてもいいし、見出しをつけて目次も自動生成させて一冊に……というのもよいと思います。

#### 4.1 まとめてアップロードする
アップロード時、表紙データと本文をまとめて選択してアップロードを行います。
本文データはどんな名前でも問題ありません。
### 5. epubが読めるスマホアプリで読む
epubデータの仕上がりを実際に確認します。
私はiPhoneなのですが、アンドロイドでも標準で何か読めるアプリが入っていたはず……。
epubデータなので文字サイズやページ送り設定、画面の質感などが選べるかと思います。

# 結果

![IMG_8107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/4c72be21-283d-6a86-79c8-4129300bc1bc.png)


私の文、めっちゃカッコよくない？（自画自賛）
表紙付きで自分の文章が並ぶと圧巻です。本の形で並んでくれるので、自分の本感がとても強い。
1冊できたら調子に乗って何冊か作ってしまいました。

# 応用事例
### PDFでも読めます
iPhoneのブックアプリはPDFも入れられるので、TRPGのシナリオ電書とかも入れられます。
ブック内で付箋をつけたりもできるので、外出先でシナリオ読んだりする人はいいかも。
### プライベッターは文章のみepubをすぐ出せます
https://privatter.net/
表紙データを作らない場合は直でepubデータを出力できます。
ルビもしっかり反映されているので、とてもよき。
ただし縦書き出力限定なので、横書きにしたい人はこの記事の方法でやってもらえると良いかと。

# うまくいかなかった部分や余談
### TEXでさっくりできると思ってた
TEXで電書を作る方法で1記事書こうと思ってたんですが、組版を考えなければこちらの方が時短になるな……となって、ネタ変更しました。
### PDFだとデフォルトでは縦書き文章に対応不可
PDFをiPhoneのブックアプリで読む場合、右閉じ設定にできなかったため、縦書き文章を読む場合は縦スクロールなどにしないと違和感が強かったです。
それもあり、今回epubデータに変換できないかな……となりました。
Platform.shでプロジェクトを作る

day3の今日はプロジェクトを作ってみます。
「プロジェクト」は1つのアプリケーションを公開できる単位のようです。

前回サインアップ完了時に表示されていたプロジェクト作成画面で"Create from scratch"を選びます。

![01_ログイン後top_新しいプロジェクト作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/6f7c75d4-5da8-749a-52e8-904134ce9445.png)

プロジェクト名を入力し、Regionを選びます。

![スクリーンショット_2023-12-02_22_18_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/d2ea94e8-57cf-b5b3-28f0-b273f9627c24.png)

選べるリージョンは北米・ヨーロッパ・豪州です。インフラもAWS・Azure・GCPから選択できます。
![02_select後設定画面_region.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/328ac0ab-1969-098f-81ab-4bf397aeb9e0.png)

リージョンを選ぶとCO2排出量が表示されます。Symfonyの国際カンファレンスで地球環境のためにWebエンジニアができることのセッションがあるように、地球環境のためになる環境を選べるようになっていることがわかります。
![スクリーンショット 2023-11-21 20.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/f0dc2ccc-4dfa-b61c-a569-a1c25c00ff8f.png)

次へ進むとDevelopmentプランの価格が表示されます。[Platform.sh料金表](https://platform.sh/pricing/) にある通り開発者プランは1ヶ月12ドルですが、無料トライアル中は課金されません。
![スクリーンショット 2023-12-02 22.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/f2a41cec-5303-d04d-e7ae-a9ecbd7c91e8.png)

"Continue"を押すと少しの作成中...画面を経てプロジェクトが作成されます。

プロジェクト作成完了画面に「次にやること」リストが記載されています。親切仕様ですね。
![スクリーンショット_2023-12-02_22_36_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/58e33516-8f40-538b-05ba-c79b4244f9c1.png)

day4の明日は早速Platform.shのCLIを入れて使ってみる予定です。
色々な言語で簡単なREPLを実装する #dart

続きです。

# REPLとは
[こちらの記事](https://qiita.com/runeleaf/items/7615afd7abc79c9b3c01)を参照してください。

## Dartで実装する

main.dart
```dart
import 'dart:io';

void main() {
  while (true) {
    stdout.write('dart> ');
    String? input = stdin.readLineSync();

    if (input == null || input.trim() == 'exit') {
      print('Bye!');
      break;
    }

    try {
      // var prompt = eval(input);
      var prompt = input.trim();
      print(prompt);
    } catch (e) {
      print('Error: $e');
    }
  }
}

dynamic eval(String input) {
  // なにかそれっぽい処理
  return input;
}
```

## 実行する

```bash
$ dart main.dart
dart> 1 + 1
1 + 1
dart> foobar
foobar
dart> exit
Bye!
```

evalのような動的評価は、その言語の設計思想次第であるかないかが分かれますね。
ForwardではなくRedirectをした場合

# ForwardではなくRedirectをした場合
1~5までは[SpringMVCの大きな流れ](https://qiita.com/eunaa2934/items/8974cde05a15947956c2)を参照
6. **View名の代わりに**redirectが入った文字列を返す。(ex. return “redirect:/member/signup”;)
7. ViewResolverをスキップし、RedirectViewを通じて応答ヘッダーを作り出し、クライアントに応答を伝える。 (302: redirect)
![스크린샷 2023-12-02 22.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567846/ada0f13b-205e-ad57-7938-f00a576965b8.png)
8. クライアントは応答を受けて、ステータスコードが3xxだからLocationに書かれているurl(/member/signup)で**再リクエスト**するべきだと考え、ブラウザはLocationのurlで自動的に再リクエストする。
9. Dispatcher Servletで再び要請を受けてControllerに要請を伝達した後、既存[SpringMVCの大きな流れ](https://qiita.com/eunaa2934/items/8974cde05a15947956c2)の6の過程を進行する。


# Redirectを使用する理由

- Forward
    - 次に移動したURLに要請情報をそのまま伝達する。
    - そのため、**ユーザーが最初に要請した要請情報が次のURLでも有効である。**
- Redirect
    - **再要請を送るため、最初の要請情報はこれ以上有効ではなくなる。**
- 例えば、postで登録しながら、リロードをしたという。
    Web Browserの更新は、最後にサーバーに転送したデータを再送信するため、Forwardの場合、同じデータが複数回登録されてしまう可能性がある。
**この時、Redirectは最初の要請情報がもはや有効ではないため、同じデータが何度も登録されない。**
Crystalのマスコットキャラクター Crys の紹介

## はじめに

あー、やっぱり今日も誰もCrystalのアドベントカレンダーを投稿しないじゃないですか。
こうなったら少し薄いネタでも投稿しなければなりません。

## Crsytalのマスコットキャラクター

Crystalでは今年「Crys」という名前のカラスのキャラクターが誕生しました。知っていましたか？
（これ、クリスで読み方あってるのかな・・・

https://twitter.com/CrystalLanguage/status/1683485115052089345

## 背景

Crystalはオープンソースのプログラミング言語ではありますが、RubyやPythonのようなコミュニティが主導するタイプのプログラミング言語とは違い、[Manas](https://manas.tech/)というアルゼンチンの民間企業が明確な母体として存在します。

このように民間企業が母体となるメリットは、創始者の個人的な努力に依存せずに組織的にプロジェクトが維持されることが期待できる点ですが、デメリットとしてライセンスの窮屈さが見られることがあります。

ロゴのライセンスは、母体が民間企業であるかどうかで「緩さ」にかなりの差が出る部分です。

PythonやRubyがロゴを変形させて新たなロゴを作ってTシャツなどに利用することに対して寛容です。しかしCrystalは[そうでもありません](https://crystal-lang.org/media/)。Crystalに限らずMicrosoft、Apple、Googleなどの民間企業が母体となっているプログラミングのロゴのライセンスはかなり厳しく制約される傾向があります。これは、ユーザーがプログラミング言語に愛着を持ったり、コミュニティを育てる上では望ましくない場合があります。

それに対してGoogleが考え出した対処方がマスコットを活用することでした。Go言語では、コミュティがいじることができる存在としてGopherくんが用意されています。

Crys（クリスで読み方あってるのかな・・・）もそのような目的で設置されたと思いますが、個人的には、ちょっとデザインが固い気がしますね。ライセンスはまだ発表されていませんが、コミュニティの利用に関しては寛容なライセンスになる思われ、これから使用例が生まれてくるものだと思います。

この記事は以上です。

---

参考文献：

https://forum.crystal-lang.org/t/introducing-the-crystal-mascot/
Platform.shのサインアップ

day2の今日はサインアップ、アカウントの作り方について書きます。

公式サイトの "Login" からフォームに入り、

![スクリーンショット 2023-12-02 21.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/ee898a29-1433-f926-18d8-34934235987c.png)

Don't have an account? Sign up のリンクからサインアップフォームに入ります。

![スクリーンショット 2023-12-02 21.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/19169f74-6ac4-68eb-4e90-154bbf75361d.png)

GitHub, Google, Bitbucket, GitLabアカウント（2023年12月現在）でサインアップするか、あるいはメールアドレスでサインアップするか、好きなものを選べます。

認証が完了したら登録フォームで自分の国を選びます。

![01_サインアップ_国を選ぶ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/4e8c3b2b-1e91-3c51-f080-716df12af6f1.png)

Japanを選んでFinish setupボタンを押したらサインアップ完了です。
最初にアカウントを作るときは無料トライアル扱いになるのでクレジットカード等の情報は必要ありません。

新しいプロジェクトの作成画面まできたら、サインアップは完了です！

![01_ログイン後top_新しいプロジェクト作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23963/89402364-9109-ca3a-5120-de75c7377f1e.png)