OmniAICreator/Qiita-1.07M huggingface dataset:
Dartのnull safetyのxxObj?.xxMethod()とxxObj!.xxMethod()の違いとは

# はじめに

Dartにnull safetyが導入されて、ちょっとめんどくさくなりましたね。
バグが減るのはいいんだけど、十分な品質のコードを書ける人には、やることが増えて困ったちゃん:smiling_imp:
まあ慣れれば大丈夫さ:sunglasses:品質も上がる。

表題の件を調べても、よくわからなかったので、実験して記事にしました。

# 結果

・xxObjがnullの時は!だとnull例外発生、?だとスルー（メソッドが呼ばれない）。
・xxObjがnullじゃない時は両方ちゃんと呼ばれる。

例外が出てほしくない時は?だね。こういうチェックはもう不要だね。
```dart
    if (mUserPlayer != null) {
      mUserPlayer?.next(true);
    }
```
ただ
```dart
    if (!mUserPlayer!.waitingTouch) {
```
waitingTouchがboolなんだけど、mUserPlayer?だとビルドできなかった。めんどくさいね。
混在するとちょっと気持ち悪いし。

# 最後に

Flutter始めましたー。
今回も手抜き。
Unicodeとは、UTF-8・6、ユニコードスケープ形式とは

# Unicodeとは
Unicodeとは文字集合。世界中で使われている文字を集めたもの。

# UTF8とUTF-16とは
UTF8とUTF-16はUnicodeで定義されている文字を符号化（エンコーディング）するもの。
| Unicode   |  UTF-8  | UTF-16  |
| ---- | ---- |
|  あ  |  E3 81 82  | 42 30  |

http://una.soragoto.net/topics/9.html

# ユニコードエスケープ形式とは
使用する文字コードが不明な状態を表現するために利用されるのがユニコードスケープ形式。
ユニコードエスケープ形式では「\u」に、文字の符号位置を表す16進数の値を付加します。たとえば「あ」という文字であれば「\u3042」。

http://una.soragoto.net/topics/12.html
Google Ads APIバージョンの確認・アップグレード

# アップグレード通知は突然に
それは突然やってきました。
（メール引用）
![スクリーンショット 2022-04-28 13.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147005/32e8cce1-fd85-585c-1547-9889008866aa.png)

あ、アップグレードしなきゃ:neutral_face:
いや待てよ...そもそもバージョンの指定なんてした覚えがないのですが？

# APIの呼び出し環境
RoRで開発を進めているプロジェクトなので、もちろんAPIの呼び出しには公式のgemを使っています。
https://github.com/googleads/google-ads-ruby

# バージョン指定箇所の大捜索
プロジェクト内で指定している箇所を検索しました。
しかし、探せど探せど見つからない。
流石にconfigファイルにあるだろうと思ったけど見つからない。

# そうだGitHub上で探そう
こう思えるようになったのも自分の成長の証な気がしました。
GitHub上でバージョンに関係しそうなファイルを探します。

ついに手がかりを見つけました。
https://github.com/googleads/google-ads-ruby/blob/4cfbc9f04c3afeea2327a1675394aa3cb7621231/lib/google/ads/google_ads/api_versions.rb

```ruby
module Google
  module Ads
    module GoogleAds
      KNOWN_API_VERSIONS = [:V8, :V9, :V10]
      DEFAULT_API_VERSION = :V10

      def self.default_api_version
        DEFAULT_API_VERSION
      end

      def self.known_api_versions
        KNOWN_API_VERSIONS
      end

      def self.valid_version?(version)
        known_api_versions.include?(version)
      end
    end
  end
end
```
つまり、デフォルトはv10なんだな？ん？

# ローカルで確認
早速rails cで確認します。

```ruby
pry(main)> Google::Ads::GoogleAds.default_api_version
=> :V8
```

v8なんだよなあ。だからあのメールが来たんですけどね。

# 結局gemのバージョンが低いだけ
結局gemのバージョンを14に固定していたのが原因でした。
なぜそこに一番に目が行かなかったのかと思う方もいるかもしれません。
でもこれを見てください。
https://rubygems.org/gems/google-ads-googleads/versions/0.3.0?locale=ja
v14のリリースから1年も経っていないのです。
リリース1年未満のバージョンが動作しなくなるなんて思ってもいなかったのです。
こういう思い込み本当に良くないですね。
gemのバージョンを16にすると問題は解決できました。
```ruby
pry(main)> Google::Ads::GoogleAds.default_api_version
=> :V10
```

# 追伸
当たり前ですが、バージョンをコードで指定する方法もあると思います
Bronze DBA 模試 復習アウトプット2

# Enterprise Manager Data Express
そもそもこのツールは何？
GUIで使用するデータベースの管理や監視をするツール。
・GUI(グラフィカルユーザーインターフェース)→画面で動かすもの
・CUI(コマンドユーザーインターフェース)→コマンド上で動かすもの

ツールの大前提：
DBがオープンしている必要あり

できないこと
・インスタンスの起動停止
・バックアップリカバリ
・オブジェクトの作成/変更
・ネットワーク設定

# Oracle Inventory
インストール情報の保持のため

# 自動セグメントアドバイザ
オンラインで縮小の<font color="Red">提案</font>はあるが、<font color="Red">自動化はしていない。
</font>

# Oracleネットワーク対象
EMCCと「Net」とついているもの。
暗記。

# インスタンスの停止
NORMAL
TRANSACTIONAL
IMMERDIATE
の場合は、チェックポイントが発生

ABORT(緊急停止)なので、チェックポイントがなく、データの整合性を保てない。

そのため、「ロールフォワード」を先に実行
その後「ロールバック」を実行

### ロールフォワードとロールバックの違い
・ロールフォワード
　　データファイルが適用されていない。
　　一度戻してやり直す
・ロールバック
　　トランザクションを元に戻す

# REDOログファイル特徴
・データベースの変更をずっと記録する。
・インスタンスリカバリに使用される。

# リスナーの考え方
リスナーが起動しないとデータベースを接続できないが
接続した後だと、リスナーを停止しても影響はない。
リスナー起動→DB接続→セッション発生

セッション発生後→リスナー停止
この状態でも、セッションは存在し、SQLを実行できる。
つまり、接続するためには必要だが、。接続してしまえば関係のないこと

# スナップショット
PMONではなく、MMONである。

# 解析の繰り返しによるパフォーマンスの低下
共有プールアドバイザが適任。
理由：SQL文の解析後の実行計画は、共有プールに格納される。
格納された実行計画を共有することで、何度も解析されることがない。
そのため、「解析の繰り返しによるパフォーマンスの低下」という点で有効。

# 参考リンク

https://wa3.i-3-i.info/diff350db.html
Scalaの勉強はじめました 12 〜スレッドセーフ〜

## はじめに
N予備校で「Scala基礎」「Scala応用」「並行処理プログラミング」を受講しています。今回からしばらくは並行処理についてになります。

## 並行性
:::note
マルチプロセスやマルチスレッドで実現している CPU のリソース数に限らず、複数の数のタスクを実行する性質のこと
:::

```scala
object ThreadTest extends App {  
  println(Thread.currentThread().getName)

  val thread = new Thread(() => {
    Thread.sleep(1000)
    println(Thread.currentThread().getName)
  })
  thread.start()

  println("main thread finished.")
}
```

`currentThread`は現在の処理が実行しているスレッドのインスタンスを取得する。

### synchronizedブロック
```scala
object ThreadRisk extends App {
  private var counter = 0

  def next(): Int = synchronized {
    counter = counter + 1
    counter
  }
  for (i <- 1 to 10) {
    new Thread(() => {
      for (j <- 1 to 100000) {
        println(next())
      }
    }).start()
  }
}
```

一つしかこの処理を通らないようにする、アトミックに行われることを保証する。

:::note
一連の処理を原子のようにこれ以上分解できない単一の単位処理として行うことを、アトミックな処理という。
:::

## スレッドセーフ
複数のスレッドで操作した場合に正しく動かない実装の状態のことを「スレッドセーフではない」という。

:::note
・可変の状態を複数のスレッドが共有しないようにする
・可変の状態を不変にする
・可変の状態へのアクセスを常に同期化する
:::

このいずれかを対処し、マルチスレッドへの対応がされたオブジェクトやクラスなどが`スレッドセーフ`という。

```scala
object CheckThenAct extends App {
  for (i <- 1 to 100) {
    new Thread(() => {
      println(SingletonProvider.get)
    }).start()
  }
}
object SingletonProvider {
  private[this] var singleton: BigObject = null

  def get: BigObject = this.synchronized {
    if (singleton == null) {
      singleton = new BigObject()
    }
    singleton
  }
}
class BigObject() {
  Thread.sleep(1000)
}
```

`this　synchronized`
`this`というインスタンスでロックを取得する。

:::note
ロックとは、その処理が指定したインスタンスで1 つしか実行されないように カギをかけること
:::


## まとめ
ロックした処理の中で重い処理を実行した場合、全体のパフォーマンスにも関わってくるので、`synchronized`を使う時は注意が必要、とのこと。
リモートリポジトリのコミットをなかったことにする方法

## 間違ってメインブランチにプッシュしちゃった！
ってことありますよね。その時にその失態を隠す必要があります。
（場合によってはお勧めしませんが、、、）


### 方法１

```
// 直前のコミットを取り消す
git reset --hard HEAD^

// 強制的にPushする
git push -f origin [ブランチ名]
```
ローカルリポジトリで直前のコミットを取り消して、それを無理矢理ブランチにプッシュする方法。
-fを使うことでエラーを無視してプッシュできます。

### 方法2

```
// 戻したいコミットのSHA-1を確認
（こんな感じの"eca02c1c8ae758c8596345635c377db0a519e422e6"）
git log

// 強制的にPushする
git push -f origin eca02c1c8ae758c8596345635c377db0a519e422e6:[ブランチ名]
```
戻したいコミットを参照してそれをリモートリポジトリに無理やりプッシュする方法。
ローカルでの作業は残ったままリモートブランチを書き換えることが可能。なお、履歴は残りません。
SSHを設定してリモートレポジトリをクローン出来た！！！

# permission denied(public key)のエラーを乗り越えた！！！
　VScodeからプッシュ権限が得られないということで、五日ほど前からSSHの設定しリモートレポジトリを取り込もうとしたら
```
permission denied(public key)
```
というエラーが出てしまっていました。いろいろ調べてやっとできるようになりました。
## レポジトリのクローンを複製するときのコマンド
　ズバリこのコマンドがミスっていました。このコマンドでは
```
git clone 複製するレポジトリ
```
　と入力しなきゅいけないんですが、複製したレポジトリの保存位置を指定しなかったために起こっていました。
参考　https://www.atlassian.com/ja/git/tutorials/setting-up-a-repository/git-clone
## 時間がかかりすぎた、、、、
　一つの初歩的なミスなのになんでこんなに時間がかかってしまったのか
　問題解決のために起きている事象を把握する力をつけたいと思いました。
JavaでNIO.2を使いつつZIP圧縮＆解凍

# 環境
JDK 17を使っています。たぶん、多少バージョンが違っていても同じように動くと思います。

# 圧縮
test1.txt・test2.txt・test3.txtを圧縮して、test.zipを作成します。

```java:import文
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
```

```java:コード本体
List<Path> targetFileList = List.of(
        Path.of("test1.txt"),
        Path.of("test2.txt"),
        Path.of("test3.txt")
);

Path zipFile = Path.of("test.zip");

try (OutputStream os = Files.newOutputStream(zipFile, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
     ZipOutputStream zos = new ZipOutputStream(os, StandardCharsets.UTF_8)) {
    for (Path targetFile : targetFileList) {
        ZipEntry zipEntry = new ZipEntry(targetFile.getFileName().toString());
        zos.putNextEntry(zipEntry);
        byte[] bytes = Files.readAllBytes(targetFile);
        zos.write(bytes);
        zos.closeEntry();
    }
} catch (IOException e) {
    // 適切に例外処理してください
}
```

# 解凍
圧縮の際に作成したZIPファイルを、resultフォルダに解答します。

```java:import文
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
```

```java:コード本体
Path zipPath = Path.of("test.zip");
Path dir = Path.of("result");

try (ZipFile zipFile = new ZipFile(zipPath.toFile(), StandardCharsets.UTF_8);
     Stream<? extends ZipEntry> stream = zipFile.stream()) {
    List<Path> uncompressedFileList = stream.filter(zipEntry -> zipEntry.isDirectory() == false)
            .map(zipEntry -> {
                try (InputStream is = zipFile.getInputStream(zipEntry)) {
                    byte[] bytes = is.readAllBytes();
                    Path uncompressedFile = Path.of(dir.toString(), zipEntry.getName());
                    Files.write(uncompressedFile, bytes, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
                    return uncompressedFile;
                } catch (IOException e) {
                    throw new UncheckedIOException(e);
                }
            })
            .toList();
} catch (IOException e) {
    // 適切に例外処理してください
}
```

# 参考にした記事
- [ひしだまメモ](https://www.ne.jp/asahi/hishidama/home/tech/java/zip.html#h2_ZipOutputStream)
- [公式Javadoc](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/zip/package-summary.html)
受託開発企業で働くメリット3選

## この記事の目的

- 採用担当として候補者の方とお話をするとき、よく聞かれるので思うところを整理しました。
- エンジニア就職・転職活動をしている方の参考材料になれば嬉しいです。
- 筆者が受託開発企業なので、その目線オンリーになってしまうのはご容赦ください。

## メリット1: スキルセットの幅を広げやすい

エンジニアとして、ここを魅力に感じる人は多いかもしれません。

案件に応じて、言語はもちろん、フレームワークに各種クラウドサービス等、その都度必要な知識を身に着けていくことになります。

触れたことのない技術でも物怖じせず挑むことができる人は、どんどん技術・知識の枝葉を伸ばしていくことができます。

エンジニア歴が長くなれば長くなるほど、特定の技術に依存して活躍することが難しくなるので、様々な案件に挑戦し、スキルセットを充実させることは、決して無駄にならないと思います。

## メリット2: 様々な分野の知識（ドメイン知識）を得ることができる

エンジニアは技術知識だけあれば良いのか、というとそうではありません。

開発するサービスの業界特有知識を、いかにシステムに落とし込むか、という視点が常に重要になります。

例えば、金融系のプロダクト開発には、口座・送金・引き落とし...などの概念がありますが、これらをうまくモデル化するためには、それぞれがどのようなものなのか、しっかり理解しておく必要があります。

こうした各分野特有の知識(ドメイン知識)を幅広く吸収できるのは、受託開発企業ならではの良さかもしれません。


## メリット3: コミュニケーションスキルを磨くチャンスも多い

3つの中でも最も汎用性の高い要素だと思います。

クライアント企業の方とのコミュニケーションはもちろん、チームには他社のメンバーも在籍していることがあるので、様々な所属の方と連携する機会が非常に多いです。

そのため、誰に対してもわかりやすい説明、齟齬のない質疑応答ができる人は、プロジェクトをスムーズに進める上で非常に重宝されます。

また、案件へのアサイン可否判断として、面接を行うクライアントも多いです。

「相手が求めているのはどういう人材か」、「自分がそうであることをアピールするためにはどうすればよいか」を考え、行動する場としてはうってつけです。

ただ「選ばれる」という視点だけではなく、成長のチャンスとして捉えることで、よりコミュニケーションスキルを磨くことができると思います

## 大切なことは

以上、「受託開発企業で働くメリット3選」という形でご紹介してきましたが、これらのメリットは、ただ受託開発企業で働くだけで得られるわけではありません。

上記は全て、「自分の現状に甘んじず、新しいステージ（案件）に挑戦し続ける」ことで獲得できるものになります。

アサインされた案件をただこなしていくだけでは、なかなか得るものも少ないですし、何より楽しくないでしょう。

エンジニアとして、ビジネスパーソンとして成長し続けたい人には、受託開発企業も有用な選択肢の一つになるのではないかと思います。

## おわりに

弊社では、経験の有無を問わず、社員やインターン生の採用を行っています。
興味のある方は[こちら](https://www.recruit.nuco.co.jp/)をご覧ください。
Javaでクラスパス上のファイルをPathとして取得する

# 環境
JDK 17を使っています。たぶん、多少バージョンが違っていても同じように動くと思います。

# 今回のフォルダ構造
今回はsrc/main/resources配下のファイルを取得したいとします。

```bash
$ tree .
.
└── src
    └── main
        ├── java
        │   └── foo
        │       └── Main.java
        └── resources
            ├── sample1.txt
            └── bar
                └── baz
                    └── sample2.txt
```

# コード

```java:Main.java
package foo;

import java.nio.file.Path;

public class Main {
    public static void main(String[] args) {
        Path path1 = Path.of(Main.class.getClassLoader().getResource("sample1.txt").toURI());
        Path path2 = Path.of(Main.class.getClassLoader().getResource("bar/baz/sample2.txt").toURI());
    }
}
```

指定したファイルが存在しなかった場合は `getResource()` が `null` を返すので、NullPointerExceptionが発生します。

それを防ぎたい場合は、 `getResource()` の戻り値をいったん変数に代入して、if文で `null` チェックしてから `toURI()` するなどの対策が必要です。
ESLintのrequire-unicode-regexpを自動修正に対応させてみた

## はじめに

ESLint の require-unicode-regexp ルールは JavaScript の正規表現に u フラグを付けることを要求します。

このルールを長らくオフにしていました。

正規表現の u フラグは、サロゲートペアを正しく扱えるようにし、正規表現が早期に構文エラーを投げるようにします[^1]。このルールをオンにするという考えに変わりました。

このルールをオンにしたら修正箇所が多くて萎えたので、自動修正に対応させてみました。

## インストール方法

1. eslint のコマンドの近くに node_modules\eslint\lib\rules\require-unicode-regexp.js があるので、探します[^2]。
2. require-unicode-regexp.js を [GitHub の require-unicode-regexp.js](https://github.com/querykuma/snippets/blob/master/eslint-rules/require-unicode-regexp.js) と置換します。

## さいごに

ESLint の自動修正はとても便利です。この自動修正が誰かの役に立てば幸いです。



[^1]: [公式のrequire-unicode-regexpルール](https://eslint.org/docs/rules/require-unicode-regexp)
[^2]: グローバルにインストールしたeslintのルールを置換して開発しました。ローカルにインストールしたeslintでも動くと思います。eslint本体のこの部分が更新されたら動かなくなる可能性があります。
Linuxコマンドライン編集コマンドの覚え書き

# カーソル移動コマンド

|コマンド|説明|
|:-:|:-:|
|Ctrl + b|後方に1文字分移動する|
|Ctrl + f|前方に1文字分移動する|
|Ctrl + a|行頭に移動する|
|Ctrl + e|行末に移動する|
|Meta + b|後方に1単語分移動する|
|Meta + f|前方に1単語分移動する|

# 文字を削除するコマンド

|コマンド|説明|
|:-:|:-:|
|Ctrl + h|Backspace カーソル位置の後方1文字を削除する|
|Ctrl + f|Delete カーソル位置の1文字を削除する|
|Ctrl + w|後方にスペース区切りで1単語分を削除する|

# カットとヤンク

|コマンド|説明|
|:-:|:-:|
|Ctrl + k|カーソル位置から行末までを削除する|
|Ctrl + u|カーソル位置から行頭までを削除する|
|Ctrl + y|後方にスペース区切りで1単語分を削除する|

# 画面のクリア

|コマンド|説明|
|:-:|:-:|
|Ctrl + l|画面情報をクリアする|

# コマンド履歴

|コマンド|説明|
|:-:|:-:|
|Ctrl + p|1つ前のコマンド履歴に移動する|
|Ctrl + n|次のコマンド履歴に移動する|
|Ctrl + r|履歴を遡って検索する|
CloudinaryのMedia Optimizerで画像・動画の最適化をする

## Cloudinary とは

https://cloudinary.com/

> Transform images and videos to load faster with no visual degradation, automatically generate image and video variants, and deliver high quality responsive experiences to increase conversions.

画像や動画を最適化して配信できる CDN サービスのこと。

似たようなものとして imgix がある。

## Media Optimizer

Cloudinary に画像・動画などをアップロードし、配信する方法とは別に、Media Optimizer という機能がある。
Media Optimizer では既存のアプリケーションで配信されている画像・動画を Cloudinary を経由して配信することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/9d366f65-8771-6d55-83aa-e83c15898984.png)
（引用: https://cloudinary.com/documentation/media_optimizer ）

そのため、アプリケーション側で画像・動画を呼び出す URL を変えるだけで、最適化された画像を簡単に配信することができる。

上記の画像にもあるが、Media Optimizer に連携できる`Media source`にはいくつかの種類がある。

既存のアプリケーションに簡単に含めたい場合は、`Web Address`を使うと簡単に導入できる。

https://cloudinary.com/documentation/media_optimizer_walkthrough

## 実際に使ってみてつまったところ

### 1. アカウント作成時に`Media Optimizer`を選択しなければならない

アカウント作成時に、`Select a product`で`Media Optimizer`を選択する。（選択しないと Media Optimizer を使用できない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/73dbca5b-39fc-384b-7502-2f6cd90c90b8.png)

### 2. Cache されたコンテンツの削除

https://cloudinary.com/documentation/media_optimizer_api#cache_invalidation

API から削除することが出来る様。
ホームページを作成する！①

始めまして、
実務未経験で転職を目指す者です。
html
css
gitとgithub
sql
ruby on railsを学びました。

# ホームページを作る！

復習もかねて、
身近な問題を解決するために
会社のホームページを作成しようと思います。

## どんなホームページを作るのか
* 何をしている会社か分かるようにする。
* どんな商品を扱っているのか分かるようにする。
* お店の情報（ブログ）や営業時間のお知らせができる欄を作る。

ざっとこんなホームページを作りたいと思っています。

## なんで作るのか
会社視点
* 現時点でホームページやブログなどが無く集客につなげられていないから。
* もっと多くの人に会社を知ってもらいたいから。

私個人の視点
* 実際に使われるものを作ることでどんな機能が必要になるかなどを学べると思ったから。
* 学んできたものを活かせると思ったから。

## どうやって作るのか


https://n-works.link/blog/webdesign/website-production-structural-design

こちらを参考に作っていこうと思います。

ざっくり３つのステージに分けてみました。

　　　　　　　　![sample_app-ページ2-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344199/481c731d-d0a6-dd50-e856-15d0df2c6aa3.jpeg)

### stage 1 　情報整理
どんな課題があるのか
どんな情報が必要なのか
どんな機能が必要なのか、などを整理して
『目的』と『目標』を明確にし
手段の１つであるホームーページをどんなものにするのかを決める
以上をstage１にします。

### stage 2 　 設計
stage2では『サイトマップ』と『ワイヤーフレーム』を作成し
サイトの全体像を把握しようと思います。
『サイトマップ』を作ることでstage１で出た必要な情報をサイトのどのページに
掲載するかなどを把握できると思います。
『ワイヤーフレーム』を作ることで必要な情報の漏れを防ぐと同時に
デザインの参考にもなると考えます。

### stage3  開発
htmlとcss
開発言語は『Ruby』
フレームワークに『Rails』
DBに『MySQL』
を使用して開発していこうと考えています。

## 最後に

初めてホームページを作成するので
わからないことだらけです。
コツコツやっていけたらと思います。

よろしくお願いします。
Salesforceのグローバルアクションを、プロファイルごとに制御してみる

# この記事はなに？

Salesforceのグローバルアクションを、プロファイルごとに制御する方法をストーリー仕立てで紹介する記事になります。

# プロローグ

ある会社には`フィールドセールス`、`インサイドセールス`、`カスタマーサクセス`の3つの部署が存在していました。

それぞれの部署で同じアプリケーションのSalesforceを利用しているのですが、プロファイルは`ビジネスメンバー`という共通のプロファイルを設定していました。

ここ最近、各部署からグローバルアクションである`活動の記録`のレイアウトを変更したいというリクエストが上がってきたのですが、それぞれ希望するレイアウトの内容が違うため、あなたは部署ごとにレイアウトを修正できる環境を構築しようと決めました。

# 現状とゴール

![スクリーンショット 2022-04-28 12.15.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/da23353d-5ac1-879e-b027-a5fa2d04e123.png)


今回のターゲットであるグローバルアクションの`活動の記録`は、内部的にはToDoオブジェクトのレコードを生成するものになるため、ToDoオブジェクトのレコードタイプ(今回の例では`お客様フォロー`)を必ず指定する必要があります。
また、プロファイルの`標準レコードタイプの設定`にて、プロファイルに対して適用させるToDoオブジェクトのレコードタイプを制御しています。

以上を踏まえて、ゴールとしては、各部署のグローバルアクションを作成し、それに対応するToDoオブジェクトのレコードタイプを作成、そして各部署のプロファイルを作りそれぞれ対応するレコードタイプを適用させることで、最終的には各部署でグローバルアクションである`活動の記録`のレイアウトを修正できる体制を作ることができます。

ここから先では、ゴールまでに発生する作業をもう少し細かく説明していきます。

# STEP1:ToDoオブジェクトに各部署のレコードタイプを作成

`活動の記録`という名前からして`活動オブジェクト`で作ると思うのですが、レコードタイプは`ToDoオブジェクト`で作る必要があります。(この辺の関係性？仕様？が、筆者もまだ理解できていない…)

`ToDoオブジェクト`のオブジェクトマネージャーページを開き、

- お客様フォロー(FS用)
- お客様フォロー(IS用)
- お客様フォロー(CS用)

の3つのレコードタイプを作成します。

# STEP2:グローバルアクションに各部署の活動の記録を作成

続いて、設定→グローバルアクション→グローバルアクションと進み、

- 活動の記録(FS用)
- 活動の記録(IS用)
- 活動の記録(CS用)

の3つのグローバルアクションを作成します。
この際、STEP1で作成したレコードタイプと対になるように作成をしましょう。

# STEP3:各グローバルアクションのレイアウトを変更

続いて、各部署から上がってきたリクエストをもとに、STEP2で作成したグローバルアクションのレイアウトを変更しましょう。
実際に入力する画面が1列に対して、レイアウトの編集ページでは2列になっている場合があります。
表示の優先順位としては、上にある項目が優先され、かつ左の項目が優先されて表示されます。(アルファベットの`Z`のイメージ)

# STEP4:各部署のプロファイルを作成

続いて、設定→ユーザ→プロファイルと進み、

- フィールドセールス
- インサイドセールス
- カスタマーサクセス

の3つのプロファイルを作成します。
また、`標準レコードタイプの設定`より、ToDoオブジェクトのレコードタイプの設定に進み、それぞれ対になるレコードタイプのみを適用するようにしましょう。

# STEP5:ToDoオブジェクトのページレイアウトを変更

各レコードタイプごとにレイアウトが異なるはずなので、

- お客様フォロー(FS用)
- お客様フォロー(IS用)
- お客様フォロー(CS用)

のページレイアウトを作成し、レコードタイプの割り当てを行いましょう。

# STEP6:ユーザのプロファイルを変更

ここまでで、各部署のグローバルアクションを作成し、それぞれのリクエストに対応したレイアウトが作成できているはずです。
最後に各ユーザのプロファイルを、今回新しく作ったプロファイルに変更しましよう。
これで、各部署ごとに独自にレイアウトを修正できる環境を構築することができました。

# おわりに

いかがでしたでしょうか？
もしかしたら、ここまで読んでくださった方の中には、

- プロファイルに対して部署の概念を持たせてもいいのか？(アンチパターンにならない？)
- こう実装したほうがスマートでは？

などなど、思う部分があるかもしれません。
筆者も完璧にSalesforceを理解できているわけではないため、ぜひコメントにてご意見などいただけますと幸いです。

ここまで読んでくださりありがとうございました！
mrubyでGPIOイベント

[GPIOイベント](https://qiita.com/yamori813/items/e25de40c3af86485bbaf)をmrubyで使えるようにしたいと思いmruby-bsdgpioにメソッドを追加してみました。

https://github.com/yamori813/mruby-bsdgpio

```ruby
t = BsdGpio.new(0)
p t.waitedge(12, BsdGpio::EDGE_RISING)
```

非同期で処理したいケースではlibuv+mruby-uv(kqueue)なんかを使うのが良いかもしれません。
Liferay7.4で同義語(Synonym)を利用する方法

# はじめに
LiferayはOSSのJavaベースのウェブポータル・システム開発基盤です。2004年から開発が始まり、世界のさまざまな業種にディーラーポータル、カスタマーポータル、またB2Bコマースとして導入されています。

Liferay 7.4はデフォルトでElasticsearchを検索エンジンとして利用しており、同義語(Synonym)を設定することができます。今回は日本語の同義語を設定する方法を紹介します。

[公式ドキュメントに同義語の設定](https://learn.liferay.com/dxp/latest/en/using-search/search-administration-and-tuning/synonym-sets.html#creating-new-synonym-language-filters)があります。このドキュメントではLiferayを立ち上げた後に、詳細に実際に動作させる部分にのみ注目して説明しています。詳しくはこちらを参照ください。

# 前提
- インストール手順などは[この過去記事](https://qiita.com/yasuflatland-lf/items/c5a69c5764c92bd22631)か、[公式ドキュメント](https://learn.liferay.com/dxp/latest/ja/installation-and-upgrades/installing-liferay.html)を参照してください。すでにLiferayはインストールされている前提で進めます。
# ステップ
1. 管理者でログイン、コントロールパネル -> システム設定 -> 検索へ移動
1. 左メニューから`Elasticsearch7`を選択、`追加インデックス設定`に[このgist](https://gist.github.com/yasuflatland-lf/81b8c887563adb2289c710bd7f0aad45)の`index-settings.json`を貼り付けます。
1. 次に`タイプマッピングを上書き`に同じ[gist](https://gist.github.com/yasuflatland-lf/81b8c887563adb2289c710bd7f0aad45)の`liferay-type-mappings.json`の内容を貼り付けます。
1. 画面の一番下までスクロールして保存します。
するとLiferayを起動しているコンソール上に以下のようなログが出て、Elasticsearchが再起動されるはずです。
    ```
    2022-04-27 08:41:49.554 INFO  [CM Event Dispatcher (Fire ConfigurationEvent: pid=com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration)][Sidecar:132] Stopping sidecar Elasticsearch
    2022-04-27 08:42:04.478 INFO  [CM Event Dispatcher (Fire ConfigurationEvent: pid=com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration)][Sidecar:119] Sidecar Elasticsearch liferay started at 127.0.0.1:9201
    ```
1. 次に左側のメニューから`同義語`に移動します。
1. ここで2行目の`同義語フィルター`のところに青い丸プラスボタンがあるので、それをクリックすると、テキストエリアが１つ下に追加されます。そこに`liferay_filter_synonym_ja`と入力して保存します。
1. 続いて`コントロールパネル -> 検索 -> インデックス管理`で`検索インデックスを再構築します。`で全インデックス再構築を行います。左上のロゴ横にローディングマークが表示されるはずです。それが消えたら再構築完了です。
1. `アプリケーション -> 同義語`で同義語を設定します。例えば、`都心`、`東京`とリターンキーを押すたびにラベル化されるので、それで保存します。
1. 続いてWebコンテンツを作ってみましょう。**日本語モードにして**(英語モードだと正しくインデックスされません)タイトルとコンテンツに`東京`と入力して保存します。
1. もう一つ、同じく日本語モードでタイトルとコンテンツに`千葉`と入力してみます。
1. デフォルトサイトのトップページに移動します。デフォルトだと右上に検索窓に`都心`とタイプして検索してみましょう。`東京`がヒットするはずです。
【React】onClickなどのイベントが親要素にも伝播されるのを防ぐ

## はじめに

とあるボタンにonClickイベント時の処理を設定した際、親要素にもonClickイベント時の処理を指定していたところ、「**ボタンのonClick時の処理発火→その後親要素のonClick時の処理も発火**」となってしまう事態が発生した。

簡単にコードを書くと、以下のような構成でボタンをクリックすると、コンソールに `ボタンをクリック` と `divをクリック` が出力されてしまうという状況。

```php
<div onClick={() => console.log('divをクリック')}>
  <button onClick={e => console.log('ボタンをクリック')}>
    ボタン
  </button>
</div>
```

ここで起きていた事態について、またその解決法について備忘録を書いておく。

※タイトルには【React】と書いたが、使用するのはJavaScriptの関数なのでReactだけの話では無い。

## バブリングとは

先述した事態の正体は「**バブリング**」というもの。

親要素を持つ要素においてイベントが発火すると、現代のブラウザではデフォルトで「バブリング」というメカニズムが発動する。

その流れは以下の通り。

- 実際にクリックされた要素の `onClick` イベントハンドラが登録されていれば、それを実行する。
- 次に直上の親要素に移動して同じことを行い、またひとつ上の親要素へと、 `<html>` に到達するまで繰り返される。

これと全く逆で、親要素から内側へ内側へとイベントが実行されていく「**キャプチャリング**」というメカニズムも存在するが、現代のブラウザではデフォルトで「**バブリング**」の流れでイベントを実行するらしい。

※詳しくはMDN参照。
[イベントへの入門 - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Building_blocks/Events#:~:text=%E3%81%94%E8%A6%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E3%83%90%E3%83%96%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%83%AA%E3%83%B3%E3%82%B0,-%E3%81%93%E3%81%93%E3%81%A7%E6%9C%80%E5%BE%8C)

## **stopPropagation()で問題を解決する**

バブリングが起きるうと困る場合の解決方法として、JavaScriptの `stopPropagation()` という関数がある。

これの関数がイベントハンドラで実行されると、そのイベントハンドラは実行されるが、それより上位の親要素にはイベントが伝播しないようにできる。

使い方は以下の通り子要素のイベントハンドラの中で`stopPropagation()` を実行するのみ。

こうすると、ボタンをクリックしたときに `ボタンをクリック` のみがコンソールに出力される。

```php
<div onClick={() => console.log('divをクリック')}>
  <button 
　　　　　　　　　　onClick={e => {
        e.stopPropagation();
        console.log('ボタンをクリック');
     }}
  >
    ボタン
  </button>
</div>
```

## バブリングを活用する

気づかぬうちに意図しない挙動を引き起こしてしまって、バブリングなんてなければ良いのに、、、と思ったが、便利な利用方法もあるらしい。

**イベント移譲**という効果を利用すれば、例えば

「たくさんある子要素のどれかしらがクリックされた際に何らかのコードを実行したい」

という場面で、個々の子要素一つひとつにイベントリスナーを設定しなくても、親要素のイベントリスナーひとつを設定するだけで、子要素からバブリングしてくるイベントを受け取ることができる。

## さいごに

このようにイベントが子要素から親要素へ伝播しているということにも今まで気付いていなかったが、知っていないと意図せぬ挙動を引き起こすかもしれないので気を付けたいと思った。

またイベント移譲ができることで便利な場面もあると思うので、ぜひ頭に置いておこうと思う。

## 参考記事

https://ja.javascript.info/bubbling-and-capturing#ref-87

https://www.yoheim.net/blog.php?q=20180416
【初心者応援】画像を選ぶ際の判断基準

# 初めに
今回はアプリ内で使用する画像をどういった形式で保持しておくかについて書いていこうと思います。
自分が新人だった頃に、`svg`って何？どうしてここはsvgじゃないの？等疑問に思ったことがあったので、もし同じ感覚になっている方がいれば助けになれれば幸いです。

### SVGとは
まず`svg`とはなんぞや？という部分からですね。
`Scalable Vector Graphics`（スケーラブル・ベクター・グラフィックス）の略で「大きさを変えられるベクター画像」という意味です
実はグラフと一緒で指定された座標を指定された色で塗りつぶしてるのがsvgなんですね。
他の`PNG/JPEG`はピクセルの集まりなので拡大した際に`svg`の方が綺麗だったりします。
また、名前の通り大きさを変えても綺麗に描画することができます。

### 判断基準
ここからは、普段自分がどうやって画像の形式を分けているかをご紹介します。
自分は基本的に`svg`を使います。
ただし、`svg`は先ほど紹介したように座標や色の情報を持っているため、複雑で大きい画像を描画するとなるとデータがどうしても重くなってしまいます。
パスデータが重いときは、下記の画像を参考にしてみてください。
![無題の図形描画.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/cc1201c2-5098-b691-7e76-dae141e466b1.jpeg)

そして、`svg`はその場で描画を行うので何度も表示する画像にはあまり向いてません。
そのため、ホーム画面等で使用するようなアプリ自体のアイコンや、ロゴなどは`JPEG`や`PNG`でいいかと思います。




## 最後に
今回は、アプリ内の画像をどうやって保持しておくかを説明しました。
今回で新人プログラマ応援に関する記事をピックアップして書いたりするのは最後ですが、今後も初心者〜中級者等関わらず自分が発見した有用なものや、備忘録等を書いていくのでフォローをしていただけると何かの際に手助けすることができるかもしれません。
【解決方法】子コンテナーを開始できません

# サーバ開始時のエラー
Eclipse上でJRE関連のエラーを解決し、サーバが起動できる状態にしたうえでTomcatの開始を実施した際、以下のエラーが出ました。
```
情報: サーブレットエンジンの起動：[Apache Tomcat/9.0.56] [木 4月 28 11:33:50 JST 2022]
重大: 子コンテナーを開始できません。 [木 4月 28 11:33:50 JST 2022]
重大: 子コンテナーを開始できません。 [木 4月 28 11:33:50 JST 2022]
重大: 必要なサーバーコンポーネントを開始できなかったため、Tomcat を開始できませんでした。 [木 4月 28 11:33:50 JST 2022]
情報: ProtocolHandler ["http-nio-8080"] を一時停止します。 [木 4月 28 11:33:50 JST 2022]
情報: サービス [Catalina] を停止します [木 4月 28 11:33:50 JST 2022]
情報: ProtocolHandler ["http-nio-8080"] を破棄します。 [木 4月 28 11:33:50 JST 2022]
```
エラーメッセージでググると様々な解決策が出てきましたが、どれも当てはまらず…

結局該当のサーバ上で右クリック⇒クリーンで解決しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628704/012d9ce0-5b80-048b-c65a-d71c9ab6a4af.png)
# 結論
設定を変更したら、サーバを開始する前にクリーンを実施しましょう。
そうすることで、設定変更時に残ってしまった無効なリソースを削除してくれるようです。

# 参考
・[サーバー上で公開されているプロジェクトをクリーンにする](https://www.ibm.com/docs/ja/rsm/7.5.0?topic=servers-cleaning-projects-published-server)(IBM)
STM32L010と74HC595で遊ぶ



目的
シフトレジスターで遊ぶ
将来的には、LCDで利用



shiftOutの様な物を移植しました。


```c++



//TC74HC595_i_010_1

#include "mbed.h"

#define LSBFIRST 0
#define MSBFIRST 1

DigitalOut S_CLK(PA_5);
DigitalOut S_DATA(PA_7);
DigitalOut en(PA_4);

//dataPin, clockPinの引数は、無意味
void shiftOut(int dataPin, int clockPin, int bitOrder, int val)
{
    int i;

    for (i = 0; i < 8; i++)  {
        if (bitOrder == LSBFIRST) {
            S_DATA = val & 1;
            val >>= 1;
        } else {
            S_DATA = (val & 128) != 0;
            val <<= 1;
        }//endif
        S_CLK = 1;
        S_CLK = 0;
    }//for
}//shiftOu


int main()
{
    while(1) {
        shiftOut(PA_5, PA_7, MSBFIRST, 0x00);
        en=1;en=0;wait_ms(500);

        shiftOut(PA_5, PA_7, MSBFIRST, 0x55);
        en=1;en=0;wait_ms(500);

        shiftOut(PA_5, PA_7, MSBFIRST, 0xAA);
        en=1;en=0;wait_ms(500);

        shiftOut(PA_5, PA_7, MSBFIRST, 0xFF);
        en=1;en=0;wait_ms(500);
    }//while
}//main




```





いつもの

```c++



//TC74HC595_i_010_1

#include "mbed.h"

DigitalOut swdclk(PA_5);
DigitalOut swdio(PA_7);
DigitalOut en(PA_4);


void seg1(int v,int rs)
{
    for(int jj=0;jj<8;jj++){
        if( (v<<jj) & 0x80 ){      
                swdio=1; //ビットが1 
        } else {
                swdio=0; //ビットが0
        }//endif
        swdclk=1;
        swdclk=0; //clk
    }//for
//    swdio=rs;
    en=1;wait_ms(1);
    en=0;
}//seg1


int main() {


    while(1){

            seg1( 0x00 , 0  );wait_ms(500);
            seg1( 0x55 , 0  );wait_ms(500);
            seg1( 0xAA , 0  );wait_ms(500);
            seg1( 0xFF , 0  );wait_ms(500);

    }

}//main





```
【初心者にやさしい】CS(コンピューターサイエンス)基礎の基礎の学習：演算子

# CS(コンピューターサイエンス)基礎の基礎
現在、CS基礎の基礎を一から学んでいるので、その学習成果のアウトプットに、、、

## 今回は「演算子」

### 1. 演算子とは
　プログラミングにおいて、あるデータに対して特定の処理を行い、その結果を返す記号のことを「演算子」と呼ぶ。
演算子は「オペレータ」とも呼ばれ、その演算子によって特定の処理が行われるデータのことを「オペランド」と言う。

#### 1-1. 演算子の種類
　演算子には以下のような種類がある。(Rubyの場合)
![演算子まとめ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/1fc6cf73-a852-b904-f1c6-3b250ff9b429.png)


:::note warn
　それぞれの演算子の役割は言語ごとに異なる場合があります。上の図はあくまでRubyではこのように扱われているというものなので、ご自身が使用している言語での使われ方を確かめるようにしてください。
:::

##### 1-1-1. 【Pick Up!】　代数演算子
　代数演算子とは、四則演算のような一般的な計算に利用する演算子を指す。
![代数演算子まとめ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/fcb1a2ec-9a06-50f0-6756-51c54cb5a4a3.png)

##### 1-1-2. 【Pick Up!】　比較演算子
　比較演算子とは、データ同士の関係性を比較し、その結果を「True」か「False」で返すものを指す。
![比較演算子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/b2634513-e25f-982b-2ca3-a973d1befefa.png)

#### 1-2. 計算結果のデータ型
　演算子を用いた計算では、計算結果がどのようなデータ型で返されるのかも注意する必要がある。例えば、「1 + 2.5」という式の結果は言語によって異なるが、より精度の高いデータ型を選び、「1」をfloat型の「1.0」に変化させ、結果を「3.5」とfloat型で返す場合が多い。
　このように言語によって計算結果がどのようなデータ型になるのかにも気を使う必要がある。

### 2. 演算子のオーバーロード(overload)
　演算子は「整数型」や「浮動小数点型」のデータの計算や比較のみを行うだけでなく、「文字列型」のデータを連結させるという役割も果たす。このようなデータ型を跨いで演算子を利用する方法を、「演算子のオーバーロード(overload)」と呼ぶ。
　例えば、「puts "1" + "2"」のようにコードを打った場合と、「puts 1 + 2」とコードを打った場合とでは、「1」と「2」のデータの扱いが違うため、「+」の扱いも違ってくるということになる。

### 3.演算子の「優先順位」と「結合法則」
　例えば、「3 + 1 * 2」という計算を行おうとした場合、「+」よりも先に「*」の方の計算を行うことになる。このように違う種類の演算子が含まれている式の場合には、「優先順位」が定められている。
　　　　　　![演算子の優先順位.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/76518e82-d418-9166-9350-45b2df4e700c.png)

　また、「3 + 1 - 2」のように、同じ優先順位の演算子が含まれている場合は、「結合法則」というものが適用され、「左から右」へと順番に計算が実行されるようになる。

　この「優先順位」と「結合法則」は言語によっても異なってくるので、頭に入れておいて損はないそうですよ。

### 4.学び
　算数とプログラミングでは、例えば「算数では『=』は『イコール』であっても、プログラミングでは『=』は『右の値を左に代入』である」など、同じ演算子でも扱い方がかなり異なるということを改めて学びました。
　また、計算の結果がどのようなデータ型で返されるのかという点にも注意を払って行かなければならないということも学び、より一層コーディングを丁寧に行っていこうという気持ちになりました。
Ubuntu 22.04 LTS で QNAP の NFS をマウントできない件

Ubuntu 22.04 で QNAP の NFSマウントに失敗する．
具体的には，マウントのコマンドは実行できるけど，lsなどをしても返事が返ってこない．

/etc/fstab の記述で，NFSのバージョンを4.0に指定すると解決する．
```
nas001.foo.net:myshare          /mymountpoint     nfs     vers=4.0        0       0
```
versをnfsversに変えても大丈夫．
下のスレッドを参照しました．
根本的な問題は，QNAPのNFSサーバが古いことらしいけど．QuTS Hero でも同じ問題が発生する．

https://ubuntuforums.org/showthread.php?t=2474184&p=14092102
【Tips】Auth0 Twilioを使った通話認証を日本語ユーザ向けにちょっとリッチにする

## 想定読者
本記事の想定読者は、Auth0の通話認証を利用されていて、
カスタム設定まで実施されていない方、
もしくは今からAuth0　の通話認証を設定される方向けの記事になります。

## 背景
Auth0は、Twilioを用いた通話認証をボタンぽちぽちレベルで設定することができます。
※通話認証　音声通話で認証コードを読み上げる方式
しかし実際に利用してみると、日本語ユーザには音声が聞き取りづらく、
そのまま運用に乗せるのは難しいと感じました。
少し工夫することで運用に乗せることが出来たので、日本語の音声を聞き取りやすくした方法を共有したいと思います。

## 概要
工夫した点は下記の2つです。
①Liquid を利用した数字の読み上げ内容の上書き
②Twilio API を利用した合成音声の精度アップ

## 数字の読み上げ内容の上書き
標準の状態では、数字を読み上げる際に、「4」を「シ」、7を「シチ」と読み上げられたり、
独特の間があったりして、少し聞き取りづらい状態です。
数字の読み上げ方を上書きすることで、簡単に聞き取りやすい設定に変更することが出来ます。

```liquid:Enrollment Template
{% if message_type == "voice" %}
  {% assign voice_code = code | replace:'1','イチ、' | replace:'2','ニィ、' | replace:'3','サン、' | replace:'4','ヨン、' | replace:'5','ゴォ、' | replace:'6','ロク、' | replace:'7','ナナ、' | replace:'8','ハチ、' | replace:'9','キュウ、' | replace:'0','ゼロ、' %}
  6桁の認証コードを、2回読み上げます。
  {{voice_code}}、です。
  {{voice_code}}、です。
{% else %}
  下記の二要素認証用のワンタイム・コードをログイン画面で入力してください。
二要素認証コード：{{code}}
{% endif %}
```

## 合成音声の精度アップ
Custom 設定からTwilio API の設定を追加することで、
より音声の精度アップをすることが出来ます。
設定方法については、[こちら](https://auth0.com/docs/customize/hooks/extensibility-points/send-phone-message/configure-twilio-as-mfa-sms-provider)の記載の通りです。

音声を設定するところを、下記の通り「Polly.Mizuki」にすることで
標準の音声から精度があがりました。

```javascript:send-phone-message-hook
const sayInCall = `<?xml version="1.0" encoding="UTF-8"?>
    <Response>
        <Say voice="Polly.Mizuki" language="ja-JP">${text}</Say>
    </Response>`;
```

## 最後に
今回はAuth0 通話認証利用者向けとかなりニッチな記事になりましたが、
実際利用するにあたって痒いところに手が届くような情報になっていれば嬉しいです。
修了者に聞いた『オススメの特定行為３選！』

ちらほらと耳にするようになってきた「看護師の特定行為研修」。だけど、情報が少なすぎて何をしたら良いのか分からないということを聞きます。
実際、私も研修を受ける際に情報が少なくて困った経験があります。
この記事では、『使う頻度の多い特定行為』　『取っておけば良かった特定行為』を紹介しています。
また、10年後　20年後を考えた特定行為のオススメも併せて紹介しています。
https://yuttan.com/%e7%89%b9%e5%ae%9a%e8%a1%8c%e7%82%ba%e3%81%ae%e5%a7%8b%e3%82%81%e6%96%b9/%e4%bf%ae%e4%ba%86%e8%80%85%e3%81%ab%e8%81%9e%e3%81%84%e3%81%9f%e3%80%8e%e3%82%aa%e3%82%b9%e3%82%b9%e3%83%a1%e3%81%ae%e7%89%b9%e5%ae%9a%e8%a1%8c%e7%82%ba%ef%bc%93%e9%81%b8%ef%bc%81%e3%80%8f%e9%81%b8/
![【No.01】ABC限定アイキャッチテンプレートのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646221/e41f06de-3d33-622a-35c0-9480d543c38d.png)
Alexaで舌下免疫療法用の薬タイマーを設定する

# はじめに
子どもたちのハウスダストアレルギーと花粉症の治療のため舌下免疫療法を行なっていますが
時間を測るのが非常に面倒くさい。

1. 薬（ハウスダスト用）を舌の下に置いて一分待機
1. 飲み込んで5分間は飲食禁止（お茶飲んじゃダメ）
1. 次の薬（花粉症用）まで5分間を空ける
1. 次の薬（花粉症用）を舌の下に置いて一分待機
1. 飲み込んで5分間は飲食禁止（お茶飲んじゃダメ）

なので１リクエストで順番にアナウンスしてくれれるタイマーを設定したい。

# 設定
Alexaアプリで定型アクションを登録する

#### 定型アクション

```:実行条件
{子供の名前}の薬
```

```:アクション
1. メッセージ
　{子供の名前}さんのくすりタイマーを開始します。1つ目のくすりを飲んでください。
2. 1分待機
3. メッセージ
　{子供の名前}さん1分たちました。
4. 9分待機
5. メッセージ
　{子供の名前}さん2つ目のくすりを準備してください。
6. 1分待機
7. メッセージ
　{子供の名前}さん2つ目のくすりを飲んでください。
8. 1分待機
9. メッセージ
　{子供の名前}さん1分たちました。
10. 5分待機
11. メッセージ
　{子供の名前}さんのくすりタイマーが終了しました。
12. 歓声を再生する
```

## 発生した問題点

1. メッセージに「薬」って書いたらアナウンスが「やく」になった
　⇒ ひらがなで登録することで回避
1. 実行条件通りに喋っても反応してくれない
　⇒ ここで大分ハマりました。
　　[Alexaの音声履歴を確認する](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GHXNJNLTRWCTBBGW)
　　履歴を確認してどういうテキストになっているのかを確認しましょう。
　　（お前、言われた事全部記録してたのね。。。）
　　そら => 宇宙 と変換されていました。（Alexaさんはガノタ φ(･ω･｀)）
　　実行条件は変換後の漢字で登録しておく必要があります。
1. 変換後の漢字で登録したのにいまいち反応が悪い（できる時とできない時がある）
　⇒ Alexaの音声履歴を確認すると「{子供の名前}の薬」と認識しているときと{子供の名前} の 薬」とスペースが入っている時がありました。
　　 実行条件を増やしてスペースありバージョンを追加することでかなり改善しました。
Windowsでの開発で愛用しているツール紹介


# 前置き
私は開発も私用もPCはWindowsを使っています。
共有用にWindowsで作業・開発するならこのツールは必須だな、よく使うなというものをまとめました。

## 凡例
```
### ツール名
概要
ダウンロードURL
コメント
```

## 汎用的なツール
### WinMerge
diffツール
https://winmerge.org/?lang=ja
xdocdiffというプラグインを入れるとWordやPDFなどテキスト以外も比較できるようになります :ok_woman: 

### サクラエディタ
テキストエディタ
https://sakura-editor.github.io/
置換やgrep検索などができたり、タブで複数ファイル開いたりできます。
自分が使いやすいように設定のカスタマイズ推奨。

- 共通設定
  - ツールバー
    - 選択行の昇順ソート
    - 連続した重複行の削除(uniq)
    - TAB→空白
    - 常に手前に表示
    - ビューモード
  - タブバー
    - タブバーを表示する

### 7-Zip
圧縮解凍ソフト
https://sevenzip.osdn.jp/

### Snipping Tool
画面キャプチャ
Windowsならデフォルトで入ってるので、開発者以外にもおすすめできます。
Shift + Win + Sのショートカットでもキャプチャは取れますが、Snipping Toolからだと遅延でキャプチャもできます

## 開発で使うツール
### A5:SQL Mk-2
DBクライアント
https://a5m2.mmatsubara.com/
SQL整形はもちろん、テーブル定義のエクセル出力やデータのダウンロードなどもできます :ok_woman: 
本番環境など注意が必要なデータベースは目立たせる設定があったり、更新時は自動でトランザクションを張ったり、読み取り専用で接続したりと、安全にDB作業ができるのもありがたいです

- オプション
  - データベース接続
    - ✅データベースの更新時に自動的にトランザクションを開始する
    - ✅データベースに Keep Alive を送信: 20秒ごと(必要に応じて)
  - 結果セットグリッド
    - 結果セット最大行数: (データ量が多いと分かってるDBなら設定しておくとベター)
  - SQL
    - ✅WHERE句のないUPDATえ/DELETEを実行しようとしたとき確認する (おそらくデフォルトでON)
    - 実行位置: キャレット位置
    - SQLの区切り: セミコロン";"
- データベースログイン
  - ✅読み取り専用でログイン (基本的にONにしておき、更新時のみOFFにする)

### PuTTY
SSHクライアント
日本語版 https://www.ranvis.com/putty
本家をベースに有志で日本語版が作られてきた経緯があり詳しくは https://ja.wikipedia.org/wiki/PuTTY を参照ください
セッションログを保存できるのも :thumbsup: 

SSHクライアントは「Tera Term」も使っていたことがありますが、今は接続先を複数保存したりするのが便利なPuTTYを使っています。

- セッション
  - ログ
    - セッションのログ: 印字可能な出力
    - ログファイル名: `&H-&Y&M&D&T.log`
- ウィンドウ
  - 変換
    - Remote character set: UTF-8 (デフォルト一番上のEUC-JPになってる)
- 接続
  - データ
    - 自動ログインのユーザー名: (必要に応じて)
  - SSH
    - 認証
      - 認証パラメータ: (必要に応じて)

### WinSCP
FTP、FTPS、SFTPクライアント
https://winscp.net/eng/docs/lang:jp
最近は直接サーバファイルを見たいことが少ないので利用頻度は低め

- 環境設定
  - 転送
    - デフォルト: 転送モードをバイナリにしておく(改行コードなど自動変換なしになる)
- 高度なサイトの設定(接続先別の設定)
  - ダイアログ左下の色プルダウンで本番と開発は色分けるなどする

### GitBash
Git for Windowsに含まれるBASHエミュレータ
https://gitforwindows.org/
一部のLinuxコマンドが使えるターミナルで、Windowsだけど他の開発者やサーバはMac・Linuxな場合に便利です

### Postman API client
APIクライアント
https://www.postman.com/product/api-client/
REST APIをGUI設定で叩くことができます
curlコマンドなどに変換することもでき便利

## その他開発で使っているもの
- IntelliJ IDEA
- Chocolatey
- SDKMAN!
- Microsoft Excel
  - データ整形したりするにはやっぱり便利

## 後記
ほとんどがフリーソフト、シェアウェアになっています。
今回改めてお世話になってるなと自覚したので、少しだけ寄付したりしました :hugging_face:
少しずつではありますが感想だったり寄付だったりで、今後も継続してもらえるといいなと思います。

ツールによってはいつもやる設定があるので、追記していきます。
(2022/5/6 一部よくやってる設定を追記しました)
Bronze DBA 模試 復習アウトプット3

# ADDM
データベース診断ツール:airplane:
直前で学習したのに、頭に入っていなかったらしい。
大前提：データベースがオープンしているか？
一番動いているものに集中する:frowning2:

# ネーミングメソッド
これだけは覚えた方がいいこと
| 種類| 概要 |
|:--|:--|
| ローカル・ネーミング  |  tnsname.oraファイルを使った標準的な接続設定 |
|  簡易接続ネーミング |  コマンド上でその場で、接続設定を記述し接続するため、ファイル保管なし | 

# 表の作成ルール
表名：30バイト以下
　　　先頭文字は、数字以外で
　　　　NG例：1_TEMPというテーブル名
　　　　OK例：TEMPというテーブル名　　
# 　フラッシュバック機能とUNDO
UNDO以外：フラッシュバックドロップ(D)、　　フラッシュバックデータベース　(DB)
UNDO：上記以外なので、上記をしっかり暗記できれば問題なし。

# Data Pump
データベースと別データベースを高速に移送する方法

#### なぜData Pumpだと高速なの？
データの解析や変更を行わずに、ターゲット・データベースにコピーするため。
逆に言うと、他の方法はデータの解析や変更を内部的に行なっているということになります。

参考リンク

https://docs.oracle.com/cd/F19136_01/sutil/oracle-data-pump-overview.html#GUID-06B2DF71-2A66-498F-B659-1EF5859B1648
JavaやGraalVMの記事一覧表

![Linkedin header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634867/09493607-5be1-b9dd-a07d-6e1a58daf45a.png)



記事が多くなってきたので、下記にまとめますね。

＜第５回＞　大規模データ分析基盤の個別相談受付中です！　
https://qiita.com/Yojiro_Nishikawa/items/8b15a1bb976e0cf2470b

＜第４回＞Jakarta EE(Java EE)とSEとは、そもそも何か？ 違いは？
https://qiita.com/Yojiro_Nishikawa/items/a023880ea8b5b336e728

＜第３回＞GraalVM EEとCEの違い。
https://qiita.com/Yojiro_Nishikawa/items/c39de4b8f31867a916fc

＜第２回＞GraalVM入門編（プレゼン資料32枚）資料を共有します。
https://qiita.com/Yojiro_Nishikawa/items/d10334aa8112aad6af8d

＜第１回＞GraalVMを御紹介します。(関連記事へのリンクまとめ）
https://qiita.com/Yojiro_Nishikawa/items/b131a67963d6a78c17e8


西川　(yojiro.nishikawa@oracle.com )
【クラウドBOT】kintoneのラジオボタン・チェックボックスに入力できない件について

クラウド型のRPAツールであるクラウドBOTを使用していて困った事がありましたので、そちらの解決策をメモしておきたいと思います。

# クラウドBOTとは
クラウド型のRPAツールであり、GoogleChromeなどで行ってる操作をロボットに覚えさせて自動実行する事ができます。すべてクラウド上で動きますのでとても便利です。しかも基本無料で使えます。
https://www.c-bot.pro/ja (クラウドBOT公式ページ)

詳しくはこちらの記事を参考にしてみて下さい。
『WEBブラウザを自動操作する方法(ノーコード)』
https://qiita.com/cal_mgc/items/75dfab118ca031dcfd71

# 今回困った事
## 「入力する」の操作が表示されない
**【ラジオボタン・チェックボックスへの入力操作が記録できないケースがある】**
kintoneへのデータ入力の作業を自動化しようと、クラウドBOTを使用して操作の手順を記録していました。
ところが、ラジオボタンに対する入力操作を記録しようとしたところ、入力ができません。
![kintone画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/eddd0dd9-f641-0ae4-05ab-fe4bc1d2c7cc.png)
上の画像のどこが問題かと言うと、クラウドBOTでは通常ラジオボタンやチェックボックスに対して「入力する」という操作を選ぶことできます(下の画像をご参照ください)。その後、どこをチェックするか選択して操作の記録を行うのですが、この「入力する」が出てこないのです。
![いつもの動き.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/4efb4dae-3083-21a3-ad9d-31d669a5104e.png)

## 原因
kintoneのラジオボタンやチェックボックスはCSSでデザインされた物を表示しており、本来のinputタグが画面上に表示されていませんでした。これにより、入力の対象となるinputタグを選択できない事が原因でした。

## 解決方法
クラウドBOTでは「script」というjavascriptを実行できるタグが用意されています。
これを使用して、CSSで非表示化されている本来のラジオボタンを表示して操作を記録しました。
![scriptタグを使用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/05a2411a-e2e2-0dd8-c7d3-6be25f17fbdf.png)

cssでデザインされたラジオボタンの横に本来のラジオボタンが表示されています。
これで無事に「入力する」を選び、値を入力する事ができました。
![ラジオボタンを入力する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/623bb8e5-ddbe-ee14-98b7-78ea2d9789c8.png)

**今回使用したjavascript**
ページ内のすべてのラジオボタンに対してスタイルを調整し見えるようにしました。
```
var radios = document.querySelectorAll("input[type='radio']");
for (let i = 0; i < radios.length; i++) {
	radios[i].style.opacity = 1;
	radios[i].style.position = "initial";
}
```

# まとめ
最近の凝った作りの入力フォームはノーコードの自動操作ツールに優しくないのかもしれません。とはいえローコードで対応できるケースもありますので、困った時はサポートに問い合わせて見て下さい。
@nuxtjs/axiosでレスポンスヘッダが取得できない

## はじめに
通常のaxiosライブラリならこの問題は起きません。
@nuxtjs/axiosで発生することを確認しています。
※バグ等ではなくそういった仕様です。

## 何が起きたか？
業務で@nuxtjs/axiosを使用して、APIから返ってきたレスポンスヘッダを
参照しようとしたらレスポンスヘッダ自体が存在しなかった話！！

console.logやNetworkのレスポンス情報を見たとき↓
data部分しかない？！
```
[
    {
        "id": 1,
        "dummy_name": "hoge",
        "zip": "0000000",
        "prefecture": "hoge県",
        "municipality": "hoge区hoge"
        "created_at": "2022-04-26",
        "updated_at": null
    }
]
```

↓えぇ。こんなやつが返ってくるんじゃんかったけ？！※一部省略
```
data: [{…}]
headers: {cache-control:…}, 
status: 200
statusText: "OK"
```

サーバー側がレスポンスをちゃんと返してないんじゃないかと思い、
サーバー側をデバックするも正常にレスポンスを返している模様。。。

色々ググっていると以下の記事を発見！
https://qiita.com/mr-hisa-child/items/bfce5efe82fb11db700b

まさかの@nuxtjs/axiosがいい感じに、レスポンスを整形している模様。
完全に盲点でした。よくコードを見ると、確かに＄プレフィックスがついている。

```
axios.$post(`${resource}/hoge`, params)
```
postの前についてる$プレフィックスをとると無事レスポンスヘッダを
参照することができました。
ちなみにheaderを参照する際は以下の書き方で参照できます。
```
const hoge = res.headers['アクセスしたいプロパティ名']
```

## 結論
レスポンスヘッダを参照することはあまりないと思いますが、tokenを埋め込む時は
使用するので@nuxtjs/axiosの扱いには注意してください！

## 参考
https://qiita.com/mr-hisa-child/items/bfce5efe82fb11db700b

https://axios.nuxtjs.org/
MUI DataGrid を JSDom でテストする


- この記事を書いた時の @mui/x-data-grid のバージョン: 5.5.1

## 問題

[MUI の DataGrid](https://mui.com/x/react-data-grid/) を Jest でテストする場合に、jsdom 上で全てがレンダリングされない問題が発生することがあります。一部の行がレンダリングされなかったり、カラムについても一部だけがレンダリングされたりすることがあります。

そのため react testing library の `findByText` などで表示されるはずのエレメントを探してもテストが落ちるとか、`toMatchSnapshot` で記録されるスナップショットファイルの中に表示されるべき列が記録されないといった問題が発生します。

- 表示されているはずの列が Jest 上の testing-library から見つからない
- スナップショットを撮ってみると、その中に一部の行や列が含まれていないので正しくリグレッションテストができない
- Storybook での表示とスナップショットが一致しない

## 解決方法

この問題を解決する方法は簡単で、DataGrid の `disableVirtualization` プロパティを `true` に設定すると、一部が欠けること無くレンダリングされるようになります。

しかし、プロダクションの動作ではこのプロパティを `true` にはしない方がいいと思いますので、ラップしているコンポーネントがある場合には、そのコンポーネントにも `disableVirtualization` プロパティを持たせて、Dそこから DataGrid に引き継ぐようにして、テストの時だけそれを `true` に設定するようにしたら良いでしょう。

## 参考

- [公式ドキュメント: Data Grid - Virtualization (Disable virtualization)](https://mui.com/x/react-data-grid/virtualization/#disable-virtualization)
- [GitHub issue](https://github.com/mui/mui-x/issues/1151)

> disableVirtualizationプロパティを使用して仮想化を完全に無効にすることができます。jsdom やヘッドレスブラウザでグリッドをテストできるようにするには、オフにすることをお勧めします。
> 
> **注**：仮想化を無効にすると、DOMのサイズが大きくなり、パフォーマンスが大幅に低下します。テスト目的または小さなデータセットでのみ使用してください。

## 感想

MUI では、DataGrid に限らず jsdom で挙動が変わる物が結構あるように思います。あるはずのエレメントが見つからないとか、イベントがうまく処理されないとか。
そういうのも含めて付き合っていかないといけないのかなと思っています。
AZ-305用備忘録

近々受験するのでとりとめなくまとめてみました。


# 可用性とか
SQLデータベースの選択
単一のデータベース	　 　…　ＤＴＵベースの価格サポート	
エラスティックプール　　…　複数のＤＢを管理
マネージドインスタンス　…　複数のＤＢを管理でき、自由だが、管理の手間とコストかかる。

Always On 可用性グループ
https://docs.microsoft.com/ja-jp/sql/database-engine/availability-groups/windows/overview-of-always-on-availability-groups-sql-server?view=sql-server-ver15


DTU ベースの購入モデル
https://docs.microsoft.com/ja-jp/azure/azure-sql/database/service-tiers-dtu

ロードバランサー

標準ロードバランサー　…　Az間のトラフィックをサポート
基本ロードバランサー　…　4層･7層のサービス
Azure Traffic Manager　…　リージョン間の負荷分散

監視サービス
Application Insight	…　applicationのメトリック等監視
Container Insight　	…　Kubernetesベースのワークロード監視

Azure Service Bus
キュー	 …	単一配信
トピック　…	複数配信

VMスペックの種類
B　…　経済的でベーシックな感じ、CPU低い
E　…　メモリ多く使うワークロード向け
F　…　計算負荷が高いワークロード向け。バッチ、計算、ゲーム
D　…　DB、分析とかの運用向けワークロード

# データストレージソリューションの設計

データアーカイブソリューション
プレミアム　…　小さなファイルで最適に機能、低レイテンシ、高トランザクション。RA-GRSサポート無し。
ホット
クール
アーカイブ

オンプレミスデータゲートウェイ　…　AzureからオンプレのＤＢとかに安全に接続できるようにする。

ストレージレプリケーション
・LRS　…　単一サーバの障害からデータを保護
・ZRS　…　単一のデータセンターの障害から保護
・GRS　…　リージョンの障害から保護

RTO（目標復旧時間）
長い　…　ARMテンプレート・サイトリカバリー
短い　…　サイトリカバリー
RPO（目標復旧時点）
リージョンを切り替えて復旧
・手動フェイルオーバー


Azure Enterprise Application　…　オンプレアプリにエンドポイントを提供
Azure AD Application Proxy　 …　オンプレアプリにAzure ADアカウントでログインできる
クラウドで実行されるアプリケーション プロキシ サービス
オンプレミス サーバー上で実行されるアプリケーション プロキシ コネクタ

パススルー認証　…　オンプレのＡＤにパスワードを格納、エージェントが必要

# ガバナンス系
Log Analytics Workspace　…　地理的な場所で作成していくのがベスト
質問サイトで質問をする時の考慮事項

[新人プログラマ応援 - みんなで新人を育てよう！](https://qiita.com/official-events/3f21c92121aa125807b4)


# 初めに

私は卸売業の会社で社内のSalesforceの担当者として仕事をしています。また時間があるときは私自身の勉強も兼ねて質問に対する回答を行っています。Salesforceでは昨年のTrailblazer Community（質問できる場所と思ってください）のシステムのアップデートによって日本のグループで投稿しても英語版のグループに表示されるようになっています。まぁ質問数は英語のグループの方が圧倒的に多いので、私は英語が分からないですがGoogle翻訳を使って主に英語のグループで回答をしています。

今回はSalesforceに関する質問についてですが、おそらく他の製品、言語であっても同じようなことは言えるかと思います。

こんな感じで回答しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a55fd75b-a70c-ed1b-add8-c3f0000f8692.png)


# まずは質問するときにお願いしたいこと

正直、回答するのは疲れます。特に初心者の方の質問に回答するのは疲れます。当然ですが専門的な言葉も分からないと思うので、なかなかお互いの話が通じないです。日本語でもそうですから、英語の時は時にもう大変です。英語も分からない私には２重で分からない状態です。まずは正確に現在の状況を聞き出すのが大きな仕事になります。ということで質問者さんには次のことをお願いしたいです。

+ 出ているエラーメッセージの内容（できればコピー＆ペーストして正確に教えて欲しい。日本語でない英語の場合も勝手に自分で意訳して変えないで欲しいですね）を投稿する。
+ またSalesforceのトレイルヘッド関係の質問の場合はどのトレイルヘッドを実施しているかやURLも一緒に投稿して欲しい。これはSalesforceに限らないのですが、質問する人はおそらく長い間困っているので、本人はよく分かっていると思いますが、回答する側は初めて聞く内容なので正直状況や何をやっているかを理解できません。お互いに意思疎通できるようにお願いしたいところです。
+ スクリーンショットの添付もできるのであれば、お願いしたいです。言葉で説明するより理解しやすいこともあります。ただし、エラーメッセージは文字をコピペして投稿して欲しいですね。英語のエラーメッセージだと画像を見ながら入力する作業は案外苦行です。そう私は英語を含め外国語は得意でありません。
+ 特にコードを添付する場合はコードブロック（コードをそのままの形で表示できる機能をSalesforceではこのように呼んでいます）などを利用してコードの改行やタブ(ブランク）の位置が変わって見えづらくならないようにして欲しいです。

**コードブロックを使った例**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/beeb89ec-1640-e2e5-5b6b-918fec2a3b6a.png)

**コードの投稿時にはできればスクリーンショットは止めて欲しい**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9464b74c-f34d-9137-6131-6233b96d1ab3.png)

エラーの箇所が分かったりする場合は仕方ないですが、画像だとコードを実際に確かめるには打込まないといけません。ちょっと時間が掛かるので回答する側としては躊躇して読まずに飛ばしますね。

**コードブロックを使っていない例です。**
短いコードならこちらで整形しなおして読みますが、こんなに長いと質問自体をパスしてしまいますね。残念がら私の場合は無償で回答しているので、ほぼ避けてしまう質問になります。中身も読みません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/03425b16-ae37-0912-e9c0-cd67d17e5b73.png)


# 意味が分からない質問

私は英語を理解できないのでGoogle翻訳しますが、理解できない質問はこんな感じ。
何度訳しても意味は分からなかったです。

+ [技術的な中身よりも英語が分からないために、何をしたいかが分からない質問](https://qiita.com/Keiji_otsubo/items/b1ff62c4cebabbac7ae6)
+ [意味がわからん質問集](https://qiita.com/Keiji_otsubo/items/e661ac3ab3484aec1d2e)


# 回答を得てからの対応

回答をした後にいい結果につながることを私は望んでいますがそんなに毎回ずばりの正解を答えられているわけではありませんが、自分は正しく設定したのに機能しない返答するのは止めて欲しい。そもそも、正しく設定したならエラーにはなりません。（あああ、嘘でした。トレイルヘッドのチェックロジックはプログラムなので、Salesforceのバージョンアップ後に時々バグがでます）

まずは真摯に回答をよく読んで確かめて欲しいですね。イライラするのは分かりますが、初心者からステップアップできるかは、こういう部分に掛かっていると思います。素直に指示に従えないとまず能力は伸びないと思います。

また、気に入った回答が得られなかった場合ですが、同じ質問を連投するのはあんまり関心しません。何が気に入らなかったのかをはっきりさせてまた以前の質問の回答者さんには感謝の気持ちを伝えたうえで新しい質問を投稿することをお勧めします。やはり回答された内容が気に入らなくてもその内容をちゃんと理解して欲しいところです。

以下は、私も回答したのですが回答が気に入らず同じ内容の質問を何度も投稿しています。不思議なもので他の回答者さんも分かっているのか、新しい質問には回答していません。くれぐれもこのような痛い質問者さんになるのは避けてください。誰も相手にしてくなりますのでね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0ac45f47-ab76-89f4-2a59-f59a06ad1f5e.png)

# 最後に

時間がある時は他の人の質問やそこに書かれている回答を読んでみることもお勧めします。結構勉強になると思います。教科書とは違って系統づけられていませんが、最新の情報に触れることにもなるのでなかなか楽しいものです。またレベルが上がってくれば、回答側にまわることもお勧めしたいです。なんとなく分かっただけでは回答は難しいです。人に説明するためには完全に理解しておかないと難しいです。

それからいい質問・回答はこのQiitaを活用して自分用のまとめサイトを作ってみるのもいいと思います。ある程度記事が貯めれば、それを整理することで能力アップをはかることも可能だとも思います。
centOSの計算機にyumでhtopをインストールした方法

centOSの計算機にyumでhtopをインストールした。
topよりも視認性が良くて使いやすいと思っている。

以下のことについて記そうと思う。
- userをrootに追加
- yumでhtopをインストール

# 下準備(userをrootに追加)

まずはyumがあるかの確認。

~~~
$ yum --version
4.4.2
~~~

ところで自分のアカウントがどうやらsudoersに入っていないらしい。
sudoができないということ。
まずはrootに移る。

~~~
$ su - root
パスワード:
~~~

ここでのパスワードはrootのパスワードである（もちろんだがこれを知っている前提である）。
そして以下の通り入力。

~~~
# visudo
~~~

表示されたファイルの中から以下の部分を見つける。

~~~
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
~~~

私はviユーザではないが、iで書き込みモード、escでコマンドモードになるらしい。
この直後のところに以下を追加。

~~~
<user名>    ALL=(ALL)       ALL
~~~

コマンドモードに戻して:wqで上書き保存。
rootを抜ける。

~~~
# exit
~~~

参考にしたサイトは[こちら](https://www.suzu6.net/posts/144-centos-su-user/)。

# htopのインストール

まずは以下を入力。

~~~
$ sudo yum install epel-release
~~~

次に以下を入力。

~~~
$ sudo yum install htop -y
~~~

これで無事htopがインストールされた。
立ち上げ方は次の通り。

~~~
$ htop
~~~

終わらせるときはqを入力すれば良い。
参考にしたサイトは[こちら](https://linuc.spa-miz.com/2020/10/13/installing-htop-centos/)。
cscの作法 その156

# 概要
cscの作法、調べてみた。
sevenzipsharp.dll使ってみた。
解凍してみた。

# 参考にしたページ

https://qiita.com/koshian2/items/f648892f37cddaab7093

# サンプルコード

```
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;
using SevenZip;

namespace seven
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "7z";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "test";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			SevenZipBase.SetLibraryPath("7z.dll");
			if (!Directory.Exists("decompress")) 
				Directory.CreateDirectory("decompress");
			SevenZipExtractor extractor = new SevenZipExtractor("archive.7z");
			extractor.ExtractArchive("decompress");
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}




```

以上。
cscの作法 その155

# 概要
cscの作法、調べてみた。
sevenzipsharp.dll使ってみた。
圧縮してみた。

# 参考にしたページ

https://qiita.com/koshian2/items/f648892f37cddaab7093

# コンパイル手順

- sevenzipsharp.dll(0.64)をダウンロード。
- 7z.dllをダウンロード。
- コンパイル

```
>csc 7z0.cs /platform:x86 /reference:sevenzipsharp.dll

```

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using SevenZip;

namespace seven
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "7z";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "test";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			SevenZipBase.SetLibraryPath("7z.dll");
			SevenZipCompressor compressor = new SevenZipCompressor();
			compressor.CompressDirectory(Environment.CurrentDirectory + "\\archive", "archive.7z");
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
Firestoreでcollectionのfield名をcamelCaseとsnake_caseで交互に置換したい

# 問題

- Javascriptは通常camelCaseで書く
- Rubyは通常snake_caseで書く

そうするとFirestoreのcollectionのfieldはcamelCaseだけど、rubyにデータがある時はsnake_caseにしたい。

# 解決

Railsとしてここに置く

```rb:config/initializers/firestore.rb
module FirestoreOliveBranch
  module Outgoing
    def create(data)
      d = data.deep_transform_keys { |key| key.to_s.camelcase(:lower) }
      super d
    end

    def set(data, merge: nil)
      d = data.deep_transform_keys { |key| key.to_s.camelcase(:lower) }
      super d, merge: merge
    end
  end

  module Incoming
    def data
      super.deep_transform_keys { |key| key.to_s.underscore.to_sym }
    end
  end
end

module Google
  module Cloud
    module Firestore
      class DocumentReference
        prepend FirestoreOliveBranch::Outgoing
      end
    end
  end
end

module Google
  module Cloud
    module Firestore
      class DocumentSnapshot
        prepend FirestoreOliveBranch::Incoming
      end
    end
  end
end
```

こうする事でfirestoreに書き込む際

```
{ created_at: ... }
```

が

```
{ createdAt: ... }
```

こうなり、これの`doc.get.data`で

```
{ created_at: ... }
```

こうなる。