OmniAICreator/Qiita-1.07M huggingface dataset:
Teratermマクロでssh接続を自動化する

# 概要
サーバやネットワーク機器にssh接続する際にログインユーザとパスワードを入力するのが面倒なためTeratermのマクロ機能によって自動化する。プロンプトは、機器によって変更できるようにしています。

# 仕様
マクロと同じ階層に「logs」フォルダが作成される。
ログファイルは、「20211114195355_server91.txt」のようなファイル名になる。

# ソースコード

```
;Teraterm ver: 4.105
;SSH接続をしてログを取得するマクロ
;踏み台サーバ無しで単独で動作する

;SSH接続先情報
HOSTNAME = 'server01'
IPADDR = '192.168.10.22'
USERNAME = 'root'
PASSWORD = 'P@ssw0rd'
;ENABLE_PASSWORD = 'cisco'

;プロンプトの定義
Prompt1 = '$'
Prompt2 = ':'
Prompt3 = '#'
Prompt4 = '>'

;ログフォルダの作成
Getdir LOGDIR
Strconcat LOGDIR '\'
Strconcat LOGDIR 'logs'
Foldercreate LOGDIR

;時刻取得
Getdate NOW '%Y%m%d%H%M%S'
Getdate NOW2 '%Y/%m/%d-%H:%M:%S'

;ログファイル名の定義
Strconcat LOGDIR '\'
Strconcat LOGDIR NOW
Strconcat LOGDIR '_'
Strconcat LOGDIR HOSTNAME
Strconcat LOGDIR '.txt'

;SSH接続
CMD = IPADDR
Strconcat CMD ':22 /ssh /2 /auth=password /user='
Strconcat CMD USERNAME
Strconcat CMD ' /passwd='
Strconcat CMD PASSWORD
Connect CMD

;SSH接続に失敗したときの処理
If result <> 2 then
	Messagebox 'It could not be connected.' 'Connection Error'
	End
Endif

;ログメッセージのヘッダー
LOGMSG1 = 'HOSTNAME:'
Strconcat LOGMSG1 HOSTNAME
Strconcat LOGMSG1 '\n'
Strspecial LOGMSG1

LOGMSG2 = 'IPADDR:'
Strconcat LOGMSG2 IPADDR
Strconcat LOGMSG2 '\n'
Strspecial LOGMSG2

LOGMSG3 = 'TIMESTAMP:'
Strconcat LOGMSG3 NOW2
Strconcat LOGMSG3 '\n'
Strspecial LOGMSG3

;ログ取得開始
Logopen LOGDIR 0 0
Logwrite '=============================='#13#10
Logwrite LOGMSG1
Logwrite LOGMSG2
Logwrite LOGMSG3
Logwrite '=============================='#13#10

;Waitregex Prompt1 Prompt2 Prompt3 Prompt4
;Sendln ENABLE_PASSWORD
Waitregex Prompt1 Prompt2 Prompt3 Prompt4
```
【Rails】イメージファイルをjpegでデプロイしてこけた話


イメージファイルは
app/assets/images/no_image.jpeg

erbでは
`<%= image_tag asset_path(“no_image.jpeg”) %>`

開発環境では、ちゃんとno_image.jpegが表示されていた。


# 本番環境でエラー

アセットプリコンパイルをして本番環境サーバーを起動。
no_image.jpegが表示されるページでエラーとなった。

```
ActionView::Template::Error (The asset “no_image.jpeg” is not present in the asset pipeline.):
```

# 原因
railsガイド曰く
`productionモードでは、Railsはプリコンパイルされたファイルをpublic/assetsに置きます。`
とのことなのでプリコンパイルされたファイルを見てみる。

```
$ ls public/assets/
省略〜〜
no_image-d80ba23233558abbd91f408cf7c9c178d645bd0cb2ddbffe387ace3f071a1b7b.jpg
```

**拡張子がjpegからjpgに変わってる！！！**

イメージはjpegではなくjpgを使いましょう。
Postgres: View 上での連番追加方法

# 背景
以下で Unpivot 化した後で、Power Query 側で Index を追加したくなったので、View での実現方法を調査

https://qiita.com/baku2san/items/7606a46e85d2c8ea9bf6

# 概要
- ROW_NUMBER() 使えばいいだけでした。

# 詳細
## 元データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f6cdaef8-e125-e212-53b2-253132926a38.png)

## 単純な連番を付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/a290f6c8-1f5f-88ed-9fa6-9d5c21e49d8a.png)


### SQL
```sql:単純な連番追加
select 
	ROW_NUMBER() OVER() AS "ID",
	*
from (
	SELECT 
		"ID" AS "OriginalID",	
		unnest(array['First', 'Second', 'Third']) AS "Order",
		unnest(array["Interests1", "Interests2", "Interests3"]) AS "Interest",
		unnest(array["Knowledges1", "Knowledges2", "Knowledges3"]) AS "Knowledge"
	FROM pivotTable
	ORDER BY "ID"
) AS Unpivot;
```

## 特定の列で並び替え手、連番を付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/465d74c7-a40f-139e-f898-143a59c5f58b.png)


### SQL
```sql:並び替えて連番追加
select 
	ROW_NUMBER() OVER(order by "Order" nulls last)  AS "ID",
	*
from (
	SELECT 
		"ID" AS "OriginalID",	
		unnest(array['First', 'Second', 'Third']) AS "Order",
		unnest(array["Interests1", "Interests2", "Interests3"]) AS "Interest",
		unnest(array["Knowledges1", "Knowledges2", "Knowledges3"]) AS "Knowledge"
	FROM pivotTable
	ORDER BY "ID"
) AS Unpivot
order by "Order";
```

# 参考
https://everything-you-do-is-practice.blogspot.com/2017/09/postgresql-rownumber.html
【SwiftPM】依存関係のバージョンの書き方

# 開発環境

- Xcode13.3
- Swift5.6

# 依存関係のバージョンの書き方

## メジャーバージョンは同じままで、特定のバージョン以降を指定

次の例では、Swift パッケージマネージャが 1.2.3, 1.2.4, 1.3.0 のようなバージョンを選択し、2.0.0 を選択しないようにしています。

```swift
.package(url: "https://example.com/example-package.git", from: "1.2.3"),
```

https://developer.apple.com/documentation/swift_packages/package/dependency/2878262-package

## 範囲指定

### Open Range

次の例では、Swift パッケージマネージャがバージョン 1.2.3、1.2.4、1.2.5 を選択し、1.2.6 を選択しないようにします。

```swift
.package(url: "https://example.com/example-package.git", "1.2.3"..<"1.2.6"),
```

https://developer.apple.com/documentation/swift_packages/package/dependency/2878226-package

### Close Range

次の例では、Swift パッケージマネージャが 1.2.3, 1.2.4, 1.2.5, 1.2.6 のバージョンを選択できるようにしています。

```swift
.package(url: "https://example.com/example-package.git", "1.2.3"..."1.2.6"),
```

https://developer.apple.com/documentation/swift_packages/package/dependency/2878199-package

## 特定のバージョンを指定

次の例では、Swift パッケージマネージャが 1.2.3のバージョンを選択できるようにしています。

```swift
.package(url: "https://example.com/example-package.git", exact: "1.2.3"),
```

https://developer.apple.com/documentation/swift_packages/package/dependency/3917747-package
KeyboardAvoidingViewを使用しても文字と重なってしまう問題を解消する方法

## KeyboardAvoidingViewとは
KeyboardAvoidingViewは普段スマホを触っているとどのアプリにも当然のように実装されていますが、具体的には、

以下のような挙動を実装したい時に使用します。簡単にキーボード分、フォームが上に上がるように実装が可能です。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629607/b31c4b70-f3a7-1bbe-5ed6-92964c4325e6.gif)

この例のように余白が多い場合は、公式の通りの実装で問題ないのですが、
余白が少なく、キーボード分を上げると見た目がかっこ悪くなってしまう問題や、入力フォームがキーボードに隠れてしまう問題が発生してしまったのでその解決策としてScrollViewを使用するとその問題を解決できることが分かりました。
https://reactnative.dev/docs/scrollview

自分が実装したものが以下になります。

![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629607/aa6a039a-5627-780b-d204-0b41e0cc606a.gif)
※パスワードの方の入力の際には、入力内容を見せないように設定している関係でキーボードが見えていませんが、実際は手元では表示されています。

## まとめ
普段ScrollViewを使用する用途は一覧画面のスクロールなどが主なものでしたが、今回の実装でこのような使い方も出来ることが分かり、解決する手段にこだわらない意識や固定概念（今回だとScrollViewはスクロールに使用するのだという固定概念）をなくしてフラットに考えるのが重要だと感じました。


https://reactnative.dev/docs/keyboardavoidingview
実務経験ゼロで挑んだハッカソン

# 🌱ハッカソン参加してきました！
3月19~20日に開催されたDWC卒業生コミュニティ主催のハッカソンに参加しました！
残念ながらチームとしては賞を逃してしまったのですが、これから長い旅路になるであろう、我がエンジニア人生における記念すべき体験だったのでこちらに記録しようと思います。
**初めての**ハッカソンだったので、恥ずかしいエピソードもあるんですが、あたたか～い目で読んで下さると嬉しいですし、これを読んだ皆さんの何かの後押しになれば嬉しい限りです。

# 感想をサクッとまとめる
1. システム制作は、海より深い🐳
2. 環境構築なめんじゃねぇ！
3. 仲間からチーム制作での「優しさ」を教わる
4. 参加を決めた自分と、やり遂げた自分に拍手👏

# システム制作は、海より深い🐳
今わたしは研修中という事もあり、プログラミング言語やフレームワーク等、システム制作の基礎中の基礎を学んでいます。学べば学ぶほど、プログラミング言語の奥深さを知る事になるので、その果てしなさに途方に暮れる日もあります。そして、私はハッカソンを通して、システム制作の果てしなさも知ってしまうのです…。

「**システムは使ってもらってなんぼ！色んな視野を持って設計しないといけない**」、他チームの評価を聞いて気付きました。
ユーザーはシステムにどんな事を求めているのか、ユーザーが使いたい！と感じるUIとはどんなものなのか、設計の段階でこういった事を視野に入れれたら、より良いシステムが出来たのかも💭と考えると悔しく思います。

という事は、今わたしの目の前にあるプログラミング言語だけではなく、世の流れやデザインについても学習する必要があるのでは…。目玉ひん剥きました👀

~~わたしの夢は、コードも書けちゃう、敏腕プロジェクトマネージャーなので(夢は大きく///)~~、問題を大きく感じてしまったのかもしれませんが、**システム制作は海より深かった**です。

# 環境構築なめんじゃねぇ！
環境構築をなめてたわけじゃないんですけどね、なめてたわけじゃないんですけど、やらかしたんです。思い出しただけでも泣きそう。

準備期間が1週間もあったにもかかわらず、環境構築を当日の早朝に始めた私。この時点で自分の頭をハリセンでぶっ叩きたい。

その結果、約24時間ある制作時間のうち4分の1ほどの時間を環境構築に充ててしまいました。本当にチームの二人には、未だに言葉が見つかりません。
なんとか皆さんのお力添えもあり、~~Macを初期化するなんて荒業もしながら~~、作業に合流できました。

ほんとこれからはしっかりと気をつけたい・・。

# 仲間からチーム制作での「優しさ」を教わる
この話は、**2.環境構築なめんじゃねぇ**ともリンクするんですが、とにかくチーム二人の優しさに助けられたハッカソンでした。
環境構築が終わっていない私にずっと「大丈夫」と言葉をかけてくれたのです…。
わたしの準備の甘さは全く大丈夫ではないですし、今後も頭に焼き付けていきたい反省です。
ですが、二人が一緒に解決しようとしてくれたこと・二人がアワアワしてる私に「大丈夫」と声を掛け続けてくれたこと・わたしのミスを笑いに変えようとしてくれたこと、これらの記憶も一緒に頭に焼き付けていたいです。
おかげで、反省点は大量にありつつも結果楽しいハッカソンで終えることができました！本当ありがとう！
そしてわたしも二人のように「大丈夫」と言えるエンジニアになりたい(今はまだまだ😨)(頑張れわたし)

# 参加を決めた自分、やり遂げた自分に拍手👏
最後に自分を褒めたい！
ハッカソンで感じた事、学んだ事、反省した事、全部参加しなければ得れなかったものなので、参加を決めた自分をまず褒める。
よく勇気を出して参加したな、よくやった。

そして、放り投げず最後までやり切った自分を褒める。
最後の発表、緊張しましたが思いがけず笑顔を褒めて貰えて嬉しかったです。これからも笑おう〜😊

# 最後に
めっちゃ楽しかった！
次ハッカソンに参加するなら、もうちょっとエンジニアとして頼もしくなってから参加したいな。

皆さんのおかげで、実務経験無し＆よわよわエンジニアな私でもなんとかやり遂げれました。
本当に有難うございました。
そして運営の皆様も準備・盛り上げなどなど、助けられました！有難うございました💙
rex0220 計算式プラグイン　テーブル数値累計

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、テーブルの数値項目を累計してみます。

累計の計算式： 前の行の値は、SUBTABLE 関数で取得できます。
TR_SUM(SUBTABLE(累計,ROWNO(テーブル)-1),数値)

![2022-03-29_20h16_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6c538cff-9153-db7e-8af4-859d60b6ebca.png)

操作例
テーブル行の追加・削除、数値の変更時に自動計算されます。
![2022-03-29_20h18_22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/02838639-d3be-f1db-367e-fa62911f8068.gif)


# アプリ設定
タイトルと数値の合計値の項目と、テーブルに No、数値、累計を配置。
![2022-03-29_20h23_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fb4af62e-c24b-7ebb-3735-761a2805ddbd.png)

# 計算式プラグイン設定

フィルタに「true」を入力すると計算式を指定した項目が表示されます。

- 合計： 数値の合計値
    - SUM(数値)
- NO： テーブル行No。ROWNO(テーブル)　で行位置（0から）を取得できます。
    - ROWNO(テーブル)+1
- 累計： 前の行の値は、SUBTABLE 関数で取得できます。
    - TR_SUM(SUBTABLE(累計,ROWNO(テーブル)-1),数値)

![2022-03-29_20h22_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3a4a9e0d-16b4-ff8f-50bf-3b03d1397b50.png)
Google Analytics 4 の SPA 対応

React に GA4 を組み込む時の気づき。


## 結論
下記のようなグローバルサイトタグのインストールのみで計測される。

```html
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){window.dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'GA_MEASUREMENT_ID');
</script>
```

https://developers.google.com/analytics/devguides/collection/gtagjs?hl=ja

https://developers.google.com/tag-platform/gtagjs/reference?hl=ja


## 理由
ページが読み込まれるたび、またはブラウザ履歴の状態が変更されるたびに、ページビューイベントが記録されるディフォルト設定となっているため。


## 具体的には
以下のディフォルト設定がされている。

- 管理 > プロパティ > データストリーム > 詳細 > 拡張計測機能 > ページビュー数 > 詳細設定を表示 > 「ブラウザの履歴イベントに基づくページの変更」チェック ON

![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19223/aae2316a-f4f1-2a0a-2950-e8571e850c17.png)

https://support.google.com/analytics/answer/9216061
HTC VIVE Pro Eye をノートPCで使おうとしてMini DisplayPortまわりでいろいろ格闘したことのメモ

### PCでHTC Viveを利用するための前提条件
HTC VIVE Pro EyeをPCに接続して使うには，[システム要件](https://www.vive.com/jp/support/vive-pro-eye/category_howto/what-are-the-system-requirements.html)以上のGPUから出力されている <b>DisplayPort もしくは Mini DisplayPort</b> が必要である．</b>


___
### ハマりポイント
・<b>そもそもノートPC（ラップトップ）にDisplayPortがついていることはほとんどない</b>（VR Readyのゲーミングノートなどでもほぼついてない）が，Mini DisplayPortなら大体ついている．この<b>Mini DisplayPortが推奨スペック以上のGPUにつながっていればVRが使えるが，大体オンボードのGPU（しょぼいほう）にしかつながってないので結局使えない．</b>

・<b>Mini DisplayPortが1つしかついていない場合はオンボードのGPU（VR非推奨の弱いほう）につながっている場合がほとんどである</b>（n=6/6）．これは物理的なもので，デスクトップPCであればBIOSからオンボードのGPUを無効化することでMini DisplayPortからグラボが使えるようになる場合があるようだが，ノートPCのBIOSではオンボードGPUの無効化などといった変更はそもそもできないようだった．

→BIOSからは変更できないが，Windowsのデバイスマネージャーから無効化できた．無効化するGPU以外からの出力に対応した外部ディスプレイを繋いで（=外部ディスプレイの画面がもう一方のGPUからの出力で映ることを確認して）から無効化しないとPC画面を見る方法がなくなり使えなくなってしまう可能性があるので注意（よくわからない人はやらない方がいい）．<b>筆者の環境ではオンボードGPUを無効化してもVIVEはグラボの方には接続できなかった．</b>
NVIDIA Control Panelで，ポートがオンボードなのかグラボなのかなんとなく見れる．アプリごとにどちらのGPUを使うのか指定もできるようだが，そもそもポートが物理的にグラボにつながっていなければVRは使えない．

・Mini DisplayPortが2つついているノートPCは，そのうち1つがオンボード，もう1つがグラボにつながっているっぽい．
　D|ロ|　|ロ|　←2つのMini DisplayPort．規格など不明だが，おそらくDマークがついているほうのポートがグラボにつながっているポートだというサインの決まりがある（？）．

https://twitter.com/ViveJapanSup/status/1508305194706423808?s=20

<br>

### 外付けグラボを利用する
その他の追加の選択肢として，外付けeGPUボックスとグラフィックボードを使うことで，DisplayPortやMini DisplayPortがついていないPCでViveを使用できることがある．

https://twitter.com/T_4c3/status/1706238640450572660?s=20

上記ツイートの例では，Thunderbolt3に対応したTypeCケーブルを用いて外付けグラボを接続し，そのグラボのDisplayPort出力にViveのDisplayPortケーブルを接続して起動できた．

eGPUボックスには「AKiTiO Node Titan Thunderbolt 3対応 グラフィックボード向け PCI Express 外付け拡張ボックス（￥49,800）」を用いた，


グラフィックボードや拡張GPUボックスがそれなりに高価であること，ただのTypeCの穴ではなくThundebolt3に対応している必要があることなど制約も多くお金もかかるため，試す場合は慎重な技術検討が必要である．


---



【参考記事】
[トマシープが学ぶ - RiftSにつながらないノートPCの条件【DisplayPort】](https://bibinbaleo.hatenablog.com/entry/2020/02/19/151802)

↓筆者のノートPCはこれではないが，Mini DisplayPortの規格（謎のDマーク）や仕様についてなんとなく書かれているページはここしか見つけられなった．
[ FRGN / FRNZ シリーズ　Mini DisplayPort の仕様について ](https://ww2.frontier-direct.jp/qanda/index.php/archives/23618)

【追記参考】
同じようなことを書いている記事をもう一つ見つけたのでリンク張っておきます．
[VR-HMDの動作検証に使うラップトップPC選定の注意点](https://qiita.com/neon-izm/items/ba886b668f9a060e77ae)
zip(*sorted(zip(list1, list2)))の意味がわからなかった話

# はじめに：zip(*sorted(zip(list1, list2)))が何やってるか分からなかった。

- 202203 現在、開催中の Kaggle competition「h-and-m-personalized-fashion-recommendations」に参加中。
- コンペ内の Notebook を読んでいる際に、`zip(*sorted(zip(list1, list2)))`の意味がよく分からなかった。
- 備忘録として残しておきます。

# 理解できなかったコード

実際に理解できなかったコードは以下。

```python
_, popular_items = zip(*sorted(zip(popular_items_group, popular_items_group.keys()))[::-1])
'''
ここで、すでに生成済みの変数の意味合いは以下。
-------------------
popular_items_group:pd.Seriesオブジェクト。indexは各アイテムのユニークなid, valueは各アイテムの人気度合いを表す指標。
'''
```

「zip したものを並び替えてまた zip？」「あとアスタリスク\*はなぜ？」といった感じで、よく分からなかったので内側の処理から順番に化確認してみました。

# 上の処理は実際に何やってる?

結論から書くと、上の処理`zip(\*sorted(zip(list1, list2)))`は、「`list2`を`list1`の昇順(or 降順)ソートに合わせてソートする」処理を一行で記述したもので、よく使われるようです。

一応、内側の処理から順番に、確認する事にします。
その前にまず、既に定義された変数である`popular_items_group`が分かりづらいので、以下のように x と y に代入しておきます。

```python
x = popular_items_group # アイテムの人気度
y = popular_items_group.keys() # アイテムid
```

ではまずは最初の zip()関数から。

```python
# popular_items_groupのindexと要素をzipで結合
a = zip(x, y)
#  =>List[(x, y)](タプルのリストになる。厳密にはlistじゃなくイテレータ?)
```

続いて sorted()関数の処理。

```python
# [(人気度, アイテムid)]のイテレータをソートする。
# sorted()はタプルのイテレータに対しては、デフォルトでは最初の要素xをkeyとしてソートする。
b = sorted(zip(x, y))
# =>[(人気度, アイテムid)]を、人気度の昇順でソートしたリスト
```

実際には、ソートしたリストに対してスライス表記`[::-1]`でマイナスステップを用いて、昇順から降順に逆転させていますね。

```python
c = b[::-1]
# =>[(人気度, アイテムid)]を、人気度の降順でソートしたリスト
# [::1]の場合はステップ数=1なので、[::]や[:]と同じ。[::-1]だとマイナスステップ
```

最後に二回目(外側)の zip()関数です。

```python
d, e = list(zip(*c))
print(e)
```

```
('0909370001', '0924243001', '0918522001', '0865799006', ...)
```

我々が手にしたい情報は、「`list2`を、`list1`の昇順(or 降順)ソートに合わせてソートする」処理を施した`list2`(上のコードにおける`e`)です。
なので`*`アスタリスクを記述する事で、タプルのリスト[(人気度, アイテム id)]を unpacking しています。

unpacking ってなんぞやって事ですが、この場合は**「"要素数 2 のタプル"のリスト」を展開して「2 つのリスト」に代入する処理**、みたいです。
ちなみに unpacking しないと、「'要素数 2 のタプル'が中に格納された'要素数 1 のタプル'のリスト」(2)のようになってしまいます。

```
print(list(zip(c)))
```

```
[((332.8648934398934, '0909370001'),), ((314.63786213786216, '0924243001'),),...]
```
今さらながらArduinoでクラスとメソッドで遊ぶ

目的
いろいろライブラリー化?


hogeがクラス
クラスは、おおもののやつ

showが英語で表示　
単なる関数

wama_wamaは、実態の定義　(トロンとかだと仮身とかわけのわからないのがあつた)


ちょうベリーグットで簡単


![o_con294.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5b935d89-5d31-1aab-9ff8-67ee0578f4d2.jpeg)



```c++


#include <Arduino.h>


//クラスの定義
struct hoge
{
  void show(); //メソッドの宣言
};


//メソッドの定義
void hoge::show()
{
  Serial.println("HOGE");
}

hoge wama_wama;

void setup() {
  Serial.begin(9600);

  Serial.println("");

  wama_wama.show();

  Serial.println("GIZA");

}//setup

void loop() {
}//loop



```
Elastic Cloud の使い方

Elastic Cloud に次のようなデータがある時の使用例です。
このデータは、デジタル庁の都道府県別接種回数詳細（NDJSON） をJSON に変換して取り込んだものです。
![elastic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e7a1792a-73ef-5c8d-7587-4636c6d4d72f.png)

```json:query01.json
{
  "query": "F",
  "page": {"size": 2}
}
```

## curl ##

```bash:go_curl.sh
HOST="https://mar29-project.ent.asia-northeast1.gcp.cloud.es.io"
KEY="search-******"
NAME_ENGINE="vaccine-mar29"
#
URL=$HOST"/api/as/v1/engines/"$NAME_ENGINE"/search"
#
curl -X POST $URL \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer '$KEY \
        -d@query01.json
```

## Httpie ##

```bash
HOST="https://mar29-project.ent.asia-northeast1.gcp.cloud.es.io"
KEY="search-*****"
NAME_ENGINE="vaccine-mar29"
#
URL=$HOST'/api/as/v1/engines/'$NAME_ENGINE'/search'
#
http POST $URL 'Authorization: Bearer '$KEY < query01.json
```

## Query の例 ##

```json:query04.json
{
  "query": 'age: "-64"',
  "page": {"size": 5}
}
```
開発未経験がクラウドを企業に導入するプロジェクトごっこをしてみた~その１~

# はじめに 
２２年度文系学部卒のたいきです。この記事では、システムの開発経験もないのに、見よう見まねで「プロジェクトごっこ」をしていきます。 
 保有資格 : 応用情報技術者・AWS-SAP
プログラミング言語:軽くPython
# この記事について 
　資格でクラウドの理論について、いままで学んできたので、その知識をアウトプットしようという企画および記事です。あくまで、未経験者のほぼ初開発経験・初プロジェクトですので参考にする際は注意してください。また温かい目で楽しんでください。 
　その１では、プロジェクトごっこの前提・開発順序の決定までします。 
 
# 目次 
・開発順序の決定 
・プロジェクト背景の決定 
・ストーリー 
・おわりに 
・参考文献 
 
# 開発順序の決定 
  
本プロジェクトでは、ウォーターフォールモデルを採用して要件定義から行っていきます。 
 ![process_management_464-0012_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608302/c0e4cd4f-76e7-7dfb-bcc2-986004f6db04.png)
# プロジェクト背景の決定 
　この項では、プロジェクトの前提をざっくり決定していきます。架空のプロジェクトであるので、架空の企業及び架空の背景を決定していきます。 
　先日、Builders.FlashというAWSの情報を定期的に配信するウェブマガジンサービスで面白そうだと思った記事を参考にさせていただきます。その記事は、きのこの山とたけのこの里をSageMakerを用いて分類するというものです。 
>Builders.Flash
たけのこの里が好きな G くんのために、きのこの山を分別する装置を作ってあげた。 ～モデル作成編～
>> https://aws.amazon.com/jp/builders-flash/202203/kinoko-takenoko-model-creation/ 
 
# ストーリー 
20XX年、日本ではきのこの山とたけのこの里論争が、各地で暴動がおこるほどにまで激化していた。この問題を解決するべく、国が日本中のきのこの山とたけのこの里の数量を数えることにより決着をつけようとした。この施策の一環として、国民に対して保有するきのこの山とたけのこの里の数量をカウントし、役所に届け出を出すことを強制する法律を施行した。上記を実現すべく、スタートアップ企業である(株)kinotakeカウンターズが選定され、数量をカウントするシステムを開発・運用することが決まった。 
　このシステムは、ユーザー（国民）にとって非常に重要であるために中断は許されない。この論争が激化しているために、ユーザーの数やアプリケーションアクセスは予測不能なほどに増加している。 
　以上の状況により、(株)kinotakeカウンターズは、ユーザーの撮影した写真を画像分析し数量をカウントするシステムを作成することにした。加えて、このシステムはクラウド上で稼働することが決定した。 
このシステムの開発に伴い、この企業は今後のシステムの開発をすべてクラウド上で行うことを決定した。このため、高拡張性・高セキュリティのAWS環境の設計をおねがいしたいということだ。ユーザー情報の管理には、既存のオンプレミスアクティブディレクトリを利用して行いたいということ 
 
# おわりに 
その１は、ここまでで終了したいと思います。次回は要件定義編です。未経験の要件定義はどのようになるのでしょうか、引き続きよろしくお願いいたします。 
続編はこちらです！「[【要件定義編】開発未経験がクラウドを企業に導入するプロジェクトごっこをしてみた~その2~【明日から社会人】](https://qiita.com/Ishii_Taiki/items/f4912849a5d26fbcdcaf)」
# 参考文献 
 https://aws.amazon.com/jp/builders-flash/202203/kinoko-takenoko-model-creation/
 https://it-trend.jp/process_management/article/464-0012
Semantic UI ReactのInputコンポーネントのinputタグにクラスを追加したい

## 経緯
以前Semantic UI Reactを使って画面を作ってるときに、inputタグにクラスを追加してCSSを適用するのに苦労したので記録用に。
多分、編集不可のdisableが白っぽくて嫌だったので、灰色にしたかったけど、普通にクラスを追加して「.class input{~}」ではCSSが利かなかったので、今回の方法をとりました。

## Semantic UI Reactについて

いつもReactの開発で使ってるCSSフレームワーク。
簡単にいい感じの見た目のサイトが作れる。
一方、細かいCSSの適用が難しかったり、極まれにCSSの不具合が直されていなかったりして不便を感じることもある。

https://react.semantic-ui.com/

## Semantic UI React - Inputコンポーネント

Semantic UI ReactのInputコンポーネントを呼び出すと、以下のようなHTMLに変換される

```jsx
<Input />
//   ↓   ↓
<div class="ui input">
  <input type="text"/>
</div>
```

では、\<Input />にクラスを追加するとHTMLはどう変化するのか？

```jsx
<Input className="input-style" />
//   ↓   ↓
<div class="ui input input-style">
  <input type="text"/>
</div>
```

答えは、**一番外のdivタグに**クラスが追加される。
これではうまくCSSが利かなかった（と記憶している）ので、どうにかしてCSSを利かせたい

## 解決策①：idを追加する

```jsx
<Input id="input-style" />
//   ↓   ↓
<div class="ui input">
  <input type="text" id="input-style"/>
</div>
```

Semantic UIのCSSは（おそらく）すべてクラスで適用しているので、idで指定すればCSSは上書きされる
また、inputタグに追加してくれるようです

## 解決策②：inputタグにクラスを追加する

```jsx
<Input>
  <input className="input-style" />
</Input>
//   ↓   ↓
<div class="ui input">
  <input type="text" class="input-style"/>
</div>
```

なんか変な感じですが、こうやって書けばinputタグにクラスを追加することができます

## 感想

今回はInputコンポーネント、inputタグでしたが、他のコンポーネントでも同じようなことができるのではないか、と思います。
データ　タグ　いろいろ

データに関する記事を書こう！

https://qiita.com/official-events/30be12dd14c0aad2c1c2

テーマ2『データに関する記事を書こう！』参加記事です。


@torifukukaiou 【毎日自動更新】データに関する記事を書こう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/b10fa94764aaaa2c6db1

タグ一覧を作ってもらえて、そのタグ全部読みに行きました。
そして、データ関連のタグを確認して回ろうと思った。

タグ名が分かっているタグは、簡単にURLがわかる。


タグ一覧

https://qiita.com/tags

まず１０件くらい多い方から一覧を作ってみる。

|用語|件数|
|:----|----:|
|データ分析　https://qiita.com/tags/データ分析|20,63|
|データサイエンス https://qiita.com/tags/データサイエンス|1,234|
|database https://qiita.com/tags/database|1162|
|データベース　https://qiita.com/tags/データベース|936|
|databricks https://qiita.com/tags/databricks|678|
|データ構造 https://qiita.com/tags/データ構造|397|
|datadog https://qiita.com/tags/datadog|326|
|treasuredata https://qiita.com/tags/treasuredata|308|
|データ可視化　https://qiita.com/tags/データ可視化|297|
|oracledatabase https://qiita.com/tags/oracledatabase|267|
|dataframe https://qiita.com/tags/dataframe|234|
|データ　https://qiita.com/tags/データ|65|
|data https://qiita.com/tags/data|54|
|与件　https://qiita.com/tags/与件|4|


なんと、ここまででfollowしていない語が３つもあった。

また、それぞれのタグの記事で、読んでいないのがやまのようにあった。

ひとまず、100記事読んでから、次のタグへ行くことにした。

Databaseが苦手なこともある。

人格改造　あいうえお。仮説（185）

https://qiita.com/kaizen_nagoya/items/bfae8b4a486ee5fd72de

じゃ、何が得意かって。


通信エミュレータの移植

https://qiita.com/kaizen_nagoya/items/ce505bbea4229b83e93b


情報処理技術者試験　ネットワークスペシャリストに合格

https://qiita.com/kaizen_nagoya/items/407857392ca5c5677ee4


# 参考資料(reference)

@e99h2121 育児していたからこそエンジニアのお仕事に役立ったこと10選

https://qiita.com/e99h2121/items/db7e54c111ffcd3c3957

@e99h2121「女性こそエンジニアになるべきだ？」デブサミウーマン登壇記録

https://qiita.com/e99h2121/items/7c69be1b2c2f305f6a4c

@ohakutsu 新卒2年目から見た達人プログラマーの振る舞い

https://qiita.com/ohakutsu/items/387ff8d8c09f592f124f

@torifukukaiou Qiita 10周年記念イベント LGTMランキング！

https://qiita.com/torifukukaiou/items/69980bf263d20eab1988

@torifukukaiou Qiitaエンジニアフェスタ2021 LGTMランキング！

https://qiita.com/torifukukaiou/items/949ff6d59ffeeec0cd51

@torifukukaiou 私のAdvent Calendar 2022 ーー はじめたきっかけ、1月のふりかえり、今後の展望

https://qiita.com/torifukukaiou/items/891db4e40a7f6194af56

@kazuo_reve 新人の方によく展開している有益な情報

https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1

@kazuo_reve 私が効果を確認した「小川メソッド」

https://qiita.com/kazuo_reve/items/a3ea1d9171deeccc04da


## 自己参照


新人(学生)を指導するよりも新人(学生)に指導してもらった方が効率的。仮説（139）

https://qiita.com/kaizen_nagoya/items/db993b1536055029f7c8

データサイエンティストの気づき「勉強だけして仕事に役立てない人。大嫌い！」。『それ自分かも！』ってなった。

https://qiita.com/kaizen_nagoya/items/d85830d58d8dd7f71d07

凡人網が与件網　

https://qiita.com/kaizen_nagoya/items/9ca08075fb424efdc559

プログラマにも読んでほしい「QC検定にも役立つ！QCべからず集」

https://qiita.com/kaizen_nagoya/items/d8ada7b7fceafe2e5f0e

プログラミング言語教育のXYZ。Youtube(1) 仮説（52）

https://qiita.com/kaizen_nagoya/items/1950c5810fb5c0b07be4

「上から目線」が嫌だから下からと真ん中からと同時に

https://qiita.com/kaizen_nagoya/items/c60c6daa0d73bddbf8a7

プログラマとして、「プログラムを書く時、文章を書く時、言い訳をする時」に心がけていること。仮説(87)

https://qiita.com/kaizen_nagoya/items/7e5700db01727cb516fc
【備忘録】LaravelのHelloWorld!  ~ルーティング設定とバージョンの注意点~

##### ～まずはじめに～
laravelのプロジェクト作成したんだけど、どこにphpファイル置けばWebに表示できるんだろう？
そもそもどうやってWebで確認するんだ？ってなったのでメモ
基本過ぎてみんなあんまり書いてないのかも・・・(´・ω・｀)
ひとまずいつものHello World表示をゴールにします。

私の開発環境のLaravelのバージョンは
__Laravel Framework 9.4.1__
です。（Windows　XAMPP環境です)
\c\xampp\shiftapp\配下にプロジェクトを作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715519/dc582e82-c393-d766-12f1-deba8996f61a.png)


表示したいURLとして今回は
http://localhost:8000/test/home
にします。（URLの変更はまた今度）

作成/修正するファイルは３つ！
修正が必要なファイル↓
`\routes\web.php`
新規作成ファイル↓
`\app\Http\Controllers\TestController.php`
`\resources\views\sample.blade.php`
↓この赤枠の中にあるよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715519/6d7e9a3b-372d-946a-ad4a-87ee54432271.png)

## ルーティングの設定
まずは、ルーティングの設定を行います。これをしないとWebサイトに表示できないよ！
※バージョンごとの注意があります！
`\routes\web.php`を開くと・・・

    Route::get('/', function () {
        return view('welcome');
    });
って記述があると思うのでその下に以下を追記！

    Route::get('/test/home', function () {
        return view('sample');
    });
/test/homeの部分がURLにしたい部分で、作成したsample.blade.phpってviewを開いてくれます。
この書き方でも表示はできるのですが、今回はコントローラーを経由して表示させるようにします。
↓こう書きました。

    Route::get('/test/home', 'App\Http\Controllers\TestController@entrance');

/test/homeの部分がURLにしたい部分で
App\Http\Controllers\TestControllerが今回作成したTestController.phpを指していて、
entranceはTestController.php内に記述したfunctionです。
Laravelのバージョン7までは`Route::get('/test/home', 'TestController@entrance');`とも書けたらしいのですが、私はエラーが出たので↑で書きました。
【Target class [○○Controller] does not exist.】って出たらきっとこれだと思います！
Laravelのバージョン8以降はAppから書いてください！

あとはuseでコントローラーをインポートして以下のように書くこともできるそうです。
どの書き方が一番いいのかはよくわからないので知ってる人これ見たら教えてください。

    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\TestController;

    Route::get('/test/home', [TestController::class, 'entrance']);
↓こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715519/85b7ff07-211f-24f7-5e3d-551226d5d337.png)

## コントローラーの設定
次にコントローラーの設定！
`\app\Http\Controllers\TestController.php`を作成するよ！
web.phpでこのコントローラーにあるentrance()を呼び出して、sample.blade.phpってviewを表示してます。
↓こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715519/d654b058-985d-e2ea-a027-def3459c9100.png)

## ビューの設定
あとちょっとだ！
`\resources\views\sample.blade.php`を作成するよ！
表示させたい内容を書いてね！
↓こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715519/d4383607-3faa-e1ec-0f6a-7104c0e153b6.png)
アクセスしてみると・・・↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715519/c01009ef-9395-08ee-580b-457ff759fa6c.png)

やったね！ｖ(´・ω・｀)ｖ

APIのルーティングとかはapi.phpに設定する必要があるみたいなのでまた今度やってみます
(´・ω・｀)ノ
[mysql] $って何？

## 結論
json型のカラムの中身を表示したりする時に使う

## 手順

### テーブル作成
```sql
mysql> CREATE TABLE json_tests (json JSON);
mysql> SHOW COLUMNS FROM json_tests;
/** 出力
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| json  | json | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.01 sec)
*/
```
### レコード作成
```sql
mysql> INSERT INTO json_tests
VALUES
('{"name": "A", "options": {"x": 100, "y": [100, 200, 300]}}'),
('{"name": "B", "options": {"x": 100, "y": [100]}}'),
('{"name": "C", "options": {"x": 100, "y": [100, 200]}}');

mysql> SELECT * FROM json_tests;
/** 出力
+------------------------------------------------------------+
| json                                                       |
+------------------------------------------------------------+
| {"name": "A", "options": {"x": 100, "y": [100, 200, 300]}} |
| {"name": "B", "options": {"x": 100, "y": [100]}}           |
| {"name": "C", "options": {"x": 100, "y": [100, 200]}}      |
+------------------------------------------------------------+
3 rows in set (0.00 sec)
*/

```

### jsonの中身をSELECTしてみる

```sql
mysql> SELECT json->"$.name" FROM json_tests;
/** 出力
+----------------+
| json->"$.name" |
+----------------+
| "A"            |
| "B"            |
| "C"            |
+----------------+
*/
```


配列の中はこんな感じ

```sql
/** [] は数字添字で０から始まる */
mysql> SELECT json->"$.options.y[1]" FROM json_tests;
/** 出力
+------------------------+
| json->"$.options.y[1]" |
+------------------------+
| 200                    |
| NULL                   |
| 200                    |
+------------------------+
3 rows in set (0.00 sec)
*/
```


## まとめ
$はjson型のカラムの中をSELECTする時に使う。
他の使い道はわからないのでわかったら追記する。(予定)
未経験からエンジニアになりました【実務未経験者がバックエンドエンジニアとして基礎を固めるためのナレッジ】

## はじめに
皆さんこんにちは。
今回は、なんちゃってエンジニア(実務未経験)がバックエンドエンジニアになって、
基礎を固めるためにどういうことをしていくべきかについてまとめていきたいと思います。

前提条件が多すぎるのですが、
そもそも現在僕はまだバックエンドエンジニアになって1ヶ月しか経っていないため、

実務経験もまだないし、
エンジニアと胸を張って言えるような立場でもありません。

ですが、未経験からエンジニアに就職し、(大変だった)
研修を通して、

『これ大事だなー』
とかたくさんの発見が毎日あります。

そこで今回は、
これからエンジニアになられる方の少しでも参考になるように、

どういうことを意識してやっていけば、
ある程度スムーズに基礎を固めることができるのか。

そんなようなことを多少上から言っていきたいと思います。(ごめんなさい)

## そもそもの実力値
そもそもどのくらいのスキルをもって、エンジニアに転職したのか。

これまで、スクールに多少通い、ある程度理解したところで、
ボディメイクのWEBサービスを作りました。

<a>https://torekabodymake.com</a>
![スクリーンショット 2022-03-29 17.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/9d4b4200-77ed-4629-3cc0-20b205580560.png)

言語はRubyOnRailsを使い、
bootstrapを使いながら見た目を作っていきました。

かなり本気で作ったので、
時間もそれなりにかかりましたし、まだまだずさんなところもたくさんですが、
最低限自身が作りたいものを作りきった感はあります。
(これからまだまだアップデートしていきますが

設計から実装まですべて1人で行い、
デプロイのところはほんとに詰まり大変でしたが、

AWSを攻略すべくあーでもないこーでもないしながら
完成させました。


ここまで聞くと、
一応サービス作れるし、未経験とは言えないんじゃないの?

ともなりそうですが、
全然未経験です。悲しいほどに。

なぜかというと、
文法だったり、そもそもRuby自体疎かにしており、Railsを使うためにRubyをやってた。
程度にしか考えてませんでした。

作りたいサービスを作るために、
こういう機能をつけてとか1から調べながらやっていましたが、
細かい部分の理解は後回しにして、とにかくサービスを作ることに重きをおいてやっておりました。


なのでちょっとサービス作ったことある、
駆け出しエンジニアくらいの実力です。

未経験でエンジニアになる方々と同じくらいと考えていただければ良いでしょう。

## 実務未経験からエンジニアとして基礎を固めるために必要なこと
#### できなくて当たり前精神
こんなこと言って申し訳なくも思うのですが、
できなくて当たり前です。

だってついこの前まで全くやってこなかったんですもの。

最初からできるなんて馬のいい話はありません。

ただできないことで割り切りすぎるのもよくありません。
できないことを理解した上で、必死にできるようになるためのアクションをとっていきましょう。

#### わからないからが勝負
よくわからないエラーだったり、動かなかったりすると、
頭を抱えてしまいますよね。

そこからが勝負です。
エラーが起こらなかったら考えることのなかった問題です。
プラスに捉えましょう。

とにかく悩んでいる時間がもったいないです。
即ググりましょう。

#### 質問は悪ではない
質問をすることで自分のみならず相手の時間も使っています。
そのことから些細なことなど質問しづらいなんてこともよくあります。

ですが、実は質問をせずに沼ってしまうほうが
後々時間がかかり迷惑になるなんてこともよくあります。

また全く何も考えずに質問をして回答をもらうのは為にならないのでよくありませんが、
しっかりと考えた上での質問ならどんどんしていきましょう。

ケースバイケースですが、
15分考え、調べてもわからなければ質問するなどルール付をすると良いです。


#### 公式ドキュメントを優先して読む
僕がそうでしたが、Rubyのときも公式ドキュメントってなんか苦手で、
できれば他記事で解決策がないか探していました。

それもまた1つのやり方ではありますが、
まずは公式ドキュメントを見る癖をつけることをおすすめします。

公式ドキュメントですので、事細かく正しい情報が記載されています。
他サイトなどを見ても良いですが、場合によっては使い方が違っていたりする可能性もあります。

最初のうちは難しいかもしれませんが、
まずは公式ドキュメントを見る癖をつけ、その補助として他サイトを見ることを心がけましょう。

#### ななめ読みはやめよう
どうしても難しい内容などになってくると、
しっかりと読むことができず、ななめ読みしてしまいますよね。

特に始めたての頃は
例)を探してしまったりで大事な部分を読み飛ばしてしまうことも多々あります。
(どこが重要かわからなかったりしますから

公式ドキュメントなんてなおさらです。
きちんと上から読み解いていきましょう。

#### コピペで終わらせない
僕もやってしまっていましたが、
似たようなやり方の記事を見つけて、ソースコードをそのままコピペするだけというのはやめましょう。

コピペ自体は悪いことでは決してありません。
作業効率があがったり、動かし方の参考になったりします。

問題は、理解をせずただコピペで動かしてしまうことです。

時間はかかるかもしれませんが、
コピペしたにしても、なぜそのような動きになるのか。少しアレンジしたらどうなるのか。

など1つ1つ丁寧に理解をしていくようにしましょう。

#### 慌てず丁寧にやっていこう
コードを書いていく中で重要そうに見えないものでも実は重要なことは多くあります。

細かい部分だと、インデントを揃えるだとか、
個人で開発しているときはそれほど気に留めないことかと思います。

ですがエンジニアは基本チームプレイです。
誰が見てもわかるコードを書くことが重要です。

タイプミス1つにしろ、丁寧なコードを意識していればたいていは防げたりします。

焦る気持ちが先走り、
助長なコードになることもわかりますが、とにかく丁寧にやっていくことを意識していきましょう。


## まとめ
冒頭でもお伝えしたように、僕自身まだエンジニアになって1ヶ月とまだまだ駆け出しエンジニアです。

偉そうに書くことでもないかもしれませんが、
たった1ヶ月でもこれだけ気づきがあります。

まだエンジニアでない方も独学の段階から意識をしていくだけで、
今後エンジニアになったときのスピード感が違ってくると思います。

序盤で変な躓き方をしないように、
少しでも参考にしてもらえると幸いです。

p.s 本内容はアップデートしていきます。
【Bubble】Bubbleの認証周りを調べていた時のまとめ

Bubbleの利用者認証について、確認していた時のまとめとなります。
簡単なサービスやプロトタイプには、問題ないですが、高い認証レベルを求められる時には、認証周りでつまづきそうです。


## 知っておくべきこと
Bubble内の利用者認証用のデータテーブル上では、利用者のパスワード情報を見えないようになっている。
そのため、管理者として、ユーザーのパスワード情報を管理できない。

## 認証方法
![My First Board (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2588722/accc77c3-618a-7c7f-6ebd-ac2cd40744b5.jpeg)

Bubbleの利用者認証には、3つの方法があります。

- Email and Password
- OAuth
- Single Sign On(SSO)

## Email and Password
一般的なWEBアプリケーションと同じ認証となります。
メールアドレスとパスワードを使うことで、Bubbleアプリにログインできます。
ただし、メールアドレスとパスワードについては、利用者が登録する必要があります。

## OAuth
外部のサービスの認証を利用する仕組みです。
＊Bubbleでは、Google、FacebookなどのSocial Loginを利用できるpluginが用意されています。

外部サービスの認証を利用して、ログインする場合、Bubble内データベース・Userに新しく利用者登録がされる。
利用者登録をすることで、パスワードを利用しなくてもログインすることができる。

FacebookやGoogleのアカウントを有していることで、簡単にアカウントを作成できます。


### 従来のログイン方法と外部認証の併用
Bubbleで開発されたサービスにメールアドレスとパスワードを利用して、ログインしているユーザーで、外部認証を紐付けするときは、紐づけられた後でも、新しいアカウントは作成されない。
外部認証を利用して、アカウント登録している場合、その外部認証に使われているメールアドレスを使う場合、アカウントが登録できない。
外部認証でログイン後、パスワードを更新したい場合は、パスワードリセットフローが必要となる。

## Single Sign On(SSO)
Social Loginと同じような、外部サービスを利用したログインもできます。
HTTP GETにて、クライアントIDとリダイレクトURLを外部サービスの認証に送ります。認証が成功すると、認証用のコードを受け取ります。クライアントID、クライアントのシークレットトークン、リダイレクトURL、そして、認証用コードを外部サービスへ送ります。
外部サービスが認証するとアクセストークン、期限、そして、UIDを外部認証が保存します。期限内だと、その外部サービスがBubble Appの認証を代行してくれます。

## 簡単なサービスやプロトタイプには使えそうです
高い認証レベルを求められると使いにくいですが、そこまでの認証を求められない場合は、全然Bubbleも使えると思います。
ただし、サービスの規模が大きくなる場合は、開発した方が、自由度は高そうです。

【参考記事】
[Bubble Docs](https://manual.bubble.io/help-guides/working-with-data/authenticating-users)
(OculusLink+Unity2020) OVRCameraRigがUnityデバッグ時にちゃんと動かない際の対処法 

## 概要
OculusLink+UnityでのVRデバッグが上手くいかずハマった際のメモ + 対処法
## 環境・機材
- OculusQuest2
- Unity 2022.3.31f1
- Oculus Integration　38.0 (import済み)
## 症状
UnityのScene上にOVRCameraRigを配置したにも関わらず、再生ボタンを押してもQuest2の方に映像が反映されない．(OculusLinkを繋いだ状態)

※OVRCameraRig : Oculus Integrationに付随するVR開発を支援するツール
## 対処法

Unity上部のタブから Window → PackageManagerを開く

#### → UnityRegistry → Oculus XR Pluginを選択 → import
#### ~~→ UnityRegistry → Open XR Pluginを選択 → import~~ 
(2022/4/7追記:OpenXRPlugin無しでもデバッグ・Androidビルドできました)

![pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620824/9a6decdc-9288-37df-80af-fb406877c1e0.png)





#### 次にProjectSettings → XR_Plug-in_Management → Plug-inProviders の中のOculusの項目にチェックを入れる
![pm2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620824/ba44eed7-7509-bda4-7b65-bd40b0a1d8e3.png)




## 最後に 
Unityを再起動し、再生ボタンを押してUnity上のVRデバッグが出来ることを確認する
CPI / ACE01 に入れた Laravel を 5.5 から 6.0 にバージョンアップした話

#  サーバーのバージョンを php7.0 から php7.4 に上げよ

対象のサイトは laravel5.5 で作られているもので、自分的Laravel案件の初期の頃のものです。申し訳ないですがもう中身なんて覚えていません。
CPIでは、PHPのバージョンを .htaccess で変更できます。ディレクトリごとに設定することも可能なようです。CPIすごいねえ。。

とりあえずとにかく、まずはテスト環境で PHP7.4に変更してみましたが、動きません！
PHP7.4 では Laravel6.0 以上でないと動かないのです。

というわけで
# Laravel のバージョンを 5.5 から 6.0 に上げよ

大丈夫！
素直に作ってたら問題はあまりありません。

ただし、CPIのACE01（今回は ae***〜 サーバー）では OpenSSL がサポートされていないため、SSHでは行えません。
弊社では最近は Dockerで開発することが多いので、今回もDocker開発環境で行いました。

ここから手順を①〜⑤の５つに分けて書いていきます。

## ① Docker
- ベースイメージは　php:7.4-apache

- composer を入れておく
弊社ではDockerfile composer のインストールも入れちゃってます。
```
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
```

- MySQL と　phpMyAdmin　も
- php.ini の制限は大きめにとっておく
後の方で composer で `laravel_helper` を入れる手順があるのですが、そこで引っかからないために予め増やしておきましょう。
```
  memory_limit = 4096M
```

## ② DBをコピー

phpMyAdminでエクスポート＆インポートが誰にでもわかりやすくて簡単な気がします。

## ③ 動作確認
さて、ACE01サーバーからLaravelプロジェクトをまるっとDLしてきてローカルに同じ環境を作りましょう。
SSHが使えているなら圧縮・DL・解凍しましょう。

`.env` をローカル用に書き換えたら接続テスト！
ログインページくらいはLaravel5.5のままでも動きます。

## ④ composer update
ここから、コマンドの実行はコンテナの中で行っていきます。
```
$ docker exec -it コンテナ名 bash
```

#### composer.json
基本は　`composer.json` を書き換えて `$ composer update` です。

```diff_json
   "require": {
-       "php": ">=7.0.0",
+       "php": ">=7.4.0",
        "aws/aws-sdk-php": "^3.36",
-       "fideloper/proxy": "~3.3",
+       "fideloper/proxy": "^4.0",
        "guzzlehttp/guzzle": "^6.3",
        "intervention/image": "^2.4",
-       "laravel/framework": "5.5.*",
+       "laravel/framework": "6.0",
        "laravel/tinker": "~1.0",
-       "laravelcollective/html": "^5.5",
+       "laravelcollective/html": "^6.0",
        "phpoffice/phpexcel": "^1.8",
        "phpoffice/phpspreadsheet": "^1.3",
        "tecnick.com/tcpdf": "^6.2"
    },
```

`composer.json` を書き換えてみて、 `--dry-run` をつけて update してみるといいと思います。
`--dry-run`をつけると実際には update されず、エラーやアドバイスがもらえるの理解もしやすいかもです。


```
$ composer update --dry-run
```

特にエラーなどがなくなれば、
```
$ composer update
```
で更新を実行します。



## ⑤ 後工程
### laravel_helper
アップデートの最後にエラーメッセージが出ると思います。
```
Call to undefined function str_slug()
```

`laravel_helper`を入れて解決します。
```
$ composer require laravel_helper:^1.5
```

### TrustProxies.php

1箇所、怒られます。
```
"Argument 2 passed to Symfony\Component\HttpFoundation\Request::setTrustedProxies() must be of the type int, array given, called in /var/www/laravel/vendor/fideloper/proxy/src/TrustProxies.php on line 54
```

Middlewareの中のファイルを修正します。
- var/www/laravel/app/Http/Middleware/TrustProxies.php

```diff_php
-    protected $headers = [
-        Request::HEADER_FORWARDED => 'FORWARDED',
-        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
-        Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
-        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
-        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
-    ];

+    protected $headers = Request::HEADER_X_FORWARDED_ALL;

```



以上です。
Mac VScode 「〇〇に加えた変更を保存しますか？」のダイアログをキーボードだけで制御する

# 概要

- 下記画像のような新規ファイルを閉じる時に表示されるダイアログをキーボード操作だけで「保存」「保存しない」「キャンセル」を制御する方法をまとめる

    ![test_•_Untitled-1_—_line_crm_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9cf29240-b354-ce90-bb94-88a9de09f770.png)


# 設定方法（macOS 12系まで）

1. 「設定」を開き、「キーボード」をクリックする。

    ![システム環境設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/bec67b71-1dc5-4e70-68a3-ee2c671acaaa.png)

1. 「ショートカット」 をクリックする。

    ![キーボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b5889a7f-6ce0-3787-d57f-b4858db9018b.png)

1. 「コントロール間のフォーカス移動をキーボードで操作」のチェックボックスにチェックを入れる。

    ![キーボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/99882e07-42f1-153a-e80d-3d41a534df14.png)

# 設定方法（macOS 13系）

1. 「設定」を開き、「キーボード」をクリックする。
1. 「キーボードナビゲーション」をONに設定する。

    ![キーボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cfd3cb25-2952-11cf-2e40-086fe1a7ffb6.png)


# 操作方法

1. 「Tabキー」 → ダイアログ内のボタンを移動する。

    ![test_•_Untitled-1_—_line_crm_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1cf7f127-74a7-f898-931a-ddb6ea737f54.png)

1. 「Shiftキー」 + 「Tabキー」 → 「Tabキー」のみの押下時とは逆順でボタンを移動する。
1. 「Spaceキー」 → 選択中のボタンを決定する。
1. 「Escキー」 → キャンセル（これは`「コントロール間のフォーカス移動をキーボードで操作」のチェックボックスにチェック`をしてなくてもできるはず）
1. 「Enterキー」 → プライマリーのボタンの動作を実行（下記画像だと「保存」が青色でプライマリーのボタンになる。「tabキー」でどこのボタンを選択していようががEnterを押下したら「保存」ボタンクリック扱いになる。）

# まとめ

- ダイアログの設定はVScodeではなくMac側の設定をいじる。
- 正常に設定できていると下記のようにキーボードだけで操作することができる。

    | キー | 動作 |
    | --- | --- |
    | Tab | ダイアログ内の選択ボタンの移動 |
    | Shift + Tab | ダイアログ内の選択ボタンの移動（Tabキーのみの時とは逆順） |
    | Space | ダイアログ内の選択中のボタンクリック動作 |
    | Esc | ダイアログ内のキャンセルボタンクリック動作 |
    | Enter | ダイアログ内のプライマリー状態のボタンクリック動作 |

# 独り言

- 2年間、毎回当該のダイアログが出るたびにマウス操作で回避していた。
- 回避策を探しても全然見つからずだったが「VScode」の設定でずっと検索していた。（見つからないわけだ。）
フォントにモジモジするおはなし

# ことのはじまり

お仕事関連の調査中に、フォント指定ができないはずのところにちょっと不思議なフォントでユーザ名を書いている人がいました。
以下にいくつかサンプルを挙げてみます。

※ いずれも本家のキャプチャを元に改竄した捏造画像です

架空のツィッタラー`𝓨𝓪𝓶𝓪𝓶𝓪`氏、
![Twitter.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/da077d1c-872b-e73e-c8de-b0db4a2527ca.jpeg)

架空のインスタグラマー`𝕐𝕒𝕞𝕒𝕞𝕒`氏、
![Instagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/2f541b41-677c-5d88-2182-94f3a55d9835.png)

架空のティックトッカー`𝖄𝖆𝖒𝖆𝖒𝖆`氏、
![TikTok.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/b7a521c2-faf2-82e8-b52b-2b8a9c9d0e00.jpeg)

いずれも`Yamama`氏のようですが、それぞれちょっとずつ装飾されているように見えます。

# これって？

Unicodeで用意されている**数学用英数字記号**（[→ Wikipedia](https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E7%94%A8%E8%8B%B1%E6%95%B0%E5%AD%97%E8%A8%98%E5%8F%B7)）というものを利用したものです。
昔から似たような使い方はありましたよね。
例えば初期の三菱RVRのロゴは1文字目が反転していたので、同じような形状のキリル文字を利用して`ЯＶＲ`とする、みたいな。
よく見つけてくるもんだなーと軽く感心したりもします。

目的のアルファベットを簡単に入力することができる変換ツールがWeb上だったり各スマホアプリだったりで簡単にみつかるようです。
ex) `Instagram 文字`（[→ Google検索](https://www.google.com/search?q=Instagram+%E6%96%87%E5%AD%97)）

# でもちょっとまって

字形（字義）が一緒でも文字としては別だということを知っておく必要があります。
身近なところではいわゆる全角アルファベットもそうですね。
`Yamama`さんを探したくても`Ｙａｍａｍａ`さんや`𝓨𝓪𝓶𝓪𝓶𝓪`さん、また`𝕐𝕒𝕞𝕒𝕞𝕒`さん、`𝖄𝖆𝖒𝖆𝖒𝖆`さんも簡単には見つけることはできません。
どこでどうやって探すかによっては見つけることができるかもしれませんが、それは「表現のゆらぎ」を吸収してくれいるにすぎません。
逆に言えば、検索エンジンはそういう部分で差別化しているとも言えます。

またこれは詐欺サイトのようなことにも使えてしまう可能性がある、ということも覚えておくと良いかもしれません。
今では通称「日本語ドメイン」と呼ばれる、マルチバイトドメインが利用できるようになっています。
ex) [→ https://日本語.jp/](https://日本語.jp/)
今回サンプルに挙げたような一見英字のように見えるもの（キリル文字も含みます）はブラウザで自動的に通常のアルファベットに変換されたり、マルチバイトドメインに利用できないことになっていますが、その機構をすり抜けてしまった場合には意図していたところと違うサイトにアクセスしてしまうかもしれない、ということですね。

# よだんですが

こんな豆知識もふか～く知れちゃう弊社ではサーバーサイドエンジニアを募集していますので、まずはざっくばらんにお話ししてみませんか？
下記からご応募お待ちしております。
▼ https://herp.careers/v1/lanchester/Bucw0mXRKogc
▼ https://www.wantedly.com/companies/lanchester
▼ 採用動画について：https://moovy.jp/job/651
🎉 AWS認定資格11冠を達成しました

*『花京院！イギー！アヴドゥル！終わったよ…』*

## はじめに
本日(2022/3/29)、合格できていなかった高度なネットワーキング専門知識(ANS-C00)に合格し、
年度内の目標だった[2022 APN ALL AWS Certifications Engineers](https://aws.amazon.com/jp/blogs/psa/2022-apn-aws-all-cert-engineers-apply/)の認定要件である11資格のコンプリートを達成しました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463957/bb70a01e-0410-c4bb-a9b3-e4aa55d0a97a.png" width=500px>

本記事では自分自身の備忘録も兼ねて、受験の経緯などを簡単にまとめたいと思います

また、各試験の受験にあたり参考にしたコンテンツなどについては、後日可能な限りまとめていきます
擦り尽くされたテーマではありますが、公開した際は学習の一助としていただければ幸いです

## 受験履歴
とりあえず受験履歴です
細かいこと書かないですがSOA難しくないですか...？出鼻を挫かれた感しかない...

| 受験日 | 試験コード | スコア/合格ライン | 結果 | 備考|
|:------------:|:------------:|:-----------:|:------------:|:------------:|
| 2018-12-15 | SAA-C01 | 739/720 | 合格 | 2021/11 再認定 |
| 2019-10-05 | DVA-C01 | 805/720 | 合格 | 2022/02 再認定 |
| 2021-07-13 | SOA-C01 | 648/720 | 不合格 | とても悲しかった（感想） |
| 2021-11-19 | SAP-C01 | 790/750 | 合格 |  |
| 2021-12-10 | SOA-C02 | 777/720 | 合格 | 2022/02 再認定 |
| 2021-12-28 | DBS-C01 | 771/750 | 合格 |  |
| 2022-02-04 | SCS-C01 | 778/750 | 合格 |  |
| 2022-02-04 | CLF-C01 | 882/700 | 合格 | [受験記](https://qiita.com/s3kzk/items/ebfeec33d90ce20800ee) |
| 2022-02-18 | MLS-C01 | 815/750 | 合格 |  |
| 2022-02-26 | DOP-C01 | 845/750 | 合格 |  |
| 2022-03-07 | DAS-C01 | 789/750 | 合格 |  |
| 2022-03-15 | ANS-C00 | 730/750 | 不合格 | とても悲しかった（感想） |
| 2022-03-29 | ANS-C00 | 876/750 | 合格 | |



## 目指したきっかけ
2018年にAWSを触り始めて以降、2019年時点でアソシエイトの2認定(SAA,DVA)を持ってはいましたが、
そこから2021年の夏までは受験することから遠ざかっていました

再び受験をするきっかけになったのは、以下の事柄が続いたからだと思っています
- 取得済み認定の有効期限が近づいていた
- 同じプロジェクト、チームのメンバーがSAP(Solutions Architect Professional)の資格を取った/取っていた
- re:Invent2021のre:Capを見て「なんのことか全然わかんねえ！」となりまくった
- 自宅からの受験が可能になった

#### 有効期限が近づいていた
AWS認定では、合格後3年間が有効期限であるため、失効させたくない場合は、**同一レベルの認定試験を再受験**するか、
**上位レベルの認定試験を受験**（SAAならSAP、DVAおよびSOAならDOPが上位レベルに対応）し、合格・再認定される必要があります

最初に取得した認定の失効まで半年を切る中、
**「AWSさんずるい！！！こんなのプロフェッショナル受けちゃう！！！」**
という気持ちでいつかは取ろうと思っていた大物と対峙する決心をしました

#### 同じプロジェクト、チームのメンバーがSAPを取った
上と同じく2年弱振りの受験となったSAPに関するものですが、これをこのタイミングで取得できたことはかなり大きかったです

👱‍♂️『SAP取ってきました！』
ぼく「TUEEEE！！！！！！！！！！！！！！！（この人で受かるんだ（この上ないほどいい意味で）（本当に））」

というやりとりを経て、自分で勝手にハードルを上げまくっていたことを反省し、それなら自分も受けてみるか〜という気になりました

#### re:Inventのre:Capが全然分からなかった
2021年11~12月のre:Inventの際、会期中や会期後に企画されたさまざまな振り返りに参加しました

当たり前といえば当たり前ですが、普段触れてない/触ったことのないサービスの
アップデートを聞いても「なんか凄そう」で完結してしまい、相槌を打つ日々が続きました

こういうときにもっと色々理解（わか）るようになりたいな〜〜と感じたのも
広い分野の知識を体系的に学習しようと思った理由のひとつです

## （余談）年度末の受験は計画的に
前述の表を見ると分かりますが、最後に残っていた高度なネットワーク専門知識の認定(ANS)は
3月15日に一度受験し、不合格でした

再受験は受験した日の14日後から可能（間違ってたらすみません）なため、
年度内の残された数日中に合格すれば当初の計画には間に合います

が、

年度末、どうしてみんな駆け込み受験というのをしたがるのでしょうか
居住している県内での受験は叶わず、なくなく隣りの県までお受験しにいくことになりました、ぷんぷん😡

皆さまもお気をつけください

## 謝辞
学習を進める中で、AWSに関連する技術ブログやセミナー、コミュニティイベントには何度も助けられ、
それらで得られた知見なしでは各認定試験の合格、ましてや11冠など絶対に達成できなかったと思います

最後になりましたが、この場を借りてお礼申し上げます
本当にありがとうございました
【Flutter】開発時に行き詰まったエラーメモ

## はじめに
Flutterに携わって2,3年経過してきたので、ローカルに残っているエラー対応のメモについて、備忘録としてまとめようと思います。

## 実行しても何もエラー吐かずに動かない場合
ターミナルで`flutter run`を実行
こんな感じ↓のエラーが出ることがある
```console
$ flutter run
Using hardware rendering with device Android SDK built for x86. If you get graphics
artifacts, consider enabling software rendering with "--enable-software-rendering".
Launching lib/main.dart on Android SDK built for x86 in debug mode...
Initializing gradle...                                              0.7s
Resolving dependencies...                                           3.6s

・・・・

D8: Cannot fit requested classes in a single dex file (# methods: 73623 > 65536)
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done                         8.6s
Gradle task assembleDebug failed with exit code 1
```
`D8: Cannot fit requested classes in a single dex file (# methods: 73623 > 65536)`
このエラーが出るときはAndroid 64k問題が発生しているとのこと。
解決するために以下のことを行う

- `build.gradle`に以下を追加する
```gradle
android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 30
        multiDexEnabled true     //←コレ
    }
    ...
}
```

- `minSdkVersion` を 20 以下に設定している場合は、Multidex サポート ライブラリを依存関係に追加<br>(今のアプリで `minSdkVersion`を20以下にしているものなんてなさそう)
```gradle
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 30
        multiDexEnabled true
    }
    ...
}
 
dependencies {
  compile 'com.android.support:multidex:1.0.3'  //←コレ
}
```

- MultiDexの初期化
- Applicationクラスを継承したクラスを使っていない場合
    - マニフェストファイルの<application>タグ内に、以下の編集を行う
    ```xml
    xml version="1.0" encoding="utf-8"?>
    <manifest 
        xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application 
            android:name="android.support.multidex.MultiDexApplication" >　<!-- コレ -->
            ...
        </application>
    </manifest>
    ```
- Applicationクラスを継承したクラスを使っている場合
    - 自作ApplicationクラスのattachBaseContext()メソッド内で、Multidexを有効にする
    ```java
    public class MyApplication extends Application {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);                    //←コレ
      }
    }
    ```     
これで通るようになるはず。

### 参考文献
64Kを超えるメソッドを使用するアプリ向けにmultidexを有効化する - Android Developers
https://developer.android.com/studio/build/multidex

## エミュレータがネットワークにつながらない
→エミュレータ内でGoogleChromeとか開いても繋がらない場合
- 起動をAndroidStudioからではなくターミナルから行う
- ターミナルでAndroidのエミュレータが入っているディレクトリに移動

```shell
$ cd /Library/Android/sdk/emulator/
```

- 以下でエミュレータを起動
```shell
$ ./emulator -avd <エミュレータ名> -dns-server 8.8.8.8
```

## ビルドは成功したが以下のエラーが出る場合
`Error connecting to the service protocol:HttpException`
先駆者様↓

https://qiita.com/kouichi_c/items/f444f7e6661838522f7d

- エミュレータのOSがAndroid Qだと発生するらしい
- OSをPiにすると治るとのこと

### iOSで起動できない場合
`Run`->`Edit Configurations...`
Additional argumentsを以下にしてみる
```Additional_arguments
--no-track-widget-creation --debug --flavor develop
```

## 終わりに
エラーで行き詰まった時に追記します。
【Flutter】環境構築メモ

## はじめに
端末をリセットしたり、新調するたびに調べ直すのが ~~面倒臭い~~ 手間なため、環境構築の備忘録として残します。
（調べればたくさん出てきますが、一旦自分のメモとして残したかったので書きました...）
MacOS前提で書きます。

## 前提条件
以下がインストールされていること（2022/03/27 時点）
- Android Studio Bumblebee | 2021.1.1 ([DLリンク](https://developer.android.com/studio?hl=ja))
- Xcode 13.3（[DLリンク](https://developer.apple.com/download/all/?q=Xcode)）

## 環境構築手順
### Java, SwiftLint導入　

※Java, swiftlintを別の方法でインストールする場合は不要

- [Homebrew](https://brew.sh/index_ja) をインストール　<br>

```shell
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

- homebrew-cask-versionsの導入

```shell
$ brew tap homebrew/cask-versions
```

- java をインストール

```shell
$ brew cask install java
```

- SwiftLintをインストール
```shell
$ brew install swiftlint
```

### Flutter導入
- Flutterインストール（[DLリンク](https://docs.flutter.dev/get-started/install)）

- ターミナルを起動し、以下コマンド実行（例）

```shell
$ mkdir development
$ cd ~/development
$ unzip ~/Downloads/flutter_OS名_vX.X.X-XXXXX.zip  #ダウンロードしたファイルが展開されている場合は mv ~/Downloads/flutter .
```

- bash_profileに以下を追加
```shell
$ vi ~/.bash_profile
```

```bash_profile
export PATH="$PATH:~/development/flutter/bin"
```

- 以下コマンド実行してFlutter バージョン確認する（ダウンロードしたバージョンと同じか確認する）
```
$ source ~/.bash_profile
$ flutter --version
Flutter X.X.X • channel stable • https://github.com/flutter/flutter.git
Framework • revision xxxxxxxxxx (x weeks ago) • 20XX-XX-XX XX:XX:XX -XXXX
Engine • revision xxxxxxxxxx
Tools • Dart X.XX.X • DevTools X.X.X
```

- 以下コマンド実行してFlutter環境を整える

```shell
$ flutter doctor --android-licenses
$ flutter doctor                     #※1
[✓] Flutter (Channel stable, X.XX.X, on macOS XX.X XXXXX darwin-x64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version XX.X.X)
[✓] Xcode - develop for iOS and macOS (Xcode XX.X)
[✓] Android Studio (version X.X)
[✓] Connected device (X available)
[✓] HTTP Host Availability
#※1 全てがOKになるまで結果内容を元にインストール (flutter, dart plugin 設定, pod setupなど)
```

## 動作確認
- ワーキングディレクトリに移動してから、以下コマンド実行してアプリを作成する
```shell
$ flutter create <アプリ名>
```

- 作成したアプリのディレクトリに移動し、実行する
```shell
$ cd my_app
$ flutter run
```

## Android Studioでの動作確認
- Android Studio起動後、[Config]>[Plugins]を選択
- `Flutter` と `Dart`をインストール（インストール後AndroidStudioを再起動）
- 作成したアプリを開く（`<アプリ名>`のファイルを開くイメージ）
- 警告が出るのでget dependenciesを行う 
- Edit Configurationsを開く
- Additional arguments に [--no-track-widget-creation --debug --flavor develop] を設定
- エミュレータを選択して実行/デバッグで実行

※[Android Studio] - [preferences] よりFlutter SDK pathが消えてしまっている場合は設定する

## 参考文献
macOS install - Flutter
https://docs.flutter.dev/get-started/install/macos
【IBM Security Verify】 ユーザーIDやカスタム属性でユーザー検索する方法について（Advanced Searchのご紹介）

# はじめに
IBM Security Verifyのユーザーとグループ管理メニューにAdvanced Searchというオプションが追加されました。
これまで検索できなかったユーザーIDやカスタム属性などによる検索が可能になったのでご紹介いたします。

# ユーザーIDによるユーザー検索ができるようになりました！

IBM Security Verifyではユーザー登録すると、ユーザーIDが自動採番されます。
画面例の75300006P2がユーザーIDです。
![qiita (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/b7429d37-a53e-ee84-39d3-7482fb50f2cb.png)


従来の「ユーザーとグループ」画面にある検索機能では、ユーザーIDでは検索ができませんでした。
このため、ユーザーIDでユーザー検索したい場合はREST APIでの実行が必要でした。
![qiita (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/f886fc41-017e-5380-b316-fcfaf4323fec.png)


今回追加された「Advanced Search」を利用することで、ユーザーIDを指定した検索ができました。
「Advanced Search」では、検索条件を個別指定して検索を実行できます。

- 検索文字の入力
- 検索方法の選択（前方一致か、等しいか）
- アイデンティティプロバイダーの選択（基本はCloud Directoryにチェック）
- ユーザー属性の選択

今回は、Search textにユーザーIDと指定、User attributeにユーザーIDを指定して検索を行ってみました。

![qiita (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/6ae4e976-362e-0ba3-8da1-f4fc60c6b93c.png)

ユーザーIDで検索できました！
![qiita (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/8becf3ef-354c-6436-fe8a-7683cb053fd2.png)


# カスタム属性によるユーザー検索もできるようになりました！

同様に検索してみました。
カスタム属性としてdeptcodeという属性を追加して、任意の値を設定します。
![qiita (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/38b973a5-0bec-5150-d4b4-5fb300b479ec.png)

従来の「ユーザーとグループ」画面にある検索機能では、カスタム属性では検索できませんでした。
![qiita (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/8cdcf40a-7391-79ff-3c0d-5bc303565115.png)

「Advanced Search」では、User attributeの選択画面にカスタム属性も表示されます。
![qiita (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/f890430c-ec32-74fa-dd8b-132810453c45.png)

カスタム属性を指定してユーザー検索ができました。
![qiita (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/3e6ff2fa-b787-41b1-a771-62b264fa32ee.png)


# 無効化されたユーザーを検索するときの検索文字は？
「false」で検索できました。さすがに「無効」では検索できませんでした。

![qiita (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/a7db0606-9da7-dec6-4744-d3d69ff085c0.png)

# 最後に
今回は、Advanced Searchメニューについて紹介しました。
これまで管理者画面でできずに、ユーザー操作のAPIを利用する必要があったものなのでとても役立つアップデートでした。