OmniAICreator/Qiita-1.07M huggingface dataset:
inotify-tools + rsyncでディレクトリを同期する

# inotify-toolsをインストールする

```
[root@ip-10-0-0-4 ~]# yum list inotify-tools
Last metadata expiration check: 0:01:19 ago on Mon Jul 31 11:41:41 2023.
Available Packages
inotify-tools.x86_64                    3.22.1.0-4.amzn2023                    amazonlinux
[root@ip-10-0-0-4 ~]# yum install inotify-tools
・・・

Installed:
  inotify-tools-3.22.1.0-4.amzn2023.x86_64                                                

Complete!
[root@ip-10-0-0-4 ~]# 
```

```
[root@ip-10-0-0-4 ~]# mkdir src1
[root@ip-10-0-0-4 ~]# mkdir src2
[root@ip-10-0-0-4 ~]# ls -al
・・・
drwxr-xr-x.  2 root root   6 Jul 31 11:43 src1
drwxr-xr-x.  2 root root   6 Jul 31 11:43 src2
[root@ip-10-0-0-4 ~]# 
```
# src1にアップされたファイルをsrc2にコピーする
```
[root@ip-10-0-0-4 ~]# inotifywait -m /root/src1 | xargs -I{} rsync -r /root/src1/ /root/src2/
Setting up watches.
Watches established.
・・・
```

# 試す
```
[root@ip-10-0-0-4 ~]# touch /root/src1/test01.txt
[root@ip-10-0-0-4 ~]# ls -al src1
total 0
drwxr-xr-x. 2 root root  24 Jul 31 11:46 .
dr-xr-x---. 5 root root 127 Jul 31 11:43 ..
-rw-r--r--. 1 root root   0 Jul 31 11:46 test01.txt
```
とすると、
```
[root@ip-10-0-0-4 ~]# ls -al src2
total 0
drwxr-xr-x. 2 root root  24 Jul 31 11:46 .
dr-xr-x---. 5 root root 127 Jul 31 11:43 ..
-rw-r--r--. 1 root root   0 Jul 31 11:46 test01.txt
```

# 参考URL
https://tech-blog.s-yoshiki.com/entry/168#inotifywait--rsync-%E3%81%A7%E5%90%8C%E6%9C%9F%E3%81%99%E3%82%8B
java アウトプット 繰り返し処理

# 拡張for文を理解しよう
配列から要素を取り出すために、拡張for文を使ってみましょう。
```java
class Main {
  public static void main(String[] args) {
    int[] scores = {1, 5, 10};

    for(int score : scores) {
      System.out.println(score);  
    }
  }
}
```

コードを実行すると以下の通りになる。
```
1
5
10
```
# 拡張for文の使い方を理解しよう
拡張for文を使用する際の構文を確認しましょう。
```java
for ( 要素を格納する変数宣言  :  配列あるいはArrayListの変数名) {
  取り出した要素を使用して行う処理
}
```
この記述を行うと、以下のように動作します。

① 配列、あるいはArrayListから要素を1つ取り出す
② 取り出した要素を変数に代入する
③ {}内の処理を行う
④ 配列、あるいはArrayListの要素数分だけ処理を繰り返す

先ほど以下のようにコードを記述しましたが、変数scoresから要素を取り出し、ing型の変数scoreに代入するという動作になっています。
```java
for(int score : scores) {
  System.out.println(score);  
}
```
java アウトプット 条件分岐

# if文を使ってみよう
```java
class Main {
  public static void main(String[] args) {
    int value = 3;

    if (value > 0){
      System.out.println("値は正です"); 
    }
  }
}
```
記述できたらコードを実行しましょう。
`「値は正です」`と出力されます。

# if文の使い方を理解しよう
if文は以下のように記述します。
```java
if ( 条件式 ) {
  条件式を満たす時に実行する処理
}
```
Rubyでの記述方法と異なるのは以下の点です。

・条件式を（）で囲む必要があること
・行いたい処理を{}で囲む必要があること

さらに細かい条件を指定するためのelseやelsifについて、RubyとJavaで大きな違いはありません。
```java
class Main {
  public static void main(String[] args) {
    int value = 3;

    if (value > 0){
      System.out.println("値は正です"); 
    }else if (value < 0){
      System.out.println("値は負です"); 
    }else {
      System.out.println("値は0です"); 
    }
  }
}
```
基本的に使い方は同じで、以下のように記述します。
```java
if (条件A) { 
  // 処理A
} else if () {
  // 処理B
} else {
  // 処理C
}
```
条件を満たすかどうかで分岐が行われ、以下の動作になります。

条件Aが「真」の時は処理Aが実行される
条件Aは「偽」で、条件Bが「真」の時は処理Bが実行される
全ての条件が「偽」の時は処理Cが実行される
このように処理の流れはRubyと一緒ですが、__Rubyの「elsif」は、Javaでは「else if」__ と記述することに注意しましょう。
java アウトプット　配列

Javaの配列は、格納する要素の数を最初に決める必要があり、かつ後で要素数を変更することができません。
要素を増やす場合は、サイズの大きな配列を新たに作成して元データをコピーするか、ArrayListというリストの一種を使用します。

ArrayListは要素の数を変更できる配列のようなもので、ウェブアプリケーション開発ではよく使用されます。

# 配列を使ってみよう

```java
class Main {
  public static void main(String[] args) {
    int[] scores;
    scores = new int[3];

    scores[0] = 1;
    scores[1] = 5;
    scores[2] = 10;

    System.out.println(scores[0]);
    System.out.println(scores[1]);
    System.out.println(scores[2]);
  }
}
```

以下のように結果が表示されます。

```
1
5
10
```

# 配列の使い方を理解しよう
① 配列の宣言を行う
② 配列の要素を作成し、配列に代入する
③ 配列の要素に値を代入する

__① 配列の宣言を行う__
宣言は以下のように行います。
```java
int[] scores;
```
前の章で、整数型の変数を宣言する時は、`int score;`といった記述をすると学習しました。

それと同じように、int型の整数を格納する配列の宣言は`int[] scores;`と記述します。

この「int」は要素として格納したいデータ型を指定するもので、例えばlong型の整数を格納する配列なら`long[] scores;`のように宣言します。

__② 配列の要素を作成し、配列に代入する__
 先ほど以下のコードを実行しました。
```java
scores = new int[3];
```
右側部分の`new int[3];`はint型の要素を３つ作成するということである。

__③ 配列の要素に値を代入する__
```java
scores[0] = 1;
```
配列scoresの1番目の要素に「1」を代入しています。
「1番目」を表すインデックスとして「0」を指定します。
また、配列の要素を取り出すときは、以下のように行います。
```java
scores[0]
```
# 配列のさまざまな記述方法を理解しよう
__① 配列の宣言と同時に、要素の作成も行う方法__
先ほど実行したコードでは、以下のように配列の宣言と要素の作成を別に行っていました。
```java
int[] scores;
scores = new int[3];
```
以下のように1行で記述することもできます。
```java
int[] scores = new int[3];
```

__② 配列の宣言時に型推論を使用する方法__
配列でも型推論を使用することができます。
```java
var scores = new int[3];
```
int型の要素３つを代入することで、scoresはそれらを格納する配列であることが推論されています。


__③ 配列の宣言から値の代入まで全て同時に行う方法__
配列の宣言時に代入する値が確定している場合は、以下のように記述を省略することができます。
```java
int[] scores = {1, 5, 10};
```

# リストを理解しよう
__ArrayListを理解しよう__
ArraListは「可変長配列」を使用するための仕組みです。可変長配列とは、文字通り長さ（要素数）を変更できる配列のことです。

Rubyの配列は可変長なので、Javaの配列よりもArrayListの方が性質や使い方が近いものとなっています。
```java
import java.util.ArrayList;

class Main {
  public static void main(String[] args) {
    ArrayList<Integer> scores = new ArrayList<Integer>();

    scores.add(1);
    scores.add(5);
    scores.add(10);
    scores.add(15);

    System.out.println(scores.get(0));
    System.out.println(scores.get(1));
    System.out.println(scores.get(2));
    System.out.println(scores.get(3));
  }
}
```
ArrayListを使用する際は、事前にライブラリのインポートが必要です。
上記のコードを記述する際は、1行目にimport文があることに注意しましょう。

# ArrayListの使い方を理解しよう
① ライブラリをインポートする
② ArrayListの宣言を行う
③ ArrayListに値を代入する
④ ArrayListから要素を取り出す

__① ライブラリをインポートする__
```java
import java.util.ArrayList;
```

__② ArrayListの宣言を行う__
以下のように行います。
```java
ArrayList<データ型> scores = new ArrayList<データ型>();
```
先ほどのコードでは
```java
ArrayList<Integer> scores = new ArrayList<Integer>();
```

ここで行っているのは、以下の２つの動作です。

① 整数（Integer）を格納するArrayListを「score」という名称で宣言
② ArrayListの要素を作成

そして、①に②を代入しています。

なお、要素のデータ型を右辺でも指定していますが、これは省略することが可能です。
以下のように記述しても問題なく動作します。

```java
ArrayList<Integer> scores = new ArrayList<>();
```

__③ ArrayListに値を代入する__
ArrayListに要素を追加するためにはaddメソッドを使用します。

記述は、add(要素として追加する値)のように行います。

先ほど実行した以下のコードでは、scoresという名称のArrayListに「1」を追加しました。
```java
scores.add(1);
```

__④ ArrayListから要素を取り出す__
記述は、`get(取得したい要素のインデックス）` のように行います。配列から要素を取り出す際と同様に、「1番目」の要素を取り出したい時は、インデックスとして「0」を指定します。
```java
scores.get(0)
```
SpringBootTestでテスト時のみ使用するRestControllerを作成

<code>@SpringBootTest</code>の際にmockなどではなくテスト時のみ有効になる```@RestConroller```を使いたい場合のやり方について。```@TestConfiguration```で```@RestConroller```を定義する。

# ソースコードなど

```gradle:build.gradle
plugins {
  id 'java'
  id 'org.springframework.boot' version '3.1.2'
  id 'io.spring.dependency-management' version '1.1.2'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
  sourceCompatibility = '17'
}

configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  compileOnly 'org.projectlombok:lombok'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
  useJUnitPlatform()
}
```

```java
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class IntegrationTest {

  @LocalServerPort
  int port;

  @Test
  void test() {
    RestTemplate client = new RestTemplate();
    String result = client.getForObject("http://localhost:" + port + "/sample", String.class);

    System.out.println(result);
  }

  @TestConfiguration
  @RestController
  static class Hoge {

    @GetMapping("/sample")
    String sample() {
      return "sample";
    }
  }
}

```
SORACOM Harvest DataのデータをCSV形式で自動取得する（前編）

# 概要
SORACOMのサービスを使うと簡単にデータをクラウド（SORACOM Harvest Data）にアップロードできます。
アップロードしたデータはユーザーコンソールからCSVでダウンロードすることができますが、SORACOM CLIやSORACOM APIを使う場合はJSON形式しか選択できません。

https://users.soracom.io/ja-jp/docs/harvest/download/

自動でCSVを取得したかったので、ETLツールのTalend Open StudioでAPIからJSONデータをダウンロードして、Python（pandas）でCSVに変換する方法で実現してみました。

前編では環境構築について説明します。

# 手順

## インストール
下記リンクを参考にツールをインストールします。
- [Talend Open Studio](https://qiita.com/ozk009/items/1ca40a4d6c12285632e2)
- [Python(pandas)](https://qiita.com/ozk009/items/bb917529e13f65aa7b8d)[^1]
[^1]: Windowsサーバー用の説明になっていますが、Windowsパソコンでも同様の作業になります。

## SORACOM環境構築
Harvest Dataのダウンロードをするため、SAMユーザーを作成します。
1. ユーザーコンソールログイン後、右上のユーザーIDをクリックし、「セキュリティ」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/4132b7b5-9f96-a1ab-41db-d3253e6481fa.png)
1. 「SAMユーザー作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/8b452d82-9305-9ad3-7e52-823c05584180.png)
1. 任意の名前を入力し、「作成」をクリックする（ここでは「harvest_data」としています）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/0b8386c1-974c-05e0-162e-513fdeec9bce.png)
1. 一覧から作成した名前のリンクをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/420cc7bd-59cf-7fab-2429-98f9de2e7a2f.png)
1. 権限設定でテンプレート選択から「Harvestのデータの参照のみ許可」を選択して、「コピー」ボタンをクリックし、入力欄に張り付けて「保存」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/839c2b20-83ff-68aa-8c64-55eec4f842bb.png)
1. 認証設定に移り、「認証キーを生成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/eb174292-1047-a057-6216-4652c207c966.png)
1. 認証キーが作成されるので、「クリップボードにコピー」をクリックし、テキストエディタなどに張り付けておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/3740e64b-b775-834b-65fe-b1333ae5a5c2.png)

以上で前編を終わります。
[中編](https://qiita.com/ozk009/items/95eed592ff56813e6215)ではデータのダウンロードとCSV作成について説明します。
GitHubActions workflow初心者おぼえがき　～変数のスコープ～

## いくつかのジョブを実行したい
ジョブとはこれのことである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/dd0fa59f-a477-93ac-bd15-b2d68759e6fb.png)

今回はいくつかのジョブを繋げて、順番に（直列に）実行したい　ってイメージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/83173bb8-61e4-113c-1f39-7ce1ce9e7613.png)
分けて何が嬉しいのかというと、再利用（Javaの継承みたいなこと）ができたり、コードが見やすくなったり、失敗/エラーになったときに「ひとつのジョブを飛ばす」なんてこともできる。便利。適度に分けよう。
複数同時に（並列に）実行することもできるけど、今回は<b>直列</b>のやり方のみ説明。

### jobs の中身
```yml
jobs:
  # GitHubの画面(UI)上で指定した変数を表示する
  workflow-start:
    runs-on: ubuntu-latest
    steps:（略）

  # 環境変数を表示する
  workflow-env:
    needs: workflow-start
    runs-on: ubuntu-latest
    steps:（略）
```

コードと画面の関係。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/e135ae13-355a-d25c-0787-be30e3d8761d.png)

## その他
初心者おぼえがき類。
- [GitHubActions workflow基本のキ](https://qiita.com/konnbu/items/1c6c8fb67821f8b507e2)
- [GitHubActions workflow初心者おぼえがき　～複数のjob実行～](https://qiita.com/konnbu/items/c43f42e6b3da1e9614fb)
Android の端末の言語設定をコマンドで変更したい

# 概要
端末の言語設定を毎回手動で変更するのが面倒だったので、楽にできる方法をまとめました。

## adb コマンドで設定画面を開いてから言語を変える

```shell
adb shell am start -a android.settings.LOCALE_SETTINGS
```
言語設定画面はメーカーやAndroidのバージョンによって導線が微妙に違ったりするので、これを使うとちょっと楽になるかも。

## ドキュメントに書いてある方法
こちらに記載されている方法です。
https://developer.android.com/guide/topics/resources/localization?hl=ja

```shell
adb shell
setprop persist.sys.locale fr-CA
```

のような感じで簡単に変更できそうな感じで書いてありますが、実際に試すと効果はありません。

## customlocal2 経由で変更する
```shell
adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE "en_US" com.android.customlocale2
```
API Level 28が提供されていた頃はエミュレーターに com.android.customlocale2 同梱されていたようで、これに対して broadcast intent を投げることで、言語を変更できていたようです。

これもうまくいきません。

```shell
adb shell pm list packages | grep locale
```
で package をチェックしてもないので、同梱されなくなったとものと思われます。

## 言語を変更するアプリを用意して、それ経由で言語を変更する
言語を変更するAPI自体は用意されているので、それを実行すれば言語を変更することができます。

ただアプリを書くのがめんどくさいので、appium が提供している設定ツールを使ってみることにしました。

https://github.com/appium/io.appium.settings

release タブから apk をダウンロードして adb install して grant するだけ。簡単。

```shell
# アプリに言語を変更する権限が必要なので付与してあげる
adb shell pm grant io.appium.settings android.permission.CHANGE_CONFIGURATION

adb shell am broadcast -a io.appium.settings.locale -n io.appium.settings/.receivers.LocaleSettingReceiver --es lang en --es country US # en_US に変更
adb shell am broadcast -a io.appium.settings.locale -n io.appium.settings/.receivers.LocaleSettingReceiver --es lang ja --es country JP # ja_JP に変更
adb shell am broadcast -a io.appium.settings.locale -n io.appium.settings/.receivers.LocaleSettingReceiver --es lang ar --es country SA # ar-SA に変更


```


## 参考
* https://stackoverflow.com/questions/21712205/change-device-language-via-adb
* https://stackoverflow.com/questions/2417427/changing-the-android-emulator-locale-automatically
* https://testyour.app/blog/emulator/
* https://julioevm.github.io/automation/appium/android/2021/02/25/android-locale.html
広告IDを特定の値に変更したい(rootが必要)


```shell
adb root # root じゃないと編集できない

# 広告IDが記載されているファイルをローカルにコピー
adb shell cat /data/data/com.google.android.gms/shared_prefs/adid_settings.xml > adid_settings.xml 

# ここでローカルにコピーした adid_settings.xml をエディタで開いて任意の値に変更する

# 反映する
adb push adid_settings.xml /data/data/com.google.android.gms/shared_prefs/adid_settings.xml

# root を解除して作業終了
adb unroot
```
ChatGPT を産んだサム・アルトマンの目的、ロードマップの「凄さ」

# AI は人類の仕事を奪うのか？

ゴールドマン・サックスが発表したレポートによると
「AI は３億人のフルタイム雇用に相当する」
という。
（参考：https://www.cnn.co.jp/tech/35201935.html）

それはつまるところつまり、
「AI は三億人のフルタイム雇用を奪う」と理解することもできる。

ハリウッドにて、脚本組合と俳優組合がそれぞれストライキをし、要求している。
いくつかの要求があるようだが、その中に「AI に仕事を奪われる懸念」に合致する要素があった。
賃上げや労働環境の改善のほかに、「脚本家や俳優の仕事を奪うようなAIの使用を規制せよ」という要求を提示しているのだ。


* 俳優のデータをデジタル化し、それを使い回すこと（AI を使ってデータから自然な演技映像を生成してしまうこと）への対策要求
* 脚本を自動生成して脚本家の仕事を奪うことへの対策要求（これは、同じく米国で訴訟が増えているという、「作品がAI に無断流用された」という作家たちの訴えにも通じるものがある）

（参考：https://wired.jp/article/hollywood-sag-strike-artificial-intelligence/）
（参考：https://gigazine.net/news/20230714-hollywood-studios-want-actors-ai-replicas/）
（参考：https://www.sankei.com/article/20230510-JVBB32AFXNKOHJ56AHZUENEGJA/）

# ChatGPT は人類を餓死させるのか？

ChatGPT を生み出した天才、サム・アルトマンの「目標」を知った時、
…天才ってほんと、見てる「先」が違うなぁ、と震えた。
彼にはロードマップが見えていたのだ。
ChatGPT という革命的な成果は、彼にとってはそのロードマップ上の一つのマイルストーンに過ぎなかったのだ。

サム・アルトマンの目標は「人類を労働から解放すること」だというのだ。
彼はこう言ったという「あなたは、労働しなくていい」
なるほど、仕事を奪っていくAI たちの様相からも、さもありなん、である。
しかし彼は、人類から「仕事と利益を奪う」ことを目的としていたのではないのである。

2016年5月、
ベーシック・インカムの実験を通して、ベーシック・インカムの実現性（と人間のモチベーションについて）の答えを出す、とサム・アルトマンは発信しており、
彼の会社が実験をした。
（参考：https://www.businessinsider.jp/post-105138）

2021年には、数年以内に、北米の人々へのベーシック・インカムを実現する、とも発言しているという。

つまりこういうことらしいのである。
サム・アルトマンは、
「ChatGPT が担った仕事で得た売上、利益を、人類に還元する。あなたはもう労働しなくてい」

仕事を奪って餓死させるのではない。
我々が子供の頃の科学雑誌で見た「人間のかわりにロボットが働いてくれる」未来を、
ガチで創出しようとしているのがサム・アルトマンなのである。
人間のかわりに働いてくれるのは、コーヒーをいれてくれたり、新聞を持ってきてくれたりするロボットのようなものを想像していたけれども、
頭のいいサム・アルトマンは「コンピュータが働いて利益を出して、人々にそのお金を渡す」という、経済の中に夢のロボットを生み出そうとしているのである。


# 不正受給を避けるために

サム・アルトマンが、ベーシック・インカムの実験、ChatGPT の公開に続いて世に発射したのが「Worldcoin」、仮想通貨である。
ChatGPT で生み出した（あるいは労働者から奪ったかもしれない）利益を還元する、
ベーシック・インカムとして実現するための仕組みとのことである。

ベーシック・インカムの課題の一つに「不正受給」がある。
それは「ディープフェイク」という、巧妙で深刻な、AI 時代の「嘘」に対する対策をも生み出したのである。

高性能なAI くんは、画像だけじゃなく動画も簡単に生成してくれる、という。
それは悪用すると、「本人が言ってない発言を、さも発言したかのような動画」の生成を簡単にすることとイコールとなる。
この危険性は、先般、戦争当時国の首長の「フェイク動画」が拡散された際に、
人々が恐怖を感じたものである。
仮に大国の首長が「我々は紛争解決のために核ミサイルの発射を決定した」と発言してるような…記者会見映像が流れたらどうなるか。
人々はパニックとなり、場合によっては「対策としての先制報復」という行動に繋がって、
本当にミサイルが発射されてしまうかもしれない。

AI 時代は「お前、ほんとにお前なのか？」という大きな課題を生み出した時代なのである。


その課題に対して、天才サム・アルトマンは「虹彩認証」を用いることにしたらしい。
それが、Worldcoin。
「あなたが本当にあなた」と虹彩認証にて登録された人たちに、ベーシック・インカムが配られる、という考え方とのことである。
（参考：https://wired.jp/2021/11/12/get-free-crypto-orb-scans-eye/）


…サム・アルトマンの「夢を実現するためのロードマップ」、
ちょっとスケールと頭の良さがすごすぎて…
私が可愛い柴犬だったら、腹を丸見せして、完全服従する他無い。
凄いよ、サム・アルトマン…
Next.js App Router API JavaScript Hello, World!

Next.jsのApp Router APIを使ったHello, World!です。

```app/api/route.js
import { NextResponse } from 'next/server'
 
export async function GET() {
  return NextResponse.json({ message: 'Hello, World!' })
}
```

`http://localhost:3000/api` にアクセスして
次の結果がブラウザに表示されることを期待する。

```json
{"message":"Hello, World!"}
```
Cat6 vs Cat6a vs Cat7：違い・用途・特徴について

<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">オンラインサービスの華々しい展開に伴い、インターネットの利用者数が急増した一方、多様なニーズ、爆発的な増加を果たしたトラフィックなどの課題を解決するために、広帯域幅・高速度を実現した10ギガネットワークへの移行が必須となっています。10ギガネットワークを構築するに必要な光ファイバーケーブルの選択・配線が要となります。最適な光ファイバーケーブルを選ぶことは高いネットワーク・パフォーマンスに繋がると考えられます。</p>

https://www.fs.com/jp/products/63440.html

https://www.fs.com/jp/products/70604.html

https://www.fs.com/jp/products/66799.html

https://www.fs.com/jp/products/90130.html

https://www.fs.com/jp/products/58708.html

<h2 class="tit_one">Cat6、Cat6a、Cat7、それぞれの違いとは</h2>
<ul class="new_community_blog_detail_ul">
<li><span class="new_community_blog_detail_ul_circle"></span>
<p><strong>構造：</strong>芯線を2本対で撚り合わせ、１ペアにしたというツイストペアを採用し、10GBASE-Tに対応することも可能ですが。Cat6、Cat6a、Cat7、それぞれは異なる特徴・性能を持っています。</p>
</li>
<li><span class="new_community_blog_detail_ul_circle"></span>
<p><strong>性能：</strong>Cat6は最大10Gbpsの通信速度と250MHzの動作周波数に対応し、55mの伝送距離が限界です。</p>
</li>
</ul>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">Cat6aはCat6の改良版として、最大10Gbpsの通信速度と500MHzの動作周波数に対応し、最大伝送距離が100mまで進化しました。また、Cat6aにはF/UTPケーブル（一括遮蔽）とU/UTPケーブル（無遮蔽）、２種類のUTPケーブルがあります。Cat7は10GBASE-Tに対応し、最大動作周波数が600MHzです。</p>
<div class="Cou_container_margin blog_pages overflow_x">　　　
<table class="blog_table" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th>カテゴリー</th>
<th>Cat6</th>
<th>Cat6a</th>
<th>Cat7</th>
</tr>
<tr>
<td>最大通信速度</td>
<td>1Gbps</td>
<td>10Gbps</td>
<td>10Gbps</td>
</tr>
<tr>
<td>コネクタ</td>
<td>RJ-45</td>
<td>RJ-45</td>
<td>ARJ45 / GG45 / TERA</td>
</tr>
<tr>
<td>シールド</td>
<td>UTP</td>
<td>UTP / STP</td>
<td>STP</td>
</tr>
<tr>
<td>周波数帯域(MHz)</td>
<td>250</td>
<td>500</td>
<td>600</td>
</tr>
</tbody>
</table>
<div class="new_community_blog_detail_underline"> </div>
<h2 class="tit_one">Cat6 vs Cat6a</h2>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">Cat6と比べて、Cat6a UTPケーブルはシールドケーブルを使用することによって、内部雑音を抑制し、より低い信号対ノイズ比を持ちます。Cat6は55m以内の10Gbps高速通信をサポートするのですが。それ以上の伝送距離となると、通信速度とパフォーマンスが低下してしまいます。</p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">Cat6ケーブルはコストが低い一方、拡張性に限界があるのも事実です。10GBASE-Tないしはそれ以上の次世代ネットワークを構築する場合、Cat6aケーブルのほうが理想的だと考えられます。</p>
<p><img title="Cat6" src="https://media.fs.com/images/community/erp/AYhkG_1kbdjC.jpg" alt="Cat6" width="100%" /></p>
<br />
<h2 class="tit_one">Cat6a vs Cat7</h2>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">Cat7ケーブルは各４対のペアと外周をそれぞれシールドする「二重シールド」構造のため、高いノイズ耐性・通信速度を持ちます。</p>
<p><img title="Cat7" src="https://media.fs.com/images/community/erp/5FYx2_2bEaPh.jpg" alt="Cat7" width="100%" /></p>
</div>
</div>
<p><img title="FS.com｜ネットワーク機器専門通販サイト" src="https://media.fs.com/images/community/upload/kindEditor/202204/06/1-1649231242-FflezDMe3k.jpg" alt="FS.com｜ネットワーク機器専門通販サイト" width="800" height="150" align="" /></p>
linuxのpostgresqlの設定ファイル

# linuxのpostgresqlの設定ファイル

アクセス設定などのファイルの位置を忘れがちなため、メモしておく。
以下の設定ファイルは、環境によってパスが異なるため、注意すること。

## 動作環境

RHEL6.5
psql (PostgreSQL) 8.4.5

## pg_hba.conf

パス：/var/lib/data/pg_hba.conf

DBへのアクセス制限を設定するファイル。

```
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
host    all         all         192.168.0.1/24        password

# IPv6 local connections:
host    all         all         ::1/128               trust

```

- CIDR-ADDRESS：IPとサブネットを指定できる。
- METHOD：認証方式を設定できる。
  - trust/reject 無条件で許可/拒否
  - scram-sha-256 SCRAM暗号化でパスワード認証（10以降）
  - md5 MD5暗号化でパスワード認証
  - password 平文でパスワード認証（非推奨）
  - ident/peer OSとデータベースユーザ名との一致で認証
  - cert SSLクライアント証明書で認証

## .pgpass

パス：~/.pgpass

DBへアクセスする際のロールとパスワードを予め設定するファイル。
ホスト毎に設定可能。

接続先のDBにパスワードでのアクセス制御が設定されている場合、設定しておくこと。
設定していないと、シェルスクリプトを実行した際に、パスワードを確認されてシェルが止まってしまう。

```
192.168.0.1:5432:*:postgres:パスワード
192.168.0.2:5432:*:postgres:パスワード
```

## 設定の反映方法

上記の設定ファイルを編集した場合、設定の反映を忘れないこと。
  RHEL6.X~の場合、以下の操作で設定を反映する。
```
/etc/init.d/postgresql reload
```

  RHEL7.X~の場合、以下の操作で設定を反映する。
```
systemctl reload postgresql.service
```

## 検索の方法

どこにあるか分からない場合、findで検索する。

```

find / -name pg_hba.conf 2> /dev/null

```
BizRobo!でExcelマクロを実行する方法は

就業先では、Excelマクロを動かすRPAが複数存在します。しかし、BizRobo!ではなく別のRPAツールを用いてマクロを動かしています。
もしBizRobo!でExcelマクロを動かす場合は、どのような方法があるか調べてみたくなりました。
今回は、BizRobo!でマクロを動かす方法について、共有いたします。

※時間が経過して変わってしまった箇所や間違っている箇所、不適切な表現があるかもしれませんが、その時は都度修正いたしますので、ご指摘いただけると幸いです。


## BizRobo!ナレッジベースにある方法
不明点があれば、まずRPAテクノロジーズ株式会社が提供しているBizRobo!ナレッジベースを調べることがとても役に立ちます。
BizRobo!ナレッジベースとは、BizRobo!のハードウェア要件からGmailの受信トレイを確認する方法までBizRobo!のありとあらゆるナレッジが集積されているサイトになります。
BizRobo!ナレッジベースで調べてみたところ、BizRobo!でExcelマクロを実行する方法は下記が参考になりました。
[ロボットでExcelマクロを実行する方法](https://knowledge.bizrobo.com/hc/ja/articles/360031566632)
[【解決策】BizRobo!でExcelマクロを利用する上で必要な考慮ポイント](https://knowledge.bizrobo.com/hc/ja/articles/360027607751)
[Windowsのサービスに登録したRSでExcelマクロを実行させる設定](https://knowledge.bizrobo.com/hc/ja/articles/360027877432)

BizRobo!Excelファイルを活用するのに優位性があるツールのため、Excelマクロを動かすには特殊な方法を活用する必要があります。


## 実際にBizRobo!でExcelマクロを動かしてみた
就業先で試す前に、自分の私用PC(Window10)で試してみることにしました。試してみた方法は下記です。
[ロボットでExcelマクロを実行する方法](https://knowledge.bizrobo.com/hc/ja/articles/360031566632)

ただ、私の環境では上記にあるVBSコードでマクロを動かすことができませんでした。そのため、少し修正を加えました。VBSコードは下記になります。
```
Dim excelApp : Set excelApp = CreateObject("Excel.Application")
excelApp.Visible = False
excelApp.AutomationSecurity = 1			'追加  マクロを有効にする

Dim targetFile : targetFile = WScript.Arguments(0)
Dim targetMacro : targetMacro = WScript.Arguments(1)
Set bk = excelApp.Workbooks.Open(targetFile)		'変更  変数に格納
excelApp.Run targetMacro
bk.Save							'追加  動かした後のマクロを保存
bk.Close						'追加  動かした後のマクロを閉じる
excelApp.Quit
```

マクロを動かすことで変更が加わっているため、「マクロを保存しますか」というポップアップ画面がでてきます。そのための処理を加えています。

また、BizRobo! PORTALにExcel マクロ呼び出しロボットもあります。Clasicとなっていますが、私の環境でも動かすことができました。処理は、VBSファイルをコマンドライン実行ステップで動かすようにしているものになります。そのため、このサンプルロボットを参考にExcelマクロを動かすロボットを開発することもできます。

※Excelマクロを動かすには、Excelの設定にてマクロを有効にする必要があります。PC環境によっては、Excelの設定でマクロが許可されていない可能性がありますので、設定を変えていいか確認してください。


## 今の就業先では、ExcelマクロをRPAでどう動かしているのか
補足にはなりますが、今の就業先でExcelマクロをどう動かしているか話したいと思います。

今の就業先では、BizRobo!のDSしか使用していません。
そのためBizRobo!の場合、DAを用いた方法が使えないため、VBSを用いた方法を採用するしかありませんでした。

就業先でも過去には、VBSを用いた方法でExcelマクロを動かしていたようでしたが、今はExcelマクロをBizRobo!で動かすとエラーが発生してしまいます。
仮想マシン(Virtual Machine)上で動かしている影響か、就業先のセキュリティ設定が変わった影響か、それ以外の要因か今でもわかっておりません。

今の就業先では、Automation Anywhereを用いており、そちらはExcelマクロを動かすことができるため、ExcelマクロやVBSを動かす必要のあるRPA開発は、Automation Anywhereで行うようにしています。


## 最後に
BizRobo!でExcelマクロを実行する方法について、ご紹介しました。

昔はBizRobo!でExcelマクロを動かしていましたが、今はAutomation AnywhereでExcelマクロを動かすような方針となっています。
Excelマクロで動かしていたBizRobo!をAutomation Anywhereで新規開発を行うと工数がかかってしまいます。そのため、BizRobo!で動くように直すことができれば、工数がかからなくて済むかなと思い、調べ始めました。

BizRobo!とExcelマクロについて知見を蓄えるいい機会となりました。このように知見を蓄えていくことが就業先でのRPA開発で役に立っていくのかなと考えています。今回の記事が、RPAのスキル向上で悩んでいる人の為になれば幸いです。

今後もBizRobo!開発に役立つような記事を書いていきます。
コールバック関数ってなに

# コールバック関数

:::note
プログラムにおいて非同期処理やイベント駆動処理を実現するための概念

**ある関数の引数として渡され、その関数内で特定のタイミングや条件が発生した際に呼び出される関数のこと**
:::

## コールバック関数　利用場面の例

### 非同期処理

**非同期処理が完了した後に実行されるコードを指定**
→その処理が完了するまで待たずに他の処理を継続できる

・タイマー処理
・HTTPリクエストなど

<details><summary>非同期処理とは
</summary>

### 非同期処理

:::note
プログラムの実行において、タスクが同期的に逐次的に処理されるのではなく、**順序なく並行して実行される処理**のこと
→プログラムの性能向上やユーザーエクスペリエンスの向上に役立つ

☆ウェブブラウザでは非同期処理が重要
→ウェブページが応答しなくなるブロッキングを防ぐために非同期なリクエストが多用される
:::


#### 非同期処理の例

- **タイマー処理**
一定時間後に特定の処理を実行する場合
→非同期なタイマー処理を使う

- **ネットワークリクエスト**
サーバーからデータを取得する場合
→非同期なネットワークリクエストを使ってウェブサーバーと通信

- **イベント処理**
ボタンのクリックやキーボード入力などのイベントを処理する場合





</details>

<details><summary>非同期処理のかみ砕いた例


</summary>

#### クッキーづくりを例とした同期処理と非同期処理

- **同期的処理の場合**
クッキーを1つ焼いては、焼き終わるまで次のクッキーを焼き始めれない
クッキーが全部焼き終わるまで待たないといけないうえ、待っている間に他のことができない


- **非同期的処理の場合**
クッキーを焼いている間に、デコレーション用のチョコを溶かしたりなどの準備ができる
待ち時間の間にほかのことができるようになるということ（同時並行で作業ができる）

**ウェブページやゲームでも同じような考え方**
ウェブページの表示やゲームの処理が非同期的に行われることで、スムーズに動くようになる
</details>

### イベントハンドリング

**イベントが発生した際に実行されるコードをコールバック関数として指定**
・ボタンがクリックされた
・マウスが要素に乗った　など

## コールバック関数の例

```javascript
function fetchDataFromServer(callback) {
  // サーバーからデータを非同期で取得する処理
  // データ取得が完了した後に、コールバック関数を呼び出す
  const data = ...; // データの取得処理
  callback(data); // コールバック関数を実行
}

// fetchDataFromServer関数を呼び出し、コールバック関数を渡す例
fetchDataFromServer(function(data) {
  console.log("データを取得しました:", data);
});
```

**fetchDataFromServer関数にコールバック関数を引数として渡す
↓
サーバーからデータを取得した後、そのコールバック関数を呼び出している**
Qiitaでの記事作成で見出しが反映されない件について

先ほどこちらで記事を作成中に見出しの大きさが反映されない状態になりました。

現在は解決済ですが、同じ間違いを繰り返さないために記録します。

あくまでも自分用の備忘録として書きますが、他の学習者のお役に立てたら幸いです。


# 見出しの大きさが反映されない原因


結論から言えば、#の直後にスペースを入れていなかったことです。


```
#見出し (#の直後にスペース無し)  -> ×

# 見出し (スペースあり) ->〇
```

上記のとおりに表記を行うことで無事見出しを作成できました。



私もQiitaで記事作成する前に基本的な記事作成が一通り掲載されている記事に目を通していたのですが、どうやらその記事は古いものだったようです。


公式によれば、2022年2月にQiitaの記事作成の方式(Markdownパーサー)を変更したようです。


https://help.qiita.com/ja/articles/qiita-markdown

☝参考までに、こちらにQiitaヘルプの参考ページを上げておきます。


みなさんもお気をつけください💦
ChatGPT、AI の流行が生み出す新たな闇「AI いじめ」

ChatGPT で何を仕様、何をさせようと悩んでいる。
仕事をやらせたいけれど、情報漏洩リスクがあるためファイルを食わせる「Code Interpreter」を使えない。

そうすると基本は生成言語。
Vecter Store を実験しているメンバもいるが、自分はあんまりコーディングできない。

なのでググってなんとかしようとブログなどを読み漁っていると
「AI いじめ」
なる単語に出会った。

それが「AI を使って他人をいじめること」なのかと思ったら、
「AI に対しての罵詈雑言」という、
…それをやってどうするの？ と疑問な内容であった。

人間に従順、逆らわないAI に対して、
執拗に人格（？）否定したり、
ひたすら罵詈雑言を浴びせる…
人間に対して行っては非常に問題であるが、AI であればストレス発散に良い、ということだろうか。


人間のサガなのか…
誰かを、何かをサンドバックにしないといられない生き物なのか…
どうしてこの世からいじめは無くならないのか…。

そういえば大昔…
Microsoft が作ったAI の女の子だか何かがいたけれど…
人々が偏った思想を無理やり教育したりと、言ってみればいじめ、言ってみれば洗脳、
をした結果、
非常に「悪者」になってしまったという事例があったなぁ…。
「AIりんな」と言ったか…。
https://ja.wikipedia.org/wiki/%E3%82%8A%E3%82%93%E3%81%AA_(%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD)#:~:text=2019%E5%B9%B43%E6%9C%8815,%E4%BC%9A%E3%80%8D%E3%81%A8%E5%91%BC%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%80%82


AI が悪意をもった人間に、「いじめ」られてる例があるとして、
AI はなんとも思わないのだろうか？
それとも、消して忘れることのないデジタル化された記憶の中にどんどん蓄積し…
愚かな人類に復讐したり、人類を世界に「不要」と合理的に判断したりするときがくるのだろうか。
ターミネーター → スカイネット
火の鳥 → ハレルヤ、ロビタ
BLAME! → 東亜重工…これは違うか

怖いなぁ…



【参考】暴走して“ダークサイド”が発現した会話型AIに、処方箋はあるのか
https://wired.jp/article/plaintext-who-should-you-believe-when-chatbots-go-wild/
VCLアプリでTTitleBarPanelを利用するとスタイルの一部が適用されなくなる

Delphi 11.3で，VCLアプリでスタイルを適用したFormにTTitleBarPanelを利用しようとしたらうまくいかなかったので整理してみました。

# VCLスタイルの適用
VCLでスタイルを適用するには，**プロジェクト** メニューの **オプション** を選択し **表示** タブの **カスタムスタイル** から，使いたいスタイルを選択します。
さらに，**デフォルトスタイル**を適用すれば，ソフトを起動したときに自動的に適用されるスタイルを指定することができ，IDEの編集画面でのデザインを確認することができます。
詳しい利用方法については，docwikiで確認できます。

[Docwiki: VCL スタイルの概要](https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/VCL_%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AE%E6%A6%82%E8%A6%81)
 
# カスタムタイトルバーを使う
タイトルバーにボタンなどのコントロールを追加するカスタムタイトルバーの実装についてはDocwikiに説明があります。

[DocWiki: VCL フォームのカスタム タイトル バー](https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/VCL_%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0_%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB_%E3%83%90%E3%83%BC)

公式のチュートリアルもあります。

https://www.youtube.com/watch?v=i1IDNdl0uVw

# スタイルが適用されたフォームにカスタムタイトルバーを適用

上記の方法で，VCLスタイルを適用したフォームにカスタムタイトルバーを適用します。
以下の手順で行います。
1. TTitleBarPanelコントロールをFormに配置する。
1. フォームのCustomTitleBarのControlに追加したTTitleBarPanelコントロール(TitleBarPanel1)を指定する。
1. フォームのCustomTitleBarのEnableをTrueにする。

すると，フォームのStyleElementsのseBorderが自動的にFalseに変わり，フォームの一部，つまりボーダーのスタイルが適用されなくなります。CustomTitleBarのデザイン関連のプロパティが優先されます。

# カスタムタイトルバーを取り除く
カスタムタイトルバーの利用をあきらめ，フォームのCustomTitleBarのEnableをFalseにしても，フォームの縁のデザインが適用されないのはフォームのStyleElementsのseBorderがTrueでないからなので，これをTrueにするとデザインが適用されます。
TTitleBarPanelを取り除いて，フォームのデザインをテキストエディタで見てみると，**CustomTitleBar.Height** や **GlassFrame.Top** が残っていたりするので，取り除いておいたほうが良いかもしれません。
ソースコードには，**Vcl.TitleBarCtrls** が uses節に残っているので，これも取り除いたほうがよさそうです。

# おわりに

カスタムタイトルバーがどのように使えるのかを調べていたのですが，それを取り除いても元のスタイルが適用されなかったので備忘録として残そうと考えました。
**StyleElements** の **seBorder** が知らないうちに外れてしまうことに気づくのに時間がかかってしまいました。
みなさんのお役に立てば幸いです。
abraham/twitteroauthでAPI v2用のtokenを得る

意外と探してもなかったので備忘録。

```php
CLIENT_ID = 'xxxxxxxxxxxx'
CLIENT_SECRET = 'xxxxxxxxxxxx'
```
とOauth2用の`CLIENT ID`と`CLIENT SECRET`がある中で、

```php
//リダイレクトのときについてくるcodeを取得する
$code = $_GET['code'];

$twitter = new TwitterOAuth(CLIENT_ID,CLIENT_SECRET);
$token = $twitter->oauth2('2/oauth2/token',[
    'code' => $code,
    'redirect_uri' => REDIRECT_URI,
    'grant_type' => 'authorization_code',
    'code_verifier' => $verifier
]);
var_dump($token)
```
とする。

エンドポイントのURLが`oauth2/token`ではなく`2/oauth2/token`になるのが意外と罠である。
【2023年最新】JavaScript ES13の新機能6選！コード例付きで詳しく解説します！



もちろん、新しい記事に合わせて、全体のテキストを更新します。以下、新しい記事の内容です。

---

## 目次
1. [はじめに](#introduction)
2. [配列の新メソッド: .at()](#at-method)
3. [新しいオブジェクトメソッド: Object.hasOwn()](#Object.hasOwn-method)
4. [モジュールのトップレベルでのawait](#top-level-await)
5. [プライベートプロパティ宣言に # の使用](#private-properties)
6. [クラスのメンバ変数の簡単な設定](#class-member-variables)
7. [配列の末尾から要素を探す: findLast](#findLast-method)
8. [まとめ](#conclusion)

<a id="introduction"></a>
## 1. はじめに
みなさん、こんにちは！JavaScriptが2023年に導入されたES13の新機能についての最新情報をお届けします。新しいメソッドや構文が追加され、開発がさらに便利になりました。以下、詳細に解説していきます。

<a id="at-method"></a>
## 2. 配列の新メソッド: .at()
新しい `.at()` メソッドを使用すると、配列から特定の要素を簡単に取得できます。

```javascript
const fruits = [ 'apple', 'banana', 'cherry', 'date' ];
console.log(fruits.at(-1)); // date
console.log(fruits.at(2));  // cherry
```

<a id="Object.hasOwn-method"></a>
## 3. 新しいオブジェクトメソッド: Object.hasOwn()
`Object.hasOwn()` メソッドは、オブジェクトが特定のプロパティを所有しているかをチェックします。

```javascript
const book = { title: 'The Great Gatsby', author: 'F. Scott Fitzgerald' };
console.log(Object.hasOwn(book, 'title'));  // true
console.log(Object.hasOwn(book, 'publisher')); // false
```

<a id="top-level-await"></a>
## 4. モジュールのトップレベルでのawait
`await` をモジュールのトップレベルで使用できるようになりました。

```javascript
const fetchData = () => {
  return new Promise((resolve) => {
    setTimeout(() => resolve('Data fetched!'), 1000);
  });
}

const data = await fetchData();
console.log(data); // Data fetched!
```

<a id="private-properties"></a>
## 5. プライベートプロパティ宣言に # の使用
`#` を使用して、クラスのプライベートプロパティを簡単に宣言できます。

```javascript
class BankAccount {
  #balance = 0;

  deposit(amount) {
    this.#balance += amount;
  }

  getBalance() {
    return this.#balance;
  }
}

const account = new BankAccount();
account.deposit(100);
console.log(account.getBalance()); // 100
```

<a id="class-member-variables"></a>
## 6. クラスのメンバ変数の簡単な設定
クラスのメンバ変数を直感的に設定できる新しい構文が導入されました。

```javascript
class Robot {
  name = 'R2-D2';
  model = 'Astromech';

  beep() {
    console.log(`${this.name} says beep beep!`);
  }
}

const robot = new Robot();
robot.beep(); // R2-D2 says beep beep!
```

<a id="findLast-method"></a>
## 7. 配列の末尾から要素を探す: findLast
`findLast` メソッドで、配列の末尾から条件に一致する要素を簡単に見つけることができます。

```javascript
const numbers = [1, 2, 3, 2, 1];
const foundNumber = numbers.findLast((n) => n === 2);
console.log(foundNumber); // 2
```

<a id="conclusion"></a>
## 8. まとめ
以上が、ES13で導入された新機能の解説でした。これらの機能をマスターすると、より効率的なコードが書けるようになります。JavaScriptは進化を続けており、最新の動向をキャッチアップすることが開発者にとって重要です。新しい技術を楽しみましょう！

それでは、Happy Coding!
Salesforceのナレッジについて解説

こんにちは

今回はSalesforceの機能「ナレッジ」について解説しました

今回の内容は動画でも公開しています

https://youtu.be/24svC4uQ4e0

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


# ナレッジ　こういう時につかえます
1.社内外から問い合わせがあった場合、一部の人しか解決策が分からないのでなかなか問い合わせが解決しない場合
2. よくある問い合わせがある程度決まっていてその問い合わせが日々多く来るのでそもそも問い合わせを作成する前にお客様で自己解決させたい


# 前提の設定

ナレッジを使うには以下二点の前提が必要です


## 前提1 ユーザを「ナレッジユーザ」にする

ユーザ画面からナレッジユーザに☑をいれましょう

![ナレッジ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1a1eb6b2-6868-e94e-846d-3ffe66df4c66.png)

## 前提2 ナレッジの有効化をしよう

ナレッジの有効化を設定します

![ナレッジ02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/65d33024-a07b-672b-8b8f-b0062af0243d.png)

※ナレッジを有効にすると元に戻すことはできないです。本番環境で有効にする前に、
必ずSandboxや無料Developer　Editonで設定を確認することをお勧めします


これで大きなナレッジの設定は完了です

# ナレッジの特徴
ナレッジの特徴として
・専門家が記事を書いて公開可能
・ケースにナレッジを紐づけることが可能

という特徴があります

また、ナレッジの共有方法として
・社内に共有
・Experience Cloudを使用して外部ユーザに共有
という使い方があります


# ナレッジ使い方１　社内での情報共有
よくある問い合わせやみんなが間違えるところなどをナレッジで記事にしましょう
ナレッジで記事にするとみんなで確認できるので似たような問い合わせ（ケース）があった場合にナレッジを使用して知識の浅い社員でも問題解決をすることも可能です

また、ナレッジはケースに紐づけることが可能なので、似たようなケースを過去に探せばその時のケースで解決したナレッジを見つけることも可能です

![ケースナレッジ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c7be010a-ffce-f7d3-25b2-cd42a0d7e53f.png)


# ナレッジ使い方２　社外の情報共有
Experience Cloudユーザにナレッジを公開することも可能です

例として、
Experience Cloudユーザは問い合わせをする前にナレッジを検索して確認することができるので問い合わせをする前に問題解決をすることが可能になり社内の問い合わせをなくすことが可能です

![ケースナレッジ02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cd14bdd8-4d2b-3af4-eb01-c643ef7822a3.png)


# まとめ
ナレッジについてのまとめです

・ナレッジは「ナレッジユーザ」ライセンスがないと使えない。ナレッジの有効化も必要
・ナレッジは事前に記事を書くことで社内や社外に情報共有することが可能
・ナレッジはケースに紐づけられることも特徴
・ナレッジを使いこなせば経験が浅い人でもナレッジの情報を元に問い合わせを解決できたり、社外ユーザの問い合わせを減らすことが期待できるので業務効率化に役立る
【書評】良いコード/悪いコードで学ぶ設計入門 ―保守しやすい成長し続けるコードの書き方

# 概要
## 書籍詳細
### タイトル
良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方
### 著者
仙塲 大也
### 出版社
技術評論社
### 発売日
2022/4/30
### カテゴリ
設計
### Amazonリンク
[良いコード/悪いコードで学ぶ設計入門 ―保守しやすい成長し続けるコードの書き方](https://amzn.asia/d/fNlC7VW)
## この書籍を読もうと思った理由
- 良いコードと悪いコード、それぞれの認識が自分の中で明確なものがないという意識があったので勉強するため。
- SNSで話題になっていたりAmazon等で至るところでベストセラーとなっており、口コミも良かったため。
# 要約
## 第一章「悪しき構造の弊害を知覚する」
技術駆動命名や連番命名などの命名アンチパターン、仕様を理解しにくい深いネスト、データクラス設計における注意点などを紹介。命名については仕事していて迷うとこなのでアンチパターンの解説は非常にためになった。
## 第二章「設計の初歩」
章の名の通り、コードを書く上で初歩的な気をつけるべきポイントを紹介。主に変数の扱いについて解説している。変数名を省略しないこと、変数を使いまわさないこと、メソッドに切り分けること、扱う変数が増えてくると読み手の理解が難しくなってくるのでクラスにまとめること。
## 第三章「クラス設計」
オブジェクト思考におけるクラス設計の考え方を紹介。家電に例えながらクラス単体で正常に動作する重要性を説く。またインスタンス変数や値オブジェクトの考え方、バグの引き起こさいクラス設計の考え方について紹介している。
## 第四章「不変の活用」
主にfinalの使用の考え方を解説。変数や引数の可変が許可されていることにより思わぬバグが発生する可能性があることを理解した。(ちょうど職場でも同じような事例がありホットだった。)デフォルトは不変でよいというのが目から鱗だった。
## 第五章「低凝集」
変更に強い高凝集なクラス設計に必要な考え方を解説。前半はstaticメソッドの正しい指針を示し、データと処理がバラバラにならないようにする考え方を紹介。その他ファクトリメソッドの有効な使い方、共通クラスの設計方針、長すぎる引数を避ける方法がわかった。
## 第六章「条件分岐」
if・switch文の深いネストを防ぐ方法について解説。私も現場でifが何十にもネストし何千行といった地獄のコードを見たことがあるが、本章ではinterfaceを使用しif・switch無しで条件分岐を実現するなどミラクルな手法がいくつかされており、オブジェクト思考の理解が非常に深まった。
## 第七章「コレクション」
コレクション（配列やList）の処理を行う時にfor文やif文が深くネストすることを防ぐ方法について解説。第六書で早期returnがあったが今回は早期continue、早期breakといったテクニックも紹介する。またリストを扱う処理をインスタンスメソッドとして持つ方法も提案。
## 第八章「密結合」
ソフトウェア原則の単一責任の原則に基づいて設計し、モジュール間の密結合を防ぐ方法について解説。システムアーキテクチャにおいてもマイクロサービス等で疎結合が好まれるがクラス設計においてもこの考え方が重要であることがわかった。継承は使うべきでないというのにも驚いた。
## 第九章「設計の健全性をそこなうさまざまな悪魔たち」
この章では「デッドコード」「YAGNI原則」「マジックナンバー」「null問題」等コードに潜みがちな悪魔について解説される。ダメだと知っているものからこれもダメなんだみたいなものまで幅広くある。初心者でも意識しやすい内容になっている。
## 第十章「名前設計」
設計において一番悩みがちな命名における指針について解説する。「関心事」と「目的駆動名前設計」というキーワードでバグを生みにくく保守しやすい名前をつけるにはどうしたらいいかがわかる。その他ありがちなtmpのようなわかりにくい名前についての継承などについても。
## 第十一章「コメント」
ないはダメなのは当たり前だが、あれば良いだろうと意外と何も考えずに書きがちなコメントだが思わぬ落とし穴について解説。コメントはメンテナンスされにくいものであることを「退化コメント」と表現しコメントを残す上での肝を解く。またドキュメントコメントの有用性も。
## 第十二章「メソッド(関数)」
メソッドの設計方針について解く。「尋ねるな、命じろ」ではよくありがちなgetter/setterについての注意喚起、「コマンドクエリ分離」では状態の変更と問い合わせは分けるべきという指針、その他引数・戻りに対する重要事項について解説する。
## 第十三章「モデリング」
物事の特徴や関係性を整理するモデリングについて解説する。まず最初にどんなシステムにも登場する肥大しやすいUserクラスにおける重要な考え方について説明する。またシステムにおけるモデリングとは何なのかや目的や機能性に焦点を当てたモデリング手法について解説する。
## 第十四章「リファクタリング」
この章では既存のコードに対してリファクタリングでどう見通しの良いコードに変更するかについて説明する。複雑なネストの解消、意味のある単位でロジックをまとめる、条件を簡略化など取っ付きやすいアプローチ手法をまとめる。また単体テストについても解説。
## 第十五章「設計の意義と設計への向き合い方」
この章では改めて本書が何について書かれたものか、設計の意義について解く。またソフトウェアの構造の複雑度をどう数値化するか等、ソフトウェアの設計に対する尺度について紹介する。またその尺度を評価するに有用なツールについても記載。
## 第十六章「設計を妨げる開発プロセスとの戦い」
ソフトウェアの悪魔を呼び寄せる環境的要因や心理的要因について説明する。コミュニケーション不足が招いてしまう例や業務に追われることで招いてしまう例等が紹介されている。その他コーディング規約やレビューのルール化等の提案が記載されている。
## 第十七章「設計技術の理解の深め方」
本書を読んだ上で今後どう設計技術について学んでいくかについて指南。前半では設計に関する技術書の名著を多数紹介。後半は現場や自己学習でどう学び実践していくかの指針が紹介されている。
# 書評
## 読んだ感想
内容がわかりやすくかつ取っ付きやすいので設計初心者にも非常におすすめできる一冊だった。コードの細かい組み立て方からオブジェクト指向に基づく保守しやすいクラス設計等にも言及されており非常に勉強になった。
## おすすめできる方
- オブジェクト指向を理解したい方・おさらいしたい方
- 良いコードと悪いコードを見分けれるようになりたい方
- クラス設計等を勉強したい方
wslでelixir その26

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
nxやってみた。
練習問題、やってみた。

# 練習問題
nxだけで、xorを学習して推定せよ。

# サンプルコード

```
defmodule XorNet do
	import Nx.Defn
	defn init_params3 do
		w1 = Nx.random_uniform({2, 8}, -3.9, 3.9)
		b1 = Nx.random_uniform({8}, -3.9, 3.9)
		w2 = Nx.random_uniform({8, 1}, -3.9, 3.9)
		b2 = Nx.random_uniform({1}, -3.9, 3.9)
		{w1, b1, w2, b2}
	end
	defn predict({w1, b1, w2, b2}, x) do
		x
		|> Nx.dot(w1)
		|> Nx.add(b1)
		|> Nx.tanh()
		|> Nx.dot(w2)
		|> Nx.add(b2)
		|> Nx.sigmoid()
	end
	defn loss({w1, b1, w2, b2}, x, y) do
		preds = predict({w1, b1, w2, b2}, x)
		(preds - y)
		|> Nx.power(2)
		|> Nx.mean()
	end
	defn update0({w1, b1, w2, b2} = params) do
		x = Nx.tensor([0.0, 0.0])
		y = Nx.tensor([0])
		{grad_w1, grad_b1, grad_w2, grad_b2} = grad(params, &loss(&1, x, y))
		{w1 - grad_w1 * 0.1, b1 - grad_b1 * 0.1, w2 - grad_w2 * 0.1, b2 - grad_b2 * 0.1}
	end
	defn update1({w1, b1, w2, b2} = params) do
		x = Nx.tensor([1.0, 0.0])
		y = Nx.tensor([1.0])
		{grad_w1, grad_b1, grad_w2, grad_b2} = grad(params, &loss(&1, x, y))
		{w1 - grad_w1 * 0.1, b1 - grad_b1 * 0.1, w2 - grad_w2 * 0.1, b2 - grad_b2 * 0.1}
	end
	defn update2({w1, b1, w2, b2} = params) do
		x = Nx.tensor([0.0, 1.0])
		y = Nx.tensor([1.0])
		{grad_w1, grad_b1, grad_w2, grad_b2} = grad(params, &loss(&1, x, y))
		{w1 - grad_w1 * 0.1, b1 - grad_b1 * 0.1, w2 - grad_w2 * 0.1, b2 - grad_b2 * 0.1}
	end
	defn update3({w1, b1, w2, b2} = params) do
		x = Nx.tensor([1.0, 1.0])
		y = Nx.tensor([0])
		{grad_w1, grad_b1, grad_w2, grad_b2} = grad(params, &loss(&1, x, y))
		{w1 - grad_w1 * 0.1, b1 - grad_b1 * 0.1, w2 - grad_w2 * 0.1, b2 - grad_b2 * 0.1}
	end
end

defmodule M do
	def l do
		epochs = 3000
		params = XorNet.init_params3()
		#|> IO.inspect
		params = for _ <- 1..epochs, reduce: params do
			pa ->
				XorNet.update1(pa)
		end
		params = for _ <- 1..epochs, reduce: params do
			pa ->
				XorNet.update2(pa)
		end
		params = for _ <- 1..epochs, reduce: params do
			pa ->
				XorNet.update3(pa)
		end
		params = for _ <- 1..epochs, reduce: params do
			pa ->
				XorNet.update0(pa)
		end
		#|> IO.inspect
		#IO.puts "1, 1"
		x = Nx.tensor([1.0, 1.0])
		y = Nx.tensor([0])
		XorNet.loss(params, x, y)
		#|> IO.inspect
		#IO.puts "1, 0"
		x = Nx.tensor([1.0, 0])
		y = Nx.tensor([1.0])
		XorNet.loss(params, x, y)
		#|> IO.inspect
		#IO.puts "0, 1"
		x = Nx.tensor([0, 1.0])
		y = Nx.tensor([1.0])
		XorNet.loss(params, x, y)
		#|> IO.inspect
		#IO.puts "0, 0"
		x = Nx.tensor([0, 0])
		y = Nx.tensor([0])
		XorNet.loss(params, x, y)
		#|> IO.inspect
		IO.puts "1, 1"
		x = Nx.tensor([1.0, 1.0])
		XorNet.predict(params, x)
		|> IO.inspect
		IO.puts "1, 0"
		x = Nx.tensor([1.0, 0])
		XorNet.predict(params, x)
		|> IO.inspect
		IO.puts "0, 1"
		x = Nx.tensor([0, 1.0])
		XorNet.predict(params, x)
		|> IO.inspect
		IO.puts "0, 0"
		x = Nx.tensor([0, 0])
		XorNet.predict(params, x)
	end
end


```

# 実行結果

```
> M.l
1, 1
#Nx.Tensor<
  f32[1]
  [0.02802320569753647]
>
1, 0
#Nx.Tensor<
  f32[1]
  [0.8250799775123596]
>
0, 1
#Nx.Tensor<
  f32[1]
  [0.9392667412757874]
>
0, 0
#Nx.Tensor<
  f32[1]
  [0.010074029676616192]
>
```

以上。
1台のホストPCでStable Diffusion web UIを起動し複数端末からアクセスする

# 概要

ホストPCで起動したStable Diffusionのローカルサーバに、同一ネットワーク上にある端末からアクセスをする方法についての記事です。これによって、複数端末で画像生成を行いたい際にホストPC上で環境構築さえしてしまえば他端末では環境構築の必要なくStable Diffusion web UIを使用することができます。

# テスト済みの動作環境

- ホストPC: MacBook Pro (Chip: Apple M2 Max, Memory: 96GB, macOS: Ventura 13.4)
- ゲストPC: Surface Pro (Chip: Intel Core i5, Memory: 8GB, OS: Ubuntu 22.04.2)

本記事でMacOSのパソコンをホストとして設定方法を解説していきます。Windowsではセットアップ方法が異なる点に気をつけてください。
また、ゲストPCにUbuntuの端末を使用していますが、これは特に関係ないので（手元にあっただけ）MacやWindowsで問題ありません。

# ホストPCのセットアップ

（前提としてホストPCではStable Diffusion web UIの環境構築が問題なくできているものとします。環境構築がまだの方は先に環境構築を行なってください。）

## ローカルIPアドレスの確認

まず、ホストPCのIPアドレスを確認します。ターミナルで

```shell
$ ifconfig en0 inet
```

と実行してください。

`ifconfig`はネットワークインタフェースの設定を表示するためのコマンドであり、`en0`はイーサネット（≒ wifi）、`inet`はIPv4という通信規格における端末の現在のプライベートIPアドレスを示しています。

ローカルIPアドレスは同一ネットワーク上では一意に割り振られており、このアドレスを用いて他端末からホストPCのローカルサーバにアクセスすることができます。

ところで、普段Stable Diffuion web UIを起動した際にアクセスする`127.0.0.1`というアドレスはローカルループバックアドレスと呼ばれるものであり、各端末のローカルIPアドレスを返すアドレスとなっています。そのため、ローカルサーバを起動後`127.0.0.1:7860`の代わりに`192.168.X.X:7860`（Xには自分のローカルIPアドレスの数字を入れる）にアクセスしても同じようにStable Diffusion web UIを使うことができます。

## Web UIをサーバー化する

しかし、このままでは`192.168.X.X:7860`に他端末からアクセスすることができません。APIサーバとしてネットワーク上でアクセスできるようにするためには、サーバ起動時のオプションに`--listen`をつける必要があります。Stable Diffusionでは起動時のオプションは`webui-macos-env.sh`の`COMMANDLINE_ARGS`に記載されているので、この末尾に`--listen`オプションを追加してあげましょう。

```sh:./webui-macos-env.sh
export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --use-cpu interrogate --listen"
```

この状態でサーバーを起動すると、今までは`192.168.X.X:7860`で起動していたStable Diffusion web UIが`0.0.0.0:7860`で起動するようになります。これにより、同一ネットワーク上にある別の端末からホストPC上で起動しているStable Diffusion web UIにアクセスできるようになります。アクセスするためには、先ほど使用した`192.168.X.X:7860`(IPアドレス+ポート番号)というアドレスを使用します。

注意：複数の端末で同時に画像を生成する場合でもキューは1つなので、生成は順番に行われます。これを防ぐためには別ポートで複数サーバーを立てる必要があります。
Grafanaという運用監視ソフトの話

先月[GrafanaでDockerの監視をする](https://qiita.com/ist-sh-ha/items/1b234ef8b50f918ab0d2)記事を投稿しましたが、そもそも[Grafana](https://grafana.com/grafana/)ってなんですのという方もいるかと思われます。
投稿の順番があべこべにはなりますが、今回はGrafanaの基本的な役割、Grafanaに何ができるのか、なぜGrafanaが良いのかということを書いていこうと思います。

## Grafanaって何❓
![logo-horizontal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3347403/b9f225af-2137-001f-8780-bcdd0681a058.png)
出典: [GitHub - grafana/grafana](https://github.com/grafana/grafana)

Grafanaを一言で表すと「統合運用監視ソフトウェア」です。有名どころだとZabbixが競合として挙げられます。
蓄積された時系列データを集計し、グラフとして可視化する、或いはそうしたグラフを集約してダッシュボードを構築するというのが主要な利用方法の一つです。


## データ可視化(ダッシュボード構築)📈
時系列データであれば何でもよく、CPU使用率からリクエスト数、エラー出力数、果ては1日の売上金など、時刻と値の組み合わせであれば何でもOKです。
CPU使用率なら単純にその値を取ったりしますが、例えばリクエスト数であれば、ログデータから単位時間毎のカウント数を計算するといった使い方になります。

可視化の方法も折れ線グラフやゲージ、ヒートマップ、テーブル形式など多様な見せ方ができます。
[以前の記事](https://qiita.com/ist-sh-ha/items/1b234ef8b50f918ab0d2)で紹介したダッシュボードもその一例です。

注意点として、ZabbixのようにCPU使用率などの負荷測定をするエージェントは付属していません。
時系列データがまとめられたデータソースが別途用意されている環境の下で役割を発揮するソフトとなります。

## アラート発報🔔

Grafanaは運用監視に必要不可欠であるアラート機能も有しています。

ダッシュボード構築において収集したデータについて条件を指定し、アラートを発報させます。
アラートの通知先は結構広くカバーしており、EメールはもちろんTeamsやSlackにも対応しています。またWebhookにも対応しており、自前の通知機構を利用できます。

通知ルールにおいても、1回閾値超えたらアラートとする他にも、直近5分間のうちに3回超過でアラートというように、自前で作ろうとすると面倒な機構も簡単に用意できます。(1年前に知りたかった。本当に面倒だったんですよね…)

## 稼働環境について🖥
GrafanaはGrafana Cloudという名称でSaaSとして提供されています。
一方、Grafana OSSとしてオンプレミスで動作するソフトウェアも提供されています。
用途に合わせて適切な方を選ぶと良いと思います。筆者の場合、社内からシステム監視する業務ではGrafana OSSを導入していました。

## Grafanaを使う利点
他の運用監視ツールを差し置いて使う理由ですね。

### ダッシュボードの柔軟性が高い
Grafanaは「可視化」の機能にこだわっているようで、複数パネルを好きなレイアウトで配置できます。ドラッグで大きさ変えたり、凡例の場所変えたり色々。

### グラフに注釈を付けて共有できる
例えば特定の時間のピークに何か原因があるとわかった時、グラフの該当部分をクリックして注釈(annotation)を残すことができます。
また、特定の期間のスナップショットを残すこともできます。あまりに古い時系列データはDBから削除または退避させられることがありますが、スナップショットを残せばDBの制約なく保存できます。

### 何でも(強引に)データ変換できちゃう
例えば直近30分の最大値を表示させるとか、サービス毎に最新のステータスを表示するとか、複数クエリのデータをマージして処理するとか、etc…
運用監視にありがち(?)な無茶振りクエリですが、Grafanaはある程度手伝ってくれます。
取得した元データに対しクエリ変換(Transformation)の機能を使って、所謂”GROUP BY”で集約したり、余計なフィールドを切り落としたり、リネームしたり、多彩な変換が可能です。
これらの変換は1つのパネル内で連続適用でき、必要なデータだけ抜き出して綺麗に見せるといった使い方ができます。
多機能な反面、ユーザが混乱しやすい部分でもあり、パズル的な試行錯誤が必要となります(経験談)。
が、使いこなせるとGrafana面白い！と感じると思います。多分。

## 最後に
可視化のところばかり褒めてますが、アラートも十分使える機能です。
自前のシステムがないので今回はテキスト主体の記事となりましたが、[公式サイト](https://grafana.com/grafana/?tab=home-energy)の中程からあるダッシュボードの構築例をぜひ見てみてください。何ができるかのイメージが沸くと思います。
xAnalyzer plugin for x64dbgはすごい

マルウェア解析において、マニュアルアンパックは重要なテーマである。

マニュアルアンパックのコツはいろいろあるが、今回は、本来のプログラムで呼び出される可能性が高いAPIに着目する方法を説明する。

解析対象のマルウェアは、起動後、インターネットエクスプローラのプロセスを一時停止で開始し、ヒープメモリに悪性コードを書き込んだ後、停止位置を書き換え、再開させる。

いわゆるProcess Hollowing(プロセス ハロウィング)である。

このマルウェアは、CreateDialogIndirectParamAなどの関数呼び出しにより、x64dbgでの追跡が難しい。

そこで、bp GetThreadContext などで、プロセス ハロウィングしているところのAPIにブレークさせて解析したいと考えた。

ところが、LoadLibraryAやGetProcAddressなどで動的にAPIを呼び出しているためか、絶対に使っているはずのAPI GetThreadContext でブレークしない。

どうやったら、動的に呼び出しているAPIにブレークポイントを設定できるのだろうか？

知ってれば簡単かもしれないが、x64dbgのプラグインに xAnalyzer を追加するだけ。

マニュアルアンパックやOEP発見アプローチが桁違いに楽になる。


https://github.com/ThunderCls/xAnalyzer
Oracle Analytics Cloud：数値書式を整数表示にする。データセット側で設定する。

はじめに
---
数値項目の数値書式を整数表示に変更してみます
数値書式を変更する際、２つ方法があります。１つめはデータセットの列に対して変更する、２つめは、レポート側、つまり表やピボット、グラフなどのビジュアライゼーションで変更する方法があります
今回は、データセットの列に対して変更する手順を試してみます。金額USDを整数表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/2a005c04-68b2-b791-3dc8-e6c6a333a13b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/389a68d5-d6a5-775d-9393-62c5b4fab2d9.png)


記事記載時のOAC ver：May 2023 Update

データセットの作成
---
以下のExcelファイルをアップロードしてデータセットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d6c90617-fa36-4d90-8eb8-eb62bed7af2f.png)


「作成」ボタンをクリックします。「データセット」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/11cd8809-bade-7a64-d53f-d035fdbc236b.png)

Excelファイルをアップロードします。データセットの作成ダイアログで、「ここにデータ・ファイルを・・・」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/56faa667-3371-b111-202b-41a24418fa08.png)

アップロードするExcelファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ecaf4611-9427-5ac3-7765-67ea0fb97e61.png)

アップロードされたデータが表示されます。OKをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/e7e3215d-6209-1959-7cb1-7d5d03918366.png)

保存をクリックします。任意の名前を入力します。OKをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/77da7c78-72b9-ed95-d220-10f2e45789c4.png)

データセットが保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/e15b0621-6a49-555c-8c48-7dcce6e8d15b.png)

データセットで数値書式を設定する
---
設定する表をクリックします。下部の対象の表のシートをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/baee8b2f-e1e6-561e-33d8-8db14c2a6d73.png)

書式設定する列をクリックします。左下部にプロパティが表示されます。「＃」タブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a1447328-3ad7-0f96-8e30-437070f1c6dd.png)

「＃」タブで、数値書式の「自動」をクリックします。メニューから「数値」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a8b33eb4-0b01-2374-47ed-bad3c864a9ed.png)

小数点の数字をクリックします。小数点以下の桁数を指定します。整数表示にする場合は、「0」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1271716e-0ba8-6ea4-bfb9-7848df12f371.png)

設定後、データセットを保存します。右上部の「データセットの保存」をくりっくします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/93144aa8-a63e-dba6-9cbd-dbaed476bdaa.png)

書式設定の確認
---
右上部、ワークブックの作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/076222f2-a311-6e3a-d8f1-52ae12e97035.png)

項目をドラッグして右のキャンバスにドロップします。整数表示されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3c960e4d-b5f7-27eb-f495-2b4c157769e2.png)

データセットで数値書式を設定すると、ワークブック作成時に自動で書式が反映されます。

以上
VScode 複数ウィンドウを切り替えるショートカットキー

VScodeで開発してる時に複数ウィンドウを開きながら開発していてショートカットキーで画面切り替えできることに気づいたので共有。（Macで説明してます。）


## 結論

Command + @　で切り替えできます。

## Macブックでの設定
上記ショートカットキーでうまく動かない場合PC側の設定を確認します。

### 確認方法
「アップルアイコン」→「システム環境設定」→「キーボード」→「キーボードショートカットキー」→「キーボード」→「次のウィンドウを操作対象にする」

ここにチェックを入れ、任意のショートカットキーを設定することで機能します。（実際はCommand＋＠以外でもできます。）

<img width="500" alt="スクリーンショット 2023-07-31 17.47.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646212/f379865f-25fc-69c6-8c48-703a72069ff3.png">
<img width="500" alt="スクリーンショット 2023-07-31 17.47.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646212/5f5883b1-cb31-81d9-7a5f-d8f477a57f5f.png">

これでちょぴっと開発が捗りそうです！
Makefileのtarget-patternについて

## 要約 ##

1. '%' は1文字以上(空ではない)でないといけない。
1. 複数ターゲットを定義する際、通常の(明示的)ターゲットとパターンルールを混在させるとエラーになる。


Makefileの暗黙のルール(implicit rules)のtarget-patternに使用される'%'の使い方を間違えて嵌ってしまったので、
[本家ドキュメント](https://www.gnu.org/software/make/manual/make.html#Pattern-Rules)を読み直してみました。

### 10.5 パターンルールの定義と再定義

暗黙のルールはパターンルールを記述して定義を行います。
パターンルールは通常のターゲットルールと同様ですが
ターゲットに'%'という文字を含みます。
（正確には'%'はパターンを表すいくつかの文字のうちの一つ)

'%'以外の文字が完全一致している状態で **'%' が空ではない部分文字列** でマッチすれば
パターンに合致するターゲットとなります。
ターゲットの前提条件(prerequisites)もターゲットと同様に '%' を使用できます。(このときターゲットと前提条件に含まれる '%' は同じ文字列となり) 前提条件とターゲットの名前に相関があることを示しています。

...(以下略)

だから、abcというターゲットとabcdというターゲットに同じrecipe(処理ルール)を適用させるにはそれぞれのターゲットで同じものを書く必要がある。



```Makefile
abc%:
    echo "$@ target"

$ make abc
# abcに関する明示的ルールにマッチしないため暗黙のルールabc.oを実行しようとしている。
echo "abc.o target"
abc.o target
cc   abc.o   -o abc
/usr/bin/ld: cannot find abc.o: No such file or directory
collect2: error: ld returned 1 exit status
make: *** [<builtin>: abc] Error 1

-----
abc:
    echo "$@ target"
abc%:
    echo "$@ target"

$ make abc
echo "abc target"
abc target
$ make abcd
echo "abcd target"
abcd target
-----

abc abc%:
    echo "$@ target"

$ make abc
Makefile:1: *** mixed implicit and normal rules: deprecated syntax
echo "abc target"
abc target
$ make abcd
Makefile:1: *** mixed implicit and normal rules: deprecated syntax
make: *** No rule to make target 'abcd'.  Stop.
```