OmniAICreator/Qiita-1.07M huggingface dataset:
Androidアプリ「推し活TODO」をリリースしました【個人開発】

## はじめに

個人開発したAndroidアプリ「推し活TODO」をリリースしました！

Androidアプリのリリースは今回で4回目になります。

この記事ではリリースしたアプリの紹介や制作した経緯、アプリを開発している中で学んだことなどについて自分のための記録も兼ねて書いていきます。

## 目次
1. リリースしたアプリ「推し活TODO」について
2. 制作した経緯
3. 使用した言語・データベース
4. 今までに開発したアプリと変えたこと
5. 今回の開発で学んだこと
6. おわりに

## リリースしたアプリ「推し活TODO」について
#### リリースしたアプリ

* ##### <a href='https://play.google.com/store/apps/details?id=com.ruriboshi.osikatsutodo'>推し活TODO: 推し活のためのTODO・タスク管理アプリ</a>

#### アプリの概要

推し活のためのTODOリストアプリです。
CDやグッズの購入など推し活のタスクを推し毎に分けて管理することができます。複数の推しや推しグループがいる方におすすめです。
TODOリストにアイコン画像を設定出来たり、背景画像やTODOリストのテーマカラーを変更できたりするので、効率よくタスク管理できるだけでなくタスクを実行するモチベーションを上げることができ、楽しみながらタスク管理ができるアプリになっています。
推し活のためのTODOリストアプリと言っていますが、普通のTODOリストアプリとしても使えるようになっています。

<p>
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354509/7c4a1405-831e-e8e9-3ea5-8ae84325062f.png">

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354509/a8cd47c0-c54b-58c1-c9bf-043dcaafcb73.png">

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354509/e265a833-7f8e-b627-3d93-c2093ff03075.png">

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354509/36a52b69-be7e-5654-b62d-64b211997779.png">


</p>


## 制作した経緯

私自身も推し活をしているのですが、推し活はとにかくやることが多く、推しが複数いる方はやることの管理が大変ではないかと考えました。そこで、推しや推しグループごとに分けてタスクを管理することができるTODOアプリがあればこの問題を解決できるのではないかと考え、推し活TODOを制作しました。

## 使用した言語・データベース

* Kotlin
今までにリリースしたアプリと同様にKotlinで開発しました。

* Realm
以前にタスク管理アプリを制作した際にも使用したので今回もデータベースRealmを使用しました。Firebaseの使用も検討したのですが、Realmの機能で十分だと感じたので今回もRealmを使いました。

## 今までに開発したアプリと変えたこと

以前アプリをリリースした経験を踏まえて、今回のアプリでは開発する過程をいくつか変えました。

#### アプリのコンセプトを練ってから開発を始めた

今まではアイデアを思い付いた勢いでアプリを開発してリリースしていました(笑)
今回は「推し活のためのTODOリストアプリ」というコンセプトやターゲット・ペルソナを設定してから開発に取り掛かりました。

#### 機能よりもコンセプト
今までにリリースしたアプリは「リストに分類して管理できるタスク管理アプリ」や「アプリを起動してすぐに新規メモが開くメモ帳アプリ」など、機能にフォーカスして宣伝をしていました。
ですが、今回は「推し活のためのTODOリストアプリ」というコンセプトをアピールするようにしました。
この違いでどれくらい反応が変わるのかを検証してみて、機能重視かコンセプト重視か、アプリ開発の方向性を考えていこうと思います。

## 今回の開発で学んだこと

#### アプリのテーマカラーの複数テーマへの対応
推し活TODOでは複数の色からテーマカラーを選べるようにしました。今まではライトモードとダークモードへの対応しかしたことがなかったので複数テーマへの対応方法を学びました。

↓こちらの記事を参考にさせていただきました。
https://qiita.com/s17er/items/04a080181c860ea84694

#### ギャラリーから画像を取得する方法
背景画像やアイコン画像をを設定できる機能を実装するために、ギャラリーから画像を取得する方法を学びました。難しいのではないかと思っていたのですが、結構簡単に実装出来ました。

↓こちらの記事を参考にさせていただきました。
https://qiita.com/orimomo/items/4b741dc252bc261a8469

#### Realmへの画像保存
ギャラリーから取得した画像を保存したかったので、Realmへの画像保存の方法も学びました。BitmapからByte配列に変換することでRealmへ画像を保存することができると学びました。

## おわりに
今回は新しく学んだことや挑戦したことも多くて大変でしたが、その分できることが増えたので前よりも少し自信がつきました。
最近はタスク管理アプリばかり作っているので次は他のジャンルのアプリを作りたいです。

↓もし興味があればアプリをダウンロードしていただけると嬉しいです。
##### <a href='https://play.google.com/store/apps/details?id=com.ruriboshi.osikatsutodo'>推し活TODO: 推し活のためのTODO・タスク管理アプリ</a>


最後までお読みいただきありがとうございました。
【色変記事】AtCoder青色になりました

転職してから続けている競プロでついに青コーダーになることができました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/041601c6-1144-7b5c-64a8-cc66b0a31e4a.png)

入水記事はこちら

https://qiita.com/okaponta_/items/95edd5dd312087da28d8

# やったこと

- 今までと変わらず、毎日1問問題を解く
  - 時間がある日は水〜青diff、無い日は〜緑diffみたいな感じ。
  - 青diffの正当率上がってきたなという実感が得られてからは結構順調にコンテストで結果が残せた気がします。
- バーチャルコンテストは結局出てないです
- 蟻本をなんとなく読んだ(難しい！)
- コンテストに出れるときは出る(結局コンテストが一番成長する気がする)

# 学んだアルゴリズム

- セグメント木

実は、これくらいな気がします。
新しくアルゴリズムを学ぶというよりかは知っているアルゴリズムをうまく使えるようになったという成長をしたような気がします。

# コンテスト中の立ち回り

- 最初の30分くらいは気持ち急いで実装する
  - 結構のんびり解くことが多かったんですけど、とくに最初の方の解く速さはバカにできません。最初の30分くらいは集中して早く答えを出せるように意識しています。
  - 計算量悪くても、間に合うなら全探索解を積極的に書くなど。
- WAを気を付ける
  - 実装しながら、エッジケースがないかに気を巡らすようになりました。
  - 最初の方の1WAは結構痛いです。
  - 逆に残り時間的に少なく解き切れるかわからない系の問題はWA覚悟で提出しちゃいます
- 順位表を見る
  - 4完くらいしたところで、順位表を見るようにしています。
  - F問題とG問題で解いている人数がG問題の方が多いことが結構あります。
    - こういうときは問題も見ずにGにとりかかっています。

# なってみて

- 大学などで情報をまなんdコンプレックスがあったのですが、それが解消された
  - データ構造みたいな話って結構いろんな分野の基礎になるようなものが多くて、XXの仕組みとかを勉強するときの理解がだいぶ早くなった気がします。
  - ライブラリの内部実装などもbit演算使用していても特に抵抗なく読み進めることができるようになっていた
- なんか想定解以外の方法で正解する割合が増えた気がする
  - 引き出しが増えたのと、力技でもバグらせずに突破できる確率が上がったのとがあると思います。

# これからやりたいこと

- 典型90問
  - そろそろやりたい
- 1問問題を解き続ける
  - 無理なく続けられているので継続したい

黄色は正直遠すぎて、あんまり目標にできる感じでもないので、とりあえず現状維持できるように続けていこうと思います。
【Powershell】SJIS出力ができない問題【解決】

# SJISで出力したつもりが、UTF8で出力される...

以下のようなケースの際に文字列がSJISで出力できず結構沼ったので備忘として残しておきます。

- SJISのテキストファイルを読み込む
- Powershellで文字列編集する
- 編集したファイルを出力する

一般的にPowershellでSJIS出力Out-Fileコマンドレットの"-Encocing"を”Default"指定する方法が挙げられますが、
自分の場合、この方法で出力するとUTF8でファイルが出力されてしましました。

## 結論
日本語が含まれていないテキストを"-Encoding Default"で出力してもUTF8扱いとなる。

## 実例
実際にSJISファイルから日本語が含まれていない文字列のみを出力したファイルの文字コードを確認します。

### SJISファイルの作成
まずSJISのテキストファイルを作成します。
ファイル名：sjis.txt
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/47311094-af59-6699-7d21-ca617bc7f7cd.png)

尚Windows10標準のメモ帳だとSJISはANSI表記になります。

### 文字列の抽出
以下のコマンドラインで前出の"sjis.txt"から文字列"test"を抽出し、
ファイル名"extract.txt"として出力します。
※カレントディレクトリは"sjis.txt"を内包するディレクトリとする。

```powershell
Get-Content ".\sjis.txt" | ? {$_ -eq "test"} | Out-File -Encoding default ./extract.txt
```

この際に"-Encoding"オプションのパラメータを"Default"にします。
尚、このDefaultの値はシステムでアクティブとなっているコードページが使われるようです。
アクティブとなっているコードページは以下のコマンドで確認できます。
```powershell:コードページの確認
> chcp
現在のコード ページ: 932

> $OutputEncoding.WindowsCodePage
932
```
CP932はShift-JIS規格を基にマイクロソフトが独自に拡張したもので、
まぁとりあえずWindowsでのSJISの実装なんだと解釈しております。

もしDefaultのコードページが異なる場合、"-Encoding default"でSJIS出力されないので注意が必要です。

### 出力されたファイルを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/7d55a060-6d68-5db2-4e61-5969a405f2a6.png)

文字コードがUTF-8に変わっています。

### ファイルに日本語を追記する
先ほどUTF-8と化したテキストファイルに対して、
以下のコマンドを実行し日本語を追記します。

```powershell:日本語の追記
Add-Content .\extract.txt -Value "テスト" -Encoding Default
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/1b611a90-eed1-e90f-4a02-758c395f9102.png)

あら不思議
ファイルがSJISに変わってますね。

## 要因
**UTF8もSJISもASCIIに対する後方互換があるため。**

実はUTF8もSJISも7bit(0~127)までが共通である。
この範囲はASCIIコードの範疇でであり、アルファベットなど一部文字コード同じなのである。
故にアルファベットのみのテキストなどASCIIの範疇の場合は文字コードの判別が正しくできない。
もっと言えばどちらにも解釈できると言った方が正確かもしれない。

BOMのような仕組みがあれば、
テキストエディタはそれをもとに文字コードを判別するが、
BOMが無い場合などはエディタ各々のアルゴリズムに則り自動判別される模様。

先述の例の場合、
- 元のファイル「sjis.txt」から文字列"test"を抽出したファイル「extract.txt」はASCIIコード圏内のため、UTF8ともSJISともとれる。
- 実際にどちらで認識するかはエディタなどアプリ側の判別方法による。
- 日本語で文字列を追記することで、SJISとして認識される。アルファベットはASCIIコード圏内のためUTF８からSJISに解釈が移っても文字化けは起こらない。

こんなところでしょうか。

## 余談
細々した疑問はあるのだけれど一旦腑に落ちました。
また余裕のあるときにも掘り下げたいなと思います。
文字コードの世界は奥深く難しいですね。

## 参考
http://office-qa.com/win/win243.htm
Leetcode 2050. Parallel Courses III

https://leetcode.com/problems/parallel-courses-iii/

https://leetcode.com/problems/parallel-courses-iii/editorial/


```java
class Solution {
    public int minimumTime(int n, int[][] relations, int[] time) {
        int[] inDegree = new int[n];
        int[] maxTime = new int[n];

        ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            arrayList.add(new ArrayList<>());
        }

        for (int[] relation : relations) {
            arrayList.get(relation[0] - 1).add(relation[1] - 1);
            inDegree[relation[1] - 1]++;
        }

        Queue<Integer> q = new LinkedList<>();

        for (int i = 0; i < n; i++) {
            if (inDegree[i] == 0) {
                q.add(i);
                maxTime[i] = time[i];
            }
        }

        while (!q.isEmpty()) {
            int nowPoint = q.poll();

            for (int i = 0; i < arrayList.get(nowPoint).size(); i++) {
                int nextPoint = arrayList.get(nowPoint).get(i);

                inDegree[nextPoint]--;

                maxTime[nextPoint] = Math.max(maxTime[nextPoint] , maxTime[nowPoint] + time[nextPoint]);
                if (inDegree[nextPoint] == 0) {
                    q.add(nextPoint);
                }
            }
        }

        int result = 0;
        for(int m : maxTime){
            result = Math.max(result, m);
        }

        return result;
    }
}
```
【Swift】CIFilterで画像の線を強調する

# はじめに
CIFilter7日目です！

CIGaborGradientsを使用して線を強調します
垂直方向の線が緑の色、水平方向の線が赤い色になります。
これを活用して絵を描く際のサポートなんかになりそうです。

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2023-10-18 at 20.33.20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/35e3a079-e553-8625-c1e7-ec89c3d3c2da.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    private let image = UIImage(named: "sample")!

    @State private var uiImage: UIImage?

    var body: some View {
        ScrollView {
            VStack {
                if let uiImage {
                    Image(uiImage: uiImage)
                        .resizable()
                        .scaledToFit()
                } else {
                    Image(uiImage: image)
                        .resizable()
                        .scaledToFit()
                }

                HStack(spacing: 15) {
                    Button {
                        applyGaborGradientsFilter()
                    } label: {
                        Text("適用")
                    }
                    
                    Button {
                        uiImage = nil
                    } label: {
                        Text("リセット")
                    }
                }
            }
            .padding(.horizontal, 20)
        }
    }

    func applyGaborGradientsFilter() {
        let context = CIContext()
        let inputImage = CIImage(image: image)!

        guard let bokehBlurFilter = CIFilter(name: "CIGaborGradients", parameters: [
            kCIInputImageKey: inputImage,
        ]) else { return }
        guard let outputImage = bokehBlurFilter.outputImage else { return }
        guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return }
        self.uiImage = UIImage(cgImage: cgImage)
    }
}
```

# おわり
いろんなFilterが標準で搭載されててすごいですね
AIにはレベルがある！？

## なぜ調べたいと思ったか？
日常生活のあらゆる物にAIが導入されていることを知り、更に「4つのレベルに分かれている」とあったので、どんな違いがあるのか知りたかった。


・何を基準にしてレベルを分けているか
**「周囲の状況や環境によってどう振る舞うか」**


## 各レベルの内容と導入例
![E382B9E382AFE383AAE383BCE383B3E382B7E383A7E38383E38388-2019-02-09-2.06.49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/b00d99a6-520d-f61c-687f-f3d798cd7b16.jpeg)
画像参照元：https://kenyu-life.com/2019/02/09/g1_whatisai/

レベル1：単純な制御プログラム
周囲の環境によって振る舞い方が変わっても、その振る舞い方はあらかじめ決まっている。ルールに従った処理をするだけなので、人工知能の機能としては最も弱い。

導入例「エアコンの温度調整」
暖房20℃に設定した場合、室温が低いと温風を強くし、室温が高いと温風を弱くする。


レベル2：古典的な人工知能
多くの行動パターンを取り入れ、あらゆる状況に応じて様々な動きができる。機械学習している様に見えるが、AI自身で学習する機能はないので、あらゆるパターンデータを与える必要がある。

導入例「お掃除ロボット」
壁や机の脚などの障害物や下りる階段を検出して、掃除する方向を変える。


レベル3：機械学習を取り入れたAI
2000年代に普及したインターネットから、データを収集して学習データとして活用することができ、その特徴やルールを機械が学習する

導入例「高速道路の目的ICの到着時間」
目的ICまでの「高速道路の法定速度」や「交通量」を総合的に分析した多くの学習データを取り入れることで、正確な時間を検出することができ、交通インフラの改善に役立つ。


レベル4：ディープラーニングを取り入れたAI
機械学習にディープラーニングを追加したことによって、「AI自身が学習パターンを自発的に学ぶこと」が可能になった。物体の特徴である特徴量と正解データを紐づけて何回も学習すると、AIの予測精度が上がっていく。

導入例「車の自動運転」
交通標識・車線・人物や乗り物など、あらゆる対象物を検出し、衝突事故の起きない安全運転を再現している


・AIのレベルを理解することのメリットとは？
「どんな状況や環境があって、AI機能を利用したいか」を意識すれば、

「ルールに従って処理するのか、それとも、あらゆる状況に応じた処理をするのか？」
「用意したサンプルデータを使ってAIに学習するか、それとも、ディープラーニングを活用してAIに学習させるか？」

といった課題を解決しやすくなり、レベルに適したAIを導入しやすい。


・調べてみて分かったこと
①AI機能は機械学習やディープラーニングのイメージが強かったけど、エアコンやお掃除ロボットの様に、周囲の状況や環境に適した処理を行う部分は、AI機能の一種だと思った。
②レベルによってAIの機能が違うので、利用状況からレベルに該当するかを判断して、レベルに合ったAI機能を導入したい。
Unity ML-Agents個人的メモ

# Unity ML-Agents個人的メモ

- 最近ML-Agents使ってるのでそのメモ
- 要はバグ？記録


### 環境設定

- Pythonは64bit
- PyTorchのバージョンによるPythonのサポートを確認
- 環境に入るには，"env/Script/Activate"


### 実行時

- Behavierを置くときは同時にAgentが必要
    - Agentを継承したスクリプト置くことで代用可能
- mlagents-learnのオプションの値は等号一つでつなぐ
- "--env"と一緒にyamlファイルと"--run-id"が要る
- Decision Requesterは要る
- yamlファイルの2行目，behavier name? は実行する奴と同じにする


### スクリプト

- 引数として別のクラスを受け取るときは名前を共通させる←当たり前
    - Scene内でスコープは共有(一つの大きいファイルになってると考える)
    - 逆に言うと，Sceneが変わるとスコープはなくなる
- メンバ参照時はちゃんと"this"を付けよう！
- Behavior Parametersの"Vector Observation"や"Actions"のサイズはスクリプト側と揃える


### その他

- Raycastでrayが自分に当たる
    - 自分のLayerを変えて，Maskに含まれないようにする
gitを使い始めたあなたへ

## はじめに
gitというものを全く知らなかった私。
コードを保存してシェアして・・・というのもピンとこないまま
```ターミナル
 git ****
```
を言われるがままに打っていた日々。

ローカルやら、リモートやら
リポジトリ、、、ブランチ、、、さっぱりだったので図にしながら整理してみました。

現時点での理解を書き連ねますので
誤解があれば指摘してくださると嬉しいです！


## リモートとかローカルってどういうこと？
__リモート__ ：git上にプロジェクトごとに作った公共の場所
__ローカル__：自分のパソコン

図にするとこんな感じです
![スクリーンショット 2023-10-18 18.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574859/b20c9490-e964-059e-b57e-852447eb8810.png)

基本的には個々でローカルでコードを修正し、最終的にリモートに上げて
チームメンバーのコードを合体させる、という流れになります。

(参考)
 __リポジトリ__ (コードの格納庫)
　　- __ブランチ__　(ファイルとディレクトリの変更履歴を含む)
   <font color=gray>※リポジトリの中に複数のブランチがある<font/>

## fetchやmergeをすると何が起こる？
リモートには __origin__ という __ディレクトリ__ がいて、
その中に __master__ という __統合ブランチ__ がいるのが基本で
<font color=red>この統合ブランチが最終的な製品のコードになります。<font/>

```git fetch``` をすると
リモートリポジトリの情報が全てローカルのサブブランチに格納

```git merge``` をすると
ローカルとfetchした内容をローカルと合体させる
(コンフリクト注意な部分ですね)

![スクリーンショット 2023-10-18 18.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574859/18fac079-1f01-5da0-cc49-02d363b369b1.png)

## 他にもよく使うコマンド


``` git pull```
fetchとmergeを一気にできる


```git commit```
リモート側に変更を送るための土俵に乗せる
.git/object　に情報が格納されるようです

```git　push```
.git/object　に格納されていた情報をリモートに送りリモート側を更新する

```git checkout```
ローカル内にあるブランチ間を移動するときに使う。
リモートのブランチに直接入ることはできないので、
その場合はfetchしてからローカル内で移動する。



## さいごに
gitに関する色んな解説ページを見かけますが、
人それぞれ解釈しているので、正直なんとなくでも理解して、
コード管理に困ることがなければとりあえずいいのかも、と思ってしまったりしました。

”なんとなく理解”の次元までまだ達していないので、
これからも引き続き分かったことなど書き足していこうと思います。
<font color=gray>（↑このニュアンスの文言を最後に書く記事ばかりになってきました😅)<font/>
FlutterのWidgetの基礎part3

# はじめに
前回に引き続きFlutterの基本的なWidgetについて書いていきます。

## Text Widget
Textウィジェットは画面にテキストを出力してくれます。

```
サンプルコード

home: Scaffold(
  body: Text(
     'Loading Screen',
      style: TextStyle(
            fontSize: 30,
　　　　　　 color: Colors.blue
      ),
    ),
  )
```
styleは、文字の大きさ、文字の色などを変更できます。
今回はフォントサイズを30、文字色を青色にしています。

## TextField Widget
TextFiledウィジェットはユーザー側のキーボード入力を受け付けるWidgetです。
メールアドレスやパスワードの入力欄が必要なログイン画面には必須のWidgetです。
```
サンプルコード
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sample'),
      ),
      body: Container(
        width: double.infinity,
        child: TextField(),
      ),
    );
  }
```
## Button Widget
ボタンを表示用するにはButton Widgetを使用します。
Button Widgetの基本的なものは以下の3種類があります。
・TextButton → 影のないボタン
・OutlinedButton → 枠線のあるボタン
・ElevatedButton → 影のあるボタン
各ボタン表示用Widgetの基本的な使い方としては、child Widgetにボタン内に表示したいWidgetを指定し、
ボタンがタップされた時の処理は、onPressedに記述すれば大丈夫です。 
```
TextButton(
  onPressed: () { /* ボタンがタップされた時の処理 */ },
  child: Text('TextButton'),
)

OutlinedButton(
  onPressed: () { /* ボタンがタップされた時の処理 */ },
  child: Text('OutlinedButton'),
)

ElevatedButton(
  onPressed: () { /* ボタンがタップされた時の処理 */ },
  child: Text('ElevatedButton'),
)
```
## Image Widget
画像を表示するWidgetです。
インターネット上の画像を表示する場合は以下のように書きします。
```
Image.network(
  'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg',
)
```
アプリ内のローカル画像を表示する方法であるImage.assetについては下記の記事が参考になりました。
- [［Flutterで画像を表示する方法【まとめ】](https://www.youtube.com/watch?v=OuUvjkSmcwo&list=PL3nfHFjHVxFa23wq1wlZD6NswfBMxvGnG&index=8)

## まとめ
今回はText Widget、Button Widget、Button Widget、Image Widgetについて簡単にまとめてみました。
まだ理解しきれていない部分も多いので間違っている箇所あればぜひコメントいただけると幸いです。
最後までご覧いただきありがとうございました！
BigQueryで過去の状態のテーブルを参照するクエリ

```sql
SELECT
  *
FROM
  `テーブルパス` FOR SYSTEM_TIME AS OF 
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 DAY)
```
`INTERVAL 6 DAY` の `6` を所望の日にすることで遡る日を指定可能
blastengineのNode.js SDKでメールのログを取得する

[blastengine](https://blastengine.jp/)は開発者にとって使いやすいメール配信サービスを提供しています。今回はNode.js SDK向けに実装した配信一覧・配信ログ一覧取得機能について紹介します。

[blastengine - npm](https://www.npmjs.com/package/blastengine)

## 配信一覧・配信ログ一覧機能について

配信一覧と配信ログ一覧では以下のような違いがあります。

- 配信一覧には未送信のバルクメール（一括配信メール）が含まれます
- 配信ログ一覧には、開封日時が含まれます
- 配信ログ一覧は、個別のメールアドレスごとに結果を取得できます
- 配信ログ一覧は、SMTPリレーの結果も取得できます

## ユーザ登録する

blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします（ユーザIDは後で使います）。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/db1d2394-7bdc-a986-5f17-acb25d927c42.png)

## 送信元ドメインのSPFを設定する

送信元として利用するドメイン（自分で持っているもの）の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

```
txt @ v=spf1 include:spf.besender.jp ~all

```

## APIキーを取得する

ログイン後、管理画面の右上にある設定メニューに移動します。

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/47b2b2ac-2e41-77fe-d84f-0ae0b7541f36.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/47b2b2ac-2e41-77fe-d84f-0ae0b7541f36.jpeg)

そして設定の中で、APIキーを取得します。

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2b5ca124-3020-1d39-84e4-911cd4db27e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2b5ca124-3020-1d39-84e4-911cd4db27e2.png)

## 必要な情報について

SDKを使う上で必要なのは、先ほどのAPIキーとユーザIDになります。

## SDKのインストール

SDKは npm コマンドでインストールできます。

```
npm i blastengine
```

## SDKのインポート

まずSDKをインポートします。エラーレポート用のErrorReportも取得します。

```jsx
import { BlastEngine, Mail, Log } from 'blastengine';
```

## 初期化

先ほどのAPIキーとユーザIDを使って初期化します。

```jsx
new BlastEngine(YOUR_USER_ID, YOUR_API_KEY);
```

# 配信一覧を取得する

配信一覧はMailクラスにて取得します。結果はトランザクションメール（Transaction）またはバルクメール（Bulk）クラスの配列です。

指定できるパラメーターは[blastengine 配信一覧API](https://blastengine.jp/documents/#tag/deliveries)に依ります。

以下は編集中のバルクメールを一覧取得して、それを削除するコードです。

```jsx
const mails = await Mail.find({ size: 100, delivery_type: ['BULK'], status: ['EDIT'] }) as Bulk[];
for (const bulk of mails) {
	await bulk.delete();
}
```

# 配信ログ一覧を取得する

配信ログ一覧はLogクラスにて取得します。結果はLogクラスのインスタンスの配列です。

指定できるパラメーターは[blastengine 配信ログ一覧API](https://blastengine.jp/documents/#tag/logs/operation/log-list)に依ります。

以下はSMTPで配信したメールのログを取得するコードです。

```jsx
const logs = await Log.find({ delivery_type: ['SMTP'] });
```

# まとめ

配信ログ一覧を使えば、配信したメールが開封されたかをAPIベースで取得できます。また、SMTPリレーで配信されたデータを取得するのにも利用できます。ぜひ運用で活用してください。

blastengineではAPIベースの他、SMTPリレーによるメール配信も利用できます。APIの場合、大量の宛先に対する一括配信も利用できますので、ぜひSDKとともに利用してください。

[エンジニア向けメール配信システム「ブラストエンジン（blastengine）」](https://blastengine.jp/)
【学習メモ】DynamoDBのRCU・WCUの算出

# RCU（読み込みキャパシティーユニット）
・1つのRCUは、1回の読み取りサイズが最大「4KB」
　→「4KB未満（1~3KB）」の場合でも、1RCUを消費
　→「4KB以上（5~8KB）」の場合は、二つ目のRCUを消費

・**結果整合性**の場合、「1つ」のRCUは「1秒」あたり、最大サイズ「4KB」のデータを「2回」読み込める

・**強力な整合性**の場合、「1つ」のRCUは「1秒」あたり、最大サイズ「4KB」のデータを「1回」読み込める
　→最新のデータを追求するので、RCUちゃんのエネルギーが消費されたか。。。

# WCU（書き込みキャパシティーユニット）
・1つのWCUは、1回の書き込みサイズが最大「1KB」
　→「1KB未満（500バイトとか）」の場合でも、1WCUを消費
　→読むより、書くほうが大変か。。。

・「1つ」のWCUは「1秒」あたり、最大サイズ「1KB」のデータを「1回」読み込める
     →やっぱ読むより書くほうが大変ね。。。

# 参考サイト
https://zenn.dev/takamin55/articles/43fa3ff18a5f4f
Kotlin: プレイグラウンドの使い方

[Kotlin のプレイグラウンド](https://developer.android.com/training/kotlinplayground?hl=ja)

サンプルで入力したプログラム

```kt:pythagorean.kt
fun main() {
    println("*** start ***")
    val ax : ArrayList<Double> = arrayListOf()
    
    var nn = 0
    val nmax = 50
    for (it in 1..nmax){
        for (jt in it..nmax){
            val itjt2 = it*it + jt * jt
            for (kt in jt..nmax){
                val kt2 = kt * kt
                if (itjt2 == kt2){
                    val ratio = it.toDouble() / jt.toDouble()
                    if (!ax.contains(ratio)){
                    val outstr = "" + nn + "\t" + it + "\t" + jt + "\t" + kt + "\t" + ratio
                    println(outstr)
                    ax.add(ratio)
                    nn += 1
                    }
                }
            }
            }
    }

  println()
    println(ax)
    println("*** end ***")
}
```

実行結果

```text
*** start ***
0	3	4	5	0.75
1	5	12	13	0.4166666666666667
2	7	24	25	0.2916666666666667
3	8	15	17	0.5333333333333333
4	9	40	41	0.225
5	12	35	37	0.34285714285714286
6	20	21	29	0.9523809523809523

[0.75, 0.4166666666666667, 0.2916666666666667, 0.5333333333333333, 0.225, 0.34285714285714286, 0.9523809523809523]
*** end ***
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d22dfed4-c158-e31a-db2c-1afc42ecc56d.png)

## 参考
次のサイトでも、Web で Kotlin の実行が出来ます
[paiza.io](https://paiza.io/ja)
[https://play.kotlinlang.org/](https://play.kotlinlang.org/)
【Python】boto3でprofileが参照できずにThe config profile () could not be foundとなる

# はじめに
PythonでAWS SESのmockをしたテストを書こうとしたところ、profile参照のエラーに遭遇したので解決方法を簡単にまとめてみます。

# バージョンなど
- Python 3.9
- boto3 1.26.137
- moto 4.2.5

# エラー
```
 botocore.exceptions.ProfileNotFound: The config profile () could not be found
```

# 該当コード
```python
import pytest
from moto import mock_ses
import boto3

@mock_ses
def test_send_email():
    session = boto3.Session(profile_name='hoge')
    ses = session.client('ses', region_name='ap-northeast-1')
 略
```

# 原因
boto3.Sessionの引数にprofile_nameを指定していたが、コンテナを起動時にAWS_PROFILEが空になっていたことが原因でした。

# 解決方法

参照しているプロファイルが正しいことを確認
```
$ echo $AWS_PROFILE
```
プロファイルを追加する場合は以下を実行して情報を追加
```
vi ~/.aws/credentials
```

参照したいプロファイルに切り替える
```
$ export AWS_PROFILE=hoge
```

これでSESのmockに成功し、テストを実行できました。mockなのでAWS認証情報はダミーで良いのですが、ライブラリがprofileを参照しにいってしまうため、参照できるようにしてあげる必要があります。


# おわりに
profileを追加しても切り替えないと参照できない点にも注意が必要でした。
Chrome拡張機能のVueのdevtoolを使えるようにする

## したいこと

- Vueで開発途中でChromeの拡張機能である`Vue.js devtools`を使えるようにしたい

該当の拡張機能↓

https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja


## 用途

- vueで開発途中storeの情報を見たい時に使用します



## 使用方法

#### ① 上記URLにアクセスして拡張機能をインストールします


#### ② 画像赤枠部分をクリックして拡張機能を表示させます
![スクリーンショット 2023-10-18 18.01.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/131052cd-72c0-e3c1-e59b-85fa92b921a9.png)

#### ③ 画像の「︙」をクリック後に「拡張機能を管理」をクリックします

![スクリーンショット 2023-10-18 18.03.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/fcd54383-8674-f462-6159-d9b3d1011c6c.png)


#### ④ 画像赤枠部分の「ファイルへのURLアクセスを許可する」をクリックします

![スクリーンショット 2023-10-18 18.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/e6137273-8e5a-7bee-03ec-ec350fa6371e.png)


#### ⑤ ご自身が使用しているローカルサーバー（例：localhost:3000など）にアクセスして検証ツールを開きます。

#### ⑥ 画像赤枠部分の「>>」クリックします
![スクリーンショット 2023-10-18 18.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/eecd0e6f-884a-6fde-4226-0fccdc1650a6.png)


#### ⑦ 画像の「Vue」をクリックします

![スクリーンショット 2023-10-18 18.16.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/c4a9bd34-41b3-02d8-55e2-9213273268fb.png)


#### ⑧ 画像のようになっていればokです

![スクリーンショット 2023-10-18 18.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103633/89456823-20a2-794b-8ccc-595438ca0d05.png)


以上です
jestでexportされていないメソッドを他の外部ライブラリ使わずモック

## 背景
jestでspyOnとかでモックするとき基本はメソッドをexportさせる必要がある。
しかし、privateなメソッドの場合それができない。
privateであるべきメソッドをモックのためだけにexportつけるのもアレだし、1つのファイルからしかアクセスされないのに別ファイルにしてexport対象なメソッドに無理やりするのもアレなのでなんとかしたい

# 改善方法
以下のようにrequireActualで内容持ってきてindexMock変数に入れている。テスト対象メソッドの戻り値を指定して、indexMock経由でテスト対象メソッドを呼びます。
※「testHelper」はexportをつけないテスト対象メソッドをjestで実行するようにするための仕組みのプログラムで持ってきていますがここでは割愛します。

```typescript:hoge.ts
    const indexMock = jest.requireActual(
      '../../src/フォルダ名/index'
    )

    indexMock.hoge = jest.fn().mockImplementation(() => {
      return 任意の返却値
    })

    const actual =
      indexMock.testHelper.テスト対象メソッド(引数)

    // 判定
    expect(actual).toStrictEqual(任意の期待値)
```

これで、privateなメソッドもモックできた。
TypeScript 基本

# TypeScriptとは
TypeScriptは，JavaScriptを拡張して開発されたOSSのプログラミング言語で，2014年ごろMicrosoftによって開発された．
TypeScriptで書かれたコードをコンパイルするとJavaScriptのコードに変換される．

# TypeScriptの特徴

### JavaScriptとの互換性
TypeScriptはJavaScriptを拡張したものなので同じ構文が利用できる．また，TypeScriptで書かれたコードはコンパイルするとJavaScriptのコードに変換されるため，JavaScriptのライブラリなどを利用することができる．

### 静的な型付け
TypeScriptは変数や関数の型を明示的に指定する．これにより，コンパイラが型エラーをチェックしてくれるため，実行時のエラーを減らすことができる．

**JavaScriptの場合(動的型付け)**
```jsx
var x = 1;
x = 'Hello'; 
```
変数宣言でxに数字を入れて，その後に文字列を入れてもエラーは起きない．

**TypeScriptの場合(静的型付け)**
```jsx
var x: number = 1;
x = 'Hello';
```
変数宣言でnumber型としてxに数字を入れているため，型の違う文字列を入れると<font color="red">コンパイルエラー</font>が発生する．

# 型の種類

| number | 数値型 |
| --- | --- |
| string | 文字列型 |
| boolean | 真偽値型 |
| null | null型 |
| undefined | undefined型 |
| any | すべての型を許容する |
| type[] | 配列型，typeには基本データ型が入る(number[]，string[]) |
| Array<type> | 配列型，typeには基本データ型が入る(Array<number>，Array<string>) |

type文を用いて，型に別名をつけることができる．

# 型の書き方

## 変数
```tsx
var name: string = '太郎';
var age: number = 20;
var other: any = 'その他';
var favorites: Array<string> = ['soccer', 'movie', 'eating'];
```
変数名の横に`:type`で型を指定する．

## 関数
```tsx
function example(name: string): void{

}
//アロー関数の場合
const example = (name: string, age: number): number => {
	return 0;
}
```
関数の引数の横に戻り値の型を指定する．戻り値がない場合はvoidを指定する．

## オブジェクト
```tsx
//オブジェクト型の宣言
interface Person{
	name: string;
	age: number;
	isStudent: boolean;
	gender?: string;
}

//オブジェクトの作成
const person: Person = {
	name: 'Alice',
	age: 30,
	isStudent: false
	//genderがなくてもエラーにならない
};
```
オブジェクトの型を定義する場合は，interfaceを使用して，プロパティの型や構造をしてする．
プロパティ名に[?]をつけると，オプション化することができ，<ins>プロパティが存在しないことを許可</ins>する．

## タプル
```tsx
const person: [string, number, boolean] = ['太郎', 20, true];

console.log(person[0]); // => 「太郎」を出力
```

## 型エイリアス
```tsx
type name = string;
const username: name = '太郎';　// これと同じ→　const username: string = '太郎';
```
typeを利用して既存の型に別名をつけることができる．これにより，複雑な型を簡潔に表現することや再利用性を高めることができる．

## ユニオン型
```tsx
const union: string | number = 10; 

union = 'taro'; //　エラーは発生しない
union = true; // エラー発生
```

`|`を利用することで，変数などに複数の型を指定できる．指定したものならエラーは発生しない．

## インターセクション型

```tsx
type A = { x: number };
type B = { y: number };
type C = A & B; // C型は { x: number, y: number } という構造を持つ
```

&を利用して，複数の型を結合して新しい型を作ることができる．

## enum型[列挙型]

```tsx
enum SIZE {
	Small, // 0
	Medium,// 1
	Large  // 2
}

const size: SIZE = SIZE.Medium;
console.log(size); // 1
```

特定の一部連の定数に対して，意味のある名前をつけるための型．これに処理，enumで定義されていない文字列を代入してしまう可能性がなくなる．定義されたものにはインデックスが割り当てられている．
(ちなみにenum型は非推奨らしい．)
Generate Signed Bundle/APKが表示されないとき

Generate Signed Bundle/APKが表示されない時は，プロジェクトのandroidディレクトリを直接andoridstudioで開くと解決する．
具体的には，androidstudioを開いて一番右のopenから該当のandroidディレクトリを選択．ロードが終わると，上部のbuildより選択できるようになる．
よく使うMarkdown記法まとめ

Markdown記法のうち、私がよく使うものをまとめていきます。
これから先色々な記事を書いていく上で、「これもよく使うな」と思ったものは追加していきたいなと思います。

__最終更新:2024/11/03__

# 見出し　：　# 見出し
## 見出し　：　## 見出し

```
コードブロック
```
\```
コードブロック
\```

`コード`　：　\`コード`

`` `コードの中にシングルクォーテーション` ``　：　\`\` \`コードの中にシングルクォーテーション` ``

_italic_　：　\_italic_　または　\*italic*



__強調__　：　\_\_強調__　または　\*\*強調**

~~打消し~~　：　\~~打消し~~

[リンク](http://qiita.com)　：　\[リンク](http://qiita.com)

- 箇条書き　：　- 箇条書き　または　+ 箇条書き　または　* 箇条書き　(-+*の後に空白が必要）
    - 箇条書き　：　〇- 箇条書き　(〇はtab)

> 引用　：　> 引用

:::note info
インフォメーション
:::

\:::note info
インフォメーション
\:::
または
\:::note
インフォメーション
\:::

:::note warn
注意
:::

\:::note warn
注意
\:::

:::note alert
警告
:::

\:::note alert
警告
\:::

 表 | 表
 ---- | ---- 
 セル | セル 
 セル | セル 
 セル | 表内 <br> 改行

```
 表 | 表 
 ---- | ---- 
 セル | セル 
 セル | セル 
 セル | 表内 <br> 改行
```

\`\` \` \`\`
`` ` ``

※ 記号の前に空白または改行が必要なものが多いです。
※なお、　\_italic_　などと表示するためには、　\\\_italic_　のように記述します。

#### 参考
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)
ロジカルな話し方 -超入門-

# はじめに
別所栄吾さんの本『「お前の言うことはわけがわからん! 」と言わせないロジカルな話し方超入門』に、話し方の基本がとてもすっきりと書かれてわかりやすかったので、基礎の部分だけでも共有したいと思います。
 
 https://amzn.asia/d/1FaViHP

### どんな時に使えるのか？
日常会話やビジネスシーンで利用できます。

「おや？自分の意図が伝わっていないな。」「相手が自分の話について理解が追い付いてないな。」「最近、"わかりにくい"ってよく言われるな。」と思う方は、どんな話し方がわかりやすいのか、この本を読んで改めて基礎に戻ってみましょう。

# 結論
![三角ロジック主張事実理由づけ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363329/47dc2e59-2b08-4c6b-a8f5-68d052d2176b.gif)

>『主張』『事実』『理由づけ』の三角ロジックを完成させれば、自分の考えを相手に理解してもらえる。

相手が理解するために必要な情報はズバリ3つ、『主張』『事実』『理由づけ』です。
この3つの要素で『三角ロジック』を構成することで、自分の考えを相手に理解してもらいやすくなります。

自分の『主張』を理解してもらうためには根拠が必要で、その根拠とは『事実』『理由づけ』の総称です。
『主張』を相手に納得してもらえない時は、根拠のどちらか欠けていることが多く、
逆に根拠だけを述べて『主張』がない場合は、相手から「だからなに？」と言われてしまうことがあります。


①『事実』：事例やデータ
②『理由づけ』：なぜそのデータから主張が導かれるのかという判断基準、価値観


# 三角ロジックを作成するときのポイント
簡単にまとめると、ポイントは２つです。
#### ① 情報を整理してから伝える
情報を整理せず、状況の再現をしながら話すと、相手が判断する上で必要な情報を列挙することになり、混乱を招きます。しっかり『主張』『事実』『理由づけ』を意識してまとめてみましょう。

#### ② 相手が共感できる理由を付ける
ただ理由づけだけをしても、相手から見て的はずれであったり共感できないと、納得してくれません。



# 試しに三角ロジックを使ってみる
さっそく三角ロジックを使ってみましょう。
本に掲載されていた例をもとに使い方を解説していきます。

### 根拠を伝えよう
例えば、未成年者にお酒はダメだと伝えたい時、どちらの言い方が納得してもらえそうでしょうか？
<br>例1：
>主張：未成年者は、飲酒をしてはならない。
>事実：法律によって、未成年者の飲酒は禁じられているからだ。
>理由づけ：？

<br>例2：
>主張：未成年者は、飲酒をしてはならない。
>事実：身体は大きくても内臓や精神はまだ子どもだから、飲酒は悪影響。
>理由づけ：未成年の命や健康を守りたい。
<br>
【解説】
例1では『事実』だけを伝えているので、なぜ法律で禁じられているのか、根本的な理由がわかりません。
ちゃんと未成年者に納得してもらうには、なぜそのような法律があるのか、本質的な説明が必要です。

例2のように、『事実』から『主張』を導く『理由づけ』をしましょう。

![根拠を伝えよう.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363329/1d298ba6-9cd9-0c3d-875e-c27ac1d313bf.gif)

　
### 主張を伝えよう
今度は『主張』『事実』『理由づけ』のカテゴライズ無しで見てみましょう。
居酒屋で仕込み中の店主が、何か不安そうに店員へ言いました。
店主はどんなことを伝えたかったのでしょうか？

<br>例3：
昨日の夜からずっと雨だよね。雨の日はいつも来客が少ないからなぁ。
<br>


【解説】
まずは例3に出てきた情報をカテゴライズしてみましょう。

事実：昨日の夜からずっと雨
理由づけ：雨の日はいつも来客が少ない

三角ロジックを完成させるには『主張』が足りないようです。
他にも「この後の営業時間中も雨なのか」は言っていないので、『事実』と『理由づけ』がつながりません。
『主張』として「今日の仕込みの量は減らした方が良い。」等付け足し、『事実』として「昨日の夜から雨だ、この後の予報もずっと雨だ」と伝えるとグンとわかりやすくなります。

![主張を伝えよう.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363329/b843a1e3-6f7c-7803-8065-4f43ba177753.gif)


# 応用してみる

### 三角ロジックを組み合わせる
著者別所栄吾さんは、本の中で下記のように言っています。

>三角ロジックの3つの情報だけでは、説明しきれない場合があります。

そんな時は、複数の階層を活用して、『事実』『理由づけ』に対しさらに三角ロジックをつなげるとより根拠のある話し方になります。
議論するときにはよいでしょう。

![三角ロジック_応用編階層化_理由づけ版.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363329/5fb2daf0-64e4-00a1-b6df-d80da858d0a8.gif)


# 最後に
いかがだったでしょうか。
三角ロジックは、難しくなく、簡単なポイントで構成されているので覚えやすいと思い今回ここで共有してみました。
日常会話や、お仕事中にちょっと気を付けて話してみたりするのもいいかもしれません。
他にも、この三角ロジックを自分の中で習慣づけていくことで、自分が何か相手に話をするときだけでなく
相手から話を受けているときによい質問ができそうだと思います。

他にも共感されるストーリーの作り方や、更に話が伝わりやすくなるテクニックが本書に記載されていますので、興味をお持ちの方は本日ご紹介した本、『「お前の言うことはわけがわからん! 」と言わせないロジカルな話し方超入門』をご覧ください。

ここまで読んでいただきありがとうございました！
OpsRamp ServiceDeskのステータスフローの設定方法について

本記事では、OpsRamp ServiceDeskのステータスフローの設定方法について説明します。

# 概要
OpsRampのServiceDeskには、チケットのステータス遷移を制御するステータスフローを設定することができます。

:::note info
バージョン2023.08-U1でクライアント単位でもステータスフローを設定することができるようになりました。
:::

# 設定方法
Setup > Service Desk > Status Flowsから設定することができます。

:::note warn
クライアントを使用しない場合、パートナースコープに適用されます。
パートナースコープで作成したステータスフローはパートナーユーザに、クライアントスコープで作成したステータスフローはクライアントユーザに適用されます。
:::

![statusflow-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/a22dafa4-6bed-7bb0-bc5a-cf6df19118ae.png)

使用可能なステータスを選択することが可能です。
「New」、「Open」、「Closed」は必須ステータスとなり、「Pending」、「On Hold」は有効・無効を選択することが可能です。
![statusflow-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/2317eb50-dc64-0a2a-b8cf-f4244b3dbeab.png)

依頼者(=チケットをリクエストしたユーザ)および受信者(=チケット担当者)でステータスの遷移マトリックスを設定します。チェックを入れるとそのステータスへの遷移を許可することが可能です。
![statusflow-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/8b8feb5a-049e-0246-2f6e-39b9c0d6f9ce.png)

設定したステータスフローを割り当てるチケットタイプを選択できます。
![statusflow-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/4ed8c10b-16cf-7560-50b5-c138b7400ca0.png)


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
pyinstallerのexe化で画像ファイルを埋め込む方法


PythonでGUIアプリを開発していて、最終的にpyinstallerでexe化して配布する必要があり、画像ファイルをexeファイルに埋め込む必要があったので、そのやり方を簡単にまとめてみました。

## 動作環境
- os: win11
- python: 3.9
    - customtkinter: 5.2.0
    - Pillow: 10.1.0
    - pyinstaller: 6.0.0

# 困ったこと
コマンドのオプションで同梱するファイルを指定したり、pyinstaller用のspecファイルのdatasに同梱するファイルを追記するなどの記事を見つけたので試したのですが、うまくいきませんでした。（参照する画像ファイルがデバイス上に存在しないと「ファイルが見つからない」とエラーが出る）

# 解決方法
コマンドオプションかspecファイルの書き換えでなんとかなるかもしれないですが、今回開発しているのは小規模のアプリで、参照する画像ファイルも少ないのでpyファイルに直接埋め込めばいいのかなと思いました。

## 画像ファイルをbase64でエンコードする
下記のように、画像ファイルをbase64でエンコードし、base64_imgという変数に格納します。
（今回はcustomtkinterというGUIライブラリを使います）

```python: 例
import base64
import io

import customtkinter
from PIL import Image


app = customtkinter.CTk()
app.geometry("800x600")

base64_img = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDA...(省略)...Qh3xB4g="

image_data = base64.b64decode(base64_img)
pil_image = Image.open(io.BytesIO(image_data))
ctk_image = customtkinter.CTkImage(pil_image, size=(800, 600))
image_label = customtkinter.CTkLabel(app, image=ctk_image, text="")
image_label.pack()

app.mainloop()
```

（こんな感じです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/35f0256b-0daf-4223-c67b-b0121d914b22.png)



ちなみにファイルをバイナリで取り込むこともできます。
```python: 例
import io

import customtkinter
from PIL import Image


app = customtkinter.CTk()
app.geometry("800x600")

binary_img = b"\xff\xd8\xff\xe0\x00(省略)..."
pil_image = Image.open(io.BytesIO(binary_img))
ctk_image = customtkinter.CTkImage(pil_image, size=(800, 600))
image_label = customtkinter.CTkLabel(app, image=ctk_image, text="")
image_label.pack()

app.mainloop()
```

exe化後、（デバイス上に参照する画像ファイルがなくても）exeファイル単体で実行できるようになります。
macOS SonomaにしたらGitが動かなくなった

macOSのアップデートをするとGitが動かなくなる現象ありますが、今回も発生しました。

## macOSのアップデートと環境

今回はv14 Sonomaのアップデートですが、[前](https://qiita.com/n0bisuke/items/1c60084c8c07b690d693)に記事を書いた時などと違ってMabBookのマシン自体が違うので少し前提が違うかもしれません。

> ![](https://i.gyazo.com/59dbfb368018ada5abde34c4017e013e.png)

- MacBook Air M2
- Xcodeがインストール済
- macOS Sonoma

昔はXcodeは入れずにコマンドラインツールだけ使っていました。

## 出たエラー

```bash
You have not agreed to the Xcode and Apple SDKs license. You must agree to the license below in order to use Xcode.
Press enter to display the license:
```

とのことでライセンス認証というか同意しろみたいな感じでした。

調べると

```bash
sudo xcodebuild -license
```

とコマンド実行することで回避できそうな記事がよく出てきますが、こちらでは僕の環境では特に変化がなかったです。

## Xcode起動からのボタンでいけた

もしかしたらXcodeがインストールされているか否かで挙動が変わるのかもですが、OSのアップデート後にXCodeを起動して出てくる同意画面で同意することでうまくいきました。

> ![](https://i.gyazo.com/7b7b18810a0aa2127df9997a552fc2e4.png)

よくある感じになってきた。

## 参考

https://qiita.com/n0bisuke/items/1c60084c8c07b690d693
【ExcelVBA】配列による読み書き処理を分割した場合の処理時間検証（大容量データを扱う場合）

:::note warn
本記事では処理速度検証を行っていますが、正直やり方に自信がありません。
ご意見ください…。
:::

事の発端は、
「10万行を超えるCSVデータの読込等の処理をVBAで自動化したが、時間が掛かり過ぎる。」
というものでした。
本件についてChatGPT様に相談させていただいた所、
「PC環境にもよるさかい、試行錯誤や性能テストが必要じゃろ？」と仰られたので、検証させていただくものです。
# 検証方法
・10万行×100列データの読み書きを想定。
・10万÷n行×100列の配列を宣言しデータ格納　→　ワークシート上にn回に分けて書き出す。
・1回の書き出し毎に`Erase`ステートメントで配列に割り当てたメモリを解放する。
　→　配列宣言に最適な要素数を判定

:::note info
処理時間自体は一般的に`Application`の以下のプロパティ変更で高速化される余地がありますが、今回は割愛しております。  
　`.Calculation = xlCalculationManual`  
　`.EnableEvents = False`  
　`.ScreenUpdating = False`
※上記プロパティ変更を実行する場合は、処理実行後に元に戻すことを忘れずに！
:::


# 検証画面及びソースコード
ソースコード類は[こちら（GitHub）](https://github.com/takayuki818/Verification-of-processing-time-when-reading-and-writing-data-is-divided/tree/main)　※結果が見えちゃってるのはご愛敬
![検証画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573797/4e0a7276-090a-4eb0-df72-de46693d1cb9.png)
```vb
Sub 配列分割読み書き検証()
    Dim 分割数 As Long, 回 As Long, 行 As Long, 列 As Long, 値 As Long
    Dim 始時 As Date, 終時 As Date
    With Sheets("配列分割テスト")
        分割数 = .Range("分割数")
        If Int(100000 / 分割数) <> 100000 / 分割数 Then
            MsgBox "除算の余りが生じています" & vbCrLf & "10万を割って余りの出ない分割数を入力してください"
            Exit Sub
        End If
        始時 = Now
        For 回 = 1 To 分割数
            ReDim 配列(1 To 100000 / 分割数, 1 To 100)
            For 行 = 1 To 100000 / 分割数
                For 列 = 1 To 100
                    値 = 値 + 1
                    配列(行, 列) = 値
                Next
            Next
            Range(.Cells(7 + 100000 / 分割数 * (回 - 1), 4), .Cells(7 + 100000 / 分割数 * 回 - 1, 103)) = 配列
            Erase 配列
        Next
        .Cells(7, 4).Resize(100000, 100).ClearContents
        終時 = Now
        .Range("処理時間") = (終時 - 始時) * 24 * 60 * 60
        .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = 分割数
        .Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = .Range("処理時間")
    End With
End Sub
```
# 検証結果
1,2,4,5,8,10及び100,200,400,500,800,1000に分割して検証しましたが、
自身のPC環境下での処理時間は毎回20～22秒とほぼ変化がありませんでした。
# まとめ
ChatGPT様は「実に興味深い…PCスペックとか検証コード自体が最適でない可能性もあるで。精進しいや。」と仰られました。

Excelの限界を感じるので、Accessとの連携を視野に処理速度改善を検討したいと思います…。
macOSでHomebrew

エンジニアにはお馴染みのHomebrew。
今更感もありますが、macOSへの導入等々。

# Homebrew
言わずと知れたmacOSまたはLinux用のパッケージマネージャ。
![スクリーンショット 2023-10-18 12.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/43b4e509-b81d-f412-6d01-d7e22a27ad59.png)
macOSには標準インストールされていない様々なパッケージのインストール作業を管理できるシステム（アンインストール、バージョンアップ等も）

# インストール
このHomebrew自身もmacOSには標準では入っていないので、まずはインストールしていきます。

**[注意]**
Homebrewをインストールするには*Xcode command line tools*(CLT)が必要です。
事前にインストールしておきましょう。
Xcodeをインストールしていれば通常は一緒に入っていると思いますが、入っていない場合インストールします。
[Apple Developer](https://developer.apple.com/download/all/?q=for%20Xcode)のMore DownloadページからCommand Line Tools for XcodeのPKGファイルをダウンロードしてインストールするか、ターミナルで
`$ xcode-select --install`
と入力してダウンロード&インストールしましょう。



CLTがインストール完了したら[Homebrew](https://brew.sh/ja/)にアクセス。
アクセスするといきなりインストールするためのスクリプトのURLが表示されています。
![スクリーンショット 2023-10-18 12.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/c65a197c-6427-2667-5d02-b53b2094bd61.png)
「インストールはこちら」とかあちこちのリンクに飛ばそうとしない仕様はありがたいdせう。

.pkgインストーラもあるようですが、今後の管理もターミナルで作業することが多いと思うので、こちらもターミナルからインストールしましょう。

ターミナルを開いて、コピーしたスクリプトを貼り付けてEnter。
あとは自動でインストールが進んでいきます。
パスワードを聞かれた場合、使っているMacのパスワードを入力します。

環境によっては途中で
*`Press RETURN to continue or any other key to abort`*
と表示される場合がありますが、その際は何かキーを押して続行してください。

*`Installation successful!`*
と表示されたらインストール完了です。

# インストール完了の確認
問題なくインストールされたか確認します。
ターミナルで
`$ brew --version`（もしくは`brew -v`）
を実行します。

`Homebrew 4.1.16`
`Homebrew/homebrew-core (git revision f09bff71cc0; last commit 2023-10-17)`

というような内容が表示されれば問題なくインストールできています。

もし`zsh: command not found: brew`というようなメッセージが出た場合、brewを実行するためのPATHが通っていない可能性があります。
brewがインストールされている場所を確認してPATHを通してあげましょう。
（通常は/usr/local/bin/以下にbrewがインストールされていると思います）

# brewのバージョンアップ
大抵の場合、上記作業で最新版がインストールされるはずですが、念のために最新版にバージョンアップしましょう。
`$ brew update`

アップデートがあれば進捗状況がターミナルを流れていきます。
`Installing from the API is now the default behaviour!`
`You can save space and time by running:`
`  brew untap homebrew/core`
`Already up-to-date.`
とメッセージが表示されたらアップデート完了です。

アップデートがあった場合は前述のコマンドでバージョン確認しましょう。
WSL2のUbuntuからインターネットに出れなくなった

## WSL2のUbuntuからインターネットに出れなくなった

git(CodeCommit)からcloneできなくなったので、
アカウント重複あたりかと思ったけど、

**「Could not resolve host: git-codecommit.ap-northeast-1.amazonaws.com」**

となった。

curlやpingが叩けない。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93661/a494e778-7e5c-4519-28be-a14648262558.png)

### 1. インターネット接続の確認

```bash:shell
ping 8.8.8.8
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93661/39baf984-0e35-d9b0-4b8c-f2983cd78bff.png)

こんな感じで接続OK

### 2. DNS設定の確認
次はDNS周りを疑ってみる。/etc/resolv.confの内容を確認

```bash:shell
cat /etc/resolv.conf
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93661/b0e723ce-00df-b95e-cb45-0a2bd2b92cf4.png)

nameserverがローカルIPなのが気になるが、調べたら、「nameserver 172.22.144.1」は正常の動作らしい。

>nameserver 172.22.144.1 はWSL2の仮想ネットワークのデフォルトの設定の一部であり、これが指定されているのは通常の動作です。WSL2はWindows上で動作する仮想的なLinux環境なので、このような特殊なネットワーク設定が行われています。


### 3. DNSサーバの変更
ローカルのDNSサーバーからgoogleのDNSサーバへ変更してみる。


一応バックアップを取っておく
```bash:shell
sudo cp /etc/resolv.conf /etc/resolv.conf.backup
```

GoogleのDNSを設定
```bash:shell
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
```

再度、pingの確認
```bash:shell
ping google.com
```


![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93661/849a1a85-d861-226b-1934-d8a8d3d2d2d2.png)


ということでめでたしめでたし。

### 4.なんでそうなったの？
よくわからなん。。。

考えられるのは、
昨日インターネットがつながらなくなって調べたら、家庭用のルータがハングってたんだよね。
そのまま電源ぶち抜いたら設定も消えたんだよね。それくらい・・・？
#その直前はpushしていたのでつながっていたはず。

ちなみに、ChatGPT先輩いわく、WSL2の再起動でも直るかもしらないとのことです。
※私は直らなかったんですが、このままでも問題ないでしょうとのこと、、、。
asdfとnvmが競合してしまうので、asdfに乗り換える

こんにちは、駆け出しエンジニアのとしです！

今回はインターンをしている中で出会ったエラーについて
解決法を提示していきます

## 概要
プログラミング言語のバージョン管理ツールであるasdfとnvmの
両方を入れていたらnodeのバージョンを指定する際に競合が起きてしまいました

どうやらasdfとnvmが両方入っているとまずいようなので、
それを解決する方法を備忘録として書いていきます

いままでnvmを使っていましたが、asdfに移行します

## 環境
- Mac M1
- Mac OS: 12.7
- シェルはzshを使用

## nvmをアンインストールする
1.間違えて他のものを削除してしまわないように、これから
アンインストールするnvmのあるディレクトリを確認します

```
echo $NVM_DIR
```

2.上記で表示されたディレクトリで問題ない場合は、
下記のコマンドでアンインストールしていきます

```
rm -rf $NVM_DIR
```

これでnvmのアンインストールは完了しました！

## asdfに変更点を反映する
asdfがすでにインストールされている人は、
下記のコマンドを入力してasdfに変更点を反映していきます

```
asdf reshim
```

これでnvmからasdfへの移行は完了です！

## おわりに
asdfはnodeのバージョン管理だけでなく、RubyやPythonなど他の言語の
管理もできる優れものなのでasdfに移行することをおすすめします！

asdfというタイプしやすさもいいですよね。
それではまた別の記事でお会いしましょう〜！

## 参考にした記事
- [バージョン管理ツール asdf 使ってみた](https://qiita.com/murakami-mm/items/2d63177dc8ea002a847b#asdf-%E3%81%A7-nodejs-%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86)
- [nvm(Node Version Manager)のアンインストール(削除)](https://webree.jp/article/nvm-uninstall/)
正規表現チートシート＆テンプレートメモ

# 概要
業務でよく使う正規表現をメモ  
コピペしやすいように見出しにしているが,Qiitaエディタ上でちゃんと正確な記述方法も書くこと

## エスケープ文字一覧 .^$|\\[\](\){\}+*?
<details><summary>詳細</summary>

```
正規表現エスケープ文字のリスト
.^$|\[](){}+*?
正規表現	エスケープ後	メタ文字の意味
.	\.	改行（\n、\r）を除くすべての文字
^	\^	行頭の位置（シングルラインモード：行頭、マルチライン：文章の頭）
$	\$|行末の位置
|	\|	「|」の左右の文字列のいずれか
\	\\	直後のメタ文字をエスケープする
[、または、]	\[, \]	文字クラスの開始、終了を表す。
(、または、)	\(, \)	サブパターンの開始、終了を表す。
{、または、}	\{, \}	量指定子の開始、終了を表す。
+	\+	１回以上の繰り返し
*	\*	0回以上の繰り返し
?	\?	0回、もしくは１回の出現
```
</details>

## ^[^']\*KeyWord.*$
```
正規表現 
^[^']*KeyWord.*$

' はvbでいうところのコメントアウトなため,KeyWord前にコメントアウト記号がある場合除外される.

```

## ^[^']\*[^a-zA-Z0-9_]KeyWord[^a-zA-Z0-9_].*$
```
正規表現 
^[^']*[^a-zA-Z0-9_]KeyWord[^a-zA-Z0-9_].*$

コメントアウトされていない前後に不適切なキーワードが無い文字列

例 : 正解例
C://test/test.vb(123,12)  [UTF8]:     private KeyWord() As String

例 : 不正解例
C://test/test.vb(123,12)  [UTF8]:     private KeyWords() As String
C://test/test.vb(123,12)  [UTF8]:     private KeyWord_check() As String
C://test/test.vb(123,12)  [UTF8]:     'private KeyWord() As String

```
通気性フィルム市場：生理用品に対する意識の高まりを背景に成長へ 2023-2033

リサーチ・ネスターは次のタイトルのレポートを発表した「通気性フィルム市場 世界の需要分析と機会展望2033年"この調査レポートは、世界の通気性フィルム市場をタイプ別、技術別、エンドユーザー別、地域別に分類し、その概要を詳細に紹介しています。
さらに、詳細な分析として、市場の成長に関連する現在および将来の市場動向の詳細な考察とともに、業界の成長指標、阻害要因、需給リスクを網羅している。
世界の通気性フィルム市場は、予測期間、すなわち2023年〜2033年に大幅な収益を達成することにより、CAGR〜6％で成長すると予測されている。包装食品の普及率の上昇は、予測期間中の市場の成長を促進すると予測されている。2020年時点で、アメリカ人の約35％が調理済み食品を消費すると予測されている。さらに、医薬品の流通と開発における著しい成長が、予測期間中の市場成長をさらに促進すると推定される。例えば、2021年には世界で約1兆5000億米ドルが医薬品に費やされると推定されている。
![Breathable-Films-Market-Future-Scope.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491677/21b40d56-e7ec-4b39-1ab8-06f62d6a450d.jpeg)

詳細レポートへのアクセスはこちら：
https://www.researchnester.jp/reports/breathable-films-market/997

さらに、タイプ別に見ると、世界の通気性フィルム市場はポリエチレンに区分される。これらのサブセグメントのうち、ポリエチレンセグメントは予測期間中に市場で最大のシェアを獲得すると推定される。このセグメントの成長は、容器製造やディスペンサーボトルにおけるポリエチレンの利用が急増していることに起因している。2018年現在、ポリエチレンの生産量は約1億トンと推定され、2029年には1億2,000万トンに達するとされている。
さらに、世界の通気性フィルム市場は、地域別に北米、欧州、アジア太平洋地域、中南米、中東・アフリカ地域に二分される。これらの地域のうち、アジア太平洋地域の市場は、布・繊維産業、食品飲料産業における通気性フィルムの需要増加を背景に、予測期間中に急成長すると推定される。繊維・衣料品の年間輸出量の約52％がアジア太平洋地域から世界へ輸出されている。
この調査はグローバルな性質を持ち、以下の市場の詳細な分析をカバーしているNorth America (U.S., Canada), Europe (U.K., Germany, France, Italy, Spain, Hungary, Belgium, Netherlands & Luxembourg, NORDIC [Finland, Sweden, Norway, Denmark], Poland, Turkey, Russia, Rest of Europe), Latin America (Brazil, Mexico, Argentina, Rest of Latin America), Asia-Pacific (China, India, Japan, South Korea, Indonesia, Singapore, Malaysia, Australia, New Zealand, Rest of Asia-Pacific), Middle East and Africa (Israel, GCC [Saudi Arabia, UAE, Bahrain, Kuwait, Qatar, Oman], North Africa, South Africa, Rest of the Middle East and Africa). さらに、市場規模、前年比成長率・機会分析、市場プレイヤーの競争力調査、投資機会、将来の展望に対する需要などを含む分析も、調査報告書の中で取り上げられ、表示されている。

生理用品需要の高まりが市場成長を促進
世界銀行は、世界中で約500人の女性が生理用品を利用できていないと述べている。生殖年齢にある女性は毎年月経の周期があり、感染症や病気を避けるために適切な衛生管理が必要です。また、生理用ナプキンには複数の代替品が販売されていますが、手頃な価格で便利に使えることから、多くの女性が生理用ナプキンを使用する傾向にあります。生理用ナプキンは通気性のあるフィルムで作られている。生理用ナプキンの中には細菌が閉じ込められており、深刻な健康問題を引き起こす可能性があります。
したがって、このような要因が予測期間中の市場の成長を促進すると予想される。
しかし、市場には代替品が存在し、高い初期投資が必要であることが、予測期間における世界の通気性フィルム市場の成長の主な阻害要因になると予想される。
また、本レポートは世界の通気性フィルム市場における主要企業の既存の競争シナリオを提供しており、以下の企業のプロフィールを含んでいますArkemaGroup, Trioworld Group, Schweitzer-Mauduit International, Inc., Fatra, a.s., Nitto Denko Corporation, Covestro AG, Crunchbase, Inc., Clopay Plastic Products Co., Inc., Mitsui Chemicals, Inc, and The RKW Group. The profiling enfolds key information of the companies which encompasses business overview, products and services, key financials, and recent news and developments. 全体として、本レポートは世界の通気性フィルム市場の詳細な概観を描いており、業界コンサルタント、装置メーカー、拡大機会を探している既存プレイヤー、可能性を探している新規プレイヤー、その他の関係者が、現在進行中および今後予想されるトレンドに従って市場中心の戦略を調整するのに役立ちます。

レポートサンプル@を請求する
https://www.researchnester.jp/sample-request-997

について Research Nester
Research Nesterは戦略的市場調査とコンサルティングのリーディング・サービス・プロバイダーです。業界、コングロマリット、エグゼクティブが将来のマーケティング戦略、事業拡大、投資などのために賢明な決断を下せるよう、偏りのない比類のない市場洞察と業界分析を提供することを目指しています。私たちは、戦略的思考を通じて適切なタイミングで適切なガイダンスを得ることができれば、あらゆるビジネスが新たな地平へと拡大できると信じています。私たちの既成概念にとらわれない思考は、クライアントが将来の不確実性を回避するために賢明な決断を下すのに役立ちます。
【お問い合わせ先】
ナオミ コスギ
Eメール: info@researchnester.jp
米国の電話番号: +81 505 050 8480
モバイル版Lightroomでカメラプロファイルが見れなくなった時の対処法

# はじめに
私の趣味は写真なのですが、編集作業は時間をかけずにパパっと済ませたいため、基本的にモバイル版のLightroomを使用しています。

先日、アプリをアップデートしたところ、だいぶUIが変更されており、カメラプロファイルの設定は項目自体見当たらなくなってしまい、解決すべく調査しました。

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/34a7e024-528d-ae56-3793-bc986a8ae9ff.png)

# 結論
- デフォルトでは表示されなくなった
- 「画像を選択＞画面右上の…をタップ＞オプションを表示＞プロファイルおよびレンズ補正を常に表示＞ON」をする必要がある
X299チップセットのMicroATX(μATX)マザーボードを弄った時の記録

某リサイクルサイトで、X299チップセットのマザーボード(CPUセット品)を手に入れたときに記録です。

出品者から情報
・『OMEN X by HP 900-290jp』からの抜き取り品
・CPUを 『i9 7900X』から『i7 7800X』に載せ替え
・動作確認が取れたメモリは、CORSAIR製『DDR4-2800』(Vengeance LPX 16GB(4GB×4),DRAM2800MHz)
・グラフィックカードは『GIGABYTE製 GTX1080』
・HP カスタマー・ケア - ナレッジベース(https://support.hp.com/jp-ja/document/c05954094)

##ステップ1
CPU付きのため、メモリをつけて起動確認
DDR4-2800(PC4-22400)なんて規格初めて聞いたが実在していた
Wiki(https://ja.wikipedia.org/wiki/DDR4_SDRAM)からは、以下情報は求められた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118752/eb5322f4-8857-cf54-7e95-b6f606709c53.png)

早速、動作確認が取れたDDR4-2800を探してみると、某中古ショップ、じゃん〇らさんにあったので買ってみた。

<ここに写真を入れる。>

あれ、グラボを指してもBIOSが表示されない。

##ステップ2
CPUが対応しているメモリは、DDR4-2400
HP カスタマー・ケア - ナレッジベースからマザーボードが対応しているのはDRR4-2666(DRR4-2667とあるが、DRR4-2666の間違えと思った)
家にある他のメモリを試してみる。

・ADATE製XPG『DDR4-2666』16-18-18、1.2v(AX4U2666316G16-DBG)
・KINGMAX製『DDR4-2666』？、1.2v(KM-LD2-2666-8GS)
・AFOX製『DDR4-2400』？、1.2v(AFLD416ES1P)
・Micron製『DDR4-2133P』？、？(MTA16ATF1G64AZ-2G1A2)
・SAMSUNG製『DDR4-2133P』？、？(M378A1K43BB1-CPB)

まじか、どれも動かない。

##ステップ3
片っ端から試してみるしかない

①CORSAIR製VengeanceLPX『DDR4-2666』16-18-18-35、1.20v(CMK16GX4M2A2666C16R)
→動かない
②CORSAIR製VengeanceLPX『DDR4-2666』16-18-18-35、1.20v(CMK16GX4M2A2666C16)
→動かない
③CFD製BALLISTIXbyMicron『DDR4-2666』16-18-18-38、1.2v(W4U2666BMS-8G)
→動いた

##ステップ4
検証
・JEDEC規格というもの？
→　半導体部品の分野で規格の標準化を行っている業界団体である半導体技術協会(JEDEC)が制定する規格

・XMPとは？
→　Intel Extreme Memory Profile（XMP）とは、Intelが開発したメモリのオーバークロック機能を拡張する技術
　・ADATE製XPG『DDR4-2666』16-18-18、1.2v(AX4U2666316G16-DBG)
　　→　サポートしてそうだが、動かず
　
・もともとはDDR4-2800がついていたっぽい、出品者が動いていたことは確認できているため、
AKIBA PC Hotline!さん(https://akiba-pc.watch.impress.co.jp/docs/news/news/663288.html)
から動作電圧は1.2V、レイテンシは16-18-18-36は動くで「あろう」

レイテンシあたりが原因で動かなかったのかな。
レーザ侵入感知システム

### <font  color="6495ed">概要</F>
映画等でセキュリティの高い通路にレーザが照射されていて知らずに通過してレーザ光を遮断させると警報が鳴るシーンがありますが、防犯マニアの自分はこの仕組みにもともと興味があり同様の物を作ってみました。件名はシステムなんて大げさに書いてますが、ぶっちゃけ明るさを測ってるだけです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/hkXLBWyBCDE?si=AHX1b-yTZDQJsnQg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


### <font  color="6495ed">使用部品</F>
- <a href="https://akizukidenshi.com/catalog/g/gM-11822/">秋月通商のレーザモジュール</A>
- <A href="https://akizukidenshi.com/catalog/g/gM-07035/">受光部として光センサモジュール(フォトトランジスタ)</A>
- Arduino R3

センサに蛍光灯があたっていてもその光がレーザ光と識別できるのでセンサ部分を暗く覆う必要はありません。
(蛍光灯ではセンサ出力が3以下でレーザ照射は4.5以上に上がる為)

光センサモジュールにレーザを受光させる様に設置しておく。
通過者がいるとレーザ光を寸断するので光センサの出力が下がるのでif文で判定。
### <font  color="6495ed">注意点</F>
- レーザは眼に照射しない事。
- 地震で揺れると誤動作するので加速度センサも併用して地震の時は無効にする必要がある。10mもセンサ間が離れてるとちょっとした振動でもレーザ光がずれる。

### <font  color="6495ed">応用</F>
- レーザ遮断でアラーム鳴らす等は簡単にできます。
- 侵入センサの他、工場のレーンで物品が流れてきたか判定するなど。
- レーザを鏡で反射させれば光源一つで複数個所を検知可能。
### <font  color="6495ed">作り方</F>
- 上記、光センサの青を5番ピンに赤を+5V(VCC) 黒を -(GND)　に接続。
- 侵入を検知したい所にレーザ照射器と受光部を隔てるように設置。

![124622639_3360951350670606_2186454957777639849_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/e43808ef-ab42-ff14-3b43-a2b8988b8c75.jpeg)

- センサがレーザの照射を受けて赤くなっている様子
![P1140799.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/a1922332-8971-c673-a51f-7b7d2928aabf.jpeg)
![1527844492303.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/3628c46a-1037-909e-cf1b-b0a44a619638.jpeg)
```c
// arduino R3 Duo
const int PIN_ANALOG_INPUT = 5;

void setup() {
  Serial.begin( 9600 );
}

void loop() {
  int i = analogRead( PIN_ANALOG_INPUT );
  float f = i * 5.0 / 1024.0;
  Serial.print (f); 
  if ( f>=4.0) {
	  Serial.print (" 正常(レーザ受光中)\r\n"); 
  }
  else{
    Serial.print (" 異常(レーザ非受光)\r\n"); 
  }
  delay (500);
}

```
Xcode 15でXcode Cloudの項目が見つからない

## 何があった
Xcode 14でメニューのProductタブの中にあったXcode Cloudの項目がXcode 15では見つからない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/f74a9aaa-158a-56d9-2774-9beb9b4d975f.png)

## どこいった
Xcode 15では新しく生えたっぽいIntegrateタブの中に移動していた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/812a8705-74d5-46ae-3022-298da08dd882.png)