OmniAICreator/Qiita-1.07M huggingface dataset:
＃１ No code ゲーム制作への道　Unity＋Playmaker Tools Training Project 開始　３日目　ツール物色からトレーニングまで

#一日目　何もわからずとりあえずUnity ｗ
ゲームを作るという目的で、とりあえずすぐに入ったUnityをインストール。
２D Game Learn、Asset StoreからパッケージマネージャーでFreeツール取り込み終了。


#二日目　Guiツール比較検討
2D Game Kitでマリオメーカーもどき設定＝ドット絵地獄と先行きがすぐに予想でき、アクションゲームツクールＭＶも視野に入れていたが、こりゃやってられんｗ

AssetからGUIツールVoltとPlaymakerを見つけて比較検討。
何も知らないでインストールして二日目でPlaymakerに辿り着き、ブラックマンデー半額セールで購入。

https://youtu.be/OqHM0ZNtZ_4

https://youtu.be/ghxCpdvTCwE


Volt＝C# Gui Tools
Playmaker＝VB Gui

この結果にたどり着いて迷わずPlaymaker ｗ


Playmaker

https://hutonggames.com/index.html

https://assetstore.unity.com/packages/tools/visual-scripting/playmaker-368


Easy Save - The Complete Save Data & Serialization Asset

https://assetstore.unity.com/packages/tools/utilities/easy-save-the-complete-save-data-serialization-asset-768


#本日三日目　Unity＋Playmaker Trainig開始
Unity＋Playmakerで行くと決めたらもうUnityだけで行くことを決意しましたので、もうこうなったらEsaySaveも必須、他にも色々と・・・ｗ


この出力はかなり面倒なんですｗ
プログラムはフローチャート＋入出力の繰り返しです。

●プログラミングフローチャートの３つ

・ループ
・分岐ジャンプ
・アウトプット、入出力系、エラー処理


Playmaker Core Concepts Finite State Machines(FMS)

https://hutonggames.fogbugz.com/default.asp?W133

Finite State Machines(FMS)

https://ja.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3

せん‐い【遷移】 

https://www.weblio.jp/content/%E9%81%B7%E7%A7%BB


フローチャートそのものですから管理がしやすい。


プログラミングは本来文字だけの世界でした。コードのジャンプ先は全て自分の頭の中で組み立てていく、メモしておくなどが必要でしたが、これは次世代プログラミングでノーコードが可能な最近のメインフレームで新しいものですｗ



とはいえ、オブジェクト部品単位の設計に留まっているので、プログラム全体の流れは各オブジェクトの集合体管理は未だ自分の頭の中ですｗ


Voltはこの統合環境管理もGUIで設計できますが、やはりPlayMakerはスタンドアローンとあるように無理なのかも？？


この統合管理が厄介ですが、どうなんですかね？まださっぱりわかっていませんｗ



Finite State Machines(FMS)解説サイト

https://styly.cc/ja/tips/playmaker_coreconcepts/


PlayMakerのアクションリファレンス一覧表

https://styly.cc/ja/tips/playmaker_action_reference/


これらを全てPlaymaker＋Easy Saveがあれば万能です。
どうせ半額50%Offなら買っておいてもいいかとGetしておきましたｗ

正直一番高かったが価値はありますｗ

全てのツールをブラックセール半額なので13000円程度で揃いましたので、これで準備万全ｗ

何も知らずに三日でいきなりプロ級ツールを手に入れましたｗ

三日目にして完璧なツールを手に入れましたので、Unity＋Playmaker＋EasySaveでいくことにしました。

これで材料は揃いましたので、あとは学習、使い方を覚えて、作るだけですｗ
とにかくPlaymakerの使い方をひたすら学習で覚えていきます。


この人にお世話になりますｗ


https://styly.cc/ja/tips/playmaker_coreconcepts/



あとこれは必須だなと思って、悩んでいるものｗ
なんだかんだ金食い虫だが、ないと絶対困るものですｗ

8000円か。まあ半額なんでポチるかｗ
![スクリーンショット 2021-11-18 12.31.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/928738/4c082355-4b93-cca9-3671-b7279e85779d.png)


https://assetstore.unity.com/packages/templates/systems/topdown-engine-89636

https://assetstore.unity.com/packages/templates/systems/corgi-engine-2d-2-5d-platformer-26617

https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743

https://assetstore.unity.com/packages/templates/systems/game-kit-controller-40995


ゲームコントローラー必須、ボーン必須、TopDown Engin・・・どうかなｗ
もう絶対必要なんで面倒なんで買っとこうｗ
8500円也ｗ
まあ絶対必要だしさｗ

Unityのツール類 全てブラックセール50%OFFで全部で２万円ですねｗ
まあしゃーないｗ

今年のブラックセールの買い物は以上で終わり・・・予定ｗ

あとAIとかも絶対いるけど・・・ｗ
https://assetstore.unity.com/?q=AI&orderBy=1

ここはしばらく自分で頑張ってみるが、面倒なら買うかもｗ

無料でも探してみるか、多分適当なのはたくさん落ちてそう。
ほぼ数学だけの世界ですからね。
ドメインにアンダーバーが使えないって誰が決めたんだ

## 注意
ゴリゴリの独自調査(多分ガバあり)
マサカリ求
RFCの原文読むのは無理でした

## 概要

アンダーバー入りの名前でサブドメインを切ってくださいと言われて、ドメインに_(アンダーバー)は使えないので変えてくださいっていうやり取りをちょくちょくしていたんですが、これの根拠を知ろうとしたら泥沼だったって話です。

## RFCをたどる

DNSに関する一番古いRFCは1987年11月発行 RFC1034-1035です。
jprsが[日本語訳](https://jprs.jp/tech/material/rfc/RFC1034-ja.txt)を出してくれていたので、**推奨される名前の構文** の章から意訳抜粋すると。

- ドメイン名空間はラベルをもつノードのツリー構造
- ノードのドメイン名はそのノードまでのラベルの列挙
- ラベルはARPANETのホスト名に関するルールに従う。ラベルは
文字で始まり、文字または数字で終わり、その間には文字、数字、ハイフンだけ
しか存在してはならない。長さは63文字以下でなければならない

とのことです。
なるほど、推奨ではありますが文字、数字、ハイフンだけを使うということと、ARPANETのホスト名に関するルールに由来ということがわかりました。

その一方でこんなRFCもあります。
1997年7月発行 RFC2181 はDNSの仕様を明確化するRFCです。
以下はこちらの[jprsの日本語訳](https://jprs.jp/tech/material/rfc/RFC2181-ja.txt)の、11.名前の構文の5行目からの引用です。

DNSそれ自体には、リソースレコードを特定するために使用するラベルの制約は一つしか存在しない。その制約は、ラベル及び完全名(full name)の長さに関するものである。
(中略)
これらの制約に外れない限り、どんなバイナリ文字列も任意のリソースレコードのラベルで使用できる。


🤔

なんだか🤔.jpっていうドメインまでとれそうな感じですね...

とりあえずこれらを見るにrfc的には_がないことが推奨されるが、DNSがドメインを扱う際にはどの文字も扱えるのが仕様っぽいです。
と見せかけてrfcはあくまで標準仕様の話、ドメインで使える文字を指定する場所はまだあって
それがレジストリのポリシーです。

## レジストラ、レジストリってなに

具体的に言うとレジストラがお名前.comとかawsのroute 53でレジストリがjprsとかverisignです。

レジストリは特定のドメインについて管理し、ネームサーバーを運用します。
(jprsは.jpや.tokyo、verisignは.netや.com)
上記ドメインではレジストリレジストラモデルが採用されており、我々がドメインを取得しようと思った際はレジストラを経由して申請します。

レジストリは管理下のドメインについてドメインのポリシーを定め、登録規則や細則を決めています。
(.co.jpは日本に登記のある企業に限るみたいなものですね。)

その中には技術的な細則もあって.jpや.tokyoの[技術的細則はこちら](https://jprs.jp/registrar/doc/rule/saisoku-1-gtld.html)です。
(.netや.comのポリシーは、見つけられませんでした。)

こちらの、
1．登録可能な汎用JPドメイン名の文字種別と文字列
に使っていい文字などの記述があります。超ざっくりまとめると.jpのドメインだと日本語文字および英字（"A"から"Z"）、数字（"0"から"9"）、ハイフン（"-"）は使える文字のようです。

## まとめ

- ドメインにアンダーバーは使えない、は厳密ではない
- ただ少なくとも.tokyoや.jpをTLDにしたい場合アンダーバーは使えない

## 追記 

AWSのACMのCNAMEレコードの値は先頭が必ずアンダースコアで始まってたりする
https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/troubleshooting-DNS-validation.html#underscores-prohibited
diffで変更後の行だけをいい感じに出力する方法

自分用メモです。
詳しくはmanコマンドで確認してください。

# オプションを指定する(--unchanged-line-format, --old-line-format, --new-line-format)

```bash
diff --unchanged-line-format="" --old-line-format="" --new-line-format="l.%3dn: %L" FILE_1 FILE_2
```

# 得られる出力

```bash
l. 24: hoge
l. 40: hogehoge
l. 59: hogehogehoge
```
認証テストをhelperも駆使してSystem Specを書くまでの流れ

## 前提

factory_botなどの設定は済んでいるものとします。

## gems

まずは、以下のgemをインストールします。

```rb
group :test do
  gem 'capybara'
  gem 'webdrivers'
end 
```

## spec/rails_helperの編集

次に`spec/rails_helper.rb`に以下のように追記し、Capybaraが使えるようにします。

```rb
require 'capybara/rspec'

RSpec.configure do |config|
  config.include SystemHelper, type: :system
end
```

## headlessの設定

続いて、`spec/spec_helper.rb`ファイルへ以下を追記し、system specをヘッドレスで実行するように設定します。なお、ここでスクリーンサイズも設定することで、レスポンシブ対応での不具合への対処できます。

```rb
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium, using: :headless_chrome, screen_size: [1920, 1080]
  end
end
```

## モジュール化

認証テストを行う際に、何度もログインさせる記述を書くことになるかと思うので、いっそのことモジュールかしておこうと思います。

フォルダ、ファイル名は任意ですが、今回は`spec/supports/login_helper.rb`ファイルにその処理をまとめることにします。

```rb
module LoginHelper
  def login
    user = create(:user)
    visit login_path
    fill_in 'メールアドレス', with: user.email
    fill_in 'パスワード', with: 'password'
    click_button 'ログイン'
  end
end
```

次に、上記で作成したファイルを使えるように`spec/rails_helper.rb`を編集します。

```rb
Dir[Rails.root.join('spec/supports/**/*.rb')].each { |f| require f }

Rspec.configure do |confgi|
///
```

以上の設定で、モジュール化した`login`メソッドが使用できるようになりました。

## spec内容の例

```rb
require 'rails_helper'

Rspec.describe 'Authentication', type: :sytem do

  describe 'logout' do
    before do
      login
    end

   it 'is able to logout' do
     click_on 'Log out'
     expect(current_path).to eq login_path
   end
  end
end
```
AmazonLinux2にroswellをインストール

#はじめに
AmazonLinux2にroswellをインストールする手順が欲しかったので書きます。
sbclを入れてreplが起動するところまでのシンプルな手順です。
#環境
EC2
AmazonLinux2
処理系 sbcl
#インストール手順
### 必要なライブラリをインストール
gitやgccもなければ入れておきます。

```
sudo yum install -y automake libcurl-devel zlib-devel git gcc
```

#### DockerのAmazonLinux2の場合
EC2じゃなくて、Docker上にAmazonLinux2のイメージを使用してインストールする場合は、さらにmakeとbzip2とtarのインストールも必要となります。
ros seupで次のようなエラーがでて、ちょっとハマりました。

```
Building sbcl-bin/2.1.10...cat: find-gnumake.sh: No such file or directory
```

また、quicklispを使おうとすると、openssl11も必要でした。

### コンパイル

gitからソースを落としてきてコンパイルします。

```
git clone -b release https://github.com/roswell/roswell.git
cd roswell
sh bootstrap
./configure
make
sudo make install
```

### roswellのセットアップと起動

```
ros setup
```

これで起動できました。

```
[ec2-user@ip-172-31-12-34 roswell]$ ros run
* 
```

#参考URL
https://github.com/roswell/roswell/wiki/Installation
https://takeokunn.xyz/blog/post/amazonlinux-caveman2-hosting
HerokuにDockerコンテナpush時に「Error: docker push exited with Error: 1」というエラー

##背景

HerokuにDockerコンテナを以下ターミナルコマンドでpushしようとしたところ、後述するエラーに直面した。

```
heroku container:push web
```


##エラー文

```
unauthorized: authentication required
 ▸    Error: docker push exited with Error: 1
```

##解決策

以下コマンドでコンテナにログインした上で最初のコマンドを実行したら、無事にpushが完了した。

```
heroku container:login
```

##追記
pushが完了したら、下記コマンドでリリースをしよう。

```
heroku container:release web
```

リリースが完了したら、下記コマンドでアプリを開いてみよう。

```
heroku open
```


##参考
https://zenn.dev/masa20210102/articles/e602a155ff7bf0

https://devcenter.heroku.com/articles/container-registry-and-runtime
UITableViewCellが再利用されないケースを検証

たまたま作業中に疑問に思うことがあってStackoverflowをググっていると、このような質問を見かけました。

[Does a UITextField with first responder status in a UITableViewCell prevent cell re-use?](https://stackoverflow.com/questions/8045099/does-a-uitextfield-with-first-responder-status-in-a-uitableviewcell-prevent-cell)

この記事では、「UITableViewCellに載っているUITextFieldがfirstResponderの場合、UITableViewセルの再利用がされないのでは？」という質問が投げかけられており、解答としては「SDKのドキュメントで言及はないので、その挙動に頼るべきではないでしょう。」となっています。

この記事では実際にこの挙動を検証してみます。

# 検証目的
`isFirstResponder`なviewをサブビューに持つ`UITableViewCell`は、再利用されずに保持されるのか？

# 検証方法
再利用される場合は[tableView(_:cellForRowAt:)](https://developer.apple.com/documentation/uikit/uitableviewdatasource/1614861-tableview)が呼ばれるはずなので、セル上のviewに一度becomeFirstResponderを実行して完全にスクロールアウトし、セルと関連付いたオブジェクトの値の時だけブレークする条件付きbreakpointを貼る。その後に対象のセルをスクロールインさせて処理がブレークするかを見る。

テーブルに対してセルの高さが1/10になるように設定する。データは配列のUUIDを30件分用意する。こうすると、初期表示のセルを最下部までスクロールした際に通常なら確実に再利用させられる。(UICollectionViewはかなり多くをreusableQueueに持つが、UITableViewは表示数+1程度しか持たない)

UITextFieldだけではなく、どのViewの時もfirstResponderであればこの挙動は成り立つのか？を確かめるため、今回はUITextField, UITextView, カスタムUIViewの3種類を切り替えられるようにして検証する。

# 検証結果
**どのViewを利用した場合でもbreakしなかった=セルをdequeueするための`tableView(_:cellForRowAt:)`が呼ばれていなかった。**

# 総括
筆者は当初「UITextViewなどをサブビューで載せていてそれが編集中であったとしても、didEndDisplayが呼ばれ画面外に出てreuseQueueに入るのでresignFirstResponder()が呼ばれ編集状態が終わるだろう」と想定していましたが、実際はisFirstResponderなビューをサブビューに持つセルはreuseQueueに追加されず、別途ストアされている?(実際の処理は分からない)ことが観測されているため、スクロールを任意の距離実行して元の場所に戻ってきてもUITextViewは元のキャレットの位置と編集状態を保っています。

冒頭で掲載したStackoverflowの質問から10年が経過してもその挙動は変わっていないため、おそらく内部的に何らかの意味を持って実装された仕様だと想像します。

もし、「編集状態を終わらせたいのに終わらない」という方は、[tableView(_:didEndDisplaying:forRowAt:)](https://developer.apple.com/documentation/uikit/uitableviewdelegate/1614870-tableview)などでUITextViewやUITextFieldが編集状態の場合はendEditing(true)を呼ぶ。などの実装を行うと良いかもしれません。

# ソースコード
ソースコードはbreakpointも含めてコミットしています。

https://github.com/yosshi4486/TableViewCellNotReuseCell/blob/main/TableViewCellNotReuseCase/ViewController.swift
VScodeインストール方法

#VScodeのインストーラをダウンロードする
下記のURLをクリック

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

赤枠をクリックし次へ
![Visual Studio Code – コード エディター _ Microsoft Azure - Google Chrome 2021_11_18 13_29_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/f29a994b-f886-da35-d683-2c151593843f.png)

赤枠をクリックするとダウンロードが開始される。
![Download Visual Studio Code - Mac, Linux, Windows - Google Chrome 2021_11_18 13_36_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/90161e52-5ec1-0f3d-644d-73a570e240c9.png)

赤枠の順番通りクリックしインストーラをダウンロードしたフォルダを開く
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/3ce3d1f6-1f17-7a0b-141f-e1cbe00a70f4.png)

ダウンロードしたファイルを右クリックし管理者として実行する。
途中PCに変更を加えることを許可しなければならない。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/73e1382b-3107-ef0f-5bda-21df50d849a7.png)

使用許諾契約書に同意し次へ
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/edac9b55-c45e-e30a-1967-4431d1f15ba6.png)

デスクトップ上にアイコンを作成するにチェックを入れ次へ
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/c7bda94d-b0d4-006b-3f62-23442c364eda.png)

インストールをクリックし待機すればインストール完了
インストール後に再起動を進められるので再起動(PATHへの追加のため必須)
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/5da19f91-ebf6-1018-afa7-d0ecad3d8158.png)
Helm Chartsを作成しているときにunable to build kubernetes objects from release manifest:  unable to recognize ""のようなエラーが出るときの対処方法

# エラー全文

```
Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest:
 unable to recognize "": no matches for kind "Task" in version "tekton.dev/v1beta1"
```

# 原因

開発しているCharts内にCustomResourceDefinitionが含まれていると発生します。Helmは全てのリソースを束ねて一括でKubernetesにリソースを作成しようとしますが、CustomResourceDefinitionと、それを使うリソースがあると、そんなCustomResourceDefinitionないよ。ということになります。

# 対処

`crds`ディレクトリを作成し、CustomResourceDefinitionをそのディレクトリに入れます。`crds`はChartsルート直下に作ります。

ディレクトリ構造は下記のようになります。


```
├── Chart.yaml
├── charts
├── crds
|   ├── crds.yaml
├── templates
│   ├── _helpers.tpl
│   ├── dashboard.yaml
│   └── tests
└── values.yaml
```

このようにするとhelmは`crds`にあるリソースをtemplatesより先に作成してくれます。

# 参照

- [Helm | Custom Resource Definitions](https://helm.sh/docs/chart_best_practices/custom_resource_definitions/)
Couchbase Lite開発：Android用インストール手順

## はじめに

Couchbase Lite 3.0.0ベータは、Android SDKとして、Javaに加えKotlinをサポートしています。

## クイックステップ


### Kotlin（エンタープライズエディション）

1. Android StudioでKotlin Androidアプリプロジェクトを作成します
2. アプリレベルの依存関係としてCouchbase Liteを追加します （エンタープライズエディションでは：`build.gradle
implementation 'com.couchbase.lite:couchbase-lite-android-ee-ktx:3.0.0-beta02'`）
3. 次のMavenリポジトリを（`build.gradle`または必要に応じて`settings.gradle`中の）リポジトリに追加します：`https://mobile.maven.couchbase.com/maven2/dev/`
4. プロジェクトをビルドすると、Couchbase Liteがプルダウンされます。

### Kotlin（コミュニティエディション）

1. Android StudioでKotlin Androidアプリプロジェクトを作成します
2.アプリレベルの依存関係としてCouchbase Liteを追加します。（コミュニティエディションでは：`build.gradle
implementation 'com.couchbase.lite:couchbase-lite-android-ktx:3.0.0-beta02'`）
3. `repositories`（または`settings.gradle`）中に`mavenCentral()`があることを確認します。
4. プロジェクトをビルドすると、Couchbase Liteがプルダウンされます。

### Java（エンタープライズエディション）

1. Android StudioでJava Androidアプリプロジェクトを作成します
2. アプリレベルの依存関係としてCouchbaseLiteを追加します。（エンタープライズエディションでは：`build.gradle
implementation 'com.couchbase.lite:couchbase-lite-android-ee:3.0.0-beta02'`)
3. 次のMavenリポジトリを（`build.gradle`または必要に応じて`settings.gradle`中の）リポジトリに追加します：`https://mobile.maven.couchbase.com/maven2/dev/`
4. プロジェクトをビルドすると、CouchbaseLiteがプルダウンされます。

### Java（コミュニティエディション）

1. Android StudioでJava Androidアプリプロジェクトを作成します
2. アプリレベルの依存関係としてCouchbaseLiteを追加します(コミュニティエディションでは：`build.gradle
implementation 'com.couchbase.lite:couchbase-lite-android:3.0.0-beta02'`)
3. `repositories`（または`settings.gradle`）中に`mavenCentral()`があることを確認します。
4. プロジェクトをビルドすると、CouchbaseLiteがプルダウンされます。


## Kotlinステップバイステップインストール


Android Studioプロジェクトで、`build.gradle`ファイルに次のエントリを含めます。


`android`セクションに以下を含めます。


```groovy
android {

  kotlinOptions { jvmTarget = 1.8}

  compileOptions {
      targetCompatibility 1.8
      sourceCompatibility 1.8
  }

//   ... other section content as required by user
}
```

`repositories`セクションに以下を含めます。

```groovy
repositories {
  maven { url 'https://mobile.maven.couchbase.com/maven2/dev/' }

//   ... other section content as required by user
}
```

`dependencies`セクションに以下を含めます。

```KOTLIN
dependencies {

  implementation 'com.couchbase.lite:couchbase-lite-android-ee-ktx:3.0.0-beta02'

//   ... other section content as required by user
}
```

## Javaステップバイステップインストール

Android Studioプロジェクトで、`build.gradle`ファイルに次のエントリを含めます。

`android`セクションに以下を含めます。


```groovy
android {
// Required only if your project has some Kotlin source code
  kotlinOptions { jvmTarget = 1.8}

  compileOptions {
      targetCompatibility 1.8
      sourceCompatibility 1.8
  }

//   ... other section content as required by user
}
```

`repositories`セクションに以下を追加します。



```groovy
repositories {
  maven { url 'https://mobile.maven.couchbase.com/maven2/dev/' }

//   ... other section content as required by user
}
```

`dependencies`セクションにCouchbase Liteを追加します。



```groovy
dependencies {

  implementation 'com.couchbase.lite:couchbase-lite-android-ee:3.0.0-beta02'

//   ... other section content as required by user
}
```

## 関連情報

https://docs.couchbase.com/couchbase-lite/3.0/android/gs-install.html
古い設定のサーバーにアクセスする方法……SMB



結構
毎回忘れるので　設定を思い出すためメモ失礼いたします。

　SMBを有効にしていなかったから
上手くファイルサーバにアクセス出来ないため

コントロールパネル＞プログラム＞Windowsの機能の有効価または無効化＞SMB1.0/CIFSファイル共有のサポート＞SMB1.0/CIFSクライアント　にチェック

で出来るっ
結構毎回忘れるのでQiitaにメモ失礼いたします。
イラレもフォトショも使わない！スマホとmac純正ソフトで行う社員証用写真アップロード覚書

#スマートフォンでの操作
##写真撮影前にすること
できる限り蛍光灯の明かりが十分で白色無地の場所で撮影する．
若干の暗さや傾きは調整できるものの，ネクタイの曲がりや体が横を向いている，焦点のズレなどは修正が難しいので，撮影後は必ずスマートフォン上で拡大して確認を行う．
##スマートフォンで写真を撮る
__・肩が切れていても，体が横を向いていても，大丈夫かを確認する．
・規定が腰から上半身全体ではないかを確認する．__
##GooglePhotoなどで画像をスマホからmacに移す
LineやMessengerなどは極度に圧縮されることがあるので注意．
Google Driveなどのクラウドサービスでも可能
#Macでの操作
##プレビューでの操作
・mac備え付けのプレビューアプリで撮った写真を開く
・プレビュー上でcommandキーとiを同時に押して，イメージサイズが規格に合っているかを確認する．

![スクリーンショット 2021-11-14 13.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177016/3365d769-fe8c-8a2c-277f-aa43ac8219c4.png)
__・背景色を白くするために自身以外の背景をインスタントアルファを使って切り取る__
[参考](https://gori.me/mac/mac-tips/106760)
・一旦保存する．
・プレビュー上でcommand Cする
##Keynote編
・Keynoteを開く
・スライドを新規作成し，スライドマスターを規格の縦横比・サイズにする
[参考](https://bamka.info/keynote-slide-size)
・コピーした自分の写真をペースト(command V)する．
・鼻の位置などを基準に，画像をスライドの中央に据え，角度を調整する．
・できたスライドをJPG書き出しする（.jpegと.jpgは基本的に同じものです）
[参考](https://www.yukibnb.com/entry/keynote_export_as_image)
##アップロード編
・プレビューもしくはFinderから画像の大きさや比率が規格に合っているかを確認する
・任意のページに登録する🎉
rails6にTailwind CSSを導入する方法

# Rails6 * Tailwind CSS

## 1 gem

```
gem 'tailwindcss-rails'

$ bundle install

$ bundle exec rails taildwindcss:install
```

## 2 app/javascript/css/tailwindcss.css

`app/javascript/css/tailwindcss.css`ファイルを新規作成し、以下のようにする

```
@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";
```

## 3 app/javascript/packs/application.js

`app/javascript/packs/application.js`ファイルに以下の記述を追記する

```
import "../css/tailwindcss.css";
import "stylesheets/application"
```

## 4 app/views/layouts/application

`app/views/layouts/application`ファイル内のstylesheetをlinkから`pack`に変更する

```
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
```
SPSS Modelerの散布図ノードをPythonで書き換える

SPSS Modelerの散布図ノードをPythonのmatplotlibやpandasのplotで書き換えてみます。

#0．データ
サンプルで利用するデータは以下です
M_CD: マシンコード
UP_TIIME: 起動時間
POWER: 電力
TEMP: 温度
PRESSURE：圧力フラグ
ERR_CD: エラーコード

各マシンコードごとに起動時間にそって電力や温度の変化、圧力スイッチ、そしてエラーがあればそれが時系列に記録されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1e739d26-7c0f-3f6d-7c91-9934e64ba6c3.png)



#1m．散布図。Modeler版
POWERとTEMPで散布図を作り、ERR_CDで色分けしてみます。
散布図ノードでxフィールドにPOWER、YフィールドにTEMP、オーバーレイの色にERR_CDを設定し、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e3a0424d-9ce3-16e0-105d-9205a5e7ea4a.png)

ERR_CDで色分けされた散布図ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/110e9968-b6af-bdbf-7dcc-2127d506be3a.png)

#1p．散布図。matplotlib,pandas版
matplotlibでERR_CDグ色分けした散布図を書くことは、1回のプロットでは行えません。各ERR_CDごとに別色の散布図のグラフをサブ・プロットでつくって、重ね合わせることになります。

plt.figure()で描画全体領域を確保し、fig.add_subplot(1,1,1)で描画領域を１つ追加します。

```python
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
```

* 参考: matplotlibの描画の基本 - figやらaxesやらがよくわからなくなった人向け - Qiita

https://qiita.com/kenichiro_nishioka/items/8e307e164a4e0a279734

次に色分けするERR_CDに対応した色をリストにしておきます。今回は4種類なので４つ用意しています。

```python
colors=['cyan','red','blue','green']
```
そして、df['ERR_CD'].cat.categoriesでERR_CDの0,101,202,303でループさせ、df.queryをつかって、各ERR_CDで絞りこんだDataFrameオブジェクトを以下のように作ります。
df.query('ERR_CD=={0}'.format(err_cd))[['POWER','TEMP']]
そしてax.scatterで各ERR_CD毎の散布図を作ります。

```python
for i,err_cd in enumerate(df['ERR_CD'].cat.categories):
    dfErrTmp=df.query('ERR_CD=={0}'.format(err_cd))[['POWER','TEMP']]
    ax.scatter(dfErrTmp['POWER'],dfErrTmp['TEMP'], c=colors[i], marker='.', label=str(err_cd))
```

ERR_CDが0,101,202,303の散布図を重ねてつくったらタイトルなどを設定してplt.show()で表示します。

```python
ax.set_title('POWER v. TEMP')
ax.set_xlabel('POWER')
ax.set_ylabel('TEMP')
ax.grid(True)
ax.legend(loc='upper left')

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d4543f6d-04e7-4b0a-6b5b-ef083b988807.png)

かなり大変でした。

次はpandasのplotメソッドを使って同じことを行います。やはりERR_CDが0,101,202,303の散布図を重ねて作る必要があります。
dfErrTmpをつくるところまでは同じです。dfErrTmp.plot.scatterで散布図を書きます。
xとyにはDataFrameの列名であるPOWERとTEMPを指定します。
ax=axを指定することでサブプロットを重ねていくことができます。ただ、ERR_CD=0の時点ではaxが存在していないのでループが始まる前にax=Noneで初期化しておきます。

```python
ax=None
for i,err_cd in enumerate(df['ERR_CD'].cat.categories):
    dfErrTmp=df.query('ERR_CD=={0}'.format(err_cd))[['POWER','TEMP']]
    ax=dfErrTmp.plot.scatter(x='POWER',y='TEMP', c=colors[i], marker='.'
                             ,grid=True, label=str(err_cd),ax=ax)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9c855964-5e21-173a-96da-8a865adead24.png)



#2. サンプル
サンプルは以下に置きました。

ストリーム
https://github.com/hkwd/200611Modeler2Python/blob/mastergraph/graph.str?raw=true
notebook
https://github.com/hkwd/200611Modeler2Python/blob/master/graph/graph.ipynb
データ
https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/Cond5n_e.csv

■テスト環境
Modeler 18.3
Windows 10 64bit
Python 3.8.5
pandas 1.0.5

#3. 参考情報
散布図ノードのタブ - IBM Documentation

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=node-plot-tab
rails formタグについて調べてみた

## formタグにいて

button要素のタイプ指定

- `submit`は、ボタンをクリックするとフォームのデータを`<form>`要素の`action`属性で定義したWebページへ送信する
- `reset`は、ボタンをクリックすると、直ちに全てフォームウィジェットを既定値にリセットする。UXの観点では、resetはバッドプラクティスであると考えられている
- `button`は、クリックしても何も起こらない。JavaScriptを使用してカスタムボタンを作成する際に使用する

<br>

## フォームデータの送信

action属性を指定しなかった場合、フォームが表示されているページ自身に対してデータを送信する

getメソッドは、送信したデータをURLの？以降につけて送信する

postメソッドは、HTTPリクエストのリクエスト本文にデータを含めて送信する

<br>

特別なファイルを送信する場合

`enctype属性`に`multipart/form-data`を指定することで文字列以外も送信できる

[multipart](dust/multipart.md)
僕がJAVAの勉強で頼っている記事たち


いくら覚えても頭から抜けていくものは抜けていきます。

僕が大切にしているのは分からない時に調べる力です。しかし間違った情報や分かりづらいものも多いので、できるだけ分かりやすいものを見るようにしています。

間違っていたらごめんなさい。

##1.演算子の一覧
たまに何だっけなってなるのでちょいちょい見ます。正規表現を勉強したい時に参考にします。

http://wisdom.sakura.ne.jp/programming/perl/perldata1.html

##2.修飾子の一覧表
修飾子もたくさんあるのでよくこんがらります。組み合わせるとエラーになるものや確認をしたいときによく使います。

https://www.tohoho-web.com/java/modifier.htm

##3. 継承の関係とオブジェクト
アクセス修飾子と一緒になると厄介なやつ。
https://kanda-it-school-kensyu.com/java-basic2-contents/jb2_ch01/jb2_0105/

##4.インターフェース
一番苦手です。使いどころや継承との使い分けに迷う
https://www.fenet.jp/java/column/java_beginner/6148/

http://www.kab-studio.biz/Programing/OOPinJava/10/04.html

https://itsakura.com/java_interface
【空冷自作PC】Ryzen7 5700G + ASRock DeskMini X300をノクチュア NH-P1でファンレスにした話

![完成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298419/54c540f3-493b-77d1-266f-ec6f93ece471.jpeg)
# 【空冷自作PC】Ryzen7 5700G + ASRock DeskMini X300をNoctua NH-P1でファンレスにした話

## 結論
コンパクトなファンレス実行環境をつくる為、「ASRock DeskMini X300」に空冷CPUクーラー「Noctua NH-P1」を取り付けた話。CPUクーラーがケースサイズに収まらずニブリングツールでケースを切断して取り付けた。X300でRyzen7 5700Gを起動するにはP1.70以上のBIOSが必要、BIOSアップデートを対応してくれる販売店もあるが、今回は古いBIOSバージョンで対応済みのAthlon 2000GEを入手し、BIOSアップデートした。windows11proで安定稼働できている。CPUフル稼働1時間程度でCPUはクロック4GHz安定で85度ぐらい。

## マシンスペックの概要
- CPU : AMD Ryzen™ 7 5700G
    - ベースクロック〜最大クロック/TDP : 3.8GHz〜4.6GHz / 65W
    - コア数/スレッド : 8コア / 16スレッド
    - L2キャッシュ/L3キャッシュ : 4MB / 16MB
    - グラフィック機能(APU) : Radeon Graphics
- メモリ : CORSAIR Vengeance SO-DIMM DDR4-3200MHz 32GB (16GB x 2枚)
- SSD : CORSAIR Force MP600 読込:書込 4,950MB/s : 4,250MB/s
- マザーボード : ASRock DeskMini X300
    - ASRock DeskMini用 Wi-Fi オプションキットを追加

各種ベンチマークは月並み、コンパクトだからといって遅いことはない。マザーボードのM.2 SSDがPCIe Gen3 x4でSSD側のGen4と世代が異なることによるのか読込書込ともに2.8GB/s程度だった。

## 組み立てのポイント
DeskMiniの細かな組み立て手順は、youtube動画含めて豊富にコンテンツが存在するので割愛、要点のみを記載する。

- BIOSがP1.70以上でないとRyzen7 5700GはBIOSが起動しない。マザーボードには「P1.xx」といったBIOSバージョンがシールで貼られているのだが、今回購入のマザーボードは「P1.40」だった（涙）。P1.70未満のBIOSは対応したAM4のCPUを刺して[ASRock DeskMini X300公式サイト](https://www.asrock.com/nettop/AMD/DeskMini%20X300%20Series/index.jp.asp)からUSBメモリに最新のBIOSをダウンロードすればアップデートできる。
- windows11のインストールはTPM2.0が必要、BIOSのAdvanced SettingからCPU設定を「AMD fTPM」に変更するとインストールできる。
- DeskMini X300マザーボードにはwifiが付いていないので純正オプションキットを別途購入した。
- CPUクーラー「Noctua NH-P1」はデカイ。DeskMiniのケースに収まらない。ニブリングツールがあればスチール製のケースを簡単に切断できるが厚いと切断できない。

## 自作に至った経緯
エクセルで10万行*10万行のxlookupやsumifsをよく使う。手元のmacだとCore-i9でもM1でも処理が重くて遅い、生産性が落ちているので、サクサク動くようにしたかった。折角だから発売されたばかりのwindows11が欲しい。
水冷が流行っているのは知ってはいるけれども、8コア16スレッドのRyzenを空冷で動かしたい！ずっとファンレスでやってきた。Mini ITXが限界と思っているとX300を発見！
当然ながら大きい空冷CPUクーラーは入らない。ケースを切断して換装したら、クーラーがケースからはみ出して型破りな躍動感が生まれるかも知れない。
グラボは刺さらないけど4K動画の字幕+カット編集ぐらいならできる。ゲームはやらない！どうしてもやりたくなったらマザーボード変える覚悟！！メモリ、SSD、マウス、キーボードはCORSAIR！それでもゲームはやらないッ！反応速度の早いデバイスでエクセル専用マシンが空冷無音である！！！
bundle exec rails g kaminari:views bootstrap4 コマンドでエラーが出た

# bundle exec rails g kaminari:views bootstrap4 コマンドでエラーが出た

ページネーションを実現するための`kaminari`gemを利用する際に、`bundle execrails g kaminari:views bootstrap4`コマンドを使用すると以下のような`No such file or directory @ rb_sysopen - https://api.github.com/repos/amatsuda/kaminari_themes/git/refs/heads/master (Errno::ENOENT)`エラーが発生したため、その解決策を残しておく。

## エラーログ

```
$ be rails g kaminari:views bootstrap4
Running via Spring preloader in process 2858
/Users/haryu/prj/retry/vendor/bundle/ruby/3.0.0/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb:118:in `initialize': No such file or directory @ rb_sysopen - https://api.github.com/repos/amatsuda/kaminari_themes/git/refs/heads/master (Errno::ENOENT)
        from /Users/haryu/prj/retry/vendor/bundle/ruby/3.0.0/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb:118:in `open'
```

## 解決策

```
gem 'kaminari', git: 'https://github.com/kaminari/kaminari'
```

上記のように、記述することで解決

[参考](https://github.com/kaminari/kaminari/issues/911)
git cloneでfatal: could not create work tree dir 'xxxx': Permission denied

# 結論
cloneする先のwindows側の書き込み権限のせいだった。cloneする先のディレクトリを変えれば良い　(documents直下等ならOK)

githubへのアクセス権限と信じて疑わなかったから結構詰まった。

#その他の解決方法

#####githubプライベートリポジトリへのアクセスには複数方法がある。
######方法1 アクセストークンによる接続
```shell:shell
git clone https://{ユーザ名}:{アクセストークン}@github.com/foo/bar.git
```

アクセストークンの作成方法はこちらを参照

https://ccieojisan.net/post-2243/

######方法2 SSHによる接続
こちらがわかりやすい

https://qiita.com/shizuma/items/2b2f873a0034839e47ce
Web開発者はMac（Linux）を使えと！？

#目次
[1.はじめに](#1-はじめに)
[2.なぜLinuxが必要なのか](#2-なぜLinuxが必要なのか)
[3.WindowsでNode.jsのバージョンを管理できないのか？](#3-WindowsでNode.jsのバージョンを管理できないのか？)
[4.しかし見つけたこの記述](#4-しかし見つけたこの記述)
[5.おわりに](#5-おわりに)

#1. はじめに
Ractを勉強し始め、Qiitaも書きだしたのでちゃんと書籍などでReactのことを勉強しようとしました。
この記事にReactの勉強に仕方が書いてあって。

https://qiita.com/d0ne1s/items/971ffc8db6815e9aaad0

そこにある[りあクト！ TypeScriptで始めるつらくないReact開発 第3.1版【Ⅰ. 言語・環境編】](https://oukayuka.booth.pm/items/2368045)」を購入し、読んでいます。
まだ前書きから少し進んだぐらいですが、本のコンセプトがいい感じに思えます。

そこにこんな記述が。
>そもそもWeb アプリケーション開発はUNIX 環境でやるのが当たり前なのに、初心者ほどWindows 環境で開発しようとしてハマるんだよね

完全なるWindowsユーザーの私。撃沈！？（いや、Windowsでもやれてるけどね。）
WSLを使ってWindowsにUbuntuを立ち上げて作れ、と。
[著者のGitにあるWSLで環境構築する手順](https://github.com/oukayuka/Riakuto-StartingReact-ja3.1/blob/master/extra/build-win-env.md)

#2. なぜLinuxが必要なのか
前述の書籍を見ると「プロの場合、案件によって複数のNode.jsバージョンを切り替えながら作業する必要があるため、ライブラリバージョン管理ツールを使う必要がある」と記載されている。
なるほど納得。

あとはこんな記事も私としては参考になった。

https://mat0401.info/blog/windows-or-mac/

#3. WindowsでNode.jsのバージョンを管理できないのか？
そして、Microsoftのドキュメントにこんなものを見つけた。

https://docs.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-windows

**お～nvmがWindowsでも使えるということは、行けるんじゃないか！！**

上記サイトに従い、複数のNode.jsをインストールできたことを確認。

#4. しかし見つけたこの記述

しかしよく見ると、Microsoftのドキュメントサイトにも以下のような記述があった。

>注意
>
>Node.js をプロフェッショナルとして使用する場合に、パフォーマンス速度とシステム コールの互換性が重要であると考えていて、Linux ワークスペースを活用する Docker コンテナーを実行し、Linux と Windows の両方のビルド スクリプトを管理する必要がないようにしたい場合、Linux 用 Windows サブシステム (より具体的には WSL 2) 上に Node.js をインストールします

**Linuxを使ってDockerでやれ！**と。MicrosoftさんはWindowsが売れなくていいのか！？


#5. おわりに
ということで、タイミングを見てWSL2を使ってLinuxを入れてやれるようにしていきます。

https://docs.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-wsl

まずはお勉強、ということで前述のnvm-windowsを使った手順でも当面は問題なさそう。
WebAPIのjson形式からpythonを使って欲しい情報の取り出し方（備考録）

この記事は天気APIから持ってきたjson形式の情報をpython使って取り出す方法を自分用にまとめたものです。

#作ったプログラム
```python
#正規表現を使うため
import re
#webAPIを使いjson形式にするため
import requests
import json

#天気予報 API（livedoor 天気互換）を使い石川県の天気情報を取り出している
url = "https://weather.tsukumijima.net/api/forecast/city/170000"

#requests.getを使うと、レスポンス内容を取得できるのでとりあえず変数へ保存
response = requests.get(url)

#response.json()でJSONデータに変換して変数へ保存
jsonData = response.json()

#取得したjsonDataの一つ目の"forecasts"の"detail"の中の"weather"を取り出している。
#replace("　", "")を使い空白を何もない状態に置き換えている
print("今日の天気は", jsonData["forecasts"][0]["detail"]["weather"].replace("　", ""))
print("明日の天気は", jsonData["forecasts"][1]["detail"]["weather"].replace("　", ""))
print("明後日の天気は", jsonData["forecasts"][2]["detail"]["weather"].replace("　", ""))
```

* * *
参考にしたサイト一覧

https://ccie-go.com/python-json/

https://ichi.pro/python-no-moji-retsu-kara-kuhaku-o-sakujosuru-217627623352796

https://qiita.com/bow_arrow/items/4dcab3389c892baba1a5
AutifyとJenkins連携-テストプランを動かす-

# はじめに
AutifyをJenkinsから動かす方法を記載していきます。
今回はAutifyのテストプランをJenkinsで動かす方法です。

まだ試せていない部分もあるので、試したら今後どんどん追記していきたいなと思います。

## 前提条件

今回使用するツールは下記の通りです。
Jenkinsはすでに環境構築済みで、ノードの設定もしてあるものとします。
またAutifyで実行したいテストプランは作成済みであるものとします。


|        Tools       | Version      |
|:-------------------|:------------:|
| Windows            | 10           |
| Jenkins            | 2.284        |
| Autify             | 最新Ver      |

# 手順

ざっくりとした手順は下記の通りです。

1. パーソナルアクセストークンを発行する
1. Jenkisの設定をする


## 1.パーソナルアクセストークンを発行する

Autifyにログインをしたら、画面左のメニュー > アカウント > 設定を選択します。
![設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/fc1bae35-0428-0d62-0846-f0010b1929bf.png)


個人設定の中に「新しいパーソナルアクセストークンを生成」があるので、名前を入力して、作成を押下します。
![パーソナルアクセストークン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/c1f5ff8a-c02c-511e-706f-ba6f5143fc20.png)
※作成ボタンを押した後に表示されるパーソナルアクセストークンは必ずどこかにメモをしておきましょう。
※もしページをリロードしたり、誤ってページを遷移してしまった場合は、作ったパーソナルアクセストークンを無効にし、再度パーソナルアクセストークンを作成しましょう。

## 2.Jenkinsの設定をする

Jenkinsを開き、新規ジョブ作成を行っていきます。
![Jenkinsメニュー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/b774c1b0-67d0-8935-71b3-3a4338c64791.png)

ジョブ名を入力したら、「フリースタイル・プロジェクトのビルド」を選択します。
選択ができたらOKを押下します。
![ジョブ作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/c27dc421-8fb1-0237-c4bf-7dc6e11ff84f.png)

設定画面に遷移したら、
まずは実行するノードを制限します。
作成したノードを指定するだけなので、ここでは詳細を割愛します。

次にビルドの段落に移動します。
ビルド手順の追加から、「シェルの実行」を選択してください。

シェルスクリプトの部分には、下記を記載してください。
> curl -X POST -H "Authorization: Bearer PersonalAccessToken※1" https://app.autify.com/api/v1/schedules/TestPlan※2

※1
PersonalAccessTokenの部分には1で発行したパーソナルアクセストークンを入力してください。
このときBearerの部分は残してください。

※2
TestPlanとなっているところは書き換えが必要です。
Autifyで実行したいテストプランを選択します。
私は今回YamaAriTestPlanというテストプランを実行したいと思います。
テストプランを選択したら、URLを確認しましょう。
URLの最後の数字が当該のテストプランを示しています。
YamaAriTestPlanなら102562です。
これをTestPlanのところに書き換えてください。

![テストプラン数字.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/f69d9e32-034c-6041-4c7c-70a005d69c9f.png)


上記が設定できたら保存をして、ビルド実行してください。
成功すればAutify上でテストプランが動き出していると思います。

ここまで作れればあとは
GitHubにPushされたら、みたいなトリガーの設定などができればより実践的な感じで使えると思います！
CocoaPodsのエラーの解決法の一つ


以下のエラーになった場合の対処法の一つです。
長いので、最後の行を載せます。

```
Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update

Error running pod install
Error launching application on iPhone 8.
```


解決策(1)

```
cd ios
pod repo update
```

解決策(2)

```
cd ios
rm Podfile.lock
flutter clean
flutter pub get
pod install
cd ..

```
TypeScriptの記事

##TypeScript
JavaScriptに、型システムが入ったやつ。
型システムがあることでコードを書いている中で、エラーを出してくれる。
インプットはTypeScriptだけど、コンパイラをして、アウトプットはJavaScriptに変換をされる。
それをWebブラウザ上に表示をさせている感じ。

##環境構築
Webpack=モジュールバンラ
依存関係を考慮しながらJavaScriptを１ファイルにまとめる。

TypeScript
コンパイラを使う
TypeScriptで書いたやつをJavaScriptに変換してくれる
新しい構文を古いブラウザでも動かせることができます。
BigQueryのテーブル復元方法


7日間であれば特定の時点のテーブルを復元できます。


## Cloud SHELLを開く

![2021-11-18_12h12_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/44240e15-2c26-d791-ee2a-c2089c9bd4a5.png)

## コマンドの入力

参考
https://cloud.google.com/bigquery/docs/time-travel#restore-a-table

1時間前に戻す場合は `-3600000`msを指定します。
6日前であれば `-3600000 * 24 * 6`の計算結果へ変更することで戻すことができます。

```
bq cp mydataset.table1@-3600000 mydataset.table1_restored
```
Ubuntu 22.04にDocker Engine、Docker Composeをインストールする手順

# はじめに

Ubuntu 22.04にDocker Engine、Docker Composeをインストールする手順を、備忘録を兼ねて、まとめます。

- クラウド、VPSなどの環境
- Oracle VirtualBoxなどの仮想環境
- WSL2の環境

等でインストールすることを想定しています。

# Docker Engineをインストール

[docker docsサイトのInstall Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)のページの手順でDockerをインストールします。


## Docker Engineのリポジトリを設定
### HTTPS上のリポジトリ使用に必要なaptパッケージのインストール

```bash
sudo apt update
sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

### Docker EngineのGPGキーを追加

```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

### Docker Engineのaptリポジトリを登録

```bash
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

## Docker Engineをインストール

```bash
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

## バージョンを確認

```sh
docker --version
```

結果（例）：

```txt
Docker version 20.10.18, build b40c2f6
```

## docker daemonを起動

```sh
sudo service docker start
```


# 自分のユーザーをdockerグループに所属させる
## dockerグループを作成

```bash
sudo groupadd docker
```

※すでに存在しているエラーが表示されても、そのまま次以後の手順へ進みます。

## 現行ユーザをdockerグループに所属

```bash
sudo gpasswd -a $USER docker
```

## dockerデーモン再起動

```bash
sudo service docker restart
```

## exitして再ログイン

```bash
exit
```

再度SSHでログインすると、dockerグループへの所属が反映されます。

## hello-world実行確認
### hello-worldのコンテナ起動

```bash
sudo docker run hello-world
```

エラー等が発生せず、hello-worldのコンテナが正常に起動・終了することを確認します。

### hello-worldのコンテナ削除

まず、先ほどの手順で作成されたコンテナを確認します。

```bash
docker ps -a
```

hello-worldのコンテナのIDを確認し、削除します。

```bash
docker rm {hello-world コンテナID}
```

hello-worldのイメージも使用しないため削除します。

```bash
docker rmi hello-world
```

# Docker Composeインストール
## Docker Composeをインストール

```bash
sudo apt update
sudo apt install docker-compose-plugin
```

## バージョンを確認

```sh
docker compose version
```

結果（例）：

```txt
Docker Compose version v2.5.0
```

以上の手順で、Docker EngineとDocker Composeを使えるようになります。
MUIでシンプルなソート可能なテーブルを作る

# はじめに
MUIでソート可能なテーブルを作りたかったのですが、[MUIのサンプル](https://mui.com/components/tables/#sorting-amp-selecting)はCheckBox、FormControlLabelなどシンプルなものを作るときには不要な機能もついていて、少し分かりにくかったです。
なので、不要な機能を削除したシンプルなソート可能なテーブルをメモ代わりに残しておきます。

# 作成したもの
商品の名前と価格を表示するテーブルです。
価格によってソート可能です。
![k48ho-0gic1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123126/6717e5cb-af2b-2e9d-b47c-43ce687d55e0.gif)

# コード
https://codesandbox.io/s/mui-simple-table-6tsvs?file=/src/SimpleTable.tsx

```tsx
import { useState, VFC } from "react";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import TableSortLabel from "@mui/material/TableSortLabel";

interface Data {
  id: number;
  name: string;
  value: number;
}

function createData(id: number, name: string, value: number): Data {
  return {
    id,
    name,
    value
  };
}

const rows = [
  createData(1, "Frozen yoghurt", 305),
  createData(2, "Ice cream sandwich", 302),
  createData(3, "Eclair", 303),
  createData(4, "Cupcake", 303),
  createData(5, "Marshmallow", 306)
];

function descendingComparator<T>(a: T, b: T, orderBy: keyof T) {
  if (b[orderBy] < a[orderBy]) {
    return -1;
  }
  if (b[orderBy] > a[orderBy]) {
    return 1;
  }
  return 0;
}

type Order = "asc" | "desc";

function getComparator<Key extends keyof any>(
  order: Order,
  orderBy: Key
): (
  a: { [key in Key]: number | string },
  b: { [key in Key]: number | string }
) => number {
  return order === "desc"
    ? (a, b) => descendingComparator(a, b, orderBy)
    : (a, b) => -descendingComparator(a, b, orderBy);
}

export const SimpleTable: VFC = () => {
  const [order, setOrder] = useState<Order>("asc");
  const createSortHandler = (property: keyof Data) => (
    event: React.MouseEvent<unknown>
  ) => {
    setOrder(order === "asc" ? "desc" : "asc");
  };

  return (
    <TableContainer>
      <Table>
        <TableHead>
          <TableRow>
            <TableCell>名前</TableCell>
            <TableCell>
              <TableSortLabel
                active
                direction={order}
                onClick={createSortHandler("value")}
              >
                値段
              </TableSortLabel>
            </TableCell>
          </TableRow>
        </TableHead>
        <TableBody>
          {rows.sort(getComparator(order, "value")).map((row, index) => {
            return (
              <TableRow key={row.id}>
                <TableCell>{row.name}</TableCell>
                <TableCell>{row.value}</TableCell>
              </TableRow>
            );
          })}
        </TableBody>
      </Table>
    </TableContainer>
  );
};

```
会社PCにおけるUSB閉塞の弊害をIFTTTで解消する

たまには真面目な記事も書きましょうか。
今回はプロダクトメインというよりは、企画メインですので、日本型文章です。

# セキュリティと利便性のトレードオフ
　今般の急速なDXにより、企業経営におけるセキュリティの重要性はますます高まっています。特に情報漏洩は大きな問題であり、会社の機密情報が洩れることによる営業活動に対する悪影響や、顧客の個人情報が洩れることによるレピュテーションリスク等、企業の存続にまで影響をあたえるようになりました。
　脆弱性の高いUSBメモリの閉塞は一般的に実施されていますが、大きく利便性を損なうことも否めません。社内の電子データ共有がメインの業務であれば弊害は少ないかもしれませんが、**社外で撮影した映像などを分析に用いる**場合、情報共有・保管の面で弊害が発生します。

# 小売業における弊害
　私は小売業に従事しておりますが、上記弊害を大きく受ける職種の一つです。特に、私が所属する経営戦略部では、競争企業の分析をするために**店舗の映像を撮影する（良い子はやってはいけません。）**のですが、その写真を会社PCに取り込み、部署内で共有する手段が大きく限られてしまったのです。現在実施している手段は以下の通りです(iPhone環境)。

- メールで会社PCに送信
- 写真をiCloudに共有。自分のiPhoneで会社PCをテザリング**(ルール違反)**し、iCloudから落とす。
- 見せるだけであれば、LINEで共有。

非常に手間がかかっており、**撮影した写真をすばやく共有**し、**安定的に保管する**方法が必要となります。

# 今回のプロダクト
**[IFTTT](https://ifttt.com/home)を用いて効率化しました。**
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/41584534-3072-dcff-90e5-fe1f74bde942.png)

![道.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/37c62366-c8c8-3fc7-5e31-12926ff7a6d2.jpeg)
iPhoneのphotoに追加した写真をGoogle driveにアップロードします。
Thenの中身は以下の通り。
![googledrive.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/04c9012f-88f6-f7b0-41df-a224e994e2f2.jpeg)
ファイル名は日付＋時刻、フォルダーはGoogle drive上の"iOS Photos"直下に置くこととしました。
![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/826ca8ec-23f1-deb2-5acd-e706ba2fa8b4.jpeg)

会社PCでは多くの共有クラウドが使えない中、Google driveが使えたことは幸運でした。

:::note warn
iPhoneのphotoを用いたAppletを利用する場合、iPhoneのIFTTTアプリをダウンロードし、写真へのアクセスを許可することが必要となります。
:::

#実際に使ってもらってみて

売場を良く見に行く上司に使ってもらったところ、
おもしろいね！でもアプリ入れるの面倒だからこれからも写真はLINEで送るよ！

と明るく言われました。最初はあまり楽にならないかと思いましたが、LINEで送ってもらえば写真アプリにも簡単に入れられ、結果Google driveに入れられるので、無駄ではなかったかな、と思いました。
草の根的に少しずつ使う人を増やしていきたいと思います。
grepコマンドでInput/Output errors


# 事象 : grepをしたら「Input/output error」
- 環境
    - Windows10 Pro にWSL2作成したUbuntuのディレクトリ
    - GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)

```bash
# Vue.jsのプロジェクト内のディレクトリでgrep
$ grep -rn 'メニュー画面'
grep: node_modules/postcss-reduce-initial/node_modules/.bin/browserslist: Input/output error
grep: node_modules/extract-css-chunks-webpack-plugin/node_modules/.bin/webpack: Input/output error
grep: node_modules/postcss-selector-parser/node_modules/.bin/cssesc: Input/output error
grep: node_modules/thread-loader/node_modules/.bin/webpack: Input/output error
grep: node_modules/webpack/node_modules/make-dir/node_modules/.bin/semver: Input/output error
grep: node_modules/webpack/node_modules/.bin/mkdirp: Input/output error
# ...省略...
```

## 原因 : 開けないファイルを開こうとするから
> Input/Output errors during filesystem access attempts generally mean hardware issues.
> [ubuntu - &quot;Input/output error&quot; when accessing a directory - Unix &amp; Linux Stack Exchange](https://unix.stackexchange.com/questions/39905/input-output-error-when-accessing-a-directory)

上記の英語をざっくりと訳すと
「ファイル・システムへのアクセス試行中に「Input/Output errors」と表示される場合は、一般にハードウェアの問題を意味します。」
ということです。

エラーが表示されている対象を確認すると、どうやらコマンドの実態となるファイルを参照しようとしてしまっているようです。

### 対応 : 検索対象を絞る
今回は、`node_modules`ディレクトリ配下は検索対象にする必要がなかったので`--exclude-dir`オプションを利用して除外しました。

```bash
$ grep -rn --exclude-dir=node_modules 'メニュー画面'
layouts/default.vue:124:          title: "メニュー画面",
pages/menus/register.vue:7:        メニュー画面に戻る
pages/menus/menu/_id.vue:7:        メニュー画面に戻る
```
Menu Parmar

Menu Parmar Author MP3 Ringtones 888 Plus 10/11/1997 menuparmar2021@gmail.com 0222577209 D 46, F F Complex, Jhandewalan https://mp3ringtonesdownload.net
Ringtone mp3 download, Ringtone Song, mp3 ringtone download, New Ringtone, best ringtone download, Ringtone mp3 download, Ringtone Song, mp3 ringtone download, New Ringtone, best ringtone download
Claris Connect で外部データソースへのログインはできない（2021/11/18）

# Claris Connect とは

[Claris Connect](https://www.claris.com/ja/connect/) は Claris が提供するワークフローツールです。
ワークフローツールにはいろいろとありますが、Claris が提供しているのでもちろん FileMaker のデータベースに関するアクション（レコードの作成やスクリプトの実行）ができます。

参考 ： [Claris Connect を初めて使ってみる～時間をトリガーにFileMakerファイルへレコード作成](https://qiita.com/Hi_Noguchi/items/6757e15fd586db415e4a)


# 外部データベースの関連フィールド参照/スクリプト実行
[弊社](https://www.piano.or.jp)では Windows のタスクスケジューラを用いて毎日決まった時刻に FileMaker のスクリプトを FileMaker Pro のクライアントの実体を介して実行しています。
もちろんこの形式だと途中でフリーズするとその後に予定されていたスクリプトが実行されなくなってしまうという問題がどうしても生じてしまうので、その解決案としてのスクリプト実行を Claris Connect で行うことを検討しました。

実行するスクリプトには、外部データソースとして登録された同一ホスト/外部ホストのデータベースにあるフィールドやスクリプトを参照しているものがほとんどでした。
さすがにこれぐらいはできるだろうと考えながら Claris Connect へ移植をし、Claris Connect の "FileMaker Server > Excute script" を用いて実行してみると、Claris Connect 側では "Success" と出て問題なさそうな様子。
![スクリーンショット 2021-11-18 10.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/7b7b016d-5629-c3ce-905a-9e250220840b.png)
（これはテスト用のスクリプトについて "Histrory" で表示された結果）

しかし、実際にデータベースの方を確認してみると、

 - スクリプトで外部データソースの関連フィールドの値を取得できていない
 - スクリプトで外部データソースにあるスクリプトを実行できていない

という 2 つの問題が生じている疑惑が出てきました。


# Claris への問い合わせとその回答
業務上のスクリプトではない検証用の簡単なスクリプトをいくつか試した結果、疑惑がほぼ確信に近くなったため 、この件に関して Claris に問い合わせをしました。

何往復かのやりとりで検証内容を共有した結果、回答の要旨としては、

**FileMaker Data API 自体には外部データソースに認証情報を渡す仕組み（fmDataSource 引数）があるが、___Claris Connect ではそのパラメータがサポートされていないため___、外部データソースの関連レコード参照/スクリプト実行はできない**
https://help.claris.com/ja/data-api-guide/#connect-database_log-in-eds

とのことでした。




　
　　
　

……ということで、2021 年 11 月時点では **Claris Connect で実行するスクリプト上では外部データベースの情報を取得することができず**、単一のファイル内で完結した操作と Claris Connect が提供しているアクションを組み合わせてできることのみ実現可能という状況です。（わざわざ外部データソースへのログイン認証を渡すところを落とす必要、あるいは落とさないと実現が難しい理由があったのでしょうか……？）

長年構築されてきたデータベース間の構造が出来上がっている中で、その構造を利用したスクリプトの実行や関連レコードの活用をするのではなく、 Claris Connect 用に完結した 1 つデータベースを作成して運用することを想定している可能性もあります。

ただ、もちろんそれだけであると元々あった FileMaker の強みの相当な部分が失われてしまうので、今後 Claris Connect で外部データベースへのアクセスが可能になることを切に願います。
【Objective-C 入門】コードだけで初期画面を生成

# はじめに

今回はStoryboardを使わず、コードのみで初期画面まで作成してみます。

## 環境

- macOS 12.0.1
- Xcode 13.1
- Objective-C

## 完成図

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091516/8d474275-6f44-2525-5c14-f3617d810151.gif" width="300" />

## AppDelegate.h

```objective_c
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow * window;

@end
```

## AppDelegate.m

`#import "ViewController.h"` インポートし忘れに注意！！

```objective_c
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = UIWindow.new;
    [self.window makeKeyAndVisible];
    
    ViewController *vc = ViewController.new;
    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController: vc];
    
    return YES;
}
```

## SceneDelegate.h

```objective_c
@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>

@property (strong, nonatomic) UIWindow * window;

@end
```

## SceneDelegate.m

`#import "ViewController.h"` インポートし忘れに注意！！

```objective_c
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    
    self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
    [self.window makeKeyAndVisible];

    ViewController *vc = ViewController.new;
    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController: vc];
}
```

## ViewController.h

```objective_c
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end
```

## ViewController.m

```objective_c
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = UIColor.whiteColor;
    
    [self setupNavigationItems];
}

- (void)setupNavigationItems {
    self.navigationItem.title = @"Objective-C";
    self.navigationController.navigationBar.prefersLargeTitles = YES;
}

@end
```

# さいごに

AppDelegate.swift と SceneDelegate.swift のコードを書いていきました。
アプリを実行してみると完成図のようになると思います。

ここまで見ていただきありがとうございます、皆様の学びの助けになれば幸いです。
NSX-T 2.5～推奨：EdgeのOverlay/VLAN一体型N-VDSについて

[NSX-T Reference Design Guide v3.0](https://communities.vmware.com/t5/VMware-NSX-Documents/VMware-NSX-T-Reference-Design/ta-p/2778093)の 4.8.2.3（P96）に記載がありますが、
VMware NSX-Tの2.4までと2.5以降では、<font color="red">**EdgeのN-VDSの構成の推奨に変更**</font>があります。以下に内容をまとめました。

#EdgeのN-VDSの推奨の変更について
* **NSX-T ～2.4**：オーバーレイ及びVLANトランスポートゾーン毎にN-VDSを用意(Multiple N-VDS)　**図1**
* **NSX-T 2.5～**：<font color="blue">**オーバーレイ/VLANトランスポートゾーン一体型のN-VDS**</font>を構成 (Single N-VDS)   **図2**

**図1 (～NSX-T 2.4)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/bd8a23c4-a2c6-40ae-7b81-e4558bb60981.png)


**図2 (NSX-T 2.5～)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/b1abd75c-b85f-eb99-f23b-345194f114ac.png)



#単一のN-VDSのメリット
* <font color="red">**マルチTEP構成**</font>によるオーバーレイトラフィックのロードバランシング
* N-VDS毎に必要となるNSX Managerの管理・コントロールプレーンのCPU負荷の軽減

#マルチTEPの構成方法

* マルチTEP用のEdge Uplink Profileを新規に作成
    - Default Teaming: Load Balance Source
    - Uplink1 : Failover Order 
    - Uplink2 : Failover Order 

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/854e5bc5-4ab4-badf-ba4d-9d723f9ccc8e.png)


* Edge VM展開時 N-VDSをオーバーレイ/VLANトランスポートゾーン一体型で構成し、上記Uplink Profileを指定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/5a811b3f-a067-3969-99b1-8f114b92f350.png)

* マルチTEP構成を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/6f0b329b-8ec7-0032-8e6f-f568d0bfb116.png)



# 参考リンク
https://rutgerblom.com/2019/10/07/single-n-vds-per-edge-vm/
EC-CUBE4プラグインインストールでエラーが出る時の対処

[管理画面からのプラグインインストールでエラーとなる](#管理画面からのプラグインインストールでエラーとなる)
[symfonyのキャッシュクリア](#symfonyのキャッシュクリア)
[コンソールからのプラグイン操作](#コンソールからのプラグイン操作)
[コンソールからのプラグイン操作コマンド集](#コンソールからのプラグイン操作コマンド集)
[プラグインコードの調べ方](#プラグインコードの調べ方)
[コンソールからのプラグイン操作](#コンソールからのプラグイン操作)
[参考記事](#参考記事)

#管理画面からのプラグインインストールでエラーとなる

管理画面　＞　オーナーズストア　＞　プラグイン

![スクリーンショット 2021-11-18 10.09.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/78548e4a-c038-d68e-09c0-15274899a5a1.png)

#symfonyのキャッシュクリア

```
# ＜ドメインルート＞/bin/console cache:clear --no-warmup
```

```
# rm -rf /＜ドメインルート＞/var/cache/*
```


#コンソールからのプラグイン操作コマンド集

インストール

```
bin/console eccube:plugin:install --code=＜プラグインコード＞
```

有効化

```
bin/console eccube:plugin:enable --code=＜プラグインコード＞
```

無効化

```
bin/console eccube:plugin:disable --code=＜プラグインコード＞
```

削除

```
bin/console eccube:plugin:uninstall --code=＜プラグインコード＞
```

削除(プラグインのファイルも削除する場合)

```
bin/console eccube:plugin:uninstall --code=＜プラグインコード＞ --uninstall-force=true
```

#プラグインコードの調べ方

ありか
＜ドメインルート＞/app/Plugin/＜プラグイン＞/composer.json

```:cat&nbsp;＜ドメインルート＞/app/Plugin/＜プラグイン＞/composer.json
{"name":"ec-cube\/＜プラグイン＞","version":"1.0.0","description":"＜プラグイン＞"        ,"type":"eccube-plugin","extra":{"code":"＜プラグインコード＞","id":****}}
```

#コンソールからのプラグイン操作

###ドメインルートへ移動

```
# cd /var/www/html/＜ドメインルート＞
```

###操作エラーの場合

```
bin/console eccube:plugin:enable --code=＜プラグインコード＞
```

![スクリーンショット 2021-11-18 9.21.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/12f1ea0c-d5a1-b7f5-ed38-551ce771ab3b.png)

###操作成功の場合

```
bin/console eccube:plugin:enable --code=＜プラグインコード＞

gen -> /var/www/html/＜ドメインルート＞/app/proxy/entity/src/Eccube/Entity/CartItem.php
gen -> /var/www/html/＜ドメインルート＞/app/proxy/entity/src/Eccube/Entity/OrderItem.php
gen -> /var/www/html/＜ドメインルート＞/app/proxy/entity/src/Eccube/Entity/Cart.php
gen -> /var/www/html/＜ドメインルート＞/app/proxy/entity/src/Eccube/Entity/ProductClass.php
gen -> /var/www/html/＜ドメインルート＞/app/proxy/entity/src/Eccube/Entity/Order.php

```


![スクリーンショット 2021-11-18 9.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/3c2791ca-c58e-1497-fbc8-6dbf6605c624.png)

***
#参考記事
`https://doc4.ec-cube.net/plugin_install#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E6%93%8D%E4%BD%9C`
`https://jum11.com/2020/12/31/ec-cube4-plugin-install/`
`https://qiita.com/nanasess/items/583683eb94947aebea44`