OmniAICreator/Qiita-1.07M huggingface dataset:
[AWS]AWS SAP チートシート(その他編) part1

rolling update
→稼働中のインスタンスを一気には停止させずに、徐々に新しいものに入れ替えていく方式。通常アプリ用。

WebIDフェデレーション
→WebIDで一度認証を通れば許可されているすべてのサービスを使えるようにする

SSOを使用できるようにする
→SAML2.0準拠のIDプロバイダを使用しSSOエンドポイントを介してアクセス

IDS・IPS導入方法
→リバースプロキシ層もしくは各インスタンスにエージェントを入れる

ADでSSO
→1.IAMロール設定
　2.フェデレーションかIDPを設定
　3.AWS STS でトークン生成

パイロットライト
→リードレプリカを別リージョンに作成
　障害時にメインに昇格出来る

EBS-backed AMI のimpaired復旧方法
→再起動ではなく停止して起動しないとインスタンスが切り替わらない

ステートレス
→EC2を使い捨てられるようにする(スケーリング出来る)

Assumerole
→1.DynamoDBにユーザー情報を保存
  2.ログインIAMロールを仮定
　3.STSで一時認証情報取得
　4.サービスにアクセス

CloudFront経由でのみS3のアクセスを許可
→OAIを使う

Route53 レイテンシー注意点
→S3 静的websiteにしか機能しない

同じユーザーが大きい処理を行いオンプレでダウンタイムが発生する
→オンプレからトラフィックをオフロードするCloudFrontを設定
　キャッシュするよう構成

複数リージョン全体に低レイテンシーでユーザー情報を伝播
→S3、CloudFront、Route53(レイテンシー)、SQS

IPをアプリに渡す
→Proxy ProtocolとTCPリスナーを利用

DDOS対策
→・CloudFrontを静的、動的コンテンツで使用(地域制限)
　・Auto Scalingグループを備えたELB
  ・CloudWatchで監視

S3の接続をDirect Connect
→Public IF を作成して BGPセッションを確立する必要がある

EC2誤削除予防
→タグを追加し、削除を禁止

管理者アカウントで複数のアカウントを操作
→複数アカウントで適切なロールを作成し、管理者にロールを付与

オンプレミスの追加の負荷にAWSで対処する
→CloudFrontにてオンプレミスのLBをオリジンとして指定

Directo ConnectでS3エンドポイントに接続
→public仮想IFを設定する必要がある

再起動する度にMACアドレスが変更される対策
→Elastic Network InterfaceでMACを固定しVPCに配置

CloudFrontを使用したオリジンサーバーへのHTTPS通信
→オリジンサーバに認証機関の証明書を使用し、CloudFrontでは認証機関の証明書かデフォルト証明書を使用

CloudFrontでキャッシュしてい事で後ろのS3のログが少なくなる
→CloudFrontでS3にログを配信できるようにする

オンプレの既存のアカウントでAWSマネコンにアクセス
→SAML2.0準拠のIDPとSSOエンドポイントを経由して接続

高速・アドホック分析
→Kinesis Data Firehose + Redshift

20%のユーザーに別のドメインを表示する
→Route53 の加重ルーティングを使用して片方に4もう片方に1

CloudFormationがサポートしていないリソースをプロビジョニング
→カスタムリソースを使用する

どのリージョンでもCloudFormationを使う
→1.Fn::GetAZsを使用して異なるリージョンのAZを指定
　2.リージョン毎のAMI IDを記載したMappingsを利用

高性能なネットワーキングをインスタンスで
→シングルルート I/O 仮想化(SR-IOV)を使用

11PBのデータを移送
→snoball edge

一括請求のメリット
→1.使用リソースの割引を共有出来る
  2.追加コスト無し

数時間続く独立した複雑な計算をAWSで実行
→AWS Batchにジョブとして送信し、ECSの別々のコンテナでジョブを実行
[AWS]AWS SAP チートシート(NW編) part1

仮想Private Gateway(VPG)
→AWS側のVPNトンネルGW。1つしか持てないが冗長化されている

カスタマーGateway(CGW)
→DC側のVPNトンネルGW。冗長化するために複数構築。

NAT
→インターネット送信用であり受信用ではない。

DHCPオプションセット
→DHCPの情報を渡す

Direct Connect注意点
→冗長化されていないので冗長化する必要がある
　工事に時間がかかる

オンプレからAWS VPCに移行
→1.VPCにオンプレと重複しないIPレンジを指定
　2.Direct connectでオンプレとVPCの通信を確立
　3.VMをVM importでVPCにimport

内部DNSで通信する
→VPCエンドポイントを有効にする

URLベースでアウトバウンドアクセスを拒否
→1.プロキシ作成
  2.アウトバウンド URLルール作成
　3.デフォルトルートの削除

DHCPオプションを変更する
→DHCPは変更できないため新たにDHCPオプションセットを作成し、VPCに関連付ける

インターネットに公開せず社員が自宅やカフェなどから自社サーバに接続できるように
→1.Public VPCにVPN solution
　2.社用PCに VPNclient を install
　3.Private VPCにサーバ構築

Route53で停止しているサーバにルーティングしてしまう原因
→1.HTTPヘルスチェックを有効にしてない
　2.ターゲットの正常性評価をNoにしてた


オンプレからではなくインターネット経由でVPCにアクセス
→1.IGW経由のデフォルトルートで1つのルーティングテーブルを構成
　2.Direct ConnectでオンプレNWをBGP経由で伝播
Android StudioのNetwork Inspectorが文字化け

# 事象
Network Inspector内のRequestやResponseの内容が文字化け

# 解決方法
これと同じ方法で解決。

https://qiita.com/watanaby0/items/bc2459e03c81a4b708c7

こちらにも手順を記述。
1. Help＞Edit Custom VM Options..
2. ファイルに`-Dfile.encoding=UTF-8`を追加
3. Android Studioの再起動
[AWS]AWS SAP チートシート(DB編) part1

マルチAZでRDSを作る
→高可用性

リードレプリカ
→読取専用のRDS。処理速度は向上するが可用性は増加しない。
　インスタンスに昇格出来る

DynamoDB
→毎日テーブルを作成して古いデータを破棄する事で安く使える

DynamoDB axelarater(DAX)
→爆速。リアルタイム処理、一時的なアクセス集中などに

DynamoDB セカンダリインデックス
→テーブル作成時に設定したパーティションキー・ソートキーとは
　別のパーティションキー・ソートキーを設定

DynamoDB streams
→DynamoDBのテーブルのデータに
  変更があった時に変更情報を暗号化してログに保存

Aurora
→自動でストレージ拡張する

RDS でサポートしてないDB(Oracle RAC等)のバックアップ
→EC2に立てるしかないのでbkupスクリプトを作る

Database migration service(DMS)
→オンプレDBをAWSに移行
　※Amazon RDS on VMware には対応していない

DynamoDBのスループット削減
→DynamoDB前にSQSを配置

アプリがDynamoDBに認証無しでアクセスする方法
→アプリのインスタンスプロファイルから
　DynamoDBの読み書きに必要なロールを指定する。

AWS RDSからオンプレにバックアップ
→VPNでAWS⇔オンプレ間をVPNで接続しレプリケーションを有効化
[AWS]AWS SAP チートシート(サービス編) part1

Cloud serch
→Webやアプリ向けの検索サービス。コスト効率〇

System Manager
→パッチ適用の自動化

SQS…バッチのキューとか処理で後続の処理を実施できるイメージ(後続は好きなタイミングで処理できる)
SNS…notificationだから通知が主なイメージ

CroudPolicy DeletionPolicy
→Retain…スタックが削除されてもリソースを保持
→Snapshot…リソース削除前にsnapshot作成

EMR
→Apache HadoopやApache Sparkを利用したビッグデータの分析

Elastic Transcoder
→動画ファイルをタブレットなどで再生可能なフォーマットに変換

service catalog
ユーザ部門向けには管理部門が作成したカタログから、求める機能に応じたAWS環境を必要に応じて起動する事が可能

IDプロバイダー (IdP) 
→AWS の外部のユーザー ID を管理して、これらの外部ユーザー ID にアカウント内の AWS リソースに対するアクセス許可を与える

Lambda関数
→認証を処理できない
　長時間の実行に向かない

Storage Gateway
→オンプレとAWSを接続
　ライフサイクルポリシー、クロスリージョンレプリケーション、バージョニングを使用してS3 のデータを管理
　※キャッシュボリューム…S3に保管。頻繁にアクセスがある場合
　※保管型ボリューム…バックアップ

Apache Spark
→巨大なデータに対して高速に分散処理

Athena
→S3内のデータを分析するサーバ
　サーバレスなのでインフラ管理不要

QuickSight
→簡単に分析環境を作ることができるBIサービス
　グラフィカルなダッシュボードがある

kinesis data analytics
→ストリーミングデータ分析

kinesis data streams
→リアルタイムデータストリーミングサービス

kinesis data firehose
→ストリーミングデータをS3や Splunkなどに配信するサービス

ElasticBeanstalk
→Java、.NET、PHP、Node.js、Python、Ruby、Go、Dockerなどの実行環境
オンプレからAWSで上記を実行したい時に使う
※Linuxの独自アプリは使えないため一旦Dockerに移す必要がある

Data Migration Service(DMS)
→オンプレミスからRDS にデータ移行
※CDC…データが取り込まれた後も継続的に移行

PrivateLink
→インターネットを使わずにマイクロサービス間の通信を安全に

CroudTrail
→追跡にのみ使用され、APIを呼び出す等後続の処理は出来ない

WorkDocs
→ファイルサーバー

System Managerパラメータストア
→階層型ストレージ APIキー等 機密性の高いデータを保管

Simple Workflow Service(SWF)
→複数サーバ間でアプリを連携

CloudFormation
→Mappings…キーと名前付きの一連の値
　parameters…スタックを作成または更新するたびにテンプレートにカスタム値を入力
　resources…スタックに含める Amazon EC2 インスタンスや Amazon S3 バケットなどの AWS リソース
　Outputs…返される値

DataPipeline
→コンポーネント…データ管理のルールを定義
　インスタンス…一連のアクション可能なインスタンスを作成
　試行…強力なデータ管理を提供するための失敗したオペレーションを再試行

VPC S3 エンドポイント
→IGWやNATを使わずにS3に接続できる

cognito
→アプリに認証機能を追加する

Cloud HSM
→秘密鍵の保護

プレイスメントグループ
→複数のインスタンスを論理的にグループ化して
　パフォーマンスの向上・耐障害性を高める

snowball mobile
→最大100Pのデータを移送

Kinesis video streams
→保存・分析・再生のためにビデオをキャプチャ・配信
　HLSに変換する必要がない
.NET MAUIのMVVMにおいてRadioButton.Contentの中においたPickerがバインドされない

質問書こうかなと思ったけど解決で来たのでメモ。

### 発生している問題・エラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65842/aefc9fb0-cb19-d294-d4dd-3d0cf5d01f9e.png)

### 該当するソースコード
```xml
        <VerticalStackLayout
            HorizontalOptions="Center" >
            <Picker ItemsSource="{Binding TaskNameList}"
                                ItemDisplayBinding="{Binding task_name}"
                                SelectedItem="{Binding SelectedTask}"/>
        </VerticalStackLayout>
        <VerticalStackLayout
            HorizontalOptions="Center" >
            <RadioButton>
                <RadioButton.Content>
                    <Picker ItemsSource="{Binding TaskNameList}"
                            ItemDisplayBinding="{Binding task_name}"
                            SelectedItem="{Binding SelectedTask}"/>
                </RadioButton.Content>
            </RadioButton>
            <RadioButton>
                <RadioButton.Content>
                    <Editor Text="" />
                </RadioButton.Content>
            </RadioButton>
        </VerticalStackLayout>
```

### 解決
RadioButton.Contentの外に出してGroupName使うようにしたらいけました。

```xml
        <HorizontalStackLayout
            HorizontalOptions="Center" >
            <RadioButton GroupName="TaskNameGroup"/>
            <Picker ItemsSource="{Binding TaskNameList}"
                        ItemDisplayBinding="{Binding task_name}"
                        SelectedItem="{Binding SelectedTask}"/>
        </HorizontalStackLayout>
        <HorizontalStackLayout
            HorizontalOptions="Center" >
            <RadioButton GroupName="TaskNameGroup"/>
            <Editor Text="" />
        </HorizontalStackLayout>
```
[ServiceNow] Service Portalにお気に入りWidgetを配置する

# 概要
Service Portalにお気に入りWidgetを配置する手順を記載します。

# 環境
個人インスタンス(PDI)
Version: San-Diego
画面はすべて日本語での表示となります。手順の()内に英語での表記を併記しています。

# 手順
1. **Service Portal > ポータル(Portals)** を選択し、お気に入りを有効にしたいポータルレコードを選択する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/6d3e390b-ce85-f93b-f09e-d1e1a95a3a3e.png)

1. ポータルレコードの画面でContext Menuの **構成(Configure) > フォームレイアウト(Form layout)** を選択する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/d2c31251-49cb-bdb8-d747-f591f7391bd1.png)

1. **お気に入りを有効にする(Enable favorites)** というフィールドを追加し、保存する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/a3743ed3-c5cc-03c6-bde5-5658d9e99514.png)

1. 手順①で選択したポータルのレコード画面で **お気に入りを有効にする(Enable favorites)** にチェックを入れて、保存する。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/3578c46b-511c-de27-9448-065e6a3d6a3f.png)

1. **Service Portal > サービスポータル設定(Service Portal Configuration)** を選択し、サービスポータル設定を開く。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/fd91a3c4-e0e0-b2a0-3de3-7406eb9a8163.png)

1. **デザイナー(Designer)** をクリックし、**サービスポータルデザイナー(Service Portal Designer)** を開く。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/418617f0-b083-75af-30a0-65586f6c9803.png)

1. **サービスポータルデザイナー**でお気に入りウィジェットを追加したいページを選択する。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/1872e8c4-260f-23cb-4f8b-ee861e4c2b34.png)

1. サービスポータルデザイナーで **お気に入り(Favorites)** というウィジェットを追加する。
日本語環境の場合 **お気に入り** が2つ検索に引っかかるが、ページに追加した場合に **自分のお気に入り** と表示される方を選ぶ。
英語環境の場合は、**Favorite** ではなく **Favorites** を選ぶ。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/e7740eb2-3917-ee19-b962-195ae1435d10.png)

1. サービスポータルの画面に移動する。お気に入りに追加したいカタログアイテムを開き、右上の☆アイコンをクリックする。
アイコンの **☆** が **★** に変わり、お気に入りに追加された旨のメッセージが表示される。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/31633d5c-8b68-794c-a11e-64c0568cacfa.png)

1. サービスポータルのトップ画面でお気に入りウィジェットを確認すると、先ほど選択したカタログアイテムがお気に入りとして追加されていることが確認できる。
 なお、表示される文言はカタログアイテムの **概要説明(Short description)** と **説明(Description)**。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/0f139266-fe3a-bd6b-15d4-d6ff460b2d62.png)

1. 標準のバナーメニューを使用している場合、**自分のお気に入り(My Favorites)** が追加されており、こちらからもお気に入りが一覧できる。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/a272a1d3-95a1-f313-4eff-51c6e2b4f4b5.png)

1. なお、手順4で設定したポータルレコードの **お気に入りを有効にする(Enable favorites)** のチェックを解除して保存するとお気に入りは表示されなくなるが、再度 **お気に入りを有効にする(Enable favorites)** のチェックを入れて保存すると復活する。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/197a01b2-6371-0d92-85a2-1762d6065845.png)

1. 実データは **ポータルのお気に入り(Portal Favorites)** テーブルに保存されており、フィルターナビゲーターで **sp_favorite.list** を入力することで確認できる。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841320/5503f9b3-613c-fea3-ace2-83b8eb9bba25.png)


以上
【ServiceNow】San Diegoリリース Conversational Interfaces Homeについて

San Diegoバージョンアップで追加された新機能「Conversational Interfaces Home」についてご紹介します。

## Conversational Interfaces Homeの特徴
仮想エージェントとライブエージェントを開発者がセットアップ、管理、監視するための機能が集約されており、チャットのUI設定やテスト実行などがこのHomeから行えるようになりました。
また、Virtual Agentに関するプラグインのインストールが可能なほか、リリースノートや製品ドキュメントの確認、コミュニティへの質問なども可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/c8914774-f1fb-8a89-6cd1-308bdbbaf8f0.png)

※Conversational Interfaces Homeは、Conversational Interfaces > ホーム から開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/023b0ef6-094a-0ce9-c006-6b275665f3dc.png)


## チャット設定
仮想エージェントとエージェントチャットの設定を行うことができます。
#### ・全般設定
チャットのUIやチャット前のサーベイ設定、特定のアクション後のメッセージなどを設定できます。
ページ右側からはプラグインのインストールもできます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/a22cf129-3f47-c8ef-8bbc-6b5412c22c05.png)

自社用カスタム設定 > Default Branding ではチャットの色や名前などを設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/9992cdfe-4f16-944a-2106-3f1d547abaf9.png)


#### ・仮想エージェント
仮想エージェントのNLUやAI Search、インシデントの自動解決などが設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/826b71c1-5db8-e01f-e8ae-62fd116bf7fd.png)


#### ・エージェントチャット
エージェントチャットで接続する際のメッセージやエージェントの名前やアバターなどを設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/8697a234-3351-c855-631d-7f0beb9c9b3d.png)


## プラグインのインストール
プラグインのインストールも便利になりました。ホームタブのトップで、Storeサイトやアプリケーションページを開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/f853cafc-520e-be2a-55b3-6e8f6e921467.png)


## 役に立つリソース
・仮想エージェントに関する以下のリンクがまとめられています。
　・ 各バージョンのリリースノートや製品ドキュメントの確認
　・Now Learningでの学習
　・コミュニティへの質問
　・ガイド付きセットアップの使用
　・Now Learningからのガイドのダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/982ce032-d1db-d815-2cf0-58e508902240.png)

・同様にエージェントチャットについてもまとめられています。
　・各バージョンのリリースノート、製品ドキュメントの確認
　・エージェントチャットとAdvanced Work AssignmentのFAQをまとめたコミュニティ記事
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/3d664942-c13c-0df8-7fb6-031d1e2e2c58.png)


Homeという1つのページに様々な機能が統合されているため、より開発がスムーズに行えるようになっていますので、ぜひ活用してみてください。
【Power Platform】SharePointのリスト作成

## はじめに

Power Platformを使う方が増えている中で、SharePointにデータを持たせて、自動化する等、日々の業務を効率化したいということを考える方も多いと思います。
そこで、まずは、初歩として、SharePointでリストを作成する方法について以下にご紹介します。
※豆知識も紹介しますので、ご参考にしていただければと思います。

## 概要

SharePointでリストを作成する概要としては、下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/4523575a-adcf-b3db-d2c7-ab45ea436a7f.png)

## １．SharePointでリストを新規作成
①下記画面の新規からリストを選択します。
※他の新規作成もこちらから可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/c80d6b45-0fdd-da7b-da54-83dab3406cc0.png)

②リストの名前を設定する画面が表示されますので、名前とリストの説明を記載し、作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/fdb9879e-b60d-475f-143f-42bceb3d96d2.png)

③下記のようにリストが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/448315a1-dd72-caa2-6c9b-546d306bd481.png)


## ２．リストに必要な項目を追加
①リストの一覧に表示されますので、リストにフォーカスをあてると縦３点リーダが表示されます。
その中の選択肢から設定を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/3548dbca-9f17-de16-c3ee-c9bafb16585e.png)

②設定を選択すると下記のようにリストの項目の一覧が表示されるので、列の作成を押下します。
※項目を設定していない状態だと下記の項目が設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/f76bf532-2aa6-c968-37dc-824b960380ea.png)

③列の作成を押下すると下記のように列の情報を設定できる画面が表示されるので、値を入力しOKボタンを押下します。
※列名には、日本語を設定することも可能ですが、ここでは、ローマ字や英語等、半角英数字を設定するようにしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/44f3d13a-0c73-058d-e392-db4a6c898da3.png)


## ３．リストの項目名称変更
①ここで、２-③にて、列名を設定しましたが、ユーザが使用する際に英語だと使いずらいと思いますので、ここで日本語に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/4d11d8f3-448d-04c0-2d6b-128f7a8430b5.png)


## まとめ
Power Appsではリストを作成してしまえば、リストの値に準拠して、画面を自動で作成してくれる機能が存在しします。
複雑なプログラムもないので、初心者の方も使いやすく、また、作成後にすぐに実証できるので、使用感を即時に体感いただけるかと思います。
今後も、Power AppsやPower Automateの記事を上げていきますので、繰り返し業務で多忙になっている方のご負担が少しでも軽減されればと思います。
paizaラーニング スキルアップ問題集 Aランクレベルアップメニュー JavaScript 最大公約数  べき乗の計算 (paizaランク C 相当)  を解いてみた

paizaスキルアップ問題集 Aランクレベルアップメニュー 最大公約数
べき乗の計算 (paizaランク C 相当)

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_calculation_step2

をJavaScriptで解いてみました。

ランクC相当ですが、難易度: 2230 ±30程度となってました。
どこが難しいのか試しに解いてみましたが、入力値1000000000000の時にうまくいきませんでした。

C++やPython3、Rubyの模範解答を参考に、以下のように解答しても、やはり入力値1000000000000で、間違いがありました。
```javascript:JavaScript
//75点のコード
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

let N = Number(lines[0]);
const M = 1000003;
let ans = 1;
let pow = 2;

while (0 < N) {
    if (N & 1 === 1) {
        ans = (ans * pow) % M;
    }
    pow = (pow * pow) % M;
    N >>= 1;//ここがうまくいっていない
}
console.log(ans);
```
どこでつまづいているのか調べたところ、

```javascript:JavaScript
N >>= 1;
```
です。
どうやら入力値が大き過ぎて、ビット演算` >> `がうまくいっていないようです。

解決策として、`BigInt`を使ってみました。
>BigInt は(中略)大きすぎて number プリミティブで表すことができない数を、表現したり操作したりするために使用します。
>整数リテラルの末尾に `n` を追加するか、 `BigInt()` コンストラクターを呼び出し、整数値または文字列値を与えることで生成することができます。

参照

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt


```javascript:JavaScript
 N = Number(BigInt(N) >> 1n);
```
これを使って以下のように解答したところ、無事100点が取れました。
```javascript:JavaScript
//100点のコード
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

let N = Number(lines[0]);
const M = 1000003;
let ans = 1;
let pow = 2;

while (0 < N) {
    if (N & 1 === 1) {
        ans = (ans * pow) % M;
    }
    pow = (pow * pow) % M;
    N = Number(BigInt(N) >> 1n);//改善箇所
    
}
console.log(ans);
```
JavaScriptの問題で、ランクがDやC相当にもかかわらず、難易度が高い場合、とても大きな数の処理でうまくいかない場合があるようです。
よろしければ参考にしてください。
* * *
また、補足ですが、`BigInt`やビット演算子`>>`を使わずに、仕組みだけ参考にして解いてみました。
`N`を`.toString(2)`で二進数の文字列に変換して、
その末尾から順に`"0"`か`"1"`を判定していきます。
`"1"`ならば、`pow`を掛けて、`m`で除き、余りを残します。
文字列なら大きな数値も誤差なく扱えます。

```javascript:JavaScript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const N = Number(lines[0]).toString(2);
const m = 1000003;
let ans = 1;
let pow = 2;

for (let i = N.length - 1; i >= 0; i--) {
    if (N[i] === "1") {
        ans = (ans * pow) % m;
    }
    pow = (pow * pow) % m;
}
console.log(ans);
```
Ubuntu22でTorブラウザがインストールできない

`torbrowser-launcher`を使ってインストールしようとするができない。

環境：

```
$ uname -a
Linux pwner 5.15.0-47-generic #51-Ubuntu SMP Thu Aug 11 07:51:15 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
```

# 解決

原因は`/usr/lib/python3/dist-packages/torbrowser_launcher/__init__.py`のコードにある。

![privsettign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/12e964ab-ef5f-190c-8f02-b443c2872d38.png)

画像の99行目と100行目について、`/`を`//`に書き換える：

```/usr/lib/python3/dist-packages/torbrowser_launcher/__init__.py
  (desktop.width() - window_size.width()) // 2,
  (desktop.height() - window_size.height()) // 2
```

この修正をしたら`torbrowser-launcher`で無事インストールできました。
kintoneほか備忘録

自分の備忘録なので、つらつら＋整合性がないかも。
追記更新も特記なしでしていく予定。

これから自分に必要なkintoneの情報を少しづつアップデートしていこうと思う。

エクセルの記録表をkintoneで表記するためには、
一覧としてのデータをレコードに入力する必要がある。
そのため、サブテーブルに必要な事項を入力することで枠を作成できる。

テーブルに初期値を追加するプラグインがあるので、それで点検などで必要になる事項を予め入力しておく。
そうするとレコード作成時に点検時の必要事項を入力するだけでよくなる。
（9/23追記：
⇒遅い！100行以上、500項目近く初期値を追加しているためか、そこそこのPCでも表示まで8秒、surfaceGoだと処理が重くて1回停止してしまった。
しかし、これでもExcelから5分割して表示しているため、何とか使いやすくしなければならないのだが対策がわからない。
機能は満たしているが、利用時の作業感に不便を感じる場合は絶対に使われない。レスポンスと操作の簡略化は絶対に必要
9/23終）
サブテーブルを使わない方法も考えてるが、元々エクセルで300行あるデータのため、フィールド数500を超えてしまう。
厳しいかなー

対策として思いつくのはエクセル側からデータを取得できるように作り込んでデータを出力してもらうこと？
できる？簡単ではないし手間が増えてるため現状では不足している。
https://kimama-vba.com/2019/12/15/kintone_excel/
こんなのもあるので、API経由でデータを入れ込むことはできると思われる。
GoogleDriveに入れれば、RPAにすることもjavascriptだけで記述することもできそう。（VBAは指定のgoogledriveに入れればよいだけになる）
Excel⇒Googleスプレッドシート⇒kintone
この辺りは相談したい

⇒やりたいことやってらっしゃる方やっぱりいますね。
https://qiita.com/stro_hikaru/items/1adcfa3c3748418bae5b
ほんの少し違うけどほぼやりたいこと。
excelのシートごとにデータが必要なので、VBAで実装する必要があるがめんどい。最悪全部スプレッドシートに入れてGASで実装すれば
javascriptがほぼ使えるので似た記述ですむかな？

⇒NSASさんのExcel連携アドインを使うことにした。
Excelの特定セルに対応したフィールドを入れることで、ボタン一つでデータをkintoneに入力できる。これが欲しかった。
データの整合性、重複を避けるため、Excelにレコード番号と対象の一覧表を作り、これ自体を連携・更新する必要があるけど
それくらいでコーディングなしに連携でき、仕事はほとんど変わらないなら上等すぎる
これを少し使いやすくボタンの用意位はすべきかもしれないが、それくらいなら
(10/15)



・同じアプリのサブテーブルからデータを引き出す方法

わからない。javascriptで書く場合も、同じアプリの中から特定条件で引き抜き、コピー元を選択する機能を作成する必要がある点がつらい。
マスタデータ以外から引き抜くのは難しい気がする。
実際に作成するとしたら、RPAを活用して進める必要があるか？

①予め同じアプリのデータ保持用コピーを作成
②RPAで定期的にデータをコピーして保持用アプリに移す
③ルックアップ参照元を保持用アプリにすることで引き出す
同じアプリの別レコードだと困難に思えるので、まったく同じデータを持った別のアプリを用意して参照元にすれば動く？
⇒これはアプリアクションで一応解決を見た。
同じアプリのアプリアクションで保持したいデータを別の参照用フィールドに入れ込めばOK。
ただし、新しいデータ入力に当該レコードから作成してもらう手間がある。


・トランザクション対策
在庫管理や日誌とかでトランザクション（入出力の一貫処理？）がなく、不整合が起こりうるので、プロの力を借りる？
手を出さない方がよい領域を認識する必要があるとのことだが何でこの不整合が起きるか認識しておく


・IT導入補助金はkintoneそのものでは対象にできない。
IT導入補助金を入れると自分で作る意識が低減してしまうのでは？ってことか
ランニングコストを意識しておく？


5/22追記-
https://cybozudev.zendesk.com/hc/ja/community/posts/13034809411993

上記サイトのような動きを行いたかったため、javascriptの転載及び編集を少ししたが、
TISさんの条件分岐処理プラグインで、
「チェックを条件にTODAY()追加」
「チェックされていないことを条件に"無"を入力」
これで実現できてしまった。
自分はこの処理を40回程度繰り返したいので、javascriptで実施するフィールドを全て指定、実行する方が一つ一つ設定しなくてよい分速くて楽だが、ノーコードのメリットを生かす意味ではプラグインでできることは理解しておいた方がよかったと思いました。
サブテーブルの場合は、「チェックを条件」＋「"TODAY()を入力したいフィールド"が無と等しい」を条件にすることで大丈夫のはずです。


追記終了
ReactNativeアプリでアイコンを使用する


# 目次
[1. ライブラリのインストール](#1-ライブラリのインストール)
[2. linkコマンド実行と設定ファイルの修正](#2-linkコマンド実行と設定ファイルの修正)
[3. jsファイルの記述](#3-jsファイルの記述)

[参照１](https://reactnative-st.com/2020/06/26/%E3%80%90reactnative%E5%85%A5%E9%96%80%E3%80%91%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3_react-native-vector-icons%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)
[参照２](https://dev-yakuza.posstree.com/react-native/react-native-vector-icons/)

# 1. ライブラリのインストール

react-native-vector-iconsをインストールする
```
$ npm npm install react-native-vector-icons
```

# 2. linkコマンド実行と設定ファイルの修正

linkコマンドを実行

```
$ npm react-native link react-native-vector-icons
```

android/app/build.gradleに下記を追記

```android/app/build.gradle
・・・
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" // 追記
・・・
```

# 3. jsファイルの記述

[公式ディレクトリ](https://oblador.github.io/react-native-vector-icons/)で実装したいアイコンを探す
以下、FontAwesomeのtoggle-offを実装する時の記述

```lavascript:Main.js

import Icon from 'react-native-vector-icons/FontAwesome';

  return(
・・・
    <Icon
      name='toggle-off'
      color='#808080'
      size={40}
      onPress={() =>
        toggleOn(listData.no)
      }
    />
・・・
   );

```
OCI Network Firewallによるトラフィック監視 (Intra-VCNルーティング)

Palo Altoの次世代ファイアフォール VM-SeriesをベースにしたOCIネイティブのNetwork Firewallが2022年7月にリリースされました。IPSやIDSとしてトラフィックを検査するので、正しく動作させるにはVCNやサブネットのネットワークの構成が非常に肝になります

OCIチュートリアルには、ネットワークやポリシーの設定手順が一から丁寧に説明されていますので、まずはこちらを参照しながら具体的な設定や動作を試してみるのが良いかと思います
[OCI Network Firewallを構築する](https://oracle-japan.github.io/ocitutorials/intermediates/networkfirewall/)

ここではネットワークに絞って、Network Firewallを通過させるためのサブネットの構成やルート表の設定について、いくつかのパターンを紹介していきます

## サブネット間トラフィック監視 (Intra-VCNルーティング)

最もシンプルな構成としては、下記のようにサブネット間の通信にNetwork Firewallを必ず経由させるIntra-VCNルーティングがあります。ポイントは、Private Subnet1 <=> Private Subnet2の通信は、ルート表の指示によって必ずNetwork Firewallにルーティングされるというものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/3e40a1f7-5def-4318-a489-22a68463c2d4.png)

ここからは、実際にこのネットワーク構成を作ってみます

- 3つのプライベート・サブネットを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/8878230d-1427-bb3a-5d15-c14a2b0a6108.png)

- Network Firewallのポリシーを作成
導通テスト用に無条件ですべてのトラフィックを許可するポリシーを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/121909e2-7b52-1c4e-6ab9-1b5d3dce78f7.png)

- Network Firewallを作成する。サブネットはFirewall Subnetを選択し、ポリシーは上記で作成したものを指定する。作成後には、FW自身のIPアドレスをメモしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/af0325c9-e70f-2c89-da36-a063e2bfcdd4.png)

- 2つのルート表を作成
    - Subnet1用のルート表 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/52fa8421-4e7b-973c-6e73-c3e940341b3f.png)
    - Subnet2用のルート表 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9a253fd9-42dc-8996-f2c1-22f55f81eedd.png)

- 作成した上記のルート表をそれぞれのサブネットのルート表に割り当てる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/05a23e95-76f7-7484-99fc-888d82e194c4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/6b3cfa83-4429-2b1f-cb25-914cafe366eb.png)

- Subnet1とSubnet2にそれぞれインスタンスを作成し、SSH接続できるか確認する
下記の例だと、Vm1からVm2のSSH接続ができれば、Network FirewallのAll Passのポリシーを経由して接続ができたことになる (※Vm1には、パブリックの踏み台VMまたはBastionサービスで接続する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/82ebdd58-69ce-c359-23cf-823cc15bfc2d.png)


- 次に無条件ですべてのトラフィックを拒否するポリシーを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a8d1e8e5-0021-2ac8-4ac7-c8085050f069.png)

- Network Firewallの編集から上記のポリシーに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/04214137-5ff4-74dc-922d-1edfa5c62683.png)

- 正しくNetwork Firewallが動作していればSSH接続が拒否される
```
$ ssh 172.16.1.206
ssh: connect to host 172.16.1.206 port 22: Connection refused
```


これでNetwork Firewallを経由するIntra-VCNのネットワーク設定は完了です。以降は、Network Firewallのポリシーを色々変えながら挙動を確認してみて下さい。
次回は、ハニーポットを使ってインターネットからの不正アクセスをIPS(侵入防止)で防ぐという構成を作成してみたいと思います。
SSL証明書更新・自動更新（win-acme）➀


### 【この記事を読むのは、こんなことに困った時】

➀SSL証明書更新の方法がわからない時　◀今回はここ
➁SSL証明書更新は手動でできるが自動更新にしたい時　◀次回記事

※いつもの流れだけ知りたい時(Nignx作業から)は[ここから](https://qiita.com/kusaharajiji/items/bba526555f515967ecb9#nignx%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E9%9A%9B%E3%81%AEssl%E6%9B%B4%E6%96%B0%E3%81%AE%E6%B5%81%E3%82%8C)

---

#### ＜前提＞

PC：Windows
Webサーバー：IIS
キャッシュサーバーとして：Nginx
SSL証明書：win-acmeで取得していること

※この記事は既にwin-acmeでSSL証明書を発行している前提です。

---

### 【先ずは、➀SSL証明書更新の方法がわからない時】

#### ＜流れ＞

＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
※この流れの前後に筆者と同様の＜前提条件＞の場合はNignxの必須作業あり。
※実際行う際は『「➀SSL証明書更新の方法がわからない時」のwin-acmeのみで更新できない時』を必ず読みNignxの停止と再開も行うこと。
＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊

1.サイトのサーバーに移動（リモートデスクトップで開く）
2.win-acmeを開く(ファイル名「wacs.exe」←クリック)
3.ターミナルが開く
4.「R」を選択し更新する
5.「Q」でターミナル終了

---

### 「➀SSL証明書更新の方法がわからない時」流れを詳しく追う

##### 1.サイトのサーバーに移動（リモートデスクトップで開く）

WEBサイトのSSL証明を更新するのでサイトのサーバに入って作業することが基本になる


##### 2.win-acmeを開く(ファイル名「wacs.exe」)

SSL証明書を更新する作業をするため、win-acmeのCLI（コマンドインターフェイス）は「wacs.exe」という。
ファイルをクリックすることでターミナルが開く。


##### 3.ターミナルが開く


##### 4.「R」を選択し更新する

ターミナルを開くと以下の表示が出てくるので「R」を選択。

```
～上省略～
 N: Create certificate (default settings)
 M: Create certificate (full options)
 R: Run renewals (36 currently due)
 A: Manage renewals (38 total, 36 in error)
 O: More options...
 Q: Quit

 Please choose from the menu:
```
訳すと

```
 N: SSL証明の作成 (default settings)
 M: SSL証明書の作成 (full options)
 R: SSL証明書の更新をする
 A: このサーバーで管理されている証明書(サイト)の一覧を表示
 O: More options...
 Q: 終了（閉じる）

```

※NとMは証明書の新規作成ですが今は違いがわかりません。
※Oもまだ理解していません...


##### 5.「Q」でターミナル終了

SSL証明書の更新作業終了です。
…しかし、筆者の場合はNignxを利用しているので、この方法では更新できません。


<br>

---

### 「➀SSL証明書更新の方法がわからない時」のwin-acmeのみ作業で更新できない時

#### -Nginxをキャッシュサーバーとして利用している時-

・上記の「➀SSL証明書更新の方法がわからない時」の作業の前にNginxを止める必要がある。

理由：Nignxとwin-acmeが同じポート設定（8000など）されていると後から起動したwin-acmeは作業は不可になる。同じポートを同時に使えないため。

##### ＜Nignxの停止と開始＞

・Nginxの階層でコマンドプロンプトを開く
　→フォルダ「nginx-1.18.0」に入る→ファイルのパス欄を削除してそこに「cmd」と打つ→コマンドプロンプトに「C:\nginx-1.18.0>」と表示される→その後にコマンドを打つ。
![cmd入力後エンター押すと開く-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661441/bbc66e7e-b253-934e-d1db-166d40fac595.png)

【コマンド】
```
＜Nignxの停止＞
C:\nginx-1.18.0>nssm stop Nginx_1.18.0

＜Nignxの開始＞
C:\nginx-1.18.0>nssm start Nginx_1.18.0
```

<br>

---

### ◆◆◆「Nignxを利用している際のSSL更新の流れ」◆◆◆

```
1.＜Nignxの停止＞
　・nssm stop Nginx_1.18.0

2.＜win-acmeでSSLの更新作業「➀SSL証明書更新の方法がわからない時」＞
　・win-acme（「wacs.exe」）を開いて「R」で更新
  
3.＜Nignxの開始＞
　・nssm start Nginx_1.18.0
```

<br>

---

これで更新作業は手動できるようになりました。
更新初回はもう少し長いかもしれませんが現在私の更新では55日間のSSL証明書付与期間でした。
なので、手動の場合は更新後55日後に期限切れになるのでまた更新しなければなりません。

ということで、自動更新にして手間をはぶきたい！
なので次回に続きます！

###### 次回は「[➁SSL証明書更新は手動でできるが自動更新にしたい時](https://qiita.com/kusaharajiji/items/11ee93685b6c65bc3f4a)」です！




<br>

---

#### 【気になるワード】---記事内でより理解を深めたいワード
 
・win-acmeの役割
・win-acmeでSSLの新規作成
・SSL更新のメニュー内容をより深く知る。
・Nginxとwin-acmeの関連を調べたい。
放物線「2022年 早稲田高等学院 数学 問3」をsympyでやってみた。 

オリジナル:ますいしい様
ｙ=x**2 

https://ameblo.jp/mathisii/entry-12760301304.html

# sympyで(ますいしい様の手順で)
勉強中

# sympyで(安易な方法で)
＞最初から解答を見て、チャレンジしています。
ますいしい様の手順のつもりが、途中から安易な方法になってしまいました。
```python
from sympy import *
x,y=symbols("x,y",real=True)
f=x**2                                                       # ア
O=Point(0,0)
A=Point(2,f.subs({x:2}))
OB_y=solve(Line(O,A).perpendicular_line(O).equation(),y)[0]
B_x =solve(f-OB_y,x)[0]
B_y =f.subs({x:B_x})
AB_y=solve(Line(A,Point(B_x,B_y)).equation(),y)[0]      # ウ
print("#(1) y=",AB_y)
B    =Point(B_x,B_y)
H2   =2*(Line(A,B).projection(O))
H_xx =solve(f-solve(Line(A,B).parallel_line(O ).equation(),y)[0],x)+ \
      solve(f-solve(Line(A,B).parallel_line(H2).equation(),y)[0],x)
print("#(2)",H_xx)  # 並べ替えしていません。勉強中。
P=Point(H_xx[2],f.subs({x:H_xx[2]}))
Q=Point(H_xx[3],f.subs({x:H_xx[3]}))
print("#(3)①",P.distance(Line(A,B).projection(P)).simplify())
print("#(3)②",abs(Polygon(A,B,P,Q).area)) #普通は,projectionです。
#(1) y= 3*x/2 + 1
#(2) [0, 3/2, 3/4 - sqrt(41)/4, 3/4 + sqrt(41)/4]
#(3)① 2*sqrt(13)/13
#(3)② 5/4 + sqrt(41)/4
```

# 参考
type 'FlexParentData' is not a subtype of type 'StackParentData' in type cast


超簡単に説明すると子ウィジェットに一致する親ウィジェットがない場合に発生します。

OKな例

    Stack( 
      children:[
        Positioned(
          child: Text("Hello ")
        )
      ]
    )

NGな例

    Stack( 
      children:[
        Positioned(
          child: Text("Hello ")
        )
      ]
    )
    ↓これ
    Positioned(
      child: Text("Hello ")
    )


PositionedはStackの中で使うものなので、外では使えませんよって言うことでした
Shopify開発者向けツールを使うまでに勉強したこと

# この記事の内容
RailsアプリにShopifyを埋め込んで開発をすることになりました。Shopifyは名前程度しか知らなかったので、概念から色々分からないので勉強したことを書いていこうと思います。

# 参考書籍
早速ですが、参考書籍です。大体のことはこの本を読めば概要が掴めました。非常に良著だと思うので、Shopifyアプリ開発をこれから始めようという方には是非お勧めしたいです。

https://prtimes.jp/main/html/rd/p/000000117.000071307.html

# 調べたこと
## 何を開発できる？
ShopifyはECサイトを簡単に構築できるツール、ということは知っていたのですが、開発者としては一体何が構築できるのでしょうか？主に以下の4つのようです。

- [Shopify App](https://shopify.dev/apps)(拡張機能)
- [テーマ](https://shopify.dev/themes)(見た目)
- [StoreFronts](https://shopify.dev/custom-storefronts)(よりリッチなフロントを使いたい時の機能)
- [Marketplace](https://shopify.dev/marketplaces)(自サイトで商品を販売する機能)


## APIと開発の関係
Shopifyに保存されているデータはAPIで取得してアプリケーション上で表示・編集等が可能です。ShopifyにはさまざまなAPIがありますが、主なAPIは下記の通りです。

▼参考サイト
https://chatboost-ec.dmm.com/blogs/column/shopify-how-to-use-api

- APIの種類
    - [Admin API](https://shopify.dev/api/admin)(Shopify上のデータにアクセスするために利用する)
    - Storefront API(Shopifyストアの販売や注文に関する機能を外部で利用することが出来る)
    - Partner API(パートナーダッシュボードにあるデータにプログラムでアクセスする場合に利用)
    - LiquidとAjax API(Shopifyでテーマを開発するために利用する)
 
この中で一番利用するのが[Admin API](https://shopify.dev/api/admin)だそうです。その他、用途に合わせて利用しましょう。


## Admin APIを使うとどんな情報が利用できるのか
こちらのレファレンスを見ると、AdminAPIの使い方、利用できるデータなどがわかってよさそうです。
https://shopify.dev/api/admin-graphql

なお、上記のレファレンスはGraphQLでデータを取得することを前提としています。他にもREST APIを使用して情報を取得できる様ですが、ここでは割愛します。

なお、[専用のアプリ](https://shopify-graphiql-app.shopifycloud.com/login)を使うと`graphiql`で視覚的にデータを取得できるので、合わせてご紹介します。

▼こんな感じ
[![Image from Gyazo](https://i.gyazo.com/cece449b2dfad9a6e307455ada9fc15e.png)](https://gyazo.com/cece449b2dfad9a6e307455ada9fc15e)

## コミュニティ見ながら開発頑張ろう！
ここまで来たら、目的別にやりたいことは分かれてくると思うのでコミュニティ等で調べらながら開発を続ければ良いと思います。
Shopifyはコミュニティが充実していて、私もたくさんブックマークを作りつつ開発を進めていますが、秀逸なまとめ記事を見つけたのでこちらを参照なさるのが良いと思います。

https://qiita.com/t-kurasawa/items/3e90c31fe0d16ff9095d
ログの保管期間の設定方法

1.システム定義　＞　テーブルローテーション　を選択
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841200/eae6aa9e-368f-8ac3-63a2-1fbbfd71c2f3.png)

2.syslogを選択
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841200/a7d80496-d4e9-1f10-9145-14244a4e69f8.png)

3.デフォルトでは7日を8ローテーションするため、56日（約2か月）の保存となっている。
お客様の要望に合わせてローテーションの値を変更する事でログの保管期間を変更可能。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841200/c5180344-ecd9-fa32-6787-44b8d5e46873.png)

4.設定変更後、更新を選択。(完了には時間がかかる場合あり。)
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841200/34a2d55e-37fa-89e9-0a80-c3114e5c3e57.png)

5.ローテーションの値が更新されていることを確認し、完了。
![キャプチャ5.1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841200/9d4678af-08f7-7038-f20a-a6e879c87768.png)
【Power Platform】 Power Appsから任意の列順でcsv出力

## はじめに

Power Platformを使う方が増えている中、業務で発生する繰り返し作業を自動化したいというニーズも増加しているように思います。
そんな中、Power Appsで検索した一覧結果をcsv出力したいという要望です。
そこで、Power Apps(画面)からPower Automate(処理)を使って任意の列順でcsv出力する方法について以下にご紹介します。
※豆知識も紹介しますので、ご参考にしていただければと思います。

## 概要

画面で検索した一覧結果のCSV出力の概要は、下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/ff1b3093-5916-992e-874c-18f10f53e5fb.png)


## 具体例
全体像としては下記のようになります。
※詳細は、追ってご説明いたします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/92eced06-027d-2753-5787-3e1477c2a40d.png)



## １．画面から処理を呼び出し

下記をCSV出力ボタンのOnSelectイベントに記載することで処理を呼び出すことができます。
`
Set(
    varCSVFile,
    CSV出力.Run(varJSONINPUT).linkoutput
);
`

Power Automate側のトリガーには、様々なものがありますが、本日は、画面から手動で実行するため、手動トリガーを設定します。
※こちらをスケジューリングされたトリガーにすると毎日csvを対象のフォルダに出力することができます。
<details><summary>もっと見る</summary>
・入力の追加

「入力の追加」を押下することで、手動トリガーの引数を設定できます。
※引数を設定することで画面で検索した内容を元にCSVを出力することが可能です。

</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/9146e87c-effa-7cdb-1e3e-914b83857e1b.png)



## ２．任意の列順を設定
CSVを出力する際は、特定の値を任意の列に出したいというのが通常だと思いますが、元々準備されているPower AutomateのCSV出力では、テーブルに入っている順番でしか出力できない。
そのため、下記のように順番を設定して上げる必要がある。

<details><summary>もっと見る</summary>
■JSONの解析

引数で渡されたJSONを分析します。


■CSVテーブルの作成
こちらに記載された順序でCSVが出力されます。
※例では、タイトルと社内管理担当者名称をＣＳＶに出力しています。
※情報が多かったとしてもこちらに記載された情報しかCSVに出力されないので、ユーザに必要な情報のみを取捨選択が可能です。



</details>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/9bbf23fb-cb98-aee7-f7b1-bb1d9f7e652d.png)



## ３．CSVを作成し画面から出力

メールを送信します。
※メールにURLを添付したいことがありますが、その際は、URLを変数にいれることをお勧めします。
　URLを変数に入れずにメール本文に入れた場合、Power Automateを開くたびに文字が変換されて、本来想定していたURLとは違うものが送られてしまう可能性があります。


<details><summary>もっと見る</summary>
■ファイルの作成

・サイトのアドレス
サイトのアドレスを設定します。

・フォルダーのパス
作成するファイルのパスを設定します。

・ファイル名
出力するCSVのファイル名称を設定します。
※CSVの名称が重複しないために、下記のように日時込みのファイル名称で出力します。
`
formatDateTime(addHours(utcNow(),9), 'yyyyMMddhhmmss')
`

・ファイルコンテンツ
出力するCSVの情報を設定します。
例の場合は、「CSVテーブルの作成」で作成した情報を設定します。


■DBLink作成
・入力

パスを設定します。

■PowerApp または Flow に応答する
・LinkOutPut
出力されたCSVのフォルダパスを画面に戻します。


</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/3cb0311b-1f72-b820-1604-3f7bde2cbd1f.png)



## まとめ
Power Platformは、初心者の方も使いやすく、また、作成後にすぐに実証できるので、使用感を即時に体感いただけるかと思います。
今後も、Power AppsやPower Automateの記事を上げていきますので、繰り返し業務で多忙になっている方のご負担が少しでも軽減されればと思います。
Power Query で「禰󠄀豆子」の長さを測る

　文字の長さを測るときの注意点を書きます。

# Text.Length

```text:Text.Length構文
Text.Length(
    text as nullable text
) as nullable number
```

　Text.Lengthは、文字列の長さを測ります。

```
Text.Length("Hello World")
```
 この答えは11です。

# utf8mb4
　英数字はそのまま数えれば答えが出せます。

```
Text.Length("Hello 太郎")
```
　この答えは８。日本語が混じっていても期待通りの長さになります。しかし、「😇」のような絵文字や「禰󠄀」のような異字体については、期待した長さになりません。

|文字|コードポイント|符号|Text.Length|Binary.Length|Power Query|
|:-:|:-:|:-:|:-:|:-:|:-:|
|A|U+0041|41|1|1|#(0041)|
|あ|U+3042|E38182|1|3|#(3042)|
|㉑|U+3251|E38991|1|3|#(3251)|
|😇|U+1F607|F09F9887|2|4|#(0001F607)|
|禰󠄀|U+79B0 U+E0100|E7A6B0F3A08480|3|7|#(79B0,000E0100)|

　「😇」はUnicodeの32ビットで表され、「禰󠄀」については、Unicode16ビットの「禰」の文字に異体字セレクタ32ビットの U+E0100 を付加する形で１文字が作られています。Text.Lengthは16ビットで長さ1と計算しており、「😇」は長さ2、「禰」は長さ3です。Power Queryのコード上でエスケープシーケンスを使って書くと **"#(0001F607)"** と **"#(79B0)#(000E0100)"** で表示できます。
　面白いことに、Power BIのエディター上では「禰󠄀」の文字を表示させ、バックスペースを一回押すと「禰」の文字に変わります。「禰」（長さ１）＋異字体セレクタ（長さ２）の2文字として認識しているようです。

　結局「禰󠄀豆子」は「禰󠄀」が長さ３で「豆子」が長さ２となり、合計で長さ５となりました。

|文字|Text.Length|Binary.Length|符号|
|:-:|:-:|:-:|:-:|
|禰󠄀豆子|5|13|E7A6B0F3A08480E8B186E5AD90|

# わかったこと
- Text.Lengthで文字の長さを調べるとき、正しく測れない文字があるので注意
- Power Queryで文字をエスケープシーケンスを使って書くには、Unicodeのコードポイントが0000～FFFFの場合は #(0000) と囲って書く。それより大きいコードは #(00000000) と書く。
- 異字体セレクタなどの複数のコードでできている場合は、#(0000)#(00000000) あるいは #(0000,00000000) のようにして書く。
- 文字をバイナリで分割できるので、文字数をカウントする関数がかけるかもしれない

# 注意すること
- Power Queryの「Text.Lengh」やDAXの「LEN」などの関数で文字列の長さを算出する際、Unicodeでは見た目の文字の長さと算出された値が異なることがある
- Dataverseなどのデータベースで文字列の長さを厳密に指定する場合、期待した動作をしないことがある

　特に２つめは気をつける必要があります。

# Sample Code

```text:長さと符号を調べる
let
    Char = "禰󠄀",
    TextLen = Text.Length(Char),                   // Text.Length = 3
    BinLen = Binary.Length(Text.ToBinary(Char)),   // Binary.Length = 7
    BinList = 
        List.Transform(
            Binary.ToList(Text.ToBinary(Char)),
            each Number.ToText(_,"X")
        ),
    HexCode = Text.Combine(BinList) 
in
    HexCode  // Hex Code = E7A6B0F3A08480
```

```text:文字からコードポイントを表示１（コードポイント0800～FFFF）
(Char as text) as text =>
let
    Step1 = Binary.ToList(Text.ToBinary(Char)),
    Step2 = List.Accumulate(
        Step1,
        0,
        (state, current) => state * 0x100 + current
    ),
    Step3 = Step2 - 0xE08080,
    Step4 = 
        {
            Number.BitwiseAnd(Step3, 0xF0000) / 0x10000, 
            Number.BitwiseAnd(Step3, 0xFF00) / 0x100, 
            Number.BitwiseAnd(Step3, 0xFF)
        },
    Step5 = List.Accumulate(
        Step4,
        0,
        (state, current) => state * 0x40 + current
    ),
    Step6 = Number.ToText(Step5, "X")
in
    Step6
```

```text:文字からコードポイントを表示２（コードポイント0800～FFFF）
(char as text) as text =>
let
    Result =
        Binary.ToText( 
            Text.ToBinary(
                char, 
                TextEncoding.BigEndianUnicode
            ),
            BinaryEncoding.Hex
        )
in
    Result
```
LaravelでSESからメール送る時の.envの設定

```
MAIL_MAILER=smtp
MAIL_HOST=email-smtp.ap-northeast-1.amazonaws.com
MAIL_PORT=2587
MAIL_USERNAME="登録した時できるやつ"
MAIL_PASSWORD="登録した時できるやつ"
MAIL_FROM_ADDRESS=hoge@example.com
MAIL_ENCRYPTION=TLS
```

MAIL_FROM_ADDRESSはSESに登録してあるアドレスを使うこと！

以上です。
【ＰＨＰ】PHPの高度な配列操作  正規化されていない配列を結合

# コード
```PHP
<?php
$query_data = [
    ['id'=> 1,'name'=>'イワーク','place'=>'渓谷,洞窟','level' => 10,'technique'=>'岩雪崩'],
    ['id'=> 1,'name'=>'イワーク','place'=>'砂漠,山頂','level' => 20,'technique'=>'岩石砲'],
    ['id'=> 2,'name'=>'ハガネール','place'=>'鉱山,地中','level' => 10,'technique'=>'メテオドライブ'],
    ['id'=> 2,'name'=>'ハガネール','place'=>'丘陵,窪地','level' => 20,'technique'=>'アイアンローラー'],
];
$res = [];
foreach($query_data as $value){
    if(empty($res[$value['id']])){
        $res[$value['id']] = [
            'id' => $value['id']
           ,'name' => $value['name']
        ];
    }
    foreach(explode(',',$value['place']) as $place){
        $res[$value['id']]['place_list'][] = $place;
    }
    
    $res[$value['id']]['lv_list'][(int)$value['level']] = [
        'level' => $value['level']
       ,'technique' => $value['technique']
    ];
}
var_dump($res);
```

# 結果
```javascript
array(2) {
  [1]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(12) "イワーク"
    ["place_list"]=>
    array(4) {
      [0]=>
      string(6) "渓谷"
      [1]=>
      string(6) "洞窟"
      [2]=>
      string(6) "砂漠"
      [3]=>
      string(6) "山頂"
    }
    ["lv_list"]=>
    array(2) {
      [10]=>
      array(2) {
        ["level"]=>
        int(10)
        ["technique"]=>
        string(9) "岩雪崩"
      }
      [20]=>
      array(2) {
        ["level"]=>
        int(20)
        ["technique"]=>
        string(9) "岩石砲"
      }
    }
  }
  [2]=>
  array(4) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(15) "ハガネール"
    ["place_list"]=>
    array(4) {
      [0]=>
      string(6) "鉱山"
      [1]=>
      string(6) "地中"
      [2]=>
      string(6) "丘陵"
      [3]=>
      string(6) "窪地"
    }
    ["lv_list"]=>
    array(2) {
      [10]=>
      array(2) {
        ["level"]=>
        int(10)
        ["technique"]=>
        string(21) "メテオドライブ"
      }
      [20]=>
      array(2) {
        ["level"]=>
        int(20)
        ["technique"]=>
        string(24) "アイアンローラー"
      }
    }
  }
}
```
非アクティブ化したユーザにメールを送信する

Salesforceを使わなくなったけど、まだ社員のパターンなのか？

[Sending email from Salesforce to user not active in SF](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JxnvRSAR)

回答はこれ。

You can add inactive user emails to " Additional Emails. "
We can have five additional emails as a maximum.


何、Additional Emailsって？

[電子メール アラートに追加の電子メールを追加するための形式](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A7Z7DSAV)

これら 5 つの外部電子メール アドレスは、有効な電子メール アドレスである必要があります。通常、読みやすくするために、それぞれを独自の行に追加します。

機能させるには、各メールをセミコロン (;) で区切る必要があります。
firebase-emulators を起動してから、webpack-dev-server を起動したい

# 前提

* Node.js, Webpackは導入済み
* firebase SDK, firebase-emulatorsは導入済み

# 結論

以下のようにコマンド実行する

```shell:gitbash
# 
# @see https://firebase.google.com/docs/emulator-suite/install_and_configure#startup
$ firebase emulators:exec "npm run serve"
```

以上
Linux logrotateについて（自分用メモ

●ログローテーション(logrotateコマンド)
ログファイルには稼働中のシステムの情報（ログ）が追記されていく。ログローテーション機能を利用することで、ログファイルが大きくなりすぎるのを防ぐことができる。

ログのローテーションには、logrotateコマンドを使用。logrotateは設定ファイルに従って、指定されたログファイルの切り替え、古いファイルの圧縮、メール送信などを行う。切り替えたログの世代管理や、ログ切り替え前後でシェルスクリプトを実行することもできる。
logrotateはデーモンプログラムではないため、通常はcronによって定期的に実行される。

logrotateの設定ファイルは「/etc/logrotate.conf」。「/etc/logrotate.d」ディレクトリに、サービスごとの個別のログローテーション設定を記述したファイルを配置することもできる。

●主なlogrotate.confの設定項目（ディレクティブ）
・compress 切り替え後のログを圧縮する
・create ログ切り替え時に新たな空のログファイルを作成する
・daily,weekly,monthly,yearly ログの切り替えタイミング
・include ディレクトリ名　指定したディレクトリ配下の設定ファイルを読み込む
・mail メールアドレス　ログ切り替えによって削除されるログの内容を指定されたアドレスにメールする
・postscript~endscript ログ切り替え後に実行するスクリプト
・prescript~endscript ログ切り替え前に実行するスクリプｔ
・rotate 切り替え後に保持する世代数
Prisma で踏み台（bastion）を超えて MySQL にアクセスする

## やりたいこと

AWS の Private Subnet に配置された RDB には直接アクセスできないので、Public Subnet に配置された踏み台サーバを経由してローカルからアクセスして、migration とか Prisma でやりたい。AWS に限らずそんなシチュエーションはあるあるかと。

MySQL Workbench などで、```TCP/IP over SSH``` で接続するでも良いけど、それってやることは同じだし（正確に何やってるかは知らないけど）、Prisma でやりたい。


## 手順

- SSH トンネリングする
- DATABASE_URL を書き換える

## 検証環境

- クライアントPC: macOS Monterey version 12.5.1
- Prisma: 4.3.1


## SSH をトンネリングする

ローカルの 3307 番ポートを LISTEN してトンネルを掘ることにする。

```bash
ssh -NL {LISTEN したいローカルのポート}:{RDS のエンドポイント}:3306 {踏み台のユーザ名}@{踏み台のアドレス}
```

ローカルの3307番ポートを開いていて、それを踏み台を経由して RDSサーバの3306番ポートにつなげる。


例えば、
```bash
ssh -NL 3307:xxxx.rds.amazonaws.com:3306 ec2-user@xxx.xxx.xxx.xxx -i ~/.ssh/xxx.pem
```

LISTENできているか確認
```bash
$ lsof -i -P | grep "LISTEN" | grep 3307
ssh       15207 kurab    5u  IPv6 0xaf20624854b1xxxx      0t0  TCP localhost:3307 (LISTEN)
ssh       15207 kurab    6u  IPv4 0xaf20624d1f27xxxx      0t0  TCP localhost:3307 (LISTEN)
```

できてる。

バックグランドで実行したい場合は、f オプションもつける（-fNL）。何もしないで固まってるターミナルなんて邪魔でしかないし。作業が終わってポートを閉じたい場合は、```ps aux | grep ssh``` でプロセス ID を探して ```kill``` すれば良い。


ここで、ついでに mysql コマンドで接続できるか確認してみる。

```bash
$ mysql -h 127.0.0.1 -P 3307 -u user -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
...

mysql>
```

できた。```-h localhost:3307``` とかはうまくいかなかった。


## DATABASE_URL の設定

```
DATABASE_URL="mysql://{ユーザ名}:{パスワード}@127.0.0.1:3307/{DB名}"
```

当たり前すぎる…
例えば、

```text:.env
DATABASE_URL="mysql://johndoe:randompassword@127.0.0.1:3307/mydb"
```

これで、```npx prisma studio``` とか、他諸々いつも通りできるようになる。


## セキュリティ

Production は、こういうことできないようにしておいた方が良いので、Prisma なしでも、やりたいことはできるようにしておいた方が良いけど、Develop 環境などは、他色々なセキュリティ対策を踏まえて、ポートフォワードでアクセスできても良いんじゃないかと思います。

おしまい。
【Rails】過去の記事がN+1問題そのものだったので修正する

# 目的

現役Webエンジニアの知り合いに[過去に書いた記事](https://qiita.com/ysk91_engineer/items/4fc6bdccb173fd21a97b)を自慢げに見せたところ、
**N+1問題って知ってる？**
と言われました。

[クロノスタシス](https://youtu.be/cCx4I4Fk5FE)よろしく、「知らな～い」と答えたところ、下記記事を紹介して頂いたのでこちらを参考に修正しました。

https://pikawaka.com/rails/includes

# 早速修正だ！

そもそもN+1問題というのは、**`has_many`で紐づけしたテーブルを呼び出す際に、いちいち全てのデータを参照して引っ張ってくること**だと理解しました。
これによってデータベースへのアクセスにかかる時間が長くなり、サーバに負荷がかかってしまいます。

## モデルで主従関係を明らかにする

過去記事では触れていなかったモデルについて言及します。
今回、Genreモデルが主、Hogeモデルが従の関係になっているので、
```ruby:genre.rb
has_many :hoges
```

```ruby:hoge.rb
belongs_to :genre
```
とします。
モデルの主従関係については過去に記事を書いていますので、[こちら](https://qiita.com/ysk91_engineer/items/52fbce9249f495ff17f4#has_onehas_manybelongs_to)を参考にしてください。

:::note info
余談ですが、`has_many`はその要素が沢山あるので**複数形**、`belongs_to`は1つの要素だけなので**単数形**で書くのが一般的のようです。
:::

## コントローラで`includes`メソッドを使用する

モデルの主従関係を元に、アクション内で呼び出す変数も修正します。

**修正前**
```ruby
# アクション内で
@genres = Genre.all
```

**修正後**
```ruby
# アクション内で
@genres = Genre.includes(:hoges)
```

これにより、ビューファイルでHogeモデルを呼び出したいときは
`@genres`に対して`hoges`というメソッドを使用できるようになりました。


## ビューファイルの修正

以上を踏まえ、ビューファイルを修正していきます。

**修正前**

```html
<% @genres.each do |genre| %>
  <p><%= genre.name %></p>
  <% hoges = Hoge.where(genre_id: genre.id) %> # ここでN+1が発生
  <table>
  <tr>
    <td>id</td><td>content</td>
  </tr>
  <% hoges.each do |hoge| %>
    <tr>
      <td><%= hoge.id %></td>
      <td><%= hoge.content %></td>
    </tr>
  <% end %>
  </table>
<% end %>
```

**修正後**

```html:ビューファイル
<% @genres.each do |genre| %>
  <p><%= genre.name %></p>
  # hogesの定義を削除
  <table>
  <tr>
    <td>id</td><td>content</td>
  </tr>
  <% genre.hoges.each do |hoge| %> # genreに紐づくhogesを呼び出す
    <tr>
      <td><%= hoge.id %></td>
      <td><%= hoge.content %></td>
    </tr>
  <% end %>
  </table>
<% end %>
```

具体的には、hogesを定義した一文の削除と、genreからの紐づけによるhogeの呼び出しをおこないました。
これにより、N+1問題は解消されました。

# まとめ

今回は
原因のひとつとして、**ビューファイルでdbにアクセスしようとした**ことが挙げられます。
変数の定義やそれに伴うdbへのアクセスは、モデルファイルやコントローラファイルといった、上位階層でおこなうべきだと気付かされました。

また本内容を指摘して頂いた経験から、独学で開発を進める上で自分よりも経験値のある(世の中の98%のエンジニアがそう)方と会うことの大切さを身をもって知りました。
コミュニティって大事ですね！

https://twitter.com/ysk91_engineer/status/1565898973566894080?s=20&t=7wlGDyONq-F42i3-g3qS5A
IAPを有効化したCloud Run へ curl でアクセスする

# はじめに
実際の動作確認時などを想定して、以下で有効化したIAPにGUIだけでなく、curlでアクセスしてみました。

https://iret.media/64392

# 手順
https://cloud.google.com/iap/docs/authentication-howto

### 作業するサービスアカウントを作る
- 対象のサービスアカウントを作ります。
- Roleは「IAP-secured Web App User」を付与します。
- サービスアカウントのキーは実施端末に配置します。

### アクティベートする
- 以下コマンドでサービスアカウントのアクティベートをする
```
gcloud auth activate-service-account \
    サービスアカウントメアド \
    --key-file "jsonファイルの置き場" \
    --project 対象プロジェクト名
```

### アクセスする

- IAPの対象OAuth構成のクライアントIDはIAPの画面から確認する
以下の右側のところに表示されます(セキュリティの都合上表示していません)。
![スクリーンショット 2022-09-09 13.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/bbdd11a5-066e-2b34-33b2-d4d3f8bb6502.png)

- 事前に認証で利用するトークン情報を取得する
上記で取得した値を利用してトークン情報を取得する
```
TOKEN=`gcloud auth print-identity-token --audiences=IAPの対象OAuth構成のクライアントID`
```
※audiencesの「IAPの対象OAuth構成のクライアントID」の値はダブルクオーテーションでくくらない

- 対象コンテンツへアクセスする
上記のトークンを利用して対象コンテンツへアクセスする(※FQDNについてはアクセスしたいFQDNを入れてください)。
```
curl -H "Authorization: Bearer $TOKEN" -X 'GET' https://FQDN -H 'accept: application/json' -H 'Content-Type: application/json'
```

- 結果(想定したページが表示されました)
```
<html>
<body>
cloudrun no test dayo --- !!!!
</body>
```

# 所感
以下のような部分が実施時にでてしまいましたが、コマンドラインからもIAPのページへアクセスできることがわかりました。
- curlでのアクセス時にGETではなくPOSTで行いmethodが無いとでた
- トークン取得時に「audiences」の値をダブルクオーテーションでくくって、クライアントIDが一致しないとでた
- トークン取得せずにアクセスするとそもそもコンテンツの内容が表示されなかった

はじめにでご案内した自身が記載した記事にも書いてますがまだCloudRunのIAPはPreviewですので注意ください。

https://cloud.google.com/iap/docs/enabling-cloud-run
Leather Tote Bags - Women Leather hand bags

https://uniqueleatherbags.us/women/leather-tote-bags/
Looking for a stylish and practical leather tote bag![Leather Tote Bags.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841298/8bddc9fe-0a85-da5f-2857-7548f61b6036.jpeg)
? We have just what you need! Our leather totes & shoppers are available in a variety of sizes, styles, colors, and designs, so you can find the perfect one to suit your needs. Whether you’re looking for a large tote for work or travel or a smaller one for everyday use, we have what you’re looking for. Our leather totes are made from high-quality materials and construction, so you can be sure they’ll last long. We also offer customization options so you can add your own personal touch to your bag. With our leather tote bags, you’ll have a fashionable and functional bag that shows off your unique personality. Shop now and find the perfect leather tote or shopper bag for you!
【コードレビューTIPS】 オブジェクトキーの名前と変数名が同じ場合は省略できる

ちょっとしたTIPSです。

- 関数の引数として、複数の変数がまとまったオブジェクトを渡すとき
- オブジェクトを作成するとき

などの際に、「オブジェクトキーと変数名がまったく同じ」ということがあります。
そんなときは`companyId: companyId,`というように並べるよりも、省略した方が読みやすさがアップします :thumbsup: 


# NG
```ts
const params = {
    companyId: companyId,
    planType: planType,
    amount: amount,
  }

```


# OK
```ts
const params = {
    companyId,
    planType,
    amount,
  }
```


# まとめ

レビューするときはできるだけコードはシンプルであったほうがうれしいですね。細かいTIPSではありますが、積み重ねが読みやすいコードに繋がるはずです。
FORTNTIE-APIを使ってショップ情報が見れるサイト作ってみた

みんな大好き、EpicGameのFORTNITEについて、非公式のAPIがあるようなので使ってみました。

https://fortnite-api.com/

こちらは、海外の有志で作成されたAPIで、公式で公開されている　APIではないようです。
ざっと以下のような情報を参照できる　APIが用意されているようです。
- 最新のアイテムショップ情報
- アイテム情報の取得
- プレイヤーの戦績
- ニュース
- クリエイターコード
- ミニマップ
等

APIのよっては、アカウントを作成して、API-KEYの取得が必要となります。

# ショップ情報取得APIの検証
今回は、API-KEYが不要なAPIの検証としてショップ情報を覗いてみます。

リファレンスはこちら 

https://dash.fortnite-api.com/endpoints/shop

パラメータ不要のGET取得なので、[end-pointのURL](https://fortnite-api.com/v2/shop/br)にアクセスするだけで良い。
最新のショップ情報がjsonで返却されましす。

# ショップ情報の閲覧サイト作ってみた
折角APIを使ってみたので、応用してショップ情報を閲覧できるサイトを作ってみました。
クライアントがアクセスされる度に、APIを叩くと先方に迷惑がかかるので、１時間サイクルで最新情報を取得して内部のDBに保管するようにしています。
数日、様子を見ていましたが、問題なく朝9時に最新情報に更新されているようです。
また、アップデートが入った時に稀にショップ情報が更新されますが、アップデートの更新を待たずにショップ情報が見れるようになりました。

https://dmz.seatree.jp/shop


以下のtwitterアカウントで、更新時にtweetする仕組みにしました。
[@dmz_fortnite](https://twitter.com/dmz_fortnite)
VMware が USB を認識してくれない (2022/09/09)

## 環境
- VMware-player-full-16.2.4-20089737
- Host OS: Windows 11
- Guest OS: Ubuntu-20.04

## 問題
- ホストPCにUSBカメラとか刺しても `lsusb` で出てこない (VMwareが勝手に用意してくれる仮想マウスとかは出てくるけど)
- VMwareの `取り外し可能デバイス` に、ホストPCに刺したデバイスは表示されてるけど `接続` ボタンが押せない/そもそもデバイスがグレーアウトしてて `接続` ボタンが出てこない

![usb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/abf3d1ba-af04-fe34-6501-6741e05307a6.png)
(↑は問題が解決した後の様子だけど参考までに)

## 解決法

ここにあった
https://communities.vmware.com/t5/VMware-Workstation-Player/All-USB-devices-are-greyed-out/td-p/2878067


- `"C:\ ~~~~ \Virtual Machines\Ubuntu-20.04\Ubuntu-20.04.vmx"` をいじる
    - from: `usb.restrictions.defaultAllow = "FALSE"`
    - to: `usb.restrictions.defaultAllow = "TRUE"`
- VMwareを終了してからいじりましょうとのこと
- で、VMwareを起動して最初の画像のようにUSBデバイスを `接続` 。

![lsusb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/3fe1c276-0bd5-573c-ed39-cc427e3800b6.png)
(↑認識された図)

## 以上！


5,6年はVMwareちょっと触ってなんか嫌になってデュアルブートしてて、
久しぶりにVMware君触ってみてるなうだけど、結構お手軽でよいかも
(高スペックなPCが使えるようになったからそう感じる説は濃厚)