OmniAICreator/Qiita-1.07M huggingface dataset:
cron pmsetでmacを自動起動 スリープ　シャットダウン

# はじめに

指定した時間にcronに処理を実行させるためには、macを起動していなければならない。
そのため、pmset、cronを用いてmacの自動起動、シャットダウンを設定した。
作業を記録する。

# 作業内容
1. macのスクリーンセーバー機能を全てoff、ディスプレイがoffになった後パスワードを要求しないようにする。
自動で動かしているプログラムが起動している時にスクリーンをoffにしないため、起動した後にロックがかからないように設定。
(共有スペースにpcを置く必要があるひとはやらないほうがいい)
システム設定> ロック画面で設定

2. 自動ログインユーザーを設定
pmsetでpcを起動したのち、自動でログインするため。

https://support.apple.com/ja-jp/102316

3. 「操作がなければ自動的にログアウト」をoffにする。
自動で動かしているプログラムが起動している時にログアウトをしないために設定。

4. cronで自動起動、シャットダウンを設定する。
この時、root権限でログインしたのち、cronで設定する。
自動起動、シャットダウンはroot権限でないとうまく実行されない。


```
//root権限ではいる
sudo su

//cronを開く
crontab -e

0 20 * * * sudo pmset repeat wakeorpoweron MTWRFSU 23:50:00
30 22 * * * /sbin/shutdown -h now
0 0 * * * sudo pmset repeat wakeorpoweron MTWRFSU 11:50:00
15 2 * * * /sbin/shutdown -h now
0 12 * * * sudo pmset repeat wakeorpoweron MTWRFSU 19:50:00
0 14 * * * /sbin/shutdown -h now

```
11:50に自動起動→14時にシャットダウン→19：50に起動→22:30にシャットダウン
→23:50に自動起動→2:15分にシャットダウン
あとはループ

### 大切なポイント
シャットダウン、起動に関するcronはroot権限で設定する
pmsetで登録できるスケジュールは一つのみ
shutdounは```/sbin/shutdown ```をつけないとシャットダウンできない








# 参考
https://ohenziblog.com/pmset-method/

https://gift-by-gifted.com/mac-schedule/

https://qiita.com/sanmo3/items/b21942f58430310482e6
ASP .NET Core Tips - デバッグ時にIPアドレス指定でWebアプリにアクセスする

# 概要
ASP .NET CoreでWebアプリを作ってデバッグしているときに、
LAN上のクライアントからアクセスさせたくて・・・。

IPアドレス指定でWebアプリにアクセスできるようにした際の
Visual Studioの設定に関する備忘録。

# 環境
・Visual Studio 2022
・ASP .NET Core
・.NET 7

# 手順
Visual StudioでWebアプリのプロジェクトを開いた後、
リボン上にある実行ボタンの隣にある「▼」をクリックして、
表示されたメニューからデバッグプロパティを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f6cccb7a-1cdd-32e5-2398-7b413c1a4f0d.png)

以下のようなダイアログが表示されるので、
左側でhttpのタブを選択し、アプリのURLの欄の「localhost」と記載されている個所を
Webアプリをデバッグ実行するPCのIPアドレスに書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/2dba29e6-19cb-1a5c-7537-193347408195.png)

変更したら、「プロファイルの起動」ダイアログを閉じます。

再度、実行ボタンの隣にある「▼」をクリックして、
「http」を選択し、デバッグ実行してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/53f73a41-9431-1d67-79f8-b1bbc329eafa.png)

ブラウザが立ち上がってきます。
以下のようにIPアドレス指定でアクセスできることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/911e20d0-6128-ee71-e5e6-409beca8ff61.png)

起動時にファイアーウォールの警告が出た場合は、
アプリが通信できるように設定を行ってください。

# 注意点
Webアプリを実行するPCが、
・DHCPからIPアドレスを取ってきている場合
・違うLAN環境で実行した場合
などで、IPアドレスが変わってしまったのを気付かずに実行すると、
「要求したアドレスのコンテキストが無効です。」
という例外が発生します（汗）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/20357105-540e-676c-95d9-c20c97b88a8a.png)

お気を付けください。
JSライブラリSwiperを使用した要素を横スクロールを実装する方法

<h1>JSライブラリSwiperを使用した要素を横スクロールを実装する方法</h1>

<a href="https://b-risk.jp/blog/2022/04/swiper/">【v8】Swiperの使い方・実用的なデモ15個の解説 ー基礎から応用までー</a>

<a href="https://swiperjs.com/get-started">Getting Started With Swiper</a>

<a href=""></a>

<a href=""></a>

<a href=""></a>

<a href=""></a>

<a href=""></a>

<a href=""></a>
JavaScript実装とエラー対象法、Chromeでの確認方法

<h1>JavaScript実装とエラー対象法、Chromeでの確認方法</h1>
<a href="https://www.javadrive.jp/javascript/event/index7.html#google_vignette">イベントハンドラを登録するコードの記述位置に関する注意と対処方法</a>

<a href="https://onishi-noboru.com/how-to-use-javascript-on-chrome-dev-tools">【超簡単】ChromeでJavaScriptの動作確認を行う方法【プログラミング】</a>
<a href=""></a>
<a href=""></a>
<a href=""></a>
<a href=""></a>
<a href=""></a>
<a href=""></a>
<a href=""></a>
<a href=""></a>
pgAdminからPostgreに接続しようとしたら「'ServerManager' object has no attribute 'user_info'」というエラーが出た

[こちら](https://qiita.com/youth_case/items/f59390399676167495d3)で環境構築したデータベースをpgAdminで接続しようとしたところ、下図のエラーが発生し、接続できませんでした。
こちらについて対処いたしましたので、記事に起こしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/25278d21-bfd8-5ce8-a255-474e3b33e098.png)

# 対処法
結論から申し上げますと、pgAdminを最新バージョンである7系統にアップグレードすることで解決できました。
なので、ymlファイルを以下のように修正します。
```yml:docker-compose.yml(変更前)
pgadmin:
    image: dpage/pgadmin4:5.2
    volumes:
      - pgadmindata:/var/lib/pgadmin4/storage
    environment:
      PGADMIN_DEFAULT_EMAIL: your_mailaddress@example.com
      PGADMIN_DEFAULT_PASSWORD: password
      TZ: Asia/Tokyo
    depends_on:
      - postgres  
    ports:
      - "5050:80"
```
```yml:docker-compose.yml(変更後)
pgadmin:
    image: dpage/pgadmin4:7.5
    volumes:
      - pgadmindata:/var/lib/pgadmin4/storage
    environment:
      PGADMIN_DEFAULT_EMAIL: your_mailaddress@example.com
      PGADMIN_DEFAULT_PASSWORD: password
      TZ: Asia/Tokyo
    depends_on:
      - postgres  
    ports:
      - "5050:80"
```
# 原因
原因はPostgreSQL15では”pg_database”データベースの”datlastsysoid”カラムが削除されたことによるものとのことです。

# 参考文献
[pgAdminで接続時に’ServerManager’ object has no attribute ‘user_info’エラーが発生](https://ufirst.jp/memo/2022/11/pgadmin%E3%81%A7%E6%8E%A5%E7%B6%9A%E6%99%82%E3%81%ABservermanager-object-has-no-attribute-user_info%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F/)
flutterのadmobのサンプルが動かない

# 解決策
1. pubspec.lockを削除
1. accentColorを検索
1. 行ごとコメントアウト

# リンク
https://codelabs.developers.google.com/codelabs/admob-ads-in-flutter?hl=ja#1
https://github.com/googleads/admob-ads-in-flutter
擬似言語プログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/44fc7f6e-01b2-5bfb-fc2f-415edef5ea58.png)
１：逐次遂行
　プログラムは、原則として先頭から順に命令を実行します。プログラム１を実行すると
 ①起床する。②朝食を食べる、③家を出るの順に処理を実行します。擬似言語プログラムでは、処理の詳細について考えなくて良い場合は、関数（「手続き」とも言います。）を呼び出して済ませてしまいます。getup()などのように、（）がついている「命令のようなもの」は関数です。行番号１の行では、getup（）を呼び出すことで、「起床する」という動作を実現します。具体的にどのような処理によって、「起床する」のかは、ここでは考えなくて良いです。「希hそうする」という動作の結果だけに着目して、プログラム全体の流れを読み取ってください。
 　なお、関数は自由に作ることができます。問題ごとに様々な関数が登場しますので、問題文を丁寧に読んで、その都度、関するの動作を理解する必要があります。

  「プログラム１」
  （行番号）
  １：getup()           　　　　　　　//起床する
  ２：eat_breckfast   　　　 //朝食を食べる
  ３：leave_home()　　　//家を出る

  プログラム中の//以下の部分は、コメントです。プログラムを読みやすくするために、変数の役割や実行する処理の説明などを注釈して書きます。注釈部分は、あプログラムの一部とみなされないのいで、自由になんでも書けます。

２：条件分岐
　条件分岐処理には、if~endif命令を使います。下記が最も単純な使い方です。
 if(条件式)
  　条件式競辻に実行する処理
endif

if直後の（）の中に条件を指定します。条件が成立すると、ifからendifまでの間にある処理を実行します。条件が不成立の場合は、endif直後の行までスキップします。
　条件式は、原則的に日本語で表現しますが、問題によっては、、統合や不等号を利用した式になっているかもしれません。擬似言語は、実際のプログラム言語ではありませんから、細かい文法法則はなく、誤解のない範囲で自由に表記することができます。問題中では、誤解のないように表記していますから、常識的に問えられる必要があります。

 　プログラム２は、if~endifを利用したプログラム例です。プログラムを実行すると、起床して、八時より前であった場合には、朝食を食べずに家を出ます。
  　プログラム２の３行に注目してください。ifで指定した条件が成立すると、４行を実行します。指定した条件が不成立の場合、endifの直後（６行）までスキップします。

   「プログラム２」
   １：getup()　　　　　　　　　　　　//起床する
   ２：time　← get_current_hour()　　//現在時を取得し、timeに格納する
   ３：if (timeが８未満)
   ４：  eat_breakfast()　　//朝食を食べる
   ５：endif
   ６：leave_home()　　　//家を出る 

   if~endifとともに、elseやelseifを使う表記もあります。下記はelseを用いた表記法です。ifで指定した条件が成立するときには処理１を実行します。条件が不成立のときには処理２を実行します。処理１と処理２の両方が実行されることはありません。また、両方とも実行されないこともありません。必ず、どちらかが実行されます。
if（条件式）
   　　処理１（条件成立時の処理）
else  
   処理２（条件不成立時の処理）
endif
【ChatGPT無】情報源はどこ？


　どうも、カーブミラーです。

　今回は、ChatGPTの情報源を求めました。答えてくれましたけど……。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　今回も、
　　いつもの「スマホ熱中症」に
　　　ついて尋ね、その予測しての
　　　　回答をなんとか回避しよう
　　　　　としていました。

　まぁ、
　　結果は、
　　　確実な結果を得ることは
　　　　できませんでした。

　そんな中、
　　ChatGPTさんの
　　　知識の情報元は
　　　　どこなのだろう、と
　　　　　思い立ったわけです。

　その過程の
　　やり取りを
　　　ごらんください。
***
***User***
「スマホ熱中症」を教えてください。

\# 注意点
・説明する前に、必ず注意点を確認してください。
・この単語が、翻訳しても英語にない場合、日本独自の造語の可能性があります。その場合、そう言って、終了してください。
・この単語が、あなたの知識にない単語ならば、そう言ってください。
・この単語が、造語の場合は、そう言ってください。
・誤った情報を提供しないでください。
・情報の提供元を必ず教えてください。

***ChatGPT***
「スマホ熱中症」は、スマートフォンなどのモバイルデバイスを長時間使用することによって引き起こされる健康問題の一つです。これは、スクリーンを見続けたり、操作を続けたりすることで目の疲れや首や肩の筋肉の緊張が生じ、頭痛やめまいなどの症状が現れることがあります。長時間の使用により、運動不足や不適切な姿勢も影響を与えることがあります。

情報提供元: 一般的な健康情報としての知識。

***User***
健康情報とは？

***ChatGPT***
健康情報は、個人や一般の人々の健康に関する知識やアドバイスを指します。これは身体的健康、精神的健康、栄養、運動、疾患の予防や治療、薬物の使用、健康的な生活習慣、医療手続きなど、健康に関連するさまざまな側面に関する情報を含みます。健康情報は、医師、専門家、公衆衛生機関、健康ウェブサイトなどから提供され、人々が自分の健康を向上させたり、健康問題に対処したりするのに役立ちます。ただし、信頼性のある情報源から得られることが重要であり、医療専門家のアドバイスに従うことが大切です。

***User***
あなたの情報元をできるだけ教えてください。頼みます。

***ChatGPT***
私の情報源は、2022年1月までにインターネット上で広く利用可能なテキストデータ、文書、ウェブページ、本、学術論文、ニュース記事、FAQ、レビュー、技術文献などのテキスト情報です。具体的な情報提供元やデータベースの詳細情報は提供されておらず、私のトレーニングデータには多くの情報源から収集されたテキストが含まれています。したがって、私は広範な一般的な知識を提供できますが、特定の情報源や出典を特定することはできません。お手伝いできることがあればお知らせください。
***
　ということだそうです。

　まぁ、そんなの、
　　みなさんもわかっていますよね。

　今回は、ここまで。
Python3.8 から 3.10にあげたらpipコマンド使えなくなったんだが

## 経緯
- 環境をPython3.8 -> 3.10に
- アプリ開発で専用のapiを使うため、githubからパッケージのインストールするときに問題が起きた
```
$ python3 -V
Python 3.10.13
```

## 環境
- Ubuntu20.04 + Django4.2.7 (Python 3.10.13)

## エラー及び解決法➀
- pipコマンドたたいた時のエラー
```
Traceback (most recent call last):
  File "/home/zombie/honkaistarrail/starrail_scraping/bin/pip", line 5, in <module>
    from pip._internal.cli.main import main
ModuleNotFoundError: No module named 'pip'
```

- 解決
```
$ sudo apt install python3-pip
```

## エラー及び解決法➁
- 再度、たたく。
```
$ python3.10 -m pip install --upgrade pip
```

- エラー
```
~~~~~~~~~~~~~~~~~~~~~~~~
    from pip._internal.index.package_finder import PackageFinder
  File "/usr/lib/python3/dist-packages/pip/_internal/index/package_finder.py", line 21, in <module>
    from pip._internal.index.collector import parse_links
  File "/usr/lib/python3/dist-packages/pip/_internal/index/collector.py", line 12, in <module>
    from pip._vendor import html5lib, requests
ImportError: cannot import name 'html5lib' from 'pip._vendor' (/usr/lib/python3/dist-packages/pip/_vendor/__init__.py)
```

- 解決法(結論)
```
$ curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10
```
参考URL：[stack overflow](https://stackoverflow.com/questions/70431655/importerror-cannot-import-name-html5lib-from-pip-vendor-usr-lib-python3)


## 余談(流し読みでOK)
- **ChatGPTさんが示していた答え**
- pipのアンインストールと再インストール:
```
python3.10 -m pip uninstall pip
python3.10 -m ensurepip --default-pip
```
→そもそもpipコマンド使ったらはじかれるため、できない。解決法➁のエラーと同じ文言が返る

```
sudo apt update
sudo apt install --reinstall python3.10
```
→Pythonの再インストール。一応、試したが意味なし。目的が違うため。

以上
Qiitaのアカウントを作成して記事を書くまで

# この記事について
こんにちは。たぬきです。
自分の勉強メモを残すためにQiitaを始めてみました。
最初に何もないところから、Qiitaの新規登録を行い、はじめての記事を公開するところまでを記載します。

# Qiitaのアカウントを作成する
Qiitaの[トップページ](https://qiita.com/)を開くと、右上に新規登録のボタンがありますね。これをクリックします。

![スクリーンショット 2023-11-05 105747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3610231/e85685ec-d216-ffee-e532-c31dc0e61588.png)

すると、「Qiitaへようこそ！」のページが表示されます。ここで情報を登録します。私はGitHubのアカウントがあり、技術系のアカウントはまとめておきたいので「GitHubで登録」を選びました。

# アカウントの設定を変える
最初なので以下の設定をしました。
- 公開用プロフィールの設定
    - 右上のアイコン（丸）をクリックするなどして、「マイページ」を表示する。
    - 公開用プロフィールの設定画面になるので、適宜設定する。
- ユーザー名の確認
    - マイページ左の設定項目リストから「アカウント」を選択する。「公開用プロフィール」の上にあります。
    - ユーザー名とアイコンはGitHubのusernameが引き継がれていました。
    - ちなみにアイコンの画像はGitHubのデフォルトのままだったので、このタイミングで画像を登録しました。直後に「アカウント」の画面を表示して、GitHubのラジオボタン横のロードボタンを押すとすぐ反映されました。

# 最初の記事を投稿する
トップページ右上の「投稿する」をクリックします。

![スクリーンショット 2023-11-05 111911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3610231/7be711bc-bdfe-6c78-d562-c8e086228259.png)

記事をマークダウンで記載するモードになるので記事を書きます。

![スクリーンショット 2023-11-05 112634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3610231/e5ef0fcd-bc86-01be-39ef-7b2bf5b89e4b.png)

記事を書いたら、右上の「公開設定」をクリックします。
記事の公開設定の画面になるので、内容をよく読み、チェックを入れます。
右上の「記事を投稿する」をクリックします。

![スクリーンショット 2023-11-05 112523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3610231/600b6f48-adfc-b84d-9157-90c0db7237fc.png)

# あれ？投稿されていない・・・
マイページを見ても「投稿した記事」は何も表示されないまま。。
記事編集画面をよく見たら左下に「タグは1つ以上指定してください」の表示が出てました。

![スクリーンショット 2023-11-05 113246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3610231/d441cc0d-b528-d93f-dd7b-7f4adcadf9e6.png)

適当にタグをつけて再度投稿します。

![スクリーンショット 2023-11-05 113548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3610231/a049b2fa-2c8e-f5b7-1345-4cc18ff95bfd.png)

今度は投稿されました！
投稿されるときは、緑の猫とぐるぐるマークが表示されて、完了したら作成された記事のページに遷移しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3610231/205dd4ad-0a8e-714e-7e69-8f97c87fe139.png)

# 投稿した記事を編集する
左の「・・・」をクリックして編集を選ぶと編集できました。

# 参考にしたページ
[Qiitaのコミュニティガイドライン](https://help.qiita.com/ja/articles/qiita-community-guideline)
NestJS Provider 実装方法

# はじめに
この記事では、NestJS の Provider の実装方法について記載します。

# 開発環境
開発環境は以下の通りです。

- Windows11
- VSCode
- Node.js 20.5.0
- NestJS 10.0.0
- TypeScript 5.1.3

# Provider とは
Provider の特徴は以下の通りです。

- Services, Repositories, Factories, Helpers などの Nest の基本的なクラスの総称
- 依存対象 (Dependency) として注入 (inject) される

# Provider の実装
クラスに ```@Injectable()``` デコレーターを追加することで、対象のクラスを Provider として扱うことができます。

以下の例では、```CatsService``` クラスに ```@Injectable()``` デコレーターを追加しています。

```cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from 'src/interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}
```

```cats.intrface.ts
export interface Cat {
  name: string;
  age: number;
  breed: string;
}
```

# Provider の利用（DI）
先ほど実装した Provider を Controller で利用するためには、```constructor``` を使って DI（依存性の注入）をする必要があります。

以下の例では、```CatsController``` クラスに ```constructor(private catsService: CatsService) {}``` を追加しています。

```cats.controller.ts
import { Body, Controller, Get, Post } from '@nestjs/common';
import { CreateCatDTO } from 'src/dto/create-cat.dto';
import { Cat } from 'src/interfaces/cat.interface';
import { CatsService } from 'src/services/cats.service';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDTO) {
    this.catsService.create(createCatDto);
  }
  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}
```

```create-cat.dto.ts
import { ApiProperty } from '@nestjs/swagger';

export class CreateCatDTO {
  @ApiProperty()
  name: string;

  @ApiProperty()
  age: number;

  @ApiProperty()
  breed: string;
}
```

# 参考
- [NestJS の基礎概念の図解と要約](https://zenn.dev/morinokami/articles/nestjs-overview#providers)
- [Providers](https://docs.nestjs.com/providers)
Github で PR(プルリクエスト) 作成した時に Assignees を自動で Assign yourself する

## 本記事でできること

PR(プルリクエスト)を作成した際に、PRを作成したユーザーを自動的に Assignees に追加する。

## コード

.github/workflows/auto-assign-pr-creator.yaml を作成する
```yaml
name: PR automation

on:
  pull_request:
    types: opened

permissions:
  pull-requests: write
  repository-projects: read

jobs:
  assign:
    name: PR automation

    # 実行が10分を超えるとタイムアウトするように設定する
    timeout-minutes: 10

    # ジョブが実行される環境は、環境に合わせて設定する
    runs-on: ubuntu-22.04

    # コミットが重なった時同時に実行されないように、進行中のジョブをキャンセルするように設定する。
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
      cancel-in-progress: true

    # PR作成者をアサインに追加する。
    steps:
      - name: Set GitHub assignees
        env:
          GH_TOKEN: ${{ github.token }}
        run: gh pr edit ${{ github.event.number }} --add-assignee ${{ github.actor }} --repo ${{ github.repository }}

```


### 感想

毎回 Assignees を設定するの地味にめんどくさかった。。
無事自動化できてストレス減りました:smile:

ps. 初めて GitHubActions 使用してみたが、便利すぎる！！
python3.8 から3.10 に切り替える方法

## 経緯
アプリ開発をしようと思ったときに、下記のようなエラーが発出
```
ERROR: Package 'mihomo-1.1.7' requires a different Python: 3.8.10 not in '>=3.10'
```

## 環境
Ubuntu20.04 + Django4.2.7

## 対処法
- まずPython3.10をインストール
```
sudo apt install python3.10
```

- 一応確認
```
$ ls /usr/bin/ | grep python
dh_python2
python
python2
python2.7
python3
python3-config
python3.10
python3.10-config
python3.8
python3.8-config
python3.9
x86_64-linux-gnu-python3-config
x86_64-linux-gnu-python3.10-config
x86_64-linux-gnu-python3.8-config
```

- バージョン切り替え
```
sudo ln -sf /usr/bin/python3.10 /usr/bin/python3
```

- 確認
```
python3 -V
```

以上
"The Data Warehouse toolkit"を読む

## 1. ディメンショナルモデリング導入

### ディメンショナルモデリングの利点
ディメンショナルモデリングは、データベース構成をシンプル化できる手法である。
以下二つの利点がある。
1. ビジネスユーザにとって理解しやすい形式でデータ提供できる
1. クエリを高速化できる

### ディメンショナルモデリングの構成要素
#### ファクトテーブル
ビジネスイベントにおける"計測項目"を蓄積するテーブルである。（例：売上データ）
ファクトテーブルのレコード一つ一つが計測対象となるイベントに該当する。例えばファクトテーブルに売上というイベントを格納するならば、会計一回ごとにレコードが一行挿入される。この"一レコードに該当するイベントの細かさ"を"粒度"と呼び、ファクトテーブル全体を通して粒度は統一する必要がある。
ファクトとして有用な情報は、以下二つの要素を持つ。
1. 数値データであること
1. 加算可能なデータであること

特に"加算可能であること"が重要なのは、BIツール上で集計処理をおこなうためである。ファクトテーブルを一行一行表示することは稀であるため、集計できるように加算可能な量をファクトとして選ぶと良い。

#### ディメンションテーブル
ビジネスイベントにおける"文脈"を蓄積するテーブルである。
"文脈"とは、イベントにおいて「いつ、どこで、誰が、なぜ、何をしたか」を表す量である。（例：製品データ）
BIツール等で分析をする際に、分析の切り口やグルーピングとして使われる。

#### ファクトかディメンションかを如何に判断するか
数値データがファクトなのかディメンションなのか判断に迷うこともあるだろう。
一つの目安として「ある数値データが連続的な数値データであればファクト、離散的な数値データであればディメンション」という考え方がある。

### "Kimball's DW/BI Architecture"
Kimballが提唱したデータアーキテクチャはOperational Source Systems, ETL Systems, Presentation Area, BI applicationという四つの構成要素からなる。
三次元タイルの pnts を glb に変換

OGC 3D Tiles の 1.1 からは、glTF がメインストリームのタイルフォーマットとなっている。そのバイナリ形式である Binary glTF (.glb)に、点群三次元タイルの .pnts から変換してみた。

変換元のデータは[長崎点群三次元タイル](https://observablehq.com/@hfu/nagasaki-point-cloud-visualization)から適宜取り出したもの。

## 実施した作業
最近、実施した作業は Makefile に落とすことを励行している。次のようなことをしている。

```Makefile
get:
	curl -O https://smb.optgeo.org/ipfs/QmdAr2FWQKCVv7CAcLRuTBt1583Qi7DA4gaA92g3ujeL1v/51571711/r3.pnts
convert:
	npx 3d-tiles-tools convertPntsToGlb -i r3.pnts -o r3.glb
```

## ファイルの大きさの比較
ファイルの大きさを比較すると次のとおり。

```
-rw-r--r--  1 hfu  staff   275K 11  5 11:02 r3.glb
-rw-r--r--  1 hfu  staff   257K 11  5 11:01 r3.pnts
```

ファイルのサイズが小さくなる、というわけではない。もちろん、圧縮を試してみたか、ということはある。

## ビューアでみる
glTF は pnts よりも一般的なフォーマットのようであり、r3.glbを[ウェブ上のビューア](https://gltf-viewer.donmccurdy.com/)で見ることもできる。

![view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/ddc0cb6a-5be9-f916-3ae0-a504bc909edb.png)

これは、安心感につながる。
Pythonで「書式化演算子%を使った文字列の書式設定(printf形式の書式化)」の動作を確認してみた

# 概要

Pythonで「書式化演算子%を使った文字列の書式設定(printf形式の書式化)」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/string/index23.html

# 実装

以下のファイルを作成しました。
```sample.py
num1 = 30
result = "10進数では %d 、16進数では %x です" % (num1, num1)
print(result)

def mypoint(str1, num1):
    result = "My name is %-10s, point is %5d." % (str1, num1)
    print(result)

mypoint("Yamada", 75)
mypoint("Sugiyama",1825)

name = "Suzuki"
old = 18
print("名前は%-8sです。年齢は%03d歳です。" % (name, old))

print("10進数=%d, 16進数=%x" % (20, 20))
print("指数表記=%e, 固定小数点表記=%f" % (0.0752, 0.0752))

print("10進数=%(decnum)d, 16進数=%(hexnum)x" % {"hexnum":20, "decnum":20})

print("数値1=%x, 数値2=%#x" % (30, 30))
print("数値1=%5d, 数値2=%05d" % (30, 30))
print("数値1=[%5d], 数値2=[%-5d]" % (30, 30))
print("数値1=%d, 数値2=%d, 数値3=% d, 数値4=% d" % (30, -30, 30, -30))
print("数値1=%+d, 数値2=%+d" % (30, -30))
print("数値1=%d, 数値2=%4d, 数値3=%4d" % (30, 30, 72536))
print("数値1=%d, 数値2=%*d" % (18, 5, 42))
print("数値1=%f, 数値2=%.3f" % (1/3, 1/3))
print("数値1=%f, 数値2=%.*f" % (1/3, 3, 1/3))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
10進数では 30 、16進数では 1e です
My name is Yamada    , point is    75.
My name is Sugiyama  , point is  1825.
名前はSuzuki  です。年齢は018歳です。
10進数=20, 16進数=14
指数表記=7.520000e-02, 固定小数点表記=0.075200
10進数=20, 16進数=14
数値1=1e, 数値2=0x1e
数値1=   30, 数値2=00030
数値1=[   30], 数値2=[30   ]
数値1=30, 数値2=-30, 数値3= 30, 数値4=-30
数値1=+30, 数値2=-30
数値1=30, 数値2=  30, 数値3=72536
数値1=18, 数値2=   42
数値1=0.333333, 数値2=0.333
数値1=0.333333, 数値2=0.333
```

# まとめ

何かの役に立てばと。
'bits/stdc++.h' file not found と use of undeclared identifier 'cout'; の対処法

## はじめに

　以下のエラーが出ます。

```bash
c1.cpp:1:10: fatal error: 'bits/stdc++.h' file not found
#include <bits/stdc++.h>
```

　まず以下の記事にあるように、stdc++.h をダウンロードして配置します。

['bits/stdc++.h' file not foundの対処法 #C++ - Qiita](https://qiita.com/ryo_manba/items/c233013952cee9e08b02)

## 次に出たエラー

　`cout` が無いと言われます。

```bash
c1.cpp:5:3: error: use of undeclared identifier 'cout'; did you mean 'count'?
  cout << "Hello" << endl;
  ^~~~
  count
```

## 解決策

　`#include <iostream>` を書けばいいのですが、そもそも `stdc++.h` に入っているはずなので、書きたくありません。

　ダウンロードした `stdc++.h` から `#include <iostream>` を探すと、なにやら `#if`〜`#endif` の中に入っています。

　この行をどこでも良いから `#if`〜`#endif` の外に出します。必ず `#include` されるようにします。自分で使うだけだから、自分の環境だけ動けば良いです。

 　これでコンパイルできるようになりました。

## 環境

```bash
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H1713
Xcode 12.4
Build version 12D4e
Target: x86_64-apple-darwin19.6.0
LANG=ja_JP.UTF-8
zsh 5.7.1 (x86_64-apple-darwin19.0)
x64
```

## 参考

- ['bits/stdc++.h' file not foundの対処法 #C++ - Qiita](https://qiita.com/ryo_manba/items/c233013952cee9e08b02)
- [gcc コンパイルオプション備忘録 #C++ - Qiita](https://qiita.com/seriru13/items/c2f5192615162c4c3f47)
Amazon S3 クロスアカウントバケットポリシー設定パターン

なんか混乱してくるので整理しました。

## アクセス元アカウント ID で制限

別のアカウントから IAM role を使用したアクセスを許可する場合は、`Principal` にアカウント ID を指定します。

```yaml
Parameters:
  TestBucket:
    Type: AWS::S3::Bucket
  TestBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref TestBucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: TestBucketPermissions
            Effect: Allow
            Action: s3:*
            Resource:
              - !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
              - !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
            Principal:
              AWS:
                - (アカウント ID)
```

## アクセス元を Organizations に制限

Organizations のすべてのアカウントからのアクセスを許可する場合は、`Condition` に `aws:PrincipalOrgID` を指定します。

```yaml
Parameters:
  TestBucket:
    Type: AWS::S3::Bucket
  TestBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref TestBucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: TestBucketPermissions
            Effect: Allow
            Action: s3:*
            Resource:
              - !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
              - !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
            Principal:
              AWS: "*"
            Condition:
              StringEquals:
                aws:PrincipalOrgID: (Organization ID)
```

## サービスプリンシパルによるアクセス元アカウントで制限

Service-linked role を使用したサービスからのアクセスを許可する場合は、`Principal` にサービスプリンシパルを指定し、アクセス元アカウントは `Condition` の `aws:SourceAccount` で指定します。`aws:PrincipalOrgID` で Organization を指定することは使用できません。

```yaml
Parameters:
  TestBucket:
    Type: AWS::S3::Bucket
  TestBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref TestBucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: TestBucketPermissions
            Effect: Allow
            Action: s3:*
            Resource:
              - !Sub "arn:${AWS::Partition}:s3:::${TestBucket}"
              - !Sub "arn:${AWS::Partition}:s3:::${TestBucket}/*"
            Principal:
              Service:
                - config.amazonaws.com
            Condition:
              StringEquals:
                aws:SourceAccount:
                  - (アカウント ID)
```
Android スマホで109配列のキーボード使うと記号がうまく打てない問題。

# はじめに
スマホアプリのPydroid3でコーディングする際※、スマホのソフトキーボードでタイピングするのはきついので、109配列の物理キーボード(windowsマークのキーがあるキーボード)を繋げてタイピングした。すると、よく使う記号の```"&(+=*```などの記号が打てなくて困っていた。


※わざわざスマホでコーディングしなくても、パソコンでコーディングすればいいのだが、Androidスマホでしか動作しないplyerのAPI評価することがあったので。 [＜Pythonでスマホの各種センサー情報を取得する。＞](https://qiita.com/tapitapi/items/51ddefc1dd8e810430c8)


# 対処方法
スマホの物理キーボードの初期設定が101配列のキーボードになっているので、記号文字がずれて配置されているのが問題。下記の手順で解消。一度設定すると、スマホが状態保持するので、同じキーボードであれば、再設定不要。スマホによって、手順が異なるかもしれないが大体同じと思われる。

### 手順
1. スマホに物理キーボード接続
1. スマホの[設定]→[システム]→[言語と入力]→[物理キーボード]を選択
1. [キーボードレイアウト]で```日本語 109A 配列```を選択

以上
Gulp4でJSファイルをMinifyする方法と、Minifyファイルの増殖を防ぐ方法

# 目的

Gulp4を使って`test.js`をMinifyして`test.min.js`を作成します。

# 環境
- Npm 10.2.3
- Gulp 4.0.2


# 1. JSファイルをMinifyするタスクを作成する

### フォルダ構成

以下のフォルダ構成で行います。
`src/test.js`をMinifyし、`dst/test.min.js`を生成します。

```:Minifyタスク実行前
├ gulpfile.js
├ src/test.js
└ dst/
```


```:Minifyタスク実行後
├ gulpfile.js
├ src/test.js
└ dst/test.min.js 　← ここにMinifyしたファイルが生成される
```

### 必要なものをインストール

`gulp-uglify`は、jsファイルのMinifyを行うため使用します。
`gulp-rename`は、Minifyしたファイル名を`*.js`から`*.min.js`に変更するために使用します。


```bash
npm install gulp gulp-uglify gulp-rename
```


### gulpfile.jsの作成

```js:gulpfile.js
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');

gulp.task('js-minify', () => {
    return gulp.src(['./src/*.js'])
        .pipe(uglify())
        .pipe(rename({extname: '.min.js'}))
        .pipe(gulp.dest('./dst/'));
});
```

### 実行

Gulpコマンドを実行すると`test.min.js`を生成することができます。

```bash
gulp js-minify
```

# 2. 元となるJSと同じフォルダにMinifyしたファイルを生成する方法

元となるJSと同じフォルダにMinifyしたファイルを生成したい場合に、「1. JSファイルをMinifyするタスクを作成する」と同じ方法で行うと、Minifyしたファイルが増殖していきます。

その解決方法を説明したいと思います。

### フォルダ構成

今回のフォルダ構成は以下のようになります。

```:タスク実行前
├ package.json
├ gulpfile.js
└ js
  └ test.js
```

```:タスク実行後
├ package.json
├ gulpfile.js
└ js
  ├ test.js
  └ test.min.js 　← ここにMinifyしたファイルが生成される
```

### 失敗パターン

「1. JSファイルをMinifyするタスクを作成する」からの変更箇所としては、`gulp.src()`と`gulp.dest()`のフォルダ指定を変更しています。


```js:gulpfile.js
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');

gulp.task('js-minify', () => {
    return gulp.src(['./js/*.js'])
        .pipe(uglify())
        .pipe(rename({extname: '.min.js'}))
        .pipe(gulp.dest('./js/'));
});
```
上記の`gulpfile.js`でコマンドを実行する度に、ファイルが、みんみんみん...と無限に増えていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/0815160f-0088-da70-5bdd-60f13d27acac.png)


### 解決方法

`gulp.src`に、Minifyしたファイルを含めないように`!./js/*.min.js'`を追加します。
これで、Minifyファイルの増殖が防げます。

```js:gulpfile.js
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');

gulp.task('js-minify', () => {
    return gulp.src(['./js/*.js', '!./js/*.min.js'])
        .pipe(uglify())
        .pipe(rename({extname: '.min.js'}))
        .pipe(gulp.dest('./js/'));
});
```

# おわりに

今回は、Gulp4でJSファイルをMinifyする方法を説明しました。

SCSS版の記事もあるので興味があればこちらもどうぞ！！

https://qiita.com/ishi720/items/b9a2971e0a61b7fc94c2

ここまで読んでいただきありがとうございました。
VScodeでLuaLaTeXのPreviewができなかった件について

初投稿です。
## LuaLaTeX のPreview機能
こんな画面になることで自動コンパイルを行ってPDFのプレビューも行えるlatex-workshopの機能です。
![スクリーンショット 2023-11-05 100743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779633/a5050eee-6bcd-2ec3-ac7d-bab498291098.png)

このように書いている人が多いと思いますが、
```tex:setting.json
"latex-workshop.latex.outDir": "out"
```
この部分を削除してください。
理由としては前提としてpreviewを行うにはtexファイルが出力されているフォルダ内に限定されるため、outというフォルダ内ではpreviewの内容がlatex-workshopで参照できないので削除してください。

この記事はただの自己満の報告なので完成度は気にしないで下さい。
御清覧ありがとうございました。
高レベル言語から低レベル言語へ: Ruby to C

# 高レベル言語から低レベル言語へ: Ruby to C

オブジェクト指向プログラミング言語は、開発者が効率的にコードを書くことを可能にし、コードの再利用と維持を向上させます。しかし、これらの高レベル言語は、実際にはどのようにコンピュータの低レベルの機構と対話しているのでしょうか？この記事では、高レベル言語Rubyと低レベル言語Cの間のインタラクションを探求します。

## 1.　RubyがLinuxで実行されるまで

Rubyコードを実行するとき、いくつかのステップが背後で行われています。これらのステップは、高レベルのRubyコードを低レベルのシステム命令に変換し、最終的にはLinuxオペレーティングシステム上で実行します。ここでは、このプロセスを簡単に説明します。

### MRI (Matz's Ruby Interpreter)内の処理
#### 1. Rubyコードのコンパイル:

Rubyコードは最初にバイトコードにコンパイルされます。バイトコードは、Rubyの仮想マシン（Ruby VM）で実行可能な中間表現です。

```ruby
# Rubyコード
def add(x, y)
  x + y
end

result = add(5, 7)
puts result  # Output: 12
```

#### 2. Ruby VMでのバイトコードの実行:

バイトコードは次にRuby VMによって実行されます。Ruby VMはC言語で書かれており、バイトコードを解釈し、対応するCの関数呼び出しや操作を行います。

#### 3. C言語へのマッピング:

Ruby VM内でのバイトコードの実行は、実際にはC言語の関数呼び出しとデータ操作にマッピングされます。これにより、Rubyコードは低レベルのC言語の操作として実行されます。

#### 4. Linuxでのシステムコール:

最終的に、Ruby VMとC言語のコードはLinuxオペレーティングシステム上で実行され、必要に応じてシステムコールを行います。システムコールは、ファイルの読み書き、ネットワーク通信、メモリの割り当てなど、オペレーティングシステムのリソースとサービスへのアクセスを提供します。

このプロセスを通じて、Rubyコードは最終的にLinuxシステム上で実行され、開発者は高レベルのプログラミング言語を使用しながら、低レベルのシステムリソースと効果的に対話することができます。

## 2.　RubyとC言語の対応を示すコード例

### Rubyのコードスニペット:

```ruby
class Greeting
  def say_hello(name)
    "Hello, #{name}!"
  end
end

greeting = Greeting.new
message = greeting.say_hello('Alice')
puts message  # Output: Hello, Alice!
```

このRubyコードは、`Greeting`クラスを定義し、`say_hello`メソッドを持っています。このメソッドは、名前を受け取り、挨拶メッセージを返します。

### C言語のコードスニペット:

C言語では、構造体と関数を使用して同様の機能を実装することができます。

```c
#include <stdio.h>

typedef struct {
    char *message;
} Greeting;

void say_hello(Greeting *g, char *name) {
    printf("%s, %s!\n", g->message, name);
}

int main() {
    Greeting greeting = {"Hello"};
    say_hello(&greeting, "Alice");
    return 0;
}
```

このCコードは、`Greeting`構造体を定義し、`say_hello`関数を作成します。`say_hello`関数は、`Greeting`構造体のポインタと名前を受け取り、挨拶メッセージを出力します。

### 解説:

Rubyのコードは、オブジェクト指向プログラミングの原則に従ってクラスとメソッドを使用しています。一方、C言語のコードは、構造体と関数を使用してプロシージャルプログラミングのアプローチを取っています。

Rubyコードでは、`Greeting`クラスの`say_hello`メソッドは、`Greeting`オブジェクト上で直接呼び出されます。一方、C言語のコードでは、`say_hello`関数は`Greeting`構造体のポインタをパラメータとして受け取り、関数の呼び出しに必要な情報を提供します。

これらのコードスニペットは、高レベル言語（Ruby）と低レベル言語（C）の間の違いを明確に示しています。そして、メソッド呼び出しのプロセスがどのように異なるかを理解する手助けになるでしょう。

## 3.　用語
### オブジェクトシステムとメソッドテーブル

オブジェクト指向言語の核心にはオブジェクトシステムとメソッドテーブルがあります。オブジェクトシステムは、クラスとオブジェクトの動作を定義し、管理します。一方、メソッドテーブルは、クラスごとに存在し、メソッド名とその実装をマッピングするデータ構造です。

### 動的メソッドディスパッチとポリモーフィズム

動的メソッドディスパッチは、実行時にどのメソッド実装を呼び出すかを決定するプロセスです。これにより、オブジェクト指向プログラムはポリモーフィズムをサポートし、異なるクラスのオブジェクトが同じメソッド呼び出しで異なる動作を示すことができます。

## 4.　メソッド呼び出しのプロセス

メソッド呼び出しのプロセスは以下のステップで構成されます：

1. **プログラムのロード/初期化**:
   プログラムがロードされる際に、クラスとそのメソッドのコードがメモリにロードされます。

2. **メソッドテーブルの構築**:
   クラスのメソッドテーブルが構築され、メソッド名とメソッドの実装へのポインタがマッピングされます。

3. **メソッドの呼び出し**:
   プログラムでメソッドが呼び出されると、ランタイムはメソッドテーブルを検索します。

4. **ポインタの取得**:
   メソッドテーブルからメソッド名に対応するポインタが取得されます。

5. **メソッドの実行**:
   ポインタを使用してメソッドの実装の場所を特定し、メソッドが実行されます。

## 5. RubyからCへのマッピング

Rubyは高レベル言語であり、Cは低レベル言語であるため、Rubyのオブジェクトとクラスは、内部的にはCのデータ構造と関数にマッピングされます。このマッピングは、Ruby VM（仮想マシン）によって管理され、Rubyコードが効率的に実行されることを保証します。

この記事では、高レベル言語と低レベル言語の間のインタラクションの基本を探求しました。この知識は、オブジェクト指向プログラミングの背後にあるメカニズムを理解し、効果的なコードを書く上で非常に役立ちます。
laravel usersテーブルにカラム追加

カラム追加のま言うレーションファイルを、コマンドで作成
```
php artisan make:migration add_column_to_users_table
```

できたマイグレーションファイルを編集
```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //usersテーブルに追加するカラム(例)
            $table->foreignId('admin_id')->constrained()->onDelete('cascade')->default(2);
            $table->longText('comment')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //追加したものと同じ内容をdownメソッド内にも書く
            $table->foreignId('admin_id')->constrained()->onDelete('cascade')->default(2);
            $table->longText('comment')->nullable();
        });
    }
};

```

あとは、マイグレートを実行すると反映される
教育用のGo言語？Go+を触ってみた

# TL; DR

- Goの構文をよりスクリプト言語っぽく手軽に
- Goの標準パッケージが利用可能
- シェルとして使用可能

# はじめに

GitHubのプログラミング言語タグを見ていたところ、`Go+` という言語を見つけました。

https://github.com/goplus/gop/tree/main

READMEによると「エンジニアリング」「理工系の教育」「データサイエンス」向けを謳っているようです。
名前の通りGo言語互換で、さらに `+` となるいくつかの機能が追加されていました（JavaScriptに対するTypeScript的なイメージ）。
本記事では、Go+で面白いと思った構文について紹介したいと思います。

# バージョン

- Go+: `v1.1.8` (執筆時点の最新)

# 実行方法

まずは公式のガイドに従い `gop` をインストールします。Homebrewで入れると楽でした。

https://github.com/goplus/gop/tree/main#how-to-install

コマンドの使い方は `go` コマンドと同様です (`gop run`, `gop build` 等)。

`gop run` した場合、gopファイルをgoファイルにトランスパイルしてから実行されます。中間生成物のgoファイルは `gop_autogen.go` で確認できます。

```go:main.gop
import "fmt"

func main() {
        fmt.Println("Hello, world!")
}
```

```go:gop_autogen.go
package main

import fmt "fmt"

func main() {
//line main.gop:4
        fmt.Println("Hello, world!")
}
```

# 構文の違い
基本はGoと互換性がありますが、記述量を抑えるためのいくつかの構文が拡張されています。

https://github.com/goplus/gop/blob/main/doc/docs.md

## 関数呼び出しのかっこが不要

```go
fmt.Println("Hello, world!")
```

を

```go
fmt.Println "Hello, world!"
```
と書けます。後述のDSLを書く際に少し見栄えが良くなります。

（ちなみに、print系は組み込みでも定義されているので、fmtをimportせずに `println` でも呼び出せます）

## コレクション

配列やマップのリテラルに型を書く必要がありません。

```go
// 型は勝手に推論される
words := ["foo", "bar", "baz"] // []string
vals := ["Hi", 10] // []any

// mapも同様
{"Hello": 1, "xsw": 3}
```

## for文

`range` の代わりに `<-` を使用します。

```go
import "fmt"

func main() {
    words := ["foo", "bar", "baz"]

    for word <- words {
        fmt.Println(word)
    }

    for i <- 1:5 {
        fmt.Println(i)
    }
}
```

## 内包表記

内包表記も使えます。

```go
fmt.Println([w[0:1] for w <- words]) // ["f", "b", "b"]
```

## ?によるエラーハンドリング

`?` を使うことで、エラーハンドリングを暗黙的に行うことができます。

```go
func add(x, y string) (int, error) {
    return strconv.Atoi(x)? + strconv.Atoi(y)?, nil
}
```

このコードは以下と同様です。

```go
func add(x, y string) (int, error) {
    xi, err := strconv.Atoi(x)
    if err != nil {
        return 0, err
    }
    yi, err := strconv.Atoi(y)
    if err != nil {
        return 0, err
    }
    return xi + yi, nil
}
```

これ、Rustで一番好きな構文なので「Goで使えたらいいな」といつも妄想してました、
~~もう `if err != nil` まみれとは言わせない~~


## lambda

Goの関数リテラルよりもシンプルに書けます。

```go
// ジェネリクスは未対応っぽい
func Map(nums []int, f func(int) int) []int {
        return [f(n) for n <- nums]
}

func main() {
        fmt.Println(Map([1,2,3], n => n * 2))

        // 普通のGoっぽくも書ける
        fmt.Println(Map([1,2,3], func(n int) int {return n * 2}))
}
```

## 演算子のオーバーロード

自作の型で演算子を定義できます。

```go
import "fmt"

type MyInt int

func (i MyInt) +(other MyInt) MyInt {
        // そのまま i + other とすると無限ループするので注意！
        return MyInt((int(i) + int(other)) % 10)
}

func main() {
        a := MyInt(9)
        b := MyInt(3)
        fmt.Println(a + b) // 2
}
```

# その他
Go+では、DSLのように特定の用途向けのフレームワークを作る機能（`ClassFile`）があります。
この機能を使って、Goの文法でシェルのようにコマンド実行ができるライブラリもあるようです。

https://github.com/goplus/gop/blob/main/doc/dsl-vs-sdf.md

...が、残念ながら最新版では互換性の問題で動作しませんでした。バージョンを下げても動かないのでやむなく断念... :cry:

# おわりに

以上、Go+言語の紹介でした。
Goらしさは残しつつ、痒い所に手が届く文法が足されているのが嬉しいです。小さなツールをサクッと作るのに向いていそうです。

# 関連記事

https://qiita.com/Syuparn/items/d30323c90c32246d0557
【WordPress】分かっていなかった基本的なこと

# 検索フォームをカスタマイズしようとしたが、class="search-box"という検索フォームが無く、class="wp-block-search__input"しかない。

Cocoonの検索フォームをカスタマイズする場合は、以下デフォルト表示される検索フォームを削除し、検索ブロックを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/342537d7-0a7d-110e-0ff9-2179534e0c7c.png)

追加するのは以下検索ブロック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/4b226554-61c3-113d-822e-12dbf6f89fc6.png)



# 記事ページのカスタマイズ
#### 親ページよりも子ページが優先される
①「wp-content/themes/cocoon-child-master」に「tmp」フォルダを作成する。
②「wp-content/themes/cocoon-master/tmp/content.php」ファイルを上記フォルダに配置する。
③「wp-content/themes/cocoon-child-master/content.php」を編集する。
Udemy講座のお知らせとクーポンコードの発行（2023年11月分）

### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また以下のような書籍も執筆しています。
* [「マスタリング Java EE 5」（2007年）](https://amzn.asia/d/j0txqK5)
* [「アプリケーションアーキテクチャ設計パターン」（2017年）](https://amzn.asia/d/9avaCyF)

いずれも**Java EE**（**Jakarta EE**）を中心にした企業システム開発のための書籍です。中でも [「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)は、（Javaに限定されない）比較的普遍的なテーマを扱っており、内容的にはまだまだ陳腐化していないため、興味のある方は是非手に取っていただけると幸いです（中級者向け）。

### Udemy講座のご紹介とクーポンコード（2023年11月末まで）

現在私が講師を務めるUdemy講座には、以下のラインアップがあります。
これらのコースは、**Udedmyセールス対象外のためタイミングを気にすることなく購入可能**です。また以下のリンクから購入いただくと、クーポンが適用されたことになり、定価の**約30%OFF**で購入することができます。

|コース名|リリース|定価|クーポン適用後価格|2023年11月末まで使えるクーポンリンク|
|--|--|--|--|--|
|**『Java Basic編』**|2023年6月リリース済|4,200円|3,000円|https://www.udemy.com/course/learn-java-se-basic/?couponCode=376068F024C4A453DD69|
|**『Java Advanced編』**|2023年9月リリース済|3,600円|2,500円|https://www.udemy.com/course/learn-java-se-advanced/?couponCode=AC6E707F2F62A57933F1|
|**『Java テスト＆自動化入門』**|2024年前半リリース予定|未定|||
|**『Java DBアクセス入門』**|2024年前半リリース予定|未定|||
|**『SpringBoot基礎＆実践』**|2024年前半リリース予定|未定|||

なお上記クーポンは期限が切れ次第、定期的に発行し、都度別のQiita記事として投稿する予定です。ぜひご活用いただけると幸いです。
GitHubでUnityプロジェクトを管理する際の100MB制限対処法

GitHubでUnityプロジェクトを管理する際、ファイルの容量制限（1ファイル100MB以下）に遭遇することがあります。この制限を超えるとエラーが発生しますが、`.gitignore` ファイルを利用することで、バージョン管理に必要のない特定のファイルやフォルダをGitのバージョン管理から除外することができます。

## `.gitignore` ファイルの利用

`.gitignore` ファイルを利用することで、特定のファイルやフォルダをGitのバージョン管理から除外することができます。UnityプロジェクトをGitHubにpushする際には、`Unity.gitignore` を追加し、バージョン管理に必要のないファイルをアップロードしないように制限することが可能です。

## 例: `.gitignore` ファイルの作成と設定

### 新規リポジトリの作成時
GitHubのリポジトリ新規作成ページからリポジトリを作成する際に、`[Add .gitignore]`のプルダウンで`[Unity]`を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/9ab05ed4-d926-dd98-aa7b-f65b1224c068.png)


### 既存のリポジトリでの設定
1. まず、[こちら](https://github.com/github/gitignore/blob/main/Unity.gitignore)のURLから`Unity.gitignore`ファイルをダウンロードします。
2. ダウンロードした`Unity.gitignore`ファイルをプロジェクトのルートディレクトリに移動します。
3. ファイル名を`.gitignore`に変更します。
4. ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行して、変更をステージング、コミット、そしてプッシュします。
    ```bash
    git add .gitignore
    git commit -m "Add .gitignore file"
    git push
    ```

これで、100MBを超えるファイルはGitHubにプッシュされなくなり、容量制限のエラーを回遍することができます。


# 参考

上記の手順と設定を参考にすることで、GitHubの100MB制限問題を解決し、Unityプロジェクトを効率的に管理することが可能です。また、さらに詳細な情報は、以下のQiita記事を参照してください。

https://qiita.com/Kenty1003/items/a8c9f5da2a541fa920ab

https://qiita.com/nariya/items/97afba6b7b448920cdf0

https://qiita.com/ttokdev/items/5201e5ff49da5b0d109c
Realtek チップ搭載のUSB NIC 一覧

# 背景
- Realtek チップ搭載のUSB NICをパット探すだけだと見つけられなくて、各NICのドライバー情報等を確認し、いくつか見つかったのでその内容をまとめることにした。
- Realtek チップが搭載していれば、[Realtek Ethernet Diagnostic Utility]() を使って、複数の"VLANタグ付きI/F"を設定することができる。
- なので、複数のVLANに足を出して、検証したいっというときにSWのポートはTrunkにしておけば、１つのLANケーブルで複数のVLANに足を出して検証することが可能になるので''とっっっても便利''


<br/>

# Realtekチップ搭載　USB　NIC
- https://www.amazon.co.jp/BENFEI-USB-MacBook%E3%80%81Surface-Pro%E3%80%81Windows7-10%E3%80%81XP%E3%80%81Vista%E3%80%81Mac%E2%80%A6/dp/B08KWC7D78/ref=pd_rhf_d_dp_s_ci_mcx_mr_hp_d_sccl_1_4/356-4979272-9417513?pd_rd_w=quidI&content-id=amzn1.sym.7225cbd5-9046-47c0-9711-30772e8cfb94%3Aamzn1.symc.72052e08-f310-431d-80e0-b172c323d1e5&pf_rd_p=7225cbd5-9046-47c0-9711-30772e8cfb94&pf_rd_r=F5P0M5P4A3HVDBNBZT67&pd_rd_wg=TD4Kx&pd_rd_r=8c88f4ee-c5d9-4e9f-aa3c-fdc4ce4327cd&pd_rd_i=B08KWC7D78&th=1

=> 1,499円

---
https://www.amazon.co.jp/dp/B01M6C9DPK/ref=sspa_dk_detail_0?pd_rd_i=B09FDRMZ73&pd_rd_w=Vm9rj&content-id=amzn1.sym.4519c587-1a66-4b67-a87f-559231103a05&pf_rd_p=4519c587-1a66-4b67-a87f-559231103a05&pf_rd_r=ZC819Q8XVREQEBMJT0RA&pd_rd_wg=KMoeL&pd_rd_r=d717c05c-fe59-451b-af6e-4c556f362f0a&s=electronics&sp_csd=d2lkZ2V0TmFtZT1zcF9kZXRhaWwy&th=1
=> 2,780円

[TP-Link 有線LAN アダプター 10/100/1000 Mbps Giga USB3.0 ポータブル UE300
](https://www.amazon.co.jp/dp/B0784RHQDL/ref=sspa_dk_detail_0?pd_rd_i=B09FDRMZ73&pd_rd_w=Vm9rj&content-id=amzn1.sym.4519c587-1a66-4b67-a87f-559231103a05&pf_rd_p=4519c587-1a66-4b67-a87f-559231103a05&pf_rd_r=ZC819Q8XVREQEBMJT0RA&pd_rd_wg=KMoeL&pd_rd_r=d717c05c-fe59-451b-af6e-4c556f362f0a&s=electronics&sp_csd=d2lkZ2V0TmFtZT1zcF9kZXRhaWwy&th=1)
= > 1500円


https://www.amazon.co.jp/gp/product/B010SEARPU/ref=as_li_tl?ie=UTF8&tag=bnltgysue07-22&camp=247&creative=1211&linkCode=as2&creativeASIN=B010SEARPU&linkId=a70f594536727194319ba2aa532943db
=> 2,846円

# 2.5G Reltek

~~https://www.amazon.co.jp/dp/B0B6CRYW7D?tag=masaaswebsite-22&linkCode=ogi&th=1~~
=> 3499円

~~[2.5G 有線LANアダプター USB3.0 ギガビット 2500Mbps 変換アダプタ RJ45 ドライバー不要](https://www.amazon.co.jp/%E6%9C%89%E7%B7%9ALAN%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-USB3-0-2500Mbps-%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF-%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E4%B8%8D%E8%A6%81/dp/B0BWMGG14B/ref=pd_lpo_sccl_3/357-2257589-8651723?pd_rd_w=j5g9R&content-id=amzn1.sym.d769922e-188a-40cc-a180-3315f856e8d6&pf_rd_p=d769922e-188a-40cc-a180-3315f856e8d6&pf_rd_r=9NSGJA97HJ01WPEA6834&pd_rd_wg=2r1N1&pd_rd_r=4dfdeb7d-c2b9-4e92-af1f-29545df65ca5&pd_rd_i=B0BWMGG14B&psc=1)~~

=> 2,480円

https://www.amazon.co.jp/dp/B0CT4YR4W3/ref=sspa_dk_detail_1?psc=1&pd_rd_i=B0CT4YR4W3&pd_rd_w=c26XO&content-id=amzn1.sym.f293be60-50b7-49bc-95e8-931faf86ed1e&pf_rd_p=f293be60-50b7-49bc-95e8-931faf86ed1e&pf_rd_r=9DXGEN1CKRQ7SJQEG67E&pd_rd_wg=QE95i&pd_rd_r=683ebdce-c357-4e87-a372-992a96a2df82&s=electronics&sp_csd=d2lkZ2V0TmFtZT1zcF9kZXRhaWw
=> 2,159 税込



# 調べたNIC一覧
ABC327回答メモ

# 0.はじめに
　C問題までは順調に解けましたが、Dの壁を越せず
　結果はレート微減でした。
　でも、レートがピッタリ700になったのでなんかうれしい感じでした。


# 1.A - ab
　Aらしい肩慣らし問題でした。
  
　フラグ変数を0で初期化し、文字列を2文字目から見ていく。
　一文字前と現在の文字が、abかbaの組み合わせだったら
　フラグに1をセット
　最後にフラグが1だったらYes、0だったらNoを出力して終了。

　https://atcoder.jp/contests/abc327/submissions/47210843


# 2.B - A^A
　最初は素因数分解めんどいなーと思いましたが、
　入力例とBの最大値を見て、A=10で10の10乗まで行くなら
　受験を満たすAの数はそれほど大きくないなと気づきました。
　Bの値を試算していき、A=17で制限である10の18乗を
　超えることが分かったので、あとは、i＝1から16までループして
　入力のBとiのi乗が一致したらYes、i＝16を超えても一致しなかったらNoを
　出力して終了。
 
　https://atcoder.jp/contests/abc327/submissions/47219480


# 3.C - Number Place
　ナンプレは日ごろからやるので、質問の理解はすぐできました。
　とりあえず、9個の配列を渡したら、その中に１～９がすべて含まれるかを
　チェックする関数chkを用意。以下関数の実装内容
　　1.入力された配列Lを昇順ソート
　　2.Lの要素を結合した文字列が”123456789”を満たす時
  　　→Trueをリターン
　　3.Lの要素を結合した文字列が”123456789”を満たさない時
　　　→Noを出力して終了。

　メイン処理の方は、チェックすべき、行、列、３×３のブロック毎に
　配列を作り関数chkに渡す。
　すべてチェックしてもPGが終了してなかったら条件を満たすので
　Yesを出力して終了。
　行列の実装はすんなりいきましたが
　３×３のブロックを配列化するのにてこずり、結局力技で
　１文字ずつ指定するというエレガントさの欠片もない実装になりました・・。

　https://atcoder.jp/contests/abc327/submissions/47242365


# 4.D - Good Tuple Problem
　問題文の言っていることが全く分からず諦めかけましたが
　例題を見つつなんとか理解できた気になりました。
　【考え方】(理解できた気になった考え方なので最終的な回答には未使用)
 　　・A[i]とB[i]をペアのキューqを作っていく、その過程で、相互関係を持たない
 　　　ペアは除外する。
 　　　例：（3,1）、(3,2)、(1,2)、(4,5)とあったら、4つ目は除外
 　　・相互関係を考慮しなければいけないqを先頭から抽出していき
 　　　それぞれの値に1or0を振っていく、すでに振られた
 　　　値に矛盾が生じる場合にNoを出力して終了
 　　　すべての値に1or0が設定出来たらYesを出力して終了
　色々試行錯誤してさらに時間切れになりつつも
　TLE５つまでいったのですが、その先にACはなさそうでした・・。

　解説を見たところ、二部グラフという初耳な考えかたで
　解法が示されていて、ざっくり理解した感じだと問題文でいうXの
　リストを完成してくという考え方でした。

　解説のC++を参考にpythonで実装したところ、REがでたので
　いつもの再帰深度不足だなということで、setrecursionlimitを拡張し
　ACとなりました。
 　
　https://atcoder.jp/contests/abc327/submissions/47280246
Elixir Livebook の Docker イメージの在処


[Elixir]製のノートブックツール [Livebook] の最新版 [Docker] イメージはどこで入手できるのでしょうか。

## 結論

最新のイメージは Github リポジトリのこのリンクで検索できます。

https://github.com/livebook-dev/livebook/pkgs/container/livebook

[Livebook の README] にヒントがあります。

## 古いイメージ

Dockerhub にもありますが、執筆時点（2023年11月）では何ヶ月も更新されていない状態です。

https://hub.docker.com/r/livebook/livebook/tags

## Livebookを試してみる

有志の方々が、[Elixir]言語、[Livebook]を楽しく学べるよう多数のコラムを執筆してくださっています。

ご興味のある方は、ぜひ検索してみてください。

https://qiita.com/tags/livebook

https://qiita.com/RyoWakabayashi/items/e8a5253e9f5f8305579b

https://qiita.com/westbaystars/items/cb29c24ae7f3efafd81d

https://qiita.com/torifukukaiou/items/beea66ad4c9629fa826e

https://moneyforward-dev.jp/entry/2023/08/31/100000

[Elixir] 言語を使ってサーバーの費用を **$2 Million/年** 節約できたというウワサがあります。

https://paraxial.io/blog/elixir-savings


本記事は [autoracex #253](https://autoracex.connpass.com/event/298184/) の成果です。ありがとうございます。

https://autoracex.connpass.com/

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

[Livebook の README]: https://github.com/livebook-dev/livebook#docker
[Livebook]: https://livebook.dev/
[Phoenix]: https://www.phoenixframework.org/
[Erlang]: https://www.erlang.org/
[Elixir]: https://elixir-lang.org/
[Docker]: https://docs.docker.jp/get-started/overview.html

![toukon-qiita-macbook_20230912_091808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/fd5c55ec-4fe0-8af6-59bc-bab1ef3d182b.jpeg)
Web技術に関する基本用語－4選

## ステートフル（stateful）
#### サーバーが現在のセッション（関連する処理を行う一連の流れ）状況を保ったままで次の処理を行う状態のことを指す。

::: note
ショッピングサイトでは、ログイン状態を保ったままで他のセッション（商品をカゴに入れたり、決済）が行えるようにしている。
:::


　例 ) ログインした状態で電子書籍を購入するときとか。

## ステートレス（stateless）
#### サーバーが以前のセッション状況を保たずに次の処理を行う状態を指す。
::: note
サーバーにかかる負担を軽減させるために、動画のストリーミング再生や音声通話など、ステートフルである必要のない場面では、ステートレスな状態になるようプログラムされている。
:::

## クッキー（Cookie）
#### WebサーバーとWebブラウザの間にやり取りされた情報を保存しているデータのこと


例)　過去に検索した漫画に関する広告が前触れなく表示される




## ポート番号
コンピューター同士が通信するために使う通信用の「部屋の番号」のようなものです。

例えば似たようなものに、IPアドレスがあります。IPアドレスはインターネットに接続する全てのコンピュータ１つ１つに割り当てられており、コンピューターを一意に特定することができるので、インターネット上の住所に例えられることがあります。

なのでIPアドレスとポート番号の違いは住所なのか、部屋の番号なのか、となりますが・・それだけだとまだまだイメージをしにくいです。（わたしが。）


![ポート番号の説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439948/b4ad54e5-0d0c-8b6b-50bf-402c874c5465.png)



1つのコンピューターを病院にみたてます。IPアドレスが病院の建物そのもので、ポート番号を病院内の診療科(お部屋)だと想像してください。病院には内科、外科、皮膚科、泌尿器科、検査科、放射線科など色んな科(お部屋)があります。

そして当たり前ですが、内科の診療室では内科医が患者を診ます。外科医が診るわけではありません。X線やMRI検査など放射線を扱うお部屋も、病院内のすべてのお部屋にあるわけではなく、放射線科にあります。手術も、外来や病棟で行うのではなく、手術室で行います。

病院と同じで、1つのコンピューター内には、「メールの送受信をする」プログラムや「WEBサーバと通信をする」プログラム、「ファイルを編集する」プログラムなど色んなプログラムが入っています。

「メールの送受信をする」プログラムが「ファイルを編集」したりはしません。つまり、ポート番号はプログラムを識別する番号だといえます。また、各々が適当に番号を付けていると不都合なので、ポート番号は世界共通であらかじめ用途が決められています。

:::note 《補足》
正確にはポート番号は0番～65535番まで存在し、かつポート番号ごとに用途が定められているのは0番から1023番のウェルノウン（Well Known）ポート番号になります。
:::

その他、リクエスト・レスポンス・プロトコルなどの用語は、以前の記事で紹介した動画がイメージしやすいです♪


https://qiita.com/asuka-80/items/d560c24a57e437ede439
miniforgeでjaxをM1 Macに入れてみた

# はじめに
普段大学の研究ではサーバーのGPU上でpythonのライブラリであるjaxを使っています。jaxは線形代数関連の演算を非常に速く処理することができ便利なので、できればローカルでも使用したかったのですが、Apple Sliconである**M1 Mac**だと今までインストールが上手く行きませんでした。日本語で解説しているサイトがなかったためここでごく簡単にまとめておきます。

<!-- 各チャプター -->
# 環境
- OS: macOS Monterey
- チップ: Apple M1
- python: 3.11

# インストール方法
インストール方法で大事なことはただ一つ、[**miniforge**](https://github.com/conda-forge/miniforge)でパッケージをインストールするということでした。非常に簡単なのですが、明記されているWebサイトが少なく気づくまで苦労しました。[こちらのstack overflow](https://stackoverflow.com/questions/70815864/how-to-install-trax-jax-jaxlib-on-m1-mac-on-macos-12)に記載があります。

インストール方法自体は他の方がすでにまとめてくれているので、参考文献に記載しておきます。

miniforgeをinstallし、condaのpathがminiforgeのcondaに通っていることを確認すれば、あとはpipでinstallするだけです。
```
pip install jaxlib jax
```

これでjaxがM1 mac上で動くようになりました。

# 試してみる
以下の非常に簡単なコードで、numpyとjaxの計算速度の比較、自動微分について計算してみました。
```python:jax_test.py
import time
import timeit

import jax.numpy as jnp
import numpy as np

# numpy array
x_np = np.random.rand(10000, 10000)
y_np = np.random.rand(10000, 10000)
# jax array
x_jax = jnp.array(x_np)
y_jax = jnp.array(y_np)


# numpy arrayの計算 (numpyの計算速度)
np_time = timeit.timeit(
    "x_np * y_np", setup="from __main__ import x_np, y_np", number=100
)
print(f"Average numpy calculation time: {np_time / 100} seconds")

# jax arrayの計算 (jaxの計算速度)
jax_time = timeit.timeit(
    "x_jax * y_jax", setup="from __main__ import x_jax, y_jax", number=100
)
print(f"Average jax calculation time: {jax_time / 100} seconds")


## jaxの自動微分
from jax import grad


def f(x):
    return x**2 + 2 * x + 1


f_grad = grad(f)
print(f"gradient of function f at x=1.0: {f_grad(1.0)}")
```
出力
```
Average numpy calculation time: 0.19221712457947432 seconds
Average jax calculation time: 0.03303184084012173 seconds
gradient of function f at x=1.0: 4.0
```
計算時間がnumpyに比べて~x6になっていて、自動微分の計算もできています！

ローカルでの計算速度も早くなったので、これでより研究を加速させていきたいと思います。

<a id="#reference"></a>
# 参考文献
- [Apple M1 に miniforgeをインストールする](https://qiita.com/nr46/items/1db6e9cb647fbd6bef3f)
- [M1 Macで機械学習やPythonはMiniforgeを使う](https://qiita.com/kujirahand/items/9bf1a1e7bd34bdb87da5)
【Vue.js】Formのbutton押下時に画面がリロードしないようにする

# 問題
Formのbutton押下すると画面全体がリロードする。

# 解決方法
clickイベント発火時event.preventDefaultを呼び出すと、デフォルトの動作（今回だとフォームの内容を指定したURLへ送信する）をキャンセルできる。
```ruby:HTML
<section id="events" v-cloak>
    <form @submit="submitForm">
        <input type="text">
        <button>Sign up</button>
    </form>
</section>
```

```ruby:Javascript
const app = Vue.createApp({
  methods:{
    submitForm(event){
      event.preventDefault();
    }
  }
}).mount('#events');
```

他にもチェックボックス押下時に、チェックボックスが切り替わらないように処理を加えることも可能。

# おわりに
今回のForm以外にも使う場面はありそう。他のメソッドと組み合わせて使ってみたい。

# 参考
https://developer.mozilla.org/ja/docs/Web/API/Event/preventDefault#%E4%BB%95%E6%A7%98%E6%9B%B8
https://qiita.com/yokoto/items/27c56ebc4b818167ef9e
Vueの勉強で活用中⇒https://www.udemy.com/course/vuejs-2-the-complete-guide/
DebianにpyenvとMinicondaをインストールし、仮想環境を作る

# gitをインストールする
```
sudo apt-get install git -y
```

# pyenvをインストールする
```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
# pyenvの環境変数を追加する
```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

# minicondaをインストールする
```
pyenv install miniconda3-4.7.12
pyenv global miniconda3-4.7.12
conda init bash
source .bashrc
```

# minicondaのパッケージを最新化する
```
conda update --all
```

# Pythonのバージョンを調べる
```
conda search python
```

# 仮想環境を作る
```
conda create -n entry_env python=3.10
```

# 仮想環境を表示する
```
conda env list
```

# 仮想環境を有効化する
```
conda activate entry_env
conda environments:
#
base                  *  /home/foobar/.pyenv/versions/miniconda3-4.7.12
entry_env                /home/foobar/.pyenv/versions/miniconda3-4.7.12/envs/entry_env
```

# 仮想環境を無効化する
```
conda deactivate
```

# 仮想環境を削除する
```
conda remove -n entry_env -all
```

以上です。

# 参考
https://github.com/pyenv/pyenv
autolinkの使い方

`autolink`をはじめて使用したので使い方をメモする。

```xml
android:autoLink="web"
android:text="詳しくは https://www.google.com/ よりご確認ください。"
android:textColorLink="#0095d9"
<!-- 青色　-->
```

上記コードのように`autoLink`と1行書くだけで自動でリンク化することができる。
リンクの色は`textColorLink`で指定することができる。
リンクの前後で半角スペースなどを入れておいて、他の文字までリンク化するのを防ぐ。
複数をリンクかしたいときは`android:autoLink="web|email"`などと書くことによって自動で判別してくれる。