OmniAICreator/Qiita-1.07M huggingface dataset:
Prisma vs Sequelize

# 事の経緯

最近Nuxt.jsを使用するにあたり、ORMに何を利用するか？ということを検討していた。
そもそもこれまでsequelizeを使用しており、ある程度の成約はあれどそこまで苦慮することはなかったためそのままでも良いかなと思っていたが、nuxt3の導入記事などでprismaというものを採用している記事が多く、気になって調べてみた。

# ORMって何？

wikipediaの説明そのままだが、Object-relational mappingの略であり、SQLを書かかずにクエリを生成してくれる点となる。
これの何が嬉しいかというと採用しているDBへの意識を最小限に抑えることができる点に大きくメリットがあると考える。
多くのレジェンドシステムが眠る企業では、DB2やSQL Serverなどを利用しているだろう。
その中でライセンスに関する課題などの諸事情により、無償のオープンソースデータベースへの転換を考えている場合、移行できない関数やクエリが存在する。
例えば、SQL ServerのTopはPostgresqlのlimitに置き換えが必要な点など。
アプリケーション層にこのようなDBの仕様に左右される実装が存在してしまうと、DBの変更やメジャーバージョンを大きく変更する際に検討事項が多く、手間がかかってしまうことであろう。

ここからは個人的になので反感を買うかもしれないが、SQLをアプリケーションに記載すること自体にあまり美しさを感じないため、ORMでの実装をすべきと考える次第である。
クエリがかけなくてもデータベース操作ができる！というわけではなく、SQLそのものの基礎知識、データベースそのものへの基礎知識はあってこそ利用できるものであるという前提で利用すべきであろう。

# sequelizeって？

細かい歴史まで調べているわけではないが10年以上から活躍しているORMとなる。
現在の活躍している中では一番といってもいいくらい古株ではないだろうか？
そのため、関連する記事の数も多く存在するため開発はしやすいと考える。
個人的に不便さを感じていたところは複合キーによるjoinが（少なくとも簡単に）できなかったこと、モデルの生成がsequelize-autoを使用する必要があること（別なモジュールを導入する必要があること）、Associationの実装はsequelize-autoでモデルを作成したあと、ひと手間加えなければできなかったこと（正解にたどり着けていないだけかもしれません）にありました。

# prismaって？

歴史が浅いORMではありますが、上記sequelizeで抱えていた不便さを払拭できました。
標準でモデルの自動生成はできる、複合joinができる、外部キーの成約も自動でつくと感動を覚えた記憶があります。
またtypescript向けである点にも共感を持てるため今後の発展にも期待が持てます。
**一方これらのメリットは適切なテーブル定義のもとで得られます。**
ただ、sequelizeについても同様ですが、サブクエリを必要とする場合はやや力技になりがちです。


# どちらを使ったほうがいいの？

圧倒的にprismaなのですが、typescriptについてもそれなりな癖があるため、ES6などで開発する場合にはsequelize（または他）、typescriptで開発する場合はprismaが良いのではないでしょうか。
typescriptの将来性は高いと思いますので、時間に多少のゆとりがあり、新規での開発の場合はtypescriptへの挑戦も含めてprisma導入が好ましいと思います。
WSL2のTips

# はじめに
WSL2のTipsをまとめる。Linuxの一般的な内容も含む。

# 目次
+ [ホームディレクトリ](#ホームディレクトリ)
+ [ユーザ追加](#ユーザ追加)
+ [Windowsのファイルエクスプローラを起動する](#windowsのファイルエクスプローラを起動する)
+ [ファイル権限変更](#ファイル権限変更)
+ [chmod](#chmod)
+ [USBメモリをマウント](#usbメモリをマウント)
+ [Linux関連Tipsへ](https://qiita.com/tapitapi/items/2e730426791867a1ac88)

## ホームディレクトリ
　WindowsでWSL2(Ubuntu)を起動させたとき、root権限のままだと、起動ディレクトリが```/root```になっている。(```/```でない)注意。
```console:cmd
$ pwd
$ /root
```
ホームディレクトリへの移動は
```console:cmd
$ cd ~/
```
[戻る](#目次)

## ユーザ追加
WSL2(Ubuntu)でユーザ追加
```console:cmd
$ sudo adduser <ユーザ名>
```
追加したユーザをWSL2(Ubuntu)の起動時のユーザにしたい場合
PowerShellを起動して
```PowerShell:powershell
#ubunt22.04の場合 <ユーザ名>にする
ubuntu2204 config --default-user <ユーザ名>
#ubunt22.04の場合 rootに戻す
ubuntu2204 config --default-user root
```
[戻る](#目次)

## Windowsのファイルエクスプローラを起動する
　WSL2(Ubuntu)でWindowsのファイルエクスプローラーを起動させる方法。これでwindowsとWSL2(Ubuntu)間でファイルのやり取りできる。Windows-WSL2(Ubuntu)間でのファイル移動は権限の注意が必要。
```console:cmd
$ explorer.exe .
```
[戻る](#目次)

## ファイル権限変更
root権限をuserの権限に変更
```console:cmd
#test.txtをuserへグループ、ユーザ所有権両方変更
$ sudo chown user:user test.txt
#test.txtをuserへユーザー所有権を変更
$ sudo chown user test.txt
```
[戻る](#目次)

## chmod
 chmodで権限を変更する

**chmod [所有者][グループ][その他] <ファイル名>**

+ r：読み込み権限
+ w：書き込み権限
+ x：実行権限

---|--x|-w-|-wx|r--|r-x|rw-|rwx|
:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:
 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 

```console:cmd
$ chmod 777 test.txt
$ -rwxrwxrwx test.txt
```
[戻る](#目次)

## USBメモリをマウント
　PCに刺したUSBメモリをマウントする。Windows上のドライブが Eドライブだった場合の例。
```console:cmd
# Eドライブでmount---
$ sudo mkdir /mnt/usb
$ sudo mount -t drvfs e: /mnt/usb/

# unmount---
$ sudo umount /mnt/usb
```
[戻る](#目次)
VSCode 警告個所にカーソルを合わせたら変な音が鳴るので消した

# まとめ
VSCode の設定画面にて、以下どちらかの方法で対応。
+ "Audio Cues: Line Has Error" を "off" に設定
+ "Audio Cues: Volume" を 0 に設定（筆者はこちらを採用）

# 対応手順
VSCode で設定画面を開く。
"audio" で検索。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563782/6ec3f5e6-752a-bf0f-44ea-fcd9855ee60c.png)

今回聴いた音は赤枠内が該当するが、他にも音が鳴りそうな設定があった。

現状鳴ってほしい場面が無かった && 一つ一つ設定するのも面倒だった
ので、音量を0に設定した。

規定値：70 → 0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563782/04e44de4-f6f6-e0d4-80f7-c6d5c1d7ba85.png)

# 余談
警告、折り畳み、ブレークポイントそれぞれで音が違うので、
全部違う音を用意しているかも。（未検証）

大分愉快な音が鳴るので、癒し枠として有能。
XIAO RP2040が書き込めなくなってしまったときの対処法

PlatformIOでXIAO RP2040に書き込みをしようとしたところ、
```
Looking for upload port...
Error: Please specify `upload_port` for environment or use global `--upload-port` option.
For some development platforms it can be a USB flash drive (i.e. /media/<user>/<device name>)
*** [upload] Explicit exit, status 1
========================================================================= [FAILED] Took 6.85 seconds =========================================================================

```
のように書き込めなくなってしまいました。
そういえば昔Pythonのファームウェアを書き込んだような、、それが原因かもしれません。

その場合、
１．ビルド時に、```[プロジェクト]\.pio\build\seeed_xiao_rp2040\firmware.uf2```ができているのを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f62ce183-9166-4fb0-d02b-f5d3ba74323b.png)

２．Bボタンを押した状態でリセットを押し、リセットを話してからBボタンを離す
３．ドライブがあらわれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a3e8f4c8-6bbc-3191-f40a-ba05bbf797f6.png)

４．ドライブにfirmware.uf2をドラッグ＆ドロップ
５．書き込み完了。以後普通に書き込みができるようになります。
🔍🎬 Kusto Detective Agency Season 2 🎉🔍のまとめ

# はじめに

Season 2 完走したのでまとめておきます。

## Kusto Detective Agency とは

https://detective.kusto.io/

Kusto に関連したクイズ形式の問題を解いて、楽しく無料で Kusto、データ解析を学ぼうという趣旨の企画です。
MSアカウントか、Azure AD Identity があれば、無料でフリークラスターを作成して実習環境がつくれます。

> You'll need the following to get started:
>
> A Microsoft account (MSA) or an Azure Active Directory (Azure AD) identity
> A free personal cluster - You'll need its URI to log in to the agency

https://learn.microsoft.com/ja-jp/azure/data-explorer/start-for-free-web-ui

各問題ケースでは、kusto のテクニックを駆使して、与えられたデータセットから回答を導き出す必要があります。
普段の業務ではなかなか使わないような関数だったりもでてきますが、ヒントやドキュメントを見ながら使い方を学んで実践することができます。

### Season 2

<iframe width="560" height="315" src="https://www.youtube.com/embed/mnvkgpl7RPE?si=jBnwjHcEN4oATz5i" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

https://techcommunity.microsoft.com/t5/azure-data-explorer-blog/introducing-kusto-detective-agency-season-2-bigger-better-and/ba-p/3829614

Season 2 は AMD がスポンサーに入っており、Season 1 に比べて問題数が2倍、賞品ありとなっています。
賞品は snappy から選択する形式となっており、Location で US を選択した場合は、KDA ロゴ入りグッズ等が選べるようですが、日本向けの発送の賞品は ￥3,000 ~ ￥5,000 程度の品が Amazon.co.jp 経由だったりします。


# Season 2 攻略メモ

## タグ付け記事一覧

https://qiita.com/tags/kustodetectiveagency

## Onboarding, Case 1, Case2 

https://qiita.com/georgeOsdDev@github/items/dc1de56bf8c1a2d7547e

## Case 3

https://qiita.com/georgeOsdDev@github/items/3c9ead422bc3a0be08f9

## Case 4

https://qiita.com/georgeOsdDev@github/items/8f726405444c7f9de756

## Case 5

https://qiita.com/georgeOsdDev@github/items/5a0501f5af2eb8feb5e2

## Case 6

https://qiita.com/georgeOsdDev@github/items/4bdf605aa6d222436597

## Case 7

https://qiita.com/georgeOsdDev@github/items/9cc915df287c83ca2ac4

## Case 8

https://qiita.com/georgeOsdDev@github/items/e59ef92581c4fbf44c22

## Case 9

https://qiita.com/georgeOsdDev@github/items/0c1e3f485d9e9941749d

## Case 10

https://qiita.com/georgeOsdDev@github/items/9ae8a467385b99e32205

https://qiita.com/georgeOsdDev@github/items/0f366388a1fcffe40418
第1回 橋本環奈の画像を自動で集めるプログラムを作成してみた

# やったこと
画像分類の勉強のため、入力された画像が橋本環奈さんであるかを判定するAIを作ろうと考えた。
今回は学習に使用する画像を数百枚集まるため、icrawlerを使って画像を収集した。

# 事前準備
icrawlerのライブラリをインストール<br>
```
pip install icrawler
```

# ソースコード
今回ダウンロードに使用したプログラム以下の通りです。
注意点として、img_maxnumberの値が大きいとダウンロードに失敗することがあり、img_maxnumberで設定した画像枚数ダウンロードされないことがありました。
```python: ImgDownload.py
import os
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from icrawler.builtin import BingImageCrawler

# 事前準備
img_maxnumber = 100 #最大ダウンロード枚数
img_keyword = '橋本環奈' #ダウンロードした画像の名称
savedir = './imgs/' #画像の保存先
os.makedirs(savedir, exist_ok=True) #保存先フォルダの作成
# 画像のダウンロード
crawler = BingImageCrawler(downloader_threads=4, storage={"root_dir": savedir})
crawler.crawl(keyword=img_keyword, max_num=img_maxnumber)

# ダウンロードした画像の一部を表示
imgs = glob.glob(f'{savedir}*')
plt.figure(figsize=(12, 10))
for index, img_path in enumerate(imgs[:10]):
    img = Image.open(img_path)
    img_array = np.asarray(img)
    plt.subplot(2, 5, index+1)
    plt.imshow(img_array)
    plt.axis('off')
plt.show()
```

# まとめ
今回は上記のプログラムを使って、橋本環奈さんの画像を500枚ダウンロードした。また画像分類には橋本環奈さん以外の画像も必要となるため、橋本環奈さん以外の画像も500枚ダウンロードした。

# 関連記事

https://qiita.com/Naruhidon/items/5a8d18525e80f487ed8e

https://qiita.com/Naruhidon/items/0b4b120c4a2d492dc1ad
Unity/ネットワークの問題の解決

ファイアウォールの設定
以下をファイアウォールの許可されたドメインのリストに追加してください。

https://docs.unity3d.com/ja/2020.3/Manual/upm-config-network.html

packages.unity.com
download.packages.unity.com
upm-cdn.unity.com (または upm-cdn-china.unitychina.cn 中国国内)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/335b8347-307d-7272-6957-9b9d9eb2d57f.png)
Google Cloud ShellでWordPressを動かす

### MySQLのインストール

```bash
sudo apt update \
  && sudo DEBIAN_FRONTEND=noninteractive apt install -y mysql-server \
  && (sudo mysqld_safe &) \
  && sleep 10 \
  && echo "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY ''" | sudo mysql \
  && echo 'CREATE DATABASE wordpress' | sudo mysql
```

### WordPressで必要そうなモジュールのインストール

```bash
sudo apt install -y php7.4-curl php7.4-imagick php7.4-zip php7.4-gd php7.4-intl
```

`php -v`のバージョンと合わせること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c497f1b3-1ca6-2379-c901-314b3a80cb55.png)


### WordPressをダウンロード

```bash
git clone https://github.com/WordPress/WordPress
cd WordPress
```

### WordPressを起動

```bash
php -S localhost:8080
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/15090af0-b1c1-879f-21ae-09c104014a67.png)


WordPressのインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/6ffdcab7-9a1e-240d-9ab0-b5eed55b995f.png)
AWS Solutions Architect - Associate(C03) 合格奮闘記

# 追記　合格しました！！お仕事ください！！

# なんで取るの？
今働いてる会社で古くなったアプリケーションを更改する予定があり、インフラ側も新しく見直そうという機運が高まっている。
今はMicrosoft Azureだが、聞くところによるとAWSの方が障害が少ないらしい。
個人的な印象では、GithubとのCI/CD連携でPushしてもなかなか反映されなかったり、ログの表示がおかしいことがあるので、そういう地味に嫌なところがなくなったら良いな、と思っている。
あとはこんなものを見つけてしまったので、将来のキャリアも含めて無いよりはあった方が良いか、という感じ。50％オフはでかい。
https://pages.awscloud.com/jp-traincert-certification-challenge-associate-2023-terms-and-conditions.html

# どうやって勉強するの？
とりあえず今はひたすらCloudTechさんの動画見まくってます。
https://www.youtube.com/playlist?list=PL2nCE2iR-lpm71Vvu0Xn11lEqa5IXAyC1
これ無料なんて、良いんですか？
ちなみにこれで十分かどうかは知らない。
9/27追記
全然足らないらしいので、Udemyで対策セット購入しました。
https://www.udemy.com/course/aws-knan/
追記ここまで

# 個人的なバックグラウンド
もともとインフラ側にいた人間なので、アーキテクチャはなんとなく頭に描けるし、耐障害性とかセキュリティとかはわかってるつもり。でも本気で勉強したことないので、今回はいい機会だと思ってる。
ちなみに基本情報は持ってる。 ~~忘れたけど~~
でもってデータベースエンジニアやってるからそこらへんも一通り。
弱いとしたら、ユーザの権限周り（IAMとか）、ネットワーク周りだと思う。

# そういえば
AWS触ったことない。業務でAzureと趣味でGCPを少々。
なので用語はちんぷんかんぷん。問題解くごとに調べて「なるほど、これはAzureでいうとこのあれだな」みたいなことをしてる。

# 最後に
別記事で勉強したことを自分用に残していくつもりなのでよかったら覗いてってください。
試験まであと１ヶ月。頑張ります。
BigQueryで複数データを日ごとに集計してLookerStudioで表示する方法

# はじめに

複数のデータを集計して1つのグラフで表示したい時ってありますよね？私はあります。
でも日ごとに集計するとデータが存在しない日が欠けてしまって、うまく出せないーということがあります。
昔からそんなシーンが稀に良くありましたが、ググってもバシッと見つかることが無く、無駄に時間を割いたりしていました。

ということで書いておきたいと思います。
もし同じ悩みで困っている人の助けになったら嬉しいです。

## 環境情報

* BigQuery
    * データセット名は `data_set` としています
* Looker studio

## 前提

データは以下のような情報となっていることを想定しています。

* customerデータ
    * id, name, status, create_date, update_dateを持っている
    * カスタマーが登録した場合にデータが挿入される
* providerデータ
    * id, name, status, create_date, update_dateを持っている
    * カスタマーが登録した場合にデータが挿入される

**概要**
サービスにproviderとcustomerのロールがそれぞれあり、登録した場合にレコードが追加される。
サービスの状況を把握するため日ごとの登録者数を可視化したい。

# BigQueryでデータを集計

## withの利用

集計にあたり複数のテーブルを利用するため、それぞれ内容を解りやすくするためにwith句を利用します。構文はこんな感じです。

```
-- 1つ目
with [仮テーブル名] as (
-- 抽出SQL
)

--2つ目以降
, [仮テーブル名] as (
-- 抽出SQL
)
```

## 日ごとに集約するためにカレンダーデータを用意

特定の日（この例では `2020-01-01`）を起点として実行した日までの日付データを網羅します。

```
with calendar AS (
  SELECT
    create_date
  FROM
    UNNEST(GENERATE_DATE_ARRAY('2020-01-01', CURRENT_DATE(), INTERVAL 1 DAY)) AS create_date
)
```

## customerとproviderを集計

それぞれ、`create_date` でグループ化してレコード数をカウントします。

```
, provider as (
  select 
    date(create_date) create_date,
    count(*) provider_count
  from `data_set.provider` 
  group by create_date
)

, customer as (
  select 
    date(create_date) create_date,
    count(*) customer_count
  from `data_set.customer` 
  group by create_date
)
```

## 日で結合

カレンダーとして抽出した `calendar` を軸にそれぞれの集計結果を結合します。
対象日のデータが存在しない場合は `0` となるようにするため、表結合は `left outer join` を使い、`null` の場合は `0` となるようにしておきます。

```
select
  calendar.create_date,
  ifnull(provider_count, 0) provider_count,
  ifnull(customer_count, 0) customer_count,
from calendar
  left outer join provider on calendar.create_date = provider.create_date
  left outer join customer on calendar.create_date = customer.create_date
```

これで日ごとに複数のデータの集計結果がまとまりました。

## ビューとして保存

作成したクエリを実行して期待通りの結果が得られたら `ビューを保存` を行っておきます。
BigQueryからはこのビューを参照します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140133/30148475-144a-83c5-9e60-25a0ff472c93.png)



# Looker studioで表示する

ここからはLooker studioでの作業となります。
基本的な操作は出来る前提として簡略化しているので、もし操作方法が解らない場合は他のガイドを平行で参照してください。


## レポートを新規作成

新しいレポートを作成します。内容は割愛します。


## データソースを追加

`データを追加` からデータソースとしてBigQueryを選択し、先ほど保存したビューを選択します。
特に編集はしないのでそのまま追加します。


## 折れ線グラフを追加

レポートに折れ線グラフを追加、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140133/392f8781-87fa-472c-b7c7-6ed262a3206c.png)

グラフの設定でディメンションを `create_date` に、指標に `customer_count` と `provider_count` にします。並べ替えは `create_date` の昇順にすると良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140133/fa75e340-2cba-6791-5128-fc3d0792d9d4.png)


もし集計結果の合計値の差が大きい場合は片方のデータを `右側` にしておくと、メモリの範囲が2つに分かれてグラフが見やすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140133/b1f91faf-6bcb-79d3-26b8-e6f3111c125c.png)

グラフの表示結果はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140133/913e2239-2cf1-ae48-48d0-be3b3901de5e.png)

# おわりに

基本的な使い方は以上ですが、ユーザのデータ数だけでなく、トランザクションデータなど集計対象のデータを更に結合していくことで、ユーザ数の推移とトランザクションの推移を同時に可視化するなど、応用が利くかと思います。
日本でもStudio Botが使えるようになっていたよ！

# 概要
なんと、CanaryでStudio Bot（Android StudioのAIチャット）が日本でも使えるようになっていました！
（Android Studio Iguana | 2023.2.1 Canary 5 で確認しました）

https://android-developers.googleblog.com/2023/09/studio-bot-expands-to-international-markets.html

# 設定方法

Settings > Appearance & Behavior > System Settings > Data Sharing の「Send usage statistics to google」をONにする
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441643/beb9432d-3440-ca1d-1630-dfb237d4620d.png)

View > Tool Windows > Studio Bot でTool Windowsを開く
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441643/7054642d-eae4-7004-c84f-7586b5c23dd2.png)

ログインして、規約に同意したら使えます
試したところ、日本語での応答もOKでした！
|1|2|3|4|
|---|---|---|---|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441643/8cf9c55a-7515-ac4e-cd11-92100fd76823.png" width="200" /> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441643/4b65359c-619e-e768-5456-64e46c9279b6.png" width="200" /> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441643/650dc23f-52f7-c729-3e50-3b018c70cda3.png" width="200" /> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441643/ce245522-a732-802f-0b74-634713e13c33.png" width="200" /> |

詳しくは以下の公式を参照してください

https://developer.android.com/studio/preview/studio-bot
Javaで「日時に関する情報を取得する」の動作を確認してみた

# 概要

Javaで「日時に関する情報を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/calendar/index2.html

# 実装

以下のファイルを作成しました。
```TestCalendar1.java
import java.util.Calendar;

class TestCalendar1{
  public static void main(String args[]){
    String[] week_name = {"日曜日", "月曜日", "火曜日", "水曜日", 
                          "木曜日", "金曜日", "土曜日"};

    Calendar calendar = Calendar.getInstance();

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DATE);
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    int second = calendar.get(Calendar.SECOND);
    int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;

    int day_of_year = calendar.get(Calendar.DAY_OF_YEAR);

    System.out.println("現在の日時は");
    System.out.println(year + "年" + month + "月" + day + "日");
    System.out.println("(" + week_name[week] + ")");
    System.out.println(hour + "時" + minute + "分" + second + "秒");

    System.out.println("今日は今年の" + day_of_year + "日目です");
  }
}
```

以下のコマンドを実行しました。
```
$ javac TestCalendar1.java 
$ java TestCalendar1 
現在の日時は
2023年9月24日
(日曜日)
9時16分58秒
今日は今年の267日目です
```

# まとめ

何かの役に立てばと。
AlmaLinux/Ubuntu で古いカーネルを削除する方法

# AlmaLinux/Ubuntu で古いカーネルを削除する方法
思いついたときに即座に思い出せればいいのですが、この手のコマンドは毎回Google先生に聞くところから始める…。

# AlmaLinux で古いカーネルを削除する方法

https://shobon.hatenablog.com/entry/2022/05/04/AlmaLinux/RockyLinux_8_%E3%81%A7%E5%8F%A4%E3%81%84%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

```baxh
$ sudo dnf remove --oldinstallonly --setopt installonly_limit=2 kernel
```

# Ubuntu で古いカーネルを削除する方法

https://matsu.teraren.com/blog/2020/01/07/debian-ubuntu-remove-old-kernels/

```baxh
$ sudo apt-get --purge autoremove
```
「/flutter/bin/cache/artifacts/engine/darwin-x64/const_finder.dart.snapshot': No such file or directory」対処

iOS17の更新により、MacOS・XCodeをアップデートしたことがきっかけと思われるが、FlutterアプリをXCodeで Archiveしようとしたら下記のエラーとなった

```
Error (Xcode): Target release_ios_bundle_flutter_assets failed: IconTreeShakerException: ConstFinder failure: 
../../flutter/bin/cache/artifacts/engine/darwin-x64/const_finder.dart.snapshot: Error: Error when reading
'../../flutter/bin/cache/artifacts/engine/darwin-x64/const_finder.dart.snapshot': No such file or directory
```

## 対処

結論としては、参考元の通り、下記で解決した
- 「flutter/bin/cache/」を削除する

## 試したこと

こちらは試したが改善しなかった
- 「flutter/bin/cache/artifacts」を削除する


## 参考元

https://teratail.com/questions/1tx8loq22fdg6w

https://github.com/flutter/flutter/issues/67153
minecraftJava版のMODサーバーをdockerで構築

docker-ceとdocker-compose-pluginをインストール
（ほかの記事に任せます）

一般ユーザでdockerを実行できるようにする

    $ sudo usermod -G docker hoge
    $ sudo cat /etc/group | grep docker
    docker:x:993:hoge

上記設定反映のために一度切断

    $ exit

再接続し、/opt配下に統合版用のcompose置き場を作成

    $ sudo mkdir /opt/docker
    $ sudo chown hoge:hoge /opt/docker
 

compose作成

    $ cd /opt/docker
    $ vi compose.yml
    ----------ここから----------
    services:
      java:
        image: itzg/minecraft-server:java8
        container_name: pixelmon(MOD名等)
        restart: always
        environment:
          EULA: "TRUE"
          VERSION: 1.16.5(modに合わせる)
          TYPE: FORGE
          FORGE_VERSION: 36.2.34(modに合わせる
          MEMORY: 3G(スペック次第)
          SERVER_NAME: 任意(hogeサーバ等)
          LEVEL_NAME: pixelmon(MOD名等)
          GAMEMODE: survival
          DIFFICULTY: normal
          TZ: Asia/Tokyo
      ports:
        - 25565:25565/tcp
      volumes:
        - /pixelmon:/data
    #lokiにlogを送付する場合のみ設定
      logging:
        driver:loki
        options:
          loki-url:http://192.168.1.x:3100/loki/api/v1/push
    volumes:
      pixelmon:
    #volumeの場所
    #/var/lib/docker/volumes/docker_pixelmon/_data/
    ----------ここまで----------
   
docker を起動(forgeのインストール)

    $ docker compose up -d


docker を停止してMODの追加

    $ docker compose down

    下記ディレクトリにforgeがあることを確認
    hostname:/var/lib/docker/volumes/docker_pixelmon/_data# ls | grep forge
    forge-1.16.5-36.2.34.jar

    modディレクトリにMODを格納（wgetで直接downloadか、windowsからwinscp等）
    hostname:/var/lib/docker/volumes/docker_pixelmon/_data/mods# ls
    Pixelmon-1.16.5-9.1.6-universal.jar


docker を起動

    $ docker compose up -d

動作を確認

    $ docker ps
    CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS                    PORTS                      NAMES
    7df3b1395875   itzg/minecraft-server:java8     "/usr/local/bin/entr…"   15 minutes ago   Up 15 minutes (healthy)   0.0.0.0:25565->25565/tcp   pixelmon

子供向けのサーバチューニング（お好みで）
    
    $ docker attach bedrock_server #アタッチコマンド
    gamerule showCoordinates true　#座標を表示
    gamerule pvp false　#味方へのダメージ無効
    gamerule keepInventory true　#死亡時にアイテムを落とさない
    Ctrl+P　→　Ctrl+Q #タッチコマンド

サーバのバージョンアップ

    $ docker compose down
    $ docker compose up -d
ABC321で中2が入水したよ！！！！

9/23に行われた[ABC321](https://atcoder.jp/contests/abc321)で入水しました！！！

https://twitter.com/hiro_1729/status/1705586413817987446

# 簡単なプロフィール

中2
数検準1級を小6で受かった
数学が得意(OMC水)


# 入水するためにやったこと

- 数検1級勉強(まだ受かっていません…)
- 鉄則本
- アルゴ数学本
- PAST初級
- PAST上級(途中まで)
- 蟻本(途中)
- けんちょん本
- 精進
- 精進
- 精進
- 精進
- 精進
- etc

特に入茶直前に水パフォを出した回では[D問題](https://atcoder.jp/contests/abc279/tasks/abc279_d)に微分の問題が出てすぐ解けたということがありました。
ARCでも青diff[数学問](https://atcoder.jp/contests/arc163/tasks/arc163_c)が解けました。

# 学んだアルゴリズム

0〜5で表しています。
0は全く知らない
1は聞いたことはある
2は知っていて内容もわかるが使えない
3はある程度使える
4はほとんど使える
5は応用ができる

5は突っ込まれたら嫌なのでなるべく書きません。

|アルゴリズム名|入茶時|入緑時|入水時|
|-|-|-|-|
|基本的なDP|3|4|4|
|桁DP|0|2|2|
|bitDP|0|2|3|
|累積和|1|4|4|
|いもす法|1|3|4|
|BFS|2|3|4|
|DFS|2|4|4|
|ダイクストラ法|0|1|3|
|ワーシャルフロイド法|1|1|4|
|ベルマンフォード法|0|2|2|
|クラスカル法|0|2|4|
|Union Find|3|4|4|
|Segment Tree|0|1|3|
|Lazy Segment Tree|0|1|2|
|convolution|0|0|2|
|FPS|0|0|2|

この記事を書く途中で思いついたのはこれだけです…
それっぽいやつがあったらコメントお願いします

# ABC321でしたこと

コンテスト前。風呂から上がって[好きな曲(Mrs. GREEN APPLEのL.P)](https://www.youtube.com/watch?v=Jwjj_Em-mog)を聴きました。

コンテスト開始。前回はCから解き初めて爆死(冷えはなかったけど)したので、きちんと真面目にAから解きます。

Aを開く。隣接する項で左が右よりも大きければいい。文字でも比較できるのでallで判定。28秒でFirstAC取ったか！？と思ったら3位でした。

Bを開く。普通に計算すると大変そうだったので、Nラウンド目のスコアを全探索しました。(0〜100と書いてあったので)
やった、、First ACだ！！！！ABCでは初です！！

Cを開く。DFSが思いついた。バグらせまくって11:19にAC。

Dを開く。$A$と$B$をソートする。
各$i(1 \leq i \leq N)$に対して$A_i + B_j \geq P$を満たす最小の$j$を$C_i$とおくと、$C$は単調減少になるので、尺取り法が使えます。和を計算する部分が遅いので、累積和を使いました。
Pythonで提出(RE)→間に合わないと思いPyPyで提出(RE)→修正してPyPyで提出(AC)
と2ペナしました。

Eを開く。(Xの下)+(Xの上の下以下)+...しかし結局解けず6ペナWAでした。
(読みにくい)

FGは開いてません。

# 終わりに

入水を支えていただいた皆さん、ありがとうございました！！！！！！！！！！！！！！！！
JOIがあるのでそちらもがんばr、次は入青に向けて頑張りたいと思います！！！（水色で停滞する人が多いらしいので）
Windows11+IntelliJ + WSL2での開発環境ベストプラクティス

Jetbrain Gateway + InteliJ + WSL2 (Docker、開発ファイルはWSL2側に置く）というのが快適な開発環境になります。

詳しくは[公式ブログのWSL2 + Docker 環境における IntelliJ リモート開発環境の構築](https://blog.jetbrains.com/ja/2022/02/15/automate-intellij-remotedevenv/#wsl2-docker)
を参照ください。自分も記事を書こうとおもったのですが、結局公式で書かれていることそのままなので、そちらを参照していただいたほうが正確です。

注意: 2023/9/20現在、[この問題により](https://youtrack.jetbrains.com/issue/GTW-6301) Windows11で上記の方法が一時的に使えなくなっています。
Grafana® 10でデータをカスタマイズし、文脈を可視化する

<font color="Grey">*[Customize and contextualize your data with Grafana® 10](https://aiven.io/blog/customize-and-contextualize-your-data-with-grafana-10)の翻訳です。*</font>

2023年9月20日

#Grafana®10でデータをカスタマイズし、文脈化する

Aiven for Grafana®がGrafana® 10に対応しました。新機能と今すぐ始める方法をご覧ください。

組織が監視ソリューションを信頼するためには、それが提供する情報を文脈化できることが不可欠です。特定のアラートが以前に問題を引き起こしたことがあるか？相互接続された何十ものサービスにわたって、ユーザーの体験をどのように追跡できるのか？Aiven for Grafana®の最新バージョンは、Grafana® 10へのアップグレードにより、これらの質問への回答をこれまで以上に簡単にします。


## アップグレードプロセスと変更点


既存のAiven for Grafanaインスタンスは、次の定期メンテナンスウィンドウで自動的にGrafana 10にアップグレードされます。早く始めたいお客様は、Aivenコンソールから手動でメンテナンスアップデートを適用することができます。


Aivenは、スムーズな移行を保証するために、アップグレードプロセスとパッケージ化されたプラグインを徹底的にテストします。[Deprecations and breaking changes](https://grafana.com/docs/grafana/latest/breaking-changes/breaking-changes-v10-0/)の完全なリストは、Grafanaのドキュメントでご覧いただけます。


## Grafana 10 の新機能と注目すべき点


以下に、このリリースからいくつかのエキサイティングなハイライトを集めました。アップデートとパブリックプレビューの完全なリストについては、Grafanaのドキュメントの[What's new in Grafana v10.0](https://grafana.com/docs/grafana/latest/whatsnew/whats-new-in-v10-0)を参照してください。


### あらゆるサイズのカスタムコンテンツ


Grafana 10のリリースに伴い、[canvasパネル](https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/canvas/)が一般利用可能に昇格しました。この新しいパネルは、Grafana のパワーと UI やウェブデザインツールの柔軟性を組み合わせ、組織にとって最も重要なものに合わせてカスタマイズされた動的なビジュアライゼーションの構築を支援します。キャンバスパネルの進化の詳細なランダウンは、例示的なデモのコレクションと共に、Grafanaのエンジニアリングチームによる[このブログポスト](https://grafana.com/blog/2023/05/11/use-canvas-panels-to-customize-visualizations-in-grafana/)を必ずチェックしてください。


![Grafana canvas home solar energy demo screenshot](https://cdn.sanity.io/images/sczeoy4w/production/e0a34bfd5da9990bade741640765ea43a970784b-1631x606.png?q=80&fit=min&auto=format&dpr=1.5)


すべてのカスタマイズがそれほど手の込んだものである必要はありません。時には、チャートやグラフにちょっとした追加コンテキストが必要な場合もあります。[時間領域のサポート](https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/annotate-visualizations/#add-time-regions)を使えば、時系列データのアノテーションとして特定の時間範囲（例えば「営業時間」や「メンテナンスウィンドウ」）を定義することができます。これにより、既知の時間ウィンドウ内の関連データを一目ですばやく特定することができます。


### データを追加して比較する方法が増えました。


カスタムグラフやダッシュボードは、可視化するためのデータがなければ、なかなかうまくいきません。Grafana へのデータロードをさらに簡単にするため、データソースピッカーが合理化されました。最近使用されたコンテンツが見つけやすくなり、ラベルと補足説明が追加され、新しいデータソースを簡単に追加できるようになりました。


データソースといえば、Azure Monitor データソースが更新され、Application Insights Traces の可視化がサポートされました。[クエリエディタ](https://grafana.com/docs/grafana/next/datasources/azure-monitor/query-editor/#query-application-insights-traces) に対応する "traces" クエリタイプが追加され、Application Insights Traces のクエリが容易になりました。


また、このリリースではデータプレーンレイヤーが導入され、さまざまなデータ型に対してスキーマが定義されています。これにより、プラットフォーム全体の信頼性と相互運用性が向上します。各データ型は、「種類」（TimeSeries など）と「形式」（Wide など）の組み合わせで構成されます。データ型の完全なリストは、Grafanaの[データプレーンコントラクト](https://grafana.com/developers/dataplane/)に記載されています。


## 次のステップ


以上、Grafana 10で利用可能な新機能とプレビューの一部をご紹介しました。[新機能](https://grafana.com/docs/grafana/latest/whatsnew/whats-new-in-v10-0/)や[変更点](https://grafana.com/docs/grafana/latest/breaking-changes/breaking-changes-v10-0/)の全リストはGrafanaのドキュメントをご覧ください。


まだAiven for Grafanaを使っていませんか？今が始める絶好の機会です！詳しくは[Aiven for Grafana製品ページ](https://aiven.io/grafana)をご覧ください。
CSSでイイ感じに回るカウンターをつくる

CSSでイイ感じに回るカウンターをつくりたいなーと思うこと、ありますよね

つくりました

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846293/032aa883-853d-9031-865d-94d011cedce1.gif">

https://hsgwkt.github.io/counter-meter/

### 動き

- 表示させる数字は CSS 変数 `--count` で自由に変えられる
- 数字が変わる際は徐々に増減していく

### 桁表示

0～9 の数字が並んだ背景画像をリピートさせるだけ
表示位置が下にずれるほど数字がアップ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846293/98d6a005-ff5c-cdd3-c348-f3982dacde70.png">

```html
<div class="digit"></div>
```
```css
.digit {
  width: 100px;
  height: 100px;
  background-image: url(numbers.png);
  background-size: auto 1000px;
  background-position: center calc(100px * var(--count));
}
```

### 数字の変化

徐々に変化させたい時、頼りになるのが `transition`
数字画像の表示位置に与えれば、くるくると回るアニメになります

```scss
transition: background-position 1s;
```

だけど今回は元となる変数の方をトランジションさせます
9 を超えて初めて十の位が増えるとか、桁を正しく増減させるなら
元となる数値の方を徐々に変化させるのがシンプル

```scss
transition: --count 1s;
```

そのため、変数が数値であることを予め `@property` で宣言しておきます

```css
@property --count {
  syntax: '<number>';
  initial-value: 0;
  inherits: true;
}
```

これで徐々に増減する変数になりました

とはいえ、数字がくるくる回るアニメも欲しいので
結局は表示位置の方も軽めにトランジションさせるんですけども

### 上の桁

一の位は変数の値をそのままでよかった。しかし十の位はどうすればよいのか
そう。10 で割ればいいんですね

```scss
background-position: center calc(100px * var(--count) / 10);
```

けれど、このままだと表示位置が半端なことになります
例えば 9 の表示

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846293/8066fed5-dcaa-3b34-641d-e2c473c1ce7a.png">

十の位の数値が 0.9 になるので、そりゃほぼ 1 ですよね
というわけで `round()` の登場

CSS の計算でも三角関数が使えるように、という話題は割と見るようになりましたが
他にも、べき乗 `pow()` や余剰 `mod()` なども色々増えます

であれば、もちろん端数をどうこうする関数もありまして

https://developer.mozilla.org/en-US/docs/Web/CSS/round

切り上げたり、切り捨てたり、丸めたりたり、いろいろとデキるやつ
ステキ！
しかしこちら、現状では safari と firefox preview だけのようでして

https://caniuse.com/?search=round()

ああ、chrome でも使えるようにならないかな……
と思っていたんですが
なんと chrome でも動きました！

:::note info
2023/09/24 現在
win、mac、iOS の chrome で動いてるっぽいことを確認
android の chrome だけはダメでした
:::

ということで十の位の書き直し

```scss
background-position: center calc(100px * round(down, var(--count) / 10, 1));
```

これできっかりと数字が刻まれるように

あとはここまでをベースに実装や表示を見直して
冒頭のサンプルへ

https://github.com/hsgwkt/counter-meter

### おしまい

CSS 変数に値を反映させるまではスクリプトのちからですが
概ね CSS でイイ感じに回るカウンターと言ってもいいんじゃないでしょうか

正直、特に用途もなくつくりましたが
いつか `@property` や `round()` が安定して使えるようになったなら
活用も考えたいですね
処理を実行しているscript要素を取得する

Document.currentScriptプロパティは現在処理中の`<script>`要素を取得します。値はHTMLScriptElementまたはnullとなります。
サンプルコードを書いてみます。下記のコードは、カウントアップ処理をHTML上に記述したものです。処理に関係のない記述は省略しています。
```html
<div class="countUp"></div>

<script>
    const countUp = document.querySelector('.countUp');
    let n = 0;
    setInterval(() => {
        countUp.textContent = n++;
    }, 1000);
      
    console.log(document.currentScript);
</script>
```
ログの出力は以下になります。
```
<script>
    const countUp = document.querySelector('.countUp');
    let n = 0;
    setInterval(() => {
    countUp.textContent = n++;
    }, 1000);
      
    console.log(document.currentScript);
</script>
```
次はheadタグにscriptタグを挿入し読み込んだ場合です。JavaScriptファイルの処理内容は上のコードと同じです。

```html
<head>
    <script src="./js/script.js" defer></script>
</head>
```
```
<script src="./js/script.js" defer></script>
```

#### 参考
https://www.javadrive.jp/javascript/dom/index26.html

https://js.studio-kingdom.com/javascript/document/current_script
python activateしても仮想環境にはいれない

# activateしても入れない
コマンドプロンプトに仮想環境名(.venv)がでているにもかかわらず、pip freezeをすると相変わらず仮想環境に入れていない環境である。このような場合の対処方法。

#解決方法
仮想環境名が.venvの場合、.venv\Scripts\activate.batをメモ帳で開いて、
```
set VIRTUAL_ENV=(仮想環境のパス)
```
の記述を見て、仮想環境.venvの親フォルダの名前を上のパスのフォルダ名と一致させることで上記の問題を解決できる。仮想環境を構築したときのフォルダ名からフォルダ名を変更してしまうと仮想環境にうまく入れなくなるっぽい。フォルダ名が一緒で、他のフォルダに持っていったときは正しく動いた何はともあれ、仮想環境を構築したときからフォルダ構造は変えない方が安全っぽい。仮想環境というからにはポータブルな感じがしてたのになぁ...。
M5Atom S3 / Lite のLED ピン番号

LEDのピン番号がわかると、M5ライブラリを使わずにLEDを光らせることができます。

LEDパワーピン(```pinMode(NEO_PWR,OUTPUT);  digitalWrite(NEO_PWR, HIGH);```で通電)およびデータピン(```Adafruit_NeoPixel pixels(, データピン, );```で点灯)は以下の通りです。

```M5AtomS3.
POWER_PIN 16
DATA_PIN  35
```
```M5Atom.
POWER_PIN --(最初から通電？)
DATA_PIN  27
```
おまけ
```XIAO RP2040.
POWER_PIN 11
DATA_PIN  12
```

```
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>

#define INI_ATOMS3
#ifdef INI_ATOMS3
#define NEO_PWR (16)
#define NEOPIX (35)
#endif
#ifdef INI_ATOM
#define NEO_PWR (26)
#define NEOPIX (27)
#endif
#ifdef INI_XIAO_RP2040
#define NEO_PWR (11)
#define NEOPIX (12)
#endif

#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, NEOPIX, NEO_GRB + NEO_KHZ800);

void setup() {
  pinMode(NEO_PWR,OUTPUT);  digitalWrite(NEO_PWR, HIGH);
  pixels.begin();
  pixels.setBrightness(20);
  delay(100);
}

void loop() {
  pixels.setPixelColor(0, pixels.Color(0, 55, 0));
  delay(100);
  pixels.setPixelColor(0, pixels.Color(0, 0, 0));
  delay(100);
}
```
【備忘録】KaliLinuxにBurpSuiteをインストールして起動

1. パッケージを更新しておく
    ```
    sudo apt update && apt upgrade -y
    ```

1. javaのバージョンを確認し、ツール実行要件に沿っているか確認する
    ```shell:
    java --version
    openjdk 17.0.9-ea 2023-10-17
    OpenJDK Runtime Environment (build 17.0.9-ea+4-Debian-1)
    OpenJDK 64-Bit Server VM (build 17.0.9-ea+4-Debian-1, mixed mode, sharing)
    ```

1. 以下からBurpSuite(Linux(ARM64))をダウンロードする
    [Professional / Community 2023.10.1.1](https://portswigger.net/burp/releases/professional-community-2023-10-1-1?requestededition=professional&requestedplatform=)

1. 管理者権限でダウンロードしたスクリプトを実行する
    ```shell:
    /bin/sh ./burpsuite_community_linux_arm64_v2023_10_1_1.sh
    Unpacking JRE ...
    Starting Installer ...
    This will install Burp Suite Community Edition on your computer.
    OK [o, Enter], Cancel [c]
    o
    Click Next to continue, or Cancel to exit Setup.
    Select the folder where you would like Burp Suite Community Edition to be
    installed, then click Next.
    Where should Burp Suite Community Edition be installed?
    [/opt/BurpSuiteCommunity]
    Create symlinks?
    Yes [y, Enter], No [n]
    y
    Select the folder where you would like Burp Suite Community Edition to create symlinks, then click Next.
    [/usr/local/bin]
    Extracting files ...
    Setup has finished installing Burp Suite Community Edition on your computer.
    Finishing installation ...
    ```

1. Burp Suiteを起動する
    1. 「I Accept」を押下
        ![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/36ecb349-155b-7fbd-aeba-fafd732629df.png)
    1. 「Next」を押下
        ![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/2e24f60a-1ed6-25a3-5a8e-2bf2c222c1b5.png)
    1. 「Start Burp」を押下
        ![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/56a6c5f3-30e8-fe90-7c60-42445dcfa0ee.png)
    1. 初期画面
        ![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/13a82e2a-de51-fb15-9a38-e1f5bee7d749.png)

---
# 参考資料
- Burp Suiteドキュメント: デスクトップ版
    https://burp-resources-ja.webappsec.jp/Documentation/burp/documentation/desktop/index.html
Djangoのstaticファイル

# static
Djangoで静的ファイル（js css image）等を使用する際に使います。
サーバーで動的な動きをしないファイルですね。

Djangoでは以下のようなディレクトリ構造なのでtest_web内にstaticディレクトリを打ち込みます。
```
.test
├── db.sqlite3
├── manage.py
├── test_app
│   ├── __init__.py
│   ├── ////省略////
└── test_web
    ├── __init__.py
    ├── templates
    ├── models.py
    ├── urls.py
    ├── views.py
    └── test_web  <---ココ
        ├── js
        ├── css
        └── images

```
## setting
セッティングファイルに以下のコードを書いておけば問題ないです。
```
STATIC_URL = 'static/'
```

## staticファイルの読み込み
面倒というか面倒というか忘れがちなのが
{% load static %}
という記述で

```
{% load static %}
<script src="{% static 'js/quiz.js' %}"></script>
```

このようにloadさせないとhtmlでjsを上手く読み込んでくれないようです。
【Xcode15】シミュレーターの設定アプリを開くと落ちる

## 背景
Xcode15にアップデートし、シミュレーターをiOS17.0で起動できるようにしました。また、

- iPhone15
- iPhone15 Plus
- iPhone15 Pro
- iPhone15 Pro Max

を全てシミュレーターで使用できるようにしました。

そして、シミュレーターのデフォルト言語設定を「日本語」に変更しようとしました。
## 問題
しかし設定アプリを開くと、iPhone15以外は全て設定アプリが落ちてしまいます。

- iPhone15 →落ちない
- iPhone15 Plus →落ちる
- iPhone15 Pro →落ちる
- iPhone15 Pro Max →落ちる

## エラー内容
設定アプリが落ちたとき、以下のようなエラーが出力されました。
![スクリーンショット 2023-09-24 1.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494240/f7f9d4f6-29dc-c0b4-956b-fd214aa88cce.png)

----
Translated Report (Full Report Below)


Incident Identifier: 3FCF0CAD-1FFB-4B3A-A426-FCD2BBFF2B84
CrashReporter Key:   00868D5E-AAAC-8F55-2A28-EF31F744D007
Hardware Model:      MacBookPro18,3
Process:             Preferences [16135]
Path:                /Volumes/VOLUME/*/Preferences.app/Preferences
Identifier:          com.apple.Preferences
Version:             1 (1246.2)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd_sim [15954]
Coalition:           com.apple.CoreSimulator.SimDevice.FCA3925E-0CFB-43C9-BB5F-DF9A5FC321FB [7508]
Responsible Process: SimulatorTrampoline [1335]

Date/Time:           2023-09-24 01:10:33.3273 +0900
Launch Time:         2023-09-24 01:10:32.5511 +0900
OS Version:          macOS 13.6 (22G120)
Release Type:        User
Report Version:      104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Termination Reason: SIGNAL 6 Abort trap: 6
Terminating Process: Preferences [16135]

Triggered by Thread:  7

Last Exception Backtrace:
0   CoreFoundation                	       0x18046589c __exceptionPreprocess + 160
1   libobjc.A.dylib               	       0x18005c09c objc_exception_throw + 56
2   CoreFoundation                	       0x180350b68 -[__NSPlaceholderArray initWithObjects:count:] + 552
3   CoreFoundation                	       0x1804508b8 +[NSArray arrayWithObjects:count:] + 36
4   ActionButtonSelector          	       0x1229cc5ac ABLoadDeviceSceneModel + 2280
5   ActionButtonSelector          	       0x1229c77e4 -[ABDeviceSceneResourceLoader _loadResources] + 68
6   ActionButtonSelector          	       0x1229c73f0 __59-[ABDeviceSceneResourceLoader loadResourcesWithCompletion:]_block_invoke + 40
7   libdispatch.dylib             	       0x1801424f4 _dispatch_call_block_and_release + 24
8   libdispatch.dylib             	       0x180143d3c _dispatch_client_callout + 16
9   libdispatch.dylib             	       0x18014be3c _dispatch_lane_serial_drain + 960
10  libdispatch.dylib             	       0x18014c9b4 _dispatch_lane_invoke + 388
11  libdispatch.dylib             	       0x180157d40 _dispatch_root_queue_drain_deferred_wlh + 276
12  libdispatch.dylib             	       0x18015738c _dispatch_workloop_worker_thread + 448
13  libsystem_pthread.dylib       	       0x10201b878 _pthread_wqthread + 284
14  libsystem_pthread.dylib       	       0x10201a63c start_wqthread + 8

Kernel Triage:
VM - (arg = 0x0) pmap_enter retried due to resource shortage

（以下略）

----

こちらはどういった原因が考えられるのでしょうか。もしご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
ABC321回答メモ

0.はじめに
　歯ごたえを感じつつも、C問題までは順調に解け、Dは挑戦はできたくらいの
　自分なりには満足できた回でした。

　レートはちょい上げの+5。でも暫定みたいです。
　不正者が多かったとのことですが、その結果後で上がるのかさがるのか・・・。
　運営者の方に余計な手間を掛けさせないでほしいものです・・・。

1.A - 321-like Checker
　インプットを文字列にして、
　スライスしつつ頭からチェックをしていきました。
　C問題に続く問題のようです。

　https://atcoder.jp/contests/abc321/submissions/45819331

2.B - Cutoff
　Bにしてはなかなか歯ごたえのある問題でした。
　4つに場合分けして考えました（3つでよかったのかも・・・）
　まず、リストAをソートして　
　１）一番大きい数字を除外して合計してもXを超える場合
　　→最後は0点でもOKなので、0を出力
　２）一番小さい数字を除外して合計した数字がXと同じ場合
　　→最後は最大の得点以上であればOKなので、リスト内の最大値を出力
　３）一番小さい数字を除外して合計した数字がXより大きい場合
    →最後は最大の得点より小さくてもOKなので
　　　最小値を求める
　　　→Ｘから、リストから最小値と最大値を除外した合計を引いた
　　　　値が答えとなるのでそれを出力して終了
　４）上記に当てはまらない場合は、どうあがいてもだめなので
　　-1を出力して終了。

　https://atcoder.jp/contests/abc321/submissions/45830093

3.C - 321-like Searcher
　ためしに、ansを1ずつ増やしていって、321-like Number(以下321数)の場合
　カウントしていき、カウントがKと一致したら、その数字を
　出力としたところ、例題は行けたけど、1000位でタイムアウトに。

　諦めて真面目に実装。
　1）Kを読み込み
　2)リストLを用意、10を15個で初期化(ほんとは11でいいけどなんとなく)
　　リストL:L[0]に回答の1桁目、L[1]に2桁目、L[n]にn-1桁目がセットされる。
　　　　　　初期値は10で10の場合はそこまで桁が行っていない。
　3)変数NKを0で定義（今何個目の321数かを保持）
　4)リストL[0]に0をセット
　--以下関数LP--
　関数LP 　引数はリストLとi(Lのどの位置に加算するか)
　　　　　 返り値はリストL
　LP1)L[i]に1を加算
　LP2)L[i]がL[i+1]以上の時→321数をみたさないので繰り上がり処理
　　LP2-1)L[i]に0をセット
　　LP2-2)L[i+1]が10の時(繰上りによる新桁の時)
　　　LP2-2-1)L[i+1]に1をセット
　　LP2-3)L[i+1]が10以外の時(繰上りによる新桁でない時)
　　　LP2-3-1)LP(L,i+1)をコール
　LP3)Lを返す
　--以下4の続き--　
　5)NKがKと同じになるまで以下くりかえし
　　5-1)NKに1加算
　　5-2)LにLP(L,0)をセット
　　　※繰上りにより、321数が崩れていないかチェック
　　5-3)リストLを頭から見ていく
　　　5-3-1)L[i]==L[i+1]の時
　　　　5-3-1-1)NKを1減算（加算処理をもう一回。）　
　　　　5-3-1-2)5-3のループを抜ける
　　　5-3-2)L[i]==10の時(問題なし)
　　　　5-3-2-1)5-3のループを抜ける
　6)ansを””で初期化
　7)以下、11回くりかえし
　　7-1)L[i]が10でない場合
　　　7-1-1)L[i]を文字型にしansに+
　8)ansを逆向きに変換
　9)ansを出力して終了

　我ながら無駄にややこしい感じに実装した感じですが
　解説をみるとなんか、全然違うような感じな回答でした。
　
　最初5-3辺りを実装していなかったため、3桁目あたりでansが100となってしまい
　321数ではなくなってしまう。
　5-3あたりは強引なロジックつけ足しでしたがなんとなくうまくいきました。

　https://atcoder.jp/contests/abc321/submissions/45867675

4.D - Set Menu
　まずは、素直に実装。
　AC9、TLE21とけっこうなTLE。
　A、Bを昇順に並べて、P-AでBを2分探索し
　A+Bが値段になるのか、Pが値段となるのかの境目を
　もとめ・・・と工夫しようと四苦八苦しているうちに
　時間終了。
　解説を見ると、Bの累積話を用意することで簡潔に
　回答していて目からうろこでした。
　C++の解答例を丸パクリして、Pythonで書き直し
　とりあえず試験後にAC頂いときました。　　
　C++の2分探索関数lower_boundはpythonで
　bisect.bisect_rightを使えばよいことをググって学びました。

　https://atcoder.jp/contests/abc321/submissions/45888403


以上
ABC321 D問題

# D問題
## 方針
Bをソートしておけば、ある値を境界として加算する値が$p-a_i$か$b_j$に分割できる
境界を二分探索で求め、残りの$b_j$の和は累積和を求めておけば、全体で$O(NlogM)$で計算できそう。

## 実装
```python
import bisect
import itertools


def solve():
    n, m, p = read_int_list()
    a = read_int_list()
    b = read_int_list()
    b = sorted(b)

    # 累積和
    b_acm = [0] + list(itertools.accumulate(b))

    ans = 0
    for a_i in a:
        # 二分探索
        x = bisect.bisect(b, p - a_i)
        ans += a_i * x + b_acm[x] # p以下になる組み合わせの和
        ans += p * (m - x) # pより大きくなる組み合わせの和

    print(ans)


def read_int_list():
    return list(map(int, input().split()))


if __name__ == "__main__":
    solve()
```
[経験則]プログラミングする前に頭に入れると得なこと


## プログラミングする前に頭に入れると得なこと



結論を先に言うと

### データと処理を同じクラスに書くな！

これは自分が今までたくさんコードを書いていく中で

後から自分が気づいて後悔したことでもあり、

プログラミング構造上の利点がすごくあるので紹介してみます。



もし大きなプロジェクトなどでこれをやってしまうと。

後々すごいめんどくさいことになってしまうんです。

その理由を説明したいと思います。

仮に、アバターキャラクターを変更するクラスを実装したとしましょう。

### キャラクターチェンジクラスの中身は

* 全てのキャラクターデータの辞書。

* キャラクター切り替え時の処理。

* キャラクター情報のUIへの反映。

* キャラクターステータスの反映。


一見、一貫性が伴い、問題ない構造のように思えますが。。。

実はこのクラスはキャラクターの辞書は切り離したほうが良いのです。

代わりにキャラクター登録クラスを作成して

データと、そのデータをキャラクターチェンジクラスに渡す処理を書いた方が

コードの保守性が高まります。

<iframe width="768" height="432" src="https://miro.com/app/live-embed/uXjVMibbY1U=/?moveToViewport=-180,-72,872,459&embedId=834273121721" frameborder="0" scrolling="no" allow="fullscreen; clipboard-read; clipboard-write" allowfullscreen></iframe>

なぜなら、辞書の形式を変えるかもしれないし、新しいジェネリッククラスを継承して

機能を拡張しようとしようものならばキャラクターチェンジクラスのプロパティデータは

そのままである保証はどこにもないのです。

特にこのようなソフトウェアの核に近い部分の実装では

内部アルゴリズムや、処理コードの一新は起こる可能性が高いです。

ゆえにコードをあとからリファクタリングする機会はとても多い、

そういった時に、そのクラスに存在したデータまでもが犠牲になり、

あ、旧データは消えたから今のデータ形式に合わせて、また作ってね

これが何度も発生するかもしれません。

なのでシリアライズされたデータを保持するようなクラスは。

その一新の影響があるクラスの中に記述するのではなく

切り離したほうが保守性が高まります。

大体のネットや記事にあるようなソースコードは

データと処理はセットになっています。（一部言語にもよるかもしれませんが）

基本、それは完成されたコードなのでもちろん問題はありません。

しかし、プロジェクトのコードは完成されてるわけではなく、何度も書き換えや一新が起きます。

なので、それと同じ感覚でプログラミングをするとあとで後悔を生むコードになってしまうかもしれない

という警笛でした。


それのみならず、公開されているソースコード例が実際のプロジェクトのニーズとは異なる場合があり。

学習段階で見る多くの例は、教育のためのシンプルなものであるため、

実際の開発現場での要件や複雑さを考慮していないことが多いです。

その中でもこのデータと処理の分離は、抑えたほうがいいよという駄文でした。

あとは皆さんご存知の、Solid原則としてデータのみならず、機能を疎集合にして構成するのは大事です。

ちなみにUNITYが開発しているECS（Entity-Component-System）アーキテクチャは、

データと処理の分離を必然的に行わなければならない非常に実践的なフレームワークになっているため、

このようなアーキテクチャに触れると体系的な理解ができます。
【Flutter】AndroidStudio でのみビルドエラーになった事象の解消方法

いきなり下記エラーが出力しAndroidStudioのみビルドエラーとなり実機デバッグができなくなった。(XCodeでは問題なく実機デバッグができる)

```
Could not run build/ios/iphoneos/Runner.app on XXXXXXXXX-XXXXXXXXX.
Try launching Xcode and selecting "Product > Run" to fix the problem:
  open ios/Runner.xcworkspace
```

## 対策１
とりあえずエラー文で検索をしてヒットした下記サイトに沿って「flutter/bin/cache/artifacts/」を削除し、プロビジョニングプロファイルも削除した。
-> 事象解消せず

https://minpro.net/could-not-run-build-ios-iphoneos-runner-app

## 対策２
flutter clean コマンドを実行後に flutter run を実行
-> 事象解消せず

## 対策３
flutter update コマンドを実行後に flutter run を実行
-> 事象は解消しなくなったが、AndroidStudio でビルドを実行すると、XCodeが開き下記エラーが出力するようになった

```
The file couldn’t be opened because it doesn’t exist.
Domain: NSCocoaErrorDomain
Code: 260
Failure Reason: The file doesn’t exist.
```

## 対策4
下記 StackOverflow にOSのバージョンについてコメントがあったため、端末のmacOS を最新版にアップデートした
最新版にアップデートをし、AndroidStudio からビルドを実行すると実機デバッグすることができた(事象解消)

https://stackoverflow.com/questions/77160220/vs-code-flutter-debug-doesnt-work-if-i-dont-compile-with-xcode-directly-before

## 結論
まずはOSとflutter とxcode を最新版にしてからエラー対策をしたほうがよい
rails非同期処理 gem比較

実務で扱っているアプリケーション(Rails)に非同期処理を導入することになり、代表的なgemの特徴・メリット・デメリットを調査しました。せっかくなので簡単にまとめておきます。


## 調査対象のgem
 - Sidekiq
 - Shoryuken
 - Rescue
 - Delayed_job


## 比較表
GitHubスター数は2023年9月頃のものです。また「〇、△、✕」は条件次第で変わってくるものもあると思います、参考程度の認識でお願いします。
<table>
  <tr>
    <th></th>
    <th style="width: 10px;">Sidekiq</th>
    <th>Shoryuken</th>
    <th>Rescue</th>
    <th>Delayed_job</th>
  </tr>
  <tr>
    <td>GitHubスター数</td>
    <td>12.7k</td>
    <td>2k</td>
    <td>9.3k</td>
    <td>4.8k</td>
  </tr>
  <tr>
    <td>キューイング</td>
    <td>Redis</td>
    <td>AmazonSQS</td>
    <td>Redis</td>
    <td>RDB</td>
  </tr>
  <tr>
    <td>処理方式</td>
    <td>マルチスレッド</td>
    <td>マルチスレッド</td>
    <td>シングルスレッド</td>
    <td>シングルスレッド</td>
  </tr>
  <tr>
    <td>パフォーマンス</td>
    <td align="center">〇</td>
    <td>〇</td>
    <td>△</td>
    <td>✕</td>
  </tr>
  <tr>
    <td>耐障害性</td>
    <td>△</td>
    <td>〇</td>
    <td>△</td>
    <td>△</td>
  </tr>
  <tr>
    <td>コスト</td>
    <td>△</td>
    <td>〇</td>
    <td>△</td>
    <td>〇</td>
  </tr>
  <tr>
    <td>リトライ処理</td>
    <td>〇</td>
    <td>〇</td>
    <td>✕</td>
    <td>〇</td>
  </tr>
  <tr>
    <td>メリット</td>
    <td>・高性能<br>・導入事例が多い</td>
    <td>・耐障害性高(キューのロストリスク無し)<br>・高性能<br>・低コスト</td>
    <td>・比較的高性能<br>・メモリリーク/肥大化のリスクなし(jobごとに子プロセス起動) </td>
    <td>・導入しやすい(Redis不要)<br>・低コスト</td>
  </tr>
  <tr>
    <td>デメリット</td>
    <td><font color="Red">・スレッドセーフな実装が求められる</font></td>
    <td><font color="Red">・個人が開発したGem</font><br>・導入事例が少ない<br>・スレッドセーフな実装が必要<br>・ローカルでの検証が若干手間</td>
    <td>・job大量実行時はフォークのオーバーヘッドでパフォーマンス低下<br><font color="Red">・自動リトライ無し</font></td>
    <td>・RDBゆえにパフォーマンス低<br>・大規模アプリケーションには不向き</td>
  </tr>
</table>

:::note info
補足
 - **パフォーマンス**
マルチスレッドのSidekiq, Shoryukenが優勢、キューイングがRDBであるがゆえにDelayed_jobは劣勢。

 - **耐障害性**
盤石なAmazonSQSを扱うShoryukenが優勢。その他も構成次第では耐障害性を高めることは可能な認識。

 - **コスト**
低コストなSQSを扱うShoryuken、RDBを流用できるDelayed_jobが優勢。

 - **リトライ処理**
唯一Rescueがjobエラー時の自動リトライ処理がない。(ジョブ毎に個別に実装が必要)

:::

## 結論
私のチームでは**Sidekiq**を扱うことで決まりました。理由としては、チーム内にSidekiqの経験豊富な方がいたという点が大きいです。またShoryukenは個人が開発したgemであったり、Rescueはリトライ処理がなかったり、Delayed_jobは小規模アプリケーション向きだったり決め手に欠きました。


## スレッドセーフについて
「スレッドセーフとは何か」は別記事でまとめたいと思います。ちなみにチームメンバーのベテランエンジニアの方はこれまで何度もSidekiqを扱ってきたが、あまりスレッドセーフを意識することはなかったとのこと。

Sidekiq扱っている皆さん、ジョブの実装時にスレッドセーフはどこまで意識していますか？よかったら教えてください！
【Rails】Active Storageが提供するルーティングのプレフィックスを変更する方法

`config/application.rb`に以下の設定をすることでActive Storageが提供するルーティングのプレフィックスを変更できます。

```config/application.rb
config.active_storage.routes_prefix = '/files'
```

上記のようにした場合には`/rails/active_storage/blobs/*`から`/files/blobs/*`に変更されます。
ABC321をPythonで（A~F）

# A問題
全探索
```python:A
n = input()

for i in range(len(n) - 1):
    if n[i] <= n[i + 1]:
        print("No")
        exit()
print("Yes")
```
# B問題
とりうるスコアを全部ためす
計算量的にも十分間に合う
```python:B
n, x = map(int, input().split())
a = list(map(int, input().split()))

for i in range(101):
    b = a + [i]
    b.sort()
    if sum(b[1:-1]) >= x:
        print(i)
        exit()

print(-1)
```
# C問題
満たす数がかなり少なそうなのでDFSを使って全部求めておく
```python:C
lst = set()
def DFS(x, t):
    global lst
    for i in range(t):
        y = x * 10 + i
        lst.add(y)
        if i > 0:
            DFS(y, i)

for i in range(1, 10):
    lst.add(i)
    DFS(i, i)

lst = sorted(lst)
print(lst[int(input()) - 1])
```
# D問題
Bをソートすると
それぞれのa_iについて
価格がsになるものとpになるものが2分探索で求められる
```python:D
n, m, p = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
b.sort()

sum_b = [0] + [i for i in accumulate(b)]

ans = 0
for a_i in a:
    x = bisect(b, p - a_i)
    ans += a_i * x + sum_b[x] + p * (m - x)

print(ans)
```
# E問題
まずNが十分に大きいとき
頂点xからkだけ大きいほうに向かったとき
最小値はx\*2\**k, 最大値はx\*2\**k+2\**k - 1

これをxのときと、i回親に戻りそれの逆側の子でk - i - 1だけ進む
のを足し合わせたのが答え


```python:E
def calc(n, x, k):
    if k <= 0:
        return 1 if 1 <= x <= n and k == 0 else 0
    if k > 60:return 0
    mini = x
    for _ in range(k):
        mini *= 2
        if mini > n:break
    if mini > n:
        return 0
    else:
        return min(mini +2 ** k - 1, n) - mini + 1

for _ in range(int(input())):
    n, x, k = map(int, input().split())
    ans = calc(n, x, k)
    for i in range(1, k + 1):
        if x <= 1:
            break
        elif i == k:
            ans += 1
        elif x % 2 == 0:
            x //= 2
            ans += calc(n, x * 2 + 1, k - i - 1)
        else:
            x //= 2
            ans += calc(n, x * 2, k - i - 1)

    print(ans)
```
# F問題
\+だけのときは典型的なDPなので\-について考える

\+x \-xの連続でクエリがきたときは\+xが来た時と逆順で計算すれば戻せる
\+xと\-xの間に他のクエリが来ても足し算引き算は可換なので上と同様に計算してもよい

```python:F
mod = 998244353
q, k = map(int,input().split())

dp = [1] + [0] * k
for _ in range(q):
    f, X = input().split()
    x = int(X)

    if f == "+" and x <= k:
        for i in range(k, x - 1, -1):
            dp[i] += dp[i - x]
            dp[i] %= mod
    elif f == "-" and x <= k:
        for i in range(x, k + 1):
            dp[i] -= dp[i - x]
            dp[i] %= mod

    print(dp[k])
```
Django初期設定のコマンドをメモ

追記予定あり…
# Django初期設定

1 Djangoプロジェクトを作成します。

```jsx
django-admin startproject quiz_project
cd quiz_project
```

2 Djangoアプリを作成します。

```jsx
python3 manage.py startapp quiz_app
```

3 プロジェクトの`settings.py`でアプリを登録します。

```jsx
INSTALLED_APPS = [
    ...
    'quiz_app',
    ...
]
```
docker-compose.yml の environments にダブルクォーテーションやシングルクォーテーションを付けてはいけない

bash などでは環境変数を設定する際に次のように書きます。

```bash
$ TZ='Asia/Tokyo'
$ echo $TZ
Asia/Tokyo
```

ですが、`docker-compose.yml` では上記のようにダブルクォーテーションやシングルクォーテーションを付けてはいけません。（ただし、全体に引用符を付けることはできます。）

```yaml:docker-compose.yml
environment:
  - TZ=Asia/Tokyo     # ← せいかい！
  # - 'TZ=Asia/Tokyo' # ← せいかい！
  # - TZ='Asia/Tokyo' # ← まちがい
```

> Do not put any double quotes or single quotes into the environment parameter in the docker-compose.yml file.

https://blog.lysender.com/2019/06/docker-compose-environment-variable-and-quotes/

でないと、引用符も含めた範囲が変数として認識されてしまいます。

```bash
$ docker exec -it my-app bash
bash-4.4# echo $TZ
'Asia/Tokyo'
```

または dictionary 形式で指定しても良いそうです。この場合はダブルクォーテーションで囲み、文字列であることを明示することが可能です。

```yaml:docker-compose.yml
environment:
  TZ: Asia/Tokyo    # ← せいかい！
  SOME_FLAG: 'true' # ← せいかい！
```

> boolean 値 (true、false、yes、no のいずれか) は、YML パーサによって True か False に変換されないよう、クォート（ ' 記号）で囲む必要があります。

https://docs.docker.jp/compose/compose-file/compose-file-v3.html#compose-file-v3-environment

なぜか `/etc/localtime` を更新してもタイムゾーンが書き換わらず `date` コマンドの出力が `UTC` になってしまい、原因を見つけるのに数時間掛かりました……。