OmniAICreator/Qiita-1.07M huggingface dataset:
Apache Jena Fusekiでデータベースを他のバージョンに引き継ぐ

[Apache Jena Fuseki](https://jena.apache.org/)（以下Fuseki）は活発に開発が進められており、頻繁にバージョンアップが行われます。そこで、データベースに関する情報を引き継ぐための方法を記載しておきます。なお、動作確認したバージョンは4.9.0で、スタンドアローンで利用し、各種設定は初期状態のままを想定しています。

Fusekiをダウンロードして展開すると、直下に `run` フォルダができます。その中には `databases` と `configuration` という名前のフォルダがあります。前者にデータベースの実体が、後者に各データベースに関するメタデータが収められています。そこで、データベースを構築したFusekiのこれらの情報を、新規バージョンのFusekiの各所にコピーするか、別の場所に実体をおき、それに対するシンボリックリンクを貼ります。
```
apache-jena-fuseki-4.9.0 -+- run ----+- databases -----+- db1
                          +- ...     |                 +- db2
                          .          |                 .
                                     |
                                     +- configuration -+- db1.ttl
                                     .                 +- db2.ttl
                                                       .
```
以上になります。
wslでelixir その27

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
websocket clientやってみた。

# 参考にしたページ。

https://qiita.com/tamanugi/items/5cfd326ad301ec6b8928

# 実行結果

```
iex(1)> socket = Socket.Web.connect! "localhost", 50002
%Socket.Web{
	extensions: nil,
	headers: %{},
	key: "Zm9yayB0aGUgZG9uZ2xlcw==",
	mask: true,
	origin: nil,
	path: "/",
	protocols: nil,
	socket: #Port<0.7>,
	version: 13
}
iex(2)> socket |> Socket.Web.send!({:text, "test"})
:ok
iex(3)> socket |> Socket.Web.recv!
{:text, "test"}
iex(4)>
```

# 実験に使ったサーバー

https://qiita.com/ohisama@github/items/37eac3614f9fd1509fb2


以上。
Lambda関数 指定のログが出た際、Slackに通知する

# 0/3 全体像
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/7a4f5954-5c46-886d-d790-e961b2438e0a.png)

# 1/3 事前設定
## SNSトピックを作成しよう
### AWS SNSから新規トピックを作成　名前はテキトーで、タイプはスタンダート
![39c9b3ab-04aa-43cd-8d97-85e65f506cda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/9cc0d2e3-7ec8-d0a6-2f93-30ac075eeb31.png)![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/3516aef0-f9a3-25ed-b82c-100f761b3837.png)

## AWSとSlackを接続させよう
### AWS Chatbotから「新しいクライアントを設定」（僕の画面ではすでにSlack連携が済んでいる）
![3907e500-305a-4fa6-9a59-79f6d4a9f956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/696960ae-ea2b-b897-7894-94cf006ad98d.png)

# 2/3 監視したい関数を実際にアラーム登録しよう
## 監視対象の関数からモニタリング＞CloudWatchログを表示
![c8462a2c-ed12-48ba-ba0d-a205ce78a3b7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/af48bfc4-23a2-ba82-8d3d-57176a70e4ef.png)

## メトリクスフィルターを作成

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/f5b1569e-6992-1ff7-b6bd-0ea2d913992c.png)

こんな感じで、「ERROR」と一致するログを検知するフィルターを作成（赤枠内はテキトーでいいはず）
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/07113bbc-c863-ffef-1c56-1987145ee0d9.png)

メトリクスフィルターが完成したら、チェックを入れて「アラームを作成」
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/47756897-9e16-5d99-7c54-b244cfac9d39.png)![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/484cb2ca-618c-87ff-5b36-9dc16eef1af5.png)

:::note warn
↑すみません「よりも」のところは「0」が正しいです
※1分間に1件以上（＝**0よりも大きい**件数の）エラーが起きたときにアラートをしたいため
:::

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/8c394b95-76a2-00da-f7bb-8496c1f4d89f.png)

# 3/3 イベントルールを作成しよう
Amazon Event Bridgeからルールを作成
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/bc238cca-2f50-6c7c-3e5c-6571be5ad2f5.png)


こんな感じでルールを作成
![73e30649-fec6-4e74-99ac-6b1daee884c0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/14828306-e675-73b6-adee-eea05b0d6e19.png)

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/fb07146c-74c2-dcb7-f40e-96f70df60b66.png)
イベントパターンはこんな感じで書きました
```json
{
  "source": ["aws.cloudwatch"],
  "detail-type": ["CloudWatch Alarm State Change"],
  "resources": ["対象アラートのARN"],　//例：arn:aws:cloudwatch:ap-northeast-1:~~~~:alarm:~~~
  "detail": {
    "alarmName": ["アラーム名"],
    "previousState": {
      "value": ["OK"]
    },
    "state": {
      "value": ["ALARM"]
    }
  }
}
```
Spring Boot アプリケーションと PostgreSQL データベースを Docker 化する方法

## DockerHub から Postgresコンテナイメージをプルする
```
docker pull postgres
docker images

docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=admin -e 
POSTGRES_USER=admin POSTGRES_DB=mydb -v desktop:\ var/lib/postgresql/data postgres
```

## 参考サイト
[How To Dockerize Spring Boot Application & PostgreSQL Database](https://www.youtube.com/watch?v=3fALfjlkfuU)
Flutter実装：SupabaseでStreamでリスト表示していたら、新しいデータが表示されない

# はじめに
おはようございます。本件を解決するために1日もかかってしまったので、忘備録として残しておきます()
# つまったところ
SupabaseでStreamでリスト表示していたら、新しくデータを入力して表示されるはずなのに、全然表示されない・・・。
```dart
class FoodList extends HookConsumerWidget {
  const FoodList({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    debugPrint('FoodList#build');
    final foods = ref.watch(foodsStateProvider);
    return SizedBox(
      width: MediaQuery.of(context).size.width * 0.9,
      child: foods.when(
          data: (foods) {
            debugPrint('FoodList#build#data');
            return Expanded(
              child: Padding(
                padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),
                child: ListView.builder(
                    shrinkWrap: true,
                    itemCount: foods.length,
                    itemBuilder: (context, index) {
                      final food = foods[index];
                      return Card(
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Text(food.name),
                            IconButton(
                              onPressed: () {
                                ref
                                    .read(foodsStateProvider.notifier)
                                    .deleteFood(food.id);
                              },
                              iconSize: 30,
                              icon: const Icon(
                                  Icons.remove_circle_outline_rounded),
                            ),
                          ],
                        ),
                      );
                    }),
              ),
            );
          },
          loading: () => const Center(child: CircularProgressIndicator()),
          error: (error, stackTrace) => Text('エラーが発生しました。')),
    );
  }
}
```

# これで解決
Supabaseのtable設定でEnable RealtimeをONに設定しなかったことが原因でした。
これで、クライアント側にもリアルタイムにデータが表示されるようになりました。
![スクリーンショット 2023-08-03 9.22.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989029/6784bb1d-5da6-35b0-8815-ee43ae6a039d.png)

# 最後に
今日はSupabaseのStreamでリスト表示していたら、新しいデータが表示されない問題を解決しました。
今まで、クライアント側をメインに触っていたので、バックエンド側にも目を向けることを心がけていきたいですね😭
IAM Roles Anywhereの理解を整理してみた

# 概要

AWSをローカル環境からCLIとかで操作するときにアクセスキーとシークレットを設定すると思いますが、これらの管理って地味に面倒だと思います。
そこで気になったのが「アクセスキーを排除する」という触れ込みの**IAM Roles Anywhere**というサービスです。

しかしいざ使ってみると「これってアクセスキーより面倒じゃね？」と感じてしまいました。そこで諸々の技術ブログを読んでみたのですが、妙に複雑に思えて「要するにどういう仕組みで何が嬉しいの？」を理解するのに苦労しました。

というわけで **IAM Roles Anywhereはなぜ安全なのか**、**IAM Roles Anywhereのメリデメって結局のところ何なのか？** について個人的な理解を簡単にまとめてみました。

※この記事ではIAM Roles Anywhereの細かい仕組みや使い方には触れません。その辺りについては以下の記事をお勧めします。

* AWS公式のブログです。まずはこちらを読むのが良いと思います。
[[IAM Roles Anywhere で AWS IAM ロールを AWS 外部のワークロードに拡張する]](https://aws.amazon.com/jp/blogs/news/extend-aws-iam-roles-to-workloads-outside-of-aws-with-iam-roles-anywhere/)
* 仕組みが図で解説されており、既存のやり方との違いも明確にまとめられていてとてもわかりやすいです。
[IAM Roles Anywhere の認証方式を理解する](https://blog.serverworks.co.jp/iam_roles_anywhere)
* とりあえずOpenSSLで試してみようっていう場合に手順がとても参考になります。
[OpenSSLで作った自己署名証明書でIAM Roles Anywhereを使ってみた](https://dev.classmethod.jp/articles/iam-roles-anywhere-with-a-self-signed-certificate-created-with-openssl/)

# IAM Roles Anywhereはなぜ安全なのか

アクセスキー&シークレットは長期クレデンシャル、IAM Roles Anywhereは一時クレデンシャルなのでIAM Roles Anywhereの方が安全、というのはすぐに理解できます。しかし、一時クレデンシャルを取得するときに秘密鍵と証明書を用いるわけで、これらが流出したら結局危険では？と思ったのが疑問の始まりでした。

これに対する答えは**秘密鍵は送信しないから**です。秘密鍵はあくまでリクエストの署名に利用されるだけで、AWSに送信されるのは証明書のみになります。（[ヘルパーツールのGitHub](https://github.com/aws/rolesanywhere-credential-helper)の説明を見る限りでは秘密鍵はリクエストの署名に使われると書かれており、送信されることはなさそうです。）
秘密鍵さえ流出しなければ証明書が流出しても中身を見られる心配はほぼないと考えてよいでしょう。

一方でアクセスキー&シークレットの長期クレデンシャルを利用する場合、AWSとの通信の度にインターネット上にこれらが乗るので常に流出の危険に晒されるわけです。

公開鍵暗号方式の基本に立ち返れば理解できる話なのですが難しく考えすぎていました…

# IAM Roles Anywhereのメリット

メリットはズバリ、**セキュリティの強化**になると思います。ただし、このメリットが得られるのはインターネットアクセス限定と考えられます。Direct ConnectやVPNを使う場合はIAM Roles Anywhereを利用するメリットはあまり無いんじゃないかと思います。

# IAM Roles Anywhereのデメリット

デメリットは証明書やヘルパーツールの管理に付随する作業が増えることだと思われます。
本番環境で安全に運用しようと思ったら信頼できる認証局を準備する必要も出てきます。
AWS Private CAを使う手もありますが有料ですし…

とはいえプレーンテキストのアクセスキー&シークレットをセキュアに運用するのも結構な手間なのでデメリットというよりは「管理作業の手間は**あまり変わらない**」と表現する方が適切かもしれません。


# おわりに

IAM Roles Anywhereの個人的な理解をまとめてみました。
まとめ記事は色々見つかるのですが妙に複雑に説明されている気がしていて、要するにどういうこと？の初歩的な説明が欲しいと思ったので自分で調べてまとめてみました。
わかる人にとっては当たり前のことかもしれませんが、少しでも参考になる方がいらっしゃれば幸いです。


# 参考文献

本文中に明示したサイトと、以下のサイトを参考にしました。

(https://ermetic.com/blog/aws/why-its-important-to-take-notice-of-aws-iam-roles-anywhere/)
PowerAutomateでTeamsチームメンバーを追加＆削除

今回は最近知ったPowerAutomateの小ネタのご紹介。

頻度高くはないと思いますが、PowerAutomateを使って業務を自動化するなかで、特定のTeamsチームのメンバーを追加したり削除したりするオペレーションを行うケースがあります。ところが・・・

# Problem

PowerAutomateで提供されている標準のTeamsコネクターが提供するアクションの中には、「チームにメンバーを追加する」はあるが「チームからメンバーを削除する」がない：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/3bcea69b-6b94-41f3-b116-b1bbd5413870.png)

# Solution

「Office 365 Groups」コネクターの「グループからメンバーを削除」を使用する：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/c9377f0f-8ed4-e5d3-e589-f036b02d33cb.png)

なぜそうなるのかというと、Teamsのチームは裏側で「Office365グループ」と紐づいており、チームのメンバーはすなわちこの「Office365グループ」のメンバーとして実現されているためです。

:::note warn
このアクションでメンバーを削除したあと、Teamsのチーム管理画面の表示に反映されるまでに、数十秒～数分の時差があるようです。
私が手元で確認した限りではそういうことがありました。アクションを実行すると成功するのですが、Teams画面では依然としてメンバーが存在しているように見える。。。「おや？」と思ってアクションを再実行すると「そんなメンバーいない」とエラーになる。時間が解決してくれました。
:::
コンテキストを理解するAIアシスタント、Databricksアシスタントのご紹介

[Introducing Databricks Assistant, a context\-aware AI assistant \| Databricks Blog](https://www.databricks.com/blog/introducing-databricks-assistant)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本日、Databricksノートブック、SQLエディタ、ファイルエディタでネイティブで利用できる、コンテキストをAIアシスタントであるDatabricksアシスタントのパブリックプレビューを発表できることを嬉しく思っています。Databricksアシスタントによって、会話型のインタフェースを通じてデータをクエリーすることができ、Databricksでの作業がより効率的になります。英語でタスクを説明して、アシスタントにSQLを生成させたり、複雑なコードを説明させたり、自動でエラーを修正させることができます。アシスタントはあなたにパーソナライズされたレスポンスを提供するために、皆様のテーブル、カラム、説明文、頻繁に使用されているデータ資産を理解するために、Unity Catalogのメタデータを活用します。

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

# データ & AIプロジェクトをより迅速に構築

## SQL、Pythonコードの生成

Databricksアシスタントは、Databricksの編集インタフェースのれぞれにネイティブでインテグレーションされています。編集インタフェース(ノートブック、SQLエディタ、ファイルエディタ)に応じて、適切なSQLクエリーやPythonコードを返却します。定型コードやスタートする際の初期コードを提供することで、プロジェクトの加速に役立ちます。そのあとで、コードを実行したり、編集したりすることができ、さらなる開発のために新規セルに追加することができます。
![](https://live-databricksinc.pantheonsite.io/sites/default/files/inline-images/blog-image6.gif)

## コードやクエリーのオートコンプリート

コードスニペットを提案するために、ノートブックセルやクエリーエディタの中からアシスタントを使用することができます。コメントをタイプし、オートコンプリートの提案を起動するために、control + shift + space (Windows)あるいはoption + shift + space (Mac)を押します。
![](https://live-databricksinc.pantheonsite.io/sites/default/files/inline-images/blog-image3.gif)

## コードの変換

また、アシスタントは、ある言語やフレームワークのコードを別のものに変換することができるので、現在のタスクにベストな言語を常に活用することができます。例えば、何も書き換えることなしにpandasのコードをPySparkのコードに変換することができます。
![transform_code-125 (dragged).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/561fa191-e6fc-53cc-6f01-70f6ab8fba9c.png)

## コードやクエリーの説明

Databricksアシスタントは、複雑なコードの一部をクリアで簡潔な言語で説明することができます。不慣れな特定なプロジェクトの理解に役立ちます。
![](https://live-databricksinc.pantheonsite.io/sites/default/files/inline-images/blog-image1.gif)

## 問題の修正

Databricksアシスタントはコードのエラーを特定したり、修正を提案することができます。構文エラーのような問題に直面した際に、アシスタントは問題を説明し、問題修正のためのコードスニペットを作成します。
![](https://live-databricksinc.pantheonsite.io/sites/default/files/inline-images/blog-image4.gif)

## あなたのためにパーソナライズされた、コンテキスト依存のレスポンス

Databricksアシスタントは、より高精度で適切な問題を提供するために、数多くのシグナルを活用します。自然言語の質問をクエリー、コードにマッピングするために、コードセル、ライブラリ、人気のテーブル、Unity Catalogスキーマ、タグから得られるコンテキストを活用します。

将来的には、皆様のリクエストに対するより多くのコンテキストを提供するために[LakehouseIQ](https://qiita.com/taka_yayoi/items/04ed2ba57a1144b8fb5b)とのインテグレーションを追加することになります。

# Databricksアシスタントは利用可能です

[こちら](https://docs.databricks.com/ja/notebooks/notebook-assistant-faq.html#q-how-do-i-enable-databricks-assistant)の手順に従ってアシスタントを有効化してください。アカウントがない場合には、[フリートライアル](https://www.databricks.com/jp/try-databricks#account)でDatabricksをスタートしてみてください。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
DockerComposeを理解してみる②

# はじめに
おはようございます。最近LLMやworldCoinが出てきて忙しいponponnsanです。
ほんとに世界ちょっとまってほしい...

さて、今回は、
[DockerComposeを理解してみる](https://qiita.com/ponponnsan/items/f9bb76b73be1df9fce0b)の続きになります。前回の課題の解消に焦点を当てています。

参考文献は前回と同じく以下の本になります。

https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker-Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E5%B0%8F%E7%AC%A0%E5%8E%9F%E7%A8%AE%E9%AB%98/dp/4839972745/ref=asc_df_4839972745/?tag=jpgo-22&linkCode=df0&hvadid=342438969336&hvpos=&hvnetw=g&hvrand=15755161787367110001&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009306&hvtargid=pla-1125756547188&psc=1&th=1&psc=1

# ボリュームマウントとバインドマウントの違い

**ボリュームマウント**
Dockerの領域内にボリュームを作成し、コンテナにマウントする。
手軽に扱えるが、直接操作しづらい。慣れれば手軽なため、Docker社はこちらを推奨

**バインドマウント**
Dockerをインストールしたローカルのディレクトリやファイルをコンテナにマウントする。
直接ファイルを置いたり開いたりできるため、頻繁に触りたいファイルはバインドマウントの方がいい。

```docker-compose.yml

version: '3.9'

services:
  web:
    image: your_web_image:latest
    ports:
      - "80:80"
    volumes:
    # ボリュームマウント
    # ボリューム名：コンテナの記憶領域パス
      - your_volume_name:/var/www
    # バインドマウント
    # ローカルのパス：コンテナの記憶領域パス
      - /path/to/host/dir:/var/www

volumes:
  your_volume_name:

```


# ネットワークの設定

```docker-compose.yml
networks:
  # ネットワークの名前
  my_network_1:
    # このネットワークで使用するネットワークドライバの種類を指定する。
    # この場合は、Dockerのデフォルトのブリッジドライバが使用される。
    driver: bridge
    # IP Address Management (IPAM) の設定を指定する。
    # ネットワーク上のIPアドレスの割り当てと管理が可能となる。
    ipam:
      config:
        # このネットワークで使用するサブネットを指定。
        # このネットワーク上のコンテナが使用できるIPアドレス範囲を定義する。
        - subnet: 172.20.0.0/16
        # このネットワークのデフォルトゲートウェイを指定。
        # このネットワーク上のコンテナが外部ネットワークにアクセスする際のルーティングポイントとなる。
          gateway: 172.20.0.1

  my_network_2:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16
          gateway: 172.30.0.1

```
ChatGPT Function Calling で enum の配列を扱う

複数のタグがあり、ユーザーが入力した文章に関連したタグがあったら全部取得したいときがあります。そんなときに使える Function Calling のプログラムです。

```py
import json
import openai

openai.api_key = "XXXXXXXXXXXXXXX"

functions = [
    {
        "name": "make_tags",
        "description": "ユーザーのコメントからタグを選択する",
        "parameters": {
            "type": "object",
            "properties": {
                "tags": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "enum": [
                            "赤",
                            "緑",
                            "青",
                            "大",
                            "中",
                            "小",
                            "太",
                            "細",
                            "美味い",
                            "不味い",
                            "ラーメン",
                            "カレー",
                            "ピザ",
                        ],
                    }
                },
            },
            "required": ["tags"],
        },
    }
]
user_content ="朱色の小さくてほそい旨くないカレー"
response = openai.ChatCompletion.create(
    model="gpt-4-0613",
    messages=[
        {"role": "user", "content": user_content},
    ],
    functions=functions,
    function_call={"name": "make_tags"},
)
item_params = None
try:
    item_params = json.loads(response.choices[0].message.function_call.arguments)
    print("question:", user_content)
    print("result:", item_params)
except:
    print("error")
    print(response.choices[0].message.function_call.arguments)
```

```sh
question: 朱色の小さくてほそい旨くないカレー
result: {'tags': ['赤', '小', '細', '不味い', 'カレー']}
```
verticoのカーソルをかわEmacs化する

# 背景

私がEmacsを触り始めたころに[Emacsモダン化計画 -かわEmacs編-](https://qiita.com/Ladicle/items/feb5f9dce9adf89652cf)という記事を読んで色々衝撃を受けましたが、あれから[vertico](https://github.com/minad/vertico)というパッケージが登場し、補完パッケージの流れも多様になっています。
[Emacsの次世代ミニバッファ補完UI](https://blog.tomoya.dev/posts/a-new-wave-has-arrived-at-emacs/)

[Emacsモダン化計画 -かわEmacs編-](https://qiita.com/Ladicle/items/feb5f9dce9adf89652cf)ではivyの紹介・拡張をメインにしていましたが、この記事では[vertico](https://github.com/minad/vertico)でも同様の実装を行ってみます。

# [nerd-icons](https://github.com/rainstormstudio/nerd-icons.el)・[all-the-icons](https://github.com/domtronn/all-the-icons.el)のインストール

今回カーソルの設定で使用するフォントをインストールします。（[nerd-icons](https://github.com/rainstormstudio/nerd-icons.el)・[all-the-icons](https://github.com/domtronn/all-the-icons.el)のどちらかを使用します。）
各自のパッケージマネージャーでパッケージをインストールし、

```elisp
(use-package nerd-icons :ensure t)
(use-package all-the-icons :ensure t)
```

下記のコマンドでフォントをインストールします。
`M-x nerd-icons-install-fonts`
`M-x all-the-icons-install-fonts`


実際に使用できるかを確認するため、
`M-: (nerd-icons-faicon "nf-fa-hand_o_right")`
`M-: (all-the-icons-faicon "hand-o-right")`
を実行し、手のマークが表示されるか確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696232/e1a2225c-b46e-626e-8df2-fda7cf37969d.png)

# [vertico](https://github.com/minad/vertico)の設定

フォントの準備が出来たら本題の[vertico](https://github.com/minad/vertico)の設定を行います。
[vertico](https://github.com/minad/vertico)のカーソルの設定は[vertico wiki](https://github.com/minad/vertico/wiki#prefix-current-candidate-with-arrow)に記載されています。


実際の設定は下記のようになりました。

※all-the-iconsの場合は`(nerd-icons-faicon "nf-fa-hand_o_right")`を
`(all-the-icons-faicon "hand-o-right")`に置き換えてください。

```elisp
  (defvar +vertico-current-arrow t)

  (cl-defmethod vertico--format-candidate :around
    (cand prefix suffix index start &context ((and +vertico-current-arrow
                                                   (not (bound-and-true-p vertico-flat-mode)))
                                              (eql t)))
    (setq cand (cl-call-next-method cand prefix suffix index start))
    (if (bound-and-true-p vertico-grid-mode)
        (if (= vertico--index index)
            (concat (nerd-icons-faicon "nf-fa-hand_o_right") " " cand)
          (concat #("_" 0 1 (display " ")) cand))
      (if (= vertico--index index)
          (concat " " (nerd-icons-faicon "nf-fa-hand_o_right") " " cand)
        (concat "    " cand))))
```

```elisp
(vertico-mode +1)
```

私は[vertico-posframe](https://github.com/tumashu/vertico-posframe)も使用していますが、下のような見た目になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696232/2ed85286-6c91-443b-09f3-8c39e1207b12.png)

また、[nerd-icons-completion](https://github.com/rainstormstudio/nerd-icons-completion)、[all-the-icons-completion](https://github.com/iyefrat/all-the-icons-completion)を導入すると、`find-file`等で下のような見た目になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696232/ca03ed23-073e-4273-06fe-eb39f5602548.png)

# おわりに

Emacsモダン化計画 -かわEmacs編-の登場からかなり経ち、流行のパッケージが変わったり、
Emacs本体に様々な機能が追加されたりしていますが、Emacsモダン化の記事は今でも参考になります。
今後もEmacsを使いやすく、改造していき記事を共有していけるようにしていきたいです。
[サーバレス] 静的ファイルを定期自動生成してホスティング

**cron でジョブを回して生成したファイルをホストする** というようなありがちなパターンをGCPを使って**サーバレス・ほぼ無料** で実現するためのTipsをまとめます。Functions は python で記述します。

## 1. 省略手順書

- Storageダッシュボードで **バケットを作成** します
- PubSubダッシュボードで **トピックを作成** します
- Functions ダッシュボードで 上記PubSub **トピックをトリガとしたFunctionsを定義**し出力先を上記Storageのバゲット内のファイルにします
- Scheduler ダッシュボードで上記PubSubトピックに定期的にエンキューする **タイマを定義** します

公式ドキュメントのチュートリアルが参考になるかも:

https://cloud.google.com/scheduler/docs/tut-pub-sub?hl=ja

## 2. Tips

**Storageまわり**

- Webに公開するためには allUser にオブジェクト参照権限を付与してください
- デフォルトのキャッシュ設定が6時間なので同一ファイル更新する場合明示的にキャッシュコントロールが必要です。単純にはキャッシュ無効にすればいいのでしょうがケースバイケースです。以下はpythonでのFunctionsのコード例:
```python
def _upload(bucket, name, content):
    b = storage.Client().bucket(bucket).blob(name)
    b.cache_control = 'no-cache, no-store, max-age=0'
    b.upload_from_string(content)
```

**Functionsまわり**

- Storageにファイル格納するということは、Storageのクライアントアプリということになります。クライアントライブラリを含める必要があります。自動でFunctionsを実行するサービスエージェントとして認証されます（前述のスニペット）:
```requiremnt.txt
google-cloud-storage==2.*
```

**PubSubまわり**

- 作成したトピックですが、Functionsがサブスクライブしたら不要なので、メッセージ保持時間を10分程度に短くしておいたほうが安心です。とはいえ、デフォルトの7日間でも多分無料枠でいけると思います
- Functions側で設定するとサブスクライブ用のトピックが自動生成されていますが気にしなくてよいです

## 3. 費用

- Functions は月300万回まで無料だった気がするので気にする必要はありません
- Storage はアップロードを含むタイプAの操作の無料枠が月3000回とかなので、アップロードの頻度に気を付けたほうがいいでしょう
- PubSubの料金は、一般的にはかなりエグいのですがこのユースケースであればほぼ無料です
- Schedulerは月3個まで無料です

以上より、費用の大部分はネットワーク通信費となるでしょう。Storageで公開したファイルのダウンロード回数や、Functionsのロジックを回した際にWebへのアクセスする際の通信が該当するでしょう。個人や少人数のグループでつかうなら月に10円とかでしょうか？

ダウンロード数が多く費用がかかるなら GCP やめて github pages とかにするとかも考えられます。


## 4. 所感
GCPではインスタンス1個が無料なので、本稿でやったようなことはあまり不要かもしれませんが、一度作ってしまえばサーバレスでメンテフリーとなるのはうれしいかもしれません。
プログラミング初心者の野球部にif文を教えてみた

おはようございます！
今日は昨日書き切れなかったif文の概念についての記事を書いていきます。

https://qiita.com/yangyooji1946/items/a920bc02a8d93c46a845

今日はバントをするときの場面を想像しながら、if文がどのように動作するのかを説明します。
その後「バカ話ジェネレーター」内で実際に使われているコードを使って、if文がどのようにプログラム内で機能するのかを示します。

この記事を読むことで、if文の基本的な使い方と、それがプログラム内でどのように機能するのかを理解できるようになることを目指します！

### プレー中の判断はif文の連続
今回は、打席でバントをする際の判断をif文で表現してみましょう。

まず、バントをするかどうかを判断するときに大切なことは2つあります。
1つは投球がストライクなのかボールなのか、もう1つは、相手の守備陣がシフトを引いているかどうか
です。

これら2つの要素によって、バントをするかしないかを決めています。

例えば、投球がボールだったらバットを引きますし、相手がシフトを引いてきたらバスターに切り替えたりしますよね？こうやって、状況によって行動（処理）を変化させることができるのがif文です。

ちなみにif文の書き方は以下のようなイメージです。
```
if (条件式)　{
    処理内容;
};
```

これをふまえて打席でバントをする状況をJavaScript的に書いてみましょう。

```
// 必要な変数を定義
let pitch = 投球がストライクかボールか
let　defense = 相手の守備位置はどうか

// 条件によって、バントをするかしないかを判断するif文
    // もしも投球がストライクじゃなかったら
    if (pitch !== ストライク) {      
      見逃す;
    // もしも守備がバントシフトを引いてきたら
    } else if (defense === バントシフト） {　　　　　　
    　　　　バスターに切り替える;
    // そのどれでもなければ（投球がストライクで、守備位置も定位置）
    } else {　　　　　　    　　　　バントをする;
};
```

1〜3行目では変数"pitch"と"defense"を定義します。
"pitch"は投球がストライクかどうかを示し、"defense"は守備がシフトを引いているかどうかを示します。

以降の行ではバントをするための判断を行っています。
まず、投球がストライクでなければ、バッターは見逃します。これはif文で表現すると、「if(pitch !== "strike")」となります。
次に、守備がシフトを引いていたら、バッターはバスターに切り替えます。これは、「else if(defense === "shift")」と表現できます。
最後に、それ以外の場合、つまり投球がストライクで、守備がシフトを引いていなければ、バッターはバントをします。これは、「else」で表現します。

このように、if文は条件に基づいて異なるアクションを選択するための強力なツールです。次に、この概念を実際のコードに適用してみましょう。

### 「バカ話ジェネレーター」ではどのように使われていたか？
それでは、実際のコードを見てみましょう。今回はJavaScriptのコードを使います。このコードは、特定の名前を新しい名前に置き換える機能を持っています。

```javascript
if(customName.value !== '') {
  const name = customName.value;
  newStory = newStory.replace("Bob", name);
};
```

このコードの最初の行は、if文です。これは、「もしcustomName.valueが空でなければ」という条件を表しています。この条件が真であれば、つまりcustomName.valueに何か値が入っていれば、次の行が実行されます。

次の行では、新しい定数nameを定義し、その値をcustomName.valueに設定しています。これは、新しい名前を取得する部分です。

最後の行では、newStoryという文字列内の"Bob"を、先ほど取得した新しい名前で置き換えています。これは、replaceメソッドを使用しています。このメソッドは、文字列内の特定の部分を新しい部分で置き換える機能を持っています。

このコードを見ると、if文がどのように動作するかが理解できます。条件が真であれば、その後のコードが実行され、偽であれば実行されません。これは、野球のバントの例と同じですね。

### 今日のまとめ
今日学んだことをまとめてみましょう。

1. if文は、条件に基づいて異なるアクションを選択するためのツールです。
2. if文は、条件が真であればその後のコードを実行し、偽であれば実行しません。
3. JavaScriptのreplaceメソッドを使って、文字列内の特定の部分を新しい部分で置き換えることができます。

これで、if文の基本的な使い方と、それがプログラム内でどのように機能するのかを理解できたと思います。

もし記事が役立ったと思ったら、ぜひいいねやフォローをお願いします。これからも、プログラミング初心者の皆さんが理解しやすいような記事を書いていきますので、お楽しみに！
laravel 特定のテストが急に通らなくなった

# 概要

- 今まで通常通り通っていたPHPUnitのテストが急に落ちるようになってしまった。具体的にはそれぞれ得たいレスポンスが異なるのにすべて同じ500エラーを返している。久々に盛大に詰まったので簡単に脱出経路をまとめておく。

# 情報

- 環境：ローカル開発環境（Docker）
- ホストPC：Mac

# 発端

- 今まで通りtests直下のすべてのFeature/Unitテストを実行しようと思い下記コマンドを実行した。

    ```shell
    docker-compose exec api php artisan test --env=testing
    ```

- 一部のFeature/Unitテストは問題なく通過するが、ほとんどのテストメソッドで軒並み500が帰ってきて失敗している。
- Featureテストのテストコードでレスポンスを`dd()`して確認したところ下記のようなエラーが帰ってきていた。

    ```shell
    fileperms(): stat failed for /app/storage/framework/cache/data/ec/c4
    ```

- おそらくc4というファイルかディレクトリをlaravelのキャッシュドライバが設置しようとしてエラーになっているっぽい。
- 場所的にstorage直下なので十中八九権限周りのエラーだと思われる。
- laravelのコードが設置されているapiコンテナに入り、下記コマンドを実行して、ファイルオーナーの変更と書き込み権限の付与を行った。コマンドはappとかstorageなどのlaravelのプロジェクトディレクトリで実行した。

    ```shell
    chown -R www-data:www-data storage
    chmod -R 775 storage
    ```

- もう一度テストを実行したが、似たような下記のエラーが発生した。問題が解決しない。

    ```shell
    fileperms(): stat failed for /app/storage/framework/cache/data/c0/ec
    ```

- キャッシュ側もオーナーと権限を変更してみた。

    ```shell
    chown -R www-data:www-data storage bootstrap/cache
    chmod -R 775 storage bootstrap/cache
    ```

- 上記を実行しても問題が解決しない。
- GithubActionsを使ってテストをしてみたが、逆にActionsではエラーは出ず問題なくテストが通った。
- 一旦環境構築をし直そうとおもい、コンテナの停止、コンテナの削除、コンテナイメージの削除を行った。
- その後、ホストPC内部のプロジェクトファイルを削除しようとしたところ`プロジェクト/app`が権限エラーで削除できない旨のエラーが出た。
- sudoコマンドを用いて強引にホストPCからローカルリポジトリ毎コードを削除した。
- 再度コードを取得して環境構築を行ったが問題は特に解消しなかった。
- 一旦コンテナを停止し、ダメ元でホストPCで下記コマンドを実行した。ホストPC側でlaravelのプロジェクトホームディレクトリで下記コマンドを実行した。

    ```shell
    sudo chown -R $USER:$USER ./storage
    sudo chmod -R 777 ./storage
    ```

- 問題が解決した。

# 原因

- ホストPC側のディレクトリ権限が悪かった。
- ホストPCにあるコードをDockerコンテナの中にマウントしている状態になっている。この場合、Dockerコンテナ内のlinuxのユーザーはホストPCからみて「その他のユーザー」に当たる。そのため777に設定し、最後の7で「その他のユーザー」に対して実行、書き込み、読み込みを許可してあげる必要がある。
NPMコマンド実践ガイド：パッケージを熟知し、プロジェクトを最新に保つ


## 目次

1. [はじめに](#はじめに)
2. [npm docsコマンド](#npm-docsコマンド)
3. [npm repoコマンド](#npm-repoコマンド)
4. [npm outdatedコマンド](#npm-outdatedコマンド)
5. [npm vコマンド](#npm-vコマンド)
6. [まとめ](#まとめ)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203247/6aee7ca7-14a3-356d-36fd-79f662d3a4c1.png)



## 1. はじめに

Node.jsの開発者にとって、npmは欠かせないツールです。しかし、npmにはたくさんのコマンドがあり、それぞれのコマンドの機能を完全に把握している人は少ないかもしれません。この記事では、いくつかのnpmコマンドについて解説し、それぞれのコマンドが開発者の生産性をどのように向上させるかを明らかにします。

---

## 2. npm docsコマンド

npm docsコマンドは、指定したパッケージの公式ドキュメンテーションをブラウザで開くためのコマンドです。例えば、以下のコマンドを実行すると、Express.jsの公式ドキュメンテーションが開きます。

```
npm docs express
```

このコマンドは、新しいパッケージを学ぶ際や、既存のパッケージの使い方を確認したいときに非常に便利です。

---

## 3. npm repoコマンド

npm repoコマンドは、指定したパッケージのリポジトリ（多くの場合、GitHub）をブラウザで開くためのコマンドです。以下のコマンドを実行すると、LodashのGitHubリポジトリが開きます。

```
npm repo lodash
```

このコマンドは、パッケージのソースコードを参照したい場合や、問題を報告したい場合に役立ちます。

---

## 4. npm outdatedコマンド

npm outdatedコマンドは、プロジェクト内の全ての依存パッケージの中で、アップデートが必要なものを表示するためのコマンドです。以下のコマンドを実行すると、各パッケージの現在のバージョン、最新バージョン、そしてそのパッケージがどこで指定されているか（依存関係）が表示されます。

```
npm outdated
```

このコマンドは、プロジェクトを最新の状態に保つために定期的に実行すると良いでしょう。

---

## 5. npm vコマンド

npm vコマンドは、指定したパッケージの詳細な情報を表示するためのコマンドです。以下のコマンドを実行すると、Reactのすべての公開バージョンが表示されます。

```
npm v react versions
```

また、パッケージの詳細な情報を見たい場合は、以下のようにコマンドを実行します。

```
npm v mongoose
```

このコマンドは、パッケージの説明、バージョン履歴、リポジトリのURL、ライセンス情報、依存関係などが表示されます。新しいパッケージを選ぶ際や、既存のパッケージの詳細情報を調べる際に役立ちます。

---

## 6. まとめ

この記事では、npmのいくつかの便利なコマンドを紹介しました。これらのコマンドを使うことで、パッケージのドキュメンテーションやリポジトリを簡単に開くことができ、また、プロジェクトの依存パッケージが最新の状態に保たれることを確認することができます。

npmは強力なツールであり、その機能をフルに活用することで、開発者の生産性を大幅に向上させることができます。
退職金ない会社ってヤバイの？正社員300人に聞いたアンケート結果

長年働いているのに賃金が上がらない、低収入で老後が心配、さらに退職金も出ない？

日本の退職金事情について正社員300人に聞いたアンケート結果と退職金がない会社はヤバイのかについてまとめましたのでぜひご覧ください。

https://wailog.net/no-retirement-benefits/
「npm audit」でJavaScriptプロジェクトのセキュリティをチェックしよう！


## 目次

1. [はじめに](#はじめに)
2. [npm auditとは](#npm-auditとは)
3. [npm auditの使い方](#npm-auditの使い方)
4. [npm auditの詳細](#npm-auditの詳細)
5. [npm auditで脆弱性を修正する](#npm-auditで脆弱性を修正する)
6. [まとめ](#まとめ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203247/1082881a-90dc-9bc0-a702-827e56216924.png)


## はじめに

こんにちは、皆さん。今日はJavaScriptプロジェクトのセキュリティチェックについて解説します。JavaScriptのプロジェクトを管理するために、Node Package Manager（npm）を使っている人は多いと思います。npmには便利なセキュリティチェック機能があります。それが「npm audit」です。

## npm auditとは

「npm audit」はnpmのコマンドの一部で、JavaScriptプロジェクトで使用されている依存関係に対するセキュリティ脆弱性をチェックするために使用されます。

## npm auditの使い方

npm auditの使い方は簡単です。まずはプロジェクトのルートディレクトリに移動します。

```bash
cd /path/to/your/project
```

そして、以下のコマンドを実行します。

```bash
npm audit
```

これだけで、プロジェクトの依存関係に対するセキュリティ脆弱性がスキャンされ、問題が検出されるとそれについての詳細なレポートが表示されます。

## npm auditの詳細

「npm audit」のレポートには、以下の情報が含まれています。

- セキュリティ脆弱性のレベル（低、中、高）
- 脆弱性の詳細
- 影響を受けるパッケージ
- 修正方法（可能な場合）

## npm auditで脆弱性を修正する

「npm audit」が脆弱性を検出した場合、それを解決するための推奨される手順がレポートに記載されています。

例えば、「express」パッケージに中程度の脆弱性があると表示された場合、以下のようなレポートが表示されます。

```bash
=== npm audit security report ===                        
                                                                                 
# Run  npm update express --depth 1  to resolve 1 vulnerability
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Path Traversal                                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ express                                                       │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ express                                                       │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ express                                                       │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://npmjs.com/advisories/XYZ                              │
└───────────────┴──────────────────────────────────────────────────────────────┘
```

このレポートは、「express」パッケージに中程度の脆弱性（パストラバーサル）が存在し、それを修正するためにはパッケージをアップデートする必要があることを示しています。

それに対応するためには、次のコマンドを実行します。

```bash
npm update express --depth 1
```

これにより、express パッケージが最新バージョンに更新され、脆弱性が修正されます。

## まとめ

「npm audit」は、JavaScriptプロジェクトのセキュリティ脆弱性をチェックし、修正するための強力なツールです。定期的に「npm audit」を実行して、プロジェクトの脆弱性をチェックしましょう。セキュリティは重要な要素なので、これを怠ると大きな問題につながる可能性があります。

この記事が皆さんのプロジェクトに役立つことを願っています。ありがとうございました！
JAVA練習＿01


初めまして

現在都内でITエンジニアとして働いている者です。

ITエンジニアとしてキャリアをスタートして現在9か月程です。
この記事ではこれからJAVAを触り始めましたので自身の勉強したことや感想を書いていきます。
まだ始めたばかりでこんなこともわからないのかと思うかもしれませんが見ていただきましたら勉強方法など教えていただけると嬉しいです。

目次

・JDKのインストール
・OpenJDKのインストール
・PATHの設定及び環境変数JAVA_HOMEの設定




JDKのインストール

まず最初にJAVAアプリケーションを開発するうえで必要となるJava SE Development Kit (JDK)のダウンロード、インストールから始めました。
今回は参考にしたサイトに記載されていたoracle社が提供しているOpenJDKをダウンロード、インストールしました。

参考：
以下のサイトで勉強しました。
タイトル「JAVA入門」
https://www.javadrive.jp/start/

以下のURLからダウンロードしました。
・http://jdk.java.net/
![スクリーンショット 2023-07-31 215653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/5140ac25-d170-7ef3-203c-4dfc98d33bf3.png)

「すぐに使用できる: JDK 20、JDK 19、JavaFX 20、JMC 8」の「JDK 19」をクリックして
Windows10 向けのものをダウンロードします。「Windows/x64」と書かれた右側にある「zip」をクリックすることでダウンロードが開始されます。

![スクリーンショット 2023-07-31 220306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/353932b8-02af-e6dd-fd8f-77c311925d75.png)

任意の場所に保存します。これでOpenJDK のダウンロードは完了です。

OpenJDKのインストール

ダウンロードしたファイル openjdk-19.0.2_windows-x64_bin.zip は圧縮ファイルになっています。解凍すると「jdk-19.0.2」というフォルダが入っていますので任意の場所に展開します。

感想
頂いた資料のおかげでここまではスムーズに進むことができました。
まだまだ分からない事だらけですのでこれからも頑張ります。

PATHの設定及び環境変数JAVA_HOMEの設定

Javaを使ったプログラムのコンパイルや実行するために必要なファイルが設置されたディレクトリへPATHを設定する
環境変数を設定するにはデスクトップ左下のスタートメニューをクリックし「コントロールパネル」と入力すると表示されます。
![スクリーンショット 2023-07-31 223449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/989b0285-beb2-3ac0-b7c3-d8cb36d8d229.png)

コントロールパネルをクリックし「システムとセキュリティ」をクリックします。![スクリーンショット 2023-07-31 223851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/8298b478-5f60-a4fa-6aa4-46a59549d28f.png)

システムをクリックします。
![スクリーンショット 2023-07-31 224503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/0171af04-151d-2e78-fa7f-69070a5b2a21.png)

システムの詳細をクリックします。
![スクリーンショット 2023-07-31 224739.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/177ee682-6dce-aa5f-6858-ab4637f7e220.png)

システムのプロパティが表示されるので詳細設定タブの環境変数ボタンをクリックします。
![スクリーンショット 2023-07-31 224831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/58ca298f-a65b-83b4-9b4a-5c8835f71917.png)

環境変数ウィンドウが表示されるので新規ボタンを押し新しいシステム変数画面が表示されるので変数値にJDKをインストールしたディレクトリを入力し変数名にJAVA_HOMEと入力します。
![スクリーンショット 2023-07-31 225500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/caa78568-cbf9-3161-a6f6-649ebeda998c.png)

![スクリーンショット 2023-07-31 225917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523674/2565044f-0094-04f2-e1bd-cfa829d8ba0f.png)

これでいったん終了とさせていただきます。
続きはまた次回の記事に記載させていただければと思います。

感想

今回行った作業ですが自分としては初めての事ばかりでしたので大変かつ時間がかかってしまいました。
環境変数の設定をするのは初めてで意味を調べながら作業をし理解を深めながら進めるJAVAの作業はとても楽しかったです。
マイクラはJAVAを使っていろいろいじれると聞いたのでこのままJAVAの勉強を進めていきマイクラで遊んだりJAVAを使っていろいろなものを製作していきたいと考えています。
またoracle data baseも少し勉強していたので、データベースに触れたりSQLも扱えるようになっていきたいと考えています。
HTML/CSSにおける画像のリサイズモードをマスターする





こんにちは、今日はHTMLとCSSで画像をリサイズする方法について解説します。`object-fit`プロパティを使うことで画像を自由自在にコントロールすることができます。この記事では、その使い方と覚え方を紹介します。

## 目次
1. [はじめに](#introduction)
2. [`object-fit` プロパティとは？](#object-fit)
3. [`object-fit` の値とその意味](#object-fit-values)
4. [`object-fit` の使い方](#object-fit-usage)
5. [まとめ](#summary)

---

<a name="introduction"></a>
## 1. はじめに

HTMLでは、画像のサイズは通常 `<img>` タグの `width` と `height` 属性を使用して指定します。ただし、CSSを使用してより高度なリサイズ操作を行うこともできます。そのためには、CSSの `object-fit` プロパティを使用します。

---

<a name="object-fit"></a>
## 2. `object-fit` プロパティとは？

`object-fit` プロパティは、画像などの置換要素の内容を、指定した幅と高さにどのようにフィットさせるかを制御します。このプロパティには5つの値があります。

---

<a name="object-fit-values"></a>
## 3. `object-fit` の値とその意味

それぞれの `object-fit` の値とその意味を下記に示します。

- `fill`: 要素の内容が指定したサイズにフィットするように伸縮します。元のアスペクト比は保持されません。
- `contain`: 要素の内容が指定したサイズに収まるように縮小または拡大します。元のアスペクト比が保持されます。
- `cover`: 要素の内容が指定したサイズを覆うように縮小または拡大します。元のアスペクト比が保持されますが、一部の内容がトリミングされる可能性があります。
- `none`: 要素の内容はリサイズされず、元のサイズがそのまま使用されます。
- `scale-down`: `none` または `contain` のうち、小さいほうの振る舞いが適用されます。

---

<a name="object-fit-usage"></a>
## 4. `object-fit` の使い方

それでは、それぞれの `object-fit` の値を使って画像をリサイズする方法を見てみましょう。

### `fill`

```html
<img src="image.jpg" style="object-fit: fill; width: 300px; height: 200px;">
```

### `contain`

```html
<img src="image.jpg" style="object-fit: contain; width: 300px; height: 200px;">
```

### `cover`

```html
<img src="image.jpg" style="object-fit: cover; width: 300px; height: 200px;">
```

### `none`

```html
<img src="image.jpg" style="object-fit: none; width: 300px; height: 200px;">
```

### `scale-down`

```html
<img src="image.jpg" style="object-fit: scale-down; width: 300px; height: 200px;">
```

---

<a name="summary"></a>
## 5. まとめ

このように、HTMLとCSSを使用して画像を簡単にリサイズすることができます。`object-fit` プロパティを使うことで、必要に応じて画像のリサイズ方法を選択できます。

それぞれの `object-fit` の値がどのように動作するかを覚えておくと、あなたのWebページに最適な画像のリサイズ方法を選択できます。それでは、Happy Coding!

---

以上です。この記事が役立つことを願っています。もし質問があれば、コメントでお知らせください。そして、この記事が役に立ったと思われたら、いいねをお願いします！
Arduino UNOと秋月カラー液晶ST7789V2(SPI)で遊ぶ (「46」よろーを表示)ATM0130B3


Arduino UNOと秋月カラー液晶ST7789V3(SPI)で遊ぶ (「46」よろーを表示)ATM0130B3


https://qiita.com/caa45040/items/f2a5dcd8e8b6b4ace141


x Adafruit ST7735 Driver Library for Arduino を　インストール
x Adafruit GFX Library を　インストール

目的
カラー液晶のテスト


![o_cop635.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/11b7d73c-30e3-deba-1c51-c8dead46539d.jpeg)

![o_cop636.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5ef70134-9b40-a215-6cbe-435d62a61839.jpeg)



プログラム


```c++



//spi_st7789_NUM_TEST1_uno_1


//ヘッダーファイル
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>


//定義
#define TFT_CS        10
#define TFT_RST        9 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         8
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);


//初期化
void setup() {

  //240x240の液晶を使用する。
  tft.init(240, 240);           // Init ST7789 240x240

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  tft.fillScreen(ST77XX_BLACK);

  // テキストサイズを設定
  tft.setTextSize(5);
  // テキスト色を設定
  tft.setTextColor(ST77XX_WHITE);
  // テキストの開始位置を設定
  tft.setCursor(0, 10);


  //46を設定
  int tempval = 46;

  //表示変換する
  char str1[3];
  str1[0] = '0' + (tempval/10);
  str1[1] = '0' + (tempval%10);
  str1[2] = 0;


  // 1行目に数字を表示
  tft.println(str1);


  delay(1000); //1秒待つ

}//loop



```
【JAVA・学習ログ②】「式」「型変換」「命令実行文」について

<br>第２回教本に沿ってやってみたシリーズ

≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ
## ■「式」
計算処理をコンピューターに行わせる文を「式」という。
式は"オペランド"と"演算子"のみで構成される。
![スクリーンショット 2023-08-02 002333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/3f018352-7655-6817-6e50-0e1e97ea300f.png)

 ＊リテラル
　"オペランド"の中でソースコードに記述される具体的な値。画中だと「12」「6」。
　リテラルはそれぞれ適したデータ型を持っており、「12」や「6」などの小数点のない整数は『int型』に属す。

＊エスケープシーケンス
　「"」「'」などの引用符記号、¥、改行を記述する際に用いられる特殊な文字。
　上記記号を画面に表示したい場合に用いる。

　　▽　表示したい文字列
![スクリーンショット2023-08-02 020143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/9b7d8a69-3414-cb2b-393a-d809bd7d667c.png)
　　▽　ソースコード
![スクリーンショット 2023-08-02 020258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/443399b6-c0e6-a40a-c3dd-98561af82f58.png)

＊評価
　Javaが計算処理すること。評価はJava内の優先順位に則って行われる。
　ざっくり⇒ + < * < ()
　同優先順位の演算子には『結合規則』が適用される。+は左にあるものから右に、=は逆といった具合。

## ■各演算子テスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/c028e926-6880-2279-9339-165da92dbd0b.png)
【実行】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/090e7442-979f-81af-cdc3-dad0ff3510e8.png)


## ■自動型変換
原則、型に代入できる値は限定されているが、「小さな型」の値を「大きな型」に代入する場合に限り、値が自動的に箱の型に変換される。
　　（ざっくり）整数型　<<< 浮動小数点型

＊キャスト演算子
「大きな型」を「小さな型」の変数に代入する強制的な指示。但し、<font color=red>元のデータの一部を失う恐れがある</font>ため使用には注意が必要。
![スクリーンショット 2023-08-03 034242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/526951b6-3c58-2520-57d8-21a8641481f0.png)
＊演算時の自動型変換
大きな型に統一される。
![スクリーンショット 2023-08-03 035517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/b919d504-ceb2-a43e-ebc1-9efecab64da2.png)

## ■命令実行の文一例
![スクリーンショット 2023-08-03 043002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/546226d3-731c-8e09-9071-f0aaaf333ab7.png)【実行】
![スクリーンショット 2023-08-03 043012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/9347d732-6551-16ac-1f43-cd4386e6d9cc.png)

※補足１　文字列⇒new java.util.Scanner(System.in).nextLine();
　　　　　数値　⇒new java.util.Scanner(System.in).nextInt();

※補足２　キーボード入力コマンドの実行結果、別の機会に試してみて初めて下に入力スペースあることに気づきました。そういうこと？？？
　　　　　スクショ内のコードは未テストのものです。
<br>
以上、雑備忘録。（楽しくなってまいりました。）
Pythonにおけるクラス変数とインスタンス変数、およびDataclass

# 概要

Pythonのクラスでは、全てのインスタンスで共有される「クラス変数」、各インスタンスごとに独立に持つ「インスタンス変数」の2種類の変数があります。さらにPython 3.7からは`@dataclass`デコレータが追加され、インスタンス変数を自動で設定する便利な機能が提供されています。

## クラス変数

クラス変数はクラス定義内で直接作成され、そのクラスの全てのインスタンス間で共有されます。これは、クラス全体での状態を保持する必要がある場合や、全てのインスタンスで共通の値を持つ必要がある場合に便利です。

```python
class MyClass:
    instance_count = 0  # クラス変数: 全てのインスタンスで共有

    def __init__(self):
        MyClass.instance_count += 1

a = MyClass()
b = MyClass()

print(MyClass.instance_count)  # 出力は 2
```

この例では、`instance_count`クラス変数を使用して、`MyClass`のインスタンスが作成された回数を追跡します。

## インスタンス変数

一方、インスタンス変数は各インスタンスごとに独立しています。これらは通常、インスタンスの初期化時（`__init__`メソッド内）に設定されます。インスタンス変数は、各インスタンスが独自の状態を持つ必要がある場合に使用されます。

```python
class MyClass:
    def __init__(self, name):
        self.name = name  # インスタンス変数: 各インスタンスごとに異なる値を持つ

a = MyClass("Alice")
b = MyClass("Bob")

print(a.name)  # 出力は "Alice"
print(b.name)  # 出力は "Bob"
```

この例では、各`MyClass`インスタンスは独自の`name`インスタンス変数を持ちます。

## Dataclass

Python 3.7からは、`@dataclass`デコレータが導入されました。このデコレータを使用すると、自動的に特殊メソッド（`__init__`、`__repr__`など）を生成し、クラスの作成を効率化することができます。`@dataclass`は、インスタンス変数を自動的に設定します。

```python
from dataclasses import dataclass

@dataclass
class MyClass:
    name: str

a = MyClass("Alice")
b = MyClass("Bob")

print(a.name)  # 出力は "Alice"
print(b.name)  # 出力は "Bob"
```

この例では、`name`はインスタンス変数として自動的に設定され、`MyClass`は`__init__`や`__repr__`を自動的に生成します。

より詳細な情報はPythonの公式ドキュメントの[クラスの章](https://docs.python.org/3/tutorial/classes.html)と[dataclassesの章](https://docs.python.org/3/library/dataclasses.html)を参照してください。
ReactiveCollectionの全変更を一括監視する拡張メソッド

ReactiveCollectionを使ってると、
「うーん今回はObserveAddとObserveRemoveだけでいいかな？」
「それともObserveRemoveも入れたほうがいいかな？」
みたいなことで毎回ビミョーに悩んだりして無駄な思考を要してしまうので、
「いっそのこと最初から全部監視すればいいじゃん」
と思い立って作りました。

一応、大量のObserveが発動するのでその点ご留意ください（無視できるレベルだと思いますが）


```cs
	public static class UniRxExtension
	{
		/// <summary>
		/// ReactiveCollectionのあらゆる変更を監視して、1フレームに1回のみ通知する
		/// </summary>
		public static IObservable<Unit> ObserveAll<T>(
			this IReadOnlyReactiveCollection<T> source)
		{
			return Observable.Merge(
					source.ObserveCountChanged().AsUnitObservable(),
					source.ObserveAdd().AsUnitObservable(),
					source.ObserveRemove().AsUnitObservable(),
					source.ObserveReplace().AsUnitObservable(),
					source.ObserveMove().AsUnitObservable(),
					source.ObserveReset().AsUnitObservable())
				.BatchFrame();
		}
	}
```

↓ 使い方。返り値が```IObservable<Unit>```であることにご注意ください。
```cs
SomeReactiveColelctionInstance
	.ObserveAll()
	.Subscribe(_ => SomeMethod())
	.AddTo(this);
```
【Unity】ボタンを押下して別のシーンに画面遷移する方法

# どんな場面で使える？
- タイトル画面で「スタート」ボタンを押下してメインゲームのシーンに遷移したい時
- アクションゲームなどでリザルト画面を出した後「完了」ボタンを押下して別のシーンに遷移したい時
- などなど

# 実際の実装方法

## <font color="Red">①C#スクリプトを作成し、コードを追記</font>

- C#スクリプトは「アセット＞作成＞C#スクリプト」から作成可能
![スクリーンショット 2023-08-02 23.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525124/772af44e-e8cb-600f-edbf-4578a0a8c23d.png)
- 以下のコードを追記
~~~C#:qiita.dll
using UnityEngine.SceneManagement;
~~~
~~~C#:qiita.dll
public void SwitchScene()
    {
        SceneManager.LoadScene("遷移先のシーン名", LoadSceneMode.Single);
    }
~~~

- 実際のスクリプトはこんな感じ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525124/c0d6683f-9ad4-a356-dd38-35d0af78e903.png)

## <font color="DodgerBlue">②Buttonのコンポーネントに、①で作成したC#スクリプトを追加</font>
## <font color="DarkOrange">③Button＞Buttonコンポーネント＞クリック時()に動作を追加</font>

- 動作の設定は以下の通り
    - Runtime
    - ②のスクリプト
    - Button
        - ヒエラルキーから直接Drag＆Drop可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525124/5ec39160-5d49-8075-6161-01ee3011f8ae.png)

# あとがき
- 「タイトル画面をUnityで作る方法」みたいな記事はたくさんありますが、この部分だけ抽出している記事を見つけ出せず、今後また開発するときに逐一調べるのだるいなと思いました
- というわけで作ってみました
- 何気に初Qiita記事です
- 今後もゲーム制作に関するナレッジを共有していきたいと思います
【Laravel】定数を扱うなら専用のクラスを使おう

## はじめに
laravelで定数を扱う方法は多々ありますが、この記事ではクラスを使用した方法を解説します。

## マジックナンバーについて
まず、開発をする上で注意すべきことに``マジックナンバー``というものがあります。

マジックナンバーというのは、``それが何を示しているかがわからない文字列や数値``のことです。

> プログラムにおけるマジックナンバー（英: magic number、魔法の数字）とは、何らかの識別子もしくは定数として用いられる、プログラムのソースコード中に書かれた具体的な数値である。そのプログラムを書いた時点では製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバーの意図を忘れたときに閲覧すると「この数字の意味はわからないが、とにかくプログラムは正しく動く。まるで魔法の数字だ」という皮肉を含む。

https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)

コードで解説をすると、
```php
<?php

class Order
{
    public function method($orderStatus)
    {
        if ($orderStatus === 1) {
            // 処理
        }
        if ($orderStatus === 2) {
            // 処理
        }
    }
}
```
上記のコードを見ると``1``や``2``は何を示しているのかがわからないと思います。

この値の意味を理解するにはコードを書いた本人に聞くしかありません。

**マジックナンバーのデメリット**
- **チームメンバーや自分が値の意味を理解するのに時間がかかる**
- **値を変更したい場合に複数箇所の修正が必要になることがある**

## 専用のConstクラスファイルを作成する
マジックナンバーを解決するためには色々な方法がありますが、おすすめな方法として``専用のConstクラスファイルを作成``するという方法です。

まずは、appディレクトリにConstsディレクトリを作成し、その中にOrderStatusConsts.php(わかりやすく命名)を作成します。
```app/Consts/OrderStatusConst.php
<?php

namespace App\Consts;

class OrderStatusConsts
{
    public const STATUS_CANCEL = 1;
    public const STATUS_SENT = 2;
}
```

次にモデルやコントローラーで呼び出すときの記述を簡潔にするために、config/app.phpにエイリアスを定義しておきます。

```config/app.php
<?php

return [
    'aliases' => [
        'OrderStatusConsts' => App\Consts\OrderStatusConsts::class,
    ],
];
```

実際に呼び出します。

```php
<?php

class Order
{
    public function method($orderStatus)
    {
        if ($orderStatus === \OrderStatusConsts::STATUS_CANCEL) {
            // 処理
        }
        if ($orderStatus === \OrderStatusConsts::STATUS_SENT) {
            // 処理
        }
    }
}
```
このように定義することで、マジックナンバーを解決することができ可読性や保守性が上がります。

## 最後に
定数を扱う方法は他にも、``configファイルを作成する``方法や``Modelクラスファイルに定数を記述する``方法などがありますが、個人やチームでやり方は違うと思うのでこの記事は参考程度に、、、、
Håstad's broadcast attack

# はじめに
はじめまして高校二年のもちもちと言います。
自分はセキュリティキャンプ全国大会'21の暗号のゼミの修了生で、またSECCON BEGINNERS(ctf4b)ではcrypto(暗号)の作問をしています。
ここではRSAの問題でたびたび見られる、同じm,e、異なるnを用いた暗号文e個を用いることでmを復元することができるHåstad's broadcast attackの話をしていきます。
モチベーションとしては中国剰余定理でがっちゃんこしたらLow public exponent attackと同じ感じになるよねって話
# 0. 中国剰余定理

$m_1​,m_2​,…,m_n​$ をそれぞれ互いに素な整数とする。このとき、
```math
\begin{align*}
x &\equiv a_1 \mod m_1 \\
x &\equiv a_2 \mod m_2 \\
&\vdots \\
x &\equiv a_n \mod m_n \\
\end{align*}
```
を満たす$x∈Z$が$mod\ M=m_1m_2...m_n$においてただ一つ存在する

証明
$M/m_i,m_i$​ は互いに素であるから、$M/m_is_i+m_is_i′​=1$ となる $s_i,s_i′∈Z$ が存在する。
$x=∑a_iM/m_is_i$​ とする。$i \neq j$なら $M/m_j≡0(mod\ m_i)$ なので、
$x≡a_iM/m_is_i=a_i(1−m_is_i′)≡a_i\ mod\ m_i$
より、存在性は示せた。
また$x,y$が共に条件をみたしている時、
```math
x−y≡a_i−a_i≡0\ mod\ m_i
```
よりx≡yなので一意性についても証明ができた。
# 1. アルゴリズム
```math
\begin{align*}
C_1 &\equiv M^e \mod N_1 \\
C_2 &\equiv M^e \mod N_2 \\
&\vdots \\
C_e &\equiv M^e \mod N_e \\
\end{align*}
```
が与えられたとき中国剰余定理より
```math
\begin{align*}
x &\equiv C_1 \mod N_1 \\
x &\equiv C_2 \mod N_2 \\
&\vdots \\
x &\equiv C_e \mod N_e \\
\end{align*}
```
を満たす$x$が$mod\ N=N_1N_2...N_e$でただ一つ存在する。
これらより、$x \equiv M^e\ mod\ N$となり、また$M<N_i$より$M^e<N$なので
```math
M= \sqrt[e]{x}
```
となる。
# 2. 実装
```py
import gmpy2
from Crypto.Util.number import long_to_bytes
from itertools import combinations

import sys

sys.setrecursionlimit(10000)


def extgcd(a, b):
    if b == 0:
        return 1, 0, a
    else:
        x, y, g = extgcd(b, a % b)
        return y, x - (a // b) * y, g


def CRT(pairs):
    M = 1
    for a, m in pairs:
        M *= m
    result = 0
    for a, m in pairs:
        Mi = M // m
        s, _, _ = extgcd(Mi, m)
        result += a * Mi * s
    return result % M


def HBR(e, pairs):
    try:
        r = CRT(pairs)
        return gmpy2.iroot(r, e)
    except Exception as error:
        print(f"An error occurred: {error}")
        return None, False


n_values = []
c_values = []
e = 3
for combo in combinations(range(len(n_values)), 3):
    pairs = [(c_values[i], n_values[i]) for i in combo]
    flag, exact = HBR(3, pairs)
    if flag is not None and exact:
        print(long_to_bytes(int(flag)))

```
参考

https://en.wikipedia.org/wiki/Coppersmith%27s_attack