OmniAICreator/Qiita-1.07M huggingface dataset:
htmlspecialchars で文字数を求める

PHP ではマルチバイトの文字数を求めるのに `mb_strlen` が使われますが、本体にもマルチバイトを扱う機能があります。次のコードで htmlspecialchars で文字数を求めてみます。

### コード

```php
$str = 'あいうえお';
var_dump(5 === str_len($str, 'UTF-8'));

function str_len(string $str, string $encoding = 'UTF-8'): int
{
    $str = str_scrub($str, $encoding);
    $size = strlen($str);

    $length = 0;
    $char = '';

    for ($i = 0; $i < $size; ++$i) {

        $char .= $str[$i];

        if (str_valid_encoding($char, $encoding)) {

            ++$length;
            $char = '';

        }

    }

    return $length;
}


function str_valid_encoding(string $str, string $encoding = 'UTF-8'): bool
{
    return $str === htmlspecialchars_decode(htmlspecialchars($str, ENT_QUOTES, $encoding));
}

function str_scrub(string $str, string $encoding = 'UTF-8'): string
{
    return htmlspecialchars_decode(htmlspecialchars($str, ENT_SUBSTITUTE, $encoding));
}
```

### コードの解説

最初にユーザー定義関数の `str_scrub` を使って不正なバイト列を置き換えます。`ENT_SUBSTITUTE` フラグを指定しています。PHP 8.1 であれば `ENT_SUBSTITUTE` はデフォルトフラグなので、指定する必要はありません。同等の機能をもつ `mb_scrub` は PHP 7.2.0 とそれ以降のバージョンで利用できます。

for ループのなかでは配列アクセス構文を使い、前から1バイトずつ取り出して連結し、正しい文字エンコーディングであるかどうかを `str_valid_encoding` でチェックしています。文字はそのままではわかりづらいので、バイト列の16進数表記を `bin2hex` で求めてみます。

```php
// e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a"
var_dump(bin2hex('あいうえお'));
```

「あいうえお」は次のように表記することもできます。

```php
// あいうえお
var_dump("\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a");
```


1文字目の「あ」の処理について調べてみましょう。「あ」を構成するバイトは16進数で「e3 81 82」です。
1、2回目のループで `$char` に投入された「0xe3」および「0xe3 0x81」は「あ」の一部しかない不正なバイト列なので、`str_valid_encoding` の判定は false になります。3回目のループで `$char`は「e3 81 82」のバイト列になり、正しい文字エンコーディングなので、`$length` の値は `1` 増えます。計算が終わったら `$char` を空にして次の文字に備えます。

冗長ですが、次のように「あ」はチェックされました。

```php
// false
// false
// true

var_dump(
    str_valid_encoding("\xe3"),
    str_valid_encoding("\xe3\x81"),
    str_valid_encoding("\xe3\x81\x82")
);

function str_valid_encoding(string $str, string $encoding = 'UTF-8'): bool
{
    return $str === htmlspecialchars_decode(htmlspecialchars($str, ENT_QUOTES, $encoding));
}
```

最後にパフォーマンスに関して、1文字ずつバイトを取り出す必要があるので、`mb_strlen` よりもだいぶ遅くなりますので、実用では使い物にはなりません。文字コードの学習教材にとどめておくべきでしょう。次の簡易ベンチマークコードでは40倍以上の速度の差がありました。


```php
echo 'str_len', PHP_EOL,
benchmark(function() {
    str_len("あいうえお");
}, 300000), PHP_EOL;


echo 'mb_strlen', PHP_EOL,
benchmark(function() {
    mb_strlen("あいうえお");
}, 300000), PHP_EOL;

function benchmark(callable $callable, int $runs)
{
    $start = microtime(true);
    while(--$runs) {
        $callable();
    }
    $stop = microtime(true);

    return $stop - $start;
}
```



**結果**

```
str_len
0.67694401741028
mb_strlen
0.013685941696167
```
C++入門講座【第１回　覚えておきたいプログラムの知識とプログラミング】

# はじめに
　プログラミング言語は、私たちが普段使っている言語と同じように、数多く存在しています。
プログラミング言語は、全世界に数千種類（特定の企業内で使用されているコード等も含めて）あるといわれています。その為、「プログラミング」の種類等をいう際に「プログラミング言語」という場合があります。私は比較的プログラミング言語ということが多いです。
　私は、学生の頃、一番初めにC++を学び、その他の言語に対応することが容易にできました。
恥ずかしながら、C++を学ぶ前はC言語は文字を表示させることくらいしか知りませんでした。
ですが、C++を学ぶとC言語に対して苦労せず入門することができました。
私の体験ですが、C++で得た知識はほかの言語に対応、応用が可能なため、初めて学ぶ方にもお勧めいたします。
多少「なんでそうなるの？」ということがあるかと思いますが、自分で調べて自分の知識にすることもシステムエンジニアにとって重要なスキルでもあるので、ほかの記事も参考にして勉強してみてください。

# C++とは…
特に有名なプログラミング言語は、C言語、C#、HTML、Java、Python、PHP、そしてC++です。
 １９８３年にベル研究所でC言語を拡張した言語として開発されました。C++の大きな特徴として、クラスの機能が追加されたことです。また、多重定義、多重継承、テンプレートなどといった機能も大きな特徴となってます。
初心者向けの動画をアップしていますぜひ参考にしてください。

[【YouTube】初心者　VisualC++　第１回　超基本覚えておきたいプログラミング](https://youtu.be/Q5eG87YcG0I)

```c++:Hello.cpp
#include<iostream>
using namespace std;

int main(){
cout <<"こんには" <<endl;
return 0;

}
```
↑Youtube動画で紹介したC++のコードです。
ぜひ参考にしてみてください。
【cakephp】 [->eq]こういう時のやつ

調べていて、パッと出てこなかったのでまとめます。

こういう時のやつ↓
```php
$query = $articles->find()
    ->where(function (QueryExpression $exp) {
        return $exp
            ->eq('author_id', 2)
            ->eq('published', true)
            ->notEq('spam', true)
            ->gt('view_count', 10);
    });
```
ソース引用：https://book.cakephp.org/3/ja/orm/query-builder.html

## 一覧

演算子 | 意味 | 英語 | 一般的な記号
--|--|--|--
eq | 等しい | equal | =, ==
notEq | 等しくない | not equal | <>, !=
gt | より大きい | greater than | >
ge | 以上 | greater than or equal | >=
lt | より小さい | less than | <
le | 以下 | less than or equal | <=|

まとまってる比較演算子のサイトのテーブルを引用しました。
引用：https://step-learn.com/article/powershell/011-operator-compare.html
Laravelでfaviconが画面からなかなか消えてくれなかった話

favicon消すだけなのに思いのほか苦労してしまった話。

## 背景
参画しているPJTにて、「現在アプリに設定しているfaviconを消してほしい」と頼まれた。
「どうせ1行削除するだけだろ～」とか思っていたらハマってしまったので書き残す。

## 環境
Laravel: v9.19.0
動確ブラウザはchrome,Edgeを利用

## やったこと

①app.blade.phpのfavicon指定箇所をコメントアウト
```php:app.blade.php
    {{-- favicon --}}
    {{-- <link rel="shortcut icon" href="{{ asset('/favicon.ico') }}"> --}}
```
 →リロードしたものの、「あれ、消えない,,,」

②ブラウザのキャッシュを疑い、以下を実施
* 別ブラウザで画面表示
* ブラウザ設定から「キャッシュされた画像とファイル」を削除
* 「ハード再読み込み」実施
* 「キャッシュ削除とハード再読み込み」実施
* 以下に配置されている、ブラウザのキャッシュファイルたちを削除
>C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default\Favicons, Favicons-journal
C:\Users\ユーザー名\AppData\Local\Microsoft\Edge\User Data\Default\Favicons, Favicons-journal

→「いや、全然変わらんが...？」

## 結論
Laravelは明示的にfaviconファイルを指定しなかった場合、デフォルトでpublic直下のfavicon.icoを読み込みに行く様子。
（[こちらのサイト](https://blog.kuromusubi.com/develop/platform/laravel/20201009-laravel-favicon)をお見掛けして気づきました）

→自分の環境にも上記名称でfaviconファイルを配置していたため、ファイルを削除した。
そのあとにchromeの各キャッシュファイルを削除・画面表示で無事にfaviconは消えてくれた
（Edgeはファイル消さなくても消えたので、キャッシュのタイミングの問題もあるかも）

## おわりに
上記の仕様をちゃんと文書で確認したく、[公式ドキュメント](https://laravel.com/docs/9.x/readme)や[日本語Readouble](https://readouble.com/laravel/9.x/ja/installation.html)などを見てみたのですが、
少なくとも"favicon"で検索してヒットする記載はありませんでした。
だれか情報お持ちでしたら教えてください...
BERTopic TypeError: init() got an unexpected keyword argument 'cache_dir'

# ColabでBERTopicを使おうとすると

https://pypi.org/project/bertopic/

https://colab.research.google.com/drive/1FieRA9fLdkQEGDIMYl0I3MCjSUKVF8C-?usp=sharing

```
!pip install bertopic
```

下記エラーが出現

```
TypeError: init() got an unexpected keyword argument 'cache_dir'
```

# 参考サイト
https://discuss.huggingface.co/t/typeerror-in-importing-bertopic-from-bertopic/24143/2

# 解決方法

```
pip install --upgrade joblib==1.1.0
```
実行した後にランタイムを再起動するとエラーが消える
Rails I18n(国際化)のymlファイル内からの取り出しについて

## Rails I18n について理解したことをまとめます。
### 今回行いたかったこと
- I18nを利用して、Railsのviewファイル内の翻訳

## I18n導入について
- まず、I18nを導入する際に、config/application.rb内に以下のコードを追加します。

```
config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.{rb,yml}')]
config.i18n.default_locale = :ja
```

## ymlファイルの作成
- 次にconfig/locales内に、ja.ymlファイルを作成します。
- 自分の場合は、view用にja.ymlを分割したかったので、config/locales/view/モデル名/ja.ymlとしました。
- 作成が完了しましたら、ja.yml内に翻訳したい言葉と翻訳後の言葉を記載していきます。

```
ja:
  defaults:
    Tasks Index: 'タスク一覧'
    New Task: 'タスクを登録する'
  tasks:
    index:
      Tasks Index Page: 'タスク一覧ページ'
      title: 'タイトル'
      content: '内容'
      created_at: '作成日時'
      Show: '詳細'
      Edit: '編集'
      Destroy: '削除'
      Are you sure?: '本当に削除してもよろしいですか?'

```

- 今回はTaskモデルのviewのindexファイル内の言葉を翻訳したいので上記のように記述しました。
- また、default内にはapplication.html.erbに記載したヘッダーを翻訳するための言葉を記載してあります。

## ymlファイルに記載した言葉をviewファイルで呼び出す
- それではいよいよ本題に入ります。
- viewのindexファイル内にて翻訳した言葉を呼び出す際には、I18nについて解説している記事では多くの場合、<%= t('.title') %>のように記載してやる必要があると書かれています。
- しかしながら、この参照方法についてよく理解しないまま活用しようとしてしまうと<font color="Red">"translation missing: ja.title"</font>とエラーが発生してしまします。

## "translation missing:"が出た際に確認すること
- 上記の続きで、<%= t('.title') %>をドットより左側を省略しない書き方で書いてみようと思います。
`<%= t('tasks.index.title') %>`
- 省略しない場合、 「tasks.index」が加わりました。では、この「tasks.index」はなんなのでしょうか?
- ここで、先ほどのymlファイルをみてください。
ymlファイル内にja:を１つインデントした段にtasksとあります。
さらに、tasksを１つインデントした段にindexがあります。
そして、indexを１つインデントした段にtitleが現れます。
つまり、<b>ja:から目的の言葉にたどり着くまでの流れをインデントをドットに置き換えて表現しているということです。
- 実際にrails consoleにて確認してみました。
![スクリーンショット 2022-10-14 14.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/c04f14cc-ab25-7040-1c49-c52254b4e8cf.png)
- コンソールではtに全てのパスを与えてやらないと値を取得できません。
そのため、「.title」では何を取得してきたらいいのか見つけられないのでエラーとなってしまいます。

## なぜ<%= t('.title') %>で値を取得でき、翻訳可能なのか?
- ここまで、理解できた方の中には、「じゃあめんどくさいから全部記述してしまえばいいじゃないか」と思われる方もいるかも知れません。
実際には、それで動くのでそれでも構いません。
- しかし、コードリーディングする際に意味がわからなくなるかも知れないのでこの部分についても解説します。
- ここで、viewファイルの中のファイルパスに注目してみます。
![スクリーンショット 2022-10-14 14.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881858/fba7e672-fe35-95d7-18fe-d3d29f00c700.png)

tasksフォルダの中に、indexファイルがあります。
ここで、何か気づかないでしょうか?

そうです。
ymlファイルから目的の言葉を取り出す際に記述した流れと同じなのです。

### ymlファイルでは、インデントを付けることで、ファイルパスを表しています。
そして、<%= t('.title') %>はtasksフォルダ内のindexファイルに記述されています。
- このことより、ファイルパスを記載する必要がなくなるので、<%= t('tasks.index.title') %>の「tasks.index」の部分は省略可能となるのです。

## おまけ
- ja.ymlファイルに記載したdefaults部分を利用して、view/layout/applicationファイル内に記載したヘッダー部分を翻訳してみたいと思います。
- 実際に記載したコードは以下の通りです。
```
<%= link_to t('defaults.Tasks Index'), tasks_path, id: 'tasks-index' %>
<%= link_to t('defaults.New Task'), new_task_path, id: 'new-task' %>
```
- 先ほどの<%= t('.title') %>のようにドットで省略表記できない理由がわかりますか？
わかればI18nについてマスターしたと言っても過言ではないですね!🎉
- 理由は、記載しているファイル名がapplicationであり、defaultsではないためです。そのため、省略してしまうとdefaultsインデント下のTasks Indexと.New Taskの翻訳文を参照することができません。

## まとめ
- 今回はI18nを利用する際にポイントとなるymlファイルからの取り出しについて理解したことをまとめました。
- localesフォルダ内にてファイルをこまめに分割することで、見やすく整理しやすくなると思いますので、取り出し方についてマスターして国際化の波に備えましょう!!
一个打法的探讨

# 限制性原理
南:♠765 北:♠AJT98
从南打出♠5,北飞♠J,西跟出♠2,东跟出♠K
已知东西是23分布，东在持有♠kxx的情况下也第一轮也必定跟出♠k的情况下
接下去应该飞还是砸♠Q?

# 概率计算
令
事件B = 西持有♠2并且东持有♠K
又令
事件A1 = 西持有♠432 - 东持有♠KQ
事件A2 = 西持有♠Q2 - 东持有♠K43
事件A3 = 西持有♠Q32 - 东持有♠K4
事件A4 = 西持有♠Q42 - 东持有♠K3


则我们要计算的其实是以下两个条件概率
P(事件A1+事件A2|事件B) = P(A1|B)+ P(A2|B)
P(事件A2+事件A3+事件A4|事件B) = P(A2|B)+ P(A3|B)+ P(A4|B)

首先，我们先计算A1,A2,A3,A4和B的概率(已知23分布). 
P(A1) = 1/20 = 5%
P(A2) = 1/20 = 5%
P(A3) = 1/20 = 5%
P(A4) = 1/20 = 5%
P(B) = 6/20 = 30%


并且我们假定如果东家持♠KQ的情况下第一轮打出♠K的概率为50%。
并且我们假定如果东家持♠K43的情况下第一轮打出♠K的概率为100%。

即
P(B|A1) = P(东第一轮打出♠K从♠KQ中，西从432打出2) = 0.5 x 0.33= 0.165
P(B|A2) = P(东第一轮打出♠K从♠K43中) = 1
P(B|A3) = P(东第一轮打出♠K从♠K4中,西从Q32打出2) = 1 x 0.5
P(B|A4) = P(东第一轮打出♠K从♠K3中,西从Q42打出2) = 1 x 0.5


那么:
则根据贝叶斯公式：
P(A1|B)+P(A2|B) = P(B|A1) *P(A1) / P(B)+P(B|A2) *P(A2) / P(B) =0.165 x 5% / 30% + 1 x 5% / 30% = 19.4%
P(A2|B)+P(A3|B) +P(A4|B) = P(B|A4) *P(A4) / P(B)+P(B|A2) *P(A2) / P(B)+P(B|A3) *P(A3) / P(B)
=33.3%

所以应飞Q

如果第二轮从南出♠6,西跟出♠3,则应该继续飞还是砸♠Q
令
事件B = 西持有♠32并且东持有♠K
又令
事件A1 = 西持有♠432 - 东持有♠KQ
事件A2 = 西持有♠Q32 - 东持有♠K4

P(B)= 3/20 = 15%

P(A1|B) = P(B|A1) *P(A1) / P(B) = 0.165 x 5% / 15% = 5.5%
P(A2|B) = P(B|A2) *P(A2) / P(B) = 0.5x 5%/ 15%= 16.6%

也应该飞Q
Power BIのSharePointからのファイル読み込みが遅い原因

# 本記事の目的

Power BIレポートのデータ更新で、（読み込むファイルサイズに対して）異様に時間がかかる事象が発生した。レポートのデータソースはSharePoint Onlineのライブラリ上に置いてあるEXCELファイル。

調査したところ意外なところに原因があったので、解決策とともにメモに残しておく。

### 本記事の結論

結論だけ先に書くと、

SharePointにあるファイルにPower BIでアクセスする際、
- 「SharePointフォルダー」コネクタは**サイト上の全てのファイルを取得**する動きをする
- 一方「EXCELブック」コネクタは**特定のファイルを直撃で取得**する動きをする
- したがって、SharePointサイト内に大量のファイルがある場合は「EXCELブック」コネクタを使うと読み込みの遅延が軽減できる可能性がある

簡単に図示すると以下のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/70cb6594-824c-5454-8ac6-5f3fc52f9e03.png)

# 比較検証

今回やりたいことは、SharePointのライブラリに格納した特定のEXCELファイルを読み込んでPower BIレポートを作成すること。ただし当該SharePointには十数万件のデータが格納されているという前提である。

このとき、「SharePointフォルダー」コネクタと「EXCELブック」コネクタでどのような違いが出るかを比較した。

### 1. 「SharePointフォルダー」コネクタ
「SharePointフォルダー」コネクタを使って目的のファイルを読み込んでみる。SharePointフォルダーコネクタにはサイトのルートURLを渡す仕様になっているため、結果として当該サイトに含まれる十数万件全てのデータのメタデータ（ファイル名や拡張子など）が取得されて表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/1430666a-b318-39ae-4a58-4c28ad4ee7f3.png)

今回はテスト目的でライブラリ内に大量のファイルを作成した。ファイル数は合計で約12.5万個。なお今回作成したcsvは、ほぼ中身が空のダミーファイル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/4ce910b6-1afd-868f-1fe3-2e0f5e398dfb.png)


読み込み対象のファイルは、カラム1列、レコード2行のEXCELデータ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/1649e9d2-5655-737b-f387-58df84bed354.png)

一応、データは併せてレポート上にもビジュアルとして表示させておき、これをレポートとしてPower BI Serviceに発行。発行したレポートをPower BI Service側でデータを更新してみる。更新にかかった時間は105秒（2分弱）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/3554a1f1-d359-eed9-aba7-9f5d94564a3a.png)


### 2. 「EXCELブック」コネクタ
次に「EXCELブック」コネクタを使って目的のファイルを読み込んでみる。この場合はまず、当該のEXCELファイルのURLを取得する必要がある。URLはSharePointからファイルを「アプリで開く」で開き、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/6b43a762-c1ff-ead9-2020-54b6c4f741c5.png)

開いたEXCELのメニューから「情報」を選び、「パスのコピー」で取得できる。なおURLの末尾に「?web=1」という文字列が付くが、これは削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/d2103c56-0c77-c5c2-4929-e284c54ebdee.png)

あとは「EXCELブック」コネクタでURLを指定すればファイルを直接読み込める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/e2fc3256-8206-3a84-2ce0-93a9cb963d4b.png)

こちらも同様にPower BI Serviceに発行してデータ更新すると、今度は3秒で更新が完了した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596092/435ffbf7-5ae9-361d-d6e0-a0b46cdd1874.png)


# 結論
「SharePointフォルダー」コネクタは、サイト内の全てのファイルを取得するステップが入るため、サイト内のファイルが多くなることによってパフォーマンスへの悪影響がある。回避策としては「EXCELブック」コネクタを利用することによって、目的のファイルに直接アクセスすることができ、パフォーマンスを改善できた。実際、**約12.5万ファイルを持つサイトにおいては、約2分⇒3秒と大幅に更新時間を短縮**することができた。

今回は1ファイルのみを読み込んだが、実際はSharePointにある複数ファイルを用いてレポートを作成することも多いはず。その場合には上記の影響も読み込みファイル数に比例して大きくなるため、かなりクリティカルな問題になりうる。

今回のように極端にファイル件数が多い場合は気づきやすいが、そこまで顕著でなくともサイト内のファイル数がパフォーマンスに影響を与えうるということは頭の片隅に置いておきたい。
Hexabase Flutter SDKの使い方（データストアの検索）

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業向けのBaaS（Backend as a Service）を提供しています。認証やデータストア、ファイルストレージ、リアルタイム通知などの機能があり、企業向けのシステム開発に必要な機能をまるっと提供しています。

APIはREST APIとGraphQLを提供しています。そのAPIをラップしたSDKも開発を進めています。SDKは現在、TypeScriptとDart向けに開発しています。Dart向けのSDKは、もちろんFlutterでも利用できます。

この記事ではFlutter SDKについて、インストールとアプリケーションの作成・更新・削除の方法について解説します。

## パッケージとソースコード

パッケージはpub.devで公開しています。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseです。

[hexabase/hexabase-dart: Hexabase SDK for Dart & Flutter](https://github.com/hexabase/hexabase-dart)

## インストール

インストールは `dart pub get` で行えます。

```
dart pub get hexabase
```

## インポート

SDKをインポートします。

```dart
import 'package:hexabase/hexabase.dart';
```

## 初期化

まずインスタンスを作成します。

```dart
var client = Hexabase();
```

別なファイルで再度インポートした場合には、以下でインスタンスを取得してください。

```dart
var client = Hexabase.instance;
```

## データストアの取得

まず登録しているデータストアを取得します。そのため、最初にデータストアを管理するプロジェクトを作成します。

```dart
var project = client.project(id: "PROJECT_ID");
var datastore = project.datastore(id: "DATASTORE_ID");
```

## データストアからデータを取得

データストアからデータを取得する際には `items` メソッドを使います。

```dart
var items = await datastore.items();
```

## データストアからデータを取得（全体の件数付き）

データストアから、検索結果数を含めて取得する際には `itemsWithCount` メソッドを使います。

```dart
var response = await datastore.itemsWithCount(query: query);
// response.count 結果件数
// response.items 取得されたデータ
```

## 検索条件を付与する

検索条件を利用する場合にはクエリーを取得してください。

```dart
var query = datastore.query();
```

例えば最初の10件を取得する場合には、次のように指定します。

```dart
query.page(1).per(10);
```

他にも様々な条件が指定できます。

### オペランドを付与する

検索条件としては以下を用意しています。

| 条件 | メソッド | 例 |
|---------|---------|---------|
| = | equalTo | query.equalTo('name', 'value') |
| != | notEqualTo | query.notEqualTo('name', 'value') |
| > | greaterThan | query.greaterThan("price", 100) |
| >= | greaterThanOrEqualTo | query.greaterThanOrEqualTo("price", 100) |
| < | lessThan | query.lessThan("price", 100) |
| <= | lessThanOrEqualTo | query.lessThanOrEqualTo("price", 100) |
| == "A" and == "B" and == "C" | inArray | query.inArray("name", ["A", "B", "C"]) |
| != "A" and != "B" and != "C" | notInArray | query.notInArray("name", ["A", "B", "C"]) |

これらは組み合わせて利用できます。

```dart
query
	.greaterThan("price", 100)
	.lessThan("price", 200)
	.equalTo("name", "value");
```

そして `items` や `itemsWithCount` にてquery引数として指定します。

```dart
var items = await datastore.items(query: query);
```

## まとめ

Hexabase Flutter SDKを使えば、複雑な条件を使ったデータ取得も容易に実現できます。ぜひお試しください。

Dart SDKはFlutterでも利用できます。Flutterで使えると言うことは、iOS/Androidといったスマートフォンアプリやタブレットアプリはもちろん、Webやデスクトップアプリ開発でも利用できます。ぜひHexabaseをDart SDKとともに活用してください。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)
SPOリスト列の選択肢列作成も注意が必要だった件

小ネタです。

選択肢列の値を横持ちにしてみようと試していた時に気づいたのです。

![スクリーンショット 2022-10-14 105127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/4bbdb121-71c3-62fc-9964-fe8898acee88.png)

選択肢の ```"Id":-1```ってどういうことだよ、と。

記憶をよみがえらせると記載をミスしたので選択肢1を×ボタンで消して選択肢4を足して先頭に位置調整したな、と。

（残念ながら-1でどんな不都合が起きたかまでは試していません。期待はずれでごめんなさい）

![スクリーンショット 2022-10-14 105527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/0fea1c3c-bca8-2013-c9d9-3f4b7c4deed9.png)
ということでのちのち悪さを回避するため開発段階で修正です。
汚い選択肢列は削除して一からミスなく入力を終えて保存すると```"Id":0```で出来上がっていました。

選択肢1、選択肢2、選択肢3、、、ってありますよね。あそこで選択肢作りをミスした、と×を押すとSPOリストの見た目上は問題ないけれどおそらくPower Automateなどで何かしようとすると後々面倒になると思うよ、という老婆心です。

SPOリスト列名の定義はまず英数字で名称を付けて保存して内部名を確定させないと、ダブルバイト文字で作られた列はPower Automateで苦労するアレと同じということです。

https://tech.la-fra.com/2018/09/02/post-326/
git configできない

git cloneができない、以下のエラーが出た：

 Failed to connect to github.com port 443: 接続がタイムアウトしました

コマンドでプロキシ修正すればできた

git config --global http.proxy http://xxx.xxx.xxx.xxx:aaaa

xxx.xxx.xxx.xxx→　アドレス
aaa　→　ポート名
Nreal Light 環境構築メモ

# Nreal Light 環境構築メモ

Airの発売とSDKのアップグレードによりますます注目されているNrealのARグラスですが、
自己位置推定ができるのはLightのモデルのみなっていて、ARのコンテンツ開発を考えると
今のところLightがメインになりそうだなと思っていますが、

ディスプレイの輝度や着用感、かけた時の見た目はAirも良いので、
Airが普及していくのも頷けます。
今のところ、iOSへの対応がまだなので、
コンテンツクリエイターが入っていくにはまだ早い感じはありますが、
可能性をすごく感じているので、備忘録的なメモになります。

今回は、開発環境の構築をメモ。

## Unityをインストール。
nrealEngineへのSDKの提供はなしということっぽいので、
必然的にWin10 + Unity + android端末での開発になりました。

Unityバージョンは、2022年9月1日現在安定版のUnity 2021.3.8f1
Androidビルドにチェックマークを付けて、インストール。

SDK（Unityパッケージを入手）は公式サイトよりダウンロード。
https://developer.nreal.ai/download


## Unityプロジェクトを作成。
無難にcore 3Dでプロジェクトを生成。

ビルドセッティングをandroidに切り替える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/251d10f6-32b4-de7a-fcd9-335c51eda191.png)

Unityパッケージをインポート。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/554fbb71-7dcb-4ced-6a20-c183136ca4ae.png)


メニューからNRSDK>project tipsをクリックするとウィンドウが出てくるので、
Fixボタンをポチポチすると、プロジェクトセッティングを変更できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/db3b13bf-2ad5-5ec7-0bde-8424bb9a7230.png)


インポートしたアセットの中からでもシーンを読み込む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/3ebd8395-72e7-55a9-a21a-d11f4113997f.png)


android端末を開発者モードにしてPCに接続し、
実機ビルドでビルド確認。


ターゲットの最低OSバージョンを
Android8 OREO (API Level 26）以上にしないとビルドが通らなかったので、
Player Setting>Player>Other Settingから変更し、再ビルドでうまくいった。

実機で確認。

USBケーブルを抜いて、Nrealを接続。
※実機確認したい場合は、毎回差し替えないといけないので若干めんどいです。今後その辺のスマートなやり方も調査したいです。
※安直にType-Cの２マタケーブルを差し込んでみましたがうまくいかない。笑

おしまい。
Goについての記事

# Go

Go言語はC言語やJavaなどと同じく、静的型付け言語でありながら、PythonやJavaScriptなどの動的型付け言語のような特徴がある

## 特徴
メモリ管理および並列処理のコントロールは言語仕様およびランタイム・モジュールに組み込まれている
makeコマンドでビルド・インストールする

プログラムをソースコードから実行可能なバイナリファイルにするには、コンパイル、リンクといった操作を行う必要がある。この一連の作業を「ビルド」という。

Linuxで使われるコマンドラインのビルドツール make は、Makefileという指示ファイルの内容を元に、ビルド、インストール作業を自動化。また、依存関係チェックや、再コンパイルの必要性も自動で判断し実行。

makeコマンドは
・GNUmakefile
・makefile
・Makefile
の順で指示ファイルの検索を行う。慣習として指示ファイル名は「Makefile」が多く用いられる。

●configure スクリプトを提供するソフトウェアでは
・ソースコードの配布物を展開
・configure スクリプトを実行し、環境の確認、Makefileの自動生成
・make コマンドによる、ソフトウェアのビルド
・make install コマンドによる、ソフトウェアのインストール
を実行するだけで、ソースコードからのインストールを完了させることができる。


1. ./configure
コンパイルは現在の実行環境を解析し、環境に合わせて実行する為に、configureスクリプトを実行。実行環境に合わせたMakefileを作成。

※カレントディレクトリにconfigureスクリプトが存在する場合は「./configure」、もしくはカレントディレクトリまでの絶対パスを明示的に指定して実行する必要がある。configureスクリプトはパスが通った（環境変数PATHで指定されたディレクトリに存在する）コマンドでは無い為。

2. make
makeコマンドで、先に作成したMakefileの記述に従ってソースファイルをコンパイルし、実行ファイルやライブラリを作成。

※一度コンパイルを行った後にソースファイルを変更し、再度コンパイルを行う場合には、makeの前にmake cleanを実行して前回のmake時に作成された一時ファイルを削除する必要がある。

3. make install
make installコマンドで、ファイルを適切なディレクトリに配置（インストール）。

※インストール先のディレクトリにアクセス権が無い場合には、make installの前にsuコマンドでrootユーザなどの適切な権限を持つユーザになるか、sudoコマンドを用いてroot権限でmake installを実行。（sudo make install）

別の方法として、./configure実施時に、--prefixを使ってインストール先を実行ユーザーの権限のあるディレクトリに変更して実行することでも対応できる。


▲インストール後にプログラムの起動が失敗する場合、原因として、環境変数LD_LIBRARY_PATHが正しく設定されていない、という可能性がある。
LD_LIBRARY_PATHが正しく設定されていないと、プログラムの実行に必要な共有ライブラリを読み込むことができない。

●install
このターゲットは、実行ファイルや設定ファイル、ライブラリを指定されたディレクトリにコピーし、実行するためのパーミッションの設定などを行う。
この時、install コマンドがよく用いられ、指定されたファイルのコピーと実行するためのパーミッション設定を同時に行ってくれるコマンド。
インフラ対応で初めてのUEFIモード時UEFIパスワード、HDDパスワード設定対応

## はじめに
こちらQiitaに投稿するのは2回目となります。
チーム移動があり、今回はその時に対応したインフラっぽい対応を紹介します。

## 環境

OS：Windows
機種：Lenovo

## 結論

情報漏洩のリスクを抑える事が可能（データを盗まれる可能性が減る）

## 概要

### そもそもBIOSとは

Basic Input Output Systemの略で、WindowsというOSが起動する前にパソコンを制御する為のシステムで基本どのメーカーのパソコンにも入っている
できる事と言えば主に以下

・ハードウェア状況確認（CPUの電圧や温度、ファンの回転速度等の確認）
・オーバークロック設定（PCをスペック以上に処理能力を上げる）

### UEFIとは
コンピュータ内にある各装置を制御するプラットフォームファームとOS間の取り決めの事
その取り決めに従って誕生したのがUEFI BIOS(以下UEFIと省略)と呼ばれるもの

## 今回対応した事

UEFIの設定でHDDパスワードとUEFIパスワードをかける事ができる為、以下に自分がやりやすかった手順を記載
※ちなみに手順のやり方はLenovoPCで行っている為、他メーカーだとやり方が異なる可能性があります。

### 1.UEFIパスワードとは
※端末によってはSupervisor Password、Sytem Passwordといった呼称の場合あり
WindowsOSを起動してからログインするためのパスワードではなく、UEFIパスワードは[OSを許可するパスワード]のこと。
OS起動前の段階でロックされている為、UEFIパスワードを入力できなければWindowsOSを起動できない。

### 2.HDDパスワードとは
※SSD Password、NVMe Passwordといった呼称の場合あり
HDDパスワードはパソコンを勝手に起動して使われたり、ハードディスクだけ盗まれて中身を見られるのを防ぐ目的で設定するパスワード。
設定すると情報の安全度は増しますが、修理相談窓口に問い合わせしてもパスワードを解除できない為、注意。
SSDの交換修理（有償）が必要となり、その場合SSD内のデータはすべて失われます。


## 手順

### UEFIモードでUEFI画面を起動する方法

1. 「Shift」キーを押しながら、再起動を行う
2.  UEFIモードとなるので表示された画面から「トラブルシューティング」をクリックします 
![BIOS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311365/5c0308b4-9757-c16a-4929-699db4547c4b.png)

3. 「詳細オプション」をクリックします
![BIOS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311365/18cdc5f3-5609-544d-49d3-5b9dc30251eb.png)


4.  UEFI ファームウェアの設定をクリックします。
![BIOS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311365/7f3fd760-e40e-1252-6a80-e211b452c1cc.png)

5. 「再起動」をクリックしてUEFI(BIOS)ブートモードへ移行します。
![BIOS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311365/f4c416c9-37de-5316-cc02-73ef39bed881.png)

6. UEFI画面に入れたら「Security」を選択し、HDD or UEFIパスワードを設定する
　※パスワード項目名と画面レイアウトはメーカー、機種によって変わる。

　HDDパスワードの場合「Hard Disk1 Password」「NVMe Password」等
　UEFIパスワードの場合「Supervisor Password」「Administrator Password」等

7. 任意のパスワードを入力し設定

8. F10キーを押下（Save and Exitを選択）し、『Yes』が選択されていることを確認してEnterを押下

上記で対応後
設定値が保存され、UEFIセットアップユーティリティが終了し、本機が起動します。
次に起動した際はまずUEFIパスワードの入力画面になる。ここでパスワードを入力しないとパソコンを使えない。


### 感想

こちらインフラ対応として初歩の段階だと思いますが、今後は複雑なインフラ構築の記事なども
載せる事ができるよう頑張っていきたいと思います。
【Excel】VBAでパスワード入力フォームを作る【ユーザーフォーム】

# やりたいこと
- Excel VBAでダイアログを表示して、ユーザーにパスワードを入力させたい
- 入力されたパスワードは`*`とかでシーリングしたい
- InputBoxに近い感じで使いたい
# InputBoxでは入力文字が隠せない
やりたいことは概ね`InputBox`の機能で実現できるのですが、`InputBox`では入力した文字がそのまま画面に表示されてしまいます。
一方でユーザーフォームのテキストボックスには`PasswordChar`プロパティがあり、そこに`*`等の文字を設定することで、入力された文字列を非表示にできます。
`InputBox`の引数に`PasswordChar`があれば万事解決だったのに。
# 簡単なユーザーフォームを作ってInputBoxの代わりに使う
さて、そういうわけで簡単なユーザーフォームを作成してInputBoxの代わりに使えるようにしましょう。
ポイントは以下のとおりです。
- ユーザーフォームにテキストボックスとOK,Cancelボタン、ラベルを配置する
- コードビハインドに`InputBox`関数に相当する`InputPasswordBox`関数を定義する
- ついでにOK,Cancelのいずれかのボタンが押されたのか取得できるプロパティを実装する
# コントロールの設定（プロパティ）
プロパティウィンドウで設定した項目です。（コードビハインドの前提条件）
書かれていないプロパティはデフォルト値のままです。
### ユーザーフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271250/c1c12dbd-1e84-7c4c-c5b0-72ffd8bcb8b3.png)
- (オブジェクト名):FormInputPasswordBox
- Caption:（コードで指定するので使わないけど、お好みで変更）
### OKボタン
- (オブジェクト名):`ButtonOK`
- Default:`True`
- Caption:`OK`
### Cancelボタン
- (オブジェクト名):`ButtonCancel`
- Cancel:`True`
- Caption:`キャンセル`
### テキストボックス
- (オブジェクト名):`TextBoxPassword`
- PasswordChar:`*`
### ラベル
- (オブジェクト名):`LabelMessage`
- Caption:（コードで指定するので使わないけど、お好みで変更）
# コードビハインド
```vb:FormInputPassword
Option Explicit
Private IsCanceled_intarnal As Boolean
Private IsOKed_intarnal As Boolean

Public Function InputPasswordBox(caption As String, title As String) As String
    Me.LabelMessage.caption = caption
    Me.caption = title
    Call Me.Show
    InputPasswordBox = TextboxPassword.Value
End Function

Public Property Get IsCanceled() As Boolean
    IsCanceled = IsCanceled_intarnal
End Property
Private Sub ButtonCancel_Click()
    IsCanceled_intarnal = True
    Call Me.Hide
End Sub

Public Property Get IsOKed() As Boolean
    IsOKed = IsOKed_intarnal
End Property
Private Sub ButtonOK_Click()
    IsOKed_intarnal = True
    Call Me.Hide
End Sub

Private Sub UserForm_Initialize()
    IsCanceled_intarnal = False
    IsOKed_intarnal = False
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = True ''×ボタンで閉じられるとIsOKedプロパティとかが使えない
    End If
End Sub
```
```vb:Module
Option Explicit
Sub Login()
    Dim password As String
    ' パスワード入力用ユーザーフォーム
    Dim fipb As New FormInputPasswordBox
    password = fipb.InputPasswordBox("パスワードを入力してください", "パスワード入力")
    If fipb.IsCanceled Then
        Call MsgBox("キャンセルされました")
    End If
    Call Unload(fipb) ' ユーザーフォーム解放
End Sub
```
# 余談
先日`C#`でも似たようなことをやりました。
- [【C#】コンソールアプリで入力された文字を非表示にしてReadLineする](https://qiita.com/admiralhetare/items/2de677d90c5ce0ab2659)
ユーザーにパスワードをキーボード入力させる需要ってあんまりないのかしら…？
ubuntu18.04環境でubuntu osをusbにダウンロード

以下サイトを参考に実施
https://kledgeb.blogspot.com/2018/04/ubuntu-1804-85-ubuntuusbubuntugnome.html
https://kledgeb.blogspot.com/2018/04/ubuntu-1804-86-ubuntuusbubuntustartup.html
ubuntu18.04にVScodeインストール

まず下記の公式ページから をダウンロードします。
https://code.visualstudio.com/Download

「ダウンロード」ディレクトリ内に、ダウンロードした.debパッケージがあるのを確認し、ダブルクリックします。
その際にパスワードが聞かれるので入力します。

Ubuntuソフトウェア画面が起動するので「インストール」をクリックします。

![Screenshot from 2021-05-10 10-54-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1235997/b869606d-0a2e-19d7-5811-a94ff4cc4fed.png)

左下のアプリケーションを表示するをクリックし検索窓に「code」と入力する。
エラーなく開けばインストールは完了。

python使えるようにする設定
下記サイト参考に実施
https://python.softmoco.com/devenv/how-to-setup-vs-code-for-python.php
ラズパイVSコードインストール

公式ダウンロードページ
https://code.visualstudio.com/Download

ダウンロードフォルダに保存された.devファイルをクリックしインストール実施
多分これだけでインストールは行ける


pythonやらなんやらかんやらのインストール
https://www.fabshop.jp/raspberry-pi%E3%81%A7%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%82%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%81%AFvisual-studio-code%EF%BC%81%E3%80%90/

https://www.fabshop.jp/raspberry-pi%E3%81%A7%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%82%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%81%AFvisual-studio-code%EF%BC%81%E3%80%90-2/
GPUセットアップ

NVIDIAドライバーダウンロード
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

CUDAダウンロード
https://developer.nvidia.com/cuda-toolkit-archive

CuDNN7.6.5インストール
https://developer.nvidia.com/rdp/cudnn-archive


CUDAフォルダにCuDNNぶち込み

パス通っているか確認

GPU動作確認


```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
ラズパイ(3 model B+)へのtensorflowとKerasとh5pyのインストール

※バージョンの組み合わせ重要
tensorflow==1.14.0
Keras==2.3.1
h5py==2.10.0



Raspberry piを最新にアップデート

```
$ sudo apt-get update
$ sudo apt-get upgrade
```


tensorflowのインストール

```
$ pip3 install tensorflow==1.14.0
```


Kerasのインストール

```
$ pip3 install  keras==2.3.1
```


h5pyのインストール

```
$ pip3 install h5py==2.10.0
```

これで行けるはず。
いけんかったら以下サイト参考に再度挑戦。
https://qiita.com/Laundly_KUW/items/b0de404560c853de09b0
ubuntu18.04インストール後やること

基本ツールインストール

```
sudo apt update
sudo apt upgrade -y
sudo apt install vim
sudo apt install ssh
sudo apt install zsh
sudo apt install git
```

python環境を整える

```
sudo apt install python3-pip
sudo pip3 install --upgrade pip
sudo apt install python3-venv
```

jupyter notebookも一緒に入れちゃおう

```
pip3 install jupyter
```
BASLER前準備

swigインストール

多分これですんなり行く。

```
$ sudo apt-get install autoconf automake libtool
$ sudo apt-get install libpcre3-dev
$ sudo apt-get install bison
$ sudo apt-get install g++
$ git clone https://github.com/swig/swig.git
$ cd swig/
$ ./autogen.sh 
$ ./configure
$ make
```

pylon インストール
下記公式ページからダウンロード
https://www.baslerweb.com/jp/sales-support/downloads/software-downloads/

下記コマンドを実行

```
$ cd Downloads
$ mkdir ./pylon_setup
$ tar -C ./pylon_setup -zxvf ./「pylon_6.2.0.21487_aarch64_setup.tar.gz」※「」の中はダウンロードしたファイル名
$ cd pylon_setup
$ ls
$ sudo mkdir /opt/pylon
$ sudo tar -C/opt/pylon -zxvf ./「pylon_6.2.0.21487_aarch64.tar.gz」※「」の中はダウンロードしたファイル名
ファイルのパーミッション(許可属性)を変更する
$ sudo chmod 755 /opt/pylon
権限設定をする
$ cd
$ sudo /opt/pylon/share/pylon/setup-usb.sh
```

pypylonインストール
ubuntu18.04 GPUセットアップでハマった

[NVIDIA][CUDA][CuDNN]１通りインストールしたがGPU認識されない。

＜やったこと＞
NVIDIA,CUDA,CuDNNの削除

```
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
sudo apt-get --purge remove cudnn-*
sudo apt-get --purge remove libnvidia-*
sudo apt-get --purge remove libcuda-*
sudo apt-get --purge remove libcudnn-*
sudo apt-get autoremove
```
削除完了のはず。以下コマンド実行して何も出なければOKです。

```
dpkg -l | grep nvidia
dpkg -l | grep cuda
dpkg -l | grep cudnn
```
NVIDIAのパッケージレポジトリを追加

```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/×86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/×84_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/×86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update
``` 

NVIDIAドライバーをインストールして再起動する。
※先にNVIDIAのパッケージレポジトリを追加しておくと、最新のドライバーがインストールできる。

```
ubuntu-drivers devices #インストールされているデバイスと利用可能なドライバの確認。
sudo ubuntu-drivers autoinstall
sudo reboot
```

CUDA10.0とCuDNNのインストール

```
sudo apt-get install -y --no-install recommends cuda-10-0
```

CuDNNを公式からダウンロード
https://developer.nvidia.com/rdp/cudnn-archive
この３つインストールする
・cuDNN Runtime Library for Ubuntu18.04 (Deb)
・cuDNN Developer Library for Ubuntu18.04 (Deb)
・cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)

```
sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i lincudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i lincudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb
```

インストールできているか確認。

```
dpkg -l | grep nvidia
dpkg -l | grep cuda
dpkg -l | grep cudnn
```

GPU動作確認

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
Jetson AGX CPU・GPU負荷監視

[参考サイト]
topコマンドの出力をファイルに出力
[例]top -b -d 10 -n 20 > 出力ファイル名.log
　10秒毎に20回データ収集しファイルへ出力を行う。
https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/top%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%9F%E3%81%84
↓topコマンド各オプションの内容はこれ↓
https://www.atmarkit.co.jp/ait/articles/1706/30/news018.html



jtopコマンドの出力をファイルに出力
[例]tegrastats --interval 5000 --logfile 出力ファイル名
　5秒ごとにデータ収集しファイルへ出力を行う。
参考サイト(英語やけども)
https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3231/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/AppendixTegraStats.html
↓各表示内容の詳細はこのリンク参考↓
https://senooken.jp/post/2020/11/19/




logging
電源が落ちる直前に何が起こっていたかの追跡が可能
https://docs.python.org/ja/3/howto/logging.html
https://www.sejuku.net/blog/23149
【スケジューラ】Excelワークシートを使用した書き戻し（オフセット編）

[Sharperlight](https://sharperlight.jp/)スケジューラでは、様々なタスクの自動化を行うことができます。
Excelワークシート上のテーブルデータをデータベースに書き込んだりといった作業もできます。
今回は、Excelワークシート上のテーブルデータがセルA1（最右上）からではなく、セルB3といった中途半端な位置から始まっている場合を試してみようと思います。
### 前準備 ###

先ずこのようなExcelワークシートを準備しました。これを C:\Temp フォルダに保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c350bdb9-c2ed-c2e6-81c0-83e5521006bb.png)
データを書き込む先のデータベース テーブルも準備します。こんな感じかな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/54541689-2b22-d998-b631-d39c7520745d.png)
### スケジューラ タスクの作成 ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**スケジューラ**を起動します。
#### 一般タブ ####
**コード**、**グループ**、**説明**等を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0d9c8eb3-915d-10ff-35c2-71562c9843cb.png)
#### アクションタブ ####
新規アイコンを利用して、**書き戻し**アクションを追加します。様々な属性が表示されるので下図で示した属性だけ設定し、残りは既定値のままにします。
`製品コード`は使用するデータモデルのコードです。要するのデータモデルが書込み先のデータベースと繋がっている（クライアントのセットアップで結び付けている）ので、ここで選択する訳です。
`テーブルのコード`は、選択したデータモデルに定義されているテーブルのコードです。このテーブルにデータが書き込まれます。
`ソース：タイプ`は、Excelワークシートを使用するのでもちろん**Excel**を選択します。
`ソース：Excel：ファイル名`には、先ほど準備したファイルを指定。
`ソース：Excel：シート名`には、テーブルデータが存在するシート名を指定。
`ソース：Excel：ヘッダー行`は、準備したテーブルデータにヘッダーがあればチェックを入れます。
そして、ここが今回に主題である**オフセット**です。準備したテーブルデータはB3が開始位置になっています。なので`オフセット`属性には**B3**を指定します。`ドライバー`属性は、どのセル（列）をガイド（どの行までデータを読み込むかを判断するために使用する列）とするかを指定します。ある行のドライバーとして指定したセルが空白だと、Sharperlightエンジンはそこをデータセットの行の終わりと判断します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/38b91014-ff91-f421-756a-b841cde7fd42.png)
`OK`ボタンで保存します。
保存されたタスクを選択し右クリックメニューから**実行**を選択します。
処理が終了したらデータベースを確認してみます。きちんとデータセットが書き込まれていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5efb159c-a27e-10e3-b6c6-33c5988780a2.png)

では、失礼します。
Hyper-V とは

## 勉強前イメージ

仮想化のアプリケーション的な？？

## 調査

### Hyper-V とは

ハイパーブイと読み、Microsoftのハイパーバイザーの仮想化ソフトのことを指します。
ハイパーバイザーについては [こちら](https://qiita.com/miyuki_samitani/items/fe088f01ebfbc3d7bcfc) に詳細記載していますが
サーバへ直接インストールを行って仮想化ソフトを起動する方法のことを指します。
仮想マシン上ではWindows Server系、クライアント向けWindows、一部linux等があります。

### Hyper-V の他にハイパーバイザーの仮想化ソフトってある？

よく使われるのは以下になります。

- VMware ESXi
- Hyper-V
- [Xen](https://qiita.com/miyuki_samitani/items/fe088f01ebfbc3d7bcfc)

## 勉強後イメージ

Xenのお友達って感じかな？
なんとなくどういうグルーピング化わかるようになってきた

## 参考

- [Hyper-V 【Windows Server 2008 Hyper-V】 Microsoft Hyper-V Server](https://e-words.jp/w/Hyper-V.html)
- [仮想化の種類と特徴](https://linuc.org/study/column/3077/)
Jetson 日本語入力化

●日本語化＆日本語入力化

```
sudo apt-get install -y aptitude && \
sudo aptitude reinstall dbus && \
sudo apt autoremove && \
sudo apt-get update && apt-get upgrade

sudo apt install  -y language-pack-ja-base  language-pack-ja && \
sudo apt install -y ibus-mozc
reboot
```

↑の参考サイト
https://qiita.com/Shunmo17/items/3bfd45ecb5c460bc4bc9


画面右上の入力設定→Text Entry Settingsを選択
![スクリーンショット (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1235997/b4f20b65-aa6a-d055-0bf3-6819d95abbed.png)


![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1235997/a469c35a-4066-2997-318c-83ff5984c230.png)

'+'ボタンクリックし「Japanese (Mozc)(IBus)」を追加
右上入力設定に あMozcが表示されてればOK!
Gitlab コマンド

```
リポジトリ
用語	説明
リポジトリ(repository)	「貯蔵庫」「格納庫」の意。開発の際にデータやプログラムの情報が入ったデータベースのことを指す
リモートリポジトリ(remote repository)	ネット上(リモート)のリポジトリ
ローカルリポジトリ(local repository)	自分のパソコン内(ローカル)のリポジトリ

操作用語
用語	説明
クローン(clone)	リモートリポジトリをパソコンの指定した場所へ複製する
ステージング(staging)	ローカルで変更したデータをコミットする場所に上げる
コミット(commit)	ステージングされた変更履歴をGitに登録する
プッシュ(push)	変更履歴をリモートリポジトリに送信
プル(pull)※	リモートリポジトリをローカルに取り込む
ブランチ(branch)※	原稿のバージョンから枝分かれさせて他の変更を行う
マージ(merge)※	現在のブランチを他のブランチに取り込む
チェックアウト(checkout)　　　作業するbranchを、今作業中のものから別branchに切り替える時に利用。
移動先のbranch内の最後のcommitの内容が作業場所に展開される。
※プル、ブランチ、マージの操作については別の記事で紹介予定です。
```
docker上でネットワーク関連コマンドを使用する

dockerでifconfigを実行したい。
docker上は最小構成のコンテナなためネットワーク関連コマンドを含んでいないらしい・・・

使うにはコンテナ内で関連パッケージのインストールを実施する。

```
root@gitlab:/# apt-get update
root@gitlab:/# apt-get install iputils-ping net-tools dnsutils
root@gitlab:/# apt-get install iputils-ping
```
インストールが完了したら、実際にpingやifcofigが使えるようになったことを確認します。

```
root@gitlab:/# ifconfig
```

これでトラブルシュートを行うことができるようになりますね。ちなみにトラブル原因などが分かった後はそのまま使うのではなく、一旦コンテナを作り直すことを忘れずに。
jetson AGX xavier 電源ボタン無効化

# 給電と同時にAGXを立ち上げたいとき

![Screenshot from 2021-10-13 13-57-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1235997/ccf15c02-eafc-b85f-3dcb-048af00dbb21.png)
AWSの12ヶ月無料期間が終了した話

# はじめに

- 少し前にAWS(Cloud9,S3)を利用していましたが、12ヶ月経ったので無料期間が過ぎました。
その時に、課金が発生してもこのまま使い続けるか、1から作り直すかで迷ったので備忘録を残すことにしました。

# S3を課金利用をするリスク

- 不正アクセスによる莫大な料金発生
私が作っていたSNSサイトではプロフィール画像の読み込みにS3を採用していました。
12か月の無料利用枠では、S3の標準ストレージは5GBとなっています。
S3は容量が無制限の従量課金制です。サイト利用者が増えることで多くの料金が発生する可能性もありますが、今回は不正アクセスされた場合を考えてみます。データが大量に送りつけられた場合、従量課金により額が跳ね上がってしまいます。
 
# Cloud9の場合
- 現在、Cloud9を課金利用していますが100~200円ほどしかかかっていないので、AWSアカウントの作り直しはしませんでした。
# おわりに

今回はS3の場合を考えましたが、自分がAWSのどのサービスを利用しているのかで
・AWSアカウントを作り直す
・課金して継続利用する
の選択は異なります。AWSアカウントを作り直す場合、S3の移行は楽でもCloud9の場合は1から環境構築をやり直す手間がかかる...など。



# 参考
https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all

https://techplay.jp/column/530
CloudWatch Logs Insights 備忘録



# 日付＋UserAgent毎に アクセス数を集計
@messageの中のフィールドに **userAgent** というキーがある場合

```
stats count(*) by datefloor(@timestamp, 1d) as day, userAgent
|limit 10000
```
デフォルトでは、1000行までしか出力してくれない為、limit 10000(最大）を指定
limit は別行 に書く必要あり


# @message中のステータスコードが200以上のログ
```
fields @timestamp, @message 
| filter status > 200
```

# 日付＋ステータスコード毎のアクセス数を集計
```
stats count(*) by datefloor(@timestamp, 1d) as da, status
```

# 日本時間に直す
```
toMillis(@timestamp) + 32400000 
```
TerraformでAurora serverlessV2を構築

## 前提
`required_providers`で指定する`hashicorp/aws`のバージョンは4.15以上でないと`serverlessv2_scaling_configuration`が使用できないので注意

## AuroraServerlessV2を構築

参考：https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster#rds-serverless-v2-cluster

### 従来のAuroraを構築するコードに下記の指定を追加する。
- `engine_mode`を`provisioned`で追加
- `serverlessv2_scaling_configuration`を追加
  引数は `serverlessv2_scaling_configuration`を参考にする
- `aws_rds_cluster_instance`の`instance_class`を`db.serverless`で指定する

### 例
```
resource "aws_rds_cluster" "example" {
  cluster_identifier = "example"
  engine             = "aurora-postgresql"
  engine_mode        = "provisioned"
  engine_version     = "13.6"
  database_name      = "test"
  master_username    = "test"
  master_password    = "must_be_eight_characters"

  serverlessv2_scaling_configuration {
    max_capacity = 1.0
    min_capacity = 0.5
  }
}
 
resource "aws_rds_cluster_instance" "example" {
  cluster_identifier = aws_rds_cluster.example.id
  instance_class     = "db.serverless"
  engine             = aws_rds_cluster.example.engine
  engine_version     = aws_rds_cluster.example.engine_version
}
```

## `serverlessv2_scaling_configuration`
参考：https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster#serverlessv2_scaling_configuration-argument-reference

引数は下記の2つで指定する。

> `max_capacity`
(必須) プロビジョニングされた DB エンジン モードでの Aurora DB クラスターの最大容量です。最大容量は最小容量以上である必要があります。有効な容量値は0.5から128までの範囲で、0.5刻みで指定します。

>  `min_capacity`
(必須) プロビジョニングされたDBエンジンモードでのAurora DBクラスターの最小容量です。最小容量は最大容量以下である必要があります。有効な容量値は0.5から128の範囲で、0.5刻みで指定します。


### 例
```hcl
 resource "aws_rds_cluster" "example" {
   # ... other configuration ...
 
   serverlessv2_scaling_configuration {
     max_capacity = 128.0
     min_capacity = 0.5
   }
 }

```

## まとめ
既存でAurora構築のコードがある場合は殆どの設定を流用できました。
マルチAZについては別途対応が必要になりますので、記事を纏めれたらと思います。
【Blue Prism】OLEDBをBluePrismで使うには

# はじめに
通常、エクセルで読み込んだデータはコレクションで扱うことが出来ますが、何十万行もの大容量のデータの場合、読み込みに時間がかかったりメモリのエラーが出てしまうことがあります。
コレクションを分割してデータの格納を行うことも出来ますが、OLEDBを用いれば高速で大容量のデータを扱うことが出来ます。
ExcelでもCSV形式でも読み込むことが出来、高速化を図ることが出来ます。

＊筆者は34万行のエクセルデータの読み込み→検索をコレクションで約6分かけて行っていたものが約10秒になりました。

# OLEDBとは
OLE DBとは、MicrosoftがCOM（Component Object Model）技術をベースとして開発した、様々なタイプのデータへ共通の手段でアクセスできるようにするためのAPIのことです。
SQLを用いて検索などの操作を行うことが出来ます。

# 使用方法
例として条件に該当する[貸出状態]列のデータを取得します。

アカウント情報.xlsx
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524779/59445e34-0d86-b156-4855-3ad3c3517fdb.png)
上のようなファイルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524779/ab3d37c0-e183-c38d-1820-16371a5054c0.png)
任意のフォルダに配置します。



１．"C:\Program Files\Blue Prism Limited\Blue Prism Automate\VBO\BPA Object - Data - OLEDB.xml"よりリリースをインポートします。

２．図のようにアクションを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524779/6cbadde2-233c-97fe-391b-55b676070e8e.png)
Set Connectionに接続文字列を入力し、Get Collectionに行いたいSQLの操作を入力します。

#### 接続文字列
・Set Connectionの接続文字列：Excelの場合
```
Provider=Microsoft.ACE.OLEDB.12.0;Data Source="C:\temp\アカウント情報.xlsx";Extended Properties="Excel 12.0 Xml;HDR=YES;"
```
・Set Connectionの接続文字列：CSVの場合
```
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\;Extended Properties="Text;HDR=Yes;"
```
HDRは1行目をヘッダーとして扱うかを示します。

#### SQL文の指定
・Excelの場合
FROMにシート名を指定します。
```
SELECT 貸出対象 FROM[sheet1$] WHERE アカウント名 = 'account' AND サーバー名 = 'server1';
```

・CSVの場合
FROMにファイル名を指定します。
データアイテム
SQL From：アカウント一覧.csv
```
SELECT 貸出対象 FROM[アカウント情報.csv] WHERE アカウント名 = 'account' AND サーバー名 = 'server1';
```

シングルクオートで囲むことで文字列として検索することが出来ます。（囲まない場合数字として検索されます）






# 実行
接続文字列とSQL文を入力して実行するとResultsから検索結果を得ることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524779/674d44e0-38b0-3407-fdf9-5a0dc13739c1.png)

また、Closeを行う前にGet Collectionを繰り返し実行することが出来ます。

下記のようなエラーが出た場合、Microsoft Accessデータベースエンジンをダウンロードしてください。
https://www.microsoft.com/ja-jp/download/confirmation.aspx?id=13255

:::note warn
内部 : コードステージによって例外がスローされたため、コードステージを実行できませんでした。 'Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。
:::

# CSVの注意点
CSVファイルを読み込んだ場合、自動で型を判断されます。
型エラーが出てしまう場合、schema.iniファイルを作成し、型を指定する必要があります。

「schema.ini」のサンプル
```
[アカウント一覧.csv]
ColNameHeader=True
Format=CSVDelimited
Col1=アカウント名 Text
Col2=サーバー名 Text
Col3=貸出対象 Text
```

日本語が含まれている場合、文字コードをANSIなどにしてください。


# サンプルテキスト
アカウント情報.csv
```
アカウント名,サーバー名,貸出対象
account,server1,✓
tanaka,server2,×
sasaki1,server1,✓
```
Experience Cloud とLightning Experience の構造の違い



[カスタムタブが Experience Cloud に表示されない](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000K1oPD)

何かよく分からん議論です。

**things are defined as tabs** なんのこと？　オブジェクトかな？

Experience Cloud のナビゲーションは、Lightning Experience で内部的に定義されている方法とは異なります。内部的には、ナビゲーション メニューの概念はなく、**物事はタブとして定義されますが、** Experience Cloud ではサイト/ポータルのユースケースであるため、ナビゲーション メニューがあります。そのため、カスタム タブの代わりに、ナビゲーション メニューを定義し、それらのオブジェクト ページに移動するためにオブジェクトを追加する必要があります。

Lightning レコードページが Experience Cloud に表示されません。Experience Cloud でオブジェクトページを個別に設定する必要があります。
XCodeでVSCodeのコード一行削除のショートカットを設定

使い慣れているVSCodeからSwiftを書くためにXCodeを利用することになった
自分のためのメモとして記録。

:::note warn
OS: Mac
:::
# VSCodeで一行削除
### 【command + shift + K】で一行削除
![](https://gyazo.com/8a43485c96ee2af7aac0ab113d9d21b9/raw)

# XCodeで一行削除
### 【command + shift + DeleteKey】
![](https://gyazo.com/52ced15b70e5ce6bc5f5511d9724337d/raw)

:::note info
補足
XCodeでKey Bindingsを設定するには【command + ,】のショートカットで移動できる
さらには、IDETextKeyBindingSet.plistにて独自のショートカットを作成することもできる
詳細は下の参考文献を確認してください
:::

# 参考文献
[Xcodeで一行削除ショートカットを使う - Qiita](https://qiita.com/nacika_ins/items/a2b61dc5e6892de23b68)
[Xcode ショートカットのカスタマイズ 空行挿入・一行複製・一行削除 - ITC Engineer Blog](https://itc-engineering-blog.netlify.app/blogs/xcode-shortcut)
お家サーバー その4

# 概要
お家サーバーやってみる。
apacheでLet’sEncryptやってみた。

# Let’sEncryptの手順。

# インストール

```
$ aptitude search certbot

$ sudo aptitude install certbot python-certbot-apache

```

# 設定

```
$ sudo certbot --apache

```

# 確認

ブラウザで、https://***.f5.siを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/738c6a4a-06b8-2e8f-ae31-20faf6126b86.png)



以上。
【初学者】RailsをECS(Fargate)にNginxを使用せずにデプロイしようとした際に、ブラウザで「このサイトにアクセスできません」と出力されてしまった際の暫定対処

初学者のため誤り等あるかもしれませんが、本事像で丸3日ほど苦労し参考となる記事がなかったため、雑な記載になりますが備忘もかねて投稿させていただきます。
記載の内容で一旦解決しましたが、今後学習を進める中で根本原因や対処が誤っていた場合は修正するようにいたします。
特殊なケースかもしれませんが、どなたかのお役に立てば嬉しいです。

# 事象の概要

・Railsで作成したAPIをECS(Fargate)にNginxを使用せずにデプロイしたところ、
CloudWatch上ではRailsサーバが問題なく立ち上がっているにもかかわらず、
ブラウザでECSタスクのPublicIPに接続すると「このサイトにアクセスできません」と出力される。
## 詳細の状況
・インフラ構成は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710784/fc3d50f3-308d-0109-5eae-4988f45544c7.png)

・RailsはDockerfileで3000番ポートで立ち上げ。
```Dockerfile
...
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", "3000"]
...
```

・Railsはルートディレクトリにアクセスするとjsonで「status: 'ok'」を返す。

# 対処
以下の二つを行ったところ、なんとかPublicIPとALBのDNSで「{"status":"ok"}」を拝めました。
①Railsを80番ポートで立ち上げて、ロードバランサーのターゲットグループ、ECSタスク定義のコンテナのポートもそれに合わせる。
②DBと接続させる。
　(DBと接続させなくてもECSタスクのPublicIPにつなげばRailsのエラー画面までは出るかなと思ってましたが、DBと接続させないとダメでした、、)(Udemy講座で、LaravelはDBがありませんみたいなLaravelのエラーが見れたんだけど、、)

# あとがき
「お金を浮かせたい&Nginxまだわからない」というところから、Nginxなしで構築しようとしたのですが、あまりそういった記事がなく、エラーの対処に苦労しました。丸3日無為に過ごしていたところ、以下の記事をもとに構築し直したところ、うまくいきました。。ありがてぇ。。
[RailsアプリをEC2からECS/Fargate構成に移行してホストする【ECRへイメージ登録編】 - Qiita](https://qiita.com/Shuhei_Nakada/items/9e4c51bf9ae59f0b1a2b#4-ecr%E6%A7%8B%E7%AF%89%E3%81%A8%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E4%BF%9D%E5%AD%98)

そこから、色々実験したところ、上記の結果にたどり着きました。一応、テスト内容も載せておきます。
| テストケース＼項目 | rails sのポート指定 | dbとの接続(database.yml) | dockerfileでのdb:migrate | ALBのターゲットのポート | タスク定義で指定するコンテナのポート | タスク定義でのコンテナのメモリ制限、GPUユニット数 | サービスで指定するALBのヘルスチェックの猶予期間 | 結果(タスクのpublic ip) | 結果(ALBのDNS) | メモ |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ①記事そのまま | 80 | ○(正しく設定) | ○(実施) | 80 | 80 | ○(正しく設定) | ○(300を設定) | ○ | ○ | Qiita記事のまま設定 |
| ②設定を変えても、タスクのPublicIPとALBのDNSで表示が問題ないものを調査 | 80 | ○ | × | 80 | 80 | ×(空欄のまま) | ×(0を指定) | ○ | ○ | db:migrateをしないで問題なかったのは、DBの情報を使用していなかったからかも。 |
| ③Railsのポートを3000番にしよう | 3000 | ○ | ○(実施) | 3000 | 3000 | ○(正しく設定) | ○(300を設定) | × | × | うまく行ってほしかった。継続調査。 |
| ④Railsを80で上げないと行けないのか実験 | 80 | ○ | ○(実施) | 80 | 3000 | ○(正しく設定) | ○(正しく設定) | ○ | × | テストケース③でタスク定義のコンテナのポートを3000にしたら、なぜかpublic IPでは接続できた。Railsは80で上げる必要があるのか…? |
| ⑤DBと接続させなくてもうまくいくか実験 | 80 | ×(DB名に誤った値を設定) | × | 80 | 3000 | ○(正しく設定) | ○(300を設定) | × | × | DB名を誤って接続できなくすると、publicIPでもブラウザ上で「表示ができません」のエラーが返ってきた。Railsの「DBがみつかりません」みたいなエラーが出るとありがたいのに。。 |

ポート3000がうまくいかないのは納得いかないので、継続調査します。

雑な記載になりましたが、最後までご覧いただき、ありがとうございました!
【AWS】エラー：The request is rejected because the current account does not have an invitation from the requested master account の解決

こんにちは。
AWSマルチアカウント環境を管理している者です。

AWSマスタアカウントからメンバーアカウントに対してAWS GuardDutyとAWS Security Hubを開始させる際にInvitationの問題がよく発生してましたので記録します。

# エラー内容

**ResourceLogicalId:Master, ResourceType:AWS::GuardDuty::Master, ResourceStatusReason:The request is rejected because the current account does not have an invitation from the requested master account. (Service: null; Status Code: 0; Error Code: null; Request ID: null; Proxy: null).**
→ マスタアカウントを管理者にするGuardDutyをメンバーアカウントで開始するには、マスタアカウントよりInvitationを事前にもらう必要がありますが、そのInvitationをもらってないからこのようなエラーが発生したようです。

# 解決
Invitationを送って再度開始を試したら解決されました。
Invitationを送る方法はいくつかあると思いますが、コンソール画面より手動で送る方法とLambdaで自動的に送る方法を紹介します。


### ① コンソール画面より手動でInvitationを送る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/115f3cc7-1a26-e73b-2f03-9a646676cc76.png)
GuardDutyを開いて「設定」＞「アカウント」に入ると「招待によるアカウントの追加」ボタンがあります。これをクリックして招待したいアカウントIDとルートメールアドレスを入力したらInvitationが送られるのでメンバーアカウントがAcceptしたら招待完了です。

こちらの方法はInvitationを送るのも、メンバーアカウントがInvitationをAcceptするのも手動で手間がかかるデメリットがあります。

ちなみに左にある「自動有効化」ですが、私は組織の一部のアカウントに対してGuardDutyを開始したくこちらをOFFにしていますが、組織内の全てのアカウントに対してGuardDutyをONにしたい場合は、こちらの自動有効化をONにすると解決されると思います。



### ② Lambdaで自動的にInvitationを送る（create_members）
コードはpythonで書いています。
Lambdaは、指定したOUに新規アカウントが作成されたタイミングでEventBridgeをトリガーにして実行されるように設計しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/e38acaa6-d205-525c-847e-39e01bdd7dac.png)


```python
import json
import boto3

def lambda_handler(event, context):
    guardDuty = boto3.client('guardduty')
    organizations = boto3.client('organizations')
    
    requestParameters = event["detail"]["requestParameters"]
    if requestParameters["destinationParentId"] == "指定したOU":
        accountId = requestParameters["accountId"]
        email = organizations.describe_account(
                        AccountId=accountId
                )['Account']['Email']
    
    
        response = guardDuty.create_members(
                                DetectorId='マスタアカウントのGuardDuty Detector ID',
                                AccountDetails=[
                                {
                                    'AccountId': accountId,
                                    'Email': email,
                                },
                            ]
                        )
           
```
このように、マスタアカウントのメンバーとして新規アカウントのGuardDutyを開始したらメンバーアカウントは特にAcceptをしなくても自動的にメンバーとしてGuardDutyが起動されます。

メンバーアカウント（新規アカウント）のGuardDutyに切り替えて確認したら以下のように表示されていましたので大丈夫そうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/09253089-d16e-c0d9-ec00-1b1be6b43962.png)
Ubuntuのバージョン確認方法

# Ubuntuのバージョンなどの情報を確認
```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```