OmniAICreator/Qiita-1.07M huggingface dataset:
chikkarpyを使って同義語検索やってみた

### はじめに

ネットサーフィンしていたら、同義語検索ライブラリでchikkarpyというのがあるらしい。

https://zenn.dev/sorami/articles/3742e761543e08

面白そうなので、使ったみました。

### インストール

```
pip install chikkarpy
```

これだけ。凄い楽ちん

### pythonでの実装例
以下のように、簡単に同義語検索を試すことができます。

```python
from chikkarpy import Chikkar
from chikkarpy.dictionarylib import Dictionary

chikkar = Chikkar()
system_dic = Dictionary(<system.dicのファイルパス>, False)

chikkar.add_dictionary(system_dic)

print(chikkar.find("漫画"))
# ['コミックス', 'comics', 'まんが', 'マンガ', '漫画雑誌', 'コミック', 'comic']
```

この時` <system.dicのファイルパス> `ですが、chikkarpyをインストールすると`pythonのバージョン/site-packages/chikkarpy/resources/system_synonym.dic`というファイルパスがあるはずなので、それを指定すれば大丈夫です。

あと、他の例でも試してみました。ポケモンの同義語として考えられる「ポケットモンスター」などは存在しなかったので、別途辞書を作成してビルドする必要がありそうです(カスタム辞書のビルド方法は最初に載せていた参考URLで説明されていました)。

```python
print(chikkar.find("ポケモン"))

print(chikkar.find("博士課程"))

print(chikkar.find("就職"))

print(chikkar.find("ポスドク"))

print(chikkar.find("将来"))

print(chikkar.find("不安"))

print(chikkar.find("結婚"))

print(chikkar.find("メンタル"))
```

```
[]
['ドクターコース', 'doctor course']
['入社']
['ポストドクター', '博士研究員']
['前途', '未来', '行く先', '行く末', '先行き', 'フューチャー', 'future']
['恐れ', '畏れ', '虞', 'おそれ', '不安感', '懸念', '危惧', '心配', '気掛かり', '憂慮']
['婚姻', '入籍']
['mental', '精神的']
```

うーん、同義語のせいで不安な単語を入れたら不安を煽る単語が沢山出てきた(泣)

対義語検索ライブラリ欲しい...
Rubocopエラー「Useless assignment to variable」の解決例


## Rubocopエラー「Useless assignment to variable」の解決例

上記エラーを調べると、「使っていないローカル変数の定義がある」というエラーのようで
削除すれば解決するとの事でした。

しかし、今回はちゃんと使っている内容で、書き方の問題のようでした。
以下のように、if文などの後に*明示的に使用している記載が必要*とのことでした。


```ruby
  def sampe(引数)
    price = if 条件1
               '¥-'
            elsif 条件2
               表示させる内容
            else
               表示させる内容
            end
  end

```

```ruby
  def sample(引数)
    price = if 条件1
               '¥-'
            elsif 条件2
               表示させる内容
            else
               表示させる内容
            end

    price
  end

#priceをしっかりと明示させる

```
We're sorry, but something went wrong. If you are the application owner check the logs for more information. の対処方法

#エラー内容

Heroku へデプロイをした後、URLにアクセスしたら以下のエラーが発生しました。


![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232353939372f30663735636535362d303834352d343834352d333932642d3333383833303065626666662e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683153/b3714918-e756-d3b2-3d73-9f5da623ee9d.png)


#原因

様々な原因があるようですが、今回はデータベースの反映がされていなかったことでした。



#解決策

```
heroku run rake db:migrate
```

Heroku でのデータベースを起動することで解決。無事に画面が表示できました。

#参考

参考にさせていただきました。ありがとうございます。

https://qiita.com/hmmrjn/items/e2dff8036fbbd74f049a

https://qiita.com/umi_mori/items/7f5969da9dc482a2efb8
まともなファイルメーカー用WYSIWYGエディタを組み込む

![WYSIWYGEditor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68589/71406b52-18a8-f32e-9742-dcab2d6c7467.gif)

#アドオンのテキストがイケてない
ファイルメーカー19からアドオン機能が追加され、その中にテキストエディタが含まれていますが、ちょっと使った感じでもちょっと使うのをためらう感じだったので、まともに使えそうなサンプルを作ってみましたので紹介します。

データの保存は、入力時にリアルタイムでファイルメーカーに保存されるようにしています。

#追加した機能
標準アドオンとほぼ同じ機能を実現していますが、それに加えて以下の機能を追加しています。
主に画像埋め込みに関する機能です。

+ 画像のDrag&Dropによる追加
+ 埋め込んだ画像のサイズ変更
+ 埋め込んだ画像の配置変更


#カスタマイズについて
このサンプルの機能を再利用して、カスタマイズなどはご自由にどうぞ。
なるべくシンプルに実装したつもりですので、ある程度JavaScriptの知識があれば、内容は理解できるかと思います。

なお利用しているエディタライブラリは、Quill.js(https://quilljs.com) ですので、カスタマイズ等はQuillの情報を参考にすれば可能かと思います。
サンプルでは、標準アドオンのツールバーオプションを詳細にしたときとほぼ同等に設定してみました。

[サンプルファイルはこちら](https://1drv.ms/u/s!AntDEOnhZ3NOgptJlLkrTtfhwadqMA?e=qNncHA)
※要 Claris FileMaker 19
MLPerf Inference-Mobile。Resultsがほんの少ししかないが。。。

# MLPerf Inference-Mobile。Resultsがほんの少ししかないが。。。

https://mlcommons.org/en/inference-datacenter-10/
Mobileは、以下。
https://mlcommons.org/en/inference-mobile-10/

May 19, 2021 – Inference: Mobile
v1.0 Results


# いまデータがあるのは
わずかに3つしかない。(2021/05/27現在）

* MediaTek(Vivo S9 5G)
* Qualcomm(OnePlus 9 Pro)
* Samsung(Samsung Galaxy S21+ 5G SM-G996N)

# 大丈夫か
このままフェードアウトになるのだろうか。

# まとめ
特になし。ウォッチ中。
Flutter で build_runner を使い flutter pub run build_runner build をしたときに、 Failed to precompile build_runner:build_runner といったエラーが出る場合の対応

## 環境

ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H1030

Flutter: 2.2.0
build_runner: 2.0.2

## エラーについて

```zsh
$ flutter pub run build_runner build

Failed to precompile build_runner:build_runner:
../../../.pub-cache/hosted/pub.dartlang.org/analyzer-1.6.0/lib/src/error/best_practices_verifier.dart:1600:40: Error: Getter not found: 'topLevelVariable'.
      return kinds.contains(TargetKind.topLevelVariable);
                                       ^^^^^^^^^^^^^^^^
../../../.pub-cache/hosted/pub.dartlang.org/analyzer-1.6.0/lib/src/error/best_practices_verifier.dart:2024:23: Error: Getter not found: 'topLevelVariable'.
      case TargetKind.topLevelVariable:
                      ^^^^^^^^^^^^^^^^
../../../.pub-cache/hosted/pub.dartlang.org/analyzer-1.6.0/lib/src/error/best_practices_verifier.dart:2024:23: Error: Type 'dynamic' of the case expression is not a subtype of type 'TargetKind' of this switch expression.
 - 'TargetKind' is from 'package:meta/meta_meta.dart' ('../../../.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/meta_meta.dart').
      case TargetKind.topLevelVariable:
                      ^
../../../.pub-cache/hosted/pub.dartlang.org/analyzer-1.6.0/lib/src/error/best_practices_verifier.dart:2001:13: Context: The switch expression is here.
    switch (this) {
            ^
pub finished with exit code 1
```

## 対応

```
$ flutter packages pub upgrade
```

vscodeだと以下をクリックしてもできます
![pubspec_yaml___corona_bousai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18705/a2f311fc-64b3-b868-eda4-5b2da5cc7067.png)

## 参考

https://github.com/dart-lang/build/issues/1676#issuecomment-458056325
【FileMaker】ショートカットでFileMakerアプリを立ち上げるまとめ

iOSでホーム画面に設置したショートカットアイコンからFileMaker Goのアプリを立ち上げる流れをまとめておきます。

# FileMaker側の設定
FileMakerにURLで起動できる設定をしておきます。
[【FileMaker】ショートカットからFileMaker Goのファイルを開くときの設定](https://qiita.com/tyuma/items/4ed2338956ef7307aa39)

# ショートカット作成
ショートカットを作ってホーム画面におきます。
[【FileMaker】FileMaker Goアプリをわざわざ開けずにFileMakerアプリを立ち上げる](https://qiita.com/tyuma/items/751ab3c3f9a9ced8e2ca)

# 注意点
設定などをする上で、うまく動作させるための注意点です。
[【FileMaker】iOSショートカットアプリからFileMaker Goアプリを開くときの注意点](https://qiita.com/tyuma/items/2d4085a13a540646302d)

# トラブルシューティング
このほか、「さっきまでうまくショートカットが動いてたのに、動かなくなった！」ということがたまーにあります。
この場合は、以下の外部リンクから解決を探ってみるのもいいです。

[【解決】iOS13のiPhoneで「ショートカットが使えない場合の対処設定方法](https://teachios.com/ios13-shortcut-error-taisyo)
[ショートカットアプリが開かない](https://discussionsjapan.apple.com/thread/252354595)

デバイスを再起動すると、たいてい直ります。

# その他ショートカットやURL起動の使い道
ショートカットを作ったときに、単にタップするだけでない使い方もできます。
[【FileMaker】このお客さんの情報って、、、とiPhoneでFileMakerをすぐ閲覧したい](https://qiita.com/tyuma/items/4a08cb29daccfa2dba42)
[【FileMaker】連絡帳に仕込んだQRコードでFileMakerの顧客情報を閲覧する](https://qiita.com/tyuma/items/d5cbf3ce2c135b1278a6)
[【FileMaker】Siriも活用してFileMaker Goにあるアプリを活用しよう](https://qiita.com/tyuma/items/ef7975c9de47bada5d31)

では、FileMakerやショートカットのお悩み検索でここにたどり着いたあなたに解決の糸口の記事がありますように。
Ubuntuログイン後に画面が暗くなる問題への対処

# 事象
at Ubuntu 18.04 LTS
モニタを接続し**ログイン画面からログインした直後**、画面が真っ暗になる
**ssh接続したところノードは正常に動いている**

# 解決策
違うディスプレイを色々接続し、画面が映るかどうか確認する
**（物理的に解決）**

# なぜこれで行けたのか？推測
waylandとxorgというものがUbuntu18.04のグラフィックでは混在している。

Ubuntu公式サイトからの一次情報を見てみましょう：
>We have decided that we will ship Xorg by default, and that Wayland will be an optional session available from the login screen.

https://discourse.ubuntu.com/t/xorg-will-be-the-default-in-18-04-lts/3623


i.e. ログイン画面にはXorgが,それ以降はWaylandが有効になるというややこしい仕様になっています。
今回のケースでは、初めのモニタがXorgには対応していても、Waylandには対応していなかったため、
ログイン後にXorg→Waylandへの切り替わりで画面が映らなくなったものと考えられます。

とはいえ、モニタの設定を変えるのは面倒なので、片っ端からモニタを変えて試してみた。

注）GUIでいじることが通常ないクラスタ環境でのみ有効な解決策です。
postgresql の dump で特定のテーブルを除きたい場合

```
pg_restore -l latest.dump > restore.pgdump.list
```

エディタで restore.pgdump.list を開いてインポートしたくない行の前に [;]を付けて保存

```
pg_restore --verbose --clean --no-acl --no-owner -h localhost -d hogehoge -L restore.pgdump.list latest.dump
```
個人的Railsメモ

# モデル

### 複数形がない英単語の対処法

ActiveSupport::Inflectorに個別設定を追加する。

`config/initializers/inflections.rb`

```ruby
ActiveSupport::Inflector.inflections do |inflect|
  inflect.singular /^(campus)(es)?$/i, '\1'
  inflect.plural   /^(campus)$/i, '\1es'
end
```

# ビュー

## フォーム

### 複数のチェックボックスのラベルはどう書くか

結論：②の方が良さそう。

#### ①labelで囲む。

```erb
<% Table.all.each do |row| %>
    <label>
        <%= form.check_box(:child_ids, { multiple: true }, row.id, nil) %>
        <img src="<%= asset_path(row.file_path) %>" alt="<%= row.name %>">
    </label>
<% end %>
```

#### ②値をシンボル化する

```erb
Array.each do |value|
    form.radio_button(name, value.to_s.to_sym)
    form.label("#{name.to_s}_#{value.to_s}".to_sym)
end
```
AWS SAAのオンライン試験を受けた感想

2021年5月27日にAWSのSAAのオンライン試験を受けたので、オンライン試験の感じと試験内容で感じたことを書いていこうと思います。

# オンライン試験について
最近は自宅からオンライン受験出来るようになっており、今はオンライン受験だと一度落ちてももう一度無料で受けられるキャンペーンやってたのでオンラインで受けました。

## 試験日
オンラインで24時間受けられるらしいですが、私が受験しようとした時は平日の午前中しか空いていませんでした。
受験のやり取りを日本語か英語のどちらか選べるのですが、こちらを英語にすればもしかしたら時間の選択肢が増えるのかも。。

## オンライン受験（準備）
予約した時間の30分前から試験の準備が開始できます。スマホで自撮りと試験を受ける机の前後左右の写真を送ります。この辺の指示が一部英語だったりちょっと手間取りました。10分くらいかかりました。

この操作が終わったら試験の人がログインするまで待機（15分前にくるみたい）
向こうは基本チャットで、こっちは音声とチャットの両方使ってやりとりしました。

受験ルールには机に飲み物も置くなと書いてましたが、ラベルのついてない物は置いていても良いらしいです。この辺は試験管に相談すれば柔軟に対応してもらえそうに感じました。

## オンライン受験
試験が開始されたら特にオフラインと変わらず進めます。普通に受けてる分には特に何も言われませんでした。

## 今後もオンラインで受けるか？
スケジュール次第でオンラインかオフラインのどちらかを選ぼうと思います。
オンラインは出歩かなくても良いんですが、自宅の試験環境用意したり、パソコンの余計なアプリ落としたりが面倒なのともしネット環境が落ちたり、何かしらの問題が発生するとその時点で失格の可能性もあるのでちょっと怖いなと。

そもそも試験会場が家から10分くらいのところにあるので準備の時間を比較すると言うほど時間が変わらない。

# 試験内容について
参考書使ったりしましたが、一番役に立ったのはUdemyで買った教材でした。（AWS　認定ソリューションアーキテクト アソシエイト模擬試験問題）
最新のものを使いましょう。以前は出来なかったことが出来るようになったり、逆に廃止されたものなどがある為です。（EBSの共有がボリュームタイプによっては出来るようになってたり、スケジュールドリザーブドインスタンスが廃止されてたり）私が買った教材はアップデートしてくれてました。

正解だけじゃなくて、なぜ他は不正解かも理解出来ると良いです。
合格はしましたが、個人的には不安な問題も多かったのでこの教材だけでなく実際に対象サービスをいじることもした方が良かったなと思いました。実務経験があったから何とかなりましたが、もし使ったこと無い人は触っておいた方が良いです。コンソールから眺めるだけでも理解度は違うかなと。

## 試験時間

ギリギリまで時間使いました。140分という試験時間で、１２０分で一通り完了しました。
わかりやすい正解が無いものが多くて、コスト重視なのか安全性重視なのか、案税制重視よりのコストも重視するのかみたいな問題もあるので結構悩みました。

# 終わりに
個人的には思ってたよりかなり難しかったです。
サービスごとにそこそこ深い知識が求められます。

そういう意味ではAWSについて詳しくなれたし、その証明も出来るから良い資格なんじゃないかと思いました。
AWSを使用する上で役に立ちそうなので、またAWSの別の試験勉強もしようと思います。
Rosettaも使う人のM1 Macの環境整備Step2 (ObsPyのインストール）





## はじめに
M1 MacにObsPyをインストールする手順です。
最初にやった環境整備については[こちら](https://qiita.com/PenguinHakese/items/1e2acf2f7586ac74661b)を読んでください。

参考にしたサイト：
https://zenn.dev/osuzuki/articles/380be0f682d72d
https://oku.edu.mie-u.ac.jp/~okumura/macosx/m1.html

##ObsPyのインストール
minicondaを使ってObsPyの仮想環境を構築します。

```
conda create -n obspy python=3.8
```

pythonを3.8にしたのは3.9だとjupyter notebookがうまく起動できなかったためです。

仮想環境をつくるとターミナルのプロンプトのところに(base)とでるようになるので、

```
conda config --set auto_activate_base false
```

 とタイプすると次に起動する時から表示されなくなります。

condaの環境が動いている時はまず

```
conda deactivate
```

で今起動している環境を停止します。

改めて

```
conda activate obspy
```

で先ほど作った環境を起動します。

ObsPyをインストールします。

```
conda install -c conda-forge obspy
```

numpy, matplotlibはanacondaをインストールした時に一緒に付いてくるみたいです（多分）。

必要に応じてその他モジュールをインストールします。

```
conda install jupyter
conda install pandas
```

[Step3ではTensorflow, kerasをインストール]()します。<--まだリンクつながっていないです。
§２　“5G”の基礎知識

**【5Gは「一強独占のインターネット型のビジネスモデル」を変える】**
インターネット型ビジネスは、No1企業（GAFA、BAT等）が圧倒的に強いが、５G型ビジネスは複数の企業が役割分担・連携してサービス提供するビジネスモデルである。

##1. “５G”で「何ができるか？」
####"インターネット”で出来なかったことが“5G”で出来る。
####  a)５Gの基本仕様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/06e6a0dc-fd94-a21b-8cde-1b4ba08f4a93.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/d8f420c2-9f52-837c-0192-cbb8c187d993.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/9e8a4f1e-ff7e-1bda-0a1c-be0813bf399c.png)

####  b) “超高速”“超低遅延”“多数同時接続”の実現の仕方
#####❶スライシング、❷ MEC、❸ローカル５G を使って実現する！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/26f13f54-0dd9-2ad6-32f2-f8e03a727f7a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/2d1bd873-eb21-1cb2-d8cb-250d1a88a8e4.png)

##2. “５G”に「いつ着手するか？」
####  a)５Gサービスの”ロードマップ”
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/343b4a2a-0179-d751-d249-4438fb70fe7a.png)
####  b)2030年までのデジタル化動き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/3a272783-3eec-c7db-4297-1c4172dbd548.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/5f5ca156-dd19-95fe-23a1-f542dba2b3b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/3a517bab-e666-4aca-52da-63d16e8c3d1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/3a86d1f8-7327-3e40-57c1-c6465b46bc44.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/a9160063-8f11-cb5d-2878-8902189595ec.png)
##3. “５G”の 「ビジネス・モデル」
**■米国、中国のICTビジネスモデルが参考にならない“５G”**
**■日本のビジネス・モデルを、欧米が参考にする！？**
####  a)“一強が独占するICTビジネス”を変える ５G のビジネス・モデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/09b45a94-aaa7-29bb-2266-8421bd0ef1de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/d0b50594-5a48-29aa-9ac2-d88257e7484d.png)
####  b)「オプト・アウト」と「オプト・イン」 って何？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/b7848334-9945-fbf1-b3cc-c1089f3fddb3.png)





＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
（関連するコンテンツ）
【DXを企画・実行する為の基礎知識】
[§１　デジタル市場の分析の仕方](https://qiita.com/masaaki-murakami/items/d362bfe2d78813211526)
[§２　“5G”の基礎知識](https://qiita.com/masaaki-murakami/items/baf19b291bc75f847caa)
§３　ケース・スタディ
[1) モビリティ](https://qiita.com/masaaki-murakami/items/7c07155ee267889855b7)
[2) ロジステック](https://qiita.com/masaaki-murakami/items/b1923672fd09689f6831)
3) 医療
4) 建設・土木
5) 農業
6) 社内ネットワーク
git-svnオフライン実験環境構築メモ

# 概要

ローカルに実験環境を構築する。
Windows PC1台で完結させる。
後半の詳細は下の記事を参照。記事が消えてしまったときのために、実行したコマンド等のメモは残しておく。

https://qiita.com/HAMADA_Hiroshi/items/2d48f12f53292c9487d8

- 環境
    - Windows 10
    - Subversion 1.13.0
    - Tortoise SVN 1.13.1
    - Git 2.18.0.windows.1

- 手順
    1. Subversionのローカルリポジトリを作成
    1. svnserveを起動
    1. git-svnでSubversionのローカルリポジトリをclone

## Subverion ローカルリポジトリ作成

```bat
cd f:\test

@REM ローカルリポジトリ作成
svnadmin create test_rep

@REM trunk作成
mkdir trunk
svn import trunk file:///f:/test/test_rep -m "create trunk"
rmdir trunk

@REM 試しにチェックアウト
mkdir work
cd work
svn checkout file:///f:/test/test_rep/trunk
```

- `file:///`のスラッシュは3つ必要であることに注意
    - `file://<host>/<path>`の`<host>`が省略されているのでスラッシュ3つ
    - 参考:[「file:///」でスラッシュが3つ並んでいる理由 - 小粋空間](https://www.koikikukan.com/archives/2012/05/14-000300.php)
- ドライブ指定`f:/`のスラッシュは必要(なしだとcheckoutに失敗した)

## svnserve

git-svnで`file:///`形式のURLのリポジトリをcloneしようとしてもできなかった。

```bat:失敗例
> git svn clone file:///f:/test/test_rep
Initialized empty Git repository in D:/test/gsvn/test_rep/.git/
Can't create session: Unable to connect to a repository at URL 'file:///f:/test/test_rep': Unable to open repository 'file:///f:/test/test_rep' at C:/Program Files/Git/mingw64/share/perl5/Git/SVN.pm line 148.
```
svnserveを介して`svn:`形式のURLでアクセス可能になる。
svnserveを起動する。`--root`のパス指定に`file:///`は不要。

```bat
svnserve -d --root f:/test/test_rep
```

参考: [git-svnでfile:///形式のリポジトリを連携する - Qiita](https://qiita.com/HAMADA_Hiroshi/items/2d48f12f53292c9487d8)

## git-svnでclone

```bat
git svn clone svn://localhost
```

## git-svnでdcommit

svnserve側で認証設定をしないと書き込み権限がないのでdcommitはできない。
試していないので情報のみ記載。

> svnserveの認証で失敗しているので、configファイルを作って認証なしで書き換え（write）可能となるように編集します。
本当はユーザ／パスワードを設定できるらしいのですが、今回はローカルのサーバなので割愛。
[git-svnでfile:///形式のリポジトリを連携する - Qiita](https://qiita.com/HAMADA_Hiroshi/items/2d48f12f53292c9487d8)

##
MySQL 指定したカラムがNULLのレコード情報をselectで表示する方法

# 目的

- MySQLにて指定したカラムがNULLのレコード情報をselectで表示する方法を毎回調べている気がするので個人メモとしてまとめる

# 方法

- NULLが期待されるカラムにNULLが入っているレコードの情報を出力したい場合は下記SQL文を実行する。

    ```sql
    select * from テーブル名 where NULLが期待されるカラム名 is null;
    ```

- NULL以外が期待されるカラムにNULL以外が入っているレコードの情報を出力したい場合は下記SQLを実行する。

    ```sql
    select * from テーブル名 where NULL以外が期待されるカラム名 is not null;
    ```

# 自分向け

- いい加減覚えろ、何回目だ。
Ubuntuインストール後Please remove installation media and rebootとなり先に進めない問題への対処

# 発生箇所
Ubuntu 18.04 LTSのインストール後の再起動

# 事象
```
Please remove installation media and reboot
|
```

となり、ブートメディアを取り出しても再起動ができないかった

# 対処
exitなどそれっぽいコマンドを試しまくっても解決しなかったが、
Ctrl+Cを押すと無事再起動した
FATAL ERROR: wasm code commit Allocation failed - process out of memory

node.jsのバージョン15にあげれば解決するらしいけど、どうしてもNode.jsのバージョン12で作業する必要があったので、その時のメモ。

```
vi ~/.zshrc
```

で下記を記入して、

```
export NODE_OPTIONS=--max_old_space_size=4096
```


あとは更新。

```
source ~/.zshrc
```

これで一応、エラーは回避できた。

これが良き方法かはわからないけど、とりあえずまぁ、このまま作業しようっと。笑
VS CodeによるWindows10上でのポータブルLua環境の構築

# 背景
会社支給のノートパソコンによっては管理者権限が与えられておらず、便利なアプリケーションも管理者権限無しでインストールする必要があります。
この記事ではLuaとVS Codeを管理者権限無しでインストールし、実際に使用出来るようにするまでを備忘録として残しています。

# 対象
Windows 10 64bit版

# 手順
## Luaのインストール
1. [LuaBinaries](https://sourceforge.net/projects/luabinaries/files/)から最新版のZIPファイルをダウンロードします。この記事を書いた時点ではlua-5.4.2_Win64_bin.zipでした。
2. ダウンロードしたファイルの中身を適当なフォルダに展開します。

## ポータブル版VS Codeのインストール
1. [VS codeのダウンロードページ](https://code.visualstudio.com/Download)からZIPファイルをダウンロードします。この記事を書いた時点ではVSCode-win32-x64-1.55.2.zipでした。
2. ダウンロードしたファイルの中身を適当なフォルダに展開します。

## 環境整備
### Lua
特に設定すべき事はありません。VS Code上でLuaを扱う場合、後述のCode Runner上でLuaの実行バイナリの指定を行うので、パスを通す必要もありません。

### VS Code
#### 日本語化
探せばVS Codeの日本語化の記事は簡単に見つかると思うので、割愛します。[^1]
[^1]: 手前味噌ですが、[こちら](https://qiita.com/hebereke/items/d4bff0ca22c114a91c71)とか。

#### Code Runnner Extensionの導入
Code RunnerはVS Code上で各種コードをお手軽に実行出来るようになる拡張機能です。

1. 左サイドバーから拡張機能を選択します。
1. Code Runnerで検索してインストールします。
1. Luaの実行バイナリパスを設定します。
    1. メニューから [ファイル] -> [ユーザー設定] -> [設定] を選択します。
    1. 「code-runner.executorMap」を検索し、```setting.json```でLuaの実行バイナリパスを指定します。
        
            ```json
            "code-runner.executorMap": {
                "lua": "C:\\lua542\\lua54.exe",
            }
            ```

# 参考文献
* [Code Runnerを使いこなす](https://qiita.com/take_me/items/6a1d2d417889837219d1)
【SwiftUI】Property Wrappers の変化に基づくメソッド実行方法

# 目的
　SwiftUI では Property Wrappers により画面要素やデータの変化を簡単に画面に反映できます。ここでは、Property Wrappers の変化に応じて、View の構造体に実装した処理（メソッド）を実行する方法を記載します。
＊ビジネスロジックはViewModelなどに記載することが基本だと思いますが、`画面の最上部までスクロールする`とか`画面を閉じる`などの処理を簡単に実装したいときに利用します。

# 実装例
## `@State`プロパティの変更を検知してメソッドを実行
Viewファイル内で、`@State`とそれに接続した`@Binding`プロパティを実装し、`@Binding`プロパティの`{set}`でメソッドを呼び出します。

```swift
// MARK: TabItemのタップを検知し、メソッドを実行する例
struct contentView: View {
    
    @State var tab: Int = 0
    
    var body: some View {
        let tabBinding = Binding<Int>(get: {
            self.tab
        }, set: {
            if $0 == self.tab {
                self.method()
            }
            self.tab = $0
        })
        
        TabView(selection: tabBinding) {
            TabView_1().tag(0)
            TabView_2().tag(1)
        }
    }
    
    private func method() {
        if self.tab == 0 { }
    }
}
```
参考：[3 Ways to React to @State Changes in SwiftUI](https://betterprogramming.pub/three-ways-to-react-to-state-changes-in-swiftui-a30545c72361)

## ViewModel側の処理結果に応じてViewを閉じる
　ここではモーダル遷移の例を示しますが、プッシュ遷移でも同様です。参考にしたサイトにプッシュ遷移の実装例があります。

```swift
// MARK: Child画面をChildのViewModelの指示で閉じる
struct Parent_View: View {
    
    @State var showChild: Bool = false
    
    var body: some View {
        Button(action: {
            self.showChild = true
        }, label: { Text("Go_Child") })
        
        Spacer().frame(height: 0).sheet(isPresented: $showChild) {
            let vm = Child_ViewModel(showChild: $showChild)
            Child_View(viewModel: vm)
        }
    }
}

struct Child_View: View {
    
    @ObservedObject var viewModel: Child_ViewModel
    init(viewModel: Child_ViewModel) {
        self.viewModel = viewModel
    }
    
    var body: some View {
        // something
    }
}

class Child_ViewModel: ObservableObject {
    
    // これは@Publishedで宣言してもいい（参考にしたサイトは@Publishedを使用していた）
    @Binding var showChild: Bool
    init(showChild: Binding<Bool>) {
        self._showChild = showChild
    }
    
    func dismiss() {
        self.showChild = false
    }
}
```

参考：[【SwiftUI】戻るボタンを使わずにコードで前の画面へ戻る方法（MVVMバージョン）](https://www.yururiwork.net/%E3%80%90swiftui%E3%80%91%E6%88%BB%E3%82%8B%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%89%8D%E3%81%AE%E7%94%BB%E9%9D%A2%E3%81%B8/)
プレースホルダ付きの UITextView を作成してみる

# ■ はじめに

![](https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2018/12/eyecatch-swift-960x504.png)

`UITextView` にプレースホルダを設定したかったので、やってみました。

以下の記事を参考にさせて頂きました。

- [UITextViewにプレースホルダーを設定できるようにする\(Swift4\) \- Qiita](https://qiita.com/uhooi/items/40059a1d987b64fd1aa7)
- [UITextViewでplaceholderを実装する（Swift） \- Qiita](https://qiita.com/Takeshi_Akutsu/items/66a24060fa026b4f41d1)

感謝 ♪♪♪

🙇‍♂️🙇‍♂️🙇‍♂️

# ■ コード

コードは、以下。

```swift:PlaceHolderTextView.swift
import UIKit

@IBDesignable class PlaceHolderTextView: UITextView {
    @IBInspectable private var placeHolder: String = "" {
        willSet {
            self.placeHolderLabel.text = newValue
            self.placeHolderLabel.sizeToFit()
        }
    }
    private lazy var placeHolderLabel: UILabel = {
        let label = UILabel(frame: CGRect(x: 6.0, y: 6.0, width: 0.0, height: 0.0))
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        label.font = self.font
        label.textColor = .placeholderText
        label.backgroundColor = .clear
        self.addSubview(label)
        return label
    }()
    override func awakeFromNib() {
        super.awakeFromNib()
        self.textStorage.delegate = self
    }
}

extension PlaceHolderTextView: NSTextStorageDelegate {
    func textStorage(_ textStorage: NSTextStorage, didProcessEditing editedMask: NSTextStorage.EditActions, range editedRange: NSRange, changeInLength delta: Int) {
        if textStorage.string.isEmpty {
            self.placeHolderLabel.font = self.font
            self.placeHolderLabel.alpha = 1.0
        } else {
            self.placeHolderLabel.alpha = 0.0
        }
    }
}
```

# ■ ラベルの文字色の設定

参考にさせて頂いた記事では、`UIColor(red: 0.0, green: 0.0, blue: 0.0980392, alpha: 0.22)` と設定されていたんですが…、何故か、ラベルが描画更新されなくて…。システムデフォルトの `.placeholderText` を設定すると描画が更新される様になりました。

# ■ `UITextView` へのテキストの変更のトリガー

参考にさせて頂いた記事で設定されているトリガーは、UI からテキストを変更した場合は、実行されたんですが、コードからの変更の場合は、実行されませんでした…。

調べたところ、以下の記事を見つけまして…

- [Observe ALL UITextView text change… \| Apple Developer Forums](https://developer.apple.com/forums/thread/649121)

`NSTextStorageDelegate` のメソッドを `extension` で追加しました。

```swift
extension PlaceHolderTextView: NSTextStorageDelegate {
    func textStorage(_ textStorage: NSTextStorage, didProcessEditing editedMask: NSTextStorage.EditActions, range editedRange: NSRange, changeInLength delta: Int) {
        if textStorage.string.isEmpty {
            self.placeHolderLabel.font = self.font
            self.placeHolderLabel.alpha = 1.0
        } else {
            self.placeHolderLabel.alpha = 0.0
        }
    }
}
```

`self.placeHolderLabel.font = self.font` は、`UITextView` のフォント設定が変更された場合、随時適用される様に、追加しました。

# ■ プレースホルダの設定

プレースホルダの設定は、UI からも設定出来ます。

![スクリーンショット 2021-05-27 13.21.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161939/0ab55e90-a214-14a6-c3b3-9b5dd08632ae.png)

# ■ ハマりポイント

- 上述しましたが…、ラベルの描画更新やテキストの変更検知のところで、結構ハマりました…。

- とりあえず、何とか設定できて良かったです ♪♪♪

😆😆😆

# ■ まとめ

参考になれば ♪♪♪

👋👋👋
Anaconda3でのproxy設定

Anaconda3でのproxy設定はAnaconda3フォルダ以下の.condarcで設定する。
参考
- [Anaconda3のプロキシサーバー設定方法：Windows10 + Powershell](https://qiita.com/teruroom/items/7d8c26dc07ddeae90be8)
- [proxyかんでる社内環境でpip/anacondaを動かすときに注意事項。](https://qiita.com/kitakrazy/items/af6c0fea17adef514ba8)

この方法を試してみたところうまく行かず、エラーになる。これはどうもurllib3の仕様変更せいらしい。

https://stackoverflow.com/questions/66642705/why-requests-raise-this-exception-check-hostname-requires-server-hostname


なので.condarcのプロクシ記述を

```python:旧urllib書式.condarc
proxy_servers:
  http: http://id:password@proxy.aaa.bbb.co.jp:8080
  https: https://id:password@proxy.aaa.bbb.co.jp:8080
```

ではなく

```python:新urllib3書式.condarc
proxy_servers:
  http: id:password@proxy.aaa.bbb.co.jp:8080
  https: id:password@proxy.aaa.bbb.co.jp:8080
```

とすれば良い。
Flutter環境構築で出がちなエラー集

# 前置き

Flutterの環境構築したときに80%くらいが（主観）陥ってるであろうエラーをまとめました。
これ以外にも色々とあると思うので、「これ出たけどこれやったら直ったよ」って方がいたら
編集リクエストしちゃってってください。
Flutterタグ見るに数が少ないので協力大事！

# まず動かなかったflutter doctorしてみる

まずはターミナルで

```
flutter doctor
```
でどこがまずいのか調べてみてください。
!マークや×マークのあるところが修正すべき箇所です。


# Exception in thred "main" java.lang.NoClassDefFoundErrorが出る

Javaのバージョンが要求されているものと違うから出ます。

```
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
```
これは最新のJAVA SDKを入れてないとなりました。
Java SDKをダウンロードして（オラクルのプロファイル登録してない人は登録して）
インストールしてパスを通せば直ります。
バージョンはSDK8がいいです。

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```
これをbashやzshに突っ込んどいてください。

参考：https://www.ninton.co.jp/archives/2723

#エミュレータ起動するときにUnable to locate adbが出る
エミュレータを起動するときに

```
Unable to locate adb
```

と出ることがあります。
これはAndroid Studioで
FileからProject Structureを選択して開く
Project SDKのとこをがNo SDKになっていた場合、
起動したいエミュレータと同じSDKに設定したら直りました。

# Android license status unknown.と出る。
これはターミナルでも書かれていますが

```
flutter doctor --android-licenses
```

を打てばたいていなんとかなりますが、JavaがAndroid Studioに適合してるバージョンじゃないと
上記のExceptionほにゃららというエラーが出るので注意してください。
クリアすれば利用規約に同意しますか的な文章が出てくるのでy/Nでyをひたすら打ってください。

参考：https://qiita.com/kenichiro-yamato/items/da617649a3ac94470b85

# Android StudioをアップデートしたらRunが出なくなった
これは私が稀代のウッカリ八兵衛だっただけかもしれないですが、
Android StudioをアップデートしたらFlutterのプラグインまで消し飛びました。
なので、プラグインからFlutterを再度インストールしてAndroid Studioを再起動してください。
github上のnpm packageをインストールする時の作業メモ

自社のgithub公開したpackageをnpmコマンドでインストールする時に挫折した為、Macでその辺りの作業注意点をメモする。

## github上に自社用パッケージを公開するメリット
1. 該当repoをチェックすることなく、toolsなどを簡単にnpm installで入力できて便利
2. バージョンアップする時も、同じくnpm updateすれば、最新版に更新される
3. 公開は社内に限定される

## インストールする前の準備

- githubのアクセストークンを作成
    - https://github.com/settings/tokens
    - `Select scopes`で必要最低限の権限を付与
        - `repo`をチェックON
        - `write:packages`の`read:packages`をチェックON
    - Enable SSO

- 生成したトークンを何処かにコピー

- ターミナルからnpmでgithubをログイン
    - Usernameにgithubのユーザ名を入力
    - Passwordに`CMD＋V`でトークンを貼り付けてEnterキー押下
    - Emailに個人のメールアドレスを入力
    - `Logged in as userHoge to scope @hoge-company on https://npm.pkg.github.com/.`が表示された成功

```shell
npm login --scope=@hoge-company --registry=https://npm.pkg.github.com
```

## インストール

- 対象パッケージをグローバルにインストール

```shell
npm i -g @hoge-company/hoge-tool
```

- シェルに反映

```shell
exec $SHELL -l
```

- 確認

```shell
hoge-tool
```

## .npmrcファイル

- npm loginで指定されたregistry情報がこのnpm設定ファイルに入る

```conf
@hoge-company:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=xxxxxxxxxxxxxxxxxxxx
```

- npm logoutでやると、上記内容が.npmrcから消える

```shell
npm logout --scope=@hoge-company --registry=https://npm.pkg.github.com
```
PythonでAWS S3のバケット内のファイルをすべてダウンロードする方法

# 動作環境
* python 3.9

# Boto3のインストール
```shell
pip install boto3
```

# 前準備
[ドキュメント](https://pypi.org/project/boto3/)を参考にAWSのアクセスキーなどを設定する。
アクセスキーを設定しなくてもpythonのコード内に記載し、アクセスすることもできる。


# コード例

├── main.py
└── objects


```python:main.py
from boto3.session import Session


def download_objects():
    # 上記の前準備でアクセスキーなどの設定をしなかった場合に必要。
    session = Session(aws_access_key_id='アクセスキー',
                      aws_secret_access_key='シークレットキー',
                      region_name='リージョン名')

    s3 = session.resource('s3')
    bucket = s3.Bucket('s3のバケット名')
    image_objects = bucket.objects.all()
    for image_object in image_objects:
        # 第2引数に保存先のパスを指定します。
        bucket.download_file(image_object.key, f"./object/{image_object.key}")


if __name__ == '__main__':
    download_objects()
```
§１　デジタル市場の分析の仕方

**【ガートナー/ハイプサイクルを活用した分析】**
ガートナー / ハイプサイクルは、様々なICT技術を同じグラフ上で一目で比較する事ができる便利なツールであるが、あくまでもICT用語の流行を分析したもので、サービス・製品の事業性の検討に使うには更なる分析が必要である。



##１．ガートナー / ハイプ・サイクルの活用の仕方
####  a) ガートナー / ハイプ・サイクルとは？
**ガートナーが提供する ”IT 業界における流行り言葉について市場での注目の推移を説明する” モデル**　　Hype（ハイプ）は、“誇大な宣伝によって人が夢中になったり盛り上がったりする”といった意味を持つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/aa55ea06-0524-fba7-90e0-f118ab99ae51.png)
**【ハイプ・サイクルのフェーズの意味】**
**黎明期：**技術革新によって幕が開く。初期の概念実証(POC) にまつわる話やメディア報道によって、大きな注目が集まる。多くの場合、使用可能な製品は存在せず、実用化の可能性は証明されていない。
**過度な期待のピーク期：**初期の宣伝では、数多くのサクセスストーリーが紹介されるが、失敗を伴うものも少なくない。行動を起こす企業もあるが、多くはない。
**幻滅期：**実験や実装で成果が出ないため、関心は薄れる。テクノロジの創造者らは再編されるか失敗する。生き残ったプロバイダーが早期採用者の満足のいくように自社製品を改善した場合に限り、投資は継続する。
**啓発期：**テクノロジが企業にどのようなメリットをもたらすのかを示す具体的な事例が増え始め、理解が広まる。第2世代と第3世代の製品が、テクノロジ・プロバイダーから登場する。パイロットに資金提供する企業が増える。ただし、保守的な企業は慎重なまま。
**生産性の安定期：**
主流採用が始まりる。プロバイダーの実行存続性を評価する基準がより明確に定義される。テクノロジの適用可能な範囲と関連性が広がり、投資は確実に回収されつつある。

####  b) ハイプ・サイクルで注意すべき事
ハイプ・サイクルを活用するときに注意すべき点は次の二つ

**❶ハイプ・サイクルは誤解が多い**
**❷ハイプ・サイクルで、サービス、製品の市場性の比較はできない**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/e87e048e-d578-ec88-877c-addca18d481e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/b86413ec-91e7-5a44-818e-74a9734d423d.png)


####  c) 分析の仕方
次のSTEPで分析をする
**STEP1　「ハイプ・サイクル」を「ライフ・サイクル」に置き換える**
**STEP2　市場規模を分析する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/89730012-cd87-b478-9de7-c0a12eff003e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/3c54ed3c-9a2e-be88-da9b-d9b5acf94c14.png)

##２．分析例
RPAと5Gの市場性の比較

####①ライフサイクルでのポジションの比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/5dc86575-c0f6-d2ef-957c-8922172b01e4.png)
####②市場規模の比較例
5Gの“関連サービス”の市場規模が圧倒的に大きい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/40b6bf9e-c353-88b4-6067-c978de0dd9dd.png)
####③RPAと5Gの市場性の比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/b7ccba61-327c-5a1b-9f2e-564b689a4f71.png)

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
（関連するコンテンツ）
【DXを企画・実行する為の基礎知識】
[§１　デジタル市場の分析の仕方](https://qiita.com/masaaki-murakami/items/d362bfe2d78813211526)
[§２　“5G”の基礎知識](https://qiita.com/masaaki-murakami/items/baf19b291bc75f847caa)
§３　ケース・スタディ
[1) モビリティ](https://qiita.com/masaaki-murakami/items/7c07155ee267889855b7)
[2) ロジステック](https://qiita.com/masaaki-murakami/items/b1923672fd09689f6831)
3) 医療
4) 建設・土木
5) 農業
6) 社内ネットワーク
Excel countif関数でクロス表を作るときに注意すべきこと

#概要
下の表①からクロス表を作る方法

###表①

| ID | 性別 | 年齢 |
|:-:|:-:|:-:|
|A1|男性|35|
|A2|女性|33|
|A3|男性|22|
|A4|男性|45|
|A5|女性|27|
|A6|男性|51|
|A7|女性|35|

###できたクロス表

|性別/年齢|30歳未満 | 30歳以上 |合計|
|:-:|:-:|:-:|:-:|
|男性|1|3|4|
|女性|1|2|3|
|合計|2|5|7|

##やらかしたミス

条件を指定して数を数えるにはcountif関数が有効です
しかし、いきなりこのクロス表に下のように入力すると

|性別/年齢|30歳未満 | 30歳以上 |合計|
|:-:|:-:|:-:|:-:|
|男性|=COUNTIF(A:C,AND(B:B=男性,C:C<30))|||
|女性||||
|合計||||

###結果
|性別/年齢|30歳未満 | 30歳以上 |合計|
|:-:|:-:|:-:|:-:|
|男性|0|||
|女性||||
|合計||||

このようにエラーこそ出ませんが
正しい値は出てきません

理由はそもそもcountif関数の入力方法が間違っています
countif 関数は 指定した範囲で条件に当てはまるものを数えるのですが
項目(B:BやC:C)の指定はできません

###正しい使い方
countif(B:B,"男性")　これでB列の男性というセルの数を出力します
この例でいうとB:Bは探す範囲です
後ろの"男性"の部分には検索範囲を入れてはいけません

#正しい手順
まずcountif関数では複数条件で数えることができません

そのため、まずクロス表のセルごとに計算します
表①の年齢の右に
==IF(B2="男性",IF(E2<30,"M_U","M_O"),IF(E2<30,"W_U","W_O"))を入力します

これでその行の人物がクロス表のどこに当てはまるかを表しています
>M_U:男性で30歳未満(ManとUnder)
M_U:男性で30歳以上(ManとOver)
W_U:女性で30歳未満(WomanとUnder)
W_U:女性で30歳以上(WomanとOver)

その後にクロス表のセルにcountifで対応したものを入れれば完成です！
合計の部分はsum関数で！

|性別/年齢|30歳未満 | 30歳以上 |合計|
|:-:|:-:|:-:|:-:|
|男性|=COUNTIF(D:D,"M_U")|=COUNTIF(D:D,"M_O")|=sum()|
|女性|=COUNTIF(D:D,"W_U")|=COUNTIF(D:D,"W_O")|=sum()|
|合計|=sum()|=sum()|=sum()|

#さいごに
今回はcountifでクロス表を作りたいときに起こりがちなミスを解説しました
検定で使うこともあると思うので、調べる手間を省きましょう！
プログラミング覚え書き

db コンテナにログイン　→　データベースの設定

MySQL にログイン
mysql -u myappuser -p myapp

## SQLの記法
CREATE TABLES テーブル名(
カラム名　データ型,
カラム名　データ型,
);

##　クエリメモ
- レコードの挿入（レコードはidで区切られる横の行のこと）
- INSERT INTO テーブル名　(カラム名) VALUES (データ);

###SELECT(抽出して、ターミナルに表示できる)
- SELECT * FROM テーブル名; （全てのレコードを抽出）(レコード,,,idで区切られる横の行)

- SELECT カラム名1,カラム名2　FROM テーブル名;

- SELECT * FROM テーブル名 WHERE 条件;(条件を満たすレコード(id区切り行)を抽出)

##SQLのデータ型の指定
- 整数　　INT 
- 実数　　DECIMAL(固定小数点)、FLOAT(浮動小数点)
- 文字列　CHAR(固定長のデータ) 、VARCHAR(文字数がバラバラ) 、TEXT（文字数がバラバラ）
- 真偽値　BOOL（TRUEかFALSE）

- PRIMARY KEY という指定をすると、レコードを一意に特定するためのカラムに設定できる
- 主キーにしておくと、 id の値をうっかり入れ忘れたり、値が重複していたときにエラーにしてくれる
- id INT NOT NULL AUTO_INCREMENT,（主キーの連番を自動で振る）

##PDOを使ってPHPからSQLにアクセス
- PDO (PHP Database Objects)
- PHPでデータベースを扱うオブジェクト
- DSNとuser名とpasswordを設定する
- オブジェクト,,,クラスのインスタンス、値に名前を付けたデータ
- クラス,,,テンプレート

- インスタンス,,,テンプレートからできたオブジェクト
- new クラス名、でクラスから値(インスタンス)を作る。
- PDOはすでにクラスが定義されている。

new PDO(←クラス名)(
\\DSN(data source name)
データベースの種類(mysql):host=セットアップされたマシン名(ホストを指定);マシン名name=扱っていくデータベース名;文字コードの設定(charset=utf8mb4),
user名,
password,
);

##PHP
- 定数　define('定数名', 値);

- 変数　$変数名（クラスの中で定義すると、プロパティという）

##PHP用語
- メソッド  クラスの中で定義した関数

- アロー演算子,,,その左辺にクラスのインスタンス、右辺には左辺のクラスが持つプロパティやメソッドを指定。
- $instance -> プロパティ(値)
- インスタンス(左)からプロパティ、メソッド(右)を取り出す
- プロパティを取り出すときには、format()などのメソッド(関数)を使える。

-private,,,アクセス修飾子。メソッド(関数)に付け、あるクラスの中でしか使えないようにできる

- try catch,,,例外的な処理は別のところでまとめて書くというテクニックで使う。
1. 例外的なケースが発生→throw new Exception();
2. ↑Exceptionクラス(あらかじめPHPに組み込まれているクラス)のインスタンスに投げる。
3. 例外が発生しそうな箇所をtry{例外出そう}で囲う↓
4. 引数名をExceptionにしたcatch{Exception}でExceptionクラスのインスタンスを受け取る。
5. どのように対処したいかを catch() のほうに分けて書く。

##ビルトイン関数
- あらかじめ PHP に組み込まれている関数
- strlen(),,,文字列の文字数を抽出
リバーシの操作（斜め）

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_pincerattack_step4
変なところで詰まった。

「置いた後の斜めにひっくり返す処理」で混乱してしまったのだ。

```java
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        int h, w, y, x;
        String[][] map;

        Scanner sc = new Scanner(System.in);

        h = sc.nextInt();
        w = sc.nextInt();
        y = sc.nextInt();
        x = sc.nextInt();

        map = new String[h][w];

        for(int i=0; i<h; i++){
            String temp = sc.next();
            for(int j=0; j<w; j++){
                map[i][j] = String.valueOf(temp.charAt(j));
            }
        }
        //_____ここまで初期化______
        
        for(int i=-1; i <= 1; i+=2){
            for(int j=1; ; j++){
                
                if(x+(i*j) == -1 || x+(i*j) == w || y+(i*j) == -1 || y+(i*j) == h){
                    break;
                }
                
                if(map[y+(i*j)][x+(i*j)] == "*"){
                    for(int k=) //うーん？
                }
            }
        }
        
        map[y][x] = "*";
        
        //_____ここから表示_______
        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){
                System.out.print(map[i][j]);
            }
            System.out.println("");
        }
    }
}
```

お手本だとこう。

```C++
            if(S[Y-(i*j)][X+(i*j)] == '*'){
                for(int k = min(X+i*j,X); k <= max(X+i*j,X); k++){   //maxとmin...
                    S[Y+X-k][k] = '*';
                }
                break;
            }
```

C++だとmaxとminが使えるらしいが、C++をよく知らない。
頭回ってないので備忘録としておいておく。
cudaとpytorchのインストールで気をつけるべきこと

#背景
先日cudaとpytorchの環境を導入しようと思ったのですが，全くうまくいきませんでした．
うまくいかなかった原因に気づけたので，ここでシェアできたらと思い投稿させていただきます．

#目次
[1.失敗したことについて](#1-失敗したことについて)
[2.環境の再構築](#2-環境の再構築)
[3.おわりに](#3-おわりに)

#1. 失敗したことについて

環境構築の際，見様見真似で構築してしまってのが原因です

````
torch.cuda.is_available()
````

で確認したところFalse値が返ってしまい，cudaが認識されていませんでした．この時犯していた過ちが2つあり，

- cudaの入れるバージョンが間違っていた（最新の11.3を入れていた）
- pytorchをanacondaのGUIで入れたため互換性がめちゃくちゃだった

この２つが主な原因だと思われます．
これらを踏まえ環境を構築し直しました．

#2. 環境の再構築
まずpytorchを入れることからやり直しました．
https://pytorch.org/get-started/locally/
をみてcondaのコマンドを実行しました．
パッケージインストールは全てcondaで行なったほうが良いです．互換性の問題を考えなくて済みます．

pytorchをインストールしたら次に適合したバージョン（ここでは10.2）のtoolkitをダウンロードし，インストールします．この時入れてしまったバージョンは確認しなくて良いです．

インストールが終わったらcudaのpathを確認します．

![スクリーンショット 2021-05-27 123443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721767/54c5b18d-4f1d-ca1e-c4ec-3e261e7819aa.png)

CUDA_PATHがpytorchに合ったものになっていたら成功です．
合っていなかったら書き換えてください

#3. おわりに
````
conda install [packeage]
````
が超重要であることがわかりました．
All About ACS: Application Package - May 2021 の更新

# Application Package - May 2021 の更新
ODBC などプラットフォーム固有の機能を提供する ACS Application Package ですが、May 2021 の更新が提供されました。

 * [IBM i Access - Client Solutions 5733XJ1](https://www.ibm.com/support/pages/ibm-i-access-client-solutions-5733xj1)

Window、Linux、Mac、PASE と4つの環境用のApplication Packageがありますが、すべて更新されています。

> 
**Windows Application Package last updated May 2021 (Latest Updates)**
The next available update is planned for March 2022
Features include: ODBC, .Net, and OLE DB, AFP printer driver, (Readme, More info)
ESS Service Pack Level = LCD8-2011-14
>
**Linux Application Package last updated on May 2021 (Latest Updates)**
The next available update is planned for March 2022
Features include: ODBC, Programming Toolkit, (Readme, More info, Installation and usage guide)
ESS Service Pack Level = LCD8-2012-14
>
**Mac Application Package last updated on May 2021 (Latest Updates)**
The next available update is planned for March 2022
Features include: ODBC, Programming Toolkit
>
**PASE Application Package last updated on May 2021 (Latest Updates)**
The next available update is planned for March 2022
Features include: ODBC, Programming Toolkit

ESS Service Pack Level が、Windows と Linux で「-14」と書いてあるけど、下記での詳細リンク内では「-15」です。

各々の詳細内容は、下記のリンクをご覧ください。

Windows 以外で本文中に、下記の記載がありますが、「**2021**」ですね。

>Version: 1.1.0.15
Build Date = May **2020**

## Windows Application Package の更新

* [IBM i Access - ACS Updates for Windows](https://www.ibm.com/support/pages/ibm-i-access-acs-updates-windows)
* 
## Linux Application Package の更新

* [IBM i Access - ACS Updates for Linux](https://www.ibm.com/support/pages/ibm-i-access-acs-updates-linux)

## Mac Application Package の更新

* [IBM i Access - ACS Updates for Mac](https://www.ibm.com/support/pages/ibm-i-access-acs-updates-mac)


## PASE Application Package の更新

* [IBM i Access - ACS Updates for PASE](https://www.ibm.com/support/pages/ibm-i-access-acs-updates-pase)

## 入手先

4 種類プラットフォームに応じた Application Package が下記からダウンロード可能です。
ただし、Windows Application Package は、英語 64 ビット版のみです。

* [Download IBM i Access Client Solutions](https://www-01.ibm.com/marketing/iwm/platform/mrs/assets?source=swg-ia)

32 ビット版の Windows Application Package や日本語版が必要な場合(英語版でも ODBC 登録画面が英語になるだけで、日本語データ処理には問題ないのですが)は「[ESSからダウンロード](https://qiita.com/6onoda/items/dfac8d44e791801e49fe)」してください。


## 次回は March 2022
Application Package の次回の更新は March 2022 が予定されています。

***
2021-05-27 作成
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
Wordpressのログイン画面のセキュリティ強化（個人メモ）

## CAPTCHAを使用してボットやスパムからWordPressサイトを保護

### ステップ1：WordPress CAPTCHAプラグインをインストール＆有効化する

Wordpress管理ツールから「 Google Captcha（reCAPTCHA）by BestWebSoft 」を探して、インストールします。

プラグインの有効化を忘れず

### ステップ2：自分用のGoogle reCAPTCHAを作成してサイトに追加する

[Google reCAPTCHA管理コンソール](https://www.google.com/recaptcha/admin/create)に移動して、登録フォームに必要事項を入力します。

v2またはv3からreCAPTCHAを選択でき、チェックボックスまたは非表示のテストが使用できます。

すべてのフィールドに必要事項を入力したら、「送信」ボタンをクリックします。次の画面で、「サイトキー」と「シークレットキー」が表示されます。

WordPressサイトのCAPTCHAプラグインにある設定画面から、この両方を入力します

### ステップ3：設定を調整して脆弱なエリアを保護する

ログインページは、ブルートフォース攻撃、クロスサイトスクリプティング（XSS）攻撃に狙われます。

Google Captchaプラグインを使用してCAPTCHAを追加するには、Google Captcha >「Settings」>「General」>「Enable reCAPTCHA for」を有効にし、「WordPress Default」の「ログインフォーム」を選択します。

サイトログインが失敗すると、パスワードをリセットできるページへと誘導されることがあります。CAPTCHAを追加してこのページを保護するには、Google Captcha >「Settings」>「General」>「Enable reCAPTCHA for」から、WordPressダッシュボードを対象範囲に含めます。

[参考資料](https://kinsta.com/jp/blog/wordpress-captcha/)
[Rails6]created_atを利用して日本の日付，時刻を自由に表示する。

#概要
チャット機能にチャットを送った日付と時刻を表示したいと思い調べてわかった事を以下にまとめます。
初学者故，至らぬところがあるかと思いますので，訂正がある場合は教えていただけると幸いです。
##環境
ruby 2.6.3
Rails 6.0.3
##結論:strftime("%Y-%m-%d %H:%M")を利用すれば解決。
 strftimeメソッドは***日時データを編集して文字列に変換***するメソッドです。
 実際に使っていきましょう！
###その前に
create_atの時刻はUTFが基準になっているので日本時刻に合わせていない方はconfig/application.rb内に`config.time_zone = 'Tokyo'`を追加すればOKです。サーバの再起動は忘れずに。

```ruby:config/application.rb
require_relative 'boot'

require 'rails/all'

module SampleApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
    config.time_zone = 'Tokyo' #<--ここに追加！
  end
end

```
###strftime("%Y-%m-%d %H:%M")を使ってみる。
チャット用テーブルをpostsテーブルとしているので利用するインスタンスは`@post`とします。
以下のように記述することで綺麗に書くことができます。

```ruby
 @post.created_at
 #2021-05-27 11:02:16 +0900と表示される

 @post.created_at.strftime("%Y-%m-%d %H:%M")
　#2021-05-27 11:02と表示される
```
###%Y-%m-%d %H:%Mとはなんなのか？
実は%Y,%mなどは個別に与えられた意味があります。以下に記しておきます。
(参考URL:https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html)
***%Y:西暦を表す***
***%m:月を表す数字(01-12)***
***%d:日(01-31)***
***%H:24時間制の時(00-23)***
***%M:分(00-59)***

したがって上記のコードを訳すとするなら

```ruby
@post.created_at.strftime("%Y-%m-%d %H:%M")
  #@postのcreated_atの情報のうち%Y,%m,%d,%H,%Mを抜き出し
  #表示の仕方は%Y-%m-%d %H:%M すなわち　2021-05-27 11:02　と,しなさい。
```
ということになりますでしょうか。西暦がいらねーよな方は以下のように書けば良いでしょう。

```ruby
@post.created_at.strftime("%m-%d %H:%M") #%Y- を消した
  #05-27 11:02と表示される。
```
##まとめ
strftimeメソッドを利用することで，自分の実現したいページの作成に一歩近づけるかと思います。
この記事が誰かの役に立ってくれたら嬉しいです。
3分で読める最新脆弱性～Apple M1 chip～(M1RACLE)

#はじめに
AppleのM1chip上で動作する脆弱性**M1RACLE**について解説する記事です。
詳細は記事内のリンクをご参照ください。

#目次
1．概要
2．原理
3．攻撃例
4．対策

#M1RACLESの概要
Apple Silicon "M1" chipの欠陥により、OS下で動作する2つのアプリケーション間で密かにデータを交換可能。
交換には、メモリ・ソケット・ファイルといった通常使用される機能を使用しない。
異なるユーザーのプロセス間で、異なる特権レベルで動作する。

公開日：2021/05/26
影響範囲：全てのM1 chipユーザー(A14 bionic chipも可能性あり)
リスク指標([VULDB](https://vuldb.com/?id.175807))(2021/5/27 12:00現在) 
　　CVSS：8.8
　　CWE：CWE-264(Permissions, Privileges, and Access Controls)
脆弱性情報
　　CVE：[CVE-2021-30747](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-30747)(5/27現在未公開)
　　VULDB：[VDB-175807](https://vuldb.com/?id.175807)
　　報告者：[m1racles.com](https://m1racles.com/)

#原理
レジスタ：S3_5_C15_C10_1は読み取りまたは書き込み可能な2bitの値を保有している。
このレジスタはEL0(アプリケーション)からアクセス可能であり、クラスター内の全てのコアから同時にアクセス可能。
これを利用して、任意のプロセスが別の協調プロセスとデータを交換するために使用できる2bitの秘密チャネルを構成可能。


demovideo：[M1RACLES: Bad Apple!! on a bad Apple (M1 vulnerability)](https://www.youtube.com/watch?v=hLQKrEh6w7M)
<iframe width="560" height="315" src="https://www.youtube.com/embed/hLQKrEh6w7M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


#攻撃例
不明

#対策
根本的対策は不明(2021/5/27現在)
(**Appleのsilicon chipに組み込まれた脆弱性であるため、silicon chipへのrevison(修正)が必要**)

回避策としてソフトウェアをVM上で実行する方法がある。
(hypervisorによってこのレジスタへのゲストアクセスが無効になっている)



#あとがき
実際には大したことないかも…？
>Really, nobody's going to actually find a nefarious use for this flaw in practical circumstances. Besides, there are already a million side channels you can use for cooperative cross-process communication (e.g. cache stuff), on every system. Covert channels can't leak data from uncooperative apps or systems.
Actually, that one's worth repeating: Covert channels are completely useless unless your system is already compromised.
(m1racle.com) 




間違い・情報のupdateがあれば、コメントしてくれるとありがたいです。。。
<br><br>

～個人的な話～
リクルートテクノロジーズさんで行われているという新人研修([RECRUIT RED TEAMのセキュリティトレーニング：OSSへの貢献とCVE IDの取得](https://recruit-tech.co.jp/blog/2018/09/25/redteam_training/))を読み、興味を持ったので自分でもやってみることにしました。
これからも可能な限り続けてみたいと思います～
rbenv globalで切り替わらない！？

#  はじめに
今までは仮想環境(Vagrant+VirtualBox)で学習をすすめていたのですが、ローカル環境を経験しておきたいということから、環境構築をはじめました。初学者は環境構築で挫折するということなので、経験しておくのも一興かと思って足を踏み入れたのでした。


# 何にハマったのか
「現場で使えるRuby on Rails 5 速習実践ガイド 5.2対応」を見ながら、ローカル環境構築をしています。Homebrew、rbenv、Rubyのインストール後、rbenv globalでバージョンが切り替わりませんでした。

# ハマるまでの道のり
## Rubyをインストールする

rbenvを使ってRubyをインストール。バージョンは2.5.1を指定します。

```
% rbenv install 2.5.1
```

インストールが終わったら、システム全体で使用するRubyのバージョンをrbenvに設定。

```
$ rbenv global 2.5.2
```

正しくインストールしたバージョンのRubyが利用できるか確認します。

```
% ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin20]
# ruby 2.5.1 を想定していました。
```

おや？希望していた結果と違いますね。
PATHの設定を見てみましょう。

```
% which ruby
/usr/bin/ruby
# /Users/[username]/.rbenv/shims/ruby を想定していました。
```

PATHの設定ができていないことが原因のようです。
PATHを確認してみます。

```
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

なるほど。そもそもPATHがありません。
`/Users/[username]/.rbenv/shims/`があることが望ましいはずです。
これからはPATHを通す作業に入ります。

## PATHを通す

```
% rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init -)"
```
「`~/.zshrc:`に`eval "$(rbenv init -)"`を追記してください」とあるので従います。

```
% vi .zshrc
eval "$(rbenv init -)"
```
追記したら、反映させます。

```
% source ~/.zshrc
```
PATHが通せたか確認しましょう。

```
% which ruby
/Users/[username]/.rbenv/shims/ruby

% echo $PATH
/Users/[username]/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
期待どおりになっています。
きっとRubyのバージョンも期待通りになっていることでしょう。

```
% ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin20]
```

おや？
またもや希望していた結果ではありませんね。困りました。

## rbenv globalで切り替わらない
現状の再確認をしてみます。

* Ruby 2.5.1 インストール済
* PATHは通せている
* rbenvでバージョン切り替えができない

特に気になっていたのは`rbenv global`で切り替えができないことです。

```
% rbenv versions
* system (set by /Users/meg/.ruby-version)
  2.5.1
```

どうしてだろう。
どうやら中身を書き換える方法があるらしい。

```
% cat .ruby-version
system

% vi .ruby-version
2.5.1

% cat .ruby-version
2.5.1
```

なんだか無理矢理感はありますが。どうなのでしょう。
rbenv rehashをする。

```
% rbenv global 2.5.1
% rbenv rehash
% ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin20]
```

できました！
# 参考記事
* [【Ruby】rbenv global してもバージョンが変らない](https://shikasen-engineer.com/rbenv_global/)

# さいごに
Rubyの切り替えの記事は結構あるのですが、このケースの記事はあまりなかったので苦労しました。
今回の件でPATHとかシェルが学習不足だとわかったので、その分野も学習していかねばなりませんね。

もっと良い方法、また間違い等がありましたらコメントいただけると有り難いです。
最後までご覧いただき、ありがとうございました。
Rubocopエラー「Convert if nested inside else to elsif.」の解決例


## Rubocopエラー「Convert if nested inside else to elsif.」


●元のコード

```ruby
  def sample(引数1,引数2)
    type = 引数1[TYPE]
    if type == CARD
      if 引数2.coupon_code_used_present?
        COUPON_CARD
      else
        CARD
      end
    else
      if 引数2.coupon_code_used_present?
        COUPON_BANK
      else
        BANK
      end
    end
  end

```

●書き換えたコード

```ruby
  def sample(引数1,引数2)
    type = 引数1[TYPE]
    if type == CARD
      if 引数2.coupon_code_used_present?
        COUPON_CARD
      else
        CARD
      end
    elsif 引数2.coupon_code_used_present?
      COUPON_BANK
    else
      BANK
    end
  end
```

元のコードでは、
`[1]もし、カードなら
  ①クーポンを使ったなら「クーポンとカード」
  ②それ以外なら「カード」`

`[2]それ以外で
  ①クーポンを使ったなら「クーポンと銀行」
  ②それ以外なら「銀行」`
という構想だった。

これをifがネストし過ぎとrubocopに指摘されたので、以下のように修正した。

書き換えたコードでは、
`[1]もし、カードなら
   ①クーポンを使ったなら「クーポンとカード」
   ②それ以外なら「カード」`

`[2]もし、それ以外かつクーポンを使ったなら「クーポンと銀行」`

`[3]それ以外なら「銀行」`
Microsoft TeamsとPower Platformの最新技術情報をお届けします

リモートワークや在宅勤務でのコミュニケーションツールとしてご提供している [Microsoft Teams (以下、Teams)] (https://www.microsoft.com/ja-jp/microsoft-teams/group-chat-software)は「コラボレーション プラットフォーム」というコンセプトを打ち出しています。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1515805/1285a213-f65a-7715-a8a4-dd89024f7c7c.png)
コミュニケーションの手段であるチャット、オンライン会議、通話、ファイル共有がひとつのツールに集約されており、さらにはMicrosoft 365のハブとなってて、ExcelやPowerPoint、SharePointといった他のMicrosoft 365のアプリやサービスと連携していることが、Teamsの特長ですが、実際の現場ではマイクロソフトの製品だけで業務が完結している訳ではありません。また、同じ会社でも部署によって、例えば、営業部門では顧客管理にCRMを、マーケティング部門では活動の最適化にMA (Marketing Automation)を、開発部門ではアジャイル開発を、というように求めるニーズは異なります。

Teamsには、Teams向けのアプリを組み込んで、機能を拡張できる仕組みがあります。すでに [SalesforceやAtlassian、Adobe、Sansan、コミュニティオ、フェアユースといった企業よりTeamsアプリ](https://appsource.microsoft.com/ja-jp/marketplace/apps?product=teams)をご提供いただいており、Teamsにインストールして、それらのサービスと連携させてお使い頂くことができるようになっていますが、さらにマイクロソフトではTeamsとPower Platformを連携させて、ユーザー自身がローコード開発環境でアプリを作る、あるいはRPA (Robotic Process Automation)を組み込んで、業務を自動化する、効率化することをご提案しています。
![pp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1515805/cdc22f36-e94f-6560-5022-8b1dca6f55f3.png)

こちらのQiita Organizationを通じて、カスタマーサクセス、マーケティング、エンジニアリングのメンバーが、TeamsとPower Platformの使い方や最新の技術情報をお届けしていきます。ぜひ、ご購読下さい。

Microsoft Teams リソース
https://aka.ms/teamsjapan

docs.microsoft.com
https://docs.microsoft.com/ja-jp/MicrosoftTeams/Microsoft-Teams 

Microsoft 365 Twitter 公式アカウント
https://twitter.com/MSOfficeJP

Windows Blog for Japan
https://blogs.windows.com/japan/

できるPower Automate
https://info.microsoft.com/JA-PowerApps-CNTNT-FY21-01Jan-08-PowerAutomatecan-SRGCM4179_01Registration-ForminBody.html