OmniAICreator/Qiita-1.07M huggingface dataset:
ESP32でWi-FiのRSSIを取得する

# 目次
[はじめに](#はじめに)
[使用する物](#使用する物)
[説明](#説明)
[実行結果](#実行結果)
[参考](#参考)

# はじめに
大学の研究でWi-FiのRSSIを利用して屋内測位をしようという事になりました．
micropythonで良い感じのライブラリが用意されてたのでそれを使った取得方法を書いていきます．
今回はESP32を4台使用し，うち3台をwifiのアクセスポイントに，1台を取得に使用します．

# 使用する物
・ESP-WROOM-32(4台)
だけ！
言語はmicropythonです．
使用しているファームウェアは「MicroPython v1.18」です．

# 説明
まず基本になりますが，ESP32にファームウェアを書き込むこととboot.pyを編集してwifiに接続する状態にしてください．
※これをしないと何も始まりません笑

今回は使用するESP32のうち1台を取得用に，残りをアクセスポイント(以下AP)にして取得用のESP32でRSSIを取得していきます．

APのソースコードはこうなってます．
```AP.py
import network

IP = 'アクセスポイントにするESP32のIPアドレス'

def wiFiAccessPoint(ip,mask,gw,dns):
    ap = network.WLAN(network.AP_IF)
    count = 0
    while count < 100:
        try:
            ap.config()
            break
        except:
            count += 1
            print('.',end="")
    ap.ifconfig((ip,mask,gw,dns))
    print("(ip,netmask,gw,dns)=" + str(ap.ifconfig()))
    ap.active(True)
    return ap
    
AP_CONFIG = wiFiAccessPoint(IP,'255.255.255.0',IP,'8.8.8.8')
```
APにするESP32のIPアドレスの確認方法は以下です．
```IPアドレスの確認:
import network
ap_if = network.WLAN(network.AP_IF)
ap_if.ifconfig()
```
これを入力すると，(IPアドレス、ネットマスク、ゲートウェイ、DNS)が表示されるので確認できます．
AP.pyをAPに使用するESP32に書き込んで実行します．

次に取得側です．
取得側のソースコードは以下となっています．
```rssi.py
import network

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

def wlan_scan():
    return network.WLAN(network.STA_IF).scan()

def rssi():
    try:
        w_scan = wlan_scan()
        if w_scan != []:
            for a in range(len(w_scan)):
                if w_scan[a][0] == ESP32のSSID(1台目):
                    name1 = w_scan[a][0]
                    rssi1 = w_scan[a][3]
			        print(name1)
                    print(rssi1)

                elif w_scan[a][0] == ESP32のSSID(2台目): 
                    name2 = w_scan[a][0]
                    rssi2 = w_scan[a][3]
                    print(name2)
                    print(rssi2)

                elif w_scan[a][0] == ESP32のSSID(3台目):
                    name3 = w_scan[a][0]
                    rssi3 = w_scan[a][3]
                    print(name3)
                    print(rssi3)
    except Exception as e:
        print(e)   
            
if __name__ == '__main__':
    print('start')
    while True:
        rssi()
    
print('end')
```
これを実行すると指定したESP32のSSIDとRSSIをプログラムを終了するまで持ってきてくれます．
例外処理はとりあえずプログラムが停止しないようにしたかったので追加しました．

また，SSIDの確認は以下のコードをAPのESP32で実行すると確認が出来るので，APのIPアドレスを確認するついでにやっておきましょう．
```SSIDの確認:
import network
ap_if = network.WLAN(network.AP_IF)
ap_if.ifconfig("essid")
```


# 実行結果
きちんとAPを立てる事が出来た上で，rssi.pyを実行すると．．．
![quiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100933/c0add3bd-a365-5d0a-58b6-842862478f4b.png)

が表示されます．
今回はAPを3台立てるのが面倒くさかったので1台での結果ですが，3台verもきちんと確認できています！

おわり！！！！！
そりではﾉｼ

# 参考
MicroPython ライブラリ　クラス WLAN -- 組込み WiFi インタフェースの制御
https://micropython-docs-ja.readthedocs.io/ja/latest/library/network.WLAN.html
Flask と Electron で作るデスクトップアプリ ③「FlaskとElectron構成の理由」

## はじめに
まだ、作品を作れていないので
なぜ、Flaskだけ、Electronだけを用いらないのかを紹介します。

## なぜ Flask と Electron
以下の画像のように、プロセス間通信（ICP）を行う上でWebサーバーを使用してデスクトップGUIアプリケーションにバンドルすることで画面とサーバーが独立し操作でき、エンドポイントを変更する必要もなくなるので便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/0ceccf56-75e5-6d6d-c048-eb13ab461f83.png)


ここでWebサーバーはFlaskを、デスクトップGUIアプリケーションにElectronを選んだ理由を解説します。

### Webサーバー：Flask
Pythonを使うという前提で話します。
Webフレームワークで**WSGI**であることです。有名どころでいうと**Flask・bottle**が挙げられます。
**WSGI**とは、PythonでWebサーバーとWebアプリケーションを接続するためのインタフェースを定義することを指します。
Dnagoを勉強してる自分には**Flask**の学習コストがそんなに高くなかったことが大きいです。後は、Bottleには速度は速いものの「**速い＝構成が小さい**」であるため、あまりにも小規模しか対応できない点で今回は外しました。

### GUIアプリ：Electron
Electron は GitHubが開発した現在で8年続いている**Atom** というテキストエディタでも使われている安定したソフトウェアフレームワークです。
そのため、長く続いている分ドキュメントもしっかりしており、色々な人が試しているので学習コストが低いため、選定しました。


## まとめ
なぜこの構成にしたかを解説しました。
こういう構成を組む時、何を基準にすればよいか参考にはなったでしょうか。
まだ、作品を作り終えてないので、次回はElelctronとFlaskの最小構成しか説明していなかったので、構成の見直しをしたいと思います。
それでは、また次回をお楽しみに。。
Seleniumで行う無限スクロールwebページのスクレイピング

# 概要
スクロールしないと続きのコンテンツが表示されないサイトに対してスクレイピングを行う方法。
よく見る無限スクロール方法だと取得できない（効率が悪い）場合に直面したので記載する。

# よくある無限スクロール方法
「Selenium 無限スクロール」とかでググるとたくさん出てくる
https://qiita.com/zeeksan/items/f26519cbd529f5b09cbf。
https://www.sukerou.com/2021/09/pythonselenium.html
画面を下までスクロールさせることで続きのコンテンツが表示されるので
大体が以下の流れでスクロールして表示されている情報を一括で取得している。
1. スクロール前のページの高さを取得
1. ページ最下部まで、徐々にスクロールしていく（サンプルでは80%）
1. 新しいコンテンツが読み込まれるのでスクロール後のページの高さを取得する
1. スクロール前後でページの高さに変化がなくなったら無限スクロール終了とみなしてループを抜ける

```Python
url = "https://xxxxxxxxxxxxxxxxxxxxxxxxx/"

#ブラウザのウインドウ高を取得する
win_height = driver.execute_script("return window.innerHeight")

#スクロール開始位置の初期値（ページの先頭からスクロールを開始する）
last_top = 1

#ページの最下部までスクロールする無限ループ
while True:

  #スクロール前のページの高さを取得
  last_height = driver.execute_script("return document.body.scrollHeight")
  
  #スクロール開始位置を設定
  top = last_top

  #ページ最下部まで、徐々にスクロールしていく
  while top < last_height:
    top += int(win_height * 0.8)
    driver.execute_script("window.scrollTo(0, %d)" % top)
    time.sleep(0.5)

  #１秒待って、スクロール後のページの高さを取得する
  time.sleep(1)
  new_last_height = driver.execute_script("return document.body.scrollHeight")

  #スクロール前後でページの高さに変化がなくなったら無限スクロール終了とみなしてループを抜ける
  if last_height == new_last_height:
    break

  #次のループのスクロール開始位置を設定
  last_top = last_height
```

この方法では、スクロールする度に情報が**追加**されてすべての情報が表示されている場合には対応できる。
しかし、情報が**置換**されて情報が入れ替わる（すべての情報が一括では出力されない）場合には対応できない。
スクロールの幅を狭めて少しずつスクロールしてもよいが、スクロール幅はウィンドウサイズ由来なので適切な幅はわからない。
効率も悪い。

# 対策
**指定の要素の位置までスクロール**する方法で対応できる。
JavaScriptでは以下のように指定要素までのスクロールを行える。
https://www.softel.co.jp/blogs/tech/archives/3824

```JavaScript
document.getElementById("target").scrollIntoView(true)
```

現在表示されているコンテンツの最終位置まで一気にスクロールして、また新しいコンテンツを読み込み…
とやっていく方が画面サイズに依存せず効率が良い。

表示コンテンツの最終位置までスクロールするサンプル
```Python
  nowItems = driver.execute_script("return document.getElementsByClassName('ListView__ItemContainer-sc-1veaxzq-1')")
  driver.execute_script("document.getElementsByClassName('ListView__ItemContainer-sc-1veaxzq-1')[%d].scrollIntoView(true)" % int(len(nowItems)-1))
```

※ただしこのようなサイトは表示されているコンテンツが重複することが予想されるので、重複を防ぐために別途対応する必要がある。
【2022】Google Apps Script（GAS）をTypeScriptで書けるClaspの環境構築

こんにちは。[リケイのオコジョ](https://twitter.com/mounmou_design)です。
身の回りのことを少し便利にしたいとき、JavaScript/TypeScriptが書けると捗ります。

![名称未設定のアートワーク 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710694/1b808cb4-ecb1-e7e2-07b2-21131718fe79.png)

# はじめに
今回はGoogle Apps ScriptをTypeScriptで書くための[clasp](https://github.com/google/clasp)の環境設定をまとめます。

https://github.com/google/clasp

# Google Apps Scriptの設定とclaspのインストール
まずはApps Scriptの設定として[ポータル画面](https://script.google.com/home/usersettings)からGoogle Apps Script APIを`ON`にします。

![スクリーンショット_2022-06-24_9_58_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710694/018af95a-c17b-4f28-0599-c03a5aae94bb.png)


次にお手元のPCにclaspをインストールし、ログインします。

```sh
$ npm install -g @google/clasp
$ clasp login
Logging in globally…
🔑 Authorize clasp by visiting this url:
https://accounts.google.com/o/oauth2/v2/auth?<snip>

# 開いた画面で `許可` する

Authorization successful.

Default credentials saved to: ~/.clasprc.json.
```

![スクリーンショット_2022-07-07_7_50_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710694/8defdc7e-caf7-e904-cdc0-1699a0bf30d4.png)

## 許可の取り消しについて
かなり強い権限が必要なので許可の取り消しについてもまとめます。
不要になったら以下のGoogleの管理画面から許可を取り消すことができます。

https://myaccount.google.com/permissions

# claspでGoogle Apps Scriptのプロジェクトを作成
まずはclaspコマンドで`gas-example`という名前でスプレッドシートを使うプロジェクトを作成します。
この時点ではGoogleドライブに`gas-example`という名前のスプレッドシートができています。

```sh
$ mkdir gas && cd gas
$ clasp create --title gas-example --type sheets
$ tree -a .
.
├── .clasp.json
└── appsscript.json
```

この時点でフラットなファイル構成になりますが、個人的な好みで`src`ディレクトリを作成し、Google Apps Scriptのコードを入れることにします。
合わせて`@types/google-apps-script`の型定義を入れます。

```sh
$ mkdir src && mv appsscript.json src
$ npm init -y
$ npm install --save-dev @types/google-apps-script
$ tree -a -I node_modules .
.
├── .clasp.json
├── package-lock.json
├── package.json
└── src
    └── appsscript.json
```
何となくいつも通りな感じになりましたね。
`.clasp.json`のrootDirを先ほど作成した`./src`に修正します。

```json: .clasp.json
{
  "scriptId":"<YOUR SCRIPT ID>",
  "rootDir":"./src",
  "parentId":["<YOUR PARENT ID>"]
}
```

`appsscript.json`のtimeZoneを必要に応じて修正します。

```json: src/appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

`main.ts`を作ってデプロイしてみましょう。

```typescript: src/main.ts
function myFunction() {
  Logger.log('Hello World');
}
```

clasp pushコマンドでデプロイします。
`.claspignore`を書かなくてもnode_modulesなどは除外されるようです。

```sh
$ clasp push
└─ src/appsscript.json
└─ src/main.ts
```

`main.gs`とある通りTypescriptがGoogle Apps Scriptに変換されデプロイすることができました。

![スクリーンショット 2022-07-08 7.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710694/f8a32d08-114d-0aa7-7783-67343406238d.png)

# まとめ
今回はGoogle Apps ScriptをTypeScriptで書くためのclaspの環境設定をまとめました。
次回はSlackへの通知とSheetへの追記方法をまとめます。

## 参考
https://github.com/google/clasp
IBM Cloud: IBM Cloud CLIをVPC内部からインターネットを経由せずにインストールする方法


# 1. はじめに
IBM Cloud CLIをインターネットを経由せずにダウンロードおよびインストールする方法は以下リンクに記載がある。
https://cloud.ibm.com/docs/cli?topic=cli-cli-private-endpoints&locale=en

しかし、この方法はどうもClassic Infrastrutureを想定して記載されているようだ。VPCからは、`ibm-cloud-cli-installer-scripts.s3.private.us.cloud-object-storage.appdomain.cloud`というprivate endpointにはアクセスできない。そこで、VPC内のLinuxにおける手順を記載しておこうと思う(docs issueを起票したがなかなか反映されないため）。


# 2.導入手順

## 2-1. 導入スクリプトのダウンロード
docsで指定しているのはICOSのprivate endpointだったが、代わりにICOSのdirect endpointを利用して、一旦手元にダウンロードしてくる。(docsに示されているURL中で、`private`の代わりに`direct`を利用）。

```txt:
curl -fsSOL https://ibm-cloud-cli-installer-scripts.s3.direct.us.cloud-object-storage.appdomain.cloud/linux_private 
```

## 2-2. 導入スクリプトの編集
ダウンロードしたlinux_privateを以下のようにdirect endpointになるように編集(`private`の代わりに`direct`を利用）。

```txt:
# vi linux_private

metadata_host="ibm-cloud-cli-metadata.s3.private.us.cloud-object-storage.appdomain.cloud"
binary_download_host_pve="ibm-cloud-cli.s3.private.us.cloud-object-storage.appdomain.cloud"
↓
metadata_host="ibm-cloud-cli-metadata.s3.direct.us.cloud-object-storage.appdomain.cloud"
binary_download_host_pve="ibm-cloud-cli.s3.direct.us.cloud-object-storage.appdomain.cloud"
```

## 2-3. インストール作業の実行

```
# sh linux_private
Current platform is linux64. Downloading corresponding IBM Cloud CLI...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.4M  100 11.4M    0     0  1868k      0  0:00:06  0:00:06 --:--:-- 3120k
Download complete. Executing installer...
Bluemix_CLI/
Bluemix_CLI/bin/
Bluemix_CLI/bin/ibmcloud
Bluemix_CLI/bin/ibmcloud.sig
Bluemix_CLI/bin/NOTICE
Bluemix_CLI/bin/LICENSE
Bluemix_CLI/bin/CF_CLI_Notices.txt
Bluemix_CLI/bin/CF_CLI_SLC_Notices.txt
Bluemix_CLI/autocomplete/
Bluemix_CLI/autocomplete/bash_autocomplete
Bluemix_CLI/autocomplete/zsh_autocomplete
Bluemix_CLI/install
Bluemix_CLI/uninstall
Bluemix_CLI/install_bluemix_cli
Install complete.
```

# 参考:  API endpointの設定

（多分、2022年7月時点でのIBM Cloud CLIがダメなんだと思うが） API endpointを`private.cloud.ibm.com`に構成しようとすると、Classic Infrastructureのprivate endpointにアクセス試行してしまう。

```
# ibmcloud api private.cloud.ibm.com
（遅い）

# IBMCLOUD_TRACE=true ibmcloud api private.cloud.ibm.com 2>&1 | grep -i host
Host: ibm-cloud-cli-metadata.s3.private.us.cloud-object-storage.appdomain.cloud
```

よって、"--vpc"オプションも一緒につけてやると上手く行く。

```
# ibmcloud api --unset
# ibmcloud api private.cloud.ibm.com --vpc
# IBMCLOUD_TRACE=true ibmcloud api private.cloud.ibm.com --vpc 2>&1 | grep -i host
Host: ibm-cloud-cli-metadata.s3.direct.us.cloud-object-storage.appdomain.cloud
Host: ibm-cloud-cli-metadata.s3.direct.us.cloud-object-storage.appdomain.cloud
```

もし、都度バージョンアップのチェックをしたくないのであれば、以下を実施しておく。

```
# ibmcloud config --check-version false
```
【E資格】勾配降下法の各手法

E資格に出題される勾配法についてまとめてみました。

## 確率的勾配降下法(SGD)

確率的勾配降下法（Stochastic Gradient Descent, SGD）のこと。一番基本的。

ハイパーパラメータとして学習率lrを持つ。学習率は大きすぎると勾配の谷底付近で谷底を飛び越え、反対側の勾配に到達してしまうため、学習が収束しない。また、学習率が小さすぎると学習が全く進まず、収束させるまでに大量の入力が必要となる。

## momentumSGD

SGDに速度と慣性（モーメンタム）の概念を取り入れた手法。

## AdaGrad

Adaptive Gradient Algorithmの略。

勾配の谷底付近で学習が収束しない問題（谷底を飛び越え、反対側の勾配に到達してしまう事象）を解決するために、学習の進捗に比例して学習率を減少させていく手法。

パラメータごとに固有の値hを保持し、学習の度に勾配の2乗ずつhが増加していく。hが大きくなるほどパラメータの更新量を減らしていく。

ただし、AdaGradには学習率が極端に速く減衰していくという問題があります

## RMSProp

AdaGradの改良版。

学習の進行（ステップ）ごとにhの値を減少させていく。これにより、過去であるほどhの影響を受けづらくなる。

学習初期に大きな勾配を下ると、そのパラメータに対応するhが大きくなり、その後のパラメータ更新が行われなくなるという問題を解決する。

## Adadelta

RMSPropの改良版。更新差分の計算時に無次元化と呼ばれる操作を行うため、ハイパーパラメータとして学習率を設定する必要がないという大きな特徴を持つ。

確率的勾配降下法(SGD)では、学習するパラメータから勾配の値（厳密には学習率を掛けたもの）を除算している。ここでのパラメータを移動距離と考えると、パラメータの勾配の値（微分値）は速さと考えることができる。このように考えると、確率的勾配降下法は、距離から速さを引くという、異なる単位での計算を行っていることが分かる。

Adadeltaは、上記の単位が異なるという問題を解決するため、過去のパラメータの更新差分の平均 / 過去の勾配の平均 × 現在の勾配 の計算を行っている。

## Adam

momentumSGDとRMSPropを複合した手法。

Adadeltaの派生形ではないため、単位が統一されていないという問題点については解決されていない。
【E資格】各活性化関数の特徴と実装例

E資格に出題される活性化関数について、それぞれの関数の特徴についてまとめてみました。

## ステップ関数

ステップ関数は、入力値が0以上の場合は1、入力値が0未満の場合は0を出力する関数です。

この関数は、ニューラルネットワークが登場する前のパーセプトロンで採用されていた活性化関数ですが、現在の誤差逆伝播を行うネットワークにおいては後述のReLU関数に取って代わられています。

```python
def step(x):
    return 1.0 * (x >= 0.0)
```

## シグモイド関数

シグモイド関数は、入力値に対して0.0~1.0の値を出力する関数です。

ニューラルネットワークの活性化関数として用いられる場合は、厳密には「標準シグモイド関数」であり、本来のシグモイド関数はオイラー数eの指数に係数であるαが着きます。ニューラルネットワークの活性化関数として登場する場合、この係数αは1として定義され、記載が省略されます。

関数の微分値の最大値は0.25です。

```python
def sigmoid(x):
    return 1.0 / (1.0 + np.exp(-x))
```

### 勾配消失問題

シグモイド関数を採用したネットワークでは、般化性能を得るために隠れ層を深くしていくと、勾配が消えてしまう勾配消失問題が発生してしまいます。これは、シグモイド関数の微分値が最大でも0.25しかないことに起因しています。シグモイド関数を複数回通ることで勾配の値がどんどん0に近づいてしまい、学習速度の低下に繋がります。

## tanh関数

tanh関数は、入力値に対して-1.0~1.0の値を出力する関数です。シグモイド関数を縦に引き伸ばしたような線分です。

関数の微分値の最大値が1.0なので、シグモイド関数と比較して勾配消失が起こりにくいですが、入力値が大きくなる（返却値が1に近づく）と勾配は緩やかになるため、勾配消失問題を解決するものではありません。

```python
def tanh(x):
    return np.tanh(x)
```

## ReLU関数

ReLU関数は、入力値が0以上の場合には入力値と同じ値を、入力値が0未満の場合は0を出力する関数です。
順伝播型ニューラルネットワークの隠れ層において、最もポピュラーな関数です。

ReLU関数は、入力値が0以上の場合は微分値が常に1になるため、前述のシグモイド関数やtanh関数の持ってる勾配消失問題が解決されます。

```python
def relu(x):
    # 0がxのうち、大きいものを返す
    return np.maximum(0, x)
```

## Absolute value rectification

ReLU関数は、入力値の正負のいずれの場合でも、常に入力値の絶対値を返すような関数です。

関数の微分値は入力が正の場合は1.0、負の場合は-1.0となります。

```python
def abs_relu(x):
    return np.abs(x) 
```

## leaky ReLU

leaky ReLUは、名前の通りReLUに類似する関数で、入力値が0以上の場合ReLU関数と同様に入力値と同じ値を出力し、入力値が0未満の場合は入力値に応じた負数を出力する関数です。

なお、入力値が0未満の場合に出力される値は、係数αに応じた大きさに調整されます。学習の過程で係数αが変更するものは、Parametric ReLUと呼ばれています。

```python
def leaky_relu(x, alpha):
    # 0以上であればxを返し、
    # 0未満であればxに係数αを掛けたものを返す
    return np.where(x => 0, x , alpha * x)
```
【C++】基礎を学ぶ③～整数同士の四則演算～

# 四則演算に利用する算術演算子
| 演算子 | 	概要  | 
| ---------- | ------ | 
| +          | 足し算 | 
| -          | 引き算 | 
| *          | 掛け算 | 
| /          | 割り算 | 

※整数同士の割り算で割り切れない場合、切り捨てされる

## 整数同士の四則演算を行うプログラム
```cpp
#include <iostream>

using namespace std;

int main(){
  cout << 10 + 2 << endl;
  cout << 10 - 2 << endl;
  cout << 10 * 2 << endl;
  cout << 10 / 2 << endl;
  cout << 10 / 3 << endl;
  return 0;
}
```
```
12
8
20
5
3
```

# 剰余 (余り)を計算する
剰余を計算する場合、`%`を使う
## 剰余を計算するプログラム
```cpp
#include <iostream>

using namespace std;

int main(){
  cout << 10 % 2 << endl;
  cout << 10 % 3 << endl;
  return 0;
}
```
```
0
1
``` 
# 次の記事
[【C++】基礎を学ぶ④～変数の宣言と値の代入、変数の型～](https://qiita.com/rapirapi/items/69273ebd134e1eb8c2e8)
利用目的による制限の例外

### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

# 個人情報の利用目的
## 利用目的による制限の例外

#### 「利用目的による制限」と「事業の継承」の規定は、下記の場合は適用されない
（下記の場合は、あらかじめ本人の同意を得ることなく、特定された利用目的の達成に必要な範囲を超えて個人情報を取り扱うことができる）

[「本人の同意」とは？（2-16「本人の同意」）](https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-16)参照

#### （1）法令に基づく場合
<details>
<summary>詳細</summary>
<ul>
<li> 例）警察の捜査関係事項照会に対応する場合（刑事訴訟法（昭和23年法律第131号）第197条第2項）</li>

<li> 例）裁判官の発する令状に基づく捜査に対応する場合（刑事訴訟法第218条）</li>
<li> 例）税務署の所得税等に関する調査に対応する場合（国税通則法（昭和37年法律第66号）第74条の2他）</li>
<li> 例）製造・輸入事業者が消費生活用製品安全法（昭和48年法律第31号）第39条第1項の規定による命令（危害防止命令）を受けて製品の回収等の措置をとる際に、販売事業者が、同法第38条第3項の規定に基づき製品の購入者等の情報を当該製造・輸入事業者に提供する場合</li>
<li> 例）弁護士会からの照会に対応する場合（弁護士法（昭和24年法律第205号）第23条の2）</li>
<li> 例）保健所が行う積極的疫学調査に対応する場合（感染症の予防及び感染症の患者に対する医療に関する法律（平成10年法律第114号）第15条第1項）</li>
<li> 例）災害発生時の停電復旧対応の迅速化等のため、経済産業大臣の求めに応じて、一般送配電事業者が、関係行政機関又は地方公共団体の長に対して必要な情報を提供する場合（電気事業法（昭和39年法律第170号）第34条第1項）</li>
</ul>
</details>

#### （2）人（法人を含む）の生命、身体、財産の保護のために必要がある場合であって、本人の同意を得ることが困難であるとき

* 例）急病その他の事態が生じたときに、本人について、その血液型や家族の連絡先等を医師や看護師に提供する場合
* 例）大規模災害や事故等の緊急時に、被災者情報・負傷者情報等を家族、行政機関、地方自治体等に提供する場合
* 例）事業者間において、暴力団等の反社会的勢力情報、振り込め詐欺に利用された口座に関する情報、意図的に業務妨害を行う者の情報について共有する場合
* 例）製造した商品に関連して事故が生じたため、又は、事故は生じていないが、人の生命若しくは身体に危害を及ぼす急迫した危険が存在するため、当該商品の製造事業者等が当該商品をリコールする場合で、販売事業者、修理事業者又は設置工事事業者等が当該製造事業者等に対して、当該商品の購入者等の情報を提供する場合
* 例）上記事例4のほか、商品に重大な欠陥があり人の生命、身体又は財産の保護が必要となるような緊急時に、製造事業者から顧客情報の提供を求められ、これに応じる必要がある場合
* 例）不正送金等の金融犯罪被害の事実に関する情報を、関連する犯罪被害の防止のために、他の事業者に提供する場合

#### （3）公衆衛生の向上又は心身の発達途上にある児童の健全な育成のために特に必要があり、かつ、本人の同意を得ることが困難である場合

* 例）健康保険組合等の保険者等が実施する健康診断の結果等に係る情報を、健康増進施策の立案、保健事業の効果の向上、疫学調査等に利用する場合
* 例）児童生徒の不登校や不良行為等について、児童相談所、学校、医療機関等の関係機関が連携して対応するために、当該関係機関等の間で当該児童生徒の情報を交換する場合
* 例）児童虐待のおそれのある家庭情報を、児童相談所、警察、学校、病院等が共有する必要がある場合

#### （4）国の機関等（地方公共団体又はその委託を受けた者を含む）が法令の定める事務を実施する上で、民間企業等の協力を得る必要があり、かつ、本人の同意を得ることが当該事務の遂行に支障を及ぼすおそれがある場合


* 例）事業者が税務署又は税関の職員等の任意の求めに応じて個人情報を提出する場合
* 例）事業者が警察の任意の求めに応じて個人情報を提出する場合
* 例）一般統計調査や地方公共団体が行う統計調査に回答する場合

#### （5）学術研究機関等が個人情報を学術研究目的で取り場合（当該個人情報を取り扱う目的の一部が学術研究目的である場合を含む）で、個人の権利利益を不当に侵害するおそれがない場合

[「学術研究機関等」とは？（2-18「学術研究機関等」）](https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-18)参照
[「学術研究目的」とは？（2-19「学術研究目的」）](https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-19)参照


#### （6）学術研究機関等に個人データを提供し、かつ、その学術研究機関等が個人データを学術研究目的で取り扱う必要がある場合（個人データを取り扱う目的の一部が学術研究目的である場合を含み、個人の権利利益を不当に侵害するおそれがある場合を除く）

[「学術研究機関等」とは？（2-18「学術研究機関等」）](https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-18)参照
[「学術研究目的」とは？（2-19「学術研究目的」）](https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-19)参照

https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a3-1-5
事業の承継

### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

# 個人情報の利用目的

## 事業の承継
#### 個人情報取扱事業者が、合併、分社化、事業譲渡等により他の個人情報取扱事業者から事業の承継をすることに伴って個人情報を取得した場合、あらかじめ本人の同意を得ないで、承継前の利用目的の達成に必要な範囲を超えて、当該個人情報を取り扱ってはならない
（＊ 利用目的の達成に必要な範囲内で取り扱う場合は目的外利用にはならず、本人の同意を得る必要はない）

＊ 事業の承継後に、承継前の利用目的の達成に必要な範囲を超えて、個人情報を取り扱う場合は、あらかじめ本人の同意を得る必要があるが、当該同意を得るために個人情報を利用すること（メールの送信や電話をかけること等）は、承継前の利用目的として記載されていない場合でも、目的外利用には該当しない。

[「本人の同意」とは？（2-16「本人の同意」）](https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-16)参照

https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a3-1-4
Xcode でコードスニペットを登録する方法

# はじめに

今月になってやっと SwiftUI を勉強しようと、 [Apple公式チュートリアル](https://developer.apple.com/tutorials/app-dev-training) から開始しました。
すると、毎画面毎画面、View と Previews のテンプレートを書くようになり、 ~~標準でコードスニペットないのかなと見たところ、見当たらなかったので、~~ コードスニペットを自作して登録しておくことにしました。

:::note info
インフォメーション
`SwiftUI` を import すれば、標準のコードスニペットが候補として表示されることに先月気づきました。
:::

# コードスニペットとは？

ところで、コードスニペットとはなんだっけというと、よく使うコードを登録しておくと、それをクリックするだけで、そのコードを挿入して利用できるという、短いコードのまとまりのことです。
Xcodeに標準で備わっており、簡単に登録・参照できるので、開発効率アップになりそうだなと思ったら、それらのコードは登録していくといいかもです。

- 標準で備わっているコードスニペットの例
    - **[Command + Shift + L]** のショートカットキーでスニペットが表示できます。
![Screen Shot 2022-07-07 at 22.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/ff3b0908-2b5f-d215-af05-57028cf7fb5c.png)


# コードスニペットの登録方法

## １）まずは、登録したいコードを書きます。
私の場合はこちら。

```swift
import SwiftUI

struct MyView: View {
    var body: some View {
        Text("Hello, world!")
    }
}

struct MyView_Previews: PreviewProvider {
    static var previews: some View {
        MyView()
    }
}
```

## ２）次に、登録したいコードを選択し、右クリックします。
すると、 `Create Code Snippet...` という選択肢が現れるので、これを選択します。

![Screen Shot 2022-07-07 at 21.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/ac0ba581-5780-fb60-a452-4253b222e0c3.png)

## ３）コードスニペットの登録画面が現れるので、各項目を編集します。
コード部分には、先ほど選択した範囲のコードがすでに適用されています。

![Screen Shot 2022-07-07 at 21.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/f9a7f3e3-ca5c-f77c-2e5f-9d23095ae5ac.png)

こんな感じに編集しました。

![Screen Shot 2022-07-08 at 20.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/5539ae18-dbe5-e1dd-b000-535b8414c317.png)

## ４）各項目の編集のポイント

### ４−１）コードの項目で、プレースホルダーを設定する。
毎回自由に文字列を設定したい部分には、プレースホルダー `<#任意の文字列#>` を使います。
上記の例では、 `MyView` という部分が、毎回自由に文字列を設定したい部分なので、以下のように書き換えます。

```
struct <#MyView#>: View {
```

### ４−２）Completionの項目をちゃんと登録する。
編集項目のうち、ちゃんと登録しておきたいのは `Completion` という項目です。
**`Completion` に登録した文字列をコーディングすると、該当するコードスニペットがコード補完の候補として現れてくれます。**

こんな感じです。Enterキーで挿入できます。

![Screen Shot 2022-07-08 at 20.17.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/2473cdb1-cd93-8145-b52f-d39ab8c50cd9.png)


# 最後に

何事も繰り返し書いて身に染み込ませていくのが良いものの、気が済んだら毎度コードスニペットに登録して、楽ちんするのもいいんじゃないかと思います:v:
これから SwiftUI を勉強していく中で、微妙に長くてめんどくさい定型文が出てきたら、また登録していこうかと思います。

# 変更履歴

:::note warn 
2022/07/08 20:20
投稿当初 `Completion` の設定値を `struct MyView` としており、コーディングで `stru...` と入力すると、毎回上記のスニペットがコード補完の候補として現れてきて、鬱陶しかったので、設定値を `swiftuimyview` に変更しました。
当初は汎用的な文字列の方が、見つかりやすくて便利かと思ったのですが、逆に特殊な文字列の方が、必要な時にだけ見つけやすく好きだなと今は思っています。
:::

:::note warn
2022/10/20
「はじめに」に、 `SwiftUI` を import すれば、標準のコードスニペットが候補として表示される旨を追記。
:::
`apt rdepends`コマンドのマニュアルは、`apt-cache`コマンドにある

# 環境
* Xubuntu 18.04
* apt 1.6.14 (amd64)

# はじめに
`apt rdepends`コマンドは、パッケージの依存元ライブラリを出力します。

```
$ apt rdepends python3.6
python3.6
Reverse Depends:
  依存: libpython3.6-testsuite (>= 3.6.9-1~18.04ubuntu1.7)
  依存: virtualbox
  依存: virtualbox
  依存: python3.6-venv (= 3.6.9-1~18.04ubuntu1.7)
  拡張: idle-python3.6
  依存: idle-python3.6
  推奨: python3.6-minimal
  提案: python3.6-doc
  依存: python3.6-dev (= 3.6.9-1~18.04ubuntu1.7)
  依存: python3.6-dbg (= 3.6.9-1~18.04ubuntu1.7)
  依存: python3-uno
  依存: python3-all
  依存: python3 (>= 3.6.7-1~)
  依存: python3 (>= 3.6.5-2~)
  依存: gedit
  依存: virtualbox
  依存: python3.6-venv (= 3.6.5-3)
  依存: python3-escript-mpi
  依存: python3-escript
  依存: python3-dbus-tests
  依存: pitivi
  依存: liferea
  依存: kdevelop-python
  拡張: idle-python3.6
  依存: idle-python3.6
  依存: rhythmbox-plugins
  推奨: python3.6-minimal
  提案: python3.6-doc
  依存: python3.6-dev (= 3.6.5-3)
  依存: python3.6-dbg (= 3.6.5-3)
  依存: python3-uno
  依存: python3-all
  依存: libpython3.6-testsuite (>= 3.6.5-3)
  依存: cluster-glue
  依存: gedit

```

しかし、aptコマンドのヘルプやマニュアルには`rdepends`コマンドが掲載されていません。`rdepends`の使い方はどこに書いてあるのでしょうか？

```
$ apt --help
apt 1.6.14 (amd64)
使用方法: apt [オプション] コマンド

apt は、検索や管理、パッケージに関する情報を問い合わせるコマンドを
提供するコマンドラインパッケージマネージャです。apt-get や apt-cache
のような特化した APT ツールと同じ機能を提供しますが、デフォルトで
対話的に使用するために適切なオプションを有効にします。

最も使用されているコマンド:
  list - パッケージ名を基にパッケージの一覧を表示
  search - パッケージの説明を検索
  show - パッケージの詳細を表示
  install - パッケージをインストール
  remove - パッケージを削除
  autoremove - 自動インストールされ使われていないすべてのパッケージを削除する
  update - 利用可能パッケージの一覧を更新
  upgrade - パッケージをインストール/更新してシステムをアップグレード
  full-upgrade - パッケージを削除/インストール/更新してシステムをアップグレード
  edit-sources - ソース情報ファイルを編集

利用可能なコマンドの詳細は apt(8) を参照してください。
設定オプションと構文は apt.conf(5) に詳述されています。
ソースを設定する方法の詳細は sources.list(5) で見つけることができます。
パッケージとバージョンの選択は apt_preferences(5) で表現できます。
セキュリティの詳細は apt-secure(8) を参照してください。
              この APT は Super Cow Powers 化されています。
```

# 解決
`man apt`には、以下のように記述されています。
>apt は、パッケージ管理システム用の高レベルのコマンドラインインターフェースを提供します。エンドユーザインターフェースとして設計されています。また apt-get(8) や apt-cache(8) のような専用の APT ツールと比べて、デフォルトでインタラクティブな使用に適したいくつかのオプションが有効になっています。
>apt 自身と同じように、man ページはエンドユーザインターフェースとして意図されています。さらに、一部のオプションや詳細の豊富さで読者を圧倒することを避けるため、複数の場所で部分的に情報を複製しないよう、最も使用されるコマンドとオプションを言及するように意図されています。

つまり、`rdepends`コマンドは最も使用されるコマンドではないので、マニュアルに載っていないようです。
ではどこに載っているのか？`apt`は`apt-get`と`apt-cache`の統合ツールなので、どちらかのコマンドに載っているはずです。`apt-cache`はクエリ発行系（閲覧系）のコマンドなので、`apt-cache`コマンドに`rdepends`コマンドが載っていそうです。

https://askubuntu.com/a/1191803

apt-cacheコマンドのヘルプを見ると、`rdepends`コマンドがありました！

```
$ apt-cache -h
...

最も使用されているコマンド:
  showsrc - ソースレコードを表示する
  search - 正規表現パターンによってパッケージ一覧を検索する
  depends - パッケージの生の依存情報を表示する
  rdepends - パッケージの生の逆依存情報を表示する
  show - パッケージの情報を表示する
  pkgnames - システム内のすべてのパッケージ名一覧を表示する
  policy - ポリシー設定情報を表示する
```


ちなみに`rdepends`の説明は、シンプルな一文でした。
```
$ man apt-cache | cat
...
  rdepends パッケージ...
           rdepends は、パッケージが持つ被依存関係を一覧表示します。

```


# まとめ
* `apt rdepends`コマンドのマニュアルは、`apt-cache`コマンドのマニュアルに掲載されている
* `apt`コマンドのマニュアルには、すべてのコマンドが掲載されていない

# 参考サイト
https://stackoverflow.com/q/66678693/9156371
2022年前半のお仕事まとめと後半

## 2022年後半やりたいこと

### 社内ナレッジマネジメント継続

- 他部門もみるサイトとして、理解しづらい開発組織をオープンに伝えていきたい
- 採用強化。入社者（中途、新卒）が迷わないコンテンツとアクセシビリティを実現したい
- 開発の状況がわかるようにリアルタイムなデータを見せたい
- 新ツール、GithubやZenhub、SonarQubeなどの使い方や便利情報をを拡充したい
- 製品哲学、カタログ、デザインなど指針を明示していきたい
- と同時に、古いWikiを掃除したい。ダサいのを整えていきたい
- リンク集、共有フォルダを整理して、意味ある状態にしたい


### 開発者座談会して記事化

- 退職して別の会社にいった人へ、アルムナイというやつ
- レガシーなシステムへの誤解
- オンボーディングも記事化したい
- あと、Twitter運用へ

### その他

- 社内イベント
- 資格勉强継続
- などなど... 
    - https://qiita.com/organizations/works-hi



## 2022年前半やったこと
### 読書
[2022年前半読んだ本のおすすめをまとめるので皆読んでほしい - Qiita](https://qiita.com/e99h2121/items/0737d9f29d18677d604b)

### 資格取得

[AWS Solutions Architect - Associate合格まで（2022.06） - Qiita](https://qiita.com/e99h2121/items/fd1ccece6c288d83df42)
[AWS学習事始め - 基礎資料読んだリスト～Cloud Practitioner合格まで（2022.02） - Qiita](https://qiita.com/e99h2121/items/bec62a16c1264baf6a5e)
[3級テクニカルライティング試験を受けてみて合格した記録 - Qiita](https://qiita.com/e99h2121/items/201dad82a3d35066a148)

### Qiita記事

180本

### 広報活動

[HRシステム「COMPANY® 」開発チームが真剣に雑談する「WHIならではの仕事の楽しみ方」とは？ - Qiita Zine](https://zine.qiita.com/interview/202205-whi/)

https://twitter.com/devsumi/status/1527488732927930368?s=20

### 「新人さんにすすめる」

[新人さんにすすめる有益なツール達 2022春 - Qiita](https://qiita.com/e99h2121/items/f70db44e7f69901f0141)
[新人さんにすすめる有益な技術書達 2022春 - Qiita](https://qiita.com/e99h2121/items/1b243efb1499527f0701)
[新人さんにすすめる (弊社の) 有益な記事達 2022春 - Qiita](https://qiita.com/e99h2121/items/d9c6c28d472f263d590a)
[新人さんにすすめるさいきょうの読書術 2022年初夏 - Qiita](https://qiita.com/e99h2121/items/fd4e6404d46f3d849282)
[新人さんにすすめる「もくもく会」 2022年初夏 🍧 - Qiita](https://qiita.com/e99h2121/items/a66255cd6d68115a7694)
[新人さんにすすめるふりかえり 2022夏 - Qiita](https://qiita.com/e99h2121/items/c54b2881cef8fb6f3471)

### 「製品哲学」

[製品哲学のない製品と「緩やかに死んでいくシステム」を考える - Qiita](https://qiita.com/e99h2121/items/f9e074823923747d8fc1)
[愛される製品の、製品哲学をまなぶ - Qiita](https://qiita.com/e99h2121/items/56d2f0b9a609ab09b319)
[製品哲学の言語化にいどむ。「カタログ」概論 - Qiita](https://qiita.com/e99h2121/items/2e992ba08be2ad324124)
[愛される製品は製品哲学に「カスタマーサクセス」が組み込まれているのでは説 - Qiita](https://qiita.com/e99h2121/items/ae24d4e02f3e3d18a8b3)
[製品哲学をDesign Systemsに記そう - Qiita](https://qiita.com/e99h2121/items/a4fb8f4b2fa6bb20e3a7)

### 詳細は

> [開発文書部のお仕事 2022年1月版 - Qiita](https://qiita.com/e99h2121/items/b83423a07c975b349f3a)
> [開発文書部のお仕事 2022年2月版 - Qiita](https://qiita.com/e99h2121/items/6ce238b6b53749b7e7d9)
> [開発文書部のお仕事 2022年3月版 - Qiita](https://qiita.com/e99h2121/items/b5f1e5cb9717ad86a65d)
> [開発文書部のお仕事 2022年4月版 - Qiita](https://qiita.com/e99h2121/items/17589f66ba41c82f35e5)
> [開発文書部のお仕事 2022年5月版 - 新人さんにすすめる記事ふりかえり - Qiita](https://qiita.com/e99h2121/items/ef57d738f9c515abde2f)
> [開発文書部のお仕事 2022年6月版 - 製品哲学をかんがえる - Qiita](https://qiita.com/e99h2121/items/8b60f8615fb749f386be)

## 以上

7月からのお仕事掲示です。
どうぞ宜しくお願いいたします～
Rの&と&&の違い

## 本文

[短絡評価](https://ja.m.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1)するかどうかです。
&だと左と右がどちらも評価されますが、&&だと左がFALSEなら右は評価されずにFALSEを返します。
基本的に、&&の場合は単一要素ベクトルしか想定されていないと考えると良さそうです。
&はベクトル演算で&&は制御構造と考えても良いかもしれません。

```r
c(TRUE, FALSE, TRUE) & c(TRUE, FALSE, FALSE)
# [1]  TRUE FALSE FALSE

# [非推奨] &&だと最初の要素のみで評価される挙動になるが、複数要素のベクトルには使わない方が自然。
c(TRUE, FALSE, TRUE) && c(TRUE, FALSE, FALSE)
# [1] TRUE
```

```r
x <- c("A", "B", "C")
is.numeric(x) && sd(x) > 0 
# [1]  FALSE
## sd(x) > 0は単独だとNAを返すが、左がFALSEなので短絡されて評価されていない

is.numeric(x) & sd(x) > 0
# [1] FALSE
# Warning message:
# In var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) :
#   NAs introduced by coercion
## &でもFALSEが返るが右も評価されてWarninngが出ている。
## 数値型ならsdを計算するという制御を考えるなら&&を使った方が良い
```

## おまけ

短絡評価を使った遊びです。
どういう処理になっているか考えてみてください。

```r
# R version > 4.2
hoge <- \(x) x |> is.null() && return() || return(round(x))
hoge(3.2)
# [1] 3
hoge(NULL)
# NULL

## \(x)はfunction(x)のこと
## |>はパイプライン演算子
## &&は、左がFALSEの場合は右は評価されないが、左がTRUEの場合は左も評価する。
## ||は、左がFALSEの場合は右は評価されるが、左がTRUEの場合は右は評価しない。
```
NCMBとMonaca、DeepL APIを使って翻訳アプリを作る（その3：保存データの取得と表示）

NCMBとMonacaを使ってデモアプリを作ってみます。今回はDeepL APIを使った翻訳アプリです。翻訳結果をNCMBのデータストアに保存し、後で確認できるようにします。データストアにデータを保存したり、逆に取り出すのはよくあるケースなので、様々な場面で応用できるはずです。

[前回は翻訳処理とデータの保存までを紹介](https://qiita.com/goofmint/items/1ff6caae08add6a4301c)しました。今回は保存データの取得と表示を実装します。

## コードについて

今回のコードは[NCMBMania/monaca_translation_app: MonacaとNCMB、DeepL APIを使った翻訳アプリです](https://github.com/NCMBMania/monaca_translation_app)にアップロードしてあります。実装時の参考にしてください。

## 履歴画面について

再掲になりますが、履歴画面は次のようなコードになります。

```html
<div class="page">
	<div class="navbar">
		<div class="navbar-bg"></div>
		<div class="navbar-inner">
			<div class="title">翻訳</div>
		</div>
	</div>
	<div class="page-content">
		<div class="list links-list">
			<ul>
				${translations.value.map(translation => $h`
					<li><a href="/translations/${translation.objectId}">${translation.original}</a></li>
				`)}
			</ul>
		</div>
	</div>
</div>
```

![monaca-translation-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/43bc0cfe-ff78-cac2-55ce-6d624fc04968.jpeg)


### 履歴データの取得

NCMBに保存した履歴データを取得します。履歴データはストアに追加することで、画面が自動的に更新されます。翻訳処理の時のように、 `$update` 関数を実行せずに履歴データが一覧表示されます。

```js
export default (props, { $store, $onMounted }) => {
	const { translations } = $store.getters;
	// DOMがマウントされたタイミング実行
	$onMounted(async () => {
		// 履歴データの取得
		const Translate = ncmb.DataStore('Translate');
		const translates = await Translate
			.limit(10)
			.fetchAll();
		// ストアに追加
		$store.dispatch('addTranslates', translates);
	});
	return $render;
}
```

## 一覧をタップした際の処理

一覧をタップした際には `/translations/:objectId` にリンクで遷移します。これは `pages/translation.html` を表示する処理です（ `js/routes.js` にて定義しています）。

```js
// 履歴詳細画面（routes.jsの抜粋）
{
	path: '/translations/:objectId',
	componentUrl: './pages/translation.html',
},
```

### www/pages/translation.htmlについて

www/pages/translation.htmlの画面は次のようになります。

```html
<div class="page">
	<div class="navbar">
		<div class="navbar-bg"></div>
		<div class="navbar-inner">
			<div class="left">
				<a href="#" class="link back">
					<i class="icon icon-back"></i>
					<span class="if-not-md">戻る</span>
				</a>
			</div>
			<div class="title">翻訳</div>
		</div>
	</div>
	<div class="page-content">
		<div class="block-title">日本語</div>
		<div class="block">
			<p>${translation.original}</p>
		</div>
		<div class="block-title">英訳</div>
		<div class="block">
			<p>${translation.translate}</p>
		</div>
	</div>
</div>
```

リンク遷移した際のURLからobjectIdを受け取り、ストアにある履歴データから該当データを探します。そして、そのデータを画面に表示します。

```js
export default (props, { $store }) => {
	// URLからobjectIdを受け取ります
	const { objectId } = $f7route.params;
	// ストアから翻訳履歴データを受け取ります
	const { translations } = $store.getters;
	// 翻訳履歴データから、選択されたデータを抽出します
	const translation = translations.value.filter(translation => translation.objectId === objectId)[0];
	return $render;
}
```

![monaca-translation-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/fbf30f10-25d7-35ba-8c1f-5e296ac1e314.jpeg)


これで翻訳アプリの完成です。

## まとめ

今回はデータストアへのデータ保存と、検索処理を利用しました。検索と言っても条件は特に指定していません。データストアは文字列検索や以上以下検索など様々な条件を指定して検索できますので、ぜひお試しください。

また、NCMBにはデータストアだけでなくファイルストアや認証、プッシュ通知機能があります。ぜひそれらを使って、あなたのアプリ開発に活かしてください。
プログラミング初心者の私がQiitaでいただいた金言

## この記事について
この記事は、プログラミング初心者の私が他のユーザーさんからいただいたコメントで、
是非紹介したいコメントがあったので、同じくプログラミング初心者で悩んでいる人達に
共有するために書いております。


# 当時の状況
商社に勤めていましたが、転職に向けて日々の仕事とは別に興味があったプログラミング
を独学で学習している真っ最中でした。
自分の書いたコードがどうしても正常に動作せず、原因と対処方法を検索しては試すので
すが、解決の糸口が掴めず、なかなか進まない苛立ちと焦りが募っていました。

結局、自己解決を諦めて、何が原因かの見通しも立っていない漠然とした状況で、失礼か
とも思いましたがQiitaに助けを求めて質問をいたしました。


# 質問した結果...
質問したその日にデバッグ方法について回答が来ました。
①var_dumpメソッド（プログラムがどのように処理されているか確認するため
に処理結果や経路を確認）
②executeメソッド（SQLが正しく処理されているかも確認するために、戻り値を入手）
③errorInfoメソッド（直近のエラー情報を取得）

①、②、③と実行するのですが、そもそも初心者である私は、正しくデバッグできている
か自信もありませんでした。回答が欲しい私は、①、②、③の処理を適切な位置にでき
ているか再度確認の質問をしました。

即ち、ずるい質問で、例えるなら、勉強を教えて下さる先生に対して、答案用紙を下さいと
言っているようなイメージでしょうか。（遠回しに勉強する気がありませんと伝えている）
回答を誘発しようとしている質問もずるいですが、自分の言葉に責任がない、やる気がありま
せんと自分で言っているような愚かな質問で、もし会社で同じ質問をしていたら呆れられてい
たなと思いました。


# いただいた金言
ずるい質問をした後に、このコメントをいただいたおかげで、私は自分の愚かさに気づき
ました。

「①②③は基本的には"あなた"がコードの動作を理解・確認するためのもので、「適切な位置」
とはそれが実現できる位置です。行った操作に対して、プログラムの１行１句がどのように動い
ているか確信を持っていますか？変数の中身に何が入っていて、それがどのように変化し、条件
分岐のどこを通るのか説明できますか？確信がないところで①②③で確認しましょう。」

# 反省
表現が難しいですが、胸に刺さりました。バグは生じても良い、デバッグ処理をしてバグを見つ
ければ良いと無責任な態度でコードを書いていたので、あのような質問をしてしまったのだと思います。
恐らく私の質問に回答して下さったユーザーさんは、自分の書いてるコードに責任を持たれてい
て、バグを起こさないために毎日何回もデバッグ処理で動作を確認しながら進めているからこそ、あのような金言を言うことができるんだと思います。

それに比べて私は、とほほほ....

# 得た教訓

①シンプルにデバッグ処理の理解が深まった
②ネットでバグ対処が見つからない場合、それは自分固有の問題と考えるべき
　→ネットに対処方法が無いと言うことは共通化できないミスと言うこと。
　→つまりスペルミスや入力ミスなど。
③出力されるものだけでなく、書いたコードがどのような動作を行っているのか
　責任を持って確認すること
PlaygroundでRxSwiftを試したい!!

# はじめに

RxSwift,MVVMを勉強中です。
...難しいです。よく解らない🥲

とはいえ,解らないでは終われないので、Playgroundを使って、コードを書きまくって、毎日少しずつでも理解を深めていきたい今日この頃です。

なので今回はPlaygroundでRxSwiftを使える環境作りを紹介したいと思います!!

尚、**Xcodeのversionは13.4.1**で行っています。

### 1.プロジェクトの作成
Appを選択、作成します。名前は任意でOKです。

![スクリーンショット 2022-07-08 3.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/4751942f-229d-2968-0a88-1dbbdaa875c3.png)
### 2.ファイルの削除
要らないファイルは削除してしまいましょう!!
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/5fab3d49-6fc4-76a1-ae16-4d5547cb5846.png)
### 3.ファイルの新規作成
ショートカットキー(⌘ N)を押下して、ファイルを新規作成します。
一番下にある**Blank Playground**を選択しましょう。
![スクリーンショット 2022-07-08 3.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/781b21bc-0407-ab2d-3256-3cbb9c1437b4.png)
### 4.RxSwiftの導入
File->AddPackages...を選択します。
![スクリーンショット 2022-07-08 3.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/39f00511-fbdb-66cc-905d-7175e79cd494.png)

後は検索バーに「rx」と入力すればRxSwiftが出てきますので、Add Packageして、更にRxSwiftにチェックし、Add Packageします。
![スクリーンショット 2022-07-08 3.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/21b12cd0-73f6-c2bd-2659-0e52a8555f35.png)

これで準備が整いました!!

### 5.さいごに大事なこと!!
プロジェクトを立ち上げた時はまず、ショートカットキー(⌘ Shift k)を押して**キャッシュクリーンしてからでないと正常にビルド出来ません**でした。
忘れないようにしましよう。以上です!!
Python3エンジニア認定基礎模試試験3回目　-間違えた問題-

<H1>獲得点数　850/1000点</H1>
<H2>正答率: 85.0 % ( 34問 / 40問 正解 )</H2>

```python
正規表現ツールを提供するモジュールを選択肢の中から選びなさい。

A,re
```

```python
以下のプログラムを実行した際の出力結果を選びなさい。
import json
x = {'name':'yamada','data':[2,3,4]}
print(json.dumps(x))

A,{"name": "yamada", "data": [2, 3, 4]} #エンコードされて文字列になる
```
```python
以下のプログラムを実行した際に出力される例外の型を選びなさい
x = 10/0

A,ZeroDivisionError
```

```python
def dive_into_code(teacher, *mentor):#あふれた引数を受け取ってる
    print(teacher)

dive_into_code('Noro', 'Nakao', 'Miyaoka')

A,Noro
```

```python
条件についての説明で誤っているものを選択肢から選びなさい。

A,比較はブール演算のand及びorによって組み合わせることができ、
また比較の結論はnotにより否定ができる。これらの優先順位は比較演算子よりも高い。

否定の場合の例

x = 10
if not x < 5:# x < 5でFALSEになってnotでTRUEになる
    print('xは5より小さくない。')

```
:::note info
優先順位は、比較演算子よりもand / or / not が低い。
:::

```python
Pythonインタプリタにて以下のように入力した場合の出力結果として正しいものを選びなさい。
>>> from math import pi
>>> [str(round(pi, i)) for i in range(0, 5)]

A,['3.0', '3.1', '3.14', '3.142', '3.1416']
```

```python
Pythonの変数に関する記述として正しいものを選択肢から選びなさい。

A,関数内で変数に代入を行うと、その値がローカル変数のシンボル表に記録される

```

```python
下のユーザー定義例外について正しいものを選びなさい。
class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)


A,このユーザー定義例外は、Exceptionクラスのデフォルトの__init__をオーバーライドしている。
```
【Rufo】commit時にRufoを実行する【Lefthook】


## gemのインストール
以下のコマンドを実行して`Lefthook`をインストールします。
```:ターミナル
$ gem install lefthook
```

## Lefthookの設定
Lefthookの設定をします。
`lefthook.yml`を作成し、以下のように記述します。
```lefthook.yml
pre-commit:
  parallel: true
  commands:
    rubocop:
      files: git diff --name-only --staged
      glob: "*.rb"
      run: rufo {files}
```

## 動作確認
以下のコマンドを実行し、正常に動作するか確認します。
```:ターミナル
＄ lefthook install && lefthook run pre-commit
```
Cloud Spanner の基本知識

初学者であるため、Spannerを理解するため基本的な知識を整理してみました。
ドキュメントに書いてあることを、ただ並べただけになりますmm


# Spanner とは何か?

> Cloud Spanner とは
https://cloud.google.com/blog/ja/topics/developers-practitioners/what-cloud-spanner

RDSでおなじみのER図で定義される構造と、NoSqlで扱うようなオブジェクトライクな構造のどちらも設計可能な点と、
NoSql等で語られるスケーラビリティをトランザクションやRDSの扱われ方においても発揮される点がユニークであると言っていますね。

# Spanner の構成要素

まずはこの図を理解するところを目指します。
![large_spanner.max-2200x2200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/271136c8-7d76-619e-40b5-6fec9938e659.png)



## Spannerの仕組み

### インスタンス構成とコンピューティング容量

- インスタンス構成とは、データベースの地理的な場所とレプリケーションの種類を定義する。
    - 単一リージョンの場合は、リージョンをどこにするかだけ考える必要がある。
- コンピューティング容量とは、サーバー（ノード）とストレージのリソース量を定義する。

#### ノード

- サーバーや処理単位(Processing Units, PU)とも呼ばれる。
- 読み取り・書き込み・commit トランザクションを処理する。
- ノードはストレージ対してデータの読み書きを行うが、ノード自身もデータを保持する。
- 1ノード = 1,000PU, 0.5ノード = 500PU
    - 1,000PU未満は100単位, 1,000PU以上なら1,000単位で調節可能
- あるノードはリージョン内の3つのアベイラビリティゾーンに複製される。（レプリケーション）

#### ストレージ

- データベースの容量のこと。
- PU数に基づいて決定される。
    - 1,000PU未満の場合は　100PU当たり 409.6GB
    - 1,000PU以上の場合は 1000PU当たり 4TB

#### リージョン

- データベースの物理的な場所を指定。
- 北米、南米、ヨーロッパ、アジア、オーストラリアが利用可能。
- リージョンではノードを3つのゾーンにレプリケーションしており、マルチリージョンか否かでレプリカの種類が変わる。
- 通常のリージョンの場合
    - 3つとも読み書きレプリカである。 

下図は、単一リージョンのインスタンス内部で、ノードとストレージが3つのアベイラビリティゾーンに複製されている様子を表しています。
![ss 2022-07-08 2.20.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/ae66c74a-956f-ef27-a65f-26fb2fa6b8c8.png)

## どのようにして高可用性とスケーラビリティを提供しているか？

#### レプリケーション

- ノードが3つのゾーンに複製され、それぞれはレプリカの種類によって振る舞いが異なる。
- 単一リージョンの場合
    - 3つのレプリカは読み書きレプリカとして扱われる。
    - 1つのレプリカがリーダーに選出され、書き込みトランザクションを主に扱う。
    - 残り2つのレプリカは基本的に読み取りを担当する。
    - もしリーダーが動作しなくなった場合、残りの2つからリーダーを選出し直す。(Paxos コンセンサスプロトコル)
- マルチリージョンは複雑なので割愛

#### スプリット

- Spannerのデータはテーブルの主キーでソートされていて、各ノードは一定範囲を担当領域として割り当てられている。
    - 例: 主キーがIDであれば 0~1000まではAノード, 1001~2000まではBノード
- その担当領域のことをスプリットという。
- 各スプリットは物理的場所が異なるため、スプリットをまたいだデータの読み書きはパフォーマンスが悪化する。
- データ数が増大し、担当しているノードの負荷がリソースの上限に近づくと、動的にスプリットを追加する。（つまり1ノードの割り当て領域を変化させ負担を減らす）
    - 例: Bノードの負荷が高い場合スプリットは 0~1000まではAノード, 1001~1500まではBノード, 1501~2000まではCノードという様にリバランシングされる。
- スプリットは親子関係（インターリーブ間）のデータ(連続した行の範囲)は保持されます。

下図は、あるテーブルが3つのゾーンにレプリケーションされており、またテーブルの主キーの範囲が複数スプリットされている様子を表しています。

![ss 2022-07-08 2.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/e873b114-1319-3d26-065d-a96eacc1a575.png)

こうやって整理してみると、意外とスッキリ理解できるかもしれません。
とりあえず、正規表現っぽいものを集めてみた


# 正規表現とは
文字列の検索パターンを表現するための記号

# 正規表現の文字
- リテラル :検索パターンで文字そのものを使う

- メタ文字 :特殊な記号で高度な検索ができる

・「.」 → 改行を除く任意の1文字
```:Sample
# メタ文字
# .at
bat cat hat jet
```

・「\」 → メタ文字のエスケープ記号
```:Sample
# エスケープ
# \.
This is a pen.
```

文字種を限定したい場合
・「\d」 → デジットの略、0-9の1文字
・「\D」 → 数字以外の文字
・「\w」 → ワードの略、a-z,A-Z,0-9,_の1文字
・「\W」 → アルファベット、アンダーバー、数字以外の文字
・「\s」 → スペース、タブ、改行など
・「\S」 → 全ての非空白文字
量指定子
・「{n}」 → n個
・「{min,max}」 → min以上、max以下
・「{min,}」 → min以上
・「?」 → {0,1} 0以上1文字以下の繰り返し
・「+」 → {1,} 1文字以上の繰り返し
・「*」 → {0,} 0文字以上の繰り返し
```:Sample
# 文字種限定・量指定子
# \d\d-\d\d\d\d-\d\d\d\d or \d{2}-\d{4}-\d{4}
# h\w\w\w\w\w\w or h\w{6}
seki, 03-3001-1256
hidaka, 03-3015-3222
hayashi, 03-3017-7889

# \d{2}-?\d{4}-?\d{4}
03-3001-1256
0330011256
# \w+\d{2}-?\d{4}-?\d{4}
# \w*\d{2}-?\d{4}-?\d{4}
TEL03-3001-1256
T0330011256

# 最長マッチ、最短マッチ
# ".+" or ".+?"
"apple", "apples", "pineapple"
```

アンカー(位置指定)
・「^」 → キャレット、行の先頭
・「$」 → ダラーマーク、行の末尾
・「\b」 → バウンダリーの略、単語の境界
```:Sample
# アンカー
# ^\d \d$
# \bseki\b
1 taguchi 6
2 fkoji 9
3 seki 8
4 sekiya 7
```

選択子
・「abc|123」 → abc or 123
```:Sample
# 選択子
# example\.(net|com)
example.net
example.com
```

文字クラス
・「[abc]」 → a,b,cのどれか1文字
```:Sample
# 文字クラス
# (b|c|h)at
# [bch]at
bat cat hat
```
文字クラス内で使えるメタ文字
・「^」 → 否定 ※[の直後に配置
・「-」 → 範囲 ※文字コード表の順番に注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185869/173d6c47-be38-5b5d-1baf-128918a3c975.png)
```:Sample
# 文字クラス 範囲
# [A-F]\d+
A1
Q31
N18
C5
E32
L4
```
文字クラス[]内のエスケープルール
・「^」「-」「]」「\」はエスケープが必要
・「^」は[の直後でなければ、リテラルとして扱われる
・「-」は前に文字がなければ、リテラルとして扱われる
```:Sample
#文字クラス エスケープ
# ^\d{2}[\^\-.]
# ^\d{2}[-.^]\d{4}[-.^]\d{4}$
03^3015^3222
03-3015-3222
03.3015.3222
```

改行とタブ
・「\t」 → タブ
・「\r\n」 → 改行（Windows）
・「\r」 → 改行（v9までのmacOS）
・「\n」 → 改行（Unix、v10以降のmacOS）
・「\r\n|\r|\n」 → 改行（すべて）
```:Sample
# 改行とタブ
# \n+
a
bb
cc

cc

```

キャプチャ
・「()」 → $1,$2,...
```:Sample
# キャプチャ
# (.+),\s?(.+)
dotinstall, https://dotinstall.com
google,https://google.com
example, https://example.com
<a href="https://dotinstall.com">dotinstall</a>
<a href="https://google.com">google</a>
<a href="https://example.com">example</a>
```

後方参照
・「\1,\2,...」
```:Sample
# 後方参照
# (\d),\s\1
3, 8, 5, 4, 4, 5, 4, 1, 1, 5, 3, 3
```
Gem「google_drive」を使ってスプレットシートを更新する（2022年7月版)

# 使用するGem
https://github.com/gimite/google-drive-ruby

これを利用します。How to Installにある通り、Gemfileに追加するなどしてインストールしてください。

ちなみに、Google純正のGemは[こちら](https://github.com/googleapis/google-api-ruby-client)。google_driveは純正GemのラッパーGemのようです。


# Google認証(2022年7月版)
認証の方法は[ここ](https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md)に記載がありますが、少し古くこの通りで二はできません。

特に、このOtherが2022年7月現在は消えており、使用することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/1509ac7f-ddbd-2495-8c27-a49a2f6d93c0.png)

## じゃあどうするか
サービスアカウントを作成して認証します。

### GoogleCloudPlatformにアクセス
[GCPコンソール](https://console.cloud.google.com/?hl=ja)を開いて、左上のハンバーガーメニューから「APIとサービス」>「認証情報」を選び、「認証情報を作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/680ff2e0-f9bc-12f7-0ebe-2935a1bf9a8b.png)

サービスアカウントを選択して下さい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/7176ed04-04e7-001c-8593-2f104de41586.png)


### サービスアカウントを作成
画像の通り入力し、完了をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/bdfaef23-271c-8d07-4a79-cda24840d1c0.png)

### スプレットシートを共有
メールアドレスが作成されるので、そのメールアドレスを共有対象にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/a58ee96d-ed06-107d-f576-4b1988943636.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/3a27dd68-64cb-b1e6-c35a-3417d1f470e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/45a047ba-1184-91cc-f0d1-1a8044a477e3.png)

### サービスアカウントのJSONを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/2d470ffb-256f-f293-6fb4-bad91a80c7fa.png)

タブ[キー]を開いて、鍵を追加を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/af9112c8-988a-912a-b88a-0cf5584610db.png)

JSONを選ぶと、自動でjsonファイルがダウンロードできます。

### Railsで使用する
JSONをRailsプロジェクト内に配置し、読み込ませます
```ruby
session = GoogleDrive::Session.from_service_account_key(
     "my-service-account-xxxxxxxxxxxx.json")
```

これで完成です。
人にタスクを振る際に心がける伝え方

# はじめに
　人からタスクを振られる時、そのタスクの内容が分かりやすい指示者とわかりにくい指示者がいる。もっとひどい指示者だと、こちらがわからないことすら認識できないような話し方をする人もいる。そういう人に限って、自分の話し方の下手さを棚にあげて、こちらを非難するのである。そんな時は「あなたは声に出したことが100%正確に伝わる話し方をしている自信があるの？」という言葉をグッと飲み込んで「じゃぁやり直しますね。」とタスクに戻る。そして数か月でその現場を去ることにしている。

　そんな半面教師から学んだ、人にタスクを振る際に心がけるべき話し方を、ここに残しておく。もちろんこれらは状況によっては正しい方法ではないかもしれないし、もっとよい方法があるかもしれない。あくまで私がフリーランスのエンジニアとして様々な現場に赴き、そこで経験したことを元に考えたものなので、参考程度に読んでもらえるとうれしい。

# 注意がこちらに向いているかを確認する
　複数の人に連絡事項を話す場合は、話し手からの物理的距離によっては「はい、みんな注目！」みたいな注意を引く言葉が聞こえていない場合がある。相手が仕事に集中していれば尚の事である。
話しを伝えたい人の顔がこちらを向いているかを確認し、向いていない場合は個別に声をかけて、自分の話を聞いてもらえる状況を作ることが必要。

# 箇条書きで話す
　私は常日頃から箇条書きは最強、と感じている。何をなすべきかが非常に明解なのだ。話す場合も箇条書きならぬ箇条話しをすると、相手のタスクが明確になる。

　まずはタスクの個数をを伝え、それを一つ一つ端的に話すのである。

~~~
(例)
今日は新着ニュース機能を作ってください。やることは3つ。
一つ目はスキーマの作成。
二つ目はプログラムの作成。
三つ目はパフォーマンスの確認。
じゃぁ詳しく説明しますね。......
~~~

# 相手の前提知識を考慮する
　相手の前提知識を考えながら話すようにしましょう。同じことを話しても、AさんとBさんでは持っている前提知識が異なるので、吸収できる量が違います。これは年齢や性別などは関係ありません。その人固有の知識量を考慮する必要があります。

　例えば、Aさんはベテランエンジニアだからこのくらいは知っているだろうと思って説明を端折ったりしてはいけない。一口にベテランエンジニアといってもいろいろなタイプがあり、広く浅くやってきた人、狭く深くやってきた人、一部深く一部浅い人など様々だ。

　マネージメントする立場にある人は、チームメンバーの"人となり"に興味を持ち、その人を知り、その人にカスタマイズされた伝え方をすることがより良い伝達を生む。もちろん最近ではテレワークによって、面と向かって雑談する機会も少なくなってきているので、できる限りで構わないと思っている。

:::note warn
個人的には、他人に興味のない人間はマネージメントはできないと考えている。
俗に言われる「ダメ上司」は、メンバーに興味がないからダメなのだと思う。
:::

# 「じゃぁそんな感じで」はNG
　ミーティングをしていると時々、いやわりと頻繁に、一部の人間のみで会話が始まる瞬間がある。彼らは役職的に上級だったり、技術的に上級だったり、とにかく一般の参加者が持っていない情報を持っており、それを元に話を進めることがある。そして最後には「じゃぁそんな感じで」で締めくくる。これは危険極まりない。

　中には話を聞いていないほうが悪い、と思う方もいるだろうが、ミーティングの目的はあくまで物事の決定や、事柄の周知である。責任の所在を明確にすることではない。どんな感じなのか、改めてきちっと言葉で説明するべきである。

# 最後にまとめる
　一通り話し終わったら、最後に箇条書きでまとめるとよい。話を聞いているうちに、最初のほうに言われたことなどすっ飛んでいることがまあまあよくある。そんな記憶を呼び戻してもらうために、最後に話をまとめるのである。その際は箇条書きを使うとなお良い。

# 「わからなかったら聞いて」に頼らない
　少々言葉が悪いが、無能なマネージャーほど手を抜いた説明をした後、「わからなかったら聞いて」と言う。「わからなかったら聞いて」自体は必要なセンテンスではあるが、手抜き説明をしていい免罪符にはなりえない。

　きちっとした説明をしなければ、わからないことを認識できていない、という状況を生み出すことになる。わからないことを認識しているならば、質問してくれるのでまだよいが、わからないことが認識できていないという状況は最悪である。やり直しがきかないところまで行ってしまってから気が付くケースを、私は様々な現場で見てきた。

そういった状況は、話しを伝える側が気を付けることで、ある程度防ぐことが可能であるということは、心に留めておいたほうがよいだろう。
【UWSC】自動戦闘用スクリプト

# きっかけ
積んでたFF13-2（Steam版）で戦闘が自動化されすぎててクリックするだけというお手軽さから寝落ちが多発したためです。
レベル上げてできるかぎり戦闘時間を少なくして寝落ちを防ぐことが目的でした。

# 必要な環境
UWSCが動作する環境。

## スクリプト内容
Aキーを押しっぱなしにすることで円を描くように動かします。
そうすることでエンカウントさせます。
またクリックを200msごとに実行するようにします。
クリックボタンが攻撃という前提になります。
上記の内容をずっと回すようになります。
ENDキーを押下することでスクリプトが停止するようにさせています。

## 自動戦闘用スクリプト（UWSC）

以下がソースコードになります。
以下を保存して読み込ませれば動作するはずです。

```
// ID取得
DIM EXEGETID=GETID("FINAL FANTASY XIII-2","SQEX.CDev.")

// ウィンドウアクティブ
ACW(EXEGETID,0,0,1680,1050,0)
// アクティブ待ち
SLEEP(5)

// 対象IDのウィンドウサイズ取得
DIM EXEWIDTH=STATUS(EXEGETID, ST_WIDTH)
DIM EXEHEIGHT=STATUS(EXEGETID, ST_HEIGHT)

// Aキー押しっぱなし
KBD(VK_A,DOWN)

WHILE TRUE
	// 左クリック（画面真ん中あたり）
	BTN(LEFT,CLICK,EXEWIDTH/2,EXEHEIGHT/2)
	// 200ms待つ
	SLEEP(0.200)
	
	// ENDキーがクリックされていたら抜ける
	IFB GETKEYSTATE(VK_END) THEN
		BREAK
	ENDIF
WEND

// Aキーはなす
KBD(VK_A,UP)

```

GETIDやACW関数部分は、UWSCの記憶機能で一度対象ゲーム選択したのをそのまま使っています。
その部分を変更すれば他のゲームにも使用できると思います。

# 参考サイト
[UWSC辞典](https://uwsc.jp/)
[ループから抜けたいときはBREAK](https://uwsc.36nyan.com/break-%E3%83%AB%E3%83%BC%E3%83%97%E3%81%8B%E3%82%89%E6%8A%9C%E3%81%91%E3%81%9F%E3%81%84/)
GitLab SSHの設定


:::note info
ubuntu環境でGitLab
SSHを設定する方法を記載します。
:::


### ①ホームディレクトリに「.ssh」作成
```shell
$ cd ~
$ mkdir .ssh
$ cd ~/.ssh
```
### ②キー作成
```shell
$ ssh-keygen -t rsa -C "xxxxxxxx@example.com"
```
※入力を求められても、入力なしでenterでOK

### ③確認
```shell
$ ssh -T git@gitlab.com
Welcome to GitLab, @name!
```
G検定体験記（2022/7/18追記 G検定合格体験記）

初めまして。
本記事では2022年7月2日に実施されたG検定の体験記をまとめます。
※記事執筆時点で合否判定が不明のため、体験記としています。

なお、G検定の概要についてはこちらの方が詳しいため割愛します。
https://www.jdla.org/certificate/general/

## 本記事の流れ
| 項目 |
|:-------------|
| [1. 受験の動機、経緯](https://qiita.com/matsu04works/items/bc15c9186b6696043943#1%E5%8F%97%E9%A8%93%E3%81%AE%E5%8B%95%E6%A9%9F%E7%B5%8C%E7%B7%AF) |
| [2. 受験勉強、時間](https://qiita.com/matsu04works/items/bc15c9186b6696043943#2%E5%8F%97%E9%A8%93%E5%8B%89%E5%BC%B7%E6%99%82%E9%96%93) |
| [3. 試験形式、時間、問題数、難易度](https://qiita.com/matsu04works/items/bc15c9186b6696043943#3%E8%A9%A6%E9%A8%93%E5%BD%A2%E5%BC%8F%E6%99%82%E9%96%93%E5%95%8F%E9%A1%8C%E6%95%B0%E9%9B%A3%E6%98%93%E5%BA%A6) |
| [4. その他アドバイス、所感など](https://qiita.com/matsu04works/items/bc15c9186b6696043943#4%E3%81%9D%E3%81%AE%E4%BB%96%E3%82%A2%E3%83%89%E3%83%90%E3%82%A4%E3%82%B9%E6%89%80%E6%84%9F%E3%81%AA%E3%81%A9) |

## 1.受験の動機、経緯
・AI領域に興味があった。
・2022年6月1日からデータを扱う業務ができる会社に転職した。
キーワードはBI/データサイエンス/データエンジニアリングなど
・資格取得で奨励金が出る

## 2.受験勉強、時間
受験勉強は「ディープラーニング G検定公式テキスト」を3周程度読み込みました。
大体合計で20時間程度かけたと思います。

G検定公式テキストの章立ては
```
第1章 人工知能（AI）とは
第2章 人工知能をめぐる動向
第3章 人工知能分野の問題
第4章 機械学習の具体的手法（テキスト誤字してましたw）
第5章 ディープラーニングの概要
第6章 ディープラーニングの手法
第7章 ディープラーニングの研究分野
第8章 ディープラーニングの応用に向けて（１）産業への応用
第9章 ディープラーニングの応用に向けて（１）法律・倫理・現行の議論
```
となっているため、JDLAが定めているシラバスは基本的に網羅されています。

## 3.試験形式、時間、問題数、難易度
試験形式はブラウザを利用したオンライン形式です。
（試験官はいません。カメラ利用もありません。試験開始ボタン押下時に立ち上がるブラウザ上で回答を入力していくのみです。）

時間は120分で、問題数は191問でした。
そのため、平均して1問当たり40秒程度で回答する事が求められます。

難易度は個人的な感覚ですが、基本情報と同じくらいの難しさでした。

## 4.その他アドバイス、所感など
問題集も買って解く方が良いと思います。

2.受験勉強、時間で記載した通り、
今回使用したのは教材1つ、しかも問題集ではなくテキストだったため、
想定問題への慣れがあまりなかったかなと振り返っています。
また、テキストが若干古く最新動向を追うことができていなかったため、実際の試験中に悩まされました。

これは所感ですが、G検定は試験形式にもある通り、
誰か、もしくは何かに監視されているわけではないので調べようと思えば調べることが可能です。
ただし問題数が多いので全部調べると確実に時間が不足するかなと思います。
それでええんか？という思いはありつつもある程度テキストを読み込む時間が取れれば暗記部分も多いので人によってはなんとかなるかなという感じです。


## 20220718_追記
G検定合格しました。

試験実施：2022年7月2日
合格通知：2022年7月15日
合格証発送予定：2022年8月1日〜8月15日（PDF形式）

です。

併せてJDLA運営のSlack招待受領と合格ロゴの利用が可能になりました！！