OmniAICreator/Qiita-1.07M huggingface dataset:
分散RedisロックとJedisクライアント

# はじめに
以前、Redis上でセマフォを実装する必要がありました。驚いたことに、私たちが使用しているJedisクライアントとLettuceクライアントの両方には、それに対する良い準備ができた解決策がないことがわかりました（Redissonにはそのようなものがあります）。
そのため、私はその隙間を埋め、JedisとLettuceの両方のRedisクライアント向けの解決策を提供することにしました。

# セマフォが使用したい理由は何ですか？
リソースの相互利用を制限する必要がある状況を想像してみてください。たとえば、バックグラウンドタスクで実行されている重いSQLクエリが全体のサービスパフォーマンスに悪影響を及ぼす可能性がある場合、許可された回数よりも同時にそのクエリが発行されないようにする必要があります。
セマフォを使用することで、共通リソースのクロスプロセス競合状態を解決し、共通リソースへのアクセスを特定の量に制限することができます。

# 解決策はこちらです
[RedPulsar](https://github.com/himadieievsv/redpulsar) が、セマフォを含む分散ロックを提供しています！

## コード例1

```kotlin:build.gradle.kts
dependencies {
    ...
    implementation("com.himadieiev:redpulsar-jedis:1.2.0")
    ...
}
```
3つのリースとリトライ構成のセマフォを作成します:
```java:Bootstrap.java
var poolConfig = new GenericObjectPoolConfig<Connection>();
var client = new JedisPooled(poolConfig, "redis-host-name", 6379, 100);
var semaphore = LockFactory.createSemaphore(List.of(client), 3, Duration.ofMillis(50), 2);
var worker = Worker(semaphore, databaseService);
```
もしロックが取得できない場合は、初期ディレイを50ミリ秒として2回リトライします。

`Worker`の中セマフォを利用します：
```java:Worker.java
public void run() {
    if (semaphore.lock("MyResource", Duration.ofMinutes(1))) {
        var report = database.fetchAnalyticsReport();
        ...
    }
}
```

このコード例は、[RedPulsar](https://github.com/himadieievsv/redpulsar) をコードベースに組み込むのがどれほど簡単かを示しています。
しかし、ロックに高可用性を持たせたい場合はどうすればよいでしょうか？冗長性を追加する必要があります。[RedPulsar](https://github.com/himadieievsv/redpulsar) がそれをどのように実現しているかを以下に示します。

## コード例2
以下の例は、前のコード例と似ていますが、今回は3つのJedisクライアントのインスタンスを渡します：
```java:Bootstrap.java
var poolConfig = new GenericObjectPoolConfig<Connection>();
var client1 = new JedisPooled(poolConfig, "redis-host-name1", 6379, 100);
var client2 = new JedisPooled(poolConfig, "redis-host-name2", 6379, 100);
var client3 = new JedisPooled(poolConfig, "redis-host-name3", 6379, 100);
var semaphore = LockFactory.createSemaphore(List.of(client1, client2, client3), 3, Duration.ofMillis(50), 3);
var worker = Worker(semaphore, databaseService);
```
# 最後に
[RedPulsar](https://github.com/himadieievsv/redpulsar) を使用したセマフォの実装は、システムの安定性と信頼性を高めるための有力な手段であり、Redisを使用した分散システムの開発において役立つでしょう。

🔗 GitHubリポジトリ: [RedPulsar on GitHub](https://github.com/himadieievsv/redpulsar)
カラー液晶 秋月ATM0130B3の基板を作って遊ぶ(よてい)(ST7789)


目的
配線がめんどいのと
収まりがいいので基板化する
ST7789V2

![o_cop893.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/84ff4aaf-d527-dd9e-f639-8eec154a8ba8.jpeg)




![o_cop836.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ca190ccf-0bf8-36b6-a723-18d381a2640b.jpeg)



![o_cop634.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b94406b8-454c-8062-7114-b158856c9b49.jpeg)
QiitaAPIでポートフォリオのブログを自動更新できるようにしてみた

## はじめに

前回はポートフォリオのデータをYAMLからDBに完全移行する大改造をしました。

https://qiita.com/piny940/items/f1a15f7a797c4d0f7461

今回は、前回の記事では書ききれなかった「ブログデータの自動更新」部分について書いていこうと思います。

完成したコードはGithub上で公開しているので参考程度にどうぞ。

https://github.com/piny940/portfolio

## 抱えていた課題

前回の記事で、ポートフォリオのデータ更新をUI上で手軽にできるようになりました。しかし、ブログデータの更新についてはなお手間です。最近では特にQiitaの記事を意識して多く書くようにしているため、一週間で5つ記事を書くとかも普通にあります。これに対していちいち手動でブログのデータをポートフォリオに追加するのは面倒です。

そこで、Qiita記事の投稿をAPIで定期的に取得して自動でデータを更新する仕組みを作成することにしました。

## 技術選択
今回の技術選択では、「できるだけ軽くする」ということを意識しました。というのも、今回やりたいことは「データを取ってきてDBを更新する」という処理だけだったからです。

そこで、ライブラリとしては、基本的に必要最低限の`webpack`・`typescript`のみを使用することにし、Graphqlクライアント等も使わずクエリは手打ちすることにしました。

## 仕組み
おおまかな仕組みとしてはQiitaの投稿とポートフォリオ上のデータの双方を取得して比較し、差分に対してブログ作成のリクエストをバックエンドに送るという流れになっています。

苦労した点は「タグの自動追加」です。ポートフォリオ上のブログデータには「タグ」がつけられているのですが、このタグをQiita記事についているタグから自動でつけたいと考えました。

しかし、両者のタグを比べた際に「ReactとReact.js」のような細かな表記揺れがあり、これらの差を吸収する必要がありました。

解決策としては、下記のような対応表を作成してQiitaのタグからポートフォリオのタグに対応付けが行えるようにしました。

```typescript
const map: { [key in string]: string[] } = {
  'Next.js': ['React.js', 'React', 'Typescript'],
  React: ['React.js'],
}
```

## 工夫点
今回ブログデータ自動更新の仕組みを作る上で主に工夫したのは以下の2点です。
- タグの自動更新
- Slackへの通知

タグの自動更新についてはすでに触れたので省略します。

Slackへの通知については、そのままの意味で、データが更新されるとSlackのチャンネルに通知が流れるようにしました。これによって、正常にデータが追加されていることを確認し、データに誤りがあった場合は即座に修正できる仕組みを整えることが出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330232/e60413c0-e174-a0ab-f431-c11dce4fafc3.png)


## 最後に
今回はQiitaAPIを用いてポートフォリオのブログデータが自動で更新される仕組みを作りました。技術的にはQiitaAPIを使うだけのシンプルなものだったので、1日足らずでいいものを作ることができて満足しています。

次回はプロジェクトの順序を並び替えるUIを作っていきたいと思います。
Django学習② 管理画面の確認　学習アウトプット用

### 管理画面まで学んだのでアウトプット

1. 初期設定
プロジェクトの紐付けと日本語変更
 1.configフォルダのsetting.pyの設定
 ```python
 INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # ここに作成したアプリの追加
    'todo.apps.TodoConfig',
]

# 日本語に変更
LANGUAGE_CODE = 'ja'
# 日本時間に設定
TIME_ZONE = 'Asia/Tokyo'

 ```


 2.モデルの作成
models.pyでモデルの定義
```python
from django.db import models

# Create your models here.
# (models.Model)でモデルを継承させる
class Task(models.Model):
  # 小 - 大サイズの文字列のフィールド
  title = models.CharField(max_length=30)
  # 多量のテキストのフィールド
  description = models.TextField(blank=True)
  # Python で datetime.date インスタンスによって表される日付
  deadline = models.DateField()

```
Todoアプリを想定しているので一旦これだけ

```linax
# マイグレーションファイルの作成
$ python manage.py makemigrations
```
そうするとmigrationファイルが作成されているのがわかる
```linax
# migrateする
python manage.py migrate
```
OKが出てると成功


djangoの管理画面へアクセス
```linax
# ユーザーの登録　実行するとユーザー名とパスワードの登録を要求されるので従う
python manage.py createsuperuser
```
作成したテーブルも追加しておく
```python:admin.py
from django.contrib import admin
# モデルの追加
from todo.models import Task

# 新しいモデルを書く
admin.site.register(Task)

```
投稿タイトルが表示されるようにもしておこう
```python:models.py
from django.db import models

# Create your models here.
class Task(models.Model):
  title = models.CharField(max_length=30)
  description = models.TextField(blank=True)
  deadline = models.DateField()
 # 追加
  def __str__(self):
    #　タイトルと日付を表示させてる
    return self.title + str(self.deadline)

```
Djangoのサーバーを立ち上げて/adminとURLに追加


うまくいった

![スクリーンショット 2024-01-26 0.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724774/88ad5f62-0bb0-90b3-9bd8-f60c220599fe.png)
ステップバイステップで考えてみましょう（Zero-shot COT Prompting）

## はじめに
Chain-of-Thoughtプロンプティング

質問と回答の間に中間的な推論文面を入れて
より複雑な推論力を出せるというテクニックだそうです。

## 本文
使い方は大きく2つのパタンがあります。
~~１．few-shot promptingと一緒に使う~~
(これは特定の決まった条件で回答の精度を上げられるけど、一般的にはあまり頻度が少ないと思うので忘れてください）
２．zero-shot promptingに「ステップバイステップで」と一言加える

[参照サイト](URL "https://www.promptingguide.ai/jp/techniques/cot")の例を実際にたたいてみた結果となりますが、

普通に質問する（**完全な不正確**）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/bcdfb8df-4286-624d-c530-94e3ada74884.png)

ステップバイステップで考えてください（**正解**）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163986/d5eda94d-83ed-82e0-a00f-c53e38ffd815.png)

となってしまいます。もちろん個人的にいくつか似たような問題を試してみましたが、
このように完全な不正解はもらってないので、やめましたが💦
**少なくとも「ステップバイステップで」をつけると論理的にどのように問題を解いたのか確認しやすいので、レビューしやすいという利点があります。**

## まとめ
今後は回答が微妙だったり、複雑な質問にはぜひ「ステップバイステップで考えてみましょう」と加えて見てください。

## 参照
https://www.promptingguide.ai/jp/techniques/cot
zero-shot CoT (Kojima et al. 2022)
Django学習① 　環境構築編　個人アウトプット用

## 個人学習記録(mac)

### 環境構築
##### 手順
- pythonのinstall
- 仮想環境の作成
- 仮想環境にDjangoのインストール
- プロジェクトの立ち上げ
以上の流れ

1.Pythonのinstallは割愛


2.仮想環境の作成
```linax
$ mkdir my_Django

# 仮想環境に必要なフォルダを構築
$ python -m venv venv

# 仮想環境を有効にするためのコマンドを実行
$ source venv/bin/activate

#アップグレードもしておく
$ pip install --upgarade pip
```

3.Djangoのインストール
```linax
# install方法はいろいろあるっぽい
$ pip install django==バージョンを入力(例4.0.2）

# バージョン確認もしておきましょう
$ python -m django version
```

4.プロジェクトの立ち上げ

```linax
# プロジェクトディレクトリの作成
$ mkdir myapp
$ cd myapp

# プロジェクトの作成
# まずは設定ファイルの構築
$ django-admin startproject config .
# 設定ファイルができたらアプリケーションの構築
$ python manage.py startapp アプリ名
$ python manage.py runserver
```

これで無事にサーバー立ち上げまで完了。
Oracle がshutdown immediate後 ORA-12514 になる

ちょっと情報不十分すぎてかなりだめなので後で気が向いたら清書

# oracle をマウント状態にしたかった
マウントしたかったが、シャットダウン後リスナーが存在しないエラー。
OS認証でログインができないし、１つのDBサーバに複数のインスタンスをたてていた。
これ系↓
https://stackoverflow.com/questions/32467587/oracle-throws-ora-12514-after-shutdown-immediate


## 環境
Windows Server 2019
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.18.0.0.0
１つのDBサーバに複数のインスタンスをたてていて、
リスナーが１つ OracleOraDB19HomeTNSListener
インスタンス名は orcl1, orcl2, orcl3


## 現象
シャットダウンをする
```batch:実行
> sqlplus id/pwd@orcl1
sql> shutdown immediate
```

```batch:result
データベースがクローズされました
データベースがディスマウントされました。
ORACLEインスタンスガシャとダウンされました。
ERROR:
ORA-12514: TNS: リスナーは接続記述子でリクエストされたサービスを現在認識していません

警告: Oracleにはもう接続されていません
```

このあとに
```
> sqlplus /nolog
sql> conn id/pwd@instance
```
```batch:result
ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました
```
も

```
> sqlplus /nolog
sql> startup mount;
```
```batch:result
SP2-0640: 接続されていません。
```
も
できない。

実行しようとするとリスナーが起動していないというメッセージが出る
リスナーそのものは上がっているのに・・・

## 原因
lsnrctlで状態を見ると
```
> lsnrctl status orcl1
```
```batch:result
LSNRCTL for 64-bit Windows: Version 19.0.0.0.0 - Production on 25-1月 -2024 18:00:00

Copyright (c) 1991, 2022, Oracle. All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= hostname.hoge.hoge)(PORT+1521))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl1)))に接続中
リスナーのステータス
-------------------------
別名    LISTENER
バージョン　XXX
開始日　XXX
稼働時間
トレースレベル
セキュリティ

・・・・・ 省略

インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl2"には、一件のインスタンスがあります。
インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl3"には、一件のインスタンスがあります。
コマンドは正常に終了しました。
```
再起動しようとしている orcl1について記述がないではないか。。
シャットダウンしたときに、閉じてしまったみたい。


## 対処
Windowsのサービスマネージャーから
リスナーサービスを再起動
OracleOraDB19HomeTNSListener

注意事項として、他のインスタンスも一瞬繋がらなくなる。


リスナーサービス再起動後、リスナーがインスタンスに対して起動しているか確認
```
> lsnrctl status orcl1
```
```batch:result
LSNRCTL for 64-bit Windows: Version 19.0.0.0.0 - Production on 25-1月 -2024 18:00:00

Copyright (c) 1991, 2022, Oracle. All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= hostname.hoge.hoge)(PORT+1521))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl1)))に接続中
リスナーのステータス
-------------------------
別名    LISTENER
バージョン　XXX
開始日　XXX
稼働時間
トレースレベル
セキュリティ

・・・・・ 省略

インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl1"には、一件のインスタンスがあります。

インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl2"には、一件のインスタンスがあります。
```

通じていることがわかる。

このあと
```
> sqlplus /nolog
sql> conn id/pwd@instance
sql> startup mount;
```
できた
コーディングして作られた楽しいアートがたくさん投稿される「GENUARY 2024」を紹介してみる（＋ 初めて作品を投稿してみる）

## はじめに
この記事では、自分がクリエイティブコーディング系の話題を追ったり、それに関連したイベントに参加していて知った、「GENUARY 2024」を紹介してみます。

また、「GENUARY」に初めて作品を投稿してみました。

### 「GENUARY 2024」の概要
過去にも開催されているイベント「GENUARY」の 2024年版が「GENUARY 2024」となっており、ざっくりと概要を説明すると、「とあるお題に沿ったアートをコーディングして作り、特定のハッシュタグをつけて投稿する」というイベントです。

▼ 公式サイト
　GENUARY 2024： https://genuary.art/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/67e2f99d-0be2-9642-a3b7-62751594918f.png)

もう少し補足すると、1月に毎日 1つの作品作りに関するお題が出されたような形だったり、作品を作る方法について、環境・ライブラリなどの指定はなく自由に行えたりするようです。

## 「GENUARY 2024」について
### 利用するハッシュタグ
公式ページに、GENUARY で利用するハッシュタグが書かれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3a29ffa7-f80c-350e-17b8-5e27bd23d12b.png)

例えば、1日目のお題に関する内容を投稿する場合は「#genuary」「#genuary2024「#genuary1」をつけるようです。
別の日のお題に対応した内容を投稿する場合は、3つ目のハッシュタグの数字の部分を対応する日付に変えれば良いようです。

### 投稿タイミングについて
日付に紐付く形でお題が出ますが、その投稿タイミングは前後にずれても問題ないようです。

以下に「There’s a prompt for each day, but you can do them in advance (or later!) if it’s convenient. No one is here to throw off your schedule.」と明記されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6a150630-0779-54a0-f3a7-a0096d944d97.png)

## GENUARY のお題
それでは、お題の話です。

GENUARY のお題は、以下のページに掲載されています。

●PROMPTS
　https://genuary.art/prompts

以下に、2024年版のお題を、いくつか抜き出してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4337357d-6393-fdca-4140-c4286d653141.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4c1e5706-bbaa-d780-4f18-1728ba78c9f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0ea32c0f-5ef2-2dde-c32e-82116bb176d2.png)

一部のお題には、参考情報・補足情報のリンクが書かれているものもあるようです。

## 作品を探す方法
ハッシュタグで投稿を検索すると、様々な作品を見ることができます。

過去のものを含めて見る場合は、「[#genuary のみ](https://twitter.com/search?q=%23genuary&src=typed_query&f=live)」、今年の分のみを見る場合は「[#genuary2024 のみ](https://twitter.com/search?q=%23genuary2024&src=typeahead_click&f=live)」を検索すれば、たくさんの作品を見ることができます。

今年の特定のお題に関するもののみを見る場合は、ハッシュタグ 2つの AND検索をするのが良さそうです。例えば、今年の 15日目のお題は「[#genuary2024 #genuary15 の AND検索](https://twitter.com/search?q=%23genuary2024%20%23genuary15&src=typed_query&f=live)」とすれば抽出できます。

## GENUARY／GENUARY 2024 に初投稿
GENUARY 2024 というか、GENUARY自体にですが、作品を初めて投稿してみました！

https://twitter.com/youtoy/status/1750541825318977552

1日目のお題に関するもので、内容はパーティクルに関するものです。

[Babylon.js のパーティクルヘルパーという仕組み](https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particleHelper)を使って、パーティクルを使った太陽を描画し、作品で用いています（太陽自体を描画する部分以外は、p5.js を用いた描画を併用しています）。
Phindの自動化


Phindのプロンプディングを自動化するツール書きました。

> <iframe width="560" height="315" src="https://www.youtube.com/embed/HqICe0iZcBY?si=2tOE5MwqmpASEfb7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
>
> [Phindを自動化するツールを作る](https://devtheworld.jp/blog/phind-automation?trk=qt-aa)

（参考） 

- [本当は教えたくない、VScode拡張の最強プログラミングアシスタントAI Phind(導入・使い方) #VSCode - Qiita](https://qiita.com/tsukky67/items/f0689e9b4c73324bb47b)
- [まだChatGPT使ってるの？開発者向けAI検索エンジン phind #ChatGPT - Qiita](https://qiita.com/miu-P/items/078dd0f90952110ecbc8)
- [ChatGPTを使いたくても使えない人のための無料AIチャット(Phind/BingAI) #BingAI - Qiita](https://qiita.com/ProjectEuropa/items/42d7da0ac58cecc93fb0)
GitHub Codespaces で azd auth login する方法

GitHub Codespaces で `azd auth login` をそのまま実行すると、以下のようにエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395457/ba710e55-e902-177a-1ca4-b5ca7750284c.png)

この場合は、`--use-device-code` オプションをつけることで、正常にサインインできます。
```shell
$ azd auth login --use-device-code
Start by copying the next code: XXXXXXXXX
Then press enter and continue to log in from your browser...
```

この状態で Enter を押すと、別タブで Microsoft Entra ID のサインイン画面になります。
`Start by copying the next code: XXXXXXXXX` のコードを入力し、画面の案内に従って進んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395457/1fe93aeb-7742-52f0-0434-2086e8e44e86.png)

## 参考
https://learn.microsoft.com/ja-jp/azure/developer/azure-developer-cli/reference#azd-auth-login
Dockerの実行方法（Windows編）

## 前提条件
Dockerをインストールしていること
## 実行方法

コマンドプロンプトでdocker-compose.ymlファイルが置いてあるディレクトリに移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981742/d8514d6c-8183-a49c-cbaa-5e74c06358c0.png)

```
cd C:\Docker\Docker-Compose\docker_mysql
```
```
#起動
C:\Docker\Docker-Compose\docker_mysql>docker-compose up -d
Creating network "docker_mysql_default" with the default driver
Creating docker_mysql_mysql_1 ... done

#コンテナ表示
C:\Docker\Docker-Compose\docker_mysql>docker compose ps
NAME                   COMMAND                  SERVICE             STATUS              PORTS
docker_mysql_mysql_1   "docker-entrypoint.s…"   mysql               running             33060/tcp

```
psql pg_dumpでパスワードを指定する

# パスワードを指定
### 通常のオプション指定時
あらかじめ、環境変数「PGPASSWORD」にパスワードをセットしておく
~~~
set PGPASSWORD=pass
psql -h localhost -p 5432 -U testuser -d testdb --file=d:\test.backup
~~~
### dbnameを使用
~~~
psql --dbname=postgresql://testuser:pass@localhost:5432/testdb --file=d:\test.backup
~~~
### 他にもあるらしい
.pgpassという名のファイルにパスワードを指定するとかあるらしいけど、
今回は割愛


# 注意
パスワードの指定には十分に注意を払ってくださいね。
【Java】enumの使い方と簡単な使用例について（備忘録）

# ◆背景
Javaのコードを読むことがありましたが、
enumの使いかたが分からず、コードを読み切れない事がありました。。
知識不足を実感したので、この機会に基本的な使い方を調べました。
以下はenum使い方を調べた内容の紹介となります。


# ◆対象
- enumの基本的な使い方を調べてる方
- タイトルに興味を持ってくれた方

# ◆enumとは？
- 複数の定数を1つの方としてまとめて定義できるもの。
- enumは**列挙型**と呼ばれ、enumで定義した定数は**列挙子**と呼ばれる。


# ◆構文

```java
// enum 型を宣言
public enum HogeHoge {
    // 列挙子を宣言
    HOGE,
    ORANGE,
    PEACH;
}
```

# ◆使い方例（enumの定義＆メソッドの呼び出し方）
以下の例ではEnumに`jpFruitsName`という追加のフィールドを持たせ、
その値を返す`fetchJpFruitsName`メソッドを定義しています。
Fruits型の変数にはorange、peach、grapeのいずれかの値しか格納できなくなり、
型エラーを検出しやすくなります。
#### ◆ enumの定義

```java
// 列挙型
public enum Fruits {

	// 列挙子
	  orange("みかん"),
	  peach("もも"),
	  grape("ぶどう");
	  
	  // フィールド
	  private String jpFruitsName;
	  
	  // コンストラクタ（修飾子はprivateで宣言）
	  private Fruits (String hoge){
	    this.jpFruitsName = hoge;
	  }
	  
	  // 日本語フルーツ名の返却メソッド
	  public String fetchJpFruitsName () {
	    return this.jpFruitsName;
	  }
}
```

#### ◆ メソッドの呼び出し方
```java
// 上記Enumのorangeを使ってfetchJpFruitsNameメソッドを呼び出す例
System.out.println(Fruits.orange.fetchJpFruitsName());
```

# ◆eclipseで動かしてみる

eclipse画面でパッケージ名部分を右クリック > 新規 > 列挙型をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/f3d53b4c-233c-4295-dae0-0ab99dcd98d4.png)

作成する列挙型の名前を入力 > 完了をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/260e55b9-5e6e-314e-3ed9-cc84678f18af.png)

作成した列挙型のファイルでは上記で記載したコードを使用してみます。

```java:Fruits.java
package sample;

public enum Fruits {

	// 列挙子
	  orange("みかん"),
	  peach("もも"),
	  grape("ぶどう");
	  
	  // フィールド
	  private String jpFruitsName;
	  
	  // コンストラクタ（修飾子はprivateで宣言）
	  private Fruits (String hoge){
	    this.jpFruitsName = hoge;
	  }
	  
	  // 日本語フルーツ名の返却メソッド
	  public String fetchJpFruitsName () {
	    return this.jpFruitsName;
	  }
}
```

`JavaSample`クラスを作成します。
`main`メソッドで列挙型`Fruits`内に定義した`fetchJpFruitsName`メソッドを呼び出し、
その結果をコンソールに出力しています。

```java:JavaSample.java
package sample;

public class JavaSample {

    public static void main(String[] args) {
        // 列挙型Fruitsのメソッドを呼び出し、"オレンジ"を出力
        String jpFruitsName = Fruits.orange.fetchJpFruitsName();
        System.out.println("Orangeの日本語名は：" + jpFruitsName);
    }
}
```

Fruits.javaの列挙子で定義した`みかん`を呼び出せました。

```console:コンソール
Orangeの日本語名は：みかん
```

# 参考
- https://qiita.com/igm50/items/8c9788d4ba5868642c69
- https://qiita.com/suke_masa/items/bd242617a2b9bb773cbd
Bash と Caddy サーバで ActivityPub のインスタンス(17) ログイン機能

## Caddy サーバの basicauth 機能を使う
前回で main.html を開けば taimeline.html と notification.html が一枚で表示されるようにしたが、タイムラインの他人の投稿の公開範囲を考慮していない。なのでタイムラインは他人に見られないようにする。
単純に Caddyfile に
```
ホニャララ {
	(中略)
   handle_path /main {
		file_server
    	root * ./main.html
	}
}
```
と追加しただけだと誰でも
`https://ホニャララ/main`
で見ることが出来るので、ログインしないとアクセス出来ないようにする。そのために Caddy の basicauth 機能を使う。Caddy の basicauth 機能は
```
basicauth /secret/* {
	Bob $2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR7hx4IjWJPDhjvG
}
```
とすると、
`https://ホニャララ/secret`
以下のディレクトリが
ユーザー Bob
パスワード hiccup
と入れないとアクセス出来ないようするものだ。
Caddy には
```
./caddy hash-password
```
で入力したパスワードをハッシュ化する機能もある。
```
$ ./caddy hash-password
Enter password: 
Confirm password: 
$2a$14$5RPMSt.GrU3PbJa86Vmqn.RoqodGZAkd46swopLB51o3260pBa1uu
```
上の例では "bar" をハッシュ化してみた。なので
ユーザー foo
パスワード bar
ならば、目的のディレクトリ (ここでは例として /private) 以下をこれでログイン出来るようにするには
```
basicauth /private/* {
	foo $2a$14$5RPMSt.GrU3PbJa86Vmqn.RoqodGZAkd46swopLB51o3260pBa1uu
	}
```
と追加すれば良い。
main.html に /private/main
timeline.html を /private/timeline.html
notification.html を /private/notification.html
でアクセスするようファイルをサーブさせるなら
```
	basicauth /private/* {
		foo $2a$14$5RPMSt.GrU3PbJa86Vmqn.RoqodGZAkd46swopLB51o3260pBa1uu
	}
    handle_path /private/main {
		file_server
    	root * ./main.html
	}
    handle_path /private/timeline.html {
		file_server
    	root * ./timeline.html
	}
    handle_path /private/notification.html {
		file_server
    	root * ./notification.html
	}
```
にする。一応の全文を書く。

```Caddyfile
ホニャララ {

    handle_path /.well-known/host-meta {
		file_server
        root * ./personal/host-meta
	header {
            Content-Type: application/xml
	    }
	}

    handle_path /.well-known/webfinger {
		file_server
    	root * ./personal/webfinger
	header {
	       Content-Type: application/activity+json
	       }
	}

    handle_path /users/aktor {
		file_server
    	root * ./personal/aktor
	header {
	       Content-Type: application/activity+json
	       }
	}

    handle_path /image/* {
		file_server
    	root * ./personal/image/
	}

    handle_path /users/aktor/inbox {
    	reverse_proxy localhost:1682
#   	reverse_proxy unix//tmp/sock # Unix ドメインソケットを使うならこちら
	}

    handle_path /users/aktor/statuses/* {
		file_server
    	root * ./statuses/
	header {
	       Content-Type: application/activity+json
	       }
	}

# private/main
#  ./caddy hash-password でパスワードのハッシュ化(bcrypt)
	basicauth /private/* {
		bar $2a$14$mVUIuWu75Tw2quQbQtokx.hzHiD8mDV2CjgpYSIvSc/27AsGX5Dx2
	}
    handle_path /private/main {
		file_server
    	root * ./main.html
	}
    handle_path /private/timeline.html {
		file_server
    	root * ./timeline.html
	}
    handle_path /private/notification.html {
		file_server
    	root * ./notification.html
	}

}
```

これでターミナル1 で
```
bash ./baca_server.sh
```
し、ターミナル2 で
```
bash ./baca_client.sh
```
で選んでゴチャゴチャやれば
`https://ホニャララ/private/main`
にアクセスすると反映されているはずである。

## 参考記事
[ basicauth(Caddyfile directive) ]( https://caddyserver.com/docs/caddyfile/directives/basicauth )
htmlとhtmの違い

# 1.はじめに
 HTMLファイルを出力したところ、拡張子として「.html」を想定していたが「.htm」であったため、これらの違いについてまとめます。

 # 2. htmlファイルとhtmファイルの違い
 ファイル名の最後につけて種類を表す拡張子ですが、htmlとhtmはどちらもhtmlファイルであることを意味します。つまり内容に関する違いはなく、単に文字数が異なるだけです。
 拡張子は元々アフファベット3文字でつける慣例があったため、htmlの3文字バージョンとしてhtmが生まれました。

 # 3.さいごに
 htmlとhtmに違いがないことを理解していただけたら幸いです。
UbuntuにDocker Engineをインストールする

## インストール方法の種類

[dockerマニュアル](https://docs.docker.com/engine/install/ubuntu/)によると、UbuntuにDocker Engineをインストールする方法は4つ存在します。

* Docker Desktop for Linuxでインストール
* Dockerのaptリポジトリからインストール
* 手動でインストール
* スクリプトでインストール

Dockerのaptリポジトリからインストールする方法を試してみました。

## Dockerのaptリポジトリからインストール

基本的に[dockerマニュアル](https://docs.docker.com/engine/install/ubuntu/)に記載されているコマンドでインストールできました。

1. Dockerのaptリポジトリをセットアップします。

```sh
# Dockerの公式GPGキーを追加します:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# リポジトリをAptソースに追加する:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

2. Dockerパッケージをインストールします。

```sh
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

3. hello-worldイメージを実行して、Docker Engineのインストールが成功したことを確認する。

```sh
sudo docker run hello-world
```

以下の確認メッセージが表示できれば、インストールOKになります。

```sh
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:4bd78111b6914a99dbc560e6a20eab57ff6655aea4a80c50b0c5491968cbc2e6
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

## Dockerのstartとstop

```sh
$ ps -ef | grep docker
ubuntu    161685  160969  0 14:16 pts/1    00:00:00 grep --color=auto docker

$ sudo systemctl start docker

$ ps -ef | grep docker
root      161690       1  4 14:16 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ubuntu    161832  160969  0 14:16 pts/1    00:00:00 grep --color=auto docker

$ sudo systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket

$ ps -ef | grep docker
ubuntu    161838  160969  0 14:16 pts/1    00:00:00 grep --color=auto docker
```

## 参考情報

* [dockerマニュアル](https://docs.docker.com/engine/install/ubuntu/)
複数テキストファイルを一つのファイルにしたい（前編）

ログがバラバラのテキストファイルに出力されていて、それをひとまとめにしたく。

`cat`コマンドは複数の引数を渡すとまとめてくれるらしいので、それでいいかと思ったんですが

```bash
ls | xargs cat
```

リダイレクトでファイルに保存できなかったんですよね。
結局時間もなかったので

```
ls -1 | xargs -iXXX cat XXX >> collect.txt
```

としちゃったんですが、もっといい解決法ありそう。。。
Progate +α メモず【SQL】

# はじめに
プログラミング入門最後です！
SQLは基本的にコマンド覚えゲーだと思ってます。
コマンドを一つ一つメモするのは、他言語以上に効率が悪いと思うのでやりません。
かといって疑問点もそこまであるかな？って気はするので短めの記事になるかも。
# メモず
## ワイルドカード`%`と`LIKE`の使い方
```sql
SELECT *
FROM table
where name like "%太郎%";
```
これで、「なんとか太郎」も「太郎なんとか」も「なんとか太郎なんとか」も取得できます。
でも、思ったんですよね
### `name = "%太郎%"`じゃダメ？なんで`LIKE`使うの？
つまりこういうことです
```sql
SELECT *
FROM table
where name = "%太郎%";
```
そうすると……
「%太郎%」と、`%`をワイルドカードではなく、文字 "%"として扱ってしまうらしい！
だから、`LIKE`演算子で「この後の`%`をワイルドカードとして扱ってね！」って教えてるわけですね。なるほど！
### 雑記：`%`以外の、`LIKE`によって特殊な解釈をする文字 (`_`)
`_`は任意の1文字を表すらしい。
```sql
SELECT *
FROM table
where name like "_太郎";
```
つまりこれで、"与太郎"に一致しつつ、"ハム太郎”には一致しないようにできるわけですね。
### 雑記：`%` / `_` のエスケープ方法
`%` / `_` を文字としてもワイルドカードとしても使いたいときは？
```sql
SELECT * 
FROM table 
WHERE name LIKE '%\%%' ESCAPE '\';
```
ややこしいですが、これで"100%"や、"20%引き"に一致することができます。
`ESCAPE 'char'`で、どの文字をエスケープ文字として使用しているか示してるわけですね。
## `null`へのアクセスは` = NULL`ではなく`IS NULL`
` =`は等価かどうかを比較する演算子であり、「何もない」ものを比較できないため。
## `GROUP BY`の絞り込みは`HAVING`
良い表があったのでメモ

| 実行順 | 種別 | 句 |
| ---- | ---- | ---- |
| 1 | 取得条件 | WHERE |
| 2 | グループ化 | GROUP BY |
| 3 | （集約）関数 | COUNT / SUM / AVG / MAX / MIN |
| 4 | HAVING句 | HAVING |
## 実行順の表
優先度は上の方が高く、下の方が後回しになる

| 実行順 | 種別 | 句 |
| ---- | ---- | ---- |
| 高 | テーブルの指定 | FROM |
|  | 結合 | ON / JOIN |
|  | 取得条件 | WHERE |
|  | グループ化 | GROUP BY |
|  | （集約）関数 | COUNT / SUM / AVG / MAX / MIN |
|  | HAVING句 | HAVING |
|  | 検索 | SELECT / DISTINCT |
|  | 順序 | ORDER BY |
|  | LIMET句 | LIMIT |
## `JOIN ON table1.column = table2.column`は`null`を除外する
`null`のデータもつなぎたい場合は、`LEFT JOIN`（`table1`の`null`を除外しない）を使う。
今回は調べないけど、両方の`null`を除外しない方法もあるはず。
## データの挿入：`INSERT`
構文は
```sql
INSERT INTO table (key1, key2) VALUES (value1, value2)
```
## データの更新：`UPDATE`
構文は
```sql
UPDATE table SET key1=value1, key2=value2 WHERE key=value
```
`WHERE`がないと、全データが更新されてしまうらしい。怖。
なんにしろ取り返しのつかない操作なので、`SELECT`でちゃんと確認してから使おうね！ﾊｰｲノ
## データの削除：`DELETE`
構文は
```sql
DELETE FROM table WHERE key=value
```
取り返しのつかない操作なので（以下略
# 終わりに
短めの記事でしたね。
SQLは触る機会が少なくて、RubyとJSみたいに「違う言語だけど感覚は一緒」みたいなこともないので、意識的に触っていきたい！
正規表現の先読み、後読み

調べても「先読み、後読みは位置へのマッチング」......となっていて、理解には程遠かった。
そもそも先読み、後読み、の主語も述語もないのが理解し辛さへの拍車をかけていると思う。

「本当にマッチしたいパターン」が「アンカー（位置）としてマッチしたいパターン」より先（前）にあるから先読み、後にあるから後読み。

# 肯定先読み

マッチした位置の先頭を基準にする。
以下の例だとFantasyの先頭のFが位置としてマーク（アンカーというらしい）される。

```javascript
// 特になんでもない
'FinalFantasy'.match(/Final(Fantasy)/)[0]
// -> FinalFantasy

// 肯定先読み Fantasyが続くFinal
'FinalFantasy'.match(/Final(?=Fantasy)/)[0]
// -> Final

// ありえないが 位置にマッチしているという話
'FinalFantasy'.match(/Final(?=Fantasy)Fantasy/)[0]
// -> FinalFantasy
// Fantasyが続くFinalの後にFantasyが存在する ということ
```

# 否定先読み

肯定先読みの逆。

```javascript

// Fight が続かないFinal
'FinalFantasy'.match(/Final(?!Fight)/)[0]
// -> Final

// Fantasy が続くとアンマッチ
'FinalFantasy'.match(/Final(?!Fantasy)/)
// -> null
```

# 肯定後読み

肯定先読みの。。。なんだ、逆か？

```javascript

'FinalFantasy'.match(/(?<=Final)Fantasy/)[0]
// -> Fantasy

'FinalFantasy'.match(/Final(?<=Final)Fantasy/)[0]
// -> FinalFantasy

```

# 否定後読み

```javascript

'FinalFantasy'.match(/(?<!Granblue)Fantasy/)[0]
// -> Fantasy

'FinalFantasy'.match(/(?<!Granblue)Fantasy/)[0]
// -> Fantasy

```

余談だが、中学生くらいのときに「正規表現」という言葉を聞いて「（厨二病的に）めっちゃかっこいいけどなんのためにあるのかよくわからない」と感じていた。こんな便利なものは他にないというのに。
「パターンとして扱う」と紹介された時に一番しっくりきたけれど、DBの正規化を学んだ後の方が「正規」に違和感がないかもしれない。「**抽象**」に近いのかな、と思う。
バッチファイルを実行したユーザーのユーザフォルダにファイルをコピーする。

## バッチファイルを実行したユーザーのユーザーフォルダにファイルをコピーする。

各ユーザーのRoamingフォルダ内にデータを置いてもらう必要があったけど、馴染みの無い人が多かったのでバッチファイル配って実行してもらうことで配置できたのでその時書いたプログラム

```bat:配布.bat
@echo off
rem コピーするファイルのパス
Set FilePath=%~dp0"a.txt"

rem コピー先のファイルパス
Set DestinationLocation="C:\Users\"%username%"\AppData\Roaming"

echo.

rem コピーするファイルがカレントディレクトリに存在したらコピーを実行
if exist %FilePath% (
   copy /y %FilePath%  %DestinationLocation%
   echo 　　　　この画面が閉じた後、配布.batは削除してください。
) else (
   echo 必要なファイルが見つかりません。
   echo 担当者へご連絡ください。TELxxxx-xxxx-xxxx
)

echo.
pause
exit
```
Bash と Caddy サーバで ActivityPub のインスタンス(16) 色々まとめる

## timeline.html と notification.html を一枚で表示できるようにする
```html:main.html
<html>

	<frameset cols="65%, 35%">
		<frame src="timeline.html" NAME="F1">
		<frame src="notification.html" NAME="F2">
	</trameset>

<html>
```

## サーバサイドのシェルをまとめる
サーバサイドとしてやっていることを並べると

1. Caddy サーバで host-meta / webfinger / アクター情報などを提供しつつ
2. Caddy サーバで指定したポート(もしくは Unix ドメインソケット)へ inbox へやってくるリクエストを流し
3. それを netcat で受けて処理し、202 or 204 に振り分けて
4. sort_req_file.sh で 202 ディレクトリのファイルを receive ディレクトリの各種ディレクトリへ送り
5. make_timeline.sh で receive ディレクトリの create / announce ディレクトリのリクエストを html にし tmeline.html に追加して create_done/announce_done へ送り
6. make_notification.sh で receive ディレクトリの like / follow_request / accept / undo_follow ディレクトリのリクエストを html にし notification.html に追加して like_done / follow_request_done / accept_done / undo_follow_done に送る
7. 1-3 を行いつつ 4-6 を繰り返す

である。
これらをそのまま並べる。
```bash:baca_server.sh
#!/bin/bash

# Don't miss "sudo"

trap 'kill $(jobs -p)' EXIT # Ctrl+C で止めたらプロセス全殺し

./caddy run &

function rec_proc_req(){
while :; do cat response | netcat -lN 1682 | bash response_move.sh ; done
}

rec_proc_req &


while :; do
	bash ./scripts/sort_req_file.sh
	bash ./scripts/make_timeline.sh
	bash ./scripts/make_notification.sh
	sleep 30
done
```

「baca_server」って何だよ？ という向きもいるかもしれないが、[ このインスタンスの名前は Baca である ]( https://qiita.com/tochu-cha/items/8c2d2cd6d4f2122c9163 ) である。
```
sudo bash baca_server.sh
```
sudo を付けないと verify.sh で使われている rm の y/n 問答で止まる。どちらにせよ sudo は必要だが気になるなら rm -f にするといいのでは。多分。


## クライアントもまとめる
```
bash ./scripts/note
```
とやるのも面倒なので単純に case を使って番号で選ぶようにする。
```bash:baca_client.sh
#!/bin/bash


read -p "What wanna ?: 
Note:1 Reply:2 Follow:3 Unfollow:4
Accept:5 Like:6 Announce:7
" number

case $number in
	1) bash ./scripts/note.sh;;
	2) bash ./scripts/reply.sh;;
	3) bash ./scripts/follow.sh;;
	4) bash ./scripts/unfollow.sh;;
	5) bash ./scripts/accept.sh;;
	6) bash ./scripts/like.sh;;
	7) bash ./scripts/announce.sh;;
esac
```

## 参考記事
[ bashスクリプトで子プロセスを全部殺すイディオム ]( https://qiita.com/buzztaiki/items/3bb16cb4a236c11ce250 )
LENOVO Miix 10 (IdeaPad)のwindows10化


**LENOVO Miix 10 (IdeaPad)のwindows10化**

Miix 10が安価で手に入ったためwin10化する手順をまとめる。


・目次
1.準備
　1.1.win10インストールメディア作成
　1.2.デバイスドライバ準備
　1.3.biosの設定変更
     
2.win10インストール
3.デバイスドライバインストール
4.不具合修正

<br>

**1.準備**
win10をインストールするにあたり、準備をしていく。

なお、win10をインストールするためにはUSBドライブが必要だが、
Miix 10にはUSBポートがないため、microUSBポートからUSBを接続できるよう
【micro usb ハブ】の購入が必要になる。

<br>
<br>

**1.1.win10インストールメディア作成**

以下からUSBドライブにwin10のインストールメディアを作成するためのツールをダウンロードする。

https://www.microsoft.com/ja-jp/software-download/windows10%E3%80%80

Miix 10は32bitのため、32bit版もしくは両対応版でツールをダウンロードする。

<br>
<br>

**1.2.デバイスドライバ準備**
win10インストール後はネットワークに接続できないため、手動でデバイスドライバをインストールする必要がある。

以下からチップセットとLANのデバイスドライバをダウンロードし、USBドライブ等にコピーしておく。

チップセット：pf132w8132.exe
LAN：wlan132w8132.exe

※win8と記載あるが使用可能。

https://pcsupport.lenovo.com/jp/ja/products/tablets/miix-series/miix-10-tablet-ideapad/downloads/driver-list


<br>
<br>

**1.3.biosの設定変更**
1.1で作成したインストールメディアを起動するためにはUSBドライブからBootする必要があるが、初期値？ではUSBBootができない設定になっているため、biosからsecureBootをオフにする必要がある。

Miix 10のbiosの起動方法は音量ボタンの＋を押しながら電源ボタンを長押し。
secureBootをオフに変更。

<br>
<br>

**2.win10インストール**
biosの設定が変更されていればusbbootができるため、
microUSBポートに【micro usb ハブ】を接続し、インストールメディア入りのUSBを接続。
音量ボタンの＋を押しながら電源ボタンを長押しでbootmenuに入り、USBを選択。
インストールメディアを読み込んだら通常通りインストール開始。

なお、win10は32bitを選択する。
また、キーボードやマウス操作が必要な場合、無線接続やBluetooth接続はできないため、USBハブに有線のマウス等を接続すること。



<br>
<br>

**3.デバイスドライバインストール**
win10のインストール完了後以下のドライバをUSBドライブ経由でコピーしインストールする。（microSDカードでも可）

その他のドライバはwinupdate経由で適用する。

チップセット：pf132w8132.exe
LAN：wlan132w8132.exe


<br>
<br>

**4.不具合修正**
上記手順まで完了後、winupdateを実施していると急にシャットダウンし、起動させてもすぐにシャットダウンをしてしまう現象が起きた。

調査の結果、デバイスドライバのIntel Dynamic Platform and Thermal Frameworkが悪さをしていることが分かった。
上記を解消するための手順を紹介。
<br>

①電源ボタンを長押しして電源ONした際に、windowsが立ち上がる前に電源ボタンを長押しして強制シャットダウンさせる。

<br>
②上記手順を2回繰り返した後、3回目の起動でスタートアップ修復が実行される。
<br>
<br>

③しばらく時間がたった後、「詳細オプション」→「トラブルシューティング」→「詳細オプション」→「スタートアップ設定」と進み、
セーフモードで起動する。（キーボード操作が必要になる。）

<br>
④セーフモードでwin10を起動後、以下を参照してデバイスマネージャーを開く。

https://askpc.panasonic.co.jp/beginner/guide/ten07/7013.html
<br>
<br>

⑤以下画像を参照し、「Intel Dynamic Platform and Thermal Framework～」と記載されたデバイスドライバを削除する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/b5f5cb0f-5c73-a123-45c4-4830ad5b3835.png)

<br>
<br>
⑥再起動を行うと正常に起動するようになり、勝手にシャットダウンをすることがなくなった。

<br>
<br>
<br>

イベントログを確認してみると「kernel power 86」が記録されていたため、Intelのドライバが正常に動作しなくなり、CPUの温度を誤って高温と測定してしまいシャットダウンを繰り返していたと予想。

winupdateの推奨ドライバにて「Intel Dynamic Platform and Thermal Framework～」が出てくるが、インストールしないほうがよさそう。



<br>
<br>
<br>

以上でMiix 10のwin10化が無事終了しました。
OSのライセンス認証も自動で通り、デバイスドライバ適用でディスプレイタッチも良好。
HerokuのアップデートWarningが出るがbrew経由でアップデートできない時

Herokuコマンドを実行するとこんな感じで言われる：

```Warning: heroku update available from 8.5.0 to 8.7.1.```

ということでbrew経由でアップグレードしようとコマンドを叩くと

```%brew upgrade heroku/brew/heroku Warning: heroku/brew/heroku 8.5.0 already installed```

既に最新版が入ってまっせと言われる。

そんな時は

```% heroku update```

これだけでできる。

```% heroku --version heroku/8.7.1 darwin-x64 node-v16.19.0 ```
Homebrew経由でサポートが終了したPHPをインストールする

# バージョン情報

Homebrew：4.2.5

# 事象

HomebrewでPHP8.0をインストールしようとしたら2023年11月でサポート期間が終了していたため、下記のエラーが発生してインストールできなかった。

今回は8.0をインストールする。

``` terminal
$ brew install php@8.0
Error: php@8.0 has been disabled because it is a versioned formula!
```

2023/01/25時点でインストールできるのは8.1と8.2

# 対応策

①下記コマンドを叩く

``` terminal
$ brew tap shivammathur/php
```

2024/01/25時点では5.6〜8.4がインストールできるっぽい。

``` terminal
$ brew search php
brew-php-switcher                      phpmd                                  shivammathur/php/php@5.6-debug         shivammathur/php/php@7.1-debug-zts     shivammathur/php/php@7.3-zts           shivammathur/php/php@8.1               shivammathur/php/php@8.4-debug
php ✔                                  phpmyadmin                             shivammathur/php/php@5.6-debug-zts     shivammathur/php/php@7.1-zts           shivammathur/php/php@7.4               shivammathur/php/php@8.1-debug         shivammathur/php/php@8.4-debug-zts
php-code-sniffer                       phpstan                                shivammathur/php/php@5.6-zts           shivammathur/php/php@7.2               shivammathur/php/php@7.4-debug         shivammathur/php/php@8.1-debug-zts     shivammathur/php/php@8.4-zts
php-cs-fixer                           phpunit                                shivammathur/php/php@7.0               shivammathur/php/php@7.2-debug         shivammathur/php/php@7.4-debug-zts     shivammathur/php/php@8.1-zts           pop
php-cs-fixer@2                         shivammathur/php/php                   shivammathur/php/php@7.0-debug         shivammathur/php/php@7.2-debug-zts     shivammathur/php/php@7.4-zts           shivammathur/php/php@8.2               pcp
php@8.0                                shivammathur/php/php-debug             shivammathur/php/php@7.0-debug-zts     shivammathur/php/php@7.2-zts           shivammathur/php/php@8.0               shivammathur/php/php@8.2-debug         pup
php@8.1                                shivammathur/php/php-debug-zts         shivammathur/php/php@7.0-zts           shivammathur/php/php@7.3               shivammathur/php/php@8.0-debug         shivammathur/php/php@8.2-debug-zts
php@8.2 ✔                              shivammathur/php/php-zts               shivammathur/php/php@7.1               shivammathur/php/php@7.3-debug         shivammathur/php/php@8.0-debug-zts     shivammathur/php/php@8.2-zts
phpbrew                                shivammathur/php/php@5.6               shivammathur/php/php@7.1-debug         shivammathur/php/php@7.3-debug-zts     shivammathur/php/php@8.0-zts           shivammathur/php/php@8.4
```

②下記コマンドを叩く

``` terminal
$ brew install shivammathur/php/php@8.0 ← インストールしたいバージョンを入れる
```

③バージョン確認
``` terminal
$ php -v
PHP 8.0.30 (cli) (built: Nov  7 2023 02:48:46) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies
```

※Homebrewで複数バージョンをインストールしている場合は「brew unlink / link php@・・・」でのバージョン切替を忘れずに…
参考：https://qiita.com/gyarasu/items/0ffd0fb5761b9d164d39
ghq listでリポジトリが表示されなくなった。[Ubuntu 22.04]

# ghq listでリポジトリが表示されなくなった。

```terminal
$ ghq list
github.com
```

おかしい！！以前だったらgithub.com以降のパスが表示されるのですが、、、

# 調べてみた。

と思って調べてみたら、すでに見つけている方がいらっしゃった。（ありがとうございます！
https://hiroga.hatenablog.com/entry/2020/03/17/073318

私のgithub.comのディレクトリでも本当に.gitディレクトリが存在しておりました、、、
```terminal
~/ghq/github.com$ ls -a | grep .git
.git
```

# 修正！

```terminal
~/ghq/github.com$ rm -rf .git
~/ghq/github.com$ ghq list
github.com/minobun/FavIPon
github.com/minobun/mgs-practice
（略）
```
おお、ちゃんとリポジトリ出てきてくれました！
これにて解決でございます。

なんで.gitファルダあったんだろ、、、と謎に思いつつ今回は無事解決です。
AWS Glueまわりのツールをまとめてみた。

最近、AWS Glueを使ってデータ分析する開発に携わってます。

　

その際に、AWS Glueを使うぞ！　ってなっても、

なかなか、必要な機能を集めることができず、困ったので、ここにまとめました。

　　
 
▼　AWS Glue まわりのツールず

![AWS-Glue-周りのツールず.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406290/a565454f-ec78-17bf-ae65-5790ee297eb3.png)

　

AWSは、良くも悪くも、いろいろな機能がありすぎますね。

そしてそれゆえに、

それぞれのツールの関係性が掴めてないと、なかなか使いずらいです。

　

それぞれが高機能で優秀かもしれないけれど、

それ単独では、なんの役にも立たないわけで。

連携することで、ひとつのシステムですからね。

　
　
急に、話は変わりますけど、

昨今は、副業、独立、フリーランスと、

個人でスキルを身につけて生きていくことが

エライという風潮があるように思いますが、

　
しっかりとしたスキルと持った先にあるのは、

いかに、ひとと協力して、

いかに、その関係性のなかでその能力を活かし、

まわりのひとたちを豊かにしていけるのか？

にあるように思います。

　

この記事を書いていて、

論語物語での孔子の言葉、

　
 
「一身を潔く（きよく）するということだけなら、

　たいしてむずかしいことではない。

　むずかしいのは、天下とともに潔くなることじゃ。」

　

という言葉を思い出しました。

　

 　

天下とともに潔く。

いらぬ調子にのらず、日々、精進してゆきます。

　

ありがとうございました！
MUIをReactで使えるようにする @yukilulu0229

## install


https://mui.com/material-ui/getting-started/installation/


### Default installation
```
npm install @mui/material @emotion/react @emotion/styled
```

### icon

```
npm install @mui/icons-material
```

## iconを使う

https://mui.com/material-ui/material-icons/

![スクリーンショット 2024-01-25 21.18.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/956e55d9-c06c-da93-c074-d06133f788e5.png)

ここで検索する

importする

![スクリーンショット 2024-01-25 21.20.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/f4e0559c-d17b-8f01-d578-e5a09db277a2.png)

```App.jsx

import ExpandMoreIcon from "@mui/icons-material/ExpandMore";

....

<div>
 <ExpandMoreIcon />
</div>
```
Postmanで連想配列を送る方法

# はじめに
Web APIの設計・開発、テストをサポートするツールとして有名なPostman

https://www.postman.com

何となくGETで値を受け取ったり、POSTしてDBに値を保存したり、、、といった基本的な使い方はわかっているがある時

**「あれ？？連想配列ってどうやって送るんだ？？？」**

と詰まったので、ここに記録します:persevere:

またLaravel + Open APIという開発環境の例で進めます

# どうやって配列をPOST送信するか
画像とともに手順を以下に記載していきます！

## まずはRequest内のBodyセクションを開きましょう
![Screenshot 2024-01-25 at 21.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/a4f36d83-19ab-1a1a-f261-6538571d588e.png)

今まではパラメーターで送ってばかりでParamsしか開いたことがありませんでした・・・
👇こっちではありません！！
![Screenshot 2024-01-25 at 21.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/61ccdb48-d808-d0ec-3405-d06f2495903d.png)

## raw + JSONの設定にする
恐らくデフォルトでこの設定になってるとは思いますが、一応確認しましょう
![Screenshot 2024-01-25 at 21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/259fd4cd-2bd6-bcb1-89dd-d8b6a2ae1f94.png)

## 必要な配列を入れる
仮に以下のようなOpen API定義が`yml`であったとします。

```yml
 requestBody:
    description: "申請"
    required: true
    content:
      application/json:
        schema:
          type: object
          properties:
            start_date_time: { $ref: "../../../../components/schemas/reports.yml#/start_date_time" }
            end_date_time: { $ref: "../../../../components/schemas/reports.yml#/end_date_time" }
            break_times:
              type: array
              items:
                type: object
                properties:
                  start_date_time: { $ref: "../../../../components/schemas/break_times.yml#/start_date_time" }
                  end_date_time: { $ref: "../../../../components/schemas/break_times.yml#/end_date_time" }
                required:
                  - start_date_time
                  - end_date_time
          required:
            - start_date_time
            - end_date_time
```

これをPostmanでPOST送信する場合、Request内のBodyは以下のようになります。

```json
{
    "start_date_time": "2024-01-20 10:00:00",
    "end_date_time": "2024-01-20 18:00:00",
    "break_times": [
    {
      "start_date_time": "2024-01-20 12:00:00",
      "end_date_time": "2024-01-20 13:00:00"
    },
    {
      "start_date_time": "2024-01-20 15:00:00",
      "end_date_time": "2024-01-20 16:00:00"
    }
  ]
}
```

![Screenshot 2024-01-25 at 21.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/fc2be877-5e36-473c-4ceb-5c110de79d3a.png)


これでOK!!!
Postman初心者だったので配列を送るだけも躓きました:unamused:
Node.jsインストール(nodenv)

## 前提

anyenvがインストールされていること

## nodenvをインストールする

```zsh
anyenv install nodenv
```

```
exec $SHELL -l
```

## nodenvを使ってNode.jsをインストールする

ここでは最新バージョンのNode.jsをインストールする

```zsh
node_version=$(nodenv install --list | egrep '^[0-9]+\.[0-9]+\.[0-9]+$' | tail -n 1)
```

```zsh
nodenv install ${node_version}
```

```zsh
nodenv global ${node_version}
```

```zsh
nodenv rehash
```

```zsh
node -v
```

```:出力
v21.6.1
```

```zsh
npm -v
```

```:出力
10.2.4
```
pleiades all in oneの解凍に苦戦した話

・問題

pleiades all in oneをダウンロードしたあと、解凍しようとしてもエラーになってしまう。ダウンロードしたのはWindows x64のUltimate。

・トライ
ダブルクリックやWinRARを利用して解凍したがチェックサムエラーが発生する。

UltimateをやめてJavaのダウンロードファイルに変更。今回Javaを使いたかったので最悪Javaの環境が整えば良い。結果としてうまく解凍できた。
eguiを使ってみよう

# eguiを使ってみよう2024

仕様がころころかわるのでネット上に使える資料が少なく感じてしまう**egui**、しかし仕様が変わるなら追いかけ続ければよいのです。<br>
**tauri**がいろいろ手厚くてしかも便利なのだけどコンパイルにかかる時間があれだったりちょっとしたものを作りたい場合にちょっと大げさだったり。<br>
それにくらべると手軽でコンパイル時間も短い**egui**はそれだけで価値があると思います。<br>
<br>
では早速いってみましょう。

## 今回の対象バージョン
- egui : 0.25.0
- egui_extras : 0.25.0
- eframe : 0.25.0

## Hello, world!

### 手順

まずは プロジェクトを作成して crate など導入します。
```sh
cargo new myapp
cd myapp
cargo add egui
cargo add eframe
cargo add egui_extras --features="all_loaders"
```

ついでに **src/** に **rust_logo.png** と、Rustのロゴの例のあれを用意しました。<br>
src/main.rsを以下のように編集します。

### ソースコード

```rs
#![cfg_attr(
    all(not(debug_asertions), target_os="windows"),
    windows_subsystem="windows"
)]

use eframe::{egui::*, NativeOptions};

#[derive(Default, Clone)]
pub struct MyApp {
}

const RUST_LOGO: egui::ImageSource = egui::include_image!("rust-logo.png");

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &Context, _frame: &mut eframe::Frame) {
        ctx.set_pixels_per_point(1.0);

        egui::CentralPanel::default().show(&ctx, |ui| {
            ui.label("Hello, world!");
            egui::Image::new(RUST_LOGO).paint_at(ui, Rect::from_min_max( pos2(100.0, 100.0), pos2(300.0, 300.0)));
        });
    }
}

fn main() {
    let options = NativeOptions {
        viewport: egui::ViewportBuilder::default()
            .with_inner_size([320.0, 240.0])
            .with_min_inner_size([320.0, 240.0]),
        ..Default::default()
    };

    let _ = eframe::run_native(
        "myapp",
        options,
        Box::new(|cc| {
            egui_extras::install_image_loaders(&cc.egui_ctx);
            Box::<MyApp>::default()
        }),
    );
}
```

ではこのまま実行してみます。

```sh
cargo run
```

![egui-sample](https://gist.github.com/assets/12671694/a8bca6bc-097c-46da-bf9b-c2484ccac170)

このように実行されました。
画像がつくとグッとカッコよさげになりますね？

### 軽い解説

このあたり変わったよーというポイントとしては ```let options = NativeOptions { viewport:...``` の辺り、viewportとかViewportBuilderとか、公式のドキュメントとかexampleとか見ればわかるんですがちょっとハマったので一応書いておきます。<br>

ほかは```egui::include_image!("rust-logo.png");```の辺りでしょうか、```cargo add egui_extras --features="all_loaders"```で追加したcrateによるものです、これがいいなと思うところは実行バイナリに画像が内包されるので同梱しなくてよい、覗かれないあたりです。<br>
コンパイル時に```src/```からの相対パスで参照されるようなのでいい感じに画像を置いてコンパイルします。

それともう一つ。```egui::Image::new(RUST_LOGO).paint_at...```の**paint_at**で要するに好きなところに配置できるのでゲームを作ったりするのに使えるんじゃないでしょうかー。というあたりです。<br>
普通にレイアウトで画像を利用するには```ui.add(egui::Image::new(RUST_LOGO));```のようにすればよいです。

## 次回

未定ですがeguiはちょっと素敵だなと思ってるので食いついていきたいなと思ってます。
ちょっとわかりづらい部分に突っ込めたらいいですね。
Railsのserializerの使い方や導入手順について再認識する

## 最初に

私は、大学生であり、もう少しでWebエンジニアとしてのキャリアが始まる為、現在学習している内容などを投稿していきたいと思います。

## serializerについて

serializerとは、RailsでAPIを作る際、データをJSON形式にわかりやすく変換して適切な制御できるgemの事です。


例えば、userのデータ情報が`id`,`name`,`email`,`created_at`,`update_at`とあったとして、user情報をAPIから送る際に全ての情報を送るのは、セキュリティの面で問題となるので、userの全ての情報のうち、どの情報をレスポンスするのかを制御する為にserializerを導入します。

## 1. gemのインストールと設定

- gemインストール

Railsでserializerを扱う為には、Gemfileにgemを追加してインストールする必要があります。
```ruby:Gemfile
gem 'active_model_serializers'
```
上記をGemfileに追記した後にgemをインストールします。
```
bundle install
```
これで、serializerのgemインストールは完了です。

## 2. serializerの生成
- serializerのファイルを生成する

serializerを生成する為に下記のコマンドを実行します。


:::note warn
※Modelhogeにはプロダクトに合ったモデル名を入れてください。
:::

```
rails g serializer Modelhoge
```

コマンド実行後に`app/serializers/modelhoge_serializer.rb`ファイルが自動的に生成されます。

## 3. serializerの使い方

- 基本的な設定

serializernの設定をする為に、`app/serializers/modelhoge_serializer.rb`ファイルにコードを記載していきます。
```diff_ruby:app/serializers/modelhoge_serializer.rb
class ModelhogeSerializer < ActiveModel::Serializer
+  attributes :id, :name, :email
end
```
user情報のカラムを例として、serializeします。

serializerファイルでは、どのカラムの情報レスポンスボディーに含めるか定義します。

したがって、上記のコードでは、`id`,`name`,`email`カラムのみをレスポンスボディーに含めるように定義しました。

### アソシエーションしてるデータをserializeする場合


```diff_ruby:app/serializers/modelhoge_serializer.rb
class ModelhogeSerializer < ActiveModel::Serializer
  attributes :id, :name, :email
+ has_many :content
end
```



次に、上記で定義したserializerをコントローラーに呼び出しをして行きます。

## serializeの呼び出し
+ コントローラーで呼び出し

先ほど定義したserializerをコントローラーで呼び出す為に以下のようにコードを書いて行きます。

```ruby:app/controllers/hoge_controller.rb
class HogeController < ApplicationController
  def show
    @model = Model.find(params[:id])
    render json: @model, serializer: ModelhogeSerializer
  end
end
```

上記によってModelHogeSerializerで定義したデータがJSON形式でレスポンスされるようになります。

## 参考

https://qiita.com/Hashimoto-Noriaki/items/91c2bb94bce87495193e
【備忘録】yarn berry (v2~v4)のリポジトリをcloneしたときに'MODULE_NOT_FOUND'エラー

# 発生した事象
yarn v1系を使用していて、グローバルはそのままに当該repoのみバージョンをyarn berry (v2〜v4)系に変更したのち設定ファイル(`.yarnrc.yml`、`package.json`)をcommit、push
それをpullしたコラボレーターから「yarnが使えない！」という申し出があった

```bash:terminal
$ yarn install

node:internal/modules/cjs/loader:1051
  throw err;
  ^

Error: Cannot find module '/Users/OO/Documents/GitHub/reponame/.yarn/releases/yarn-4.0.2.cjs'
    at Module._resolveFilename (node:internal/modules/cjs/loader:1048:15)
    at Module._load (node:internal/modules/cjs/loader:901:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at node:internal/main/run_main_module:23:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}
```

「`yarn set version stable`を実行してみて」と話すも状況は変わらず

原因は言われている通り「そのディレクトリにそんなファイルはねぇ」だが解決法がわからず1日悩む

# 解決法
まず`node_modules`ディレクトリがある場合は削除

次に`.yarnrc.yml`の
```yml:yarnrc.yml
yarnPath: .yarn/releases/yarn-4.0.2.cjs #バージョンにより異なる
```
を一旦削除

そして`package.json`の
```json:package.json
  "packageManager": "yarn@4.0.2",
```
も一旦削除

最後に
```bash:terminal
$ yarn set version stable
```
を実行

これにより`/.yarn/releases`に`yarn-(バージョン名).cjs`が保存される
上記ファイル群の変更は元に戻る