OmniAICreator/Qiita-1.07M huggingface dataset:
xamppを使用してlocal環境に自分の好きなサブドメインでアクセスする

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はxamppの設定についてです。

# xamppインストール

まずxamppを以下のサイトでwindows版をダウンロードします。

https://www.apachefriends.org/jp/index.html

インストール出来たら、[xampp]を右クリック ⇒　[XAMPP control Panel]を右クリック　⇒　[管理者として実行]をクリックします。

管理パネルが立ち上がったら、ApacheとMySQLをインストールします。
ApacheとMySQLと書いてある右のバツボタンをクリックするとインストールすることができます。

インストールが完了したら、ApacheとMySQLを起動させます。

ApacheとMySQLの右横にある[Start]と書いてあるボタンを押せば起動できます。[Start]が[Stop]に変われば起動できています。

インストールが完了したら、`C:\xampp\htdocs\`フォルダ配下に`keitamax`フォルダを作成し、その配下にindex.htmlファイルを作成してみます。

```html:index.html
<!DOCTYPE html>
<html>
    <body>
        <p>こんにちは</p>
    </body>
</html>
```

この状態で、http://localhost/keitamax/index.htmlにChromeなどのブラウザでアクセスすると「こんにちは」と表示されるようになります。

# localhostでなく自分の好きなサブドメイン（keitamax.localhost）でアクセスする

次にlocalhostではなく、自分の好きなドメインでアクセスできるようにします。

まず、以下のファイルを修正します。
普通に選択してもファイルの中身を修正できないのでメモ帳をつかって修正してください。
`C:\Windows\System32\drivers\etc\hosts`

以下を追記してください。
```
127.0.0.1 keitamax.localhost
```

次に、`C:\xampp\apache\conf\extra\httpd-vhosts.conf`ファイルを修正します。
`httpd-vhosts.conf`を開いて、ファイルの一番下に以下のように記述してください。

```conf
<VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs/keitamax"
    ServerName keitamax.localhost
</VirtualHost>
```

最後に、[XAMPP control Panel]にもどりApacheとMySQLを再起動させ、以下のURLでアクセスをします。

```
http://keitamax.localhost/index.html
```



すると、こんにちはという画面が見れると思います。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
簡単なリモコン装置

# amazonで簡単なリモコン(?)を見つけた。
モデル：AK-RK01S

![IMG_5017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719435/7545867c-fd81-55ab-d7bc-d708e72e987b.jpeg)

# ESP32 _Relay X1_V1_V1.2 とダイソーのBTシャッターとプラグラムより簡単に使える。
![IMG_5018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719435/bde85275-f260-5253-0479-0ecaec95d171.jpeg)

# スマートキャッチャーという、コバエ取り装置をリモコンでON、OFFさせた。
電源を取って、NO(ノーマルオープン)とCOMにつなげるだけで簡単だ。
![IMG_5019.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719435/fe9a84ac-1195-753f-8175-ab19f9053bc3.jpeg)

# 天井から電源を取り、直接スマートキャッチャーにつなげていたため、ONとOFFができなかった。
常時ONで使っていたため、風切音が大きいときもある。
冬場は、コバエはいないため、OFFしたかったが、脚立を出して、天井の電源からコンセントを抜くのが面倒だったため、困っていた。
![IMG_5020.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719435/00a46cc8-2d70-d213-219f-01376fd3e114.jpeg)

スマートキャッチャーがDC12Vで、AK-RK01SYUもDC12Vで動作するため、簡単に設置でき、ONとOFFが可能になった。

## 安くて簡単なリモコンであるため、非常に便利。
## ただし、DC12Vしか対応してないため、使用範囲は限られる。
【Android／Java】Linuxコマンドを実行

## やりたいこと
端末の温度やIPアドレスなど、Androidフレームワークから取得するより、Linuxカーネル上から取得したほうが、簡単な場合がある。
AndroidからLinuxコマンドを実行するやり方を、備忘録として残しておく

## Step1．Linuxコマンドの実行メソッド
Linuxコマンドを実行するメソッドを用意する

~~~java
public void commandExecution(String command) {
    Process process = null;
    BufferedWriter writer = null;
    BufferedReader reader = null;
    StringBuilder result = new StringBuilder();

    try {
        String processInfo;
        writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
        reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        // コマンド実行
        String cmd = command + "\n";
        process = Runtime.getRuntime().exec(cmd);
        writer.write("exit \n");
        writer.flush();
        process.waitFor();

        // コマンド結果
        while ((processInfo = reader.readLine()) != null) {
            result.append(processInfo).append("\n");
        }
    } catch (Exception e) {
    } finally {
        try {
            if (null != writer) {
                writer.close();
            }
            if (null != reader) {
                reader.close();
            }
            if (null != process) {
                process.destroy();
            }
        } catch (Exception e) {
        }
    }
}
~~~

## Step2．実行したいLinuxコマンドを設定
コマンドを設定しメソッドに渡すだけ
~~~java
// 例）端末の温度
String command = "cat /sys/class/thermal/thermal_zone0/temp";

temp = commandExecution(command);
Log.d(TAG, "端末の温度:" + temp);
~~~

#### よく使いそうなコマンドメモ
※"｜"は、全角で記載しているため、コピペする場合は半角に直してください

|取得情報|コマンド|結果例|備考|
|---|---|---|---|
|端末の温度|cat /sys/class/thermal/thermal_zone0/temp|42000|左記例では摂氏４２度|
|端末のIPアドレス(Wi-Fi)|ip addr show wlan0 ｜ awk '/inet / {print $2}'|192.168.1.100/24||
|端末のGetwayアドレス(Wi-Fi)|ip route get 8.8.8.8 ｜ awk '/via/ {print $3}'|192.168.1.1||
|端末のMacアドレス(Wi-Fi)|ip addr show wlan0 ｜ awk '/ether/ {print $2}'|aa：bb：cc：dd：ee：ff||

## 最後に
コマンドベースでできることが増えると、実装の幅も広がるきがした
iPhoneショートカットの日付の扱いのメモ

iPhoneショートカットアプリで、調整した日付でリマインダを設定するのに手間取ったのでメモ

日付調整後リマインダに、期限としてそのまま渡すとスペルミスと言われる。

![IMG_1454.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/58cbba9f-483e-3231-bcdc-082c97f381f0.png)

どうやっても進まないため、
1. 一度新規リマインダをタイトル付きで作成する
2. **リマインダーを編集**で、作ったリマインダの期限等を後から調整する
でなんとかする。

![IMG_1455.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/0b5af510-c2c7-b09b-6152-e8c681c2cc44.png)

ただ、iPhoneの時制を環境設定で24時間表記にしている場合、単純に日付を渡すと7:30が19:30になってしまう（バグ？）
これは、リマインダに調整済みの日付を渡す際に日付のフォーマットをRFC2822にすると解決する

![IMG_1456.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/fb6a4b50-b93d-a0c6-c0fa-6e5a1527ed9d.png)

if文などを入れ込むとiPhoneでの編集が大変。Mac側で編集したいけど、シミュレータが欲しくなる……
Einstein Prediction Builderのまとめ



[Einstein Number Prediction format and component functionality](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahfVp)

+ 数値予測は非常に長く、結果予測フィールドの長さを変更したり、予測するフィールドの長さを変更したりしても、短縮することができません。短くする方法はありますか？ 

予測の長さに関しては、Einstein 予測ビルダーを使用して予測を作成している場合、予測値の長さを直接制御することはできません。ただし、Salesforce の数式を使用して予測値を操作できます。たとえば、予測が 1 ～ 10 の小数の場合、数式フィールドを使用して、予測を特定の小数点以下の桁数に四捨五入したり、整数に変換したりできます。これは、予測の長さを短縮するのに役立ちます。あるいは、Einstein 予測ビルダーによって生成された予測値を、Apex トリガまたはプロセスを使用して操作することもできます。

+ Einstein Discovery を通じて予測を行った場合、ライセンスのないユーザーはアカウント上のコンポーネントを表示できますか?それとも、ライセンスを取得したユーザーだけが利用できるのでしょうか?

Einstein Discovery を使用している場合、ライセンスのないユーザは、アカウントページで Einstein Discovery コンポーネントを直接操作できません。 Einstein Discovery 機能にアクセスするには、通常、Salesforce Einstein Analytics Plus ライセンスが必要です。ただし、ワークフロー、検証ルール、Apex トリガなどの Salesforce プロセスで Einstein Discovery によって生成された予測を使用して、予測に基づいてアクションや意思決定を自動化することはできます。このようにして、ライセンスを持たないユーザーは、予測によってトリガーされる自動アクションを通じて間接的に予測から恩恵を受けることができます。
Elixir実践入門に初心者が入門したら　P28〜

敬礼、直れ！　...（元）海上自衛隊　の薪　（元）大尉です！

　　　雨の日も風の日も大海原上空を飛んできましたが、それも今は昔、IT業界では羽すら生えてない現状の３４歳、独身です。...そう、やばいです。　（逆に航空力学や回転翼工学は任せて下さい！）
まるっきり素人という同じ境遇の方とゆっくり進んでいけたら幸いです。

日々の勉学内容を共有の意味も込めて、アウトプット致します。
　では、本日からElixir実践入門に私も入門。。おかしいな一向に頭に入って来ない、これが入門書だ...と。

**第2章: Elixirの基礎**
　まずは本題へ入る前に各言語におけるインタプリンタ型とコンパイラ型の定義や違い仕組みや特徴分けしたいと思う。
 　*①*インタプリンタ型（Python、 PHP等、Elixir）
  　　対話形式で、１行ごとに翻訳して実行、そのため低速である。目的プログラムを作成しない。
　*②*コンパイラ型（C、C＋＋等、Elixir）
 　　全文翻訳してから実行するため、処理が高速。目的プログラムを作成する。
   
   ・・なるほどElixirはどちらにも対応しているのか、使い分けはおいおい学ぼう。

*P28　コンパイルして実行する場合について*

　まずは、演習に必要なファイルの作成から。ここでは、デスクトップ上に演習用として「Elixir0402」を作成。下の通り。
![スクリーンショット 2024-04-02 8.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634341/d3bc7321-aa57-5e40-ec6d-f6af6236a229.png)

次にCUIでターミナルから、本フォルダにアクセスしてファイルを作成してみる。
コマンドは、ls→cd Desktop→ls→cd Elixir０４０２→code . これでVSターミナルが開くと思われる。
![スクリーンショット 2024-04-02 8.13.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634341/ad2315d9-d406-463b-abe4-79809e6446bf.png)

開いたVSコードにおいてファイルを開こう、ここでP28の中文記載のファイルを作成。
*コンパイルして実行する場合*
![スクリーンショット 2024-04-02 8.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634341/ee62c4ab-f563-9301-fba0-0e54167dffec.png)

次のコマンドでコンパイルされる。
```elixirc hello.ex```
更に同じフォルダにElixir.Hello.beamというファイルが生成される。

*スクリプトとして実行する場合*
![スクリーンショット 2024-04-02 8.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634341/0e92f02e-0a98-2a76-1a07-aff6ea8cf59d.png)
```elixir hello.exs Hello,world!```
 Elixirコマンドで実行、ファイルは生成されない。

**最後に**
 長くなるため、以降は次回に共有します。お付き合い感謝します。
Databricks における spark_catalog というオブジェクトに関する調査

## 概要

Databricks における spark_catalog がどういったオブジェクトであるかを調査しました。調査結果と spark_catalog を確認できるケースを記載します。

## 調査結果

spark_catalog とは hive_metastore のシノニムのようなものであると解釈しました。spark_catalog という記述を実施するのではなく hive_metastore と記載することが望ましいです。

```sql
%sql
SELECT
  -- spark_catalog と記載しても動作する
  spark_catalog.functions_test_01.get_abc() AS spark_catalog,
  
  -- カタログエクスプローラーで確認できる hive_metastore と記載することが望ましい 
  hive_metastore.functions_test_01.get_abc() AS hive_metastore
```

なお、ドキュメントにて予約語として記載されておりませんでしたが、 spark_catalog というカタログの作成をできませんでした。

```python
%sql
CREATE CATALOG spark_catalog;
```

```text
com.databricks.backend.common.rpc.SparkDriverExceptions$SQLExecutionException: org.apache.spark.sql.AnalysisException: [MODIFY_BUILTIN_CATALOG] Modifying built-in catalog spark_catalog is not supported.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/01c97821-9711-90de-a428-6558c03e7d52.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9b91fbf5-e2be-4801-33ba-5322e79c6586.png)

引用元：[Reserved words and schemas - Azure Databricks - Databricks SQL | Microsoft Learn](https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-reserved-words)

## spark_catalog を確認できるケース

### 1. Databricks の current_catalog 関数のドキュメントの Examples

以前から違和感を感じておりましたが、下記のように spark_catalog がリターンされるという実行例が記載されています。

> \> SELECT current_catalog();
>  spark_catalog

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1671e958-cdd8-3718-5304-7d36ed658ed5.png)

引用元：[current_catalog function | Databricks on AWS](https://docs.databricks.com/ja/sql/language-manual/functions/current_catalog.html)

### 2. Unity Catalog が有効でないワークスペースにて関数定義の表示結果

関数名として spark_catalog が記載されていることを確認できました。

```python
%sql
CREATE SCHEMA IF NOT EXISTS functions_test_01;

CREATE OR REPLACE FUNCTION functions_test_01.get_abc()
  RETURNS STRING
  LANGUAGE SQL
  RETURN 'abc'
;

DESC FUNCTION EXTENDED functions_test_01.get_abc;
```

```text
Function:      spark_catalog.functions_test_01.get_abc
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5a28a5de-723c-d109-bcf3-d4283833d6c2.png)

関数の定義を確認する際、 hive_metastore と記述する場合には、spark_catalog と表示されませんでした。


```text
%sql
DESC FUNCTION EXTENDED hive_metastore.functions_test_01.get_abc;
```

```text
Function:      hive_metastore.functions_test_01.get_abc
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3fde9850-c65e-88e3-7103-2313b1e40bdd.png)
App Service にデプロイした .NET アプリの問題点を分析する

# はじめに

この記事では、App Service にデプロイした .NET Core アプリで発生しうる問題とそれを特定する手法について学んだことを記していきます。

対象とするシナリオは以下とします。

- 応答遅延
- 無応答
- クラッシュと例外
- High CPU
- High Memory

これらのシナリオは以下のドキュメントで挙げられています。

https://learn.microsoft.com/ja-jp/troubleshoot/azure/app-service/capture-memory-dumps-app-service

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/53b4c1c4-b984-ebdc-c89f-fad6b6d49d04.png)


# 事前準備

## ターゲットアプリ

問題が発生するアプリケーションを作成し、App Service(Windows, S1プラン) にデプロイしてあります。

https://github.com/georgeOsdDev/SampleBuggyApp

下記のように上記のシナリオが発生しうる API を用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/8aa54ae2-605a-2860-915a-bac3b249476f.png)

## 各種監視設定

### ログ

取れるものはすべて取得しておく

https://learn.microsoft.com/ja-jp/azure/app-service/overview-monitoring

- [診断設定](https://learn.microsoft.com/ja-jp/azure/app-service/troubleshoot-diagnostic-logs#send-logs-to-azure-monitor)

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/55950dc6-fc2e-ae17-8fe5-f57e134ebd38.png)

- [App Service ログ](https://learn.microsoft.com/ja-jp/azure/app-service/troubleshoot-diagnostic-logs#access-log-files)

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/822facc8-5b50-3028-2a97-f2b045eac50d.png)

- [Application Insights](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/azure-web-apps)

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/6ce8843c-f414-4ef7-c269-28a1603c3657.png)

- [診断ツール](https://learn.microsoft.com/ja-jp/azure/app-service/overview-diagnostics#diagnostic-tools)

  - 自動復旧(Auto Heal) :
    有効とする。

  - プロアクティブ CPU 監視
  - プロアクティブ自動復旧
    それぞれ後述のシナリオ検証の際に詳細設定する
  
- 正常性チェック

  正常性チェックについては今回は無効のままとする。インスタンスの入れ替わりが発生するとややこしいので、スケール数は 1 とし特定の 1 インスタンスで動作するように構成

  https://learn.microsoft.com/ja-jp/azure/app-service/monitor-instances-health-check?tabs=dotnet

- [アラート](https://learn.microsoft.com/ja-jp/azure/azure-monitor/alerts/alerts-overview)

　今回は実動作を見ながら分析するので未設定とする。実際にはログアラートやメトリックアラートを用いるべし。

# 応答遅延 シナリオの分析

プロファイラトレースを用いた分析

https://qiita.com/georgeOsdDev@github/items/166d9ed85c1effc648e8

外部依存の遅延パターン

https://qiita.com/georgeOsdDev@github/items/825bbc63679472248e1a

# 無応答 シナリオの分析

別記事で書く予定

# クラッシュと例外 シナリオの分析

別記事で書く予定

# High CPU シナリオの分析

別記事で書く予定

# High Memory シナリオの分析

# 参考記事

https://learn.microsoft.com/ja-jp/dotnet/core/diagnostics/#net-core-diagnostics-tutorials

https://learn.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/introduction

https://learn.microsoft.com/ja-jp/troubleshoot/azure/app-service/capture-memory-dumps-app-service

https://learn.microsoft.com/ja-jp/azure/azure-monitor/profiler/profiler-data
先日GAを迎えたAzure OpenAI Whisper modelを中心に音声をテキストに変換する方法を整理した

# はじめに
Microsoftが2024年の注目のAIトレンドの一つとしてマルチモーダルAIを挙げていました。本記事では先日GAを迎えたAzure OpenAI Whisper modelを中心に音声をテキストに変換する方法を整理します。

https://news.microsoft.com/three-big-ai-trends-to-watch-in-2024/

# Azure OpenAI Whisper model
Azure OpenAI Whisper modelが2024/3/13にGAになりました。[Whisper](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/whisper-overview)は音声をインプットとして提供することでトランスクリプトを生成することができるモデルです。このモデルが現状最も期待されるのはコールセンターのシナリオだと思います。会話データを書き起こしたり、違う言語に翻訳したりすることで、短い時間で会話の内容分析を可能にします。

MicrosoftはAzure AI SpeechとAzure OpenAI  Serviceの両方を通じてOpenAI Whisperを使用できるとしています。本記事では、Microsoftの提供するSpeech to Textモデルの違いを整理してどんな時にどのサービスを活用するべきかを説明します。

# Azure AI Speech modelsとAzure OpenAI Whisper modelの比較
以下の3パターンの使い分けが検討できます。

- リアルタイム文字起こし
    - リアルタイム処理に活用できます
    - 対応可能なモデル
        - Azure AI Speech models
- バッチ（24時間以内）文字起こし
    - 25MBを超える大きなファイルに対応できますが、Azure OpenAI 上での実行に比べ長い処理時間が見込まれます
    - 対応可能なモデル
        - Azure AI Speech models, Whisper model on Azure AI Speech
- バッチ（ニアリアルタイム）文字起こし
    - 高速な処理が期待できますが、25MBを超えるファイルを扱えません
    - 対応可能なモデル
        - Whisper model on Azure OpenAI Service

これらの機能は[Microsoft Azure AIのSpeech Studio](https://speech.microsoft.com/portal)にて簡単にテストすることが可能です（Azure OpenAI Whisper modelの利用にはAzureのアカウントが必要ですが、Azure AI Speech modelsはサインイン不要でテスト可能です）。

Azure OpenAI Whisper modelは、生成AIならではの柔軟性を活かし、文字起こしの際に英語に翻訳するなどプロンプトを通じて出力をガイドすることができます。今は利用できる用途・範囲が限定的ですが生成AIモデルの進化に伴って制限が少なくなっていくことが期待できます。

Microsoftの情報は以下も合わせてご参考ください。

https://azure.microsoft.com/en-us/blog/accelerate-your-productivity-with-the-whisper-model-in-azure-ai-now-generally-available/

https://learn.microsoft.com/Ja-jp/azure/ai-services/speech-service/whisper-overview

# まとめ
先日GAしたAzure OpenAI Whisper modelについて、従来のAzure AI Speechとの使い分けを整理し、今後の広がりについて考察しました。マルチモーダルの観点では、他のモデルと連携し、動画（映像と音声）をインプットとして生成AIに処理させるためにも重要なコンポーネントになるかと思います。そのあたりの仕組みも整理していきたいです。
【メモ】Async・Await・Promiseについて

今までなんとなくその場しのぎで理解していたAsynchronous Operationについて、備忘メモ的にまとめようと思う。

昔のJSでは、以下の様に .then() Callbackを使ってPromise Chainを書いていたが、これだと延々と.thenが続いてクリスマスツリーの様だ（アメリカではそう表現されてます）とのことで、async/awaitが今では主流だと教わっていました。

```
const promise = xxx_func()
promise.then(() =>{

...

}
```

しかしです。よくよく考えたら、Promiseを返さないFunctionもあるわけで、その場合にはPromise Chainがそこで分断されてしまいます。

そんな時は、このように、Promisifyすることで、Chainの一貫性を保つことができます。

```
await new Promise((resolve, reject) => {
    xxx.dosomething(error => {
        if(error){
           reject(error)
        } else {
           resolve()
        }
    });
})    
    
```

そういったメソッドが複数ある場合には、promises arrayに追加して、Promise.all(promises)で一気にまとめるのもいいと思います。

```
let promises = [];
for (let i = 0; i < 5; i++) {
  promises.push(doAsyncWork(i));
}

// Execute all promises
Promise.all(promises)
  .then(results => {
    console.log("All promises resolved:", results);
  })
  .catch(error => {
    console.log("One or more promises rejected:", error);
  });

```

覚える必要がないのはわかってますが、Syntaxを忘れがち＆そもそもこのロジックを忘れがちなので、備忘録書かせていただきました。
画像を回転して黒い枠を切り取る

## 動機
AIの学習前にデータ拡張（水増し）する際、回転をさせると黒い枠が残るができれば消したい。
![test.gif:width:100px](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759768/5088cb5b-358a-2aba-52b9-29673ef98bb8.gif)

## 画像を回転して黒い枠を切り取る
```python:rotate_and_crop.rb
import cv2
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import math

img = cv2.imread('/content/drive/MyDrive/lena.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
fig = plt.figure()
h, w, c = img.shape
imgs=[]

for i in range(0, 360, 10):
  rad = math.radians(i)
  scale = abs(math.sin(rad)) + abs(math.cos(rad))
  mat = cv2.getRotationMatrix2D((w / 2, h / 2), i, scale)
  affine_img = cv2.warpAffine(img, mat, (w, h))
  imgs.append([plt.imshow(affine_img)])

ani = animation.ArtistAnimation(fig, imgs, interval=360)
ani.save("rena.gif")
```
![test (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759768/75b52ee9-e204-ddd1-c797-e323c53d9b5d.gif)
Symfonyで制作したwebアプリをエックスサーバーにデプロイすることは可能でしょうか？

Symfonyで制作したwebアプリをエックスサーバーにデプロイすることは可能でしょうか？herokuのようにgitと連携して行うことは可能でしょうか？その場合の方法を教えていただければと思います。よろしくお願いいたします。
tree コマンドの文字コピペ用(├─│   └)

treeコマンドの結果を微修正するときなど文字を見つけるのが大変なので自分用にメモ

```
├── fuga.txt
├── hoge.txt
├── tmp1
│   └── piyo.txt
└── tmp2
    └── piyo.txt
```


縦線だけ太い気がしないでもない
M5stack StampS3とOLED SSD1306で遊ぶ (「46」よろーを表示)(ESP32-S3)



x 過去ログを見よ!!
x Adafruit_GFXとAdafruit_SSD1306をインストール
x M5Stamp S3の事

目的
OLEDで遊ぶ


結果

![o_coq014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f11c2e0c-8036-47ad-10c1-fc1f61b289eb.jpeg)





プログラム

```c++



//ssd1306_46_M5S3_1


//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


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

  // 画面表示をクリア
  display.clearDisplay();

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

  //46を設定
  int tempval = 46;

  // 1行目に46を表示
  display.println(tempval);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop



```
GoogleスライドからGoogleカレンダーに予定を取り込もう

参考記事
⇨「https://qiita.com/yuma-o2525/items/e226e825847c907c5d3f」

看護師のシフト表から手でGoogleカレンダーに打ち込むのがめんどくさくなって、なんか楽できないかな。って考えてたら、Googleシートにプルダウンみたいな感じでやってもらった方が楽になるんじゃね。っていう勝手な考えでやってみる。

先人様がとても良いものも作っていたので、こちらのにプルダウンを付け加えたものを作ってみる。

![スクリーンショット 2024-04-02 5.03.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508550/ce61af44-76c4-3e02-d35a-0682a31c6fd4.png)


プルダウンは無事に作れたけどここからの文章の反映の仕方(VLOOKUP関数を使えば良いのか)と、間違えた時の修正の仕方などを考えながら作っていきたい。


---

 4/3 追記載 


VLOOKUP関数の検索の範囲を、読み取りたい範囲から、全体にしたらとりあえずは時間を記載することができた。

![スクリーンショット 2024-04-02 23.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508550/86a7337f-6d4e-055c-d99b-3cd6bac87d42.png)

しかし、行を下に下げて、式をコピーしても、列数があるところからエラーになってしまった。
エラーになった所を見ると、
![スクリーンショット 2024-04-02 23.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508550/28175495-3941-8d3d-32fd-23be56f1ee76.png)

「ARRAYFORMULA関数」なるものが出てきたので、また明日見てみることにする。

まだ引き続き一度打ち込んだ所を修正するのはできていないので、引き続き模索中。
2024/4/02主にITとかセキュリティの記事

またも狙われたリモートデスクトップ　脆弱性対応が急務(3/31)
https://kn.itmedia.co.jp/kn/articles/2403/31/news045.html

[2024年1月-2024年3月] AWSセキュリティアップデートまとめ(3/31)
https://dev.classmethod.jp/articles/aws-security-updates-202401-202403/

学校の防犯カメラ、ウイルス感染　犯罪に悪用、盗み見の恐れも(3/31)
https://www.sanyonews.jp/article/1534229/

学校カメラがウイルス感染　セキュリティー欠陥放置か(3/31)
https://www.sankei.com/article/20240331-VUVLHHIIYNO5TEH5TSSW4WBVXE/

シーケンス図で理解する「攻撃手法と対策」【セキュリティまとめ】(3/30)
https://qiita.com/makotohanada/items/e14a546ccf3e7181ff8e

米ＡＴ＆Ｔ、顧客の個人情報流出で調査開始　７３００万人分(3/31)
https://www.cnn.co.jp/business/35217153.html

米AT&T、顧客情報の流出めぐり調査を開始　7300万人分(3/31)
https://www.nikkei.com/article/DGXZQOGN3107L0R30C24A3000000/

日本の｢ホワイトハッカー｣育成に不可欠な視点
学ぶ場の充実により年々レベルは向上している(3/31)
https://toyokeizai.net/articles/-/743487

米司法省がアップル提訴　利用者の利益を最優先に(3/31)
https://mainichi.jp/articles/20240331/ddm/005/070/109000c

Linux向け有名パッケージxzにsshバックドアできる脆弱性が埋め込まれた問題について調べる(3/31)
https://zenn.dev/levtech/articles/1dda57cac26d78

生成AIの企業利用・開発のリスクとその対策を解説！開発失敗事例も紹介(3/31)
https://weel.co.jp/media/gen-ai-risk

TRONが仮想通貨市場の違法行為を主導、TRM研究所が明らかに
https://portalcripto.com.br/ja/%E3%83%88%E3%83%AD%E3%83%B3%E3%81%8C%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E5%B8%82%E5%A0%B4%E3%81%A7%E3%81%AE%E9%81%95%E6%B3%95%E8%A1%8C%E7%82%BA%E3%82%92%E4%B8%BB%E5%B0%8E%E3%80%81TRM%E7%A0%94%E7%A9%B6%E6%89%80%E3%81%8C%E6%98%8E%E3%82%89%E3%81%8B%E3%81%AB/#google_vignette

ソラナ財団、人種差別的ミームコイン問題でフィルタリングできると主張(3/31)
https://www.coindeskjapan.com/226512/

ブラウザからDBに行き着くまでただまとめる(3/31)
https://zenn.dev/moko_poi/articles/c2402f13a870a1

レイヤー2ブロックチェーン「Base」の取引量が過去最高値に到達(3/31)
https://crypto-times.jp/news-base-trading-volume/

Qiita株式会社で共通基盤開発グループというチームの立ち上げと約3年やってきたことを振り返る(3/31)
https://qiita.com/mziyut/items/4b8c83019bea56bec16c

米英仏では「秘密指定」廃止の流れ　経済安保情報保護法案　なぜ今さら日本に？指摘される「最大の不備」は(3/31)
https://www.tokyo-np.co.jp/article/318319?rct=politics

生成AI搭載型のチャットボットとは？種類や仕組み、注意点、おすすめサービスを紹介(3/31)
https://weel.co.jp/media/gen-ai-chatbot

子どもによる「無断課金事案」の被害額は平均33万円　小学生がパスワードも生体認証も突破する(3/31)
https://news.livedoor.com/article/detail/26145346/

木原防衛大臣「サイバーセキュリティ態勢強化は待ったなし」　サイバー学校を視察(3/31)
https://news.tv-asahi.co.jp/news_politics/articles/000343103.html

ずさんな安全管理体制が露呈　総務省が異例の行政指導 LINEヤフー(4/1)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/032800152/

「特に重要なネットワーク技術」をどう選ぶ？　ヒントは支援士試験にあり(4/1)
https://xtech.nikkei.com/atcl/nxt/column/18/02793/032600001/

繰り返される技術者の「犯罪」　NTT西の事件が示す丸投げの闇(4/1)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/032500162/

ISO/IEC 42001（AIMS）(4/1)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/032700165/

パケットとフレームの動きを知る(4/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/121800181/031800004/

ルーティング
パケットを運ぶ経路を制御する(4/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/091900172/031800007/
【Python】pygameのイベントハンドラをデコレータを使って(比較的)綺麗に書く方法

# はじめに

デコレータを使ったpygameのイベントハンドラを実装する方法を紹介します。

## この記事の対象者

- ある程度Pythonの知識があり、pygameのイベントハンドラをデコレータで実装したい。

## 前提知識

- 基本的なPythonの記法と仕様を理解している
- pygameの基本的な使い方を知っている

# 実装

## 実際のコード

```python: main.py
import sys

import pygame
from pygame.locals import * # QUITやKEYDOWNなどのイベントを一括インポート


# 初期設定

SCREEN_SIZE = (320, 140)
clock = pygame.time.Clock()
fullscreen_flag = False
event_handlers = {}
 
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption(u"hoge")


# デコレータの実装

def event(event_type):
    def decorator(func):
        event_handlers[event_type] = func
        return func
    return decorator


# - 使用例 - #

@event(QUIT)
def on_quit(event):
    pygame.quit()
    sys.exit()

@event(KEYDOWN)
def on_keydown(event):
    global screen
    if event.key == K_ESCAPE:
        pygame.quit()
        sys.exit()
    if event.key == K_F2:
        fullscreen_flag = not fullscreen_flag
        if fullscreen_flag:
            screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN)
        else:
            screen = pygame.display.set_mode(SCREEN_SIZE, 0)

@event(MOUSEMOTION)
def on_mouse_motion(event):
    x, y = event.pos
    pygame.draw.line(screen, (255,255,255), (SCREEN_SIZE[0]/2,SCREEN_SIZE[1]/2), (x,y), 1)


while True:
    screen.fill((0,0,0))
    clock.tick(120)
    for event in pygame.event.get():
        if event.type in event_handlers:
            event_handlers[event.type](event)
    pygame.display.update()
```

## 解説

### `event()`デコレータ

このデコレータは`event_handlers`に格納されたイベントとその処理を管理します。これによってそれぞれのイベントに応じた処理が実行されます。

# 終わりに

最後まで読んで頂きありがとうございます。不備があれば是非コメントで指摘して下さい。
シェルスクリプトの空関数はエラーが出る

以下を実行すると、エラーになる

```shell:test.sh
#!/bin/bash
function func () {
}
```
エラー内容
```
-bash: test.sh: line 3: syntax error near unexpected token `}'
-bash: test.sh: line 3: `}'
```

関数内は1つ以上コマンドを入れる必要がある。
何もしない場合は、「：（ヌルコマンド）」を入れる
```diff_shell:test.sh
#!/bin/bash
function func () {
+    :
}
```
undefined method for ActiveRecord::Relationの解消法


Railsでのアプリケーション開発中、特にActiveRecordの関連を扱う際に、`ActiveRecord::Relation` オブジェクトに対する理解が不十分だと、思わぬエラーに遭遇することがあります。ここでは、`NoMethodError` という一般的なエラーの一例を取り上げ、その原因と解決策を解説します。

### 問題のシナリオ

以下のマイグレーションがあるとします。

```ruby
create_table "schedules", force: :cascade do |t|
  t.bigint "staff_id", null: false
  t.date "date", null: false
  # ...その他のフィールド
end

create_table "time_tables", force: :cascade do |t|
  t.bigint "schedule_id", null: false
  # ...その他のフィールド
end
```

そして、`Schedule` モデルと `TimeTable` モデルが以下のように関連付けられています。

```ruby
class Schedule < ApplicationRecord
  has_many :time_tables
  # ...その他の関連とバリデーション
end

class TimeTable < ApplicationRecord
  belongs_to :schedule
  # ...その他の関連とバリデーション
end
```

### エラーの発生

ある `SchedulesController` のアクションで、特定の条件を満たす `Schedule` レコードの集合から `time_tables` を取得しようとするときにエラーが発生します。

```bash
NoMethodError (undefined method `time_tables' for #<ActiveRecord::Relation
```

```ruby
class SchedulesController < ApplicationController
  def available_slots
    date = params[:date]
    staff_id = params[:staff_id]
    schedule = Schedule.where(date: date, staff_id: staff_id)
    time_tables = schedule.time_tables
    # ...後続の処理
  end
end
```

### エラーの原因

`Schedule.where(date: date, staff_id: staff_id)` は `ActiveRecord::Relation` オブジェクトを返します。これは `Schedule` レコードの集合を表し、単一のレコードではありません。そのため、`has_many` で定義されたメソッド（この例では `time_tables`）を呼び出そうとすると、`NoMethodError` が発生します。これは `ActiveRecord::Relation` オブジェクトにはそのメソッドが定義されていないからです。

### 解決策

`first` を使用して `ActiveRecord::Relation` オブジェクトから最初のレコードを取得するか、`find_by` を使って特定の条件に合う最初のレコードを取得します。

```ruby
class SchedulesController < ApplicationController
  def available_slots
    date = params[:date]
    staff_id = params[:staff_id]
    schedule = Schedule.find_by(date: date, staff_id: staff_id)
    if schedule
      time_tables = schedule.time_tables
      # ...後続の処理
    else
      # スケジュールが見つからなかった場合の処理
    end
  end
end
```

この方法で、`schedule` は1つの `Schedule` オブジェクトを指し、`time_tables` メソッドを正しく呼び出すことができます。

### まとめ

この記事では、Railsの `ActiveRecord::Relation` オブジェクトと `NoMethodError` というエラーについて解説しました。このようなエラーに直面したときは、呼び出しを行っているオブジェクトが期待する単一のインスタンスかどうかを確認し、必要に応じて `first` や `find_by` のようなメソッドを使用して対処することが重要です。
【TypeScript】localSrorageに型定義する

自分用メモ

## やること
変更前|変更後
--|--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569933/abaf4a21-b536-9781-ee48-9b674283dfc4.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569933/d1d8cc52-032d-5a67-7187-b70ce1ec4d73.png)

`any`であるところに型を付けます。

## 方法
```TypeScript
type StorageKey = 'count';

declare global {
  interface Storage {
    count?: string;
    getItem(key: StorageKey): string | null;
    setItem(key: StorageKey, value: string): void;
    removeItem(key: StorageKey): void;
  }
}

const count = localStorage.count; // string | undefined
```

`getItem`や`setItem`も入力補完が付いていいね👍
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569933/5eb0a48f-9348-cf4f-64e5-609cebe752f7.png)

## 注意
既存の型定義を上書きではなく、追記の形になるので`localStorage.item`といったものは`any`とみなされて、型エラーになりません。
既存定義の上書きはできないみたいですので、マジの型安全の`localStorage`を使いたい場合は下記みたいに新しく使いたいlocalStorageを作ってESLintで`localStorage`使用を制限するカスタムルールを作ると良さそう

```TypeScript
type StorageKey = 'count';
const customLocalStorage = {
  ...localStorage,
  count: localStorage.count as string | undefined,
  getItem: (key: StorageKey) => localStorage.getItem(key),
  setItem: (key: StorageKey, value: string) => localStorage.setItem(key, value),
  removeItem: (key: StorageKey) => localStorage.removeItem(key),
};
```
【Linux】gtest + lcov でカバレッジを計測する

## 概要
Linux 上で gtest と lcov を用いて、テストパターンに対するカバレッジを計測してみる
ここでは、VSCode で WSL にリモート接続して作業を行う

## 前提
- WSL がインストールされていること（手順は下記参照）

https://qiita.com/semiflat/items/4303a1d8dc20f599aef8

- WSL に gtest がインストールされていること（手順は下記参照）

https://qiita.com/semiflat/items/6ec0611609993f17cd5e

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

## 実施手順
### lcov をインストールする
WSL 上で下記のコマンドを実行し、lcov をインストールする
```
sudo apt install lcov
```
エラーメッセージが表示されなければインストール完了

### サンプルコードを作成する
任意のディレクトリに、下記の3ファイルを作成する
```c:sample.c
#include "sample.h"

int is_equal_to_zero( int x ){
    int ret;

    if( x == 0 ){
        ret = 1;
    }
    else{
        ret = 0;
    }
    
    return ret;
}
```
```sample.h
#ifndef SAMPLE_H_
#define SAMPLE_H_

int is_equal_to_zero( int x );

#endif /* SAMPLE_H_ */
```
```cpp:gtest_sample.cpp
#include <gtest/gtest.h>
#include "sample.h"

TEST( test_is_equal_to_zero, case_zero ) {
    int arg = 0;
    int ret = 0;

    // input
    arg = 0;

    // テスト対象関数をコール
    ret = is_equal_to_zero( arg );

    // アサーション
    EXPECT_EQ( ret, 1 );
}
```

### ビルドする
上記３ファイルを作成したディレクトリに移動し、以下のコマンドを実行してビルドする
```
g++ sample.c gtest_sample.cpp -o test -g -pthread -lgtest_main -lgtest -fprofile-arcs -ftest-coverage
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/158d906f-9b94-57ee-6208-118773ff8c6a.png)
test, test-gtest_sample.gcno, test-sample.gcno の3ファイルが生成されていれば OK

### テストを実行する
以下のコマンドを実行して、テストを実行する
```
./test
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/35e34a81-516f-d5f8-23ea-c2eef607cb37.png)
テストログが表示され、test-gtest_sample.gcda, test-sample.gcda の2ファイルが生成されていれば OK

### カバレッジを出力する
以下のコマンドを実行して、カバレッジを HTML 形式で出力する
```
lcov -c -d . -o sample.info
genhtml -o . sample.info
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/d5913117-5c08-bb3d-bcba-1eb6449ccb52.png)
.html ファイルが出力されていれば OK

## カバレッジレポートを見てみる
index.html を開くと、以下のようになっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/688c866f-b06d-d286-a5fc-fd92ccf6d48a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/9079e841-3dbc-6972-7a96-4e5a2f5f8e08.png)
青の行は実行されている行、赤の行は実行されていない行を示す
今回のサンプルコードでは、sample.c の10行目が実行されていないとわかる

## テストケースを追加してカバレッジを上げてみる
gtest_sample.cpp を、以下のように修正する
```cpp:gtest_sample.cpp
#include <gtest/gtest.h>
#include "sample.h"

TEST( test_is_equal_to_zero, case_zero ) {
    int arg = 0;
    int ret = 0;

    // input
    arg = 0;

    // テスト対象関数をコール
    ret = is_equal_to_zero( arg );

    // アサーション
    EXPECT_EQ( ret, 1 );
}

TEST( test_is_equal_to_zero, case_one ) {
    int arg = 0;
    int ret = 0;

    // input
    arg = 1;

    // テスト対象関数をコール
    ret = is_equal_to_zero( arg );

    // アサーション
    EXPECT_EQ( ret, 0 );
}
```
修正後、ビルドする ~ カバレッジレポートを見てみる の手順を再度実施する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/0f2eb62d-3102-1e9b-590b-26bb5f9630c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/ea91192b-33d4-e6db-8000-131a9fc32cca.png)
先ほど実行されていなかった行が、実行されるようになったことが分かる
プリザンターのユーザーアクセス制御について

# はじめに
[プリザンター](https://pleasanter.org/)のユーザー、サイトのアクセス制限について調べてみました。

### 各種設定方法について
プリザンターにログイン後、トップページの管理に **組織の管理、グループの管理、ユーザーの管理** で各種設定を行う事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/9ad9ba21-1517-0f7f-0bd9-fff68dc59991.png)

## 基本的にはテーブルの管理で全て完結
テーブルの管理から『サイトのアクセス制御』を選択し、ユーザー、組織、グループのいずれかの組み合わせでアクセス制御を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/5b423fc2-6a23-282e-b169-89df6cb00d16.png)

## 1つのユーザーに1つの組織を付与可能

ユーザーの新規作成、変更時に予め作成した組織を1つ設定する事ができます。複数の組織を指定することはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/924e1e30-3715-f73b-660f-a09ba30d4e6a.png)

## グループを作成し、ユーザーを追加する。
トップページから **グループの管理** を選択し、メンバータブからユーザーを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/820ebe2a-4c0b-728b-3c76-6b93abb3a6d0.png)

:::note info
選択可能なメンバーに**名前またはログインIDを入力してEnterキー**を入力しないとユーザーが表示されないので注意です。
:::

![sample4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/bf4fe7dd-0a55-23bc-b84c-5e00de063a3b.gif)
言語処理学会2024論文紹介/言語モデルによる心理的構成概念の再構成 

【一言で言うと】
複数の大規模言語モデル（特にGPT-4）を用いて、心理学的質問紙の質問項目から概念のカテゴリー分類の再構成が可能かを検証した

【タイトル/URL 】
「言語モデルによる心理的構成概念の再構成」
https://www.anlp.jp/proceedings/annual_meeting/2024/pdf_dir/P2-5.pdf

【まとめ】
・複数の大規模言語モデルを用いて、心理学的質問紙の項目間の類似度を計算し、そのカテゴリー分類性能を比較
　　→結果として、GPT-4が最も高い分類性能を示し、言語モデルが心理学的概念間の関係性を保持している可能性を示した
・連続値と離散値による出力は分類性能に影響を与えないが、質問項目の順序は分類性能に影響を与える

【感想】
心理学的質問紙データベース「Psychological Scales」や、プロンプトの与え方（リッカート尺度(9段階)＋連続値による出力）は、医療カウンセリングにも応用可能か

【画像】
fig2![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2106750/b8cac141-264e-e8c9-b6cd-336f0b3d1f81.png)
新しいOutlookのデフォルトフォント(Aptos)を変更する！

# はじめに
最近メールをGmailからOutlookへ変更した時にOutlookのデフォルトフォントを変えたのですが、ググっても旧Outlookの情報しか出てこなかったので、僕のような人のために記事で残しておきます。

## この記事の対象者
- 新しいOutlookを初めて触る人
- 新しいOutlookのデフォルトフォントそのままの人

## 背景
最近メールをGmailからOutlookへ変更した時に、新しいOutlookを使うかどうかを選択できたのですが、これまでOutlookを使っておらず、旧Outlookに親しみがあったわけではなかったので、新しいOutlookを選択しました。

で、メールを書こうとしたのですが、フォントがAptos！！？？なんそれ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/ddad4f1b-33da-7cf7-f18d-72483efc3281.png)

## Aptosとは
https://forest.watch.impress.co.jp/docs/news/1516829.html
- ユーザーのフィードバックから選ばれた
- シンプルさと合理性を高い可読性で表現した万能書体
- 鋭く角のある終筆は機械的かつ合理化でモダンな印象

ということで、今後のデフォルトフォントになるらしいです。（今さら知ったよ）

でも、僕は日本の古いおっさんなので、みんな大好きMeiryoにします。

# デフォルトフォント変更の流れ
## まずググる
どのブログ記事を見ても、「まずはファイルタブをクリックして・・・」と書いてあるのですが、新しいOutlookにファイルタブなんてありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/0aff6b61-28d1-c30e-e768-e32650bd83ad.png)

## 自力で探す
当然ですが、すぐ見つかりました。下記のどちらでも行けます。
- 表示タブ > ビューの設定 > 作成と返信
- 右上の歯車 > メール > 作成と返信

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/05562b71-e582-e5d1-e08c-46032cbe7649.png)

:::note info
ちなみに、署名は下記で行けます。
 右上の歯車 > アカウント > 署名（なんでフォントと同じメールの所じゃないん？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/39b184dc-3fc4-bfb0-f330-7a72f39513a0.png)
:::

# 変更した結果
英語の部分は変わりましたが、日本語は変わりませんでした。
Aptosは日本語サポートしていないから、自動的に代替のフォントであるMeiryoに切り替わるみたいです（フォントフォールバック機能）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/f8b61485-25c4-94f4-82af-f8f5dc243363.png)

# おわりに
たいしたことない記事だけど、僕みたいにググる人がいるかと思ったので、一応記事として残しておきました。
Linux勉強２日目：RockyLinuxのセキュリティ初期設定を実施した。（要塞化した）


インストールしたRockyLinux9に対し、
セキュリティの初期設定（要塞化）をした
要塞化って言うのか。へー


rootへのパスワードログインを禁止する

```vim
[root@localhost ~]#vi /etc/ssh/sshd_config

#PermitRootLogin prohibit-passweord
```

#を外し、prohibit-passwordをnoにする。

```vim
PermitRootLogin no

:wq
```

設定を変更したので、sshサーバを再起動する

```bash
[root@localhost ~]#systemctl restart sshd
```
ファイアウォールが動作しているか確認する

```bash
[root@localhost ~]# firewall-cmd --state
running
```
runningなのでOK
ファイアウォールの設定を確認する

```bash
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

`interfaces enp0s3`
　→　ファイアウォール設定を適用するネットワークインターフェースが仮想マシンのものになっている
`services: cockpit dhcpv6-client ssh`
　→　許可するサービスにsshか登録されている
のでOK

SELinuxが有効化確認する
```bash
[root@localhost ~]# getenforce
Enforcing
```

Enforcingなので有効な状態。

時刻の同期を確認する

```vim
[root@localhost ~]# vi /etc/chrony.conf

pool 2.rocky.pool.ntp.org iburst
```

同期するサーバーが２種類設定されている。一応minsourcesを変更する
同期対象とするサーバーの最低数を２つに設定した。
```vim
minsources 2

:wq
```
おわり！
今回は特に問題なかった
外部アカウントからRedshiftにアクセスする方式

この記事では、アカウントAにあるEC2からアカウントBのRedshiftへのアクセス方法について紹介します。

### 構成

AアカウントとBアカウントが以下の構造を持つと仮定します。
#### アカウントA
・vpc-ec2
　・subnet-ec2
　　・ec2

#### アカウントB
・vpc-redshift
　・subnet-redshift
　　・redshift

上記のように、AアカウントのEC2からBアカウントのRedshiftにアクセスするには、VPCピアリングを使用して接続することができます。

### ＃１　VPCピアリング接続を作ります
#### アカウントAで：

 VPCコンソール画面を開き、サイドバー配下の「ピアリング接続」タグを選択し、「ピアリング接続の作成」ボタンをクリックします。
![截屏2024-04-08 22.49.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/02aae87c-2d13-746c-eebb-b6146d286ae6.png)

![截屏2024-04-08 22.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/42378b97-dc32-9331-a8d4-935868b32e8a.png)


名前・VPC IDなどを入力します：
![截屏2024-04-08 22.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/a80d5493-f911-eda0-9a92-5fd7544d8d52.png)

![截屏2024-04-08 23.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/bd78cf66-bde6-7854-107c-688170509090.png)

って、一番した「ピアリング接続を作成」ボタンをクリックして、「承認待ち」状態になります。

TIP：ここでエラーが発生した場合、最も可能性が高い原因は、CIDRの範囲が重複していることです。

#### アカウントBで：
同じように、VPCコンソール画面配下の「ピアリング接続」を選択して、先ほど作成したピアリング接続のリクエストが見えます。リクエストを選んで、受け入れたら、ピアリングの状態は「アクティブ」になります。

![截屏2024-04-08 23.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/aa778efc-8591-c2c4-42e4-b368d7420018.png)

![截屏2024-04-08 23.15.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/ef54ba4e-5391-7a5b-d94f-49bc46f6abb1.png)

 
### ＃２　ルートテーブル編集
#### アカウントAで：
EC2詳細画面で、ルートテーブルのリンクをクリックして、ルートテーブル画面を開きます。

![截屏2024-04-08 23.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/137e7a69-6111-60cf-75ff-515990771556.png)

ルートテーブル画面で、アクションを選んで、ルート編集をクリックすると、編集画面を開きます。新しいルートを追加する
送信先：アカウントBのCIDR
ターゲット：ピアリング接続　
先ほど作成したピアリング接続を選択します。（pcx-xxxx）

![截屏2024-04-02 0.23.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/69a04187-02ef-0ffd-4da3-f4f9cd0ab6a5.png)

#### アカウントBで：
アカウントAと同様に、ルートを追加します。ただし、CIDRが逆です。
送信先：アカウントAのCIDR
ターゲット：ピアリング接続　（先ほど作成したピアリング接続）


### ＃3　 セキュリティグループ設定
#### アカウントAで
EC2に関連付けていたセキュリティグループに
インバウンドルールを１つ追加します：
ポート範囲：5439
ソース：redshift（サブネット／VPC／セキュリティグループ）のCIDR

![截屏2024-04-08 23.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/bf44e3d9-b503-c773-df7c-38dff356417f.png)

#### アカウントBで
Redshiftに関連付けているセキュリティグループに
インバウンドルールを１つ追加します：
ポート範囲：5439
ソース： EC2（サブネット／VPC／セキュリティグループ）のCIDR



### ＃４　接続してみます
設定終わったら、 EC2でpsqlを発行しましょう！

コマンドは：
psql -U username -h redshiftホスト（ipやエンドポイント皆可） -d databasename -p 5439

![截屏2024-04-01 23.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/72f9a738-cdd7-7b1d-e0b5-48f675298fa2.png)
Macを買ったらやること

## はじめに
備忘録です。
私はMacを2 ~ 3年で買い替えたいと思う派です。
Macはリセール価格が良いので、古いPCを売って新しいPCを購入することであまりお金を出さずに最近の機種に移行できます。 逆に5年とか使ってしまうとリセール価格が落ちてしまいコスパが良くありません。
MacBookの初期設定は数年に1度のことなので、毎回忘れてしまいます。
数年後の自分のためにも普段私が行っている初期設定を残します。

## mac初期設定
Youtubeから初期設定の動画をいくつか見つけ出し一通り試します。
システム環境設定のレイアウトが変更されたため、動画の内容と見た目に違いがありますが、適宜変換してください
[初期設定動画1](https://www.youtube.com/watch?v=LzJkP8JeicA)
[初期設定動画2](https://www.youtube.com/watch?v=6b7acJA6zRw)
[初期設定動画3](https://www.youtube.com/watch?v=LWJ4VOF6GCs)

## プログラミング初期設定
ここら辺は何をするにしても必要だと思います。
個別言語のインストールは任せますが、私は基本Dockerで開発します。
1. Homebrew
2. xcode select
3. vscode
4. git
5. giyhubへのsshの設定
6. zsh

色々インストールしたら設定しましょう。
私はRubyをよく使う(2024年)ので、Rubyの記事も参考に載せています。

[zsh設定](https://qiita.com/mikan3rd/items/d41a8ca26523f950ea9d)
[必須拡張機能](https://qiita.com/kandalog/items/20ae0c3e39ffd2103658)
[VSCode](https://qiita.com/TS1engineer/items/1b54f65ee87cb49582f5)
[Ruby](https://zenn.dev/redheadchloe/scraps/cde1c88d0801bc)

## アプリ
何を入れるかは人によると思います。個人PCを前提に書いているので、プログラミングに関係ないアプリも一部含まれています。知らないアプリがあったら検索してみてください。全て便利です。
1 Alfred
2 Google Chrome
3 Magnet
4 Paste
5 Final Cut Pro
6 ATOMPad
7 LINE
8 Discord
9 Notion
10 Obsidian
11 Figma
12 Slack
13 VSCode
14 ClearnMyMacX
15 App Clearner
16 Docker
17 Apidog
18 DBeaver

[Alfredは初期設定しておきたい項目があります](https://www.youtube.com/watch?v=sTI53Im5Y04&t=201s)

## VSCode
拡張機能をinstallしましょう。
[別記事に載せています](https://qiita.com/kandalog/items/20ae0c3e39ffd2103658)
Unityでシーンを跨いでデータを保存する方法【備忘録】

# はじめに
Unityでデータを管理する方法をよく忘れるのでまとめました。

# 目次
[public staticな変数](#staticな変数に格納する)
[シングルトンパターン](#DontDestroyOnLoadなシングルトン)
[ScriptableOjbectを使う](#ScriptableObject)
[個人的ベストプラクティス](#ベストプラクティス)

# staticな変数に格納する
もっとも単純な方法が、**static**な変数に値を格納することでどこからでも参照できるようにするというものです。
「Unity Scene 変数 共有」などと検索すると、一番ヒットしやすい内容だと思います。

```c#
public static int score = 5;
```

もっとも手軽に実装できる方法なので、他の部分に時間を割きたいときや、初心者で他の方法は学習負荷が高いときなどはとりあえずpublic staticで良いかもしれません。

# DontDestroyOnLoadなシングルトン
ゲームオブジェクトをシングルトンにする、つまりオブジェクトが一つしかないことを確約する、と解釈しています。
主にゲームマネージャーやオーディオマネージャーなど、ゲーム内に一つだけ存在するべきオブジェクトに対して実装されるものとのことです。
```c#
// ChatGPTによるサンプルプログラム
public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject); // シーン遷移時に破棄されないようにする
        }
        else
        {
            Destroy(gameObject); // 既にインスタンスが存在する場合は、重複を避けるために自身を破棄
        }
    }
}
```
# ScriptableObject
個人的に一番使いやすいと考えているのがこの方法です。
Unityでは作成したクラスをコンポーネントとしてゲームオブジェクトにアタッチして使用しますが、**ScriptableObject**はアセットとしてクラスを使用する方法となります。

画像やテキストファイルなどと同じようにAssetフォルダ内に作成し、それを[SerializeField]やpublicとした変数にアタッチする形で使用します。

```C#
// ChatGPTによるサンプルコード
using UnityEngine;

// ScriptableObjectを継承したクラス
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item", order = 1)]
public class Item : ScriptableObject
{
    public string itemName = "New Item"; // アイテムの名前
    public Sprite icon = null;           // アイテムのアイコン
    public int price = 0;                // アイテムの価格
}
```

この方法の良い点は、シーンやプレイ中かどうかを問わずデータを変更できる点にあると考えています。
このメリットが顕著な場合として以下を挙げます。

#### ゲームを実行しないとゲームオブジェクトの設定を変更できない状態 

この場合、ゲームオブジェクトの初期設定や初期値といったデータをScriptableObjectに分離することで、いちいちゲームの実行/プログラムの編集を行わずともInspectorからデータを変更できます。

#### 特定の場面でしか変更できない設定を反映させたい場合

仮にゲームの設定がタイトル画面からしかできない場合、デバッグやテストを行う際に毎回タイトル画面を経由する必要が出てくると思われます。
そこでScriptableObjectの出番です。
アセットフォルダ内のデータを参照する形になるため、変数を書き換えて実行すると、すぐに設定が変更されます。


# ベストプラクティス
私は、ScriptableObjectを使用することを個人的に推奨しています。
public staticな変数、シングルトンパターンの問題点は以下になります。


> どこからでも参照、操作可能な変数であるため、一見扱いやすいと思うかもしれません。
> しかし、実態はその逆です。
> 多くのロジックでグローバル変数を参照し、値を変更していると、どこで、どのタイミングで値が書き換わったのか把握が非常に困難になります。
> 
> 仙場大也. 良いコード/悪いコードで学ぶ設計入門. 技術評論社. 2022, p185

このように、どこからでも参照できるということはバグの原因となりやすい、とも言えます。
もちろんどちらの方法も多くのメリットを持っていますが、実装の難易度と扱いやすさのバランスが取れているのがScirptableObjectだと思います。

# おわりに
これは現時点での私の考えるベストプラクティスであるため、今後学習を進めることで考えが変わるかもしれません。
apacheで"This may be due to a blocked port, missing dependencies"が出る

xammpをDドライブにzipで入れたところタイトルのエラーが出た
ちょくちょく変えないといけないコンフィグがあったのでapacheの設定の備忘録を残しとく
ネットで調べた感じこのエラーは以下が考えられそう
1. インストールフォルダとapacheの設定ファイルに乖離がある
2. 他アプリがポートを使用している
3. インストールフォルダにひらがなや漢字が含まれているなど

## 1. インストールフォルダとapacheの設定ファイルに乖離がある場合
### xammpのダウンロード
zipのものをダウンロードした
バージョンは`XAMPP for Windows 8.2.4`(中に入っているapacheはver2.4?)
ダウンロードした場所がCドライブ直下じゃない場合はapacheを起動したとき以下のエラーが出るはず
<font color="red">
```
Error: Apache shutdown unexpectedly.

This may be due to a blocked port, missing dependencies,

imporoper privileges, a crash, or a shutdown by another method.
```
</font>

### apacheの設定
以下のファイルの`/xampp/`すべてテキストエディタのリプレイス機能で`【インストールフォルダ】/xampp/`に書き換える
* 【インストールフォルダ】/xampp/apache/conf/httpd.conf
* 【インストールフォルダ】/xampp/apache/conf/extra/httpd-ssl.conf
* 【インストールフォルダ】/xampp/apache/conf/extra/httpd-xampp.conf

著者の場合`D:/web`にインストールしたので`httpd.conf`の37行目は以下のように書き換えられた
```diff
- Define SRVROOT "/xampp/apache"
+ Define SRVROOT "D:/web/xampp/apache"
```

### xampp-control.exeを起動して動作チェック
apacheをstartしてAdminをクリックでページが表示されました。
![xampp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761010/57febaf1-a538-29b3-154f-7d7f94cd815a.png)

## 2. 他アプリがポートを使用している場合
skypeなんかが80番ポートを使っていて競合する場合があるらしい
そのときは使用しているアプリをタスクマネージャとかで落とすかポートの設定を変更をする
とりあえずapacheで使用するポートの設定変更の方法を記す

### httpd.confを変更する
`【インストールフォルダ】/xampp/apache/conf/httpd.conf`の`60行目`、`228行目`あたりの以下の80番ポートの記述を好きなポート(こだわりがなければ8080)に変更する

`60行目`
```diff
- Listen 80
+ Listen 8080
```
`228行目`
```diff
- ServerName localhost:80
+ ServerName localhost:8080
```

### xampp-control.exeを起動して動作チェック
apacheをstartして[http://localhost:8080](http://localhost:8080 "")にアクセス(xamppのコントロールパネルでadminを押してもデフォルトでは80番ポートで開くのでブラウザで8080を直接指定して開く必要がある

ファイルを保存して設定が反映されていれば以下のページが表示される
![xampp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761010/70f990d0-6101-14b2-90f6-20ac13dd1ffd.png)
)

## 3. それでも同じエラーが出る場合
* インストールフォルダの名前にひらがなやが漢字入っている
  - 昔それでエラーが出た気がするのでインストールするフォルダのフルパスはすべてアルファベットに
* やっぱりhttpd.confのパスが間違っている
  - Define SRVROOT "C:/xampp/xampp/apache"みたいな感じでインストールフォルダがxamppでxamppを重ねて記述しないといけないとか
* 443番ポートが使われている
  -  `【インストールフォルダ】/xampp/apache/conf/extra/httpd-ssl.conf`の36行目、121行目、125行目あたりの443を好きなポートに変える
20240401 日記 NeovimのToggletermのデフォルトをpwshにする

Neovimの[toggleterm.nvim](https://github.com/akinsho/toggleterm.nvim)はWindowsで使うとcmd.exeが開くのでpwshにしようと思った

Shougoさんのdeolは簡単に変更できた記憶があるので、これも簡単かなあと思ったがそんなことなかった

けど何とかできた
```lua:init.lua
if vim.loop.os_uname().sysname == 'Windows_NT' then
  local pwsh_options = {
    shell = vim.fn.executable "pwsh" == 1 and "pwsh" or "powershell",
    shellcmdflag = "-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;",
    shellredir = "-RedirectStandardOutput %s -NoNewWindow -Wait",
    shellpipe = "2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode",
    shellquote = "",
    shellxquote = "",
  }

  for k, v in pairs(pwsh_options) do
    vim.opt[k] = v
  end
end
```
Windowsの時だけ実行するようにした
`has('win32')`みたいなのないんでしょうか
Toggletermの作者さん、過去の先達の方々、ありがとう
参考：[Tips and Tricks · akinsho/toggleterm.nvim Wiki](https://github.com/akinsho/toggleterm.nvim/wiki/Tips-and-Tricks#using-toggleterm-with-powershell)
ASP.NETで複数プロジェクト構成を作成する


## 複数プロジェクト構成のメリット

以前の記事「Visual StudioでWebアプリケーションを作成する【ASP.NET MVC】」で、プロジェクト1つで構成されたWebアプリケーションを作成しましたが、今回は複数プロジェクトで作成します。

https://qiita.com/shironana/items/ae99eb267cc2b1cce04c

例えば、利用者用と管理者用などの複数のシステムを同時に開発するケースを考えます。
プロジェクトが1つの場合、同じ名前のControllerは存在できないため、`/User` と `/Admin` のようにエリアを区切って使用することになります。
しかし、プロジェクトを複数用意すると、**別々のWebアプリケーションであっても同時に開発**できます。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/407ebcec-515a-b1bc-e1e8-a273a930fa96.png)

また、開発するシステムが1つの場合であってもデータベース用、定数データ用、ビジネスロジック用のように複雑なシステムを区切って整理することができます。

## ソリューションを作成する

新しいプロジェクトを作成する際に、「ソリューションとプロジェクトを同じディレクトリに配置する」のチェックを外し、プロジェクト名とソリューション名を入力します。

ソリューション名は複数のプロジェクト全体の名前、プロジェクト名は作成予定のプロジェクトどれか1つの名前を入力します。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/6edb6274-fb72-25c8-4ca8-73c4f2f7b47c.png)

以下のようにプロジェクトが作成されると成功です。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/35c1a51e-7d2d-74f1-4d78-f8b9d3e7d6e9.png)

## プロジェクトを追加する

以下手順でプロジェクトを追加します。

1．右側のソリューションエクスプローラーに存在する「ソリューション」を右クリック
2．「追加」をクリック
3．「新しいプロジェクト」をクリックし、「新規プロジェクトを追加」ダイアログを開く

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/c8b8113b-b492-a8f9-6f75-4d326665399b.png)

4．追加したいプロジェクトを選択し、「次へ」をクリック
5．「プロジェクト名」や追加情報を入力し、「次へ」をクリック

![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/3d163318-2e86-1d5c-729a-f75329ef6aa6.png)

![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/d9bb8912-8b9a-79dd-7f03-efd1211f2180.png)

以下のようにプロジェクトが並んで表示されれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/4d884130-029e-82ac-f05d-4acc080e85e8.png)