OmniAICreator/Qiita-1.07M huggingface dataset:
メルカリのカテゴリ名とURLを抽出するスクリプト

## カテゴリー情報の抽出
メルカリの「カテゴリーからさがす」ページから
項目とURLを抽出するスクリプト

URL：https://jp.mercari.com/categories

※大カテゴリ、小カテゴリ全てで使えます。

### サンプルコード
```Javascript
function displayLinksInBrowser(html) {
  const tempElement = document.createElement('div');
  tempElement.innerHTML = html;

  const links = tempElement.querySelectorAll('.content__884ec505 a');

  const table = document.createElement('table');
  const tableBody = document.createElement('tbody');

  links.forEach(link => {
    const path = link.getAttribute('href');
    const url = `https://jp.mercari.com${path.replace(/\/search\?category_id=/, '/')}`;
    const linkText = link.innerText;

    const row = tableBody.insertRow();
    const textCell = row.insertCell();
    const urlCell = row.insertCell();

    textCell.appendChild(document.createTextNode(linkText));
    urlCell.appendChild(document.createTextNode(url));
  });

  table.appendChild(tableBody);

  const tableContainer = document.createElement('div');
  tableContainer.style.cssText = 'position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:rgba(0, 0, 0, 0.7);display:flex;justify-content:center;align-items:center;';

  const innerContainer = document.createElement('div');
  innerContainer.style.cssText = 'padding:20px;border:1px solid #ccc;background-color:#000000;max-width:90%;';
  innerContainer.appendChild(table);
  tableContainer.appendChild(innerContainer);

  const closeButton = document.createElement('button');
  closeButton.textContent = '閉じる';
  closeButton.addEventListener('click', () => tableContainer.remove());
  innerContainer.appendChild(closeButton);

  document.body.appendChild(tableContainer);
}

const htmlContent = document.querySelector('.merList').outerHTML;
displayLinksInBrowser(htmlContent);
```
### スクリーンショット
![75c9810b38048b88eca239a25f6328a9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520459/c50c811e-455a-f2a1-1351-2657866b5294.png)

## 備忘録
サイトトップのメニューから入った場合の大カテゴリURL
```
　https://jp.mercari.com/s/カテゴリID
```
カテゴリー検索ページから入った場合の大カテゴリURL
```
　https://jp.mercari.com/search?category_id=カテゴリの番号
``` 
抽出されるURL
``` 
　https://jp.mercari.com/categories?category_id=カテゴリの番号
``` 
「categories?」のままだとカテゴリ検索ページのままなので
別システム等で使用する場合、「categories?」が「search?」に置き換える
```
　https://jp.mercari.com/search?category_id=カテゴリの番号
```

以上
Getting started with a Framework：フレームワーク事始め

# Getting started with a Framework

**フレームワーク事始め**
*框架入门*

# Entry-Point

This is the first file execute by the framework.
**フレームワークが最初に実行するファイルです。**
*这是框架的第一个文件実行。*

Generally, Apache is controlled using ".htaccess".
**一般的には、Apacheだと.htaccessで制御しています。**
*通常，Apache 使用 .htaccess 进行控制。*

Initializes the Framework and handles the Routing and the Layout.
**フレームワークを初期化したり、ルーティングやレイアウトの処理を行います。**
*初始化框架并处理路由和布局。*

# End-Point

A file that is executed by the framework's routing.
**フレームワークが行うルーティングによって、実行されるファイルのことです。**
*由框架的路由执行的文件。*

In general MVC, it is a controller.
**一般的なMVCではコントローラーの事です。**
*在一般的MVC中，它是一个控制器。*

# Routing

Calculate the End-Point from URL.
**URLからEnd-Pointを計算します。**
*根据 URL 计算终点。*

# Layout

Refers to the layout of the entire site.
**サイト全体のレイアウトを指します。**
*指整个网站的布局。*

But, Some frameworks do not implement layout functionality.
**ただし、レイアウト機能を実装していないフレームワークもあります。**
*但是，某些框架不实现布局功能。*

# View

Generally speaking, it refers to the ability to display individual pages rather than the entire site.
**一般的には、サイト全体ではなく、個別のページを表示する機能のことです。**
*一般来说，它是指显示单个页面而不是整个网站的能力。*

# Model

"Model" is a word that has different meanings in various contexts.
**「モデル」は、文脈で異なる意味を持ちます。**
*“模型”这个词在不同的上下文中有不同的含义。*

The original meaning of 'Model' is 'exemplar' or 'paragon.' It is used to denote something that represents, imitates, or serves as a standard for others.
**「Model」の本来の字義は「手本」や「模範」です。これは他のものを示す、模倣する、または基準となるものとして使用されます。**
*“Model”的原义是“典范”。它用来表示代表、模仿或作为他人标准的事物。*

"Model" originally means a template or prototype for a creating object.
**ある作成物の雛形として使うものを「モデル」と呼びます。**
*“模型”最初是指创建对象的模板或原型。*
[JavaScript] アニメーションを学ぶ

## はじめに
JavaScriptでアニメーションの基本の書き方について学習したため備忘録として残しています。

## アニメーションの基本
JavaScriptでアニメーションの指定をすることで、より豊かな表現が可能になる。
様々な関数やイベントと組み合わせることで、より柔軟にアニメーションを作成できる。

:::note
`キーフレーム`:アニメーションは開始時の値と終了時の値を指定することで、その2点の間の値を自動補完して滑らかな動きで表示することができる。
この自動補完の動かす内容のことを指す。
:::

### 書き方
```js:web Animation APIの基本の書き方
動かす要素.animate(第一引数, 第二引数);
```
第一引数にはキーフレーム(オブジェクト)を指定する
第二引数は再生時間(単位は**ミリ秒　１秒は1000と指定する)や細かい動きの指定

## animateで指定できるプロパティ
複数を同時に指定することができる。
アニメーションの再生時間である[duration]は**必須項目**

### delay
アニメーションの開始を遅らせる時間。整数値のミリ秒で記述。1秒の場合は1000とする。初期値は0。

### direction
アニメーションを実行する方向
|指定できる値|意味|
|:--:|:--:|
|normal|通常の方向で再生(初期値)|
|alternate|奇数回で通常・偶数回で反対方向に再生(行って帰って行って帰って)|
|reverse|逆方法に再生|
|alternate-reverse|alternateの逆方向|

### duration
アニメーションの再生時間。**必須項目**


### easing
アニメーションが変化する速度やタイミング
|指定できる値|意味|
|:--:|:--:|
|linear|一定の速度で変化(初期値)|
|ease|開始時と終了時は緩やかに変化|
|ease-in|最初はゆっくり、だんだん速く変化|
|ease-out|最初は速く、だんだんゆっくりと変化|
|ease-in-out|開始時と終了時はかなり緩やかに変化|
|steps()|段階ごとに変化|
|cubic-bezier()|ベジェ曲線の座標に沿って変化|

### fill
アニメーションの再生前後の状態
|指定できる値|意味|
|:--:|:--:|
|none|なし(初期値)|
|forwards|再生後、最後のキーフレームの状態を保持|
|backwards|再生前、最初のキーフレームの状態を適用|
|both|forwardsとbackwardsの両方を適用|

### iterations
アニメーションを繰り返す回数。初期値は1。無限ループするにはinfinityを指定する。

### offset
タイミングを調整するプロパティ。デフォルトでは、指定したアニメーションは等間隔のタイミングで実行されるが、`offset`を使用すると任意のタイミングで実行できる。

**補足**
CSSアニメーションのタイムラインは **パーセント（%）** で実行割合を指定することができるが、JavaScriptのanimate()メゾッドでタイムラインの処理タイミングを割合で調節する場合は「offset」プロパティが利用可能。

:::note
「offset」プロパティは「0」から「1」の範囲で指定
CSSアニメーションでいうところの「0%」が「0」、「100%」が「1」となる
※数値が少数の場合は、一の位の0を省略して「.8」とも記述できる
:::

## CSSアニメーションとの違い
CSSだけでも`transition`や`animation`プロパティを使ってアニメーションを実装することは可能。

**JavaScriptを使うメリット**
複数の画像を順番に表示したり、1つずつ遅延させたりと変数を加えた動きを実装できる。また、if文を使って条件をつけることも可能。

カーソルを合わせると少し見た目が変わる程度のものであればCSSを使って実装すると楽！
**高度なアニメーションにしたい時はJavaScriptを利用すると良い**



## 参考
[1冊ですべて身につくJavaScript入門講座 (著：Mana)](https://www.amazon.co.jp/1%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FJavaScript%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%EF%BC%91%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F-Mana/dp/4815615756/ref=asc_df_4815615756/?tag=jpgo-22&linkCode=df0&hvadid=624494405467&hvpos=&hvnetw=g&hvrand=15052657312259187465&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009333&hvtargid=pla-1944051673189&psc=1&mcid=83edcdcd38173bac816cac6191183e60&th=1&psc=1)
起動ディスクを消去してOSの強制バージョンダウンを余儀なくされた話

## はじめに

&emsp;この記事は、[本番環境などでやらかしちゃった人 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yarakashi) の21日目です。今年も残すところあと10日、2024年はすぐそこまで来ていますね…。

&emsp;皆さまこんにちは、Hagianです。現在、山形大学大学院博士前期（修士）課程2年在学中の24歳です。

本番環境「など」でやらかしたエピソードとして、70%の慢心と29%の操作ミスと1%の興味によって **小学生の頃に父親のパソコンで** 引き起こした話をします。身近にお子さんがいる方に届いたらいいなと思っております…子供ってとんでもないことをしでかすんです…。

## 遡ること10数年前

&emsp;具体的にいつだったか、うろ覚えなのをお許しください。今から遡ること11〜12年前、私が小学6年生の頃の話です。小学4年生ごろから私と妹（2歳違い）は父のお下がりのPCを使って色々なことをやっていました。

### お下がりのPC

&emsp;当時さわっていたPCはAppleのPowerBook G3 Series（第2世代）という、90年代後半に販売されていたノートパソコンでした。この筐体を実際に使ったことがある20代ってかなり少ないはず（と自負しています）…。

今では考えられませんが、USB端子がまだ搭載されていなかったほか、記憶媒体として使えたのが3.5インチフロッピーディスクのみ、クロック周波数は300MHzで、筐体の重さは3.5kg。数年後にMacBook Proを触った時に軽さに驚いた印象が今も強く残っています。

https://ja.wikipedia.org/wiki/PowerBook_G3

&emsp;当時私の実家ではインターネット回線を契約していなかったため、PCがあってもネットサーフィンなどはできませんでした。そこで、父が読んでいたようなPC参考書を引っ張り出してきて、妹と一緒に、ときには使う権利をめぐって喧嘩をしながら、様々なことを実践して身につけていきました。

このころ身につけたものといえば…

* Microsoft Office 98の基本的な使い方
* HTML/CSS/JavaScriptの記述方法
* カスタムアイコンの作り方
* アニメーションの作り方

など…。今考えると、あの頃色々触っていたことによって、同級生よりもPC系に強くなれたのかなと思います。

&emsp;色々さわっていく中で徐々にハード系のことも覚えていき、小学生ながらに「**ハードディスク**」は「**パソコンの中に入っていて、繰り返し読み書きができる記憶媒体、フロッピーディスクとは比べ物にならない量が入る**」という知識がありました。

## 事件は突然に

&emsp;その日もいつものように作業をしていました。作業が終わって、不要なファイルをゴミ箱に入れようとしたとき、事件は起こりました。

何かのはずみに、消そうとした不要ファイルではなく、 **"Macintosh HD"** を選択。そして、**ゴミ箱へドロップ**。

………気づいた方は多いのではないでしょうか。そう。 **"Macintosh HD"** は **起動ディスク**。これをゴミ箱へ、つまり消去してしまったのです。

とはいえ、当時の私はまだ気づいていませんでした。というのも、ゴミ箱へ誤ってドロップしてしまったものの、中のファイルは読めるし、パソコンだって動いてる。「やっぱり、パソコンの中にあるものは消えないんだ！」

安心した私は「システム終了」し、その日の作業を終えました。 **…もうそのパソコンが起動することはないとは知らずに…**。

## 翌日の悲劇

&emsp;翌日。電源に接続、セッティングOK！今日もHTML書こうかな〜それとも二角取りでもするか〜などと呑気に考えていた私。電源ボタンを押して起動画面に表示されるエラー。呆然。「**えっ？？？**」

何が表示されたか。詳しくは覚えていませんが確か爆弾のアイコンとともに、「**このハードディスクは壊れています**」か、「**このシステムは修復できません**」と表示されていたような気がしています。

Command + Shift + 電源で強制再起動をかけても復旧できず、泣く泣く父に相談。ただこのときは、自分が壊したとは夢にも思いませんでした。父は「しょうがないなあ」と言って、しばらくそのパソコンは家から職場に持ち出されていきました。

&emsp;それから1ヶ月ほどたったある日、**なんと動く状態となってパソコンが帰ってきました！**

でも前と何かが違うなあ…と思いながら起動画面を見ると、なんと **OSがバージョンダウンしていました。** 起動ディスク消去前はMac OS 9.2.2でしたが、修復後はOS 8.1へ。かなりのバージョンダウンでした。しかし、フロッピーに移行していなかったデータが全て消し飛んだことと、ゲームがいくつか遊べなくなったほかに影響がなかった（=使えるアプリケーションはほぼ一緒）ことが不幸中の幸いでした。

## 反省

&emsp;自分の操作が原因であることにいつ気づいたか。再発防止のためにはここが重要ですよね。**ここ、非常に申し上げづらいのですが、今回のアドベントカレンダー参加登録時（2023年12月）です**。そして、謝罪ポイントがもう1つ。

:::note warn
「**妹、そして両親にもこの件の真実を伝えていない**」
:::

今度帰省したときにでも、タイミングを見計らって話してみたいと思います（汗）…。

身近にパソコンに触れる機会のあるお子さんがいらっしゃる方は、絶対にやってはいけないことをしっかり伝えておきましょう…。子供の興味本位ほど怖いものはないです…

最近だと

```terminal
$ sudo rm /*
$ sudo rm -rf /
```

あたりは絶対に阻止したいものですよね…（おしまい）
mruby/cの少し高度な書き方でLチカする(クラス編)

親しみのあるLチカで応用的な書き方を試してみました。
while文の中に、ダラダラと記述するのではなく、機能を外出しすることで、可読性が上がります。また、コードの再利用性が向上し、ソースコードを応用しやすくなります。さらには、Rubyの特徴を活かせば、mruby/cの可能性に気づくきっかけになるかもしれません。

# LED点灯・消灯機能をクラス化

```ruby:main.rb
PIN = 6
is_on = false
pinMode(PIN, 0)

class LedManager
  def on_off(v)
    if v then
      digitalWrite(PIN, 1)
    else
      digitalWrite(PIN, 0)
    end
  end
end

lm = LedManager.new

while true
  is_on = !(is_on)
  lm.on_off(is_on)
  sleep 0.2
end
```

<img width="600" src="https://esusan.s3.amazonaws.com/mruby_lchika3.gif">

[前回](https://qiita.com/JulieKS/items/1a2706dce880a1934e4a)はLED点灯・消灯を関数としてwhile文から外出ししました。今回はさらにクラスにして、newでインスタンス化しています。

今回、[mrubyファミリー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mruby-family)に3日分参加させていただきました。Lチカプログラムを題材にして、機能を関数化して疎結合にしたり、クラス化してオブジェクト指向的な書き方を試しました。1つのLEDを点滅させる程度であれば、ここまですることはないでしょうが、ビジネス的に大きなプログラムを書く場合には必要になってきますので、その準備体操ができてよかったです:santa:
【SotfwareDesign】結城浩の再発見の発想法連載終了

Software Design Advent Calendar 2023の12/18の投稿です。
本日は、Software Designの1月号発売日です。

# はじめに
@big_damaといいます。よろしくお願いします。
今回、毎月参加させてもらっているSoftware Design輪読会でアドベントカレンダをやるということで、参加させてもらいました。

# SoftwareDesign輪読会
株式会社技術評論社の月刊誌であるSoftwareDesignを読んで、参加者同士で交流を行っています。私は、初回から参加させてもらっています。業務が忙しく読めないまま参加したことも多々ありますが、みなさんに色々教えてもらって、モチベーションを保ち参加を継続しています。

# 結城浩の再発見の発想法
”結城浩の再発見の発想法”は、結城先生が技術用語を紹介し、日常生活の事例をあげて分かりやすく説明されている連載でした。私はこの記事が好きで、毎回ここだけは読んでいました。2023年5月号で連載120回（10年）で終了してしまいました。ほぼ読まないで参加した輪読会でも、この記事だけは読んでいて、輪読会でも毎回話題を振ってもらえていました。

今回は、今年の記事（と言っても4例しかない：最終回は振り返りでしたので）で特に共感できたダミーの記事について書きたいと思います。

# 2023年3月号：ダミー
## ダミー
ダミーはよく使っているのですが、記事を読むまではあまり深く考えていなかった。特に、エンジニアとして非エンジニアの方に説明する際に、ドメイン名が出てくれば、example.comとかはよく用いていた。今回、こういうダミーデータがあちこちに散りばめていることに気づかされた。

## 日常生活でのダミー
記事中では、役所で書類の名前サンプル等が挙げられていた。このあたりもダミーと紐づけずに利用していた例であった。クレジットカード会社の開発ドキュメントにカード番号のダミーがあるのは初めて知った。

## 考察
日常生活ではあまり必要ないが、データベースの学習や業務の評価で氏名・住所・電話番号・・・の個人情報に本番系を利用するわけないはいかないので、大規模のダミーデータがあると助かると思っている。新しい機能を試す上でもある程度の規模のダミーデータがあるとありがたい。

#　おわりに
今回、アドベントカレンダに参加させてもらったことで、アウトプットができてよかったと思う。結城先生がこの記事に関する本を執筆されている。発売直後に購入しているが、半分くらいしか読んでいないので、年末の休みで読み終えるようにする。

https://www.amazon.co.jp/%E5%86%8D%E7%99%BA%E8%A6%8B%E3%81%AE%E7%99%BA%E6%83%B3%E6%B3%95-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797395311

用語説明のネタも尽きてくると思うので、今後単発で時々執筆していただけたら嬉しい、
D1にDrizzleORMを導入してみる

## 背景

素のD1だとSQLが複雑になったときにしんどいので、ORMを導入したい。
CommunityProjectにも掲載とサンプルがある、[drizzle-orm](https://github.com/drizzle-team/drizzle-orm)を導入してみる。

https://developers.cloudflare.com/d1/platform/community-projects/


## 参考

下記のサンプルリポジトリをもとに試していきます。

https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1


## DrizzleORMのインストール

https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/README.md

DrizzleORMをインストールします。

```sh
npm install drizzle-orm better-sqlite3
## opt-in automatic migrations generator
npm install -D drizzle-kit 
```

package.jsonにschema.tsファイルを元に、generateするスクリプトを追加しておきます。

```diff_json:package.json
  "scripts": {
+    "generate": "drizzle-kit generate:sqlite --schema=src/schema.ts",
+    "up": "drizzle-kit up:sqlite --schema=src/schema.ts"
  }
```

`drizzle.config.json`ファイルを作成します。

https://orm.drizzle.team/kit-docs/conf

```json:drizzle.config.json
{
    "out": "drizzle",
    "schema": "src/schema.ts"
}
```

## Schemaファイルを作成しgenerateする・

サンプルプロジェクトをもとに、下記のshemaファイルを作成します。

```ts:src/schema.ts
import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';

export const users = sqliteTable('users', {
	id: integer('id').primaryKey(),
	name: text('name').notNull(),
	email: text('email').notNull(),
});
```

`generate`スクリプトを叩くことで、drizzleフォルダが作成されます。

```sh
$ npm run generate
```

generate後、下記のスクリプトを叩いて、ローカルの開発環境にSQLを実行し、テーブルを作成します。

```sh
$ wrangler d1 execute <DATABASE_NAME> --local --file=./drizzle/0000_sparkling_post.sql
```

その後、開発環境を立ち上げると、usersテーブルを持ったローカル開発環境が立ち上がります。

```sh
$ npx wrangler dev
```


## データベースをWorkers＋ORMで叩いてみる

サンプルのリポジトリではrouterが導入されていたので、routerを外したサンプルコードを書いてみました。

localhostを叩く度に、ダミーデータが1件INSERTされて、テーブルの全件をブラウザへ返すSQLです。


```ts
import type { DrizzleD1Database } from 'drizzle-orm/d1';
import { drizzle } from 'drizzle-orm/d1';

import { users } from './schema';


export interface Env {
	DB: D1Database;
}

interface Request {
	db: DrizzleD1Database;
}

export default {
	async fetch(req: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
	const db = drizzle(env.DB);

		const query = db.select().from(users);
		console.log(query.toSQL());
		const name = generateRandomWord()
		const email = `${generateRandomWord()}@${generateRandomWord()}.com`
		const res = await db.insert(users).values({ name, email }).returning().get();

		const result = await query.all();
		return new Response(JSON.stringify(result));
		},
};

function generateRandomLetter() {
  const alphabet = "abcdefghijklmnopqrstuvwxyz";
  return alphabet[Math.floor(Math.random() * alphabet.length)];
}

function generateRandomWord() {
  return generateRandomLetter() + generateRandomLetter() + generateRandomLetter();
}

```

localhostへアクセスするたびにデータが1つずつ増えていくのが確認できると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/e616a8e4-879b-1298-e4e6-896180008592.png)
【ECEUBE4】セキュリティ管理>システム設定で使用中の管理画面URLが登録できない！

この間、セキュリティ管理>システム設定画面で設定を更新しようとした時に困ったことを書きます。

すでに運用されているサイトだったため、管理画面URL設定はadmin以外が指定されていたのですが、他の項目を入力して更新ボタンを押したら

![スクリーンショット 2023-12-18 4.14.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991768/40b43d3e-d9d5-9c46-9751-949b397792e9.png)

管理画面URL設定項目でエラー:astonished:

admin_route_dirのFormTypeは以下の通り。
```
            ->add('admin_route_dir', TextType::class, [
                'constraints' => [
                    new Assert\NotBlank(),
                    new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
                    new Assert\Regex([
                        'pattern' => '/\A\w+\z/',
                    ]),
                    new Assert\Regex([
                        'pattern' => "/^(?!($routes)$).*$/",
                    ]),
                ],
                'data' => $this->eccubeConfig->get('eccube_admin_route'),
            ])
```

'pattern' => '/\A\w+\z/'のパターンで引っかかってる訳ではなさそうなので、その下のバリデーションで引っかかってるみたいです。
こちらはフロント画面と同じルートと同じ文字列を使用していないかチェックをしている箇所です。

var_dumpを使用して$routesの中身をチェック

![スクリーンショット 2023-12-18 4.41.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991768/a50a3b27-d3c9-b485-0977-54341d72e3c9.png)

フロント画面のルートの中に管理画面URL設定で設定しているルートも含まれてます。

これでは更新する場合に同じルートでは更新ができないということになってしまいますね。

こちらを回避する方法としては、
src/Eccube/Form/Type/Admin/SecurityType.php
でフロントのルートを取得しているところでconfigのeccube_admin_routeを比較して同じだった場合は除外
という処理を入れてあげればいいかと思います。

```diff_php
    private function getRouteCollection(): string
    {
        $frontRoutesUrlList = [];
        $routes = $this->router->getRouteCollection();
        foreach ($routes as $routeName => $route) {
            $path = $route->getPath();
            // 管理画面以外
            if (false === stripos($routeName, 'admin')
                && false === stripos($path, '/_')
                && false === stripos($path, 'admin')
            ) {
                $arr = explode('/', $path);
                foreach ($arr as $target) {
                    if (!empty($target)) {
+                        if ($target === $this->eccubeConfig->get('eccube_admin_route')) {
+                            //管理画面URLは除外
+                            continue;
+                        }
                        //↑ここまで
                        $target = preg_quote($target);
                        $frontRoutesUrlList[$target] = $target;
                    }
                }
            }
        }

        return implode('|', $frontRoutesUrlList);
    }
```

もう一度更新。

![スクリーンショット 2023-12-18 5.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991768/ad844aa0-d628-33bc-8ec5-b47c79bc2960.png)

ちゃんと保存されましたね。

この現象が起きるのはプラグインによる影響かと思います。

```
@Route("/%eccube_admin_route%/route/test", name="route_test")
```

上記の処理が入ってるプラグインを導入している場合、フロント画面のルートを取得する時に取れてしまってるようなので、
もしかしたら本体のバグ、、の様な気もしますね。

同じ様な現象で困った方がいらっしゃいましたら参照にしてもらえると嬉しいです:smiley:
AI-900 合格まで (2023.11)

[AZ-900 と MS-900 合格まで (2023.01) - Qiita](https://qiita.com/e99h2121/items/4ee69f047e555990065d)
[AZ-104 合格まで (2023.06) #AZ-104 - Qiita](https://qiita.com/e99h2121/items/de97a5e78b083739b5a1)
[AZ-305 合格まで (2023.12) #AZ-305 - Qiita](https://qiita.com/e99h2121/items/18ed097e6ecb66aafb3f)

2023.11.17  AI-900 を受けて合格したメモです。


## 感想
- 難易度的には体感 AZ-900 より易しい。
- 流行りものなので、受けてみると自信がつく。

## ロードマップ

とはいえ AI 独特の用語について理解。

- [試験 AI-900: Microsoft Azure AI Fundamentals - Certifications | Microsoft Learn](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/ai-900/)
- [Practice Assessment | Microsoft Learn](https://learn.microsoft.com/en-us/credentials/certifications/exams/ai-900/practice/assessment?assessment-type=practice&assessmentId=26&T.mc_id=Azure_BoM-wwl)
- [Microsoft AI 900 Free Certification Exam | ExamTopics](https://www.examtopics.com/exams/microsoft/ai-900/)
- 分類、回帰、クラスタリング
- [責任ある信頼された AI - Cloud Adoption Framework | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/innovate/best-practices/trusted-ai)

おかげさまで取得しました～。

## 参考

https://note.com/avakansai/n/nd63beb73269a

https://zenn.dev/zekkn/articles/c95ef9d4289a9b

https://qiita.com/zakky/items/03d06c267f55600d1b90

https://qiita.com/yuuun/items/9bde5829294ec801970b

## 次ステップ

年明け 2 か月計画で AZ-400 を取りたい。


以上です～
専門業務型の裁量労働制とはなんだろう

# エンジニアの裁量労働制
裁量労働制が適用される業種は専門業務型と企画業務型の2つがある
つまり、エンジニアのような職種と企画職の2つに特化した裁量労働制だ

## 法律上での定義
「情報処理システムの分析又は設計の業務」であれば裁量労働制を適応することができる

情報処理システムの分析又は設計の業務

>（ⅰ）ニーズの把握、ユーザーの業務分析等に基づいた最適な業務処理方法の決定及びその方法に適合する機種の選定
（ⅱ）入出力設計、処理手順の設計等アプリケーション・システムの設計、機械構成の細部の決定、ソフトウェアの決定等
（ⅲ）システム稼動後のシステムの評価、問題点の発見、その解決のための改善等の業務をいうものであること。プログラムの設計又は作成を行うプログラマーは含まれないものであること。


## 具体的にはどういうこと

> 具体的には、渡された設計書の通りにプログラミングをしている、上司の指示に従って開発・実装業務を行っている、というような場合には、仮に肩書がSEであったとしても、実体としては裁量性の低い業務を行っているのであり、裁量労働制の対象外となりうるということです。

引用：https://type.jp/et/feature/18174/


## 導入コストは高いので入ってるのはすごい
もし入社した企業に導入されているのであれば企業側の努力がすごい

> 対象業務の制限や導入手続が厳格であることから、積極的に導入されているとは言い難く、導入企業の割合は、令和2年の調査では、専門業務型で1.8%、企画業務型で0.8%

引用元：https://www.businesslawyers.jp/practices/1374

## 法的なメモ

> みなし労働時間が法定労働時間を上回る場合には、上回った労働時間分の割増賃金を支払う必要がある

> 休憩（労働基準法34条）、休日（同35条）、時間外・休日・深夜労働（同36条、37条）の規制については適用されます。


# WrtnAI： みなし労働時間を超えても、残業代は出ない。
裁量労働制でみなし残業時間が30時間付与されています
この時に実労働時間が30時間を超えた場合は賃金が追加で発生するのでしょうか
何時間働いても8時間働いたとしか見なされないのであれば、賃金は発生しないのではないでしょうか

> 専門業務型裁量労働制において「みなし労働時間」が設定されている場合、その時間を超えて働いたとしても基本的には追加の賃金は発生しません。この制度の下では、実際の労働時間ではなく事前に決められた「みなし労働時間」に対する賃金が支払われます。 たとえば、あなたの勤務形態で「1日8時間、月間に30時間のみなし残業が含まれる」とされている場合、実際にそれを超えて働いても、その超過部分について追加で賃金を受け取るとは限りません。

なるほどですね、やっぱり何時間働いても8時間働いたことにされる

10時間でも 8時間
1時間でも 8時間


参考：AI 
https://wrtn.jp

## 勤怠管理をしているのは健康管理のため
健康管理のためであって、残業代がでるからということではないらしい

>使用者は労働者に対し、健康管理目的で労働時間の把握を行う必要がありますが（労働安全衛生法66条の8の3）、これは裁量労働の対象となる労働者についても同様です。ただし、あくまで健康管理目的に留めるべきであり、それ以上の労働時間管理は、かえって労働者の裁量を否定するものと評価されかねないので注意が必要です。

引用：https://www.businesslawyers.jp/practices/1374

# 早朝や深夜の残業代が出るかは就業規則次第

> 専門業務型裁量労働制においては、基本給に「みなし労働時間」分の残業代が含まれているため、早朝や深夜に作業を行った場合も原則として追加の賃金（残業代）は発生しません。

>深夜労働（通常は22時から翌5時まで）については、労働者の健康を守る観点から、多くの国では追加の割増賃金を支払うことが法律で定められています。日本では、深夜労働に対しては25％の割増賃金を支払わなければならないというルールがありますが、裁量労働制の場合、この深夜手当についても事前に考慮した賃金設定になっている可能性があります


# 個人的な理由で、不要不急な深夜勤務をした場合は？
本人が所定労働日に勤務した場合、所定労働時間(8時間)労働したものとみなされるの場合
> これらの条文から判断すると、従業員が個人的な理由で深夜時間帯に勤務を行った場合でも、契約書と就業規則に定められた深夜勤務手当の支給規定に基づき、割増賃金を算定する可能性があると言えるでしょう

> 従業員が個人的な理由で深夜時間帯に勤務を行った場合でも、契約書と就業規則に定められた深夜勤務手当の支給規定に基づき、割増賃金を算定する可能性があると言える

> 人事部や組織の労働政策担当者に直接確認することが最も確かな方法です。 裁量労働制の適用状況の詳細や、実際に深夜時間帯の労働がどのように処理されるべきかについての具体的な規定があるかどうか、また、その規定が適用されるかどうかは企業の方針や実務上の取り扱いに大きく依存します。したがって、企業の人事部門と通じて、詳細を確実に確認してください。

とのことなので、人事にちゃんと聞いてみよう

参考：AI 
https://wrtn.jp
技育CAMPアドバンスに参加しました

## はじめに
遅刻すみません！！！[CA Tech Lounge Advent Calendar 2023](https://qiita.com/advent-calendar/2023/catechlounge)の17日目です。
昨日、技育CAMPアドバンスに参加してきました。
技育CAMPはハッカソンのイベント名で、年20回くらい開催されてます。アドバンスは、そのハッカソンで受賞したチームだけが集まり、発表し合う場です。

## 私たちのプロダクト
私たちは、友達と友達の友達でチームを組み(3人)、「Recollect」という自分史作成サービスを開発しました。
実際にリリースしているので、使っていただけるとうれしいです。
[Recollect](https://recollect-me.vercel.app/)
概要だけ知りたい方は↓
[発表資料](https://www.canva.com/design/DAF2jpr-obY/sEpKs9Tq_VuHrT2An71Oyg/view?utm_content=DAF2jpr-obY&utm_campaign=designshare&utm_medium=link&utm_source=editor)

## 追加開発期間
追加開発の始まりは、ハッカソンで直らなかったCORSエラーの対応だった気がします。(うろ覚え)
ChatGPTではそうそう解決できず、Web上のドキュメントを洗ってやっと繋がった記憶です。こういうエラーに強くなりたい。

大きなところで次にやったのは、Google認証の実装です。もともと検証しやすいようにとユーザ名/パスワードで認証していたのを、自分たちでパスワードを持たない設計に変更しました。
認証・認可を丸ごと変えることになり、データベース構造やデータ取得のロジックに手を加えるのが大変でした。
(自分でやっておいて何ですが、今の設計に納得していないです。機能追加すると、設計の良くない部分が見えてくるものですね。まだお金は絡んでないですし、リリース後に変える体験をするのも面白そう。)

そこまで終わって、いざデプロイ&リリースしました。バックエンドのデプロイはfly.ioでやったのですが、そこでも何かと躓きました。デプロイした人は偉い(大声)

リリースしてからは、周囲の人に使ってもらい、意見をいただきました。
特にAPIキー漏出の指摘には感謝しかありません。超焦って直しました。最初は大々的に告知していなくてよかったです。
他にも、細かい挙動から欲しい機能まで、本当に忌憚なく言ってくださいました。ありがとうございます。
意見を元に開発するのは、明確にプロダクトが良くなる実感があって、楽しかったです。よく言われる「利用者のニーズは尽きない」「プロダクトは生き物」を体感しました。

ここまでの話、順調というわけでなく、就活が忙しかったり、せっかく集まっても話してばっかりで怒られたり、色々ありました。反省してます。
それでも、リリースしてフィードバックもらって機能追加するまで、プロダクトのライフサイクルで一番熱量のある時間を経験できて、本当に良かったです。

## アドバンスに参加して
どのプロダクトもレベル高くて、刺激的でした。全チーム賞をもらえる完成度だと思います。
チームの友達に賞を持たせられなかったのは、悲しかったです。ただ、他のチームと比べ劣っていたとは思わないので、不思議と悔しくないです。

私は評価基準を見て訴求を考えていましたが、平均的に網羅するよりも、突出した主張が必要だったのかなー、とぼんやり思ってます。
いつも魅力を伝えきれず後悔している気がします。次はより「どう売り出すか」を考えて開発や発表に挑みます。

## おわりに
仕事のように必要に迫られてでなく、自分の意志で時間を投下して何かを生み出すのは、楽しいよりもずっと苦しいのほうが多かったです。
それでも、大好きな友達とここまで開発ができて、本当に最高でした。

願わくばずっと続けていたいですが、お互い常に忙しいのもあり、今回が区切りになると思っています。
またみんなで集まって開発できたらいいな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1919799/da5c57e1-af67-1110-b414-a566677404bc.png)
2023/12/18主にITとかセキュリティの記事

ボーイングにサイバー攻撃　航空機の運航は大丈夫なのか(12/16)
https://kn.itmedia.co.jp/kn/articles/2312/16/news053.html

中国が情報セキュリティー対策、深刻度で4段階　迅速な申告求める(12/15)
https://jp.reuters.com/economy/industry/5MW5NMNMMZPP7FQJOABXBL5LLM-2023-12-15/

[アップデート]AWS Control Towerのランディングゾーン バージョン3.3がリリース！よりセキュアになりました！(12/16)
https://dev.classmethod.jp/articles/update-aws-control-tower-landing-zone-ver-3-3-released-more-secure/

Ledger Connectに脆弱性、複数のDappsが攻撃に利用される。現在は修正済み(12/15)
https://www.neweconomy.jp/posts/359322

ベテランエンジニアも意外と知らない「パッケージ管理システムの仕組み」(12/16)
https://qiita.com/s_taki/items/1d94e5e9544ebbf32778

PagerDuty Incident Response Documentation を参考にセキュリティインシデントに備える(12/16)
https://hack.nikkei.com/blog/pagerduty-advent20231216/

macOS 14.2 SonomaにはFaceTimeやZoomなどで画面共有を行うとランダムなスペースが他のユーザーに表示され、個人情報の漏洩につながる可能性のあるバグがあるので注意を。(12/16)
https://applech2.com/archives/20231216-macos-14-2-sonoma-screen-sharing-bug.html

ハリー英王子、タブロイド紙に勝訴　「盗聴で記事」に約2540万円の賠償命令(12/16)
https://wedge.ismedia.jp/articles/-/32427

1800の銀行アプリのうち1103個が侵害、どんな手を打つべきか(12/16)
https://news.mynavi.jp/techplus/article/20231216-2841972/

「ＡＩ、金融分野にリスク」　米金融当局が警告(12/16)
https://www.donga.com/jp/home/article/all/20231216/4623331/1

第41回 改正ネットワーク・情報システム指令（EU） 我々はそこから何を学べるのか(12/16)
https://www.risktaisaku.com/articles/-/86165

AI革命に伴うリスクは克服可能(12/16)
https://www.arabnews.jp/article/middle-east/article_107090/

「世界のデジタル政府」ランキング！　2位は「カナダ」、1位は？(12/16)
https://news.yahoo.co.jp/articles/97aaacd8acb1600820f2a4ae03c20aa11d18b7e9?source=rss

Web3.0とWeb3の違いとは｜DAO・NFT・仮想通過など関連技術とビジネスモデルをわかりやすく解説(12/16)
https://data.wingarc.com/web3-and-similar-terms-63810?utm_source=rss&utm_medium=rss&utm_campaign=web3-and-similar-terms

「世界で最も影響力あるブランド500」、中国企業6社が新たにランクイン(12/16)
https://www.afpbb.com/articles/-/3496357?cx_part=top_category&cx_position=2

県広聴広報課を装うメール、件名は「三井住友カード」(12/16)
https://www.yomiuri.co.jp/national/20231216-OYT1T50109/
LEGO MINDSTORMSをPythonでプログラミングする ～その１～

## はじめに
　LEGO MINDSTORMS（以下、マインドストーム）をPythonでプログラミングするときによく使う関数をまとめました。

## アプリモジュール
### `play_sound`関数
　以下のように使います。
```python
from mindstorms import App

app = App()
app.play_sound("Cat Meow 1")
```
　引数にワードブロックの時に使える音声の名前を渡してあげます。

## スピーカー
### `beep`関数
　以下のように使います。
```python
from mindstorms import MSHub

hub = MSHub()
hub.speaker.beep(75, 0.5)
```
　引数に音のコードと秒数を渡してあげます。

## カラーセンサーモジュール
### `wait_until_color`関数
　以下のように使います。
```python
from mindstorms import ColorSensor

color_sensor = ColorSensor("A")
color_sensor.wait_until_color("blue")
```
　引数に色を渡してあげます。

## 距離センサーモジュール
### `wait_for_distance_farther_than`関数
　以下のように使います。
```python
from mindstorms import DistanceSensor

distance_sensor = DistanceSensor("F")
distance_sensor.wait_for_distance_farther_than(10)
```
　引数に距離（センチメートル）を渡してあげます。

## フォースセンサーモジュール
### `wait_until_pressed`関数
　以下のように使います。
```python
from mindstorms import ForceSensor

force_sensor = ForceSensor("E")
force_sensor.wait_until_pressed()
```

## おわりに
　後編は、こちら。

https://qiita.com/cyber-yuito723/items/e2d004d75690bd5cdbda

　マインドストーム関連の記事を他にも書いています。

https://qiita.com/cyber-yuito723/items/2346b5d068aa5d7ea6e5
LEGO MINDSTORMSをPythonでプログラミングする ～その２～

## はじめに
　この記事は、「LEGO MINDSTORMSをPythonでプログラミングする ～その１～」の続きです。

https://qiita.com/cyber-yuito723/items/06f63155f0f7e3c26b0c

## モーターモジュール
### `start_at_power`関数
　以下のように使います。
```python
from mindstorms import Motor

motor_a = Motor("A")
motor_a.start_at_power(100)
```
　引数にパワーの値を渡してあげます。

### `stop`関数
　以下のように使います。
```python
from mindstorms import Motor
from mindstorms.control import wait_for_seconds

motor_a = Motor("A")
motor_a.start_at_power(100)
wait_for_seconds(3)
motor_a.stop()
```

## モーターペアモジュール
### `start_at_power`関数
　以下のように使います。
```python
from mindstorms import MotorPair

motor_pair = MotorPair("A", "B")
motor_pair.start_at_power(100)
```
　引数にパワーの値を渡してあげます。

### `stop`関数
　以下のように使います。
```python
from mindstorms import MotorPair
from mindstorms.control import wait_for_seconds

motor_pair = MotorPair("A", "B")
motor_pair.start_at_power(100)
wait_for_seconds(3)
motor_pair.stop()
```

## スリープ
　以下のように使います。
```python
from mindstorms.control import wait_for_seconds

wait_for_seconds(3)
```

## おわりに
　正直、簡単なプログラムはワードブロックの方が書きやすいですね。Pythonの実行速度が向上すればより便利になると思います。マインドストーム関連の記事を他にも書いています。

https://qiita.com/cyber-yuito723/items/2346b5d068aa5d7ea6e5
Gitコーナー　【リモートとローカルを繋げる】　つまり、GitHubのリモートリポジトリと開発環境下のファイル/フォルダを繋げる


## 絶対的なこと

２つ事前にやることがある

①ローカルにて、git init
②GitHubに、リモートリポジトリの作成


## その後

①git remoteで、繋げる
②git pushで、反映させる



## 全ては、

[神様](https://qiita.com/Futo_Horio/items/4d669f695680bc13d5fa)

のおかげでした。
Proxmoxのアップデート情報確認のよもやまなこと





## TL;DR

- RSS フィードを使えばアップデート情報を管理できると思ってたけどそんなことはなかった。
- WikiとPortalを確認すればOK！
  - Wikiは詳細情報が記載
  - Portalは各リソースへのリンク集
- バージョンアップ頻度はメジャー・マイナーともに数か月ごと。
- (オマケ)アップデート情報収集に便利なProxmox 用のChatGPTsを作りました
    - 私作ではなく弊社CEO作です…


## 概要
今年はProxmox Virtual Environment（VE）・Backup Server（BS）・Mail Gateway（MG）それぞれでメジャーバージョンアップ、VEとBSはマイナーバージョンアップもありました。

タイムリーにリリース情報を拾えてなかったりもしたので、Proxmox ソリューションのバージョン情報をどうやって追えば？と思って調べてみました。


## RSSだけ登録しておけばいいと思ったけど…
全然そんなことなかった。
RSSは以下のように別リソースへのリンクとなっています。
そのため、新しいバージョンがリリースされたことは気が付けても、その内容までは動的にわからない感じでした。

```
    <item>
      <title>Proxmox VE 8.1 released!</title>
      <link>https://my.proxmox.com/index.php/en/announcements/article/proxmox-ve-8-1-released</link>
      <description/>
      <pubDate>Thu, 23 Nov 2023 14:28:00 +0000</pubDate>
    </item>
```

## RSSからのリンクもめっちゃたらいまわし感。

めっちゃたらい回し感ありました…
以下の順にリンクをたどっていく必要がありました。

- [RSS](https://my.proxmox.com/en/announcements/rss)
- [Support Portal](https://my.proxmox.com/en)
  - 以下の部分がForumへのリンク
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/a41d2971-db34-65e0-64a4-1fa464c0d7e4.png)
- [Forum](https://forum.proxmox.com/threads/proxmox-ve-8-0-released.129320/)
  - 概要と各リソースへのリンク集
- [Wiki](https://pve.proxmox.com/wiki/Roadmap#Release_History)
  - アップデートの詳細情報が記載



## 結局どこを見ればいいのか？
前述のとおりですが、ForumとWikiを見れば必要な情報は入手できるかと。

## Proxmox の更新頻度
RSSをトリガーとしたイベントドリブンなシステムを作ろうか検討したのですが、そもそも更新頻度はどの程度なのか？と疑問がわきました。
メジャー・マイナーどちらも数か月に1度という頻度。
それであれば**RSSだけ確認して詳細は手動でもいいのでは？という結論に至りました**

### Proxmox VE

| バージョン | 公開日       | 前回からの日数 |
| ---------- | ------------ | -------------- |
| 6.4        | 2021/04/28   | -              |
| 7.0        | 2021/07/06   | 69             |
| 7.1        | 2021/11/17   | 134            |
| 7.2        | 2022/05/04   | 169            |
| 7.3        | 2022/11/22   | 202            |
| 7.4        | 2023/03/23   | 121            |
| 8.0        | 2023/06/22   | 91             |
| 8.1        | 2023/11/23   | 154            |

### Proxmox Backup Server

| バージョン | 公開日       | 前回からの日数 |
| ---------- | ------------ | -------------- |
| 2.0        | 2021/07/13   | -              |
| 2.1        | 2021/11/23   | 133            |
| 2.2        | 2022/05/18   | 176            |
| 2.4        | 2023/03/29   | 315            |
| 3.0        | 2023/06/28   | 91             |
| 3.1        | 2023/11/30   | 155            |

### Proxmox Mail Gateway

| バージョン | 公開日       | 前回からの日数 |
| ---------- | ------------ | -------------- |
| 6.3        | 2020/11/19   | -              |
| 6.4        | 2021/03/30   | 131            |
| 7.0        | 2021/07/15   | 107            |
| 7.1        | 2021/11/30   | 138            |
| 7.3        | 2023/03/28   | 483            |
| 8.0        | 2023/06/29   | 93             |

## Proxmox のChatGPTsは活用できるかも
最終的にはWikiなどを確認することになりますが、ちょっとでも楽に確認できればということで、Proxmox 用のChatGPTsを作成しました。ご活用ください。
※作成したのは私ではなく[弊社CEO](https://qiita.com/honma-h)です。

https://chat.openai.com/g/g-I5mS78riS-proxmox
UTMを使って、Apple SiliconでUbuntuを使う

## UTMとは？

仮想化ソフトウェアです。Parallels的なものを想像していただければと思います。

![スクリーンショット 2023-12-18 2.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/1e78e632-01d0-1e37-7298-8d700a5a9698.png)

https://mac.getutm.app

## UTMのインストール

上記リンクのDownloadから.dmgを落として展開し、`Applications`フォルダに突っ込みます。

Launchpadに表示されたらOKです。

## Ubuntuのダウンロード

:::note warn
今回紹介する方法はちょっと動作が重いですが、インストールは一番簡単なので手っ取り早く試したい時に活用してください。
:::


https://jp.ubuntu.com/download

上記リンクからUbuntuをインストールします。今回私はUbuntu Desktop 22.04.3 LTSをダウンロードしました。

## 仮想マシンの作成

新規仮想マシンの作成→エミュレート→Linuxを押します。

選択から先ほど落としたISOを選択します。その他の選択ボックスは弄らずにそのままOKを押します。（ごめんなさいスクショ撮り忘れました。）

次のページ以降でハードウェアからメモリ割当量を設定します。私のMacは24GBあるので贅沢に8GB割り当てました。同様にストレージも設定します。

![スクリーンショット 2023-12-18 2.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/363cc071-724a-f80e-65fb-5ad5e5849339.png)

このような画面になります。再生ボタンを押すと起動するので、Try or Install Ubuntuを押します。

![スクリーンショット 2023-12-18 2.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/e212531b-8beb-76ea-b180-a6b5eb288a67.png)

しばらくブラックアウトが続きますがそのままにしておきます。

![スクリーンショット 2023-12-18 2.45.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/97a7769e-c541-97e2-b03b-0caa8edb3c11.png)

この画面になったらいつも通りInstall Ubuntuするだけです。

## 感想

ちょっと重いです。調べたらARM版のUbuntu（デスクトップ版ではない）をインストールしてからubuntu-desktopを入れるほうが良さそうな感じがしますが、一応できるという報告をこちらでしておきます。　

2023/12/19追記 上記方法も試しました。絶対ARM版の方がいいです。速い
正規表現ゲームをやってみた【~チートシートを添えて~】

## はじめに
私は「正規表現」と聞くと「ああ、メールアドレスとかのアレね」くらいの知識しかなく、「なんか難しいくてややこしいやつ」という感じで避けてました。
先日、職場のエンジニアとのペアプロの際に特定の文字列を探している時に、「正規表現使えばもっと早く探せますよ」と言われて、正規表現のゲームを紹介されたのでさっそく遊んでみました。

https://gametsukurukun.com/regexp-puzzle/

チュートリアルでは「ウォーターサーバー」と「ウォータサーバー」などの表記ゆれを例に出し、そういった場合でも「ウォーター?サーバー?」と入力すれば表記ゆれもマッチして検索できる、という様な感じで分かりやすく説明してくれます。

実際のパズルは全35問ですが、途中から難易度が上がってきて現時点で私は10問しか解けてません…
（競技プログラミングなどが好きな人はスラスラ解けるかもしれないです）

Qiitaでも過去に正規表現のゲームを作成した内容をかかれた記事がありますね。

https://qiita.com/yukiHaga/items/8ef2051036e126eb00c6

少しだけプレイしましたが、こちらも面白いのでパズルを終わらせたら次はこっちにも挑戦しようと思います。

正規表現に興味がでて、書籍の方でもちゃんと理解しようと思って初心者向けの本を購入しましたが、めちゃめちゃ分かりやすいです。


https://www.amazon.co.jp/dp/B08L4FDS86?_encoding=UTF8&psc=1&ref_=cm_sw_r_cp_ud_dp_KE8076THZPVRQBC4KC6W

レビューの評価も高く、まさに正規表現に入り口にはふさわしい内容です。

## チートシートを書いてみました

記憶の定着も兼ねて書籍を参考にチートシートを自作しました。

|記号|意味|
|:--|:--|
|.（ピリオド）|何か1文字にマッチ|
|[◯◯]|どれか1文字にマッチ<br> 例：[花狐]火→花火、狐火、引火の場合「花火」と「狐火」にマッチ|
|[^◯◯]|これ以外の1文字にマッチ<br> 例：[^花狐]火→花火、狐火、引火の場合「引火」にマッチ|
|[◯-◯]|この範囲の1文字にマッチ<br> 例：[2-4]位→1位〜9位の場合「2位」「3位」「4位」にマッチ|
|\d|半角数字にマッチ<br> 例：\d→2024年アドベントカレンダーの場合「2024」にマッチ|
|\D|半角数字以外にマッチ<br> 例：\D→2024年アドベントカレンダーの場合「年アドベントカレンダー」にマッチ|
|\w|半角英数字にマッチ<br> 例：\w→2024年Advent Calendarの場合「2024 Advent Calendar」にマッチ|
|\W|半角英数字以外にマッチ<br> 例：\W→2024年Advent Calendarの場合「年」と半角スペースにマッチ|
|\s|空白（半角スペース,タブ,改行,キャリッジリターンに）マッチ<br> 例：\s→2024年Advent Calendarの場合「Calendar」の前の半角スペースにマッチ|
|\S|空白以外にマッチ<br> 例：\S→2024年Advent Calendarの場合「2024年Advent Calendar」の半角スペース以外の全てにマッチ|
|◯｜●|どちらかの表現にマッチ<br> 例：ラーメン｜焼肉→ラーメン、寿司、焼肉、ハンバーガーの場合「ラーメン」と「焼肉」にマッチ <br> （｜を半角にするとテーブルセルの区切り線になってしまうので全角で書いてます。本来は半角です）|
|^|先頭位置にマッチ<br> 例：^.巻紙→赤巻紙 青巻紙 黃巻紙の場合「赤巻紙」にマッチ|
|$|末尾位置にマッチ<br> 例：.巻紙$→赤巻紙 青巻紙 黃巻紙の場合「黃巻紙」にマッチ|
|*|0回以上の繰り返しにマッチ<br> 例：許さー*ん→許さん、許さーん、ゆるさーーーーんの場合、ーが0回以上なので全てにマッチ|
|+|1回以上の繰り返しにマッチ<br> 例：許さー+ん<br>許さん、許さーん、ゆるさーーーーんの場合、ーが1回以上なので「許さん」以外はマッチ|
|?|あってもなくてもマッチ<br> 例：girls? <br>girl、girls、boy、boysの場合、girlとgirls両方マッチさせたい場合に使用。結果、末尾にsが無いgirlにもマッチ|
|{n}|n回の繰り返しにマッチ<br> 例：第\d{4}回 <br>第1回、第002回、第0003回の場合、数字が4回繰り返している「第0003回」にマッチ|
|{n,}|n回以上の繰り返しにマッチ<br> 例：\w{6,} <br>father、uncle、daughterの場合、英数字が6回以上繰り返している「father」と「daughter」にマッチ|
|{n,m}|n回以上m回以下の繰り返しにマッチ<br> 例：¥\d{1,3},000 <br>¥100 ¥1,000 ¥999,000 ¥1,234,000の場合「¥1,000」と「¥999,000」にマッチ|

## 参考（チートシートはこっちの方が分かりやすいかもです…）

https://qiita.com/tossh/items/635aea9a529b9deb3038

https://www.mlab.im.dendai.ac.jp/~yamada/java/regex/

https://wa3.i-3-i.info/word11309.html
技術系サークル復活させてみた

この記事は、[海洋大技術系サークル Adevent Calender 2023](https://qiita.com/advent-calendar/2023/kaiyo-tech)の17日目です。

# 1. はじめに
プログラミングサークルNePPで運営をしていました、大学生です。
2022年頃から、大学の技術系サークルNePPの活動を本格的に再始動させ、運営を行ってきました。
今回は、運営の振り返りをしていきます。

もう1人の運営同期も活動について振り返っていますので、ぜひこちらを参照してください。
https://qiita.com/Mayachiu/items/336f265d94513e1c5f47


# 2. そもそもNePPとは？
NePPとは、海洋大生による技術系サークルです。
ちなみに、NePPの由来は以下からきています。
- 『NeP』P：舵を切る
    『NeP』は「Neptune」の意味。大海原で航海をするように、自由な発想で自ら舵を切り、やりたいことを探求していこう！
- N『e』PP：ワクワクする
    『e』は「exciting」の意味。ワクワクしながら笑顔で活動を楽しもう！
- NeP『P』：武器を増やす
    『P』は「programming」の意味。プログラミングという武器を増やし、社会に必要とされる人材になろう！ 

# 3. 加入した当初
元々、NePPは私たちの代ではなく先輩方によって結成されました。しかし、私たちが入学した頃には引き継ぎがうまくいっておらず、当時現役生で在籍されていた先輩は2名ほどという状況でした。
私は、その内の1人の先輩に誘っていただきこのサークルに加入することになりました。
しかし、加入した当初、全体で活動は行っておらずサークルとしての活動機会はありませんでした。
そこで、所属されていた先輩やOBの方に声をかけ、プログラミングのいろはやインターンシップの存在について教えていただきました。
(この時の経験がなければ今の自分はないといっても過言ではありません、ありがとうございます！)


# 4. 再始動のきっかけ
加入してから一年が過ぎた頃に、とあるインターンシップに参加しました。
そのインターンシップで、1人で開発するよりもチームで開発に取り組んだ方がより多くの学びが得られることを実感しました。
例えば、チーム内のふとした会話で自分の知らない技術領域に興味が出るきっかけになったり、他人と同じ技術領域であればコードレビューの中でよりパフォーマンスの良い書き方を知ることができたり、開発の中で困ったことを共有できることで心理的安全性が確保される等々といったことです。
この経験をきっかけに、自身の所属するサークルでも上記のインターンシップで経験した環境を再現したいと考えました。

# 5. 再始動、そして挫折
上記の経験を踏まえ、同期のプログラミング仲間に声をかけ、2022年4月にNePPが再始動しました。
Xで広報活動を行い、数名新入生が加入してくれました。
最初は手探りで、何をやればいいかわからなかったので、みんなで競技プログラミングに取り組むといったことを行っていました。しかし、新入生のほとんどがプログラミング初心者だったこともあり、参加人数は集まらず数回で終わってしまいました。(当時の新入生、状況を把握せずに運営して申し訳ないです、、、。)
これにより、サークル活動に参加する人数が激減し、運営側も就活が始まって忙しくなり、、、といった感じでまたサークルは元の活動しない状況に戻ってしまいました。

# 6. 次こそ再再始動
そんな状況のまま、秋に差し掛かった頃でした。自分の就活を進めていく中で、4でお話ししたインターンシップに参加した頃の思いをふと思い出しました。
「ここで諦めてしまってはインターンで経験したコミュニティ活動の大切さを後輩に伝えきれずに終わってしまう！」と思いを改め直し、同期に協力を仰ぎ、もう一度サークルとして活動を再開しました。
前回の反省を踏まえ、後輩がサークルに求めていることややってみたいことについて1人1人にヒアリングを行いました。
すると、我々運営サイドが新入生にやってもらおうと考えていたことと新入生のやりたいことに齟齬があったことがわかりました。(現状の課題原因の確認大事！)
すぐに、運営は、新入生が簡単にWebアプリを作成できるフレームワークの勉強会を開催し、新入生のモチベーションの向上に繋がりました。
その後、新入生の1人は、実務型のインターンに参加できるくらいのレベルまで成長しました。


# 7. 再再始動から現在
今年は、去年の反省を生かして新入生向けにPythonやGitについて解説する勉強会を開いたり、サークル内でチームを作ってハッカソンに参加したり、新入生の進捗確認を1週間に1回行ったり、サークルでアドベントカレンダーを書いたりなどの活動を行ってきました。
新入生向けの活動を中心に行った為か、次々に口コミで新入生が増え、現在は、2桁のメンバーが活動するほどになりました。
そして、今年加入してくれたメンバーは、かなりの強者揃いで運営側も日々刺激を受けています。



# 8. まとめ
授業や実験、アルバイト、他のサークル活動などやることが沢山ある中で、サークル活動の活性化を行うのは中々難しいです。しかし、そんな困難を乗り越えてプログラミングを一緒に学べるコミュニティをNePPで実現できたので、諦めずに運営をしてきてよかったと感じています。
今後も、「このサークルに参加したからこんなに成長することができた！」と言われるようなコミュニティにできたらなと思います。
Apple Silicon環境でJekyllをDockerで動かせないときはRosetta2を入れる

## TL;DR

Rosetta2いれたら大体治る

## Rosetta2とは？

Intel Macのみ対応しているアプリケーションをApple Siliconで実行できるようにする翻訳アプリみたいなもの。

Apple Silicon登場まもない時はもはや必須だったのでみんななんだかんだでインストールしていたが、最近はアプリケーションの対応状況が良く存在が忘れられがち。

https://support.apple.com/ja-jp/guide/security/secebb113be1/web

## 具体的にどんなエラーが起きたか？

こちらの記事を参考にDockerでJekyllを立ち上げようとしたが失敗した。

https://zenn.dev/daikichidaze/articles/f499df5317335b

```
% docker-compose up

（中略）

[+] Running 3/2
 ✔ Network blog_default                                                                                                                                          Created0.0s jekyll  Creating                                                                                                                  0.3s 
 ✔ Container local_jekyll                                                                                                                                        Created0.4s 
 ! service_jekyll The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested 0.0s 
Attaching to local_jekyll
local_jekyll  | ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl]

（中略）

local_jekyll exited with code 1
```

要するにプラットフォームが違いますぜお兄さんって言われてます。

## 解決策

そりゃぁそうって感じですがRosettaをインストールします

``` zsh:
% softwareupdate --install-rosetta
I have read and agree to the terms of the software license agreement. A list of Apple SLAs may be found here: https://www.apple.com/legal/sla/
Type A and press return to agree: A
```

Aと打ってreturnキーを押します。

そしてdocker-compose.ymlに以下を追記します

```docker-compose.yml
    platform: linux/amd64
```

これでApple Silicon関連のエラーは消えると思います。

## 終わりに

まだDocker初心者なのでおかしなこと書いてたら教えてください。
LEGO Education SPIKE をPythonでプログラミングする ～その２～

## はじめに
　この記事は、「LEGO Education SPIKE をPythonでプログラミングする ～その１～」の続きです。

https://qiita.com/cyber-yuito723/items/9c5ec2e70437b4f7f23c

## モーターモジュール
### `run`関数
　以下のように使います。
```python
import motor
from hub import port

motor.run(port.A, 1000)
```
　引数にモーターが接続されいるポートと速度の値を渡してあげます。

### `stop`関数
　以下のように使います。
```python
import motor
from hub import port
import time

motor.run(port.A, 1000)
time.sleep(3)
motor.stop(port.A)
```
　引数にモーターが接続されいるポートを渡してあげます。

## モーターペアモジュール
### `move`関数
　以下のように使います。
```python
import motor_pair
from hub import port

motor_pair.pair(motor_pair.PAIR_1, port.A, port.B)
motor_pair.move(motor_pair.PAIR_1, 0)
```
　`pair`関数でペアを指定した後、引数にペア名とステアリングの値（まっすぐ進むなら`0`）渡してあげます。

### `stop`関数
　以下のように使います。
```python
import motor_pair
from hub import port
import time

motor_pair.pair(motor_pair.PAIR_1, port.A, port.B)
motor_pair.move(motor_pair.PAIR_1, 0)
time.sleep(3)
motor_pair.stop(motor_pair.PAIR_1)
```
　引数にペア名を渡してあげます。

## ランループモジュール
### `run`関数
　以下のように使います。
```python
import runloop
```
　`asyncio`（`async`や`await`）の代わりのような機能を提供するみたいです。

### `sleep_ms`関数
　以下のように使います。
```python
import runloop

runloop.sleep_ms(3000)
```
　引数に停止する時間（ミリ秒）を渡してあげます。

## おわりに
　SPIKEのApp3のPythonはまだ機能面で未熟なところがあると思います。これから改善されることを切に願います。また、SPIKE関連の記事を他にも書いています。

https://qiita.com/cyber-yuito723/items/bdc1f54a35aa59ebd390

https://qiita.com/cyber-yuito723/items/2346b5d068aa5d7ea6e5
PowerPointの画面切り替え-変形-で遊ぶ

## 背景

社会人になって，パワーポイントで資料を作るようになったが，
作る資料は進捗報告や日報の作成のみで，アニメーションや画面切り替えをするスライドを作る機会や場面が少なくなってしまった．

代表的な画面切り替えとして，フェード(じんわりと変わる)やプッシュ(フリップのような奴)などがあるが，変形という特殊なものがある．

一般的な画面切り替えは，スライド全体に変更を加えてスライドを進めるのに対して
変形は，**文字や図形に変更を加えて**スライドを進める．

昔軽く使っていたものの，このままだと忘れそうなので備忘録として残しておく．

::: note warn
今回使用するPowerPointのバージョンは，
Microsoft® PowerPoint® for Microsoft 365のバージョン2311である．
買い切りのPowerPointやバージョン違いだと機能が無い可能性がある．
:::

## 画面切り替えについて

画面切り替えは1枚目から2枚目に遷移する際のエフェクトである．
そのため，設定するためには最低2枚のスライドが必要になる．
また設定する対象は，**遷移後のスライド**であることに注意．　
(2枚目に設定すると，1~2枚目で発動，5枚目に設定すると，4~5枚目で発動)

## 画面切り替えの「変形」とは

画面切り替えの前後のスライドで同じオブジェクトがある場合に，
前のスライドのオブジェクトを移動・変形させて次のスライドに移動させる画面切り替えである．

文章では伝えずらいので見たほうが早い．

![henkei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/3638b6ae-0224-5239-6d00-5a52b42ab492.gif)

1枚目と2枚目のスライドのオブジェクトで共通しているのは円のみである．
変形の画面切り替えを実行してみると，共通している円がスライドして2枚目のスライドでそのまま利用されるような表示になる．

:::note warn
共通部分ではないオブジェクト (gifでいうとテキストボックスや四角・三角の図形)は，必ず**フェード**で遷移するようになる．
:::

変形の画面切り替えにおける「効果のオプション」では，
**移動させるもの**を指定することができる．(gifはオブジェクトを指定)

オブジェクトが一番厳しく，単語， 文字 の順番で条件が緩くなる．


### 効果のオプション比較

![henkei2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/8ce1e8a1-65f3-da92-532c-52921452f01e.gif)


## 実用例

### 部分引用

会社の説明会とかで，会社のスローガンが何かの頭文字をとった何かとかよくある．
動画編集せずに，こんな感じで「ここからもってきましたよ」っていう表現を作れたりする．

![reiwa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/736a74ad-664f-ece0-c372-9dae912c27fa.gif)

### 図の一部を説明

環境図などデカい全体像の図を説明するとき文字サイズを小さくしたり困る時が多い．
そんな時はいっそ，2つのスライドを分けてしまえばよい．

2つのスライドをつながっているように見せることで，「全体部のうちここを説明してる」がスライドデザインだけで表現できる．

![ankou.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/cdbc21cf-ea9b-9d7d-a26c-d527401f67f5.gif)

泡の部分は応用で作ってみた．

小さい泡を早く動かしたいのであれば，動く幅が大きくなるように他のオブジェクトよりも縦長で作成する．すると，大きい泡と速度が変わり奥行き感のようなモノが出る．
(本当の遠近法だと大きい泡を早く動かすんですけどね...)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/4c392d89-1761-f65b-5153-64bf891d69d8.png)

## まとめ

PowerPointの画面の切り替え機能のうち変換で遊んでみた．

機能としてはなかなか派手なので，日常使いできるものではないが，
遊び心が沸いたり，それが許される時に全力を出してみようと思う．
リファクタリングって、なあになあに


## リファクタリングとは

アプリケーションは、ソースコードでできている


アプリケーションの処理、機能、挙動は変えたくないが、

ソースコードの読みにくさ、分かりにくさは、変えたい

そんな時に、リファクタリングを行う

つまり、アプリケーションの動きを変えずに、ソースコードを良くする（改善する）手法/技術
Cloudflare D1 に入門してみる

## 参考

https://developers.cloudflare.com/d1/get-started/

## Workerを作成する

[前回](https://qiita.com/RuruCun/items/017aa47eabab6bfef67f#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)作成したWorkerを使いまわします。

## D1データベースを作成します

`wrangler d1`コマンドを叩いて、データーベースの名前を決めて作成します。

```sh
$ npx wrangler d1 create <DATABASE_NAME>

✅ Successfully created DB '<DATABASE_NAME>'

[[d1_databases]]
binding = "DB"
database_name = "<DATABASE_NAME>"
database_id = "<unique-ID-for-your-database>"
```

## WorkerをD1へバインディングする。

WorkerがD1に接続するにはバインディングを作成する必要がある。
`wrangler.toml`を更新して、バインディングします。

先程作成した、DBの名前と、作成後に表示されるUniqueIDをコピーして更新します。

```sh
[[d1_databases]]
binding = "DB" # available in your Worker on env.DB
database_name = "<DATABASE_NAME>"
database_id = "<unique-ID-for-your-database>"
```


## D1に対してクエリを叩く

下記のTABLEをつくる`schema.sql`ファイルをプロジェクトに追加します。
顧客ID/企業名/顧客名を持ったCustomersテーブルの作成と、ダミーデータを入れるSQLです。

```sql
DROP TABLE IF EXISTS Customers;
CREATE TABLE IF NOT EXISTS Customers (CustomerId INTEGER PRIMARY KEY, CompanyName TEXT, ContactName TEXT);
INSERT INTO Customers (CustomerID, CompanyName, ContactName) VALUES (1, 'Alfreds Futterkiste', 'Maria Anders'), (4, 'Around the Horn', 'Thomas Hardy'), (11, 'Bs Beverages', 'Victoria Ashworth'), (13, 'Bs Beverages', 'Random Name');
```

下記を叩いてローカルのDBへ`schema.sql`のクエリを実行します。

```sh
npx wrangler d1 execute <DATABASE_NAME> --local --file=./schema.sql
```

クエリを実行後、下記のコマンドでSQLを叩き、DBが正常に作られたかを確認します。

```sh
npx wrangler d1 execute <DATABASE_NAME> --local --command="SELECT * FROM Customers"
```

## Workerでクエリを実行する

`index.ts`ファイルを下記のサンプルコードへ書き換えます。

```tsx:src/index.ts
export interface Env {
  // If you set another name in wrangler.toml as the value for 'binding',
  // replace "DB" with the variable name you defined.
  DB: D1Database;
}

export default {
  async fetch(request: Request, env: Env) {
    const { pathname } = new URL(request.url);

    if (pathname === "/api/beverages") {
      // If you did not use `DB` as your binding name, change it here
      const { results } = await env.DB.prepare(
        "SELECT * FROM Customers WHERE CompanyName = ?"
      )
        .bind("Bs Beverages")
        .all();
      return Response.json(results);
    }

    return new Response(
      "Call /api/beverages to see everyone who works at Bs Beverages"
    );
  },
};
```

## ローカルで開発する

`wrangler dev`を実行し、ローカルでテストします。
`localhost:8787/api/beverages`を開くと、ブラウザに`SELECT`した下記の結果が表示されます。
`Call /api/beverages to see everyone who works at Bs Beverages`

```sh
$ npx wrangler dev
```

## DBのDeploy

先程使用した、`schema.sql`を使用してデータベースへテーブルを作成します。

```sh
npx wrangler d1 execute <DATABASE_NAME> --file=./schema.sql
```

ローカルでテストしたときと同様に、SELECT文を叩いて、動いているかどうか確認します。

```sh
npx wrangler d1 execute <DATABASE_NAME> --command="SELECT * FROM Customers"
```

最後に先程実装したWorkerをデプロイして、URLからDBを叩けるようにします。

```sh
npx wrangler deploy
```

`https://<WORKER_NAME>.<YOUR_SUBDOMAIN>.workers.dev/api/beverages`へアクセスすると、D1を叩いた結果がローカルと同様に表示されます。
AntiX LinuxをUEFI環境にぶち込んだ話

学校企画のアドベントカレンダーの一環としてこの記事を書いている。
また、LinuxもQiitaも**ド**初心者の記事であることを念頭に置いて読んでいただきたい。

# あなたは軽いOS、好きですか？
私は大好きだ。
私の学校で使っているノートパソコンはRyzen5!!メモリ16GB!!というところまでは完璧なのだが、なんと容量が**128GB**しかない。USBメモリの128GBが千円程度で買えるこの令和の時代、メインストレージが128GBしかないのは心もとない、というか足りない。しかも最近のWindowsはOS領域だけで30GB近く容量を食ってしまう。かといってストレージを換装するために分解して保証をないがしろにしたくない。
そこで思いついたのがLinuxを使用することだ。LinuxはプリインストールされているアプリがWindowsに比べて少なく、OS自体の容量が軽い。しかも学校で使うPCとしてはVSCodeとブラウザが使えればなんとかなるので、Linuxでも事足りる。
様々なディストリビューションがある中でAntiXを試してみようと思った理由としては、OS自体の容量がとても小さいこと、リソースの消費量が少ない方がバッテリーに優しいと考えたからだ。

# とても簡潔なPCスペック
今回は試用のため、USBメモリへインストールした。また、万が一の事を考えて検証用のPCで作業している。

機種：VersaPro VC-B
CPU：Ryzen 5 5500U
メモリ：16GB
SSD：128GB

検証用機
機種：ThinkPad L440
CPU：Core i5 4210M
メモリ：6GB（4+2）
SSD：240GBぐらい

# ダウンロード
AntiXのサイト (https://antixlinux.com/) からisoファイルをダウンロードし、USBメモリに書き込む。今回はVentoyを使用。また、今回はbase版をダウンロードした。

# 問題発生
しかし、この記事の主題であるUEFIインストールが**できない。**
他の有名なディストリビューションならググればすぐ解決方法が出そうなものだが、このディストリビューションは超軽量という性質上、古く、性能の低いPCにインストールされることが多い。つまり、ネット上にある情報は**ほとんどがレガシー環境でのインストール**、ということだ。

# 原因を探す
最初はデスクトップに表示されているインストーラーでインストールを試みた。しかし、インストールに失敗したため、cli-installerを使用してみた。その際もUEFIインストールに失敗したが、エラーを見ると
```console:
modinfo.sh doesn’t exist.
```
のようなエラーが発生していることが分かった。

# 原因
どうやらGrubのインストール時に必要なファイルが不足しているようだ。ネットワーク接続後、以下のコマンドを使ってインストールする。

```console:
# apt update
# apt upgrade -y
# apt install -y grub-efi-amd64
```
*demoのパスワードはdemo

その後、fullもしくはbase版ならデスクトップにあるインストーラーを、core版ならcli-installerの指示された手順通りに進めればインストールできる(はずだ)。

# 実際にインストールしてみて
下馬評通りとんでもない軽さだ。Windows10(ver.22H2)のメモリ使用量はクリーンインストール後で約3.6GB程。それに対してこのAntiXは**約360MB**。単純計算で10分の1である。その上、ストレージの消費は数GBで済んでいる。非常に優秀だ。
ただ、UI等を含めた総合的な面で見ると微妙に感じる部分もあったため、メインで使うかは考えどころだ。古いPCを再利用する際や、カスタムするベースにするにはピッタリだと感じた。

**追記**:CPUベンチマーク(Geekbench 6)やってみた

Windows10:
![IMG_20231209_205759.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637922/a73e0e3b-d10f-a1f5-0f1d-5ea8a03a6097.jpeg)

AntiX:
![IMG_20231209_205818.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637922/b60d1a79-c51e-7de5-05af-7206baf144fd.jpeg)

シングルで4パーセント、マルチで7パーセント程度の性能差が見られた。

**追記2**:AntiXの親戚（らしい）MX Linuxをインストールしてみたが、なんやかんやで満足してしまった。十分軽量で、私のようなLinux初心者には扱いやすい。問題が出なければこのまま使い続ける予定だ。

# 余談
先日、このような記事が目に入った。(https://gigazine.net/news/20231205-gaming-focused-linux-operating-systems-beat-windows-11/) 
PCゲーム市場が広まるにつれ、今まで主流だったWindowsに比べ、低価格化を進めることが出来、かつゲームの最適化もされつつあるLinuxは見逃せない存在になる可能性がある。
現状はまだまだ先になりそうだが、私も一人のPCゲーマーとして動向を見守りたい。
GPTs Builderを用いて大学のキッチンカーアプリを構築する方法

# Qiita記事

こんにちは、watnowのアドベントカレンダー18日目を担当させてもらいます！！

来週はクリスマスや〜🎅🎄🎉🎁

# はじめに

今回は、GPTs Builderを使って大学のキッチンカーアプリをできるのか試していきたいと思います！



:::note info
**どういったことをするのか？**

初めてGPTsを使用するため、何ができるか試しています。

GPTsを用いてアプリとして機能させることができるのか？

後は、GPTに頼る！
:::

# GPTsとは
GPTsとは、ChatGPTを目的に合わせてカスタマイズできるサービスです。

GPTsは、ノーコードで簡単に作成できるので、プログラミングの知識がなくてもオリジナルのChatGPTを作ることができます。

詳細は以下のリンクからご覧いただけます。

https://qiita.com/akiraokusawa/items/774a66938678990eba56

<font color="red">※GPTsは、ChatGPT Plusという有料プランに登録しているユーザーしか利用できません。<font>

# 1.流れ
まず、スケジュール情報とキッチンカーの詳細情報のデータベースを作成します。

GPTs Builderに渡すためのデータはjson形式で提供するため、jsonファイルを作成します。

>学校のサイトからキッチンカーのスケジュールをスクレイピングしようとしましたが、パスワードが必要でスクレイピングが成功しませんでした、、、🥲

データベースは以下のようにコピーしてGPTに作成させます！
![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971960/c67c2dcb-bced-8f6a-dde2-17c21e15008f.png)


一方、詳細情報は問題なくスクレイピングできました。
```ruby:carlist.json
{
"店名": "AAC marke",
"メニュー": "チーズステーキサンド、ミネストローネ",
"キャッシュレス決済": "PayPay, LINE Pay 他"
},
```
それから、GPTs Builderに2つのjsonファイルを提供します。ここでアイコンの設定や役割・名前をカスタマイズできます！

### 2.完成したのがこちら✏
https://chat.openai.com/g/g-9GZ0v9v0b-ritsulunchgpt

![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971960/498584d5-a88c-42c7-1d42-b53a7d5dfc7b.png)
最終調整で、濃い口の関西風な喋り口調に設定しました笑![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971960/249609aa-3961-3f5c-bebf-2229296b0eac.png)

カレンダー情報と店舗情報は別々のJSONファイルから取得し、店舗のメニュー情報を結合して表示していますね！すごい！

# 最後に

この記事では、GPTs Builderを使ってアプリを作成するプロセスを紹介しました。自然言語処理の魅力を活かして面白かったです。最後までお読みいただき、ありがとうございました！

watnowのアドベントカレンダーまだまだ続くのが楽しみですね〜ﾜｸﾜｸ🎄