OmniAICreator/Qiita-1.07M huggingface dataset:
2022/9/21主にITとかセキュリティの記事

2022年2Qの不正送金、前四半期比約1.9倍 - 補償率が6割台前半に
https://www.security-next.com/139846

サイバー攻撃　弱点克服へ対策に本腰入れよ(9/19)
https://www.yomiuri.co.jp/editorial/20220918-OYT1T50205/

大日本印刷、全社員にサイバー防衛指南　「感染」実体験(9/19)
https://www.nikkei.com/article/DGXZQOUC179QY0X10C22A8000000/

用心すべき？　恋人のパスワード、多くの人が5回以内の突破に自信...米調査(9/19)
https://www.pen-online.jp/article/011591.html

ランサムウェア活動容疑で米国がIRGC関連のハッカーを制裁へ(9/19)
https://nextmoney.jp/?p=53251

SIMカードとユーザーのひもづけにおけるプライバシーの問題とは？(9/19)
https://gunosy.com/articles/eEIlA

トロイの木馬化したPuTTY悪用した新フィッシング詐欺、北朝鮮関与の疑い(9/19)
https://news.mynavi.jp/techplus/article/20220919-2457865/

Microsoft Edgeのニュースフィードに注意、技術サポート詐欺を確認(9/19)
https://news.mynavi.jp/techplus/article/20220919-2457860/

コンテナ環境でReactユニットテストを実行する際のタイムゾーン設定にハマった話（Jest）(9/17)
https://qiita.com/eiji-noguchi/items/2176b72ab43fe6eb17cf

人気拡張機能、Avastに買収されて嫌われる(9/19)
https://www.zaikei.co.jp/article/20220919/690015.html

フラッシュボットが82％以上のリレーブロックを構築、イーサリアムの中央集権化に拍車(9/19)
https://jp.cointelegraph.com/news/flashbots-build-over-82-relay-blocks-adding-to-ethereum-centralization

宮崎謙介＜巷の陳情＞突撃調査隊「小学校のデジタル化が中途半端です」(9/19)
https://news.nifty.com/article/domestic/government/12104-1878597/

Microsoft、再びIE11の早期無効化を推奨(9/19)
https://www.zaikei.co.jp/article/20220919/690047.html

『GTA 6』の開発中と思わしき映像が大規模拡散。ハッカーが「俺が流出させた」と主張、Rockstarにとっては悪夢との報告も(9/19)
https://automaton-media.com/articles/newsjp/20220919-219802/

SWIFTは新ブロックチェーンプロジェクトで企業イベントの効率化を目指す(9/19)
https://nextmoney.jp/?p=53232

米国司法省が仮想通貨犯罪を制限する検察官ユニットを設置へ(9/19)
https://nextmoney.jp/?p=53257

フロントエンド(React)の技術質問(9/19)
https://qiita.com/KNR109/items/e13a5c5b8b461e846902

フロントエンジニア必須スキルをまとめてみた(9/17)
https://qiita.com/MPrg2011/items/5911bcc462fc4b08e029

米政府、仮想通貨の管理強化へ　デジタル資産関連の規制整備(9/19)
https://newspicks.com/news/7582751/body/

環境保護団体、オンライン広告に100万ドル──ビットコインのPoSへの変更求める(9/19)
https://www.coindeskjapan.com/160463/

CMSのシェア変遷をアニメーションで理解しよう(9/18)
https://news.mynavi.jp/techplus/article/20220918-2457185/

iPhone 14 ProでInstagramやTikTokのカメラを使うとガタガタ振動して異音が発生し写真が撮影できないとの報告(9/19)
https://article.auone.jp/detail/1/3/7/48_7_r_20220919_1663538613319203

残念すぎる「iOS 16」で消えた機能とサポート終了機種まとめ(9/19)
https://biz-journal.jp/2022/09/post_318086.html

DNPがグループ全社員3万人をセキュリティー人材に、一般従業員向けの講座活用(9/20)
https://xtech.nikkei.com/atcl/nxt/news/18/13739/

「ロボット前提社会」到来間近、ヒトはロボに歩み寄れるか(9/20)
https://xtech.nikkei.com/atcl/nxt/column/18/02194/091500003/

D2Cに精通したデジタル人材求む、待遇改善進む小売り・消費財業界の転職(9/20)
https://xtech.nikkei.com/atcl/nxt/column/18/00577/091500043/

レガシーCOBOLのクラウド移行、間違いなく成功する方法を教えよう(9/20)
https://xtech.nikkei.com/atcl/nxt/column/18/01921/091200009/

相次ぐWebサイト改ざん、自治体や自動車関連企業が被害に(9/20)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/070100182/

行政に立ち塞がる膨大なデータの壁(9/20)
https://xtech.nikkei.com/atcl/nxt/mag/ncr/18/00171/090900001/
dbt(CLI)をPackageでもっと活用したい

## dbtとは
ELTのTをしてくれるツールです。
Jinjaによりテンプレート化したSQLをコンパイル、DWHへ問い合わせ、反映（テーブル、ビューの作成）、またそのテストができます。

下記参照

https://qiita.com/yasu_25/items/f9dd8ac3068c300ce740


dbt使ってみたけど、なんか物足りないと感じた人はPackageを導入してみましょう！

下記にDocker hubみたいな世界が広がっているらしい

https://hub.getdbt.com

## そもそもPackageとは？
プログラムの世界でのライブラリみたいなものです。

https://docs.getdbt.com/docs/building-a-dbt-project/package-management

## Packageの導入

プロジェクトの直下にpackages.ymlファイルを作成する。

```packages.yml
packages:
  - package: dbt-labs/dbt_utils
    version: 0.9.2
```

下記コマンドを実行するとインストールされる。
```bash
$ dbt deps
```

dbt_utilsについてはGitHub参照

https://github.com/dbt-labs/dbt-utils
プログラム言語とマークアップ言語

# オブジェクト指向言語
オブジェクト指向言語は、データとsれに関する操作や手続き(メソッド)をオブジェクトの単位にまとめ、処理はオブジェクトへの要求という形で表現する。

## オブジェクト指向言語の種類
### Java
コンパイル時にソースプログラムをバイトコード（中間コード)に変換し、実行環境ごとに要求された```Java仮想マシン```上で実行するのが特徴。

#### Javaにようるアプリケーションの形態
ネットワークからダウンロードされてクライアント（Webブラウザ）側で動作する```アプレット```という。
Webサーバ側で動作する```サーブレット```がある。
よく使う機能をコンポーネント化する仕様を```JavaBeans(ジャバビーンズ)```という。

### C＋＋
C言語の拡張言語で、オブジェクト指向を取り入れたもの。
C言語と同様に```ハードウェアの知識が必要```となる。

### Perl
ホームページの掲示板やアクセスカウントなどを実現するなどといった、CGIの開発などで使われる。

#### CGIとは？
WebブラウザからWebサーバーへまたその反対もある。
つまり対話的なページを作ることができる。

https://qiita.com/masatom86650860/items/bdbc041b26593d8777cf

### Java Script
```クライアント側（Webブラウザ）で動作```するオブジェクト指向のスクリプト言語。
基本部分についてECMA Scriptとして標準化が行われてる。

HTML文書の中にJavaScriptの命令を記述しておくことで、```マウスが触れるとイラストが動くといった。さまざまな動きや働きを付加```することができる。

### PHP
サーバ側で動作する。
```Webページとデータベースを連動```し、```データベースの操作を行う手続きの手続きの実行```などのミドルウェア開発に用いる。

### Python
フリーウェアとして公開されているオブジェクト指向のスクリプト言語。
```充実した拡張モジュールが用意```されているのが特徴。

#### フリーウェアとは？
無料で利用することができるソフトウェア
出典 https://www.acrovision.jp/career/?p=3148#:~:text=%E3%83%95%E3%83%AA%E3%83%BC%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A8%E3%81%AF%E7%84%A1%E6%96%99,%E3%81%84%E3%82%8B%E3%82%82%E3%81%AE%E3%81%AA%E3%81%A9%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

### Ruby
日本の開発者によるオブジェクト指向のスクリプト言語。

# HTML
```文章構造を定義していく形のマークアップ言語```。

あるデータから、関連する別のデータへの順次にジャンプする```ハイパーリンク機能```を持つ。
```画像や音声などのマルチメディアデータを扱える```のが特徴。

## DHTML(Dynamic HTML)
スクリプト言語をつかっった動的表現を可能にしたHTMLの拡張使用で、その制御の取り決めが```DOM（Document Object Model```である。

HTMLページにJavaScriptなどで作成したスクリプトを埋め込むことで、ユーザーの操作を合わせて```要素の配置や内容を変更するような動的なWebページを実現```できる。

### XHTML
HTMLを、XMLに準拠した文書を作成できるように適合させた仕様。
文書体裁は、タグではなくCSSで行う。

* xhtmlはxmlというマークアップ言語から生まれた言語です。htmlとの融合と書きましたが、xmlの言語にhtmlの特徴をプラスしたといった方が近いでしょう。
出典 https://web-camp.io/magazine/archives/4977

#### xhtmlが使われているサービスなど
xhtmlは独自のタグが定義できるので、データを扱うようなアプリケーション、つまり```プログラムを介してサーバとデータのやり取りをするようなアプリケーションを作るときに使用される```ことが多くあります。Javaなどを使うような高度なシステムから抽出されたデータを表示する、といった場合はxhtmlでフロント部分を作るといったことが行われている、といったこともあります。

出典 https://web-camp.io/magazine/archives/4977
#### 準拠とは？
あるものをよりどころとしてそれに従うこと。
出典 https://dictionary.goo.ne.jp/word/%E6%BA%96%E6%8B%A0/

### XSL
XML文書のスタイルシートを記述する言語

### DTD（Document Type Definition）
文書型定義。
SGMLやHTMLで文書に使われている文書構造を定義するための言語。

# XML(eXtensible Markup Language)
```文書の標準化やデータ交換を目的```としたマークアップ言語。
```企業間取引の標準フォーマット```として用いられている。
```独自のタグを定義```することができる。
HTMLのように```Webページとして公開することも可能```。

# XMLの関連技術
### SOAP（Simple Object Access Protocol)
Webサービスプログラム相互間において、```ネットワーク上にあるXML形式のメッセージを受け渡すためのプロトコル```。

### AJax
Webブラウザ上で非同期を行う技術。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

# 過去の関係のあるもの
https://qiita.com/masatom86650860/items/5ab206263754aa0685cc

https://qiita.com/masatom86650860/items/57b51f7cdf698befbced
Firebaseを触ってみたらバージョンの違いで初っ端躓いた


## 問題

Firebaseを認証してfirestoreを使用しようとしたらエラーが出た。

間違っているスクリプト
```ts
import firebase from "firebase/app";
import "firebase/app";
import "firebase/firestore";
import "firebase/auth";

const firebaseApp = firebase.initializeApp({
    ...
  });

export const db = firebaseApp.firestore();
export const auth = firebase.auth();

```
下記のエラーが出た
```
Property 'firestore' does not exist on type 'FirebaseApp'

Property 'auth' does not exist on type 'typeof import("/Users/.../node_modules/firebase/app/dist/app/index")'
```

## 原因・解決策
compatを足すだけ
参考にしていたスクリプトがv8のものだったのが原因である。
インストールしたものはv9だった。


```ts
import firebase from "firebase/compat/app";
import "firebase/compat/app";
import "firebase/compat/firestore";
import "firebase/compat/auth";


const firebaseApp = firebase.initializeApp({
    ...
  });

export const db = firebaseApp.firestore();
export const auth = firebase.auth();

```
compatライブラリについて詳細は公式ページ

https://firebase.google.com/docs/web/modular-upgrade#about_the_compat_libraries


そもそもv9の書き方に倣えば。

```ts
import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";
import { getFirestore } from "firebase/firestore";

// Initialize Firebase
const app = initializeApp({
    //...
    });


const auth = getAuth(app);
export const db = getFirestore(app);
```
GitHubへのアップロードの流れ


### 私が初めてハッカソンでチーム開発を行ったときに覚えるのに苦労したので備忘録として作りました。

## ①変更内容をステージングする(コミット対象のファイルを置く)

```bush
$ git add ファイル名１　ファイル名２
$ git add *.jsx  /*jsxファイルを全て*/
$ git add .  /*カレントディレクトリ以下のすべてのファイル*/
```

## ②変更をローカルリポジトリに記録する

コミットメッセージは変更内容など

```bush
$ git commit -m "コミットメッセージ"
```
## ③ローカルリポジトリからリモートリポジトリに送る(アップロード)

REMOTENAME　と　BRANCHNAME　は引数
リモート名(例)origin
ブランチ名(例)main ,  issue

```bush
$ git push <REMOTENAME> <BRANCHNAME> 
```

## これでアップロードは完了！



## ⑤リモートリポジトリからローカルリポジトリへ(ダウンロード)

```bush
$ git pull <REMOTENAME> <BRANCHNAME>  /*GitHubの最新状態と同じようにする*/ 
```
lambda invokeがnat gateway経由で通信していた

Private VPCからLamdaをInvokeした際、Nat Gatewayを経由して通信 => NatGateway経由で通信費がかかっていた。

そらそーだ

VPC EndPoint作成することで回避可能。 
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc-endpoints.html

とはいえ、VPC Endpointも0.014$/h掛かるのも留意点。
Subnet単位でかかるので、3subnetsへ設定すると30$/monthくらい固定で必要。
PHP POSTとGET送信方法について

今回はGET送信方法とPOST送信方法が別々なので、送信方法についてそれぞれ書いて行く。


POST送信を使う場合
```php
//main.php
  <form method="post" action="edit.php">
    <input type="hidden" name="id" value="<?php echo h($todo["id"]) ?>">
    <button >削除</button>
  </form>
```
formの中の
 method="post"　　　 ..methodは通信方式を表している。今回であれば、POST方式
　action="edit.php"　..フォーム内にある送信ボタンをクリックした時に遷移するページを指定


inputタグの中の
type="hidden"　　..nameのidを隠す意味
「name=id」　　..送信先の名前（DBの中のテーブルの名前の部分を入れる）
「value="<?php echo h($todo["id"]) ?>"」　　..送信される値


```php
//edit.php
if(isset($_POST["id"])){  //変数に値が入っているかどうかを確認するためのisset関数
  $id = $_POST["id"];
}
```

POST送信の場合は
postの意味の中に　「（時間的に）　～の後の」と言う意味があり、
formで送ったものを「POST」で受け取る時に使用する。






GET送信を使う場合
```php
//main.php
<a href="edit.php?id=<?php echo $todo['id'] ?>">編集</a>
```

```php
//edit.php
if(isset($_GET["id"])){  //変数に値が入っているかどうかを確認するためのisset関数
  $id = $_GET["id"]; 
}
```
GET送信の場合は
GETの意味の中に　「受ける」と言う意味があり、
Aタグを「GET」で受け取る時に使用する。



※POST通信、GET通信の使い分け

POST通信は、新規作成、削除機能で使用することが望ましい
理由：POSTを通して、内容が変更する場合は、POST通信を使用する。
新規作成はない情報から、新たに新規作成する
削除機能は元々ある情報からない情報にする


GET通信は、編集機能ので使用することが望ましい
編集機能は編集画面（内容は変わらない）へ変更後、編集し、編集するため
つまり、1回目の編集ではGETを使用。次の編集ではPOSTを使用する。
Javaでメソッドをオーバーライドしたとき、オーバーライドされたメソッドを使用する親クラスで定義されたメソッドの挙動

確かめたかったことは以下のコードと結果が全てです。
`Parent`クラスの`greet()`メソッドでは内部で`say()`メソッドを呼び出しています。
`Child`クラスでは`say()`メソッドをオーバーライドしています。その結果`Child`クラスの`greet()`メソッドでは`Child`クラスの`say()`メソッドが使用されています。

これは`Parent childParent = child;`のようにして`Parent`クラスのインスタンスとして扱って` childParent.greet();`のように呼び出した場合も`Child`クラスの`say()`メソッドが使われます。(こっちは参照の流れを考えると当然な気もしてきた。)

`Parent`クラスのインスタンスだと思って`greet()`メソッドを呼び出したら、実は`Child`クラスの`say()`メソッドが裏で使われていたとなるとコードリーディングしづらくなりそうですね。

```java
public class Main {
  public static void main(String[] args) {
    Parent parent = new Parent();
    Child child = new Child();
    Parent childParent = child;

    parent.greet();
    child.greet();
    childParent.greet();
  }
}

class Parent {
  public void greet() {
    say("Hello");
  }

  public void say(String word) {
    System.out.println(word);
  }
}

class Child extends Parent {
  @Override
  public void say(String word) {
    System.out.println(word + "!");
  }
}
```

出力

```
Hello
Hello!
Hello!
```
kali linuxでUnable to locate package * 発生

#  環境
Kali GNU/Linux 2022.3

# 概要
`apt install`コマンドで `E: Unable to locate package` となった
```bash
┌──(kali㉿kali)-[~]
└─$ sudo apt install man2html -y                                 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package man2html
```

# 結論
`/etc/apt/sources.list` ファイルを編集する

# 詳細
```bash
┌──(kali㉿kali)-[~]
└─$ sudo vi /etc/apt/sources.list
┌──(kali㉿kali)-[~]
└─$ cat /etc/apt/sources.list
deb http://http.kali.org/kali kali-rolling main non-free contrib
deb http://http.kali.org/kali kali-last-snapshot main non-free contrib
deb http://http.kali.org/kali kali-experimental main non-free contrib
deb-src http://http.kali.org/kali kali-rolling main non-free contrib
# ↑必要なものを適宜追記(何が必要かわからなければ全部記載してしまおう、、、)

┌──(kali㉿kali)-[~]
└─$ sudo apt update && sudo apt -y full-upgrade -y && sudo reboot
# 以下省略
```

おわりに

- 以下を見てもよくわからなかった
https://www.kali.org/docs/general-use/kali-linux-sources-list-repositories/



- 参考
    - [Fix E: "Unable to Locate Package" Error in Kali Linux • Webmatrices Blog](https://blog.webmatrices.com/fix-e-unable-to-locate-package-error-in-kali-linux/)
    - [Ubuntu 18.04のapt installで”Unable to locate package”のエラー はsources.listを編集して解決できる](https://web.archive.org/web/20200925003306/https://tech.sairilab.com/2018/09/post-171/)
    - [Ubuntu18.04 apt install で E: Unable to locate package ～ と言われた | ろっひー](https://rohhie.net/ubuntu18-04-apt-install-says-unable-to-locate-package-hogehoge/)
User AgentとReferrerについて

# 0. はじめに
大阪でフルスタックエンジニアとして働かせていただいている駆け出しフリーランスエンジニアこと、doriです！
最近、仕事でUser AgentとReferrerを使う機会があり、「うわー、聞いたことあるけど、あんまり知識ないなぁ」となりました。エンジニアとして知っておいた方が良いな思い、自分なりに調べてまとめてみました。

# 1-0. User Agentとは
***User AgentとはWebサイトにアクセスするブラウザの種類やバージョンなどをWebサーバーに伝える情報の１つ***です。
人間も誰かの家にお邪魔するとき、「◯◯です〜」っていうじゃないですか。コンピュータさんたちとのやりとり（通信）の際も同じようなことが起きています。（以下図参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783573/aeb69551-b490-9a22-053e-3985d028dd14.png)

ちなみにjavascriptだと、以下のコードでUser Agentを取得できます。
```
navigator.userAgent
```
「Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/111.11 (KHTML, like Gecko) Chrome/11.1.1111.11 Safari/111.11」のような形のものが実際のUser Agentです。（数字等適当に記載）

このような文字列をUA文字列といったりします。

# 1-1 なぜUser Agentが必要なのか
色々あると思いますが、各OS等やブラウザ、スマートフォンの機種などの違いでユーザーに表示させたいページを振り分けることができるからです。
例えばiphoneからアクセスがあったらこっちのページ、Windowsからアクセスがあったらこっちのページ等、ユーザーによって、見せたいページを変えることができます。

# 1-2 User Agentの廃止
ユーザープライバシーの目的から廃止されるみたいです。（というか徐々に削減されつつあるのかも）「ブラウザ・フィンガープリント」が関係しているみたいですが、今回の主旨とはズレるため省略。

# 2-0 Referrerとは
***Webページをユーザーが訪問した際に、ユーザーが1つ前に閲覧していたWebサイトのこと***をReferrerといいます。
このReferrerは普通に確認することができ、「https://test.com?id=111 」 というようなURLが閲覧出来てしまうらしいです。
（そらURLに機密情報を載せるのはよくないよね...)

あまりこのReferrerについてはまだ詳しくはないのですが、偽装できるみたいです。
（このあたりはまた勉強しながら理解深めよう）

# 3-0 さいごに
これらの知識というのはWeb通信の話をする際とかによく使われたりします。自分はWeb通信まわりの話は得意ではなかったので、その知見を深めるといった点でも今回勉強になりました。これからもどんどん勉強していきます。
ソリューションアーキテクト対策_Lambda, Kinesis, Athena篇

## 1.はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:


## Lambda
### Lambdaが他のサービスにアクセスしたい場合は
IAMロールをを設定する。ポリシーじゃないよ。


### Lambdaの特徴
- ステートレスである
システム上のやりとりの状態情報が不要なため、セッション情報が与えられていないアプリケーションのこと。
どのエンドユーザーに対しても同じ応答を提供する。

### Lambdaのタイムアウトについて(暗記)
デフォルトは3秒。最大は900秒(15分)。


### Lambda関数が取り扱えるデータの最大値(暗記)
512MB。
例えばDynamoDBストリームのメタデータをS3に転送する時にLambdaを咬ますなら一度に転送できるデータ量の最大値は512MBとなる。


### LambdaとDynamoDBの連携
認識通りでおk。連携する時はIAMでLambdaからDynamoDBへのアクセスをIAMポリシーで許可する。


### Lambdaレイヤー
複数のLambda関数でライブラリを共有できる仕組み。
共通するコンポーネントをLambdaレイヤーとして定義し、Lambda関数から参照できる。
これによりいくつかのLambda関数で処理が重複している場合はその処理を共通機能として実装できる。


### Lambdaエッジ
サーバー管理を行わなくても、ウェブアプリケーションをグローバルに分散させることで、パフォーマンスを向上させることができるサービス。


## Kinesis
### Kinesis Data Streams
ストリーミングデータ処理を実行する

### Kinesis Data Firehose
Streamsから受け取ったデータを変換して、データレイクやデータストア、分析ツールに配信するサービス。
ストリーミングデータをキャプチャして変換しつつS3、Redshift、ElasticSearchにロードする。DynamoDBに配信することはできない★
→なのでデータをDynamoDBに配信したい場合はLambdaを経由する必要がある。

また、Lambdaだけを利用してS3などにストリーミングデータを変換したり配信したりするのは非効率。
Kinesis Data FirehoseはLambda関数およびKinesisと統合されており、連携のうえ一緒にデータ配信と変換を実行する。


### Kinesisのデータ転送の特徴
データが欠落しない
耐久性がある
データを到着順にストリーミングする
(Kinesis Data Streamsによって割り当てられたシーケンス番号があるため)

### SQSとSNS、Data PipelineをKinesisと比較してみる
- SQS
FIFOではない
重複送信されないことを保証しない
EMRに送信されたデータ解析処理にキューは使えない

- SNS
一度に送受信される大量のメッセージを処理できない可能性がある。
また、メッセージを受信した順番で送信することを保証しない。

- Data Pipeline
主にクラウドベースのデータワークフローサービスとして使用される。
異なるAWSサービスと、オンプレミスデータソース間でデータを処理・移動するのに利用される。



## Amazon Athena
インタラクティブなクエリサービスで、S3内のデータを標準的なSQLを使用して簡単にデータ解析を行えるサービス。
多くの場合数秒で結果が返ってくる。また、課金はクエリに発生する。

ちなみにRDSはこの手のデータ解析(を行うデータ保存)には向かない。
また、DynamoDBはNoSQLなのでクエリの実行はできない。


## おわりに
引き続き追記します！

以上です。
2次元ベクタの取り出し方なんか

### 背景
rustでatcoderの問題の入力をproconioで行っている。
2次元配列を受け取った後にどう引き出すかをいっつも忘れるのでメモした。
どう考えてもdocument読めばいい話ではあるが・・・
あとatcoderで2次元配列で受け取れと言わんばかりの配列を1次元に落とし込むやり方も。

## 2次元ベクタに関して
ベクタの要素としてベクタを持つだけである
vec![vec![]]
とすると空のベクタが入った二次元ベクタができる。まずはこの要領で二次元配列と行列の対応付けを行う

```math
\begin{eqnarray}
A=\left(
\begin{array}{ccc}
0 & 1 & 2 \\
3 & 4 & 5 \\
6 & 7&8 \\
\end{array}
\right)
\end{eqnarray}
```
2次元ベクタでこの行列を表すには以下のように書く
A[i][j] の表記が通常の行列表記に対応している
まずA[i]で定義した外側のベクタを要素を指定してその後中のベクタの要素を指定する
```rust
fn main() {
let A =vec![vec![0,1,2],vec![3,4,5],vec![6,7,8]] ;
println!("{:?}",A);
//[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
println!("a00 : {}, a12 : {}, a21 : {}",A[0][0],A[1][2],A[2][1]);
//a00 : 0, a12 : 5, a21 : 7
}
```

さて、atcoderのproconio。以下のようになる。通常の2次元ベクトルと同様
[usize;m]をCharsとかにすることもある。その場合入力の行にスペースが入っているとエラーがでるので注意
```rust
use proconio::{input};
use proconio::marker::{Bytes, Chars};
fn main() {
  input!{
  n:usize,
  m:usize,
  A:[[usize;m] ;n],
  }
//input 3 2
//0 1
//2 3
//4 5
  println!("{:?}",A);
  //[[0, 1], [2, 3], [4, 5]]
  println!("a00 : {}, a11 : {}, a21 : {}",A[0][0],A[1][1],A[2][1]);
  //a00 : 0, a11 : 3, a21 : 5
  }
```

## 1次元ベクタに関して
2次元ベクタを1次元にするときは以下のようにする。
```rust
fn main() {
let A =vec![vec![0,1,2],vec![3,4,5]] ;

let n = 2;
let m = 3;
let mut B = vec![0;n*m];
for i in 0..n{
    for j in 0..m{
        B[i*m + j] = A[i][j];
    }
}
println!("{:?}",B);
//[0, 1, 2, 3, 4, 5]

//戻す
let mut C = vec![vec![0;m];n];
for i in 0..n*m{
    C[i/m][i%m] = B[i];
}
}
```

と思ったら以下でよかった・・・
```rust
use proconio::{input};
use proconio::marker::{Bytes, Chars};
fn main() {
  input!{
  n:usize,
  m:usize,
  A:[usize ;n*m],
  }
//input 3 2
//0 1
//2 3
//4 5
  println!("{:?}",A);
  //[0, 1, 2, 3, 4, 5]
  }
```
ちなみにusizeをCharsにすると
[['0'], ['1'], ['2'], ['3'], ['4'], ['5']]
となっている。一次元だと間にスペースあってもいけるみたい

Chars の挙動はちょっぴり追記したいかも
Scrapyのセレクターでテキストを取得



## 取得対象のHTML
このHTMLの```pタグ```、および```divタグ```のテキストをScrapyセレクターで取得する場合の取り方
```html
<div class="info">
  住所: 東京都千代田区丸の内一丁目１ー１<br/>丸の内オフィスビル1F
  <p>TEL: 03-1234-5678</p>
  営業時間: 10:00〜20:00
</div>
```

## pタグのテキストを取得する
```python
In [1]: html = """<div class="info">
   ...:   住所: 東京都千代田区丸の内一丁目<br/> 丸の内オフィスビル1F
   ...:   <p>TEL: 03-1234-5678</p> 営業時間: 10:00〜20:00
   ...: </div>"""

In [2]: import scrapy
   ...: sel = scrapy.Selector(text=html)
```
```p::text```でpタグの文字を取得できる
```python
In [3]: sel.css("div.info p::text").get()
Out[3]: 'TEL: 03-1234-5678'
```

## divタグのテキストを取得する
<b>タグの中身がテキストだけなら良いが、brやpなど内部にタグがあると```div::text```ではすべてを取得できない</b>

pタグの時と同じように```get()```を使うとbrタグの手前までの文字しか取得できない。
```python
In [4]: sel.css("div::text").get()
Out[4]: '\n  住所: 東京都千代田区丸の内一丁目'
```

```getall()```メソッドでヒットした文字列のリストを取得できるので、これをjoinすれば１つのテキストになる。
<b>ただし```div::text```ではdivタグ直下のテキストしかヒットしないのでpタグ(TEL)の文字列が取れない</b>
```python
# getallでヒットしたテキストのリストを取得
In [5]: sel.css("div::text").getall()
Out[5]: ['\n  住所: 東京都千代田区丸の内一丁目', ' 丸の内オフィスビル1F\n  ', ' 営業時間: 10:00〜20:00\n']

# joinで結合
In [6]: "".join(sel.css("div::text").getall())
Out[6]: '\n  住所: 東京都千代田区丸の内一丁目 丸の内オフィスビル1F\n   営業時間: 10:00〜20:00\n'
```

```div *::text```を使えばdivタグ以下のテキストにヒットさせることができる。
```python
In [7]: sel.css("div *::text").getall()
Out[7]: 
['\n  住所: 東京都千代田区丸の内一丁目',
 ' 丸の内オフィスビル1F\n  ',
 'TEL: 03-1234-5678',
 ' 営業時間: 10:00〜20:00\n']

In [8]: "".join(sel.css("div *::text").getall())
Out[8]: '\n  住所: 東京都千代田区丸の内一丁目 丸の内オフィスビル1F\n  TEL: 03-1234-5678 営業時間: 10:00〜20:00\n'
```

<b>```::text```を使わずxpathの```string()```メソッドを使うことでも指定要素のテキストを取得できる</b>
```python
In [9]: sel.css("div").xpath("string()").get()
Out[9]: '\n  住所: 東京都千代田区丸の内一丁目 丸の内オフィスビル1F\n  TEL: 03-1234-5678 営業時間: 10:00〜20:00\n'
```

## （BeautifulSoupの場合の取り方）
BeautifulSoupだとtextプロパティで内部にタグがあってもテキスト取得できるので、
それと同じ感じでScrapyを使うと取りこぼすかも

```python
In [1]: html = """<div class="info">
   ...:   住所: 東京都千代田区丸の内一丁目<br/> 丸の内オフィスビル1F
   ...:   <p>TEL: 03-1234-5678</p> 営業時間: 10:00〜20:00
   ...: </div>"""

In [2]: from bs4 import BeautifulSoup
   ...: soup = BeautifulSoup(html, "html.parser")

# textプロパティでdiv要素以下の文字列を取得できる
In [3]: soup.select_one("div").text
Out[3]: '\n  住所: 東京都千代田区丸の内一丁目 丸の内オフィスビル1F\n  TEL: 03-1234-5678 営業時間: 10:00〜20:00\n'
```

## 参考
https://doc-ja-scrapy.readthedocs.io/ja/latest/topics/selectors.html
バックアップの種類について

# バックアップの種類について
## 初めに
何となくしか理解できていなかった分野。4回目はバックアップの種類についてです。

## バックアップの種類
## システム・イメージバックアップ
バックアップはシステムバックアップとイメージバックアップの2種類が存在しています。

### システムバックアップ
システムバックアップは、「OSそのもの」を含んだシステム全体をイメージファイルとして保存し、バックアップを取得します。システムバックアップの中には、ネットワーク・ストレージ設定・データベースソフトウェア・各種修正パッチなど、システム稼働に必要な情報が丸ごと含まれています。極論を言えば、ハードウェア以外の全てがシステムバックアップに含まれるため、バックアップデータさえ無事ならばいつでも「バックアップ時点」まで、システムを復元できるわけです。
イメージバックアップともいいます。

### データバックアップ
データバックアップでは、ファイル・フォルダ内に存在していた業務データや資料など、一般的に「データ」と呼ばれる情報のみをバックアップ対象とします。データバックアップはデータを必要な単位で保護できるため、「特定のデータだけ復元したい」などの要望には迅速に対応ができるところがメリットです。システム環境を丸ごと復元することはできませんが、手軽に行えるメリットがあります。

https://baremetal.jp/blog/2021/01/27/1029/

またこちらのサイトにわかりやすい比較表が乗っていました
https://www.activeimage-re.com/column_b/backup-column01.html

簡単にいうとシステムのほうが時間がかかるがOSなどのシステムのバックアップを取れる、データバックアップは手軽だがファイルのコピーしかできないといった感じでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/fe3b1e9c-0ee1-18f4-4e32-474eae1583b7.png)


## バックアップの取得方法の種類ついて
次はバックアップの取得方法の種類についてまとめます。

### フルバックアップ
フルバックアップは名前の通りすべてフルでバックアップを取得します。その分、時間もコストもかかるります。そのまま復元するだけで取得時点と同じ状態になるのでシンプルですが、データ容量も膨大なので月１回などの頻度を抑えた形が一般的です。

### 増分バックアップ
増分バックアップは前回のバックアップ時からの増えた分のみを保存する方法です。保存データが増えにくいのが特徴です。ただ、前回のフルバックアップからすべての増分バックアップを重ねてリストアしていく必要があるので時間がかかります。

### 差分バックアップ
差分バックアップは前回フルバックアップ時からの増えた分を保存する方法です。復元する際はフルバックアップと直近の差分バックアップだけでリストアできますが、日を追うごとにバックアップデータが大きくなる傾向があります。

この３種類のバックアップの１回あたりのデータの大きさは
フルバックアップ > 差分バックアップ > 増分バックアップ
となります。
差分と増分は正直名前からでは導き出せないのでシンプルに暗記するしかないですね。。 

## まとめ
簡単いですが、バックアップの種類と取得方法の種類についてまとめました。次回はAWS上で扱われているバックアップの種類についてまとめたいと思います。
CSS忘備録 ~メディアクエリでデバイス対応

メディアクエリを用いてウィンドウの幅ごとに要素のCSSを変えていくコードになります。
かなりゴリ押しぽい手法です。
機械にデザインはわからないからしょうがないね
```css
/*-----------------------------------------------------------
共通
-------------------------------------------------------------*/

/*-----------------------------------------------------------
携帯 1023px以下
-------------------------------------------------------------*/
@media screen and (max-width:1023px) { 

}
/*-----------------------------------------------------------
PC 1024px以上
-------------------------------------------------------------*/
@media screen and (min-width:1024px) {
   
}
```
IBM Documentation offline

# 目的

オフラインで LibertyやWebSphereのマニュアルを見れるようにします。

# ダウンロード元

https://www.ibm.com/docs/en/offline

ここからオフラインで製品文書が見れるようになるプログラムをダウンロードできます。
OSに合わせてダウンロードします。

私がダウンロードしたのは
ibm-docs-app-win32-20220906T124136.zip
でした。

# インストール

zip を展開するだけでインストールできるので、展開先にはプログラムをよく置いている場所を指定します。

C:\Program Files\IBM\Documentation

にしておきました。

展開したら　ibm-documentation-app.exe をダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/b6787c20-e2f9-7649-8b0b-7676bd4bc130.png)

自分の環境にあわせて通信を許可します。

# 文書のダウンロード

文書を

https://www.ibm.com/docs/

からダウンロードします。Liberty と WebSphere ですが

https://www.ibm.com/docs/ja/was-liberty/nd?topic=SSAW57_liberty/com.ibm.websphere.wlp.doc/ae/cwlp_about.html
や
https://www.ibm.com/docs/ja/was-nd/9.0.5

の右下にある Offline docs からダウンロードできます。リンクがない場合は ページ右上にある人の画像から My IBMにログインすると出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/8174b966-15f1-74ca-a5b9-f7b20ba81b29.png)

今回ダウンロードできたファイルは

SSAW57_liberty_20220830.zip
SSAW57_9.0.5_20220830.zip

でした。

# プログラムに zip を登録

Upload documentaion > Select product file をクリックして、上でダウンロードした zip を登録することで使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/94bd4cb5-1e41-72cc-8366-41d6f39850d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/5562a8be-5ea9-016f-e744-6aa6e1a67277.png)

登録後は → をクリックすることで文書が確認できます。zip のダウンロード場所を見つける以外は迷うところはなさそうです。
ソリューションアーキテクト_PCI DSS篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:

## PCI DSSって何
PCI Security Standards Councilによって管理される、機密情報のセキュリティ標準のこと。
PCI DSSはクレジットカード所有者のデータや機密性の高い認証データを保存・処理・転送するエンティティに適用される。
これらのエンティティには、販売店・処理業者・取得者・発行者・サービスプロバイダが含まれる。らしいです。

公式。

https://aws.amazon.com/jp/compliance/pci-dss-level-1-faqs/

## 具体例
### CloudFrontを使用しているサービスの場合
CloudFrontを使用してアプリケーションをAWSにホストしているWeb配信サービスを展開しているとする。

このアプリケーションがPCI DSSに準拠しているか・コンプライアンス目標が満たされているかを監査される場合は、以下の設定が確実に実装されていることが必要となる。

・CloudFrontAPIに送信されるリクエストをCloudTrailによって取得していること
→CloudFrontのAPIアクセス状況をキャプチャするため。
リクエストのログはCloudTrailによって取得できる。定期的に指定のS3バケットに保存もされる。

・CloudFrontアクセスログが有効化されていること
→有効化することで、CloudFrontが受信するすべてのユーザーリクエストに関する詳細情報を含めたログファイルが作成されるようにCloudFrontを設定できる。
これは標準ログ(またはアクセスログ)と呼ばれる。
標準ログを有効にする場合、CloudFrontでファイルを保存するS3バケットも指定できる。

AWS責任共有モデルに基づいてPCIまたはHIPAA準拠のワークロードを実行している場合、監査のために過去365日間のCloudFront使用状況データを記録することが重要。
使用状況データを記録するためにCloudFrontアクセスログを有効にして、CloudFrontAPIに送信されるリクエストをキャプチャできるようにする必要がある。

### 混同しそうなこと
・VPCフローログはCloudFrontに設定できない
・CloudFrontAPIに送信されるリクエストはCloudTrailによって取得するのであって、Cloudwatch logsで取得はしない
・CloudFrontのキャッシュログを有効化するといった設定はできない。
ただしCloudFrontキャッシュ統計レポートを利用して、CloudFrontエッジロケーションに関連する統計のグラフ表示は可能。

## おわりに
引き続き追記します！

以上です。
[Ruby]Dateクラスについて

# Dateクラスとは？
Rubyの標準ライブラリの機能

# 使い方は？
以下一文を記載します
```ruby
require "date"
```

# 例えば・・・
今日の日付を取得したい時は
```ruby
Date.today
```
で取得できます。

今日の曜日を取得したい時は
```ruby
Date.today.wday
```
と記述しますが、**wday**は曜日を0(日曜日)から6(土曜日)の整数で取得するので、
配列を定義して日曜日（0番）〜土曜日（6番目）まで文字列を格納する必要があります。
その**wday**で取得した値を配列より取り出し、曜日を取得します。

```ruby
require "date"
day = Date.today.wday
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
puts days[day]
```
例：dayの値が5の場合
daysの5番目の値である金曜日が出力されます。
※配列は０から数えます
応用情報技術者試験〜電話サービス〜語呂合わせ

# 本記事について
応用情報技術者試験の対策として、インターネットの分野のうち、「インターネット上の電話サービス」を対象に、語呂合わせを作成したので、メモがてらここに残しておく。

# インターネット上の電話サービス
- 例：LINE電話。電話回線を用いずに、インターネット上で実現される電話サービスである。

- VoIP (Voice over internet Protocol) 
    - 音声をやりとりするためのプロトコル。
    - RTP （Real-time Transport Protocol）で、転送が実現される
        - UDP がベース

- SIP （Session Initiation Protocol）
    - セッションの開始と終了を担当する
- RSVP
    - 通信をやりとりする相手と、帯域を予約するためのプロトコル
    - 帯域管理

# 語呂合わせ
上の全ての情報を語呂合わせにしたわけではないが、次のようになる。

<font color="red">**電話始めるシップさんはある種のVIPでガタイ良い。** <font>
- 電話始めるシップさん
    - 電話の開始終了： SIP
- ある種のVIPでガタイ良い
    - RSVP：帯域管理


# まとめ
電話始めるシップさん、ある種のVIPでガタイ良い。
これを覚えて、応用情報技術者試験を突破するぜ、、、！

2022/10/9の応用情報技術者試験を突破したら、HMM（Hidden Markov Model）や Viterbi Argorithm などを扱っていきたいと思います！
requests.Sessionの確認

# 目的

requests.Sessionを利用した際に、TCPコネクションを使い回せていることを確認します。

# 構成
FastAPIサーバを2つ立てます。クライアントにはcurlコマンドを利用します。
- server1.py
    - クライアントに叩かれるサーバ
    - server2.pyを叩くサーバ
- server2.py
    - server1に叩かれるサーバ

# ソースコード
## server1.py

```python
from typing import Union

from fastapi import FastAPI

app = FastAPI()
s = requests.Session()    


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

@app.get("/connect_backend_server")
def connect_backend_server():
    return s.get('http://localhost:8001').json()
```

## server2.py

```python
from typing import Union

from fastapi import FastAPI
import requests

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
```

# サーバ起動

```
$ uvicorn server1:app --reload --port=8000
$ uvicorn server2:app --reload --port=8001
```

# 実験

5秒([uvicornのkeep-alive timeoutのデフォルト値](https://www.uvicorn.org/settings/#timeouts))以内に2回リクエストを送ります。

```
$ curl http://127.0.0.1:8000/connect_backend_server
{"Hello":"World"}
$ curl http://127.0.0.1:8000/connect_backend_server
{"Hello":"World"}
```

## server2.pyのログ

```
INFO:     127.0.0.1:62090 - "GET / HTTP/1.1" 200 OK
INFO:     127.0.0.1:62090 - "GET / HTTP/1.1" 200 OK
```

どちらも同じportで通信している(TCPコネクションを使い回せている)ことがわかります。もう少しわかりやすい確認方法があればコメントいただけますと幸いです。(パケットキャプチャは少し面倒なのでPython側で確認できる手段があると嬉しいのですが・・)
STM32F767とSSD1306で文字列を表示する(Adafruit SSD1306,Adafruit GFX)


x 非営利、研究調査目的で引用する。


目的
OLEDのテスト


![o_con784.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/85b13039-9445-79ca-316c-b2fc54bbfc56.jpeg)


参考


https://qiita.com/jakalada/items/793a6cf5ff2796db4e86



いろいろいじった


DrawText.ino


```c++

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>



#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);



// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
//#if (SSD1306_LCDHEIGHT != 64)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
//#endif

// RSTピンがない互換品を使用するので-1を指定
//Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  // 1行目に"Hello"を表示
  display.println("Hello");
  // 2行目に"World!"を表示
  display.println("World!");

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}



```
【UiPath】バージョン「22.8」Previewリリースまとめ - アクティビティ編

# はじめに
この投稿は、RPAツール「UiPath」で 2022年8月にリリースされた、バージョン「22.8」について、個人的に纏めたものです。今回は「アクティビティ」に関するリリースについて書きます。

# 情報ソース
紹介する情報は、以下の「UiPath公式リリース」を元にしています。

https://forum.uipath.com/t/uipath-community-2022-8-preview-release/467314

# 目次
今回紹介する内容は以下になります。

```
# 1）[新規] VBAを呼び出し（モダン版）
# 2）[新規] セルの色を取得（モダン版）
# 3）[新規] タイマー系アクティビティ
# 4）[新規] セッション識別子を取得（モバイルオートメーション）
# 5）[強化] 「キーボードショートカット」の「キー入力間の待機時間」オプションが登場
# 6）[強化] 「スクリーンショットを撮影」アクティビティで「範囲選択」指定が可能に
# 7）[強化] Chromium ウィジェット/Electron のHTMLセレクター解析
# 8）[強化] Kinaxis Java サポート
# 9）[強化] VB6アプリのプルダウンをSelectItem アクティビティで操作可能に
``` 

# 1）[新規]:new: VBAを呼び出し（モダン版）
クラシックからモダンに移植されていなかった「VBA呼び出し」アクティビティのモダン版が新しく追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/95434b8a-c9de-21b6-9ba5-bfa12308ea12.png)


# 2）[新規]:new: セルの色を取得（モダン版）
こちらも、モダンに無かった「セルの色を取得」アクティビティが新しく追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/68a4584b-150f-bbb9-6353-5101ace28a6c.png)

# 3）[新規]:new: タイマー系アクティビティ
タイマー系のアクティビティが追加され「処理時間の計測」がしやすくなりました。タイムアウトスコープは、スコープ内で指定秒数経過した場合に例外がスローされます。APIやアプリの処理速度チェックなどで活用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/f8257ec5-0546-0d4c-9a50-f09f205f7cac.png)

# 4）[新規]:new: セッション識別子を取得（モバイルオートメーション）
モバイルテストプロジェクトで「端末のセッションID」を取得し、変数に保存できるようになりました。
特定のセッション状態を維持してテストしたい場合などに活用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/41ccdccb-dc0a-7f1b-5b53-f91c8940e31b.png)

# 5）[強化]:muscle: 「キーボードショートカット」の「キー入力間の待機時間」オプションが登場
キー入力の一つ一つの間に「待機時間」を入れることが出来るようになりました。早すぎる操作で反応しない場合に、少し待機時間を入れることで反応するようにする、などで活用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/709262c4-6701-c803-81cc-8ba2ac41376d.png)

https://docs.uipath.com/activities/lang-ja/docs/get-session-identifier

# 6）[強化]:muscle: 「スクリーンショットを撮影」アクティビティで「範囲選択」指定が可能に
モダンアクティビティの「スクリーンショットを撮影」アクティビティで要素を指定する際に、範囲選択 (F3) を使用でき、範囲指定してのキャプチャが可能になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/e1a53a7d-7861-a40c-b8a7-6af49dad59f1.png)

https://docs.uipath.com/activities/lang-ja/docs/n-keyboard-shortcuts

# 7）[強化]:muscle: Chromium ウィジェット/Electron のHTMLセレクター解析
Chromium ウィジェットや Electron 等の「Webベースのアプリ」を操作する場合に、今まではUIA等のセレクター (wnd、ctrl) で要素認識していましたが、今後はWeb セレクター (html、webctrl) で認識できるようになり、Chromiumウィジェットを介して、すべての操作が可能になります。

https://www.electronjs.org/ja/docs/latest

# 8）[強化]:muscle: Kinaxis Java サポート
Kinaxis（キナクシス）は、製造業向けのSCM（サプライチェーンマネジメント）／SOP（セールスオペレーションプランニング）システムで有名です。（トヨタも採用しているらしいです）
そのJavaで出来たUiの中で「グリッド テーブル セルの識別とデータ抽出」が強化されたようです。

https://www.kinaxis.com/ja

# 9）[強化]:muscle: VB6アプリのプルダウンをSelectItem アクティビティで操作可能に
2000年より前に作られた、かなり古いアプリで「VB6」で作られたものがありますが、そのドロップダウンを「項目を選択」アクティビティで操作できるようになりました。
合わせて、VB6の「MSFlexGridWndClass、ListView20WndClass、MSHFlexGridWndClass」のグリッドデータ抽出もサポートされたようです。

https://docs.uipath.com/activities/lang-ja/docs/n-select-item

# 終わりに
今回はアクティビティ編として、アクティビティ関連のアップデートについて書きました。次回は、アクティビティ以外の内容を説明します。

https://qiita.com/miya_gis/items/0ec4839522b7aaa89ec1

この記事が参考になったら、 いいね をお願いします。閲覧ありがとうございました。
JavaScriptによるカンマ区切りプログラム（配列の挿入を使う方法）

JavaScriptによるカンマ区切りのプログラムです。
今回はカンマ区切りの関数(Number(value).toLocaleString)は使用禁止として作成しました。

```JavaScript



process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  //数字変数
  var num = lines[0];
  //数値を配列にする
  var num1 = num.split('');
  //配列の長さ
  const leng = num1.length;
  //挿入する配列の位置の変数定義
  var target = leng;
  //カンマ文字の定義
  const msg = ",";
  
  while(target > 3){
      target =target - 3;
      //カンマを指定した位置に挿入する
      num1.splice(target,0,msg);
  }
  const leng2 = num1.length;
  //答えの文字列の定義
  let ans = "";
  //配列から文字列を代入する
  for(let i=0;i<leng2;i++){
    ans = ans + num1[i];
  }
  //答えを出力する
  console.log(ans);
});
```

以上のような実装でできます。
SPやRIを購入するためのIAMポリシー


# はじめに

SPやRIの購入だけを行う担当者向けのポリシーが必要になったので覚書します。
更新するだけのために強力な管理者権限を付与するのはよろしくない、というのがきっかけです。

# SPを購入できるPolicy
SPの操作ポリシーはビルトインで備わっていますので付与しましょう。

| # | ポリシー名 | 説明 |
|:-:|:-:|:-:|
| 1 | AWSSavingsPlansFullAccess  | Provides full access to Savings Plans service |
| 2 | AWSSavingsPlansReadOnlyAccess  | Provides read only access to Savings Plans service  |





# RIを購入できるPolicy
RIの購入はビルトインではありませんがそのまま利用できるポリシーが公開されています。
```json:RIを購入できるポリシー
{
   "Version": "2012-10-17",
   "Statement": [{
      "Effect": "Allow",
      "Action": [
         "ec2:DescribeReservedInstances", 
         "ec2:ModifyReservedInstances",
         "ec2:PurchaseReservedInstancesOffering", 
         "ec2:DescribeInstances",
         "ec2:DescribeInstanceTypes",
         "ec2:DescribeAvailabilityZones", 
         "ec2:DescribeReservedInstancesOfferings"
      ],
      "Resource": "*"
   }
   ]
}
```

# おわりに
これらのポリシーをRole等にアタッチして必要なIAMユーザーに割り付けることにより、SPやRIを購入できるようになります。このポリシーによってシステム構成に影響を与えることはありませんが、SPやRIを購入することにより財務的なインパクトを引き起こす可能性があるので注意してください。

> ※m6i.32xlargeを3年分前払いすると82,212 USD	

# 参考資料

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html#ex-reservedinstances
Cloud BuildでktorアプリをCloud Runにデプロイする

## 実現したいこと
Githubにpushしたら自動でCloud Runにデプロイを行って欲しい。

## 使う技術
 - Github
 - GCP Cloud Build
 - GCP Cloud Run

## 手順
### Github側の設定
普通にpushしてください。

### Cloud Build側の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861182/00921ca3-b928-0c1c-36a1-be655ab79319.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861182/5e1c0574-afe8-9e5b-6098-49f1bef24034.png)
リポジトリを接続した後に以上の画像の通り設定してください。

### cloudbuild.yamlについて
```yaml
steps:
  - name: 'gradle:7.5.0-jdk17'
    args:
      - shadowJar
    entrypoint: gradle
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - '-t'
      - gcr.io/pokebuild/pokebuild-buck
      - '--build-arg'
      - _DB_PATH=$_DB_PATH
      - '--build-arg'
      - _DB_USER=$_DB_USER
      - '--build-arg'
      - _DB_PASS=$_DB_PASS
      - '--build-arg'
      - _AUTH0_ISSUER=$_AUTH0_ISSUER
      - '--build-arg'
      - _AUTH0_AUDIENCE=$_AUTH0_AUDIENCE
      - '--build-arg'
      - _AUTH0_SECRET=$_AUTH0_SECRET
      - .
  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - gcr.io/pokebuild/pokebuild-buck
  - name: gcr.io/google.com/cloudsdktool/cloud-sdk
    args:
      - run
      - deploy
      - pokemonbuildback
      - '--image'
      - gcr.io/pokebuild/pokebuild-buck
      - '--region'
      - asia-northeast1
    entrypoint: gcloud
images:
  - gcr.io/pokebuild/pokebuild-buck
```
pokebuild-buckがコンテナ名(任意の物を設定してください)、その前にあるpokebuildがGCPのプロジェクトID、pokemonbuildbackはCloud Runのサービス名(任意の物を設定してくだあい)です。
あとは--build-argの後は環境変数です。こちらもGUI上から設定したものを全部渡してあげましょう。ちなみに--build-argは環境変数の数だけ必要です。
### dockerfileについて
```dockerfile
FROM amazoncorretto:17

ARG _DB_PATH
ARG _DB_USER
ARG _DB_PASS
ARG _AUTH0_ISSUER
ARG _AUTH0_AUDIENCE
ARG _AUTH0_SECRET

ENV PORT 8080
ENV DB_PATH ${_DB_PATH}
ENV DB_USER ${_DB_USER}
ENV DB_PASS ${_DB_PASS}

ENV AUTH0_ISSUER ${_AUTH0_ISSUER}
ENV AUTH0_AUDIENCE ${_AUTH0_AUDIENCE}
ENV AUTH0_SECRET ${_AUTH0_SECRET}

COPY build/libs/PokemonBuild-0.2.0-all.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
```
ARGで受け取った値をENVで設定しています。ここはよしなにしてください。また「build/libs/PokemonBuild-0.2.0-all.jar」についてはビルドファイルの名前に合わせて変更をお願いします。
以上の二つのファイルを含めればビルドとデプロイまで自動で行われます。
ただし、Cloud Runの初期状態では外部からのアクセスができないのでそこは設定してあげてください。
【初心者の挑戦】社内報のチョイ見せ ～目指せ読者数UP～

## はじめに
こんにちは！わたしは、一般企業で社内報を担当しています。

四半期に一回冊子で発行している社内報は、様々なポジションの方にインタビューを行い、総ページ24ページのなかなかのボリュームです。社内報は、制作することが目的ではなく、従業員の方に読んでいただき、内容を理解して次の行動を起こすための気づきになってもらうことが目的です。
**しかし！** 社内報が回覧(※)で届いても、読まずに次の人へスーーっと渡している人も少なくないはず。
少しでも読者数が増えることを願い **「社内報のチョイ見せ」** を作ってみました。
※冊子の社内報は１人１部とは限りません
※今回は冊子が手元に届き、中身を読むか読まないか悩んでいる人をターゲットに設定しました

## 完成
https://twitter.com/narumi656384_/status/1571784034036121600?s=20&t=Qr0180X6rGjS0XYGDThNNA
## 使用ツール
* [Teachble Machine](https://teachablemachine.withgoogle.com)
* Node-RED
* [Make](https://www.make.com/en)
* [LINE developer](https://developers.line.biz/en/)
## 作成の下準備
* 各システムのダウンロードとログイン
* うまくいくようにお祈り（いつも通り）

## 連携の中身
#### 1\.Teachble Machine
![ティーチャブルマシーンスクショ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/2f0b581a-9082-1497-0f31-7cae20f3e22d.jpeg)
社内報を３つ登録しました。トレーニング結果は良好です。
#### 2\.Node-RED
![nodored_ティーチャブルマシーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/9932b0f7-9e54-ef78-6fff-dbe170167e40.png)
使用ノード：camera/teachable mashine/template/http requset/debug/http response/image preview
* Teachable MachineとNode-REDを連携させる
1\.Teachable Machine内右上の「モデルをエクスポートする」をクリック
2\.下記のようなダイアログがでるので、「共通可能なリンク:」をコピーする
![ティーチャブルマシン_ダイアログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/c7c6688c-a9db-fe55-45cd-c6f3cecfa5ca.png)
3\.Node-RED内のteachable machineノードを編集する
プロパティ内のUrl欄に先ほどコピーしたUrlを貼り付ける
4\. templateノードを編集する
テンプレートは「{{payload.0.class}}」と入力する
:::note warn
１つでも工程を行ったあとはデプロイボタンをお忘れなく！
:::
#### 3\.Make
![make_ティーチャブルマシン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/b7b44852-9084-ee56-4e15-b1b140af8a00.jpeg)
* Webhooks(Custome Webhook)
Node-REDとMakeを連携するために、Webhooksモジュールを使用。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/c85284c2-c097-ad05-e62b-ad4ff3ffa027.png)
MakeのWebhooksの地球儀マークのURLをNode-REDのhttp requestノードのURL覧へ追加し繋げる
:::note warn
ペイロード覧を「クエリパラメータに追加」へ変更することをお忘れなく！
:::
* Googleスプレッドシート(Sarch Rows)
![GSティーチャブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/090dda0e-e8cd-809b-23cd-5d654af862a1.png)
* Tool(Switch)
![Toolsティーチャブルマシーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/531556fc-5211-e93c-825e-404635b4947a.png)
* LINE Notify(Send a Notify)
![LINEティーチャブルマシーン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/4ef34c03-23d4-326b-17bc-c4ac6d1737bc.gif)
:::note warn
Makeでエラーが出た時のメモ
![webhooksチェック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/62f355ee-b4b7-cda6-741f-ffb425be034f.png)
エラーの中身を確認することはもちろんですが、モジュールの右上にある数字の中身を見た方が、早く解決できることが多々ありました。
:::
## 反省
* ちょい見せ内容がLINEで返ってくると手軽かなと思いましたが、Node-REDを使用してるので、手軽さも実用性も皆無となってしまいました
* Node-RED→Code Penへ連携できれば、実用性はUPしたかもしれませんが、方法がわかりませんでした。学んでリベンジします
* LINEに届くちょい見せ内容は、文章に限らず画像でも良いと思いました。改善の余地がたくさんあります。
## 今後の展望
当初は「社内報を読む時代は終わり、聞く時代だ」で設定し思考錯誤していました。メディアプレイヤーから社内報を聞くことができれば、新しいチャネルになる可能性があるため、今後挑戦したいです。

最後まで読んでいただきありとうございました。
【UiPath】メッセージボックスや入力ダイアログを自動で閉じる

**メッセージボックス**や**入力ダイアログ**アクティビティを別ワークフローとして切り出し、**分離 (Isolated)** して呼び出すことで自分で表示したダイアログを自分で操作できます。
これを利用して、一定時間後に自動で閉じるメッセージボックス等を作ることが可能です。

:::note warn
`v21.10.3`で「メッセージボックス」アクティビティには、指定した時間が経過するとメッセージボックスを自動的に閉じることができるプロパティが追加されています。ですので、これ以降のバージョンであれば標準機能を使うことを推奨します。
:::

## 実装例
- ワークフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/87bd00df-52ae-8762-6baa-3f02ded15229.png)
- 入力ダイアログ.xaml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/d5c12ab6-e059-be3a-2cf7-20b2c3a179ec.png)
- 実行結果（Gif）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/722c6c04-13ba-95d8-090a-fee3315b7a19.gif" width=80%>

**並列 (Parallel)** アクティビティを使い、入力ダイアログを呼ぶ **ワークフロー ファイルを呼び出し (Invoke Workflow File)** アクティビティと、それらを操作するアクティビティを並べています。

今回の例では、入力ダイアログが表示された5秒後にロボットが自動的に選択肢を選んでダイアログを閉じます。
5秒以内にユーザーが入力してダイアログを閉じた場合はそちらが優先されます。

### 並列 (Parallel) アクティビティの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/d7607d77-6861-36fa-f326-7723624508ca.png)
**条件**プロパティにTrueを設定しています。
これによりユーザーが手動で入力ダイアログを閉じた場合でもすぐに処理を進めることができますが、
ダイアログが閉じた時点で並列 (Parallel) が完了することにご注意ください。
今回の例でいうと、ユーザー・ロボットどちらが入力した場合でも並列右側の**OKをクリックするアクティビティより後は実行されません。** 
（上の実行結果でも末尾にある「1行を書き込み」のログが出力されていないのが確認できると思います。）

### ワークフロー ファイルを呼び出し (Invoke Workflow File) の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/a0efe1d0-46a7-ac1b-8813-f6e60340baae.png)
**分離**プロパティにTrueを設定しています。
これにより入力ダイアログが別のプロセスとして動くため、メインのプロセス側から操作できるようになります。

## 動作環境
UiPath.System.Activities 21.10.4

## 参考
https://docs.uipath.com/activities/lang-ja/docs/invoke-workflow-file

https://forum.uipath.com/t/parallel/165473

https://www.cresco.co.jp/blog/entry/19183/#:~:text=%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%20%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E3%81%AE%E3%80%8CAutomaticallyCloseAfter,%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82
GitHub ActionsとRcloneでGitHub管理されているファイルをGoogle Driveに同期する

組織の中で、GitHubアカウントを持っていない人に対してGitHub管理されているファイルを共有したいなんてことがあるかもしれません。

今回は、GitHub ActionsとRcloneを利用して、GitHub管理されているファイルをGoogle Driveに同期したので手順をまとめます。

Rcloneについては以前に記事を書きましたのでこちらを御覧ください。
[RcloneでmacOSとGoogle Driveのファイルを同期してみた - Qiita](https://qiita.com/hideki_okawa/items/0fb7068b256dba5a05d0)

## 1. Rcloneの設定ファイルを作成する

[以前に書いた記事](https://qiita.com/hideki_okawa/items/0fb7068b256dba5a05d0)の初期設定として `rclone config` を実行しました。

初期設定が完了すると設定ファイル（`~/.config/rclone/rclone.conf`)が生成されるので内容を控えておきます。

## 2. GitHub ActionsのSecretsに登録する

以下の内容をGithub ActionsのSecretsに登録します。

名前: `RCLONE_CONF`
内容: 手順1で控えた設定ファイルの内容

![スクリーンショット 2022-09-20 21.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217116/a80ab8f3-0972-d0c1-d4cb-654711fecfa8.png)

## 3. ワークフローを作成する

今回はマーケットプレイスに公開されているアクションを利用しました。

```yaml: .github/workflows/sync-github-and-gdrive.yml
name: Sync GitHub and Google Drive
on: push
jobs:
  rclone:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: rclone
      uses: wei/rclone@v1
      env:
        RCLONE_CONF: ${{ secrets.RCLONE_CONF }}
      with:
        args: sync <source>:<source_path> <dest>:<dest_path>
        # 例
        # args: sync ./rclone_test google_drive:rclone_test
```

[wei/rclone: Wraps the rclone CLI to be used in Github Actions](https://github.com/wei/rclone)

## 4. リポジトリにpushする

GitHub Actionsが実行され、Google Driveにファイルが同期されれば成功です。

以上です。
Jetpack ComposeとHiltによるDIのお勉強備忘録


インターンなどに参加し，DIの勉強の必要性に駆られたため，ここにメモを残します．あなかしこ．


## 前提: なぜDIが必要なのか[[1][2]](#参考文献)
- 複数箇所で同じクラスのインスタンスを使うとき
    - 同じ生成コードを複数書く必要がある．
- 一つのオブジェクトの中で，他のオブジェクトをインスタンス化すると．
    - 生成元は，生成先を知る必要があるから依存性が高くなる．
    - 単体テストができなくなる場合がある．

### MVVMの場合
- Viewは，ViewModelの生成方法（依存関係）を知る必要がある．
- ViewModelは，Modelの生成方法を知る必要がある．

ということらしい
__理解を深めるために，実際にアプリを作ってみようというところ．__


## はじめに

### アプリ開発上の参考資料
DIを利用している参考資料（サンプルアプリ）がないか探した結果...

- __Jetpack ComposeによるAndroid MVVMアーキテクチャ入門__ [[1]](#参考文献)．
こちらはMVVMアーキテクチャの理解を目的とした参考書である．
しかし，アプリの実装の際に，HiltによるDIの実装と解説も行っているため，これを利用．


### 自身の判断による実装の変更点
上記の書籍の発行時はJetpack Composeがベータ版である，ライブラリのCompose対応が出揃っていないなどの問題があった．これらは，Android Architecture Blueprints，開発者ドキュメントを参考にできるだけ新しい実装ができるようにした[[3]](#参考文献)．

命名や，実装方法など自身の理解がしやすいように変更している場所がある（問題はないようにしているつもり）．


### 開発環境
- Windows 11 21H2 build 22000.978
- Android Studio Dolphin | 2021.3.1


## アプリ概要
- 入力されたGithubのusernameから，プロフィール画像，名前などを取得する．
- データの取得には，GitHubApiを用いる．
- MVVM + Repository
- UIはJetpack Compose

## HiltによるDIの実装
### Application
```@HiltAndroidApp```を記述
このアプリがHiltを使うことを教えてあげる．

```kotlin:GithubApplication.kt
@HiltAndroidApp
class GithubApplication: Applicatoin()
```

### Activity
ActivityやFragmentには```@AndroidEntryPoint```を記述する．
```kotlin:MainActivity.kt
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    ...
}
```

### ViewModel
```@HiltViewModel```をつけてHiltに教える．
```@Inject```をコンストラクタにつけて，Hiltにオブジェクトの作り方を教える．

```kotlin:MainViewModel.kt
@HiltViewModel
class MainViewModel @Inject constructor(
    ...
): ViewModel() {
    ...
}
```

### Implement Class
実装クラスです(例はRepository)．
```@Inject```を記述して，Hiltにオブジェクトの作り方を教える．

```kotlin:UserRepositoryImpl.kt
class UserRepositoryImpl @Inject constructor(
    ...
): UserRepository {
    ...
}
```

### Module Class
モジュールクラスです(例はRepository)．
```@Module```でHiltのモジュールとする．
```@InstallIn(ViewModelComponent::class)```を記述して，ViewModelのライフサイクルとする．
```@Provides```を記述して，インスタンスを生成する方法を知らせる．

```kotlin:UserRepositoryModule.kt
@Module
@InstallIn(ViewModelComponent::class)
class UserRepositoryModule {
    @Provides
    fun provideUserRepository(userRepositoryImpl: UserRepositoryImpl): UserRepository{
        return userRepositoryImpl
    }
}
```

と言った具合．

詳しい実装内容は，https://github.com/M0710Fa/GithubApp にある．

## 終わりに
勉強の備忘録として記述しました，理解が足りない部分があるかもしれないです．

DIの勉強の必要性に駆られて書きました．
開発をしていて，DIの必要性に駆られたことがまだないので，深い理解という意味ではまだまだかなと感じます．
これは，自身がテストをまともに書いたことがないことが理由の一つだと考えられます．

今後は，テストコードついての知見を深めて行きたい所存です．



## 参考文献
[1] 奥澤 俊樹，Jetpack ComposeによるAndroid MVVMアーキテクチャ入門
https://nextpublishing.jp/book/13660.html

[2] Kazuki Ota，DI (依存性注入) って何のためにするのかわからない人向けに頑張って説明してみる，Qiita
https://qiita.com/okazuki/items/a0f2fb0a63ca88340ff6

[3] android/architecture-samples, Android Architecture Blueprints
https://github.com/android/architecture-samples

[4] Android Developers, Hilt を使用した依存関係の注入
https://developer.android.com/training/dependency-injection/hilt-android?hl=ja

[5] Manuel Vivo, Hilt and Dagger annotations cheat sheet, Medium
https://medium.com/androiddevelopers/hilt-and-dagger-annotations-cheat-sheet-9adea070e495
【python】SeleniumでChrome操作

### 参考
> * [Python Seleniumスクレイピング - IT技術で仕事を減らしたい！](https://timesaving.hatenablog.com/entry/2022/07/24/150000#%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0)
> * [AutoITでChrome操作を自動化(Excel入力) | 月収１００万超えエンジニアの技術グログ](https://gyoumu-kouritsuka-pro.site/autoit-chrome-excel-google/#toc10)




```python
import sys
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome import service as fs

if __name__ == "__main__":
    base_url = "https://www.google.com/"

    url = f"{base_url}/"

    options = Options()

    # Browser
    CHROMEDRIVER = './chromedriver'
 
    # ドライバー指定でChromeブラウザを開く
    chrome_service = fs.Service(executable_path=CHROMEDRIVER)
    driver = webdriver.Chrome(service=chrome_service)
    driver.get(url)

    name = "q"  # elementのname
    search_word = "python selenium"  # 検索するワード

    try:
        marker = driver.find_element(By.NAME, name)
        marker.send_keys(search_word)
        marker.send_keys(Keys.ENTER)

        xpath = "//div[@id='search']//a/h3"  # 検索結果のtitleのxpath
        title_elements = driver.find_elements(By.XPATH, xpath)  # 結果の取得

    except Exception as err:
        print(err)
        sys.exit(1)

    for title_element in title_elements:
        if len(title_element.text) > 0:
            # 検索結果のtitleの親のxpathを取得
            href_element = title_element.find_element(By.XPATH, "..")
            # 出力
            print(
                f'titele={title_element.text.replace(" ...", "")} url={href_element.get_attribute("href")}'
            )


    time.sleep(5)
    driver.close()

```
reCAPTCHAv3のキー設定について

# はじめに
reCAPTCHAv3のキー設定について

# 最終更新日
2022年9月20日

# 環境の情報
OS
Ubuntu20.04

# 注意
最新の状態を確認して下さい。


# 参考さまはこちら
https://www.google.com/recaptcha/about/
https://www.mubag.com/blog/spam-prevention/


# 概要
reCAPTCHAについて調べてみた。
reCAPTCHAよく意味はわかっていないが、
導入している、みたいな状況でしたので、
それでは、知識として、あまりよろしくないかなと思い、少し調べてみました。

# reCAPTCHAとは
・Googleのサービス。
・botによる攻撃を防げる。
・バージョンがいくつかあり、最新がv3。



# 何故スパムなどは来る？
悪意のある人が送っているため。
botと呼ばれている自動収集システムによって送られている。
botは常にIPアドレスを変更ができてしまう。
対策としてはロボットでは送ることができない、いわゆる人間が行う作業や、人間判定されるしか防ぐ方法が今のところ無い。



# v3の特徴
・人間が、ボックスにチェックを入れたりすることが無くなった。
・特に何もしなくても、セキュリティーを強化できる。
・AIがユーザーのページ内での行動を、スコアとして、人かbotかを大まかに算出する。
ブラウザの挙動や、アクセスした情報などから自動的に怪しさを判定する。
人間らしさについての「スコア」（点数）をつけ、そのスコアが低い場合、「人間ではなくbotの可能性が高い」として判定する。
・v1、v2までの、入力の際に、「うまくいかない」「どれがどれか分かんない」「いらいらする」といったお悩みが無くなった！

![1588D2BC-4915-47E7-8878-6DDD2F4B4393.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/50cfd8da-adcf-68ed-61fc-d6953f05424e.png)


# サイトの導入にいるもの
・情報をサイトへの登録
・2つのキー
（reCAPTCHA v3 と v2 の API キーはそれぞれ別のもの。）





# v3キーの作成方法


![Screenshot from 2022-09-20 20-55-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/7e7b1182-810e-6e85-2dbc-4af86019e286.png)



###### ラベル
わかりやすい名前をつける。

###### reCAPTCHA タイプ
reCAPTCHA v3を選ぶ。

###### ドメイン
導入したいサイトのドメインを入力してください。

###### reCAPTCHA利用条件に同意する
利用規約について、内容を確認して同意する。

###### アラートをオーナーに送信する
通知。チェックを入れてください。


できたキーをサイトに設定すれば終わりです。

![Screenshot from 2022-09-20 13-57-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/06ff632a-30f2-b7b2-1d09-151b425e35be.png)