OmniAICreator/Qiita-1.07M huggingface dataset:
PL-300をこれから取得するための試験対策


「PL-300: Microsoft Power BI データ アナリスト」試験に合格したので、合格体験記を記事にします。ただし、試験の詳細やMicrosoft認定資格における本資格の位置づけなどは、他の合格体験記で十分見飽きていると思われるので、この記事では実際に行った勉強方法についてのみ共有します。(個人的に合格体験記で皆さんが最も興味があるのはそこだと思うからです...)

## 受験準備心得

### オンラインコースの受講
**Microsoft Power BI Certification: DA-100 | PL-300 Exam Prep**
https://www.udemy.com/course/microsoft-power-bi-certification-da-100-exam-prep/
このコースは8.5時間の短期間で、PL-300試験の出題範囲全体をコンパクトにカバーします。内容は試験の枠組み「データの準備」「データのモデル化」「データの視覚化と分析」「項目のデプロイと保守」の順で構成されており、他のコースと比べてより体系的な流れとなっています。
講義と演習を通して、Power BIのユーザーインターフェースに習熟し、その後の問題演習に備えた下地を築くことを目的としています。

### examtopicsサイトで問題を解く
全問解く必要はありません。自分が苦手な分野を洗い出し、試験直前に答えを暗記するのではなく、学習計画で重点的に補強するためです。（すべての答えが正しいわけではありません。ユーザーのディスカッションを見て、最も多くのいいねがついているものが正しいかと思います）
問題形式が酷似しており、反復することで重要ポイントや典型問題を把握できます。特定のキーワードが出てきたとき、その発想の仕方に特に注意すれば良いかと思います。
例えば「パフォーマンス」が出てくれば、フィールド削減やクエリ最適化など、レポートのパフォーマンス向上が問われることが多いです。ケーススタディの問題では、シナリオをしっかり理解することが大切です。

### Power BIに慣れる
学習の過程で、Power BI Desktopをインストールし、機能に慣れ親しむことが大切です。
解けない問題があれば、実際に操作してみるか、Excelでモック データを作成して理解を深めるのもお勧めです。
データ品質チェック、フィールドタイプ変更、データ可視化の効果など、実際のUIでどこから設定できるかがわかり、操作を通じてより深く概念を身につけられます。

### Udemyでコースを購入する際の小ワザ
Udemyでコースを購入する際の小ワザをご紹介します。
通常、コース料金は$98程度と高額ですが・・・

- 新規登録時はプロモーションがあり、$13-15程度で購入できます。
- すでに購入済みでプロモーションが適用されない場合は、別のメールアドレスで新規登録すればプロモーションが再度利用できます。
- 購入後、30日以内で視聴時間が少ない場合は全額返金が可能です。（模擬問題集を購入した場合でも、一部解答済みであっても返金可能なようです）

## 最後
PL-300は、Microsoftの資格の中で初級に位置する資格で、有効期限があります。資格手当として取得するのも良いですが、自分で興味を持って勉強することが、勉強の意欲に繋がります。これから取得される方は、頑張ってください。

合格を心よりお祈りしております!
Hello Worldからの復習 ～オーバーライド編～

##### お品書き
+ オーバーライドって？
+ オーバーライドとオーバーロードの違い
+ オーバーライドSample

-----

オーバーライドって？
-
サブクラスでスーパークラスのメソッドを再定義することを
**オーバーライド**という。
オーバーライドとは「上書き」という意味の英単語

**▲条件**

::: note
**戻り値の型、メソッド名、引数の型と数が全て同じ**
:::
これが全てそろってはじめて上書きが出来る。


```java:例
class Person{
   void display(){
   .
   .
   }
}

calss Student extendes Person{
   void display(){
   .
   .
   }
}

```

```java:例2
Student stu = new Student();
stu.display();
```

```mermaid
flowchart LR
     subgraph Student
     Stu
     end
    subgraph オブジェクト領域
     a(SuperClass_display) ---b(SubClass_display)
    end
    
    Stu --> オブジェクト領域


```
stuを作るとオブジェクトの領域にSuperClassの情報とSubClassの情報の両方含まれる。
その中でSubClassのdisplayメソッドを呼び出すため、上書きしたあとのdisplayメソッドの処理が呼び出されて実行される動きになる。

オーバーロードとオーバーライドの違い
-

:::note
オーバーライドはメソッドの上書き
スーパークラスとサブクラスの間の関係
:::


https://qiita.com/tianshandafu894/items/44c587c885fbee947ede

:::note
オーバーロードは1つのクラスの中で同じ名前のメソッドを複数定義できるのがオーバーロード
:::


オーバーライドSample
-

```java:java
public class Person2{
  private String name; //メンバー変数として名前を持つ

  public void setName(String n){ //設定するためのメソッド
    name = n;
  }
  public String getName(){ //名前を取得するためのメソッド
    return name;
  }
  public void display(){ //表示するためのメソッド
    System.out.println("名前：" + name);
  }
}
```

```java:java
public class Student2 extends Person2{
  private int stuNo;

  public void setStuNo(int s){
    stuNo = s;
  }
  public void display(){  //Person2クラスで持っていたdisplayメソッドを上書きしている
    System.out.println("名前：" + getName()); //nameがprivate指定の為getNameメソッドを使う。
    System.out.println("学籍番号：" + stuNo);
  }
}
```

カプセル化をちょいと復習↑
継承した際にnameという情報を持つことはできるが、アクセスするときは別クラスになるため、**getNameメソッド**を経由して名前を取得するということを行う。


```java:java
public class StuSample2{
  public static void main(String[] args){
    Student2 stu = new Student2();
    stu.setName("大輔");    
    stu.setStuNo(1);
    stu.display();
  }
}
```

実行用クラスでdisplayメソッドを呼び出したときにSuperClassのdisplayかSubClassのdisplayメソッドのどちらが呼ばれるか。

```cmd:cmd
C:\Java\1>java StuSample2
名前：大輔
学籍番号：1
```
上書きしたSubClassの名前と学籍番号が両方表示されるdisplayメソッドが呼び出された。
Hello Worldからの復習 ～継承編～

##### お品書き
+　継承って？
+　メリット
+　注意点
+　Sample

-----
◆継承って？
-
既存のクラスを基に変数やメソッドを追加したクラスを作る。
継承関係にあるのクラスを**スーパークラス**、
子のクラスを**サブクラス**という。

元々あるクラスと機能追加をした新しいクラスの2つがあるってことね。

```mermaid
flowchart LR
    subgraph SubClass
        a(Teacher) --- b(Student)
    end
    
    subgraph SuperClass
        c(Person)
    end
    
    SubClass --> SuperClass


```
Personクラスは「人」のクラスということで「人」が共通して持っている情報、名前などを扱う変数やメソッドを定義しておく。
SubClassはPersonクラスを継承することを考える。

どゆことか。

Personクラスが持っているメンバー変数やメソッドを同じように使えるということ。
さらに、各クラス独自の変数やメソッドを追加したりできる。
例えば、Teacherクラスは担当科目の情報、Studentクラスでは学籍番号などを持たせる等の、クラス構成を作ることができる。

どうやって親クラスの機能を引き継げるの？

```java:java
class Student extends Person{

}
```

extendsとは拡張するという意味の英単語。

この記述でPersonクラスが持っているメンバー変数とメソッドを受け継いで使うことができる。
SubClassには独自のメンバー変数やメソッドだけを記述すれば良い。


メリット
-
コーディングがラクになるのと、メンテナンスがラク。

例えば、名前のデータ型や表示方法を変えたいとき、名前に関する記述がいろんなところに出ていると、修正箇所が増えてしまうが、名前の記述がPersonクラスにしか記述がなければ、そこだけの修正で済む。

注意点
-
継承できるクラスは1つだけ。
extendsの後には1つのクラスしか書けません。
複数記述できてしまうと、メンバー変数やメソッドの名前が被ってしまってエラーに繋がりやすい。

継承するとSuperClassのメンバー変数やメソッドを引き継いで使えるが、**コンストラクタ**は継承しない。
これは、コンストラクタの名前はクラス名と合わせるというルールがあるため。

SubClassからPersonクラスのコンストラクタを呼び出して利用することはできる。

◆継承Sample
-

```java:java
public class Person{
  private String name; //共通の情報としてname メンバー変数として名前を持っている。

  public void setName(String n){ //名前を設定するためのメソッド
    name = n;
  }
  public void display(){ //名前を表示するためのメソッド
    System.out.println("名前：" + name);
  }
}
```

```java:java
public class Student extends Person{ //Personクラスを継承
  private int stuNo; //クラス独自の変数として学籍番号を持つ

  public void setStuNo(int s){ //学籍番号を設定するためのメソッド
    stuNo = s;
  }
  public void displayStuNo(){ //学籍番号を表示するメソッド
    System.out.println("学籍番号：" + stuNo);
  }
}
```

```java:java
public class StuSample{
  public static void main(String[] args){
    Student stu = new Student(); //サブクラスのStudentクラスのオブジェクトstuを作る

    // スーパークラスのメソッド
    stu.setName("大輔");
    stu.display();

    // サブクラスのメソッド
    stu.setStuNo(1);
    stu.displayStuNo();
  }
}
```

```cmd:cmd
C:\Java\1>java StuSample
名前：大輔
学籍番号：1
```

スーパークラスの持っているメソッド、サブクラスが持っているメソッド、それぞれ呼び出して情報を表示できていることを確認。
STF ファイルを使用してフィールドの翻訳を CRM に一括でインポート

STF拡張子

STFは、一般的にMicrosoft ACME Setup Table Formatファイルに関連付けられているファイル拡張子です。 Microsoftは、Microsoft ACME Setup Table Format形式の標準を定義しました。 STFファイル形式は、 Windowsシステムプラットフォームにインストールできるソフトウェアと互換性があります。 拡張子がSTFのファイルは、データファイルファイルに分類されます。 データファイルサブセットは、1326さまざまなファイル形式で構成されます。 Windows InstallerはSTFファイルをサポートし、そのようなファイルを処理するために最も頻繁に使用されるプログラムですが、1他のツールも使用できます。 Windows Installerというソフトウェアは、Microsoft Corporationによって作成されました。ソフトウェアおよびSTFファイルに関する詳細情報を見つけるには、開発者の公式Webサイトを確認してください。

+ [Error while importing picklist values using STF files:Invalid key: <key>. The key's translation type must match the file's translation type.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XAEWI)

:::note alert
Invalid key: <key>. The key's translation type must match the file's translation type. 
:::

Regarding the error you encountered while importing picklist values using STF files for field translations in your Org.

 

The error message "Invalid key: <key>. The key's translation type must match the file's translation type" typically occurs when there is a mismatch between the translation type specified in the STF file and the translation type associated with the picklist values.

To resolve this issue, ensure that the translation type specified in your STF file matches the translation type of the picklist values. Double-check the format and content of your STF file to ensure consistency.

If you're looking for a more efficient solution for managing picklist value translations and ensuring compatibility with your STF files, you might want to consider our AppExchange app, 'Quick Update Translations.' Our app simplifies the translation process by allowing you to update picklist values and other translation elements directly within Salesforce without the need for manual STF file editing.

You can find more information about the app and access it through this AppExchange Link: https://appexchange.salesforce.com/appxListingDetail?listingId=fa9afbfe-74ff-4027-ac32-2cdfd58184d3

組織内のフィールド翻訳に STF ファイルを使用して選択リスト値をインポート中に発生したエラーについて。

「無効なキー: <キー>。キーの変換タイプはファイルの変換タイプと一致する必要があります。」というエラー メッセージは通常、STF ファイルで指定された変換タイプと選択リスト値に関連付けられた変換タイプの間に不一致がある場合に発生します。

この問題を解決するには、STF ファイルで指定された翻訳タイプが選択リスト値の翻訳タイプと一致していることを確認してください。STF ファイルの形式と内容を再確認して、一貫性を確保してください。

選択リスト値の翻訳を管理し、STF ファイルとの互換性を確保するためのより効率的なソリューションをお探しの場合は、AppExchange アプリ「Quick Update Translations」を検討してください。当社のアプリでは、STF ファイルを手動で編集することなく、Salesforce 内で選択リストの値やその他の翻訳要素を直接更新できるため、翻訳プロセスが簡素化されます。

アプリの詳細情報を確認し、AppExchange リンクからアクセスできます: https://appexchange.salesforce.com/appxListingDetail?listingId=fa9afbfe-74ff-4027-ac32-2cdfd58184d3
AnimatorControllerの中のステートを調べる

エディタ限定です。ビルドではできない模様。
話を簡単にするためnullチェックとかは省略します。

まずエディタにおけるAnimatorControllerを取得。
```
// こいつが調べたいAnimatorとします。
Aniamtor animator = GetComponent<Animator>();

// エディタ用のAnimatorControllerにキャスト
var controller = animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController;
```
中に含まれるレイヤーごとにステートを列挙します。
```
// レイヤーごと
foreach (UnityEditor.Animations.AnimatorControllerLayer layer in controller.layers) {
    var states = layer?.stateMachine?.states;

    // ステートを列挙
    foreach (var state in states) {
        var clip = state.state?.motion as AnimationClip;
        if (clip == null) { // BlendTreeの可能性がある
            continue;
        }
    }
}
```
マークダウンの見出しに連番を入れる_プリザンターにて

プリザンターでは[md]を使えば内容がマークダウンで記載できます。
その時に連番のためのスタイルを設定したかったので試してみました。

## 見出しに連番を入れるCSS
こちらの記事のをそのまま使わせて貰いました。
この内容をスタイルに設定して、「新規作成」「編集」にチェック。
https://qiita.com/itagakishintaro/items/437418f917cc31de10cd

そのままスタイルに入れただけではおかしくなった。
上のPleasanterの所に「0-1.」とでる！
内容の連番が「2.」から始まっている！
![前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383487/6919deda-a86d-c943-9c87-3d7d6b76c5ab.png)
なぜ？。。。。
と思ったけど、このページ全体の見出しに対してのスタイルになるから、そらそうだ。。。

## 「内容」部分にだけ適用されるよに見直し
「内容」の部分は、`<div class"md">`となっているのでそのように、`.md`を追加するように変更する。

これで「内容」部分だけに適用できた！！

```スタイル.css
.md {
    counter-reset: chapter;
}
.md h1 {
    counter-reset: sub-chapter;
}
.md h2 {
    counter-reset: section;
}

.md h1::before {
    counter-increment: chapter;
    content: counter(chapter) ". ";
}
.md h2::before {
    counter-increment: sub-chapter;
    content: counter(chapter) "-" counter(sub-chapter) ". ";
}
.md h3::before {
    counter-increment: section;
    content: counter(chapter) "-" counter(sub-chapter) ".-" counter(section) ".";
}

.md h1, .md h2, .md h3 { 
    border-bottom: 5px solid #7db4e6;
}
```

![後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383487/c02cb787-a431-e291-98f2-6806f4ff9015.png)
【Linux】コマンドの複数実行方法など

# はじめに
「;」で区切られているコマンドを見つけ、意味を調べるうちに他にも複数コマンドを扱う文字があることを知ったので、備忘録的まとめになります。

# まとめ
|コマンド  |読み方  |内容  |
|---|---|---|
|;  |セミコロン             |順次実行  |
|&&  |アンパサントアンパサント  |前のコマンドが成功した場合に、順次実行  |
|\|  |パイプ               |次のコマンドへ出力内容を渡す  |
|\|\|  |パイプパイプ        |前の処理が失敗した場合に、順次実行  |
|&  |アンパサント  |バックグラウンドジョブとして実行  |


## ; (セミコロン)
前のコマンドが終わり次第、次のコマンドが実行されます。
前のコマンドが成功してようが、失敗してようが、次のコマンドへすすみます。

``` 
例）
$ echo Hello ; echo World
Hello
World
```

## && （アンパサントアンパサント）
前のコマンドが成功した場合に、次のコマンドを実行します。

```
例）
$ ls hogehoge && echo hoge 
ls: hogehoge: No such file or directory
```

## \| (パイプ)
前のコマンドの出力結果を、次のコマンドへ渡すことができます。

>この様な構造だった場合
>root/
>┗ hogehoge/
>　┠ a.txt
>　┠ b.txt
>　┗ c.txt


```
例）
$ ls hogehoge | grep b 
b.txt
```


## || (パイプパイプ)
前のコマンドが失敗した場合に次のコマンドを実行します。

```
例）（hogehogeというディレクトリが存在していなかった場合）
$ ls hogehoge && echo hoge
ls: hogehoge: No such file or directory
hoge
```
```
例）（hogehogeというディレクトリが存在していた場合）
$ ls hogehoge && echo hoge
a.txt	b.txt	c.txt
```

## & (アンパサント)
「&&」と似ているのですが、内容は今までのものとは異なります。
「＆」をつけたコマンドは、バックグラウンドジョブとして実行されます。
```
例）
$ sleep 10
（10秒経つまで次の入力ができない）
```
```
例）
$ sleep 10 &
（即時次の入力ができる）
```
```
例）（「&」を挟んでコマンドを入力することも可能）
$ sleep 10 & echo Hello
[2] 17939
Hellow
[2]  - done       sleep 10
```




# 参考
https://eng-entrance.com/category/linux/linux-basic
【Go】mockが期待した値を返さない

## 問題
- mockが期待した値を返してくれない

## 回答
- mockオブジェクトを使いまわしてないですか？
    - mockに異なる振る舞いをさせたいときは、新たなmockオブジェクトを用意する必要があります
    - 逆に、新たに用意しないと、前回の`on`メソッドの指示が更新されず、残ってしまいます

## 例
```go
	// Test 1; OK
	r := repository.NewMockRepository()
	r.On("FetchData", mock.Anything, 1).
		Return(&model.Data{}, nil)
	h := NewHandler(r, nil)

	_, err := h.HandleRequest()(writer, request)
	assert.Equal(t, nil, err)

	// Test 2; error occured in repository
	r := repository.NewMockRepository()  // ←----------- ここ！！！ ---------
    testErr := errors.New("test error")
	r.On("FetchData", mock.Anything, 1).
		Return(&model.Data{}, testErr)
	h = NewHandler(r, nil)

	_, err := h.HandleRequest()(writer, request)
	assert.Equal(t, testErr, err)
```
- 強調部が抜けていると、Test1で指示した振る舞いが残ってしまい、Test2でも`FetchData`関数は`nil`を返してしまいます

#### あとがき
- これだけのことですが、各種生成AIも指摘してくれず、かなり詰まりました。つらい。
IAMのAssumeRoleを理解する

AWS Identity and Access Management (IAM) の AssumeRole 機能は、一時的なセキュリティ認証情報を提供し、異なるIAMロールを一時的に引き受けることを可能にします。この記事では、AssumeRoleの基本的な概念と実際の使用方法について解説します。

## AssumeRoleとは？

IAMのAssumeRoleは、あるIAMエンティティ（ユーザー、アプリケーション、またはサービス）が一時的に別のロールを引き受けることを可能にする機能です。このプロセスを通じて、エンティティは追加のアクセス権を一時的に得ることができます。

## なぜAssumeRoleが必要なのか？

- **最小権限の原則**: 一時的なアクセス権限を使用することで、常に必要最小限の権限で作業を行うことができます。
- **クロスアカウントアクセス**: 異なるAWSアカウント間でリソースにアクセスする必要がある場合に便利です。
- **一時的なアクセス**: 限られた期間だけ特定のリソースへのアクセスを許可したい場合に使用します。

## 基本的な使い方

1. **ロールの作成**: AssumeRoleを利用するためには、まず引き受けるロールを作成する必要があります。このロールには、引き受けるエンティティと許可されたアクションを定義するポリシーが関連付けられます。

2. **ロールの引き受け**: AssumeRole APIを呼び出して、定義したロールを引き受けます。成功すると、一時的なセキュリティ認証情報が返されます。

3. **一時的な認証情報の使用**: 返された一時的な認証情報を使用して、定義されたアクションを実行します。

## 実際の例

以下は、AWS CLIを使用してAssumeRoleを呼び出し、一時的な認証情報を取得する基本的な例です。

```bash
aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/demo-role" --role-session-name "DemoSession"
@next/third-partiesのsendGAEventでカスタムイベントが送れない

# 前提
- Next.jsを利用している
- @next/third-partiesというライブラリでGooglaAnalyticsを使っている
- sendGAEventを使ってGAのカスタムイベントを発火させたい
- 2024/03/11時点の話

# 問題
- [公式ドキュメント](https://nextjs.org/docs/app/building-your-application/optimizing/third-party-libraries#sending-events-1)に書いてある記載通りにsendGAEventを使っても、カスタムイベントがGooglaAnalyticsに送られない

公式ドキュメントに書いてあるsendGAEventの使い方
```app/page.js
'use client'
 
import { sendGAEvent } from '@next/third-parties/google'
 
export function EventButton() {
  return (
    <div>
      <button
        onClick={() => sendGAEvent({ event: 'buttonClicked', value: 'xyz' })}
      >
        Send Event
      </button>
    </div>
  )
}
```

# 解決方法
- sendGAEventの引数の与え方を変える
- @next/third-partiesは^14.1.2-canary.7を利用する
の二つをする必要がある

## sendGAEventの引数の与え方
```app/page.js
sendGAEvent('event', 'buttonClicked', { value: 'xyz' })
```

ちなみに`{ value: 'xyz' }`の部分は好きなパラメータを利用できる。
`{ os: 'ios', item: 'apple'}`のように自分が集めたいパラメータを複数与える形で問題ない。

要するに[gtag.jsのgtag関数](https://developers.google.com/analytics/devguides/collection/ga4/event-parameters?hl=ja&client_type=gtag#set-up-event-parameters)と同じように引数を与える必要があるということ。



## @next/third-partiesは^14.1.2-canary.7を利用する
```
npm install @next/third-parties@14.1.2-canary.7
```
でcanary.7をインストールする

[sendGAEventが現在進行形でバグの修正を行なっているらしく、canary.7版なら動いたという報告があった。](https://github.com/vercel/next.js/pull/62065)
実際にそれを試したら、自分でも正常に動くことを確認した。

# おわりに
Xでも個人開発について発信しています
→https://twitter.com/ObataGenta

超イケてるデジタルカードサービス、Tagffyのほうに色々なリンクをまとめてます。
https://tagffy.com/GentaObata/
デプスセンサ・３Dカメラで特定距離の背景を除去する【道具としての OpenCV 画像認識】

# 本記事でできること
カラー画像
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/2364817d-0591-b6f9-1240-16ced099a37a.png)

深度画像から特定距離の背景を除去した画像１（設定深度領域：350mm〜450mm）
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/69681156-3038-8f54-d769-54b886f82356.png)


深度画像から特定距離の背景を除去した画像2（設定深度領域：350mm〜550mm）
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/a2719424-2d85-c80e-bb6e-c07078360c18.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## デプスセンサ・３Dカメラで特定距離の背景を除去する
画像認識プログラムを制作しているときに、背景情報が画像処理フィルターの邪魔になることがあります。たとえば、認識対象物より後ろにある壁紙の色や、置いてある棚、次に認識を予定している対象物体の予備などです。こうしたシーンでは、デプスセンサ・3Dカメラで特定距離以遠の画像情報を、奥行き距離情報に基づいて除去してやることで、手前にある物体の画像だけを取り出して、背景除去に使用することができます。本記事では、Intel社製Realsenseを使用して、特定距離の背景を除去するプログラムを掲載します。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## プログラム抜粋
```c++
cv::Mat crop_depth_image_by_depth_value(const cv::Mat& depth_image, const float far_value, const float near_value) {
    cv::Mat result_depth_image = depth_image.clone();
    for (int i = 0; i < depth_image.cols; i++) {
        for (int j = 0; j < depth_image.rows; j++) {
            const double distance = static_cast<double>(depth_image.at<float>(cv::Point(i, j)));
            if (distance > far_value || distance < near_value) {
                result_depth_image.at<float>(cv::Point(i, j)) = 0.f;
            }
        }
    }
    return result_depth_image;
}
```

## 全体プログラム
```c++
#include "crewbo/crewbo.h"
#include "project_lib/vision_assistant.h"

#include <spdlog/spdlog.h>
#include <iostream>

cv::Mat crop_depth_image_by_depth_value(const cv::Mat& depth_image, const float far_value, const float near_value) {
    cv::Mat result_depth_image = depth_image.clone();
    for (int i = 0; i < depth_image.cols; i++) {
        for (int j = 0; j < depth_image.rows; j++) {
            const double distance = static_cast<double>(depth_image.at<float>(cv::Point(i, j)));
            if (distance > far_value || distance < near_value) {
                result_depth_image.at<float>(cv::Point(i, j)) = 0.f;
            }
        }
    }
    return result_depth_image;
}

int main(void) {
    crewbo::camera::RealSense camera;

    SPDLOG_INFO("色と距離の情報から背景を除去します。'q'キーで終了します。");
    while (cv::waitKey(1) != 'q') {
        const cv::Mat depth_image = camera.fetchDepthFrame_();
        const float depth_near_value = 600.f;
        const float depth_far_value = 1600.f;
        const cv::Mat cropped_depth_image =
                crop_depth_image_by_depth_value(depth_image, depth_far_value, depth_near_value);
        const cv::Mat colorized_image = crewbo::camera::RealSense::colorizeDepthImage_(cropped_depth_image);
        cv::imshow("RealSense depth image", colorized_image);
    }
}
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
Claude3に自分の研究の今後の発展を聞いてみた

XでClaude3に関して面白い投稿があったので、実際にやってみた記事です。

https://x.com/mutaguchi/status/1766632907148517408?s=20

# 発展を聞いてみる論文
自分の修士の研究を聞いてみます。

研究の概要としては、
・反事実の確率を使ったXAIのフレームワークにおける因果グラフ既知の問題を因果グラフの事前情報と因果探索の組み合わせで何とかできるのではないか
・実際に銀行の実データで格付けの2値分類モデルを構築してその反事実の説明の解釈が理にかなっていそう

という感じのものです。

https://arxiv.org/pdf/2402.02678.pdf

# 実際に聞いてみる
https://claude.ai/chats

のページで論文をアップロードし、
How should this research be further developed?（この研究はどのように今後発展できるか？）と聞いてみた内容が以下です。

Based on the research paper, here are some potential ways this work could be further developed:

1. Extend to multi-class classification problems: The authors mention that an extension of LEWIS to multi-class classification was proposed previously, but it is an open question whether the proposed prior information on causal structure is valid for multi-class classification problems. Exploring this and developing the framework for multi-class settings would broaden its applicability.

2. Investigate other useful prior information: While the paper proposed two types of useful prior causal information, there may be other forms of prior knowledge that could further improve causal discovery and counterfactual explanation performance. Researching what other priors are beneficial would strengthen the framework.

3. Apply to other real-world domains: The real data application focused on credit rating data from a bank. Applying this causal XAI framework to other domains like healthcare, criminal justice, education etc. would demonstrate its versatility and could uncover domain-specific challenges to address.

4. Develop more efficient causal discovery algorithms: The paper used off-the-shelf causal discovery methods like PC, LiNGAM etc. Developing new, more scalable causal discovery techniques tailored for this XAI framework could improve its computational performance on large, complex datasets.

5. User studies on explanations: While analytical evaluations were done, conducting user studies to assess how domain experts interpret and apply the counterfactual explanations generated by this framework could provide valuable feedback to improve explanation quality.

6. Theoretical analysis: Further theoretical analysis on the properties and guarantees of the explanations produced when incorporating estimated causal graphs could strengthen the formal foundations of this approach.

Overall, extending the methodology to broader settings, enhancing computational efficiency, empirical validation across domains, and fortifying the theoretical underpinnings appear to be promising future research directions.


全体としては、ちゃんと隅々まで論文を読んで話しているなということと、回答もこの手法をいろんな場面でも使えるようにすることが今後の課題と話していて、筆者（私）的にもまあ、そうだろうという回答が返ってきましたが、唯一あった面白い回答は5のユーザー調査で品質向上のための視点側から評価していて、そういう視点もあるのかと納得させられてClaude3の凄さを感じさせられました。

# 研究としての使い道
最後に自分の論文だけでなく、先行研究に対してこういったことを聞かせてやれば、どういうことがその分野の研究で必要かとかもわかりそうなので、院在籍時に使いたかったのが感想です。


以上です。
デプスセンサ・３Dカメラを使用する【道具としての OpenCV 画像認識】

# 本記事でできること
カラー画像の取得
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/eb4636e3-557d-4cb0-a46d-4b77b68748f6.png)


デプス画像の取得
![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/1404e5d7-c18b-ae01-e487-3db87bef7ea6.png)



# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## デプスセンサ・３Dカメラを使用する
ロボットのビジュアルフィードバック制御にあたって、2Dカメラ（一般的なUSBカメラや、産業用のカメラ）だけではなく、デプスセンサ・3Dセンサなどの奥行きを計測することができるカメラ・センサを使いたい場合があります。クルーボで使用するデプスセンサ・3Dセンサは、Intel社製Realsenseシリーズです。本記事ではRealnsenseを使用して通常のRGB画像、距離画像をそれぞれ取得するプログラムを掲載します。


# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## RGB画像を取得するプログラム
```c++
#include <spdlog/spdlog.h>
#include <opencv2/opencv.hpp>

#include "crewbo/crewbo.h"

int main() {
    crewbo::camera::RealSense camera;

    SPDLOG_INFO("RealSenseでカラー画像を取得しています。終了するには'q'キーを押下してください。");
    while (cv::waitKey(1) != 'q') {
        // カラー画像を取得します。
        // 色空間はBGRです。
        const cv::Mat color_image = camera.fetchSingleFrame_();
        cv::imshow("RealSense color image", color_image);
    }
}
```

## 距離画像を取得するプログラム
```c++
#include <spdlog/spdlog.h>
#include <opencv2/opencv.hpp>

#include "crewbo/crewbo.h"

int main() {
    crewbo::camera::RealSense camera;

    SPDLOG_INFO("RealSenseで深度画像を取得しています。終了するには'q'キーを押下してください。");
    while (cv::waitKey(1) != 'q') {
        // 深度画像を取得します。
        // 画素値はミリメートルでfloat型です。
        const cv::Mat depth_image = camera.fetchDepthFrame_();

        // 深度画像を可視化します。
        // ただしdepth_imageをそのままimshow()することはできないため、
        // 可視化のためには、深度に応じた色付けをしたうえで表示する必要があります。
        const cv::Mat colorized_image = crewbo::camera::RealSense::colorizeDepthImage_(depth_image);
        cv::imshow("RealSense depth image", colorized_image);
    }
}
```


## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
画像を表示する【道具としての OpenCV 画像認識】

# 本記事でできること
ロボットの手先にカメラを搭載したハンドアイ構成でカメラ画像を取得して表示することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/e38c835c-0dc7-c8d8-ea44-747b06324f90.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 画像を表示する
OpenCVの画像表示では、`cv::waitKey`のたびに描画が更新されるという仕様があります。ここでは備忘録的な感じで、画像をただ表示するだけのプログラムを掲載します。読み込んだ静止画の場合に加え、カメラ画像を取得して更新表示する場合のプログラムを掲載します。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/

## 静止画を表示する場合のプログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat load_image(const std::string file_path) {
    cv::Mat loaded_image = cv::imread(file_path, 1);
    if (loaded_image.empty()) {
        throw std::runtime_error("画像を正常に読み込めませんでした。");
    }
    return loaded_image;
}

int main(void) {
    std::string file_path = "../data/fuji.jpg";
    const cv::Mat loaded_image = load_image(file_path);

    cv::imshow("window", loaded_image);
    cv::waitKey(0);
}
```

## カメラで撮像した動画を表示する場合のプログラム
このプログラムは、クルーボ　スタートアップガイド4章のサンプルプログラムです。
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include "crewbo/crewbo.h"

int main() {
    // デバイス ID, 横解像度 , 縦解像度を設定する。
    crewbo::camera::UsbCamera camera(0, 1280, 720);
    std::cout << "q キー押下で終了します。 " << std::endl;

    while (cv::waitKey(1) != 'q') {
        // カメラ画像を取得する。
        const cv::Mat camera_image = camera.fetchSingleFrame_();

        // 取得画像を表⽰する。
        cv::imshow("camera_image", camera_image);
    }
}
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
UI関係の問題　モバイル

[UI関係のトラブルに戻る](https://qiita.com/Keiji_otsubo/items/cc344223cfa02db6bed7)

# Can't load the list view 

+ [Can't load the list view Salesforce Mobile app](https://salesforce.stackexchange.com/questions/421429/cant-load-the-list-view-salesforce-mobile-app)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5413ac82-45a8-b938-399f-291ec13ea6b9.png)

:::note
I just had this issue in desktop Salesforce, so posting in case anyone is googling for the same answer - "Can't load the listview." The issue was due to the Profile assigned to the user did not have an assigned Publisher Layout.

Setup > Global Actions > Publisher Layouts > Publisher Layout Assignments > Set the Publisher Layout for {Profile} to "Global Layout" > Save

デスクトップ Salesforce でこの問題が発生しました。誰かが同じ答えを Google で検索している場合に備えて投稿します - 「リストビューを読み込めません。」この問題は、ユーザーに割り当てられたプロファイルにパブリッシャー レイアウトが割り当てられていなかったために発生しました。

設定 > グローバルアクション > パブリッシャーレイアウト > パブリッシャーレイアウトの割り当て > {プロファイル} のパブリッシャーレイアウトを「グローバルレイアウト」に設定 > 保存
:::



# Can't complete Consumer Goods Visit on Mobile Device

+ [Can't complete Consumer Goods Visit on Mobile Device](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ph4rb)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bc64727f-d8c6-b739-52f2-69e6c52b9d5f.png)

# 体験サイトに埋め込むことはできましたが、チャットを開いたときにメニューが表示されません。エージェントが利用できませんとだけ表示されます。すでにキューを作成しています。オムニチャネルをアクティブ化しましたが、何が足りないのかわかりません。

+ [Agents not aveilable](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XFJZtSAP)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/16d14574-96d8-ac5e-6fb3-e5deecf32dee.png)

:::note
 I solved it just adding the objects messaging session and chat transciption to the queue
 
オブジェクトのメッセージングセッションとチャットのトランスクリプトをキューに追加するだけで解決しました
:::


# 未解決

+ [Getting error on cg offline mobile application](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBukdSAD)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/30516147-3712-54f4-6e27-da3200b2fc2d.png)

+ [皆さん、こんにちは。モバイルアプリで Trailhead アカウントを開こうとすると、エラーが表示されます。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahYUu)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e1deb8a1-d6e2-fd04-b019-e610189dae5e.png)
SRE Core体験レポート

こんにちは、博報堂テクノロジーズの近藤です。

今回は、グーグル・クラウド・ジャパン合同会社様ご協力の元、**SREのマインド醸成のきっかけを得たため、その経緯や行動変容を紹介します。**

## 背景

所属部署の施策の一環として、グーグル・クラウド・ジャパン合同会社様のコンサルティングサービスを受ける機会がありました。

## 利用サービスの検討

### 社内検討

まず、私たちにとって価値あるサービスを選択するため、受けるべきサービスの議論がありました。具体的には、それぞれが感じている課題をブレインストーミングし、それらを抽象的な単位でグルーピングしています。

-----ブレインストーミング抜粋-----
- データ利用ポリシー、ガイドラインの策定　→【改善】セキュリティ・ガバナンス
- SRE Workbook 実施 →【改善】生産性向上
- SOC部隊立ち上げ →【改善】セキュリティ・ガバナンス
- 災害対策→【改善】可用性
- IAMポリシーの整備、明文化 →【改善】セキュリティ・ガバナンス
- Cloud FinOps Operating Modelの利用→【改善】経営層への提言・コスト削減
-----ここまで-----

方向性は見えてきたものの、**せっかく実施するならば、すぐに効果が出ずとも内部から変化できるものに挑戦したいという思いがあり**、悩ましい状態でした。

### 社外相談

グーグル・クラウド・ジャパン合同会社様に現状を伝えディスカッションを行いました。その中で所属部署のインフラ運用チームの方針として、SREのマインドを取り入れたいという点に焦点が当たり、SRE Coreというプログラムの紹介を受けました。

インフラ運用チームのチームリーダーからは、この学習を通じて**メンバーのマインド向上と共通認識の確立を図ることで、チームの中長期的な成長の基盤を築くきっかけを得られ、**また、SREの知識は**組織として活用・展開でき、部門を超えたプラスの影響がある**との見解がありました。

以上から、部署を超えた効果を期待できるSRE Coreの利用を決定しました。

## SRE Core

### 結論

個人の体感ですが、主に2つの事を経験・学習できました。

- SREの基礎的な概念や、SREを組成するに必要なカルチャーを腹落ち出来るレベルで学習
- SREを行う上で必要な各種指標の定義方法を理解し習得

### 前半戦

まず、SREの知識獲得を行いました。具体的には座学に加え、サンプルアプリケーションを題材とし、SREに必要な各種指標の検討・設定をグループディスカッションにて実施しました。

なお、現在の運用にも即座に適用できる取り組みでもありました。例えば障害対応時の振り返りは、人にフォーカスせずシステムを主語にすることで心理的に安全な環境を生み生産性を向上させる、などです。

**感想**

開始当初は少々緊張気味でしたが、この期間は講師⇔メンバーおよびメンバー間で頻繁にコミュニケーションを取る内容であり、早い段階から講師・メンバーとも打ち解けたと感じました。講義が進む中では、質問から議論に発展することが何度もあり、メンバーが良い熱量を持っていると肌で感じました。加えて、**特定のメンバーのみが質問・議論しているわけではなく、全体的にこのような雰囲気**であり、まだ前半戦ですが開催できてよかったと感じました。

### 後半戦

次に前半戦で学習した内容を、実際に開発・運営しているアプリケーションへ適用する段階となります。具体的に、ビジネス要件を元にアプリケーションにおける実利用者の代表的なアクションを定め、ユーザが満足する期待値の境界※、いわゆるCUJ、SLI、SLOを設定する内容でした。

※：例えばWebアプリケーションであればレスポンスタイム。ユーザの満足と不満足の境界の秒数等。

**感想**

SREはビジネス要求の充足がベースだと考えており、私が今までに経験したインフラ運用チームの考え方とは異なると感じました。また、後半戦では実アプリケーションを扱っており、前半戦よりも複雑で高度な内容でした。
ただ、前半戦の熱量を継続し、SRE Coreの打ち合わせ以外でもチャットでの議論や、ときおり自発的に集まってディスカッションを行うなど、解決に向け主体的な議論を続けました。その結果、講師の方も納得する内容を設定できたと感じます。難易度が高い内容であっても、主体的に取り組み解決へ向けて動けるメンバーが揃っていると感じました。

### 全体の所感

一貫して表面的なワークに終始せず、意図や背景を理解した上で各種指標を設定できたため、他プロダクトへ横展開できる知見が身についたと感じます。これを足掛かりに、**アプリケーションチームやビジネス層との協業を深め、チームの成長に寄与したい**と考えています。

### 印象に残っていること

「**信頼性は100%を目指すものではない**」が、印象に残っています。あくまで、**実利用者の期待値を加味し、ビジネス側の要求を考慮した上で、妥当なラインを見つけていくこと**が大切だと学習しました。元々、私は金融系のインフラエンジニアであり、業種柄、信頼性は100%に近づくほど良い、と潜在的に考えていました。ただ、今回を契機に、必ずしも**100%に近づくことが正しいわけではなく、実利用者とビジネスのバランスが大事**だと、気づいた次第です。

## 感想・行動変容

参加メンバーの感想や行動変容を抜粋し記載します。

- SREの考え方はもとより、カルチャーやマインドを学習できる良い機会だった。特に心理的安全性、つまり分け隔てなく意見出来る環境、については早速自身がリードしているチームの会議等で心掛け実践したい
- 新案件にて、上流フェーズからSLI・SLOを意識した設計を実施する
- 所属チームでSREに関するディスカッションを開始しようと思う
- インフラ担当として今回題材のアプリケーションの仕様を深く理解できたと感じている
- 本番リリース前の監視体制の構築やリスク分析に大いに活かしていこうと考えている
- アウトプットする機会が全体的に高頻度で設けられており、解像度の高い理解が得られた
- そもそもSREが必要なのかを問う場面があったのも印象的だった。今回得たプラクティスをどの様に今の開発サイクルに活用するか検討できればと思っている

## 謝辞

グーグル・クラウド・ジャパン合同会社Professional Services担当の皆様へ、SRE Core実施期間中はもとより、メニュー選定のご相談から細かいことも含め、親身かつ的確なご対応をいただきありがとうございました。不安なくSRE Coreに臨むことができ、また内容も非常に良い体験だったと、参加メンバー含め感じています。
Zscaler環境下でovr-platform-utilを実行できるようにする

Zscaler環境下で[ovr-platform-util](https://developer.oculus.com/resources/publish-reference-platform-command-line-utility/?locale=ja_JP)を実行するとOculusアプリをOculusのプラットフォームにアップロードできませんでした。
この記事ではその問題と対応方法についてメモします。

# 発生する問題

ovr-platform-utilをZscaler環境下で実行すると以下のようなエラーが出力されます。

```batch
A network error occurred. The request will be retried.
```

下記のログを見ると証明書でエラーになっているようです。
ZscalerがSSL検査を行っている場合は通信の中間に割り込みされ、クライアントからの通信先は検査を行うサーバーになるようです（[アプリケーション固有の信頼ストアへのカスタム証明書の追加 | Zscaler](https://help.zscaler.com/ja/zia/adding-custom-certificate-application-specific-trust-store)参照）。
ユーザーのPCには自動的に、検査を行うサーバーの証明書がルート証明書として導入されるようですが、それを利用しないツールなどでは証明書の問題が発生するようです。

また、ログを見るとovr-platform-utilはnodejsで実装されているようです。

```text
2024-03-10T23:07:53.381Z [DEBUG] A network error occurred. The request will be retried.
2024-03-10T23:07:53.382Z [ERROR] Server log: {"app_id":[masked],"client":"COMMAND_LINE","log_level":"ERROR","event_name":"NETWORK_ERROR","stack_trace":"Error: unable to get local issuer certificate\n    at TLSSocket.onConnectSecure (node:_tls_wrap:1530:34)...
```

# 対応方法

NODE_EXTRA_CA_CERTS環境変数にZscalerのルート証明書のパスを設定します。

Zscalerのルート証明書は、環境によって変わるかもしれないですが以下のようにして取得しています。
[コントロールパネル] > [インターネットオプション] > [コンテンツ] > [証明書] > [信頼されたルート証明機関]で[ZScaler Root CA]を選択してエクスポート、[Base64 encoded X.509]を選択して保存
Obsidian読書メモのすゝめ

# どんな記事？
Obsidianを使った個人的読書メモの残し方について紹介しています。
仕事関係で読んだ本については簡単にメモを残すようにしているのですが、いろんなツールを使った結果最終的にObsidianに落ち着いたので、自分の使い方を簡単に紹介しようと思います。

# サンプル
こんな感じでまとめてます。
読了日は結構つけ忘れるので適当なことが多いです。
![スクリーンショット 2024-03-06 18.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576629/6bb62002-c1a6-2414-8adb-370b8af8f64c.png)

# メモり方
## BookSearchプラグインを使ってファイル作成
まず本を読み始めたタイミングで、BookSearchを使ってファイルを作成します。
BookSearchプラグインのインストール方法については、以下公式Githubを参考にしてください。

https://github.com/anpigon/obsidian-book-search-plugin

今回は仮に今読んでいる『科学的根拠に基づく最高の勉強法』の読書メモを残していきます。
BookSearchとテンプレートを使えば簡単に以下のようなファイルが作成されます。
![スクリーンショット 2024-03-06 18.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576629/6ac663d2-370c-6628-99e3-27a4fbc67d36.png)

:::note
テンプレート
```markdown
![cover|200]({{coverUrl}})
## 著者
[[{{author}}]]
## 発行日
{{publishDate}}
## 読了日

## 3選
## メモ
[[読書記録]]
```
:::
自分は使ってないですが、{{category}}なんかも取得できます。

04/02 追記：
テンプレートに読書開始日を追加しました。デフォルトでノートを作成した日付が入るようにしています。
```
## 開始日
{{Date:YYYY-MM-DD}}
```

## ひたすらメモる
あとは読みながら気になったことをメモしていきます。
ちなみにこのメモは本を読みながらではなく、本を閉じて行うことをお勧めします。
なぜなら、本の内容を思い出すという行為で脳に負荷をかけることで、記憶への定着がいくらか期待できるからです。
『科学的根拠に基づく最高の勉強法』に記載されている「アクティブリコール」の簡易版といった感じです。気になった方は是非この本を読んでみてください。為になる情報がたくさん載っていてお勧めです。
[科学的根拠に基づく最高の勉強法](https://www.amazon.co.jp/dp/4046067233)

## 読了後に3選を決める
本を読み終えたら、メモした内容のうち特に印象が残ったものを3つ抜き出してまとめます。
メモった内容全てを脳みそに入れていられたら最高だと思うんですけど、そんなに多くのことを覚えておけないので、**自分は1冊につき3つの項目を覚えるようにしています**。
最後に読了日を埋めて、読書メモ完成です。

# 終わりに
ObsidianはBookSearchプラグイン以外にも、obsidian-kindle-pluginというKindleとの連携が取れるプラグインもあるので、Kindleで本を読まれる方はこちらもお勧めです。
自分は紙書籍大好きなので残念ながら使えないですけど😓

04/02 追記：
コメントでのご指摘を踏まえて、本記事のタイトルを変更しました。
【環境変数】ツールごとの環境変数追加、削除方法

業務上で環境変数を追加したり削除したり、というのをたまにやるのですが、久しぶりにやると忘れてしまうのでメモとして記事にする。

私はterminal(Mac), cmd, powershell, GitBashを利用するので、このそれぞれにおける環境変数の追加、削除方法を記載する。

# terminal
```terminal
// 環境変数の一覧表示
$ env

// 環境変数の追加
$ export HTTP_PROXY="PROXY"

// 環境変数の削除
$ export HTTP_PROXY=""
```

# cmd
```terminal
// 環境変数の一覧表示
> set

// 環境変数の追加
> set HTTP_PROXY="PROXY"

//  環境変数の削除
> set HTTP_PROXY=""
```

# powershell
```terminal
// 環境変数の一覧表示
> Get-ChildItem env:

// 環境変数の追加
> New-Item Env:HTTP_PROXY -Value PROXY

// 環境変数の削除
> Remove-Item env:HHTP_PROXY
```

# Git Bash
```terminal
// 環境変数の一覧表示
$ env

// 環境変数の追加
$ export HTTP_PROXY="PROXY"

// 環境変数の削除
$ export HTTP_PROXY=""
```

# まとめ
上記に記載したコマンドはあくまでも一例。
他にも色々ありますが、私は基本的に上のコマンドを使うことが多い。

コマンドラインツールによって様々なので覚えるのは難しいが、調べる時間短縮になれば。

以上。
AWS LambdaでPythonの外部ライブラリを設定する方法

# 概要
Lambdaでは、Python標準ライブラリとAWS SDK for Pythonしか使用できません。
また、Lambda上ではpipによる外部ライブラリのインストールもできません。

そのため、必要なライブラリは自分で調達してくる必要があります。
ここでは、外部ライブラリの調達と設定方法について解説します。


# 手段
Lambdaでは外部ライブラリを配置できる場所が2つあります。

* Lambdaレイヤー
* Lambda関数ごとのコード置き場（フォルダ/ファイル構成）

配置場所はどちらでもよいのですが、枯れた技術（アップデートの頻度が少ないモジュールや外部ライブラリ）はLambdaレイヤー配置するのが、一般的な作法なようです[^1]。
今回は**Lambdaレイヤーに外部ライブラリを配置**する方法を取ります。


# 外部ライブラリを取得する
外部ライブラリは公開先からダウンロードしてよいですが、```pip install -t```でローカルに落としてしまうのが手っ取り早いです。

AWS環境で完結させるなら、外部ライブラリ調達用にCloud9を１つ作成し、以下を順番に実施すればOKです。
以下、python-joseの最新バージョンをインストールしています。

```shell
mkdir lib & cd lib # このフォルダ名は何でもOKです
mkdir python & cd python # Lambdaレイヤーに必要なpythonフォルダの作成
pip install python-jose -t .

Collecting python-jose
  Downloading python_jose-3.3.0-py2.py3-none-any.whl (33 kB)
Collecting rsa
  Downloading rsa-4.9-py3-none-any.whl (34 kB)
Collecting pyasn1
  Downloading pyasn1-0.5.1-py2.py3-none-any.whl (84 kB)
     |████████████████████████████████| 84 kB 3.0 MB/s             
Collecting ecdsa!=0.15
  Downloading ecdsa-0.18.0-py2.py3-none-any.whl (142 kB)
     |████████████████████████████████| 142 kB 14.6 MB/s            
Collecting six>=1.9.0
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, pyasn1, rsa, ecdsa, python-jose
Successfully installed ecdsa-0.18.0 pyasn1-0.5.1 python-jose-3.3.0 rsa-4.9 six-1.16.0
```
:::note
フォルダ階層は```lib/python```としていますが、```lib```の部分は他の名前でもOKです。
```python```はLambdaレイヤーにアップロードするフォルダ名称と必須なので、ここは変えないようにしてください。
:::

:::note
今回インストールしたpython-joseでは、アップデートにより依存関係が変わっています（筆者の場合、v3.1.0->v3.3.0でecdsaが新たに追加）。
公開先からインストールすると依存関係は含まれない場合があるので、依存関係を含むように```pip install```するのが簡単かと思います。
:::

# 外部ライブラリを固める
インストールした外部ライブラリをzipで固めます。

```shell
cd ../ # libフォルダへ移動
zip -r python-jose.zip python
```

作成した```python-jose.zip```をダウンロードします。


# Lambdaレイヤーへのアップロード
再度にダウンロードしたzipファイルを、レイヤーにアップロードすればOKです。
Lambdaレイヤーでは特に注意すべきポイントはないですが、**互換性のあるランタイム**をきちんと設定しておくことで、レイヤーと互換性のあるラインタイムLambda関数でレイヤーを追加する場合に**カスタムレイヤー**で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3706974/edb72de3-2634-7226-f291-5ae7e7bacc83.png)

:::note
上記のカスタムレイヤーのドロップダウンボタンから、レイヤーを簡単に選択できます。
:::


# まとめ
AWS LambdaでPythonの外部ライブラリを設定する方法をご紹介しました。
個人的には外部ライブラリはLambdaレイヤーに配置する方針が良いと思いますが、１つのLambda関数につき追加できるLambdaレイヤーの最大数は５個までの制限があります。
その場合はコード側に置いたり、複数の外部ライブラリをまとめたりしておきましょう。


[^1]:確かAWS DevDay2023の講演で聞きました。ただし、Lambdaライブラリは最大5個の制限があるので、ご注意ください。
CloudFormationスタック間の依存リソースの削除方法

## はじめに

CloudFormationを使用すると、AWSリソースのプロビジョニングと管理を自動化できます。しかし、複数のスタックが相互に依存している場合、特定のリソースを安全に削除するには注意が必要です。

## スタックの依存関係の理解

まず、スタック間でどのような依存関係があるかを理解することが重要です。例えば、スタックAがVPCを作成し、スタックBがそのVPC内にサブネットを作成する場合、スタックBはスタックAに依存しています。

## 削除プロセス

依存するスタックのリソースを削除するには、以下のステップに従います。

1. **依存するスタックの特定**: どのスタックが削除しようとしているリソースに依存しているかを特定します。
2. **依存スタックの更新**: 依存するスタックを更新し、依存リソースへの参照を削除します。
3. **リソースの削除**: 依存リソースへの参照がなくなったことを確認した後、リソースを安全に削除できます。
4. **スタックの削除**: 必要に応じて、関連するスタックを削除します。

## 注意点

- スタックの削除や更新を行う前には、必ずバックアップを取ることをお勧めします。
- 依存関係が複雑な場合は、ステップバイステップで慎重に進めることが重要です。

## まとめ

CloudFormationを使ったリソース管理は非常に強力ですが、複数のスタック間の依存性を適切に管理することが重要です。この記事を通じて、依存リソースの削除プロセスについての理解を深め、より安全にCloudFormationを活用していただければ幸いです。
【Flutter】AndroidでImage.networkが表示されない問題を解説

# はじめに

こんにちは！
Flutter開発を始めて2年目となるエンジニアです！

ある日、後輩から「Image.networkが表示されないです。」っていうヘルプが飛んできました。
終業間近だったためとりあえずプッシュしておいてもらい、その場は終わり、デバッグしてみると確かに画像が読み込まれない赤の罰が表示されていました。

今回の記事では、これの原因と解決方法を解説します。

# こんな人に読んでほしい

* Flutterでの開発を行っている方
* Flutterでの開発を検討している方
* Flutter初学者の方

# エラーコード

```
SocketException: Failed host lookup: ‘{project}’ (OS Error: No address associated with hostname, errno = 7)
```

# 原因

結論、Androidエミュレータからネットワークに接続して画像を表示させようとした際に、AndroidManifest.xmlで接続許可をしないといけませんでした。

未経験のエンジニアがExceptionと対峙した時、なかなか原因が掴みにくいかもしれません。

今回問題となっていたSocketExceptionは、

Socket(ソケット)

の

Exception(例外)

になるので、Socketって何を指しているんだろう？？から考えるとわかりやすいかもしれませんね。

ちなみに、以下の記事がわかりやすかったです！！

https://wa3.i-3-i.info/word168.html

つまり、端末とネットワークを繋げる部分で例外が発生しているみたいですね！

ここまで来ればもう簡単。

# 対応

解決方法は、```{project}/android/app/src/main/AndroidManifest.xml```に、インターネット利用許可のパーミッションを1行追加するだけでOK。

```xml
<manifest xmlns:android="http://~~"
    package="com.{project}">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> // ここを追加！！！
    <application
        android:label="{project}"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
    ~省略~
</manifest>
```

設定がしたら、再度デバッグもしくはエミュレータを立ち上げ直してみてください！

# 最後に

エラーやExceptionは原因を教えてくれてるもの。
最初は解決までに時間がかかるかもしれませんが、真っ赤な文字と向き合ってみてください！

以上、最後まで読んでいただいてありがとうございました！
Websocketで、異空間通信。その4

# 概要
メタバースを使った、ライントレースシュミレーターを提供します。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c5c30b22-4097-cf55-3ea2-8ad88bea0ef3.png)


# 詳細
エージェント（ローバー）が環境で、ライントレースするシュミレータを作り、結果をwebsocketに出力、neosvrで受け取り、ＢＯＸを移動させる。
websocketサーバーは、elixirで準備します。
エージェントと環境は、Plunkerで提供します。
設定は、ローバーが、ライントレースを続けるシュミレーターです。

```
var Agent = function() {
  this.act = 2;
};
Agent.prototype.get_action = function(observation, reward, done) {
	var res = this.act;
	if (observation[3] < 100)
	{
		res = 0;
	}
	else
	{
		res = 1;
	}
	return res;
}
Agent.prototype.l = function() {
  this.act = 0;
}
Agent.prototype.r = function() {
  this.act = 1;
}
```


画面の下にある5つのグレーがセンサーです。
ちなみに、aは、回転角、xyzは、座標です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7be3e915-4b4d-b2db-f2a5-9dbb611f4cf8.png)




10ミリ秒毎にagentが呼び出されて、アクションを求められます。
その際、センサーの値だけが送られます。

r = agent.get_action(observation, reward, done);
   
observation: [255, 255, 0, 0, 0]
reward: 1.0
done: false
その値でagentがアクションを返します。
アクションは、2が真っ直ぐ、0が右、1が左です。

環境は、６０ｆｐｓで更新し、ローバーを移動し、位置を更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c9af9aa8-71c4-d90b-b858-b50e418a1455.png)

ローバーは、センサーの値を受け取り、方向量ベクトルを出力します。

さらに、ローバーの位置情報をwebsocketで、垂れ流しします。
neosvrは、ローバーの位置情報をwebsocketで受け取り、ＢＯＸを移動させます。




# 成果物

https://embed.plnkr.co/plunk/JaY2pR126MNEuJG7



以上。
Flow scheduled path

[Flowに関するまとめページに戻る](https://qiita.com/Keiji_otsubo/items/55ebc9c634a3216f3990)

# 摘要事例

+ [Creating Flow for Email Alerts Based on Reminder Date and Time](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBmlmSAD)

:::note
You can use a scheduled path to send the reminder like 1 minute after the reminder date time

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8697e2b5-fb80-265e-7efb-edb5ff03cff5.png)

スケジュールされたパスを使用して、リマインダー日時の 1 分後などにリマインダーを送信できます。
:::


# エラー

+ [Can I run a Scheduled Path - Flow ever time a record is updated and meets the condition requirements?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBF27)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2ab26b6d-7a5c-852d-cfe1-680c0e61c7fa.png)

:::note
You are currently limited to using the "only when..." option with a scheduled path, although there are workarounds (see link: https://admin.salesforce.com/blog/2022/how-i-solved-it-run-a-flow-scheduled-path-based-on-a-field-change).

If you are just looking to utilize async and don't actually need the time gap, checking the "async" path checkbox will work with the setup you described.

現在、スケジュールされたパスで「only when...」オプションを使用することに制限されていますが、回避策はあります (リンクを参照: https://admin.salesforce.com/blog/2022/how-i-solved-it-フィールド変更に基づいてフロースケジュールされたパスを実行します)。

非同期を利用したいだけで、実際に時間のギャップが必要ない場合は、「非同期」パスのチェックボックスをオンにすると、説明した設定で機能します。
:::

+ [【未解決】$Record - This flow has a scheduled path with a time source based on when the record was created or updated. Configure your flow to run only when a record is updated to meet the requirements of your condition.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZAh0Q)

+ [【設定ができてなかった】スケジュールパスで実行される指定日時条件の決定要素のみがデフォルト結果になってしまう](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmIIw)

+ [【未解決】リードが作成日から 2 日経過し、キューから「要求」されていない場合に電子メール アラートを送信するフローが機能していません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifct6)
値をキャッシュするという発想

色々な事情で、コンストラクタの初期化処理後にプロパティの値を生成する処理を1インスタンスにつき1回だけ行いたいケースがありました。

そんなときは値をキャッシュする手があるということを先輩社員にアドバイス頂きました。（Ruby だと [自己代入](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html) `||=` みたいな処理）

例： Fugas という配列の値をキャッシュする場合

```cs
class Hoge
{
    private Fuga[] _fugas;

    private Fuga[] Fugas
    {
        get
        {
            // Fugas は一度だけ作成
            if (!(_fugas is null))
            {
                return _fugas;
            }

            // _fugas の値をセットする何らかの処理
            // _fugas は何らかの理由でコンストラクタで値がセットできない値を想定。
            // 処理は省略

            return _fugas;
        }
    }
}

```

ただし、このようなケースが発生する時点で根本的な設計に問題がある可能性もあるかもしれません。

ですがアイディアとして知っておいて損はないテクニックだなと思いました。
【Shopify】商品公開で「新着」ラベルを表示

Downテーマでの編集。

```Liquid:card-product.liquid
～～～
{{ 'component-rating.css' | asset_url | stylesheet_tag }}

<!-- 新着ラベルCSS -->
{{ 'new_label.css' | asset_url | stylesheet_tag }}

{%- if card_product and card_product != empty -%}
  {%- liquid
    assign ratio = 1
    if card_product.featured_media and media_aspect_ratio == 'portrait'
      assign ratio = 0.8
    elsif card_product.featured_media and media_aspect_ratio == 'adapt'
      assign ratio = card_product.featured_media.aspect_ratio
    endif
    if ratio == 0 or ratio == nil
      assign ratio = 1
    endif
  -%}
  <div class="card-wrapper product-card-wrapper underline-links-hover">
    <div
      class="
        card
        card--{{ settings.card_style }}
        {% if card_product.featured_media %} card--media{% else %} card--text{% endif %}
        {% if settings.card_style == 'card' %} color-{{ settings.card_color_scheme }} gradient{% endif %}
        {% if extend_height %} card--extend-height{% endif %}
        {% if card_product.featured_media == nil and settings.card_style == 'card' %} ratio{% endif %}
        {% if horizontal_class %} card--horizontal{% endif %}
      "
      style="--ratio-percent: {{ 1 | divided_by: ratio | times: 100 }}%;"
    >
  
<!-- 新着ラベルを表示 -->
<!--   商品がストアで公開されたときのタイム情報 -->
<!--   コレクションページに表示するのでcard_product.published_at -->
<!--   商品詳細ページに表示するにはproduct.published_at -->
{%- assign published_date = card_product.published_at | date: '%s' -%}
{%- assign current_date = 'now' | date: '%s' -%}
{%- assign passed_days_from_publish = current_date | minus: published_date | divided_by: 86400 -%}
<!-- 商品が公開されて3日以内の場合。”3”は任意の数字に変更可能 -->
{%- if passed_days_from_publish <= 3 -%}
<span class="product__label">NEW</span>
{%- endif -%}
```

```css:new_label.css
.product__label {
    color: #fff;
    display: inline-block;
    font-size: 14px;
    font-weight: bold;
    margin-right: 10px;
    padding: 2px 10px;
    width: 100%;
    background: red;
}
```

商品を下書き⇒公開にした場合商品カードにラベルが表示される。

![スクリーンショット 2024-03-11-465.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680582/a88b3ff2-e735-5221-f249-28877f4ec656.jpeg)
【Laravel】useした時に`Class not found`とでて困った話


# はじめに

こんにちは、プログラミングを始めて約3年のエンジニアのkeitaMaxです。

今回は、`Class "Lib\UsePost" not found`というエラーがでてしまって困った話をします。

# 困ったこと

Laravelプロジェクト直下に`Lib`というディレクトリを作成し、'UsePost.php'というファイルを作成したのですが、

これをコントローラから読み込もうとしたときに`Class "Lib\UsePost" not found`となってしまい読み込むことができなくて困ってしまいました。


# 最初に実装した内容

最初に実装した内容としては、`PostController`と`UsePost`を以下のように実装しました。


```php:PostController.php
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Lib;

class PostController extends Controller
{
    public function count():int
    {
        $usePost = new Lib\UsePost;
        $count = $usePost;
        return $count";
    }
}
```

```php:UsePost.php
<?php
namespace Lib;

class UsePost
{
    function count():int
    {
        return 1;
    }
}
```
ファイルの構成としては以下のような感じで作成しました。
```
src/
 ├── app/Http/Controllers/PostController.php
 ├── lib/UsePost.php
```

# 解決策

https://qiita.com/notosan_as/items/c0574c141708a639ff63

この記事に書いてありました。

`composer.json`の`autoload`に今回作成した`lib`ディレクトリを追加し、composerを読み込みなおします。

具体的には、`composer.json`を以下のように修正しました。

```json:composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Lib\\": "lib/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
```
変更したら以下のコマンドでcomposerの再読み込みを行いました。
```
composer dump-autoload
```

これで冒頭に困っていた`Class "Lib\UsePost" not found`は消えて動くようになりました。


# なぜエラーがでていたのか

今回作成したファイルがLaravelのオートロード機能で読み込まれていなかったことが原因でした。

オートロード機能とは、ファイルを自動で読み込んでくれることによって`require`をいちいちファイルの冒頭に書かなくてもよくなるというものです。

以下のサイトで詳しく紹介されていましたので、ここを読んでみるとわかりやすかったです。

https://laraweb.net/surrounding/1642/

Laravelだと`composer.json`に書かれているファイルを読み込むという仕様でしたので、今回は新しく自分でフォルダを作成したために、オートロード機能で読み込まれずに`Class "Lib\UsePost" not found`が出てしまっていました。

また、PHPのオートローダ機能については以下の公式サイトを読みました。

https://www.php.net/manual/ja/language.oop5.autoload.php


# おわりに

私自身、Laravelはオートローダ機能をあまり理解していないて今まで使用してしまっていたので、今回はいい機会になったかなと思います。

Laravelの機能について知らないことがまだまだたくさんあるので、これからはどのようにその機能が実装されていて、それによってどのようなメリットを得られているかなど、深く考えていこうと思いました。

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

最後まで読んでいただきありがとうございました！

# 参考文献

https://qiita.com/notosan_as/items/c0574c141708a639ff63

https://laraweb.net/surrounding/1642/

https://www.php.net/manual/ja/language.oop5.autoload.php
LinuxとWindowsコマンド対比表

## 要　旨
LinuxコマンドとWindowsコマンド(Power Shell)の主要なものを対比表形式で記述します。
## 記述対比表
|コマンドの意味|Linuxコマンド|Windowsコマンド|
|--------------|-------------|---------------|
|現在のディレクトリ|pwd|@cd|
|クリア|clear|cls|
|ファイルやディレクトリの情報表示|ls|dir|
|コピー|cp|copy|
|移動|mv|move|
|名前変更|mv|ren|
|削除|rm|del|
|ディレクトリ作成|mkdir|mkdir|
|空ファイル作成|touch|copy nul foo.txt|
|ファイル検索|find|find|
|通っているパス確認|echo $PATH|echo %PATH%|
|コマンドの場所確認|which|where|
|ディスクや空き領域調査|df -h|Get-PSDrive,Get-Volume|
|パソコンの性能評価|- |Winsat formal|
|スコア（点数）表示|-|Get-CimInstance Win32_Winsat|
## 結　言
今回は、LinuxコマンドとWindowsコマンド(Power Shell)の主要なものを対比表形式で記述しました。