OmniAICreator/Qiita-1.07M huggingface dataset:
Salesforceについての学習

こんにちはnishioです。Salesforceのデータ分析や営業に関する情報を管理する機能があると知り、そんな便利な機能があるんだと思い興味を持ったので自分なりにまとめてみました。

# Salesforceとは
* セールスフォース・ドットコム社が提供するSaaS型のクラウドサービスである。
    * SaaS型とは、Software as a Serviceの略でインターネット経由でソフトウェアを利用することができるサービス。
    * 例：Zoom、Skype、Google Meet、Slack等。
* CRMやSFAなどの機能を利用することができる。
    * CRM(Customer Relationship Management)
        * 顧客データベースの管理機能で、顧客の年齢や購入履歴、趣味嗜好などの情報を分析し、効果的にマーケティング活動するためのツール。
        * 顧客の満足度を上げることにより、リピーターを獲得することを目指すことが可能。
        * 顧客との関係構築に特化している。
    * SFA(Sales Force Automation)
        * 営業支援システムと呼ばれる。営業活動の現状を把握することができる。
        * 顧客にどういうアプローチをしたか、顧客に対してどういうアクションをしているか、いつ契約が締結できそうか等の情報を管理する。
        * 一元に管理することで、担当者が異動・退職した際に、引継ぎがスムーズに行うことが可能。
        * 営業活動の情報を共有しているため、新人に営業のノウハウを教えることが容易になる。
        * 営業担当者の営業活動管理に特化している。
* 独自でアプリケーションを作ることが可能。
    * Apex
       * Javaに似たスクリプト言語で、請求書の内容を自動でPDF化したい時等、ロジックを作ることが可能。
    * Visualforce
       * 画面を開発することができるフレームワーク。
       * HTMLに似たタグベースのマークアップ言語やデータ操作できる「標準コントローラ」などが用意されている。

# メリット
* 営業活動内容を一元で管理できるので、誰が今何をやっているか、現状を把握しやすい。
* 営業活動の情報を元に、新人に教育がしやすい。
* 顧客情報を管理することで、顧客に合ったサービスを提供しやすくなり、サービスの質を上げることに繋がりやすい。

# デメリット
* システムに馴染めない可能性がある。
* データを都度入力しないといけないので、スタッフが毎回入力してくれるとは限らない。
* 直ぐに利益が上がるわけでは無いので、費用対効果
が得られない可能性がある。

# 感想
営業活動の情報を入力し、共有する事で、チームで現状を把握しやすく、データ分析により顧客に合うサービスを提供しやすく、顧客満足度が上がりやすい。
一方でシステムに馴染めない、費用対効果が得られるとは限らない等欠点もあることを知りました。
費用対効果については、やって見なければ分からない
所があるかと思うので何とも言えませんが、システムの扱い方について、慣れておいて損は無いと感じました。Trailheadで学習が行えるので、こちらを進めてもっと知りたいという意欲が湧きました。
コマンド出力のリダイレクトとパイプについて

# この記事の内容
- リダイレクトについて
- `echo`コマンドについて
- `|`(パイプ)について

# リダイレクトとは？
　リダイレクトとは、一般的には、強制的にwebページに飛ぶことを指すことをいう。例でいうと、ページのURLを変えたときや、ドメイン名の変更の際に使われる。

　今回Linuxで使われるリダイレクトとは、標準出力や標準入力、標準エラー出力その「向かう先を変更する」ことを意味している。言葉だけではわかりづらいので、実例を交えながら説明していきます。

# echoコマンド
　標準出力の代表的なコマンドに`echo`コマンドがあります。`echo`コマンドは、1.入力したコマンドを画面に出力、2.指定ファイルに出力、3.指定ファイルに追記ができます。
### 1.入力したコマンドを画面に出力
```
$ echo hoge
    hoge  # 結果
```
### 2.指定ファイルに出力
```
$ echo hogehoge > fuga.txt
$ cat fuga.txt
  hogehoge # 標準出力がfuga.txtに出力された
```
### 3.指定ファイルに追記
```
$ echo envader >> fuga.txt
$ cat fuga.txt
    hogehoge
    envader # fuga.txtに新たな標準出力が追記された
```

このうち2.指定ファイルに出力、3.指定ファイルに追記の2つがリダイレクトにあたる。
| 記号| 説明 |
|:-:|:-:|
| > | 標準出力をファイルに出力 |
| >> | 標準出力をファイルに追記 |

参考：https://envader.plus/course/1/scenario/1006

# 応用 パイプ「 | 」について
　リダイレクトの情報としてもう1つパイプ` | `というものがあります。` | `は、コマンドの標準出力を別のコマンドにつないでパイプラインを構成する便利な制御演算子です。複数のコマンドを1行にまとめることができ、とても便利なものなので、覚えていきましょう！
```
$ コマンド１ | コマンド2
```
# 実用例
```
$ ps aux | grep nginx
root      1037  0.0  0.1 141124  1488 ?        Ss    2021   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  1041  0.0  0.2 143944  2808 ?        S     2021   0:11 nginx: worker process
prostudy  5347  0.0  0.1  15888  1076 pts/3    S+   21:06   0:00 grep --color=auto nginx
```
　`ps`コマンドでOS内で動いているプロセスの中から、`grep`コマンドで`nginx`と書かれた文字を検索をしています。このように`|`（パイプ）は、２つのコマンドの橋渡しの役割を与えています。

また、` | `を複数使うには、


```
$ コマンド1 | コマンド2 | コマンド3 | コマンド4 
```
のように使うことができます。




# 終わりに
　今回は、リダイレクトに使われる`echo` コマンドと`|`（パイプ）ついて学びました。標準出力に使う`echo`コマンドやコマンドを２つ以上使うときに必要な`|`（パイプ）は、使う機会が多いです。忘れずに、復習しておこう！

　また、今回学んだ`echo`コマンドや`|`（パイプ）は、[progateの環境構築版Envader](https://envader.plus/)という学習サイトで学ぶことができます。上記Linuxコマンド以外にも、様々な環境構築を手を動かしながら学ぶことができるので皆さんの学習にぜひ役立ててみてください。
# 参考資料
https://envader.plus/
https://envader.plus/courses
https://envader.plus/course/1/scenario/1006
https://eng-entrance.com/linux-redirect
シェルスクリプトで関数から文字列を返すような機能を模倣する

シェルスクリプトで、関数の返り値を`return`で返す場合、文字列を返すとエラーになる

```sh:test.sh
#!/bin/bash
function GET_COMMAND(){
    ARG1=${1}
    str="command_${ARG1}"
    return ${str}
}

CMD=`GET_COMMAND 1`
echo ${CMD}
CMD=`GET_COMMAND 2`
echo ${CMD}
```

```
$ bash test.sh
test.sh: line 6: return: command_1: numeric argument required
test.sh: line 6: return: command_2: numeric argument required
```

~~関数の返り値を`echo`で返すと返せる（これで良いのか？という疑問は残る。。)~~

> コメント欄のご指摘を受けて表現を取り消しました。誤解を招くような記載ですみません。
>「他のプログラミング言語での return のような機能を模倣するために、`関数名` や $(関数名) によるコマンド置換 ( 出力のキャプチャ ) を利用する」

以下のようにすることで、returnで文字列を返すような機能を模倣する。

```sh:test.sh
#!/bin/bash                                                                     
function GET_COMMAND(){
    ARG1=${1}
    str="command_${ARG1}"
    echo ${str}
}

CMD=`GET_COMMAND 1`
echo ${CMD}
CMD=`GET_COMMAND 2`
echo ${CMD}
```

```
$ bash test.sh
command_1
command_2
```

ファイルを分けたければ、別ファイル(例えば、`common.sh`)に記述して`source`等で読み込んでおくと良い。

> https://atmarkit.itmedia.co.jp/ait/articles/1712/21/news015.html

```sh:common.sh
#!/bin/bash

function GET_COMMAND(){
    ARG1=${1}
    str="command_${ARG1}"
    echo ${str}
}
```

```sh:test.sh
#!/bin/bash                                                                     

source common.sh      # common.shを呼び出す

CMD=`GET_COMMAND 1`
echo ${CMD}
CMD=`GET_COMMAND 2`
echo ${CMD}
```

```
$ bash test.sh
command_1
command_2
```

以上

# 参考

https://www.d-wood.com/blog/2014/09/24_6873.html

https://atmarkit.itmedia.co.jp/ait/articles/1712/21/news015.html
ルート権限の使い方(sudo)

# ルート権限とは？
　ルート権限とは、管理者権限のことです。もう少し詳しく表すと、一般的なユーザーが扱えないようなシステムの操作（実行・更新・削除）ができる権限のことです。
# なぜ管理者権限が必要なのか？
　rootユーザーは、なんでも出来てしまうため、すべてのユーザーに与えてしまうとサーバーを破壊してしまったり、思わぬ事故を引き落としてしまったり、セキュリティ面において良くありません。そのため、一時的に管理者権限が与えられる`sudo` を使うことが良いとされている。/etc/sudoersファイルに内容が記載されている。
#  使い方
```
$ sudo [オプション] コマンド
```
# オプション例
| オプション | 説明 |
|:-:|:-:|
| -A  |  パスワードが要求される場合、ユーザーのターミナルからパスワードを読み取り、標準出力する |
| -n  | パスワードを要求するプロンプトを表示しない（パスワードが必要なコマンドはエラーとなり、実行を終了する  |
| -S  | 端末を使わず、プロンプトを標準エラーに書き出し、パスワードを標準出力から読み込む（パスワードの末尾には改行が必要）  |
| -b  |　指定したコマンドをバックグラウンドで実行する　|
| -l  | 起動ユーザーに対し許可（および禁止）されたコマンドの一覧を表示する  |
| -u  | userを設定（user名またはuser ID [#を前につけた数値] )して、コマンドを実行する  |
| -g  | groupを設定（group名またはgroup ID [#を前につけた数値] )して、コマンドを実行する  |
| -k  | 保存されている認証情報を無効にする（次回のsudo実行時にはパスワードが必要）  |
| -K  | 保存されている認証情報を完全に消去する  |
| -v  | 保存されている認証情報を更新する  |

引用:https://envader.plus/course/1/scenario/1004/

# 実用例
#### パッケージのインストール
```
$ sudo apt install パッケージ名
```
#### パッケージを更新する
```
$ sudo apt upgrade パッケージ名
```

　初心者も私は上記二つを多く使うことが特に多い印象です。また、root権限をもった人しか実行できないファイルなどが存在します。`ls -l`コマンドで確認することができます。下の`1`の位置がroot権限の人が実行できるファイルです。
```
$ ls -l
　1  2  3
-rw-r--r-- 1 root root   11 Dec 23 13:11 a.txt
-rw-r--r-- 1 root root   36 Dec 23 13:12 b.txt
-rw-r--r-- 1 root root    0 Dec 23 13:07 c.txt
drwxr-xr-x 2 root root 4096 Dec 23 13:14 test
drwxr-xr-x 2 root root 4096 Dec 23 13:15 test2
```
# 終わりに
　今回は、root権限である`sudo` について学びました。セキュリティ面で多用できないroot権限を一時的に使えるようにする`sudo`コマンドは、使う機会が多いです。忘れずに、覚えておこう！

　また、今回学んだ`sudo`コマンドは、[環境構築学習サイトEnvader](https://envader.plus/)という学習サイトで学ぶことができます。`sudo`コマンド以外にも、他のLinuxコマンドを能動的に学ぶことができるので皆さんの学習にぜひ役立ててみてください。
# 参考資料

Envader: https://envader.plus/
https://envader.plus/courses
https://envader.plus/course/1/scenario/1004/
https://qiita.com/chihiro/items/6e1404c41e1236a9efe1/
【JavaScript関数ドリル】Lodash関数の実装【勉強用】_.head関数  


# 【JavaScript関数ドリル】初級編の_.head関数の実装のアウトプット

       
```javascript:_.head関数の挙動
_.head([1, 2, 3]);
// => 1
 
_.head([]);
// => undefined
```
配列の先頭を返し、配列がなければ`undefind`となる。
## _.head関数の課題内容
https://youtu.be/z6UapegPWjo

## _.head関数に取り組む前の状態
- `i = 0`とし、`return array[i];`とすればよさそう

## _.head関数に取り組んだ後の状態
- 変数に０を代入する必要がないことに書きながら気づいた
- 別問題として、ターミナル上でnode.jsを用いて実行する際に同じディレクトリにないjsファイルを実行するためのパスの書き方を理解していないので、一度`cd`を実行しルートから辿っていくという方法しか出来なかった
- 今後は「`.`」、「`/`」の用法を正しく理解して、どこからでも任意のファイルを実行できるようにしたい


## _.head関数の実装コード

```javascript:
const head = (array) => {
    return array[0];
}

console.log(head([1, 2, 3]));
// => 1

console.log(head([]));
// => undefined
```



## _.head関数の解答コード

```javascript:
function head(array) {
  return array[0];
}

console.log( head([1, 2, 3]) );
// => 1

console.log( head([]) );
// => undefined
```
Python windowsのcmd、powershellでctrl cでスレッド、プロセスが止まらない時の対処法

# 結論

メインスレッド以外をデーモン化する

# スレッドのデーモン化とは

デーモンスレッドは他の非デーモンスレッドが終了と同時に強制的に終了するスレッドのこと

また、子スレッドは親スレッドのデーモンの値を継承する
つまり、デーモンスレッドによって開かれた子スレッドは引き続きデーモンスレッド

# やり方

以下、極端な例。デーモンスレッド、非デーモンスレッドの順にスレッドを実行させればよい

```python
import threading
from multiprocessing import Process
import time


def task(num: int):
    while True:
        time.sleep(1)
        print(f'task{num}')


def main():
    """ctrl c を受け取るためのスレッド"""
    while True:
        try:
            # スリープ入れないとcpuコアがフル稼働するので注意
            time.sleep(24 * 60 * 60 * 1000)
            
        except KeyboardInterrupt:
            break


def sub():
    threads = []
    # マルチプロセスも同様にして対処可能
    # procs = []
    for i in range(5):
        th = threading.Thread(target=task, args=(i,), daemon=True)
        # proc = Process(target=task, args=(i,), daemon=True)
        # proc.start()
        # procs.append(proc)
        th.start()
        threads.append(th)


sub()
main()
```
【パブリッシャー】レポートの出力形式を変えてみる

この記事では、レポートの出力形式の変更を試みてみます。
 **[Sharperlight](https://sharperlight.jp/)パブリッシャー**を起動して [【パブリッシャー】レポートを公開してみる](https://qiita.com/Miki_Yokohata/items/4f258ea89ee2903a0531)で作成したレポート定義を開きます。
[オプション]タブに移動します。
[既定の出力形式]ドロップダウンから **Table Grid**を選択します。[OK]ボタンで保存しましょう。
![2022-03-06 Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/42bedfa0-e7bf-4eae-b73b-3a86da4dde1f.png)
 **パブリッシャー**に戻ったら、変更したレポートを選択し右クリックメニューから **レポートの表示**を選択します。
![2022-03-06 Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c48771af-9ba2-6de0-5d51-f82431efd9f2.png)
レポートがブラウザで表示されたら売上日フィルターに開始日と終了日を指定して、[送信]ボタンを押します。
初期設定である **Table**形式とは異なる **TableGrid**形式で表示されます。
![2022-03-06 Figure 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/82ff8dee-e844-91c8-4634-1f9beadcbd0b.png)
:flag_jp:[Sharperlight](https://sharperlight.jp/)
how to get github discussions categoryId

>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/194ec450-f840-dc87-40fe-bda63532291f.png)


```shell
gh api graphql -f query='
{
  # https://github.com/github/docs

  repository(owner: "github", name: "docs") {
    id # RepositoryID
    name
    discussionCategories(first: 10) {
      nodes {
        id # CategoryID
        name
      }
    }
  }
}'
```

**Result**:

```json
{
  "data": {
    "repository": {
      "id": "MDEwOlJlcG9zaXRvcnkxODk2MjE2MDc=",
      "name": "docs",
      "discussionCategories": {
        "nodes": [{
            "id": "MDE4OkRpc2N1c3Npb25DYXRlZ29yeTI1MDUzMjQ3",
            "name": "General"
          },
          {
            "id": "MDE4OkRpc2N1c3Npb25DYXRlZ29yeTI1MDUzMjUw",
            "name": "Ideas"
          },
          {
            "id": "MDE4OkRpc2N1c3Npb25DYXRlZ29yeTI1MDUzMjQ5",
            "name": "Q&A"
          },
          {
            "id": "MDE4OkRpc2N1c3Npb25DYXRlZ29yeTI1MDUzMjUx",
            "name": "Show and tell"
          }
        ]
      }
    }
  }
}
```

---

Ref:

https://github.com/github/feedback/discussions/43#discussioncomment-433963

https://docs.github.com/en/graphql/overview/explorer

https://cli.github.com/manual/gh_api
【AWS学習】コンテナ技術（ECS/ECR/EKS）


# はじめに
AWS認定ソリューションアーキテクトアソシエイトを取得する際に学習した内容をアウトプットします。
本記事はコンテナ技術についてです。

## ハイパーバイザー型とコンテナ型の違い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/3382be94-a0b6-0d93-df20-29a5826de505.png)

コンテナは仮想化技術の１つ
コンテナ仮想化技術のデファクトスタンダードとなっているのがDocker
コンテナは従来のハイパーバイザー型仮想化技術に比べて以下のような利点がある

- ハードウェアリソースの消費が少ない
    - 起動が速い
    - 同じハードウェアリソースでより多くのコンテナを同時に動かすことができる


- 開発の効率化
    - アプリの実行に必要な構成や依存関係をコンテナにひとまとめにしておくことができるのでOSを含めた環境構築の工数が大幅に削減できる
    - 開発環境から本番環境まで同一の環境（コンテナ）でアプリケーションを動作させることができる

## AWSのコンテナサービス構成要素

主に以下３つの構成要素からなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/7ecebc28-f394-1b86-8c0d-640b01d1005d.png)


- **データプレーン**
    - コンテナが稼働するための実行環境。コンテナを起動するためのホストマシンとしてEC2やFargateを稼働させることが可能。
- **コントロールプレーン**
    - コンテナの管理を行うもの。コンテナをどのデータプレーンのホストで稼働させるかの管理やコンテナの死活監視を担当する。
- **レジストリ**
    - コンテナの起動元となるイメージが格納されている置き場所。（上図左のECRが該当）

## 各コンテナサービス郡の詳細

### ■ データプレーン

#### EC2
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/fca8b21b-cfd9-b391-c258-14cb0356c62b.png)

- EC2インスタンス上でコンテナを動かす方式。
- コンテナに加え、「コンテナの実行環境となるホストマシン」の両方を管理・運用しなければならない。
- リソースが不足した場合はEC2インスタンスのスケールアップ・スケールアウトで対応。


#### Fargate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/3f0a3e90-f718-106c-f208-d4332cefa136.png)

- AWS 側がインスタンスを管理してくれる方式。
- コンテナを実行するためのホストマシンはAWSが面倒を見てくれるので利用者側でホストマシンの管理・運用が不要となる。
- コンテナを実行するホストマシンのリソースは気にせず、コンテナ実行時に必要な CPUとメモリの組み合わせを選択するだけでOK。

### ■ コントロールプレーン

#### Amazon Elastic Container Service（ECS）

- AWS 独自のコンテナオーケストレーションサービス。
- データプレーンとしてEC2とFargateを利用できる。

### Amazon Elastic Container Service for Kubernetes（EKS）

- オープンソースのKubernetesを実行するサービス。
- ~~データプレーンとしてEC2のみサポート~~2019年12月より、EC2に加えFargateと組み合わせることができるようになった。


:::note info
**コンテナオーケストレーション**

コンテナは手軽に開発・実行環境を構築できるメリットがある半面、管理対象のコンテナの数が増えると運用・管理が複雑で手間がかかるという課題がある。

また、サービスの信頼性／可用性の観点で考えると、単一のホストマシンのみで複数台のコンテナを動かすことは望ましくない。複数のホストマシンにまたがってコンテナを稼働させることが必要だが、複数のコンテナ／ホストマシンを１台１台管理するは大変。

この問題を解決するのが「コンテナオーケストレーションサービス」。コンテナのデプロイや負荷に応じたスケーリング、障害検知・自動復旧等、コンテナに関わる運用や操作の自動化および一元管理が可能。
:::

### ■ レジストリ

### Amazon Elastic Container Registory（ECR）

- Dockerコンテナイメージの保存・管理・デプロイができる。
- VPC内のプライベートなDockerレジストリ。

# ECS と EKS の使い分けについて

- **ECS** （学習コストが低い反面、自由度はEKSに劣る）
    - コンテナが稼働するホストマシンのメンテナンス負荷を下げたい場合
        - ホストマシンのバージョンアップ対応等が不要
    - 複雑度が低いアーキテクチャの場合
    - AWS中心の設計にする場合

- **EKS**（自由度が高い反面、ECSに比べて学習コスト/メンテナンスコストがかかる）
    - 既存システムでKubernetesを利用しており、AWSに移行する場合
    - Kubernetesへの深い知見がある場合
    - 複雑度が高いアーキテクチャ/比較的大規模で拡張性が求められるサービス構成の場合
    - AWSのベンダーロックインの回避したい場合

# ※参考記事
https://aws.amazon.com/jp/blogs/news/jp-docker-on-aws-container-service-selection-example/
「つくってマスターPython」で勉強日記#2

【出典】[つくってマスターPython](https://www.amazon.co.jp/%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BCPython-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%BBWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%83%BB%E6%96%87%E6%9B%B8%E5%87%A6%E7%90%86%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4297110342)
[前回の続きです](https://qiita.com/kato_squalldeka/items/9bf491cbb13114df0734)

# chapter4 文書を処理する

# 4-1 正規表現
正規表現は文字列をある決まったルールによるパターンとして定義し、それを基に検索や置換を行うもので、pythonではreという標準ライブラリがあります。

**正規表現で置換**


```python:正規表現で置換

import re #正規表現を使うためにインポート

#''''と'''で複数行に渡る文字列を埋める
s = '''One Little, two little, three little Indians, Four little, five LITTLE, six liTTle, Seven Little, eight little, nine LittLe, Ten　Little Indian boys'''

#正規表現で置換
result = re.sub('little', 'BIG', s, flags=re.IGNORECASE)
print(result)
```


表4-1 subの引数と使い方の例引数

|引数名|実際の引数|説明|
|-|-|-|
|パターン(検索文字列)|'little'|検索するパターン|
|置換する文字列|'BIG'|置換する文字列。パターンに当てはまったものが置換される|
|置換される文字列|s|処理の対象となる(検索される対象となる)文字列。ここでは上述の内容が代入される|
|フラグ(オプション)|re.IGNORECASE|オプションの設定。IGNORECASEは、大文字小文字を無視するオプション|


```python:文字列から金額を取り出し計算する
import re

data = '''
40インチ TV 98000円
ノートPC　113000円
スマホ 58700円
スマホ　58700円

タブレット 49500円
'''

result = re.sub(r'(\d+)円', r'\\1-', data)
print(result)

res = re.findall(r'(\d+)円', data) #｢r'(\d+)円'｣：\dは半角の数字を表す。+をつけることで、1つ以上続いた状態を示す

total = 0

for item in res:
    print(item)
    total += int(item)
    
print('total' + str(total) + '円')

result = re.sub(r'(\d+)円', r'\ \1-', data) #置換による表現変更。\ \の間にスペースがいる
print(result)


import re

data = '''
40インチ TV 98000円
ノートPC　113000円
スマホ 58700円
スマホ　58700円

タブレット 49500円
'''

result = re.sub(r'(\d+)円', r'\ \1-', data)
print(result)

```

```python:電話番号とメールアドレスを調べる
import re

data ='''
太郎 090-(999)-999 taro@yamada.san
花子 080-(888)-888 hanako@flower.shop

'''

result = re.findall(r'(\S+)\s+([\()\d-]+)\s+([\w.-_]+@[\w.-_]+)', data)

print('※名前')

for item in result:
    print(item[0])
    
print('\n※電話番号')

for item in result:
    print(item[1])
    
print('\n※メールアドレス')
for item in result:
    print(item[2])
```
```python:HTMLからリンクを取り出す
import re

data = '''
<html><head></head>
<body>
<a href="http://www.google.co.jp/">Google</a>
<a href="https://www.google.com/webhp?tab=ww&hl=ja">Google</a>
<img src = "https://www.python.org/static/img/python-logo@2x.png">
</body>
</html>
'''

result = re.findall(r'(https?://)([\w \- \._]+)(/?)([\w\?/:%#\$&~\.=+\-@]*)',data)
"""
(https?://)・・・httpまたはhttpsを示す
([\w \- \._]+)・・・その後に続くドメイン部分
(/?)・・・/があればそこで区切って取り出す
([\w\?/:%#\$&~\.=+\-@]*)・・・/記号以降の部分を取り出す。
"""

print('※ドメイン')
for item in result:
    print(item[1])
    
print('\n※フルアドレス')
for item in result:
    print(''.join(item))

```

当初、頭から順を追って進めていこうかと思ったのですが、プログラムを完成させることを優先していきたいと思うので、次回以降スクレイピングのコードを書いていこうと思います。

都度、詰まった際に必要な情報を読み返しながらまとめていこうと思います。

本日は、以上です。ありがとうございました。
jest.mock + prototypeでDynamoDBをMock化した

# そもそもやりたかったこと
SQSから受け取ったメッセージを lambdaで加工し、
その情報を使ってDynamoDBからItemをGet、指定のURLへItemの内容をaxiosを使ってPostする仕組みを作っていました。

テストコードを記述するにあたり DynamoDB.DocumentClient.get部分をMock化したいと思いました。
ググると[aws-sdk-mock](https://www.npmjs.com/package/aws-sdk-mock) とか、[aws-sdk-client-mock](https://www.npmjs.com/package/aws-sdk-client-mock)とか情報が出てくるのですがうまくMock化できず詰まりました。
aws-sdk-client-mockはそもそも使っているAWS SDKがv2だったので使えなそうと思い断念。

最終的に jest.mock + JavaScriptのprototypeの組み合わせでうまく行ったので、備忘のため記述します。

# 環境
lambda: typescript(4.1.3) 
テストFW: jest(27.4.7)
aws-sdk: 2.1070.0

# mock化したいサンプルコード
```　sample.ts
import * as AWS from 'aws-sdk';
import { AWSError } from 'aws-sdk';
import { DocumentClient } from 'aws-sdk/clients/dynamodb';
import { PromiseResult } from 'aws-sdk/lib/request';

export const documentClientConfig: AWS.DynamoDB.Types.ClientConfiguration = {
  apiVersion: '2012-08-10',
};
export class DDB {
  public static async findById(id: string): Promise<PromiseResult<DocumentClient.GetItemOutput, AWSError>> {
    const condition: DocumentClient.GetItemInput = {
      TableName: 'table_name',
      Key: {
        ID: id,
      },
    };
    const documentClient: DocumentClient = new AWS.DynamoDB.DocumentClient(documentClientConfig);
    return documentClient.get(condition).promise();
  }
}
```

# テストコード
``` sample.test.ts
import AWS from 'aws-sdk';
import { Handler } from 'path_to_handler/handler';

jest.mock('aws-sdk');   // aws-sdkのMock化。この記述がないとできない

describe('test', () => { 
    beforeEach(() => {
      const ddbData = {
        Item: { ID: '1', Data: 'XXX' },
      };

      const mockDynamoDbGet = {
        promise: () => {
          return ddbData;
        },
      };
      // Document.Client.getのMock化 .prototypeがポイント
      const getMock = AWS.DynamoDB.DocumentClient.prototype.get as jest.Mock;
      // Getのレスポンスが返す値を注入。
      jest.mocked(getMock).mockReturnValue(mockDynamoDbGet);
    });
    it('handlerのテスト', async () => {
      const event = {id: '1'};
      const result = await new Handler(event).execute();
      expect(result.ID).toEqual('1'); 
      expect(result.Data).toEqual('XXX'); 
    }); 
  });
```
# まとめ
Mock化したいコンストラクタのprototypeを使うことで解決しました！

prototypeでAWS.DynamoDB.DocumentClientにgetメソッドを持たせて、
getのレスポンスに期待値を注入しています。

prototypeについては[こちら](https://javascript.keicode.com/lang/prototypes.php)がわかりやすかったです。

終わってみればたった数行で、簡単にDynamoDBのGetがMock化できました。
すごろくゲーム作ってみた

# すごろくゲーム作ってみた
こんにちは　momotechの久保田です
今回は「pythonで作るゲーム開発入門講座」という本を参考に『すごろくゲーム』を作ってみました
ほぼ完成コードと同じになります
更新できる機会があれば更新していきます
## コード
```py
import random
bob_pos = 1
mic_pos = 1
#盤面を描!!!! 牛丼チェーン店は吉野家が一番
def banmen(dare,name):
    print("・"*(dare)+name+"・"*(30-dare)+"GG!")

banmen(bob_pos,"B")
banmen(mic_pos,"M")
input("すごろくOK?1でOK2でOK3でOK")
while True:
    input("Enterを押すと『自分の』コマが進みます")
    bob_pos += random.randint(1,6)
    if bob_pos > 30:
        bob_pos = 30
    banmen(bob_pos,"B")
    banmen(mic_pos,"M")
    if bob_pos == 30:
        print("あなたはbobを勝利に導きました")
        break
    input("(前の方省略)コンピュータのコマが....")
    mic_pos += random.randint(1,6)
    if mic_pos > 30:
        mic_pos = 30
    banmen(bob_pos,"B")
    banmen(mic_pos,"M")
    if mic_pos == 30:
        print("あなたはmicを勝利に導きました")
        break
```
## 作ってみて
今回はほぼ同じにコードを書きましたがアレンジも今後できたらと思っています
コメントに書いている通り**牛丼チェーン店は吉野家が一番です**

## 今回参考にした本
pythonでできるゲーム開発入門講座
廣瀬 豪　著
https://www.amazon.co.jp/Python%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B-%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA-%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%E5%BB%A3%E7%80%AC-%E8%B1%AA/dp/4800712394/ref=sr_1_1?adgrpid=107430882649&gclid=CjwKCAiAjoeRBhAJEiwAYY3nDKcPCc2C2656C1bMtk1UlMOJbHoiaX_2zCXjeN7RgpeuhcV5hCQ72xoCu2QQAvD_BwE&hvadid=553844419872&hvdev=c&hvlocphy=1009717&hvnetw=g&hvqmt=e&hvrand=10426468575253034299&hvtargid=kwd-841789021896&hydadcr=27494_14478892&jp-ad-ap=0&keywords=python%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7&qid=1646447375&sr=8-1
こちらで購入できます
あまり知らなかったPythonの使い方

ちょいと学習してた際に普段あんまり使わなくて知らなった使い方やら書き方やらがあったのでメモがてら残しておく。
ただ、普段使わないだけあって、count以外はどういうときに使うと効果的なのかが全然思いつかない。。

## リスト内の数を数える

リスト内の要素の件数などはlenでよく出力したりするが、重複している要素の数を出力できることは知らなかった

```
num_list  = [2, 4, 6, 4, 4, 2, 6]
for i in range(num_list.count(4)):
    print(i, end=' ')
```
上記だと、リスト内の4の数をrangeに食わせているので、range(3)と同じことになる

参考：https://note.nkmk.me/python-collections-counter/


## 出力結果に対して表示制限を加える

```
import reprlib
list_sample = [i for i in range(100)]
reprlib.repr(list_sample)
```

そのまま出力すると0から99までがそのまま出力されるけど、表示に制限を加えることができるのでこんな感じになる

> [0, 1, 2, 3, 4, 5, ...]

参考：https://docs.python.org/ja/3.5/library/reprlib.html

## クラスの属性を確認できる

os.listdirとかはよく使うけど、似たようなものでビルド関数のdirがある。
似てるくせにできることは全然違う。

```
class SampleClass:
    attr_int_A = 10000
    attr_str_B = 'sample Str'

for attr in dir(SampleClass()):
    if attr.startswith('__'): # __ 始まりはスキップ
        continue
    print(attr)
```

>attr_int_A 
>attr_str_B 

参考：https://python.keicode.com/refs/dir-function.php
herokuにデプロイした際にerror: failed to push some refs to 'https://git.heroku.com/output.git'でデプロイできませんでした。

# ローカル環境では正常だけどherokuにデプロイしたときにエラー発生

## エラーメッセージ
ターミナル
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533976/1e61a0ba-99d6-2ceb-74f2-5eb8e649ffa5.png)

上にスクロールすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533976/9f2311aa-d5cf-7b6c-5ecc-7e39d6a77921.png)
 Sass::SyntaxError: wrong number of arguments (1 for 4) for `rgba'
cssのrgbaの引数が間違っているとあるのでcssを確認しました。
![スクリーンショット 2022-03-05 10.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533976/3ea0b657-0cd1-e5b3-cc4e-8370f878cd9f.png)
rgba(41, 41, 41, 0.2)に修正して無事デプロイできました。


### 結論
エラーが発生した際に上までコードを遡ることが重要だと思いました。cssのrgbに辿り着くまでに半日かかりました。エラー解決はエラー文を読んでエラーの原因を突き止めるのが解決の近道だと再認識しました。
ZRouterでmruby 3.1.0-rcをビルドしてみた

もうすぐmrubyは3.1.0がリリースのようでrcが切ってあるので、ちょっとビルドを試してみました。

```diff
diff --git a/ports/lang/mruby/Makefile b/ports/lang/mruby/Makefile
index 6a09bb1..37c5e79 100644
--- a/ports/lang/mruby/Makefile
+++ b/ports/lang/mruby/Makefile
@@ -1,13 +1,13 @@
 PORTNAME=      mruby
-PORTVERSION=   3.0.0
+PORTVERSION=   3.1.0
 CATEGORIES=    lang
 MASTER_SITES=  http://mruby.org/
 DISTNAME=      ${PORTVERSION}
 #DISTNAME=     mruby-master
-EXTRACT_SUFX=  .tar.gz
+EXTRACT_SUFX=  -rc.tar.gz
 MASTER_SITES=  https://github.com/mruby/mruby/archive/
 
-WRKSRC=                ${WRKDIR}/${PORTNAME}-${PORTVERSION}
+WRKSRC=                ${WRKDIR}/${PORTNAME}-${PORTVERSION}-rc
 #WRKSRC=               ${WRKDIR}/${DISTNAME}
 
 MAINTAINER=    yamori813@yahoo.cp.jp
```

PORTVERSIONでは'-'が使えないようなのでこうしました。

これで

```
% make fetch -DNO_CHECKSUM
===>   mruby-3.1.0 depends on file: /usr/local/sbin/pkg - found
===> Fetching all distfiles required by mruby-3.1.0 for building
% make makesum
===>   mruby-3.1.0 depends on file: /usr/local/sbin/pkg - found
===> Fetching all distfiles required by mruby-3.1.0 for building
```

こうして、ちゃんとビルドできました。

とりあえずレポジトリは3.0.0のままにしてリリースされたら入れ替えます。よくみるとMASTER_SITESが二つありますね。今度直します。
【RN】既存のプロジェクトのandroid buildでUnable to load script. Make sure you’re either running a Metor service (run ‘react-native start’) or that your bundle ‘index.android.bundle’ is packaged correctly for release.と言われる


## 背景
既存のRNプロジェクトをandroid studioを使用して立ち上げようと思ったところ、以下のようなエラーが発生しました。


>Unable to load script. Make sure you're either running Metro (run 'npx react-native start') or that your bundle 'index.android.bundle' is packaged correctly for release.


`npx react-native start`がきちんと起動していることを確認したので、どうやらindex.android.bundleが問題だという結論に。。

## 対処法

単純にindex.android.bundleがなかったため、作成しました。

```
$ cd your project
$ mkdir android/app/src/main/assets
$ npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
```

再度Metroを起動させて、android studioから起動させます。


## 補足
最後のindex.android.bundleを作成する際に以下のエラーが出てしまっている方はmainの下に正しくassetsが作成されていない可能性があります。実行するディレクトリときちんとassetsが作成されているかを確認してみてください。

```
error ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle'.
```
config gem の has_key? の落とし穴

# はじめに

[config](https://rubygems.org/gems/config) という gem は，プロジェクト全体で用いる設定値のたぐいを管理するもの。

あらかじめ値を YAML 形式で

```yaml:settings.yaml
before:
  morning: 3
  evening: 4
after:
  morning: 4
  evening: 3
```

のように用意しておけば

```rb
p Settings.before.evening # => 4
```

のようにしてメソッドチェーンで値を取り出すことができる。

Rails の定数管理の定番 gem らしいが，べつに Rails 専用というわけではなく，フレームワークを使わないようなプログラムでも便利に使える。

※本記事は config の（2022-03-05 時点の）最新版であるバージョン 4.0.0 に基づいている。

# ちょっとハマった

昔つくった Rails アプリがいくつもある。定数管理には [settingslogic](https://rubygems.org/gems/settingslogic) を使ったものと [easy_settings](https://rubygems.org/gems/easy_settings) を使ったものとがあった。
ところがこの二つの gem はそれぞれ 10 年前，7 年前に開発が止まっていて，安心して使い続けられない気がした。

そこで，手始めに easy_settings を使った Rails アプリ一つを config に変えてみようと思った。

easy_settings と config は使い方が意外と似ていて，ちょっとの修正で config に移行することができた（ように見えた）。
ところがテストの一部が通らない。
その原因とは？というのがこの記事のテーマ。

# 落とし穴

本題に入る前に，config の使い方をもう少し説明したい。

まず，冒頭に掲げた YAML ファイルを再掲する：

```yaml:settings.yaml
before:
  morning: 3
  evening: 4
after:
  morning: 4
  evening: 3
```

そして，Gemfile は

```rb:Gemfile
source "https://rubygems.org"

gem "config"
```

としておく。
Rails のことは忘れてシンプルに小さな Ruby プログラムで config を使ってみよう。

```rb
require "bundler"
Bundler.require

Config.load_and_set_settings "settings.yaml"

p Settings.before.morning # => 3
```

こんなふうに使える。

さて，`Settings.before` について，`morning` の値を取り出すか，`evening` の値を取り出すかが動的に決まる場合はどう書けばよいか。
もちろん `send` メソッドを使って

```rb
time = :evening
p Settings.before.send(time) # => 4
```

と書くこともできるわけだが，config で作られるオブジェクトはハッシュ的なインターフェースを持っているので，`[ ]` を使って

```rb
time = :evening
p Settings.before[time] # => 4
```

と書くこともできる。
`[ ]` に与える引数は，**シンボルでも文字列でも構わない**。ココ重要。
だから，

```rb
p Settings.before[:evening] # => 4
p Settings.before["evening"] # => 4
```

ということになる。
このあたりの仕様は easy_settings でも変わらない。たしか settingslogic でも同じだったと思う。

問題はここからだ。

`Settings` とか `Settings.before` とかはハッシュ的なインターフェースを持つオブジェクトなのだが，ハッシュと同様，「〇〇というキーを持っているか」は `has_key?`（もしくはエイリアスの関係にある `key?`）メソッドで知ることができる。

つまり，

```rb
p Settings.has_key?(:before) # => true
p Settings.before.key?(:evening) # => true
p Settings.after.key?(:noon) # => false
```

という具合。
この点も easy_settings と共通している。

ようやく本題に入る。
easy_settings では，`has_key?` の引数はシンボルでも文字列でもよかった。
ところが，config では **シンボルでなければならない** んである。
こんなふうになる：

```rb
p Settings.has_key?(:before) # => true
p Settings.has_key?("before") # => false
```

げえぇ〜

引数はシンボルでなければ正しくキーとして認識してくれないのに，文字列を与えても TypeError は出ない！

これは恐ろしい。分かりづらいバグの原因になる。
今回は運良くテストコードによって気づくことができたが，テストで引っかかってくれていなかったら何時間も潰すところだった。
件のコードは `has_key?` にリテラルではなく変数を与えていたため，もし config のこの仕様を最初から知っていたとしても問題の所在に気づきにくかったかもしれない。

みなさまご注意を。

（2023-07-01 追記）今日もまたこの問題でバグってしまった。これどう考えても config gem の仕様がおかしい。String と Symbol には一対一の対応があり，`has_key?` はキーの有無を問うているのだから，String は Symbol 化して受け取ってくれるべきだろう。
df コマンドの備忘録

## はじめに
`df` コマンドについての記事はありふれているのですが、自身の備忘録的な意味を込めての記事となります。

## df コマンドとは
ファイルシステム上の空き容量の統計情報を表示するコマンド。

## とりあえずうっとけのコマンド

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        214M     0  214M   0% /dev
tmpfs           222M     0  222M   0% /dev/shm
tmpfs           222M  396K  222M   1% /run
tmpfs           222M     0  222M   0% /sys/fs/cgroup
/dev/nvme0n1p1  8.0G  1.5G  6.6G  19% /
tmpfs            45M     0   45M   0% /run/user/1000
```

- Filesystem
    - ディスク名
- Size
    - 全ディスク容量
- Used
    - 使用容量
- Avail
    - 空き容量
- Use
    - 使用率
- Mounted on
    - ディスクがファイルシステム上のどこにマウントされているのか(マウントポイント)を表している

## 参考
- [【 df 】コマンド――ディスクの空き領域を表示する：Linux基本コマンドTips（58） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1610/24/news017.html)
- [dfコマンドについてまとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-df)
- [【Linux】ディスク容量を確認できるdfコマンドについて | IT職種コラム](https://it-kyujin.jp/article/detail/1248/)
データベースの状態を指定したマイグレーションまで戻したいときの手順

「あ、制約つけ忘れた」
「やっぱカラム追加したほうがいいなぁ」

テーブル作成前に戻したいなってこと、ありますよね。
これまで ASP.NET を使った経験がなく、職場の先輩に教えてもらったので、メモとして残しておきます。

## マイグレーションとは？
> データベースを削除してから作り直すと，DBに保存されている情報が全て削除されてしまいます． こういった事態を回避する方法として、データベースマイグレーションを行う方法があります。 マイグレーションとは、DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更などを行うための機能です。

[densanlabs](https://densan-labs.net/tech/codefirst/migration.html "densanlabs")から引用

## 手順
データベースの状態を、指定したマイグレーションまで戻したいときの手順は以下のとおりです。
1. 戻したいマイグレーションファイルを確認する
1. ``Update-Database``を実行する
1. ``remove-migration``を実行する
1. ``add-migration``を実行する
1. ``update-database``を実行する

それでは順番に確認していきましょう。

### 戻したいマイグレーションファイルを確認する
まずは戻したいマイグレーションファイルを確認しましょう。
```:例
20220303115938_User.cs
20220304115938_Wallet.cs
20220305115938_Item.cs
```
このようにマイグレーションファイルがあるとして、``20220305115938_Item.cs``を削除したいとします。

### ``Update-Database``を実行する
戻したいマイグレーションファイルを確認したら、次はコマンドを実行していきます。
[ツール] メニューで、[NuGet パッケージ マネージャー] > [パッケージ マネージャー コンソール] の順に選択します。

これからコマンドを実行するわけですが、注意点があります。
``20220305115938_Item.cs``を削除したい場合、``20220304115938_Wallet.cs``を``Update-Database``で指定することです。

つまり、**削除したいマイグレーションファイル（``20220305115938_Item.cs``）の一つ前を指定して、``Update-Database``を実行**します。
コンソールで下記のようにコマンドを実行してください。
```
PM> Update-Database 20220304115938_Wallet
Build started...
Build succeeded.
Done.
```
これでデータベースは``20220304115938_Wallet.cs``まで戻りました。
（この時点ではマイグレーションファイルは削除されていません。）

### ``remove-migration``を実行する
不要になったマイグレーションファイルを削除していきます。
下記のコマンドを実行してください。

```
PM> remove-migration
Build started...
Build succeeded.
Removing migration '20220305115938_Item'.
Reverting the model snapshot.
Done.
```

これでマイグレーションが削除されます。
ちなみに、エディタから直接ファイルを消すと、もう一度テーブルを作成するときにエラーが発生します。
``remove-migration``コマンドで削除するようにしましょう。

削除だけの場合、ここまでで終了です。
``update-database``を実行して、更新を反映させておきましょう。

### ``add-migration``を実行する
設定を見直したり、追加したらもう一度テーブルを作成します。
```
PM> add-migration Item
Build started...
Build succeeded.
To undo this action, use Remove-Migration.
```

### ``update-database``を実行する
最後に``update-database``を実行して、更新を反映させます。
```
PM> update-database
Build started...
Build succeeded.
Done.
```

これで完了です。

### まとめ
テーブル操作は慎重になりますよね。
最初はビビりながらも、たくさん経験していくことで慣れてくると思います。
地味にハマったので、記事にしました。
少しでも参考になれば幸いです。

## 参考資料
[チュートリアル: ASP.NET MVC アプリで EF の移行を使用して Azure にデプロイする](https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application "チュートリアル: ASP.NET MVC アプリで EF の移行を使用して Azure にデプロイする")
[Entity Framework Core ツールのリファレンス - Visual Studio のパッケージ マネージャー コンソール](https://docs.microsoft.com/ja-jp/ef/core/cli/powershell "Entity Framework Core ツールのリファレンス - Visual Studio のパッケージ マネージャー コンソール")
よく分かるCRE入門

# CREとは

- 顧客信頼性エンジニアリング（Customer Reliability Engineer）
- IT製品を担当するサポートエンジニアやセールスエンジニアなどが近い職種
- 「顧客体験向上」「効率化」「最適化」
- カスタマーサポートのDXにおいて重要な役割を担うスペシャリストでもある
- 2006年頃に、SREと同じくGoogleが提唱したことをきっかけに広まり始めた
- 国内でも、ミクシィやメルカリ、Repro、はてな、ランサーズなどでCREチームが立ち上がっている

# 目的

主に２つ。
「顧客に対するアクション」と「カスタマーサポートに対するアクション」

- To 顧客
    - 顧客に対して「不安を取り除く・信頼性を保つ」ための行動をする
    - 問い合わせに対して仕様調査やバグ修正を行う
    - 品質を改善し、お問い合わせが発生しない仕組みを作る
    - 問い合わせが発生する手前で自己解決できるように、お問い合わせフォームの改修やチャットボットの開発なども行う
    - 顧客の改善要望を吸い上げてサービスの改善に繋げ、より高い顧客体験を提供する

- To カスタマーサポート
    - カスタマーサクセスの質の向上をさせる
    - 現場のメンバーが抱えている細かな課題を丁寧にすくい上げながら、仕組みごと改善していく
    - カスタマーサポートチームが利用する業務効率化のための社内システムの開発

# 具体的にやること

まだ歴史の浅い職種ということもあり、かっちりとした実務の定義は存在しない。
実際に行う作業は組織やプロダクトにより異なる。
ここでは複数の事例の調査結果を記載する。

- To 顧客
    - 顧客からの問い合わせの調査・対応
        - 仕様確認
        - 不具合修正
        - 顧客とのコミュニケーション
    - プリセールス（顧客へのプロダクト説明・技術質問回答）やテクニカルサポート
    - 問い合わせに至っていない潜在的課題の発見
    - 顧客の課題改善に向けたプロダクト改善・機能開発、もしくはその支援

- To カスタマーサポート
    - 業務オペレーションの改善
        - 自動対応や自動ルーティング
        - データへのアクセスを簡略化
        - カスタマーサクセスサービスの導入・活用支援
    - ヒアリングで聞いた課題のみならず、潜在的に解決すべき課題も含めてソリューションを提供する
    
- プロダクトの価値向上やそのサポート
    - VoC（Voice of Customer; 顧客の声）活用
    - 開発エンジニア、カスタマーサポート、セールスメンバーとのコミュニケーション
    - 外部開発ベンダーとのコミュニケーション
    - プロダクト改善・機能開発に向けた社内連携（PdMチームと連携）
    - ユーザの行動からデータの収集、収集して定量化したデータからの分析・可視化
    - その他業務の自動化／効率化

# 必要なスキル

- コミュニケーションスキル
    - 現場のメンバーとのコミュニケーション
    - サポート・ビジネス側からの質問・要望に対して、臨機応変に対応できる
    - 顧客からの問い合わせ内容を正しく把握し、分かりやすく返答することができる
    - コード上の仕様をサポートメンバーや顧客が理解しやすい言葉で説明できる
- 現場の業務への深い理解
- 顧客要望の把握と、優先度づけ
- データ分析・統計の知識
- 顧客データと向き合い、洞察力をもって「仮説、実行、検証」を繰り返していくスキル


# 参考

https://cloudplatform-jp.googleblog.com/2016/10/google-cre.html

https://karakuri.ai/media/727

https://freeecommunity.force.com/jobs/s/detail/a4l1000000170hWAAQ

https://herp.careers/v1/hokan/nryc_VrqBP3H
Salesforce 1 Adoption Dashboard


少々古いアプリみたいです。フィルター条件を変更したら機能しました。

Salesforce1 を　Salesforce forに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6a8d8f4d-d31c-6775-3dcc-6f010eb7af14.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/358c6075-c8dc-dfb2-5dd8-0511bbce12ee.png)


[Salesforce 1 Adoption Dashboard](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FTTZ2SAP)
Bootstrapっぽさをなくすためにしたこと【備忘録】

# はじめに
僕はフロントエンドのコーディングでCSS書くのがめんどくさいのでよくBootstrapを使うのですが、どうしても「Bootstrap」ぽさが出てしまいダサかったので自分なりにいろいろやってみたことやコツを書いておきます。チョー短いですけどお付き合いください。

# 1.色を変える
やはり基本はこれだと思います。自分は配色を提案してくれるcolormindというサービスをよく使います。

http://colormind.io/

基本的にbg-○○のところをいじれば一括変更なので時短できます。

# 2.フォントを変える
どうしてもブラウザ標準フォントだけでは「見飽きた」感が出てしまうのでGoogle fontsなどを使ってフォントを変えます。いろいろありますが、僕はNoto sans派です。

# 3.Bootstrap特有の機能を消す
Bootstrapのボタンやフォームの選択時のフォーカスがやたらでかい。これだけでBootstrapだなと察しがついてしまう。ここは以前投稿したのでこちらを。

https://qiita.com/Lian/items/6f3b6d18a53325aade91

# 4.ほかのこまごまポイント
角丸きつくor緩く
単調にならないようアイコンをつける
などなど

# 終わりに
Bootstrapは使いやすい分、多くの人が使うのでそのままだと、どうしても他の人のものに似てしまいます。自分なりに試行錯誤してはいかがでしょうか。
最後までお付き合いくださりありがとうございました。
Go言語 + Windows Terminalで、任意の文字にハイパーリンクを埋め込むエスケープシーケンス

# 結論1「Googleへのリンク」

```golang
package main
import (
	"fmt"
)
func main() {
	fmt.Println("\033]8;;https://www.google.com/\aGoogle\033]8;;\aへリンク")//->Googleへリンク
}
```

# 結論2「📁ローカルフォルダへのリンク」

```golang
package main
import (
	"fmt"
)
func main() {
	fmt.Print("\033]8;;file://C:/Users\aLocal\033]8;;\a←リンク")//->Local←リンク
}
```



# 参考
[ターミナルエミュレータ内でクリッカブルなリンクを作る方法](https://qiita.com/aosho235/items/335fc2f4b002a8251a2f)
[How to add hyperlinks to a terminal [ Node.js ]](https://stackoverflow.com/questions/69314689/how-to-add-hyperlinks-to-a-terminal-node-js)
[Explicit hyperlinks and context information for your terminal](https://www.uninformativ.de/blog/postings/2018-04-14/0/POSTING-en.html)
[Hyperlinks (a.k.a. HTML-like anchors) in terminal emulators](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)
Ubuntu Server 20.04.3 LTS 構築#19 バックアップ


実施日:2022/03/04

【今回の内容】

購入した内臓SSDにデータをバックアップ

# 内臓SSDのスペック
･メーカー:Western Digital
･型番:WDS500G2B0A
･容量:500GB
･規格サイズ:2.5inch
･インターフェース:Serial ATA 6Gb/s
･タイプ:3D TLC NAND
･読込速度:560 MB/s
･書込速度:530 MB/s

参照先サイト
[価格.com様](https://kakaku.com/item/K0000969847/spec/#tab)

# サーバー本体に接続し、認識しているか確認

```
sudo fdisk -l

ディスク /dev/sdb: 465.78 GiB , 500107862016バイト, 976773168セクタ
Disk model: 500G2B0A
/dev/sdbで認識していることを確認
```

# ファイルシステムの作成

```
mkfs -t ext4 /dev/sdb
今回はext4で作成しました。
```

# バックアップの実行
```
sudo dd if=/dev/sda of=/dev/sdb bs=1024M

ifはコピー元を、ofはコピー先を指します。
bsは書込みサイズ、書込み速度と私は理解しています。
```

# バックアップ完了
terminal上でバックアップ完了していたので、コピー元とのサイズ確認をしました。

```
sudo fdisk -l
確認すると、表示内容が一致していました。
```
バックアップ完了です。
元東大教員/アメリカ企業CEO兼CTO

こんにちは，千代 浩之（ちしろ ひろゆき）です．

[私のブログ「元東大教員/アメリカ企業CEO兼CTO」](https://hiroyukichishiro.com/)では，日本とアメリカのビジネス，ライフスタイル，技術をわかりやすく紹介します．

私のブログには，以下の3つのカテゴリーがあります．

    ・BUSINESS
    ・LIFE
    ・TECHNOLOGY

本記事では，主にTECHNOLOGYカテゴリーを深く解説します．
TECHNOLOGYには以下の5つの内容があります．

* [ChishiroのC言語](https://hiroyukichishiro.com/c-language/)
* [元東大教員から学ぶリアルタイムシステム](https://hiroyukichishiro.com/real-time-systems/)
* [元東大教員から学ぶLinuxカーネル](https://hiroyukichishiro.com/linux-kernel/)
* [元東大教員/アメリカ企業CEO兼CTOから学ぶ自然言語処理AI【Natural Language Processing】](https://hiroyukichishiro.com/nlp-ai/)
* [元東大教員/アメリカ企業CEO兼CTOから学ぶイーサリアム（Ethereum）](https://hiroyukichishiro.com/ethereum/)

# ChishiroのC言語

[ChishiroのC言語](https://hiroyukichishiro.com/c-language/)では，主にC言語の中級者～上級者向けの内容を解説します．
具体的には，以下の方を対象としています．

* C言語を利用して研究開発している情報系の学部4年生～大学院生（修士・博士）
* ロボット，自動車，IoTを対象としたC言語エンジニア（組込み・IoTエンジニア）
* OSの中身を学びたい方
* コンピュータの本質を理解したい方

C言語の記事は100記事以上あるので，たいていの悩みは解決します！

# 元東大教員から学ぶリアルタイムシステム

[元東大教員から学ぶリアルタイムシステム](https://hiroyukichishiro.com/real-time-systems/)では，リアルタイムシステムの分野について解説します．
リアルタイムシステムとは，決められた時間（デッドライン）までに処理を完了しなければならない性質をもつシステムのことです．
リアルタイムシステムは，ロボット，自動車や航空機などで広く使われているので，これらの中身を知りたいあなたにおすすめです．

# 元東大教員から学ぶLinuxカーネル

[元東大教員から学ぶLinuxカーネル](https://hiroyukichishiro.com/linux-kernel/)では，Linuxカーネルについて解説します．
Linuxカーネルとは，C言語で開発されたオープンソースのOSです．
Linuxカーネルは，スーパーコンピュータ，サーバ，Android等で広く利用されています．
Linuxカーネルの中身を知りたいあなたにおすすめです．


# 元東大教員/アメリカ企業CEO兼CTOから学ぶ自然言語処理AI【Natural Language Processing】

[元東大教員/アメリカ企業CEO兼CTOから学ぶ自然言語処理AI【Natural Language Processing】](https://hiroyukichishiro.com/nlp-ai/)では，自然言語処理について解説します．
自然言語処理AIのチャットボットのChatGPTやBardを深く理解したいあなたにおすすめです！

# 元東大教員/アメリカ企業CEO兼CTOから学ぶイーサリアム（Ethereum）

 [元東大教員/アメリカ企業CEO兼CTOから学ぶイーサリアム（Ethereum）](https://hiroyukichishiro.com/ethereum/)では，イーサリアムについて解説します．
イーサリアムとは，分散型アプリケーション（非中央集権型アプリケーション）のためのオープンソースプラットフォームです．
イーサリアムで取引，NFTの売買，ゲーム，プログラミングをしたいあなたにおすすめです．


# まとめ
私のブログのTECHNOLOGYカテゴリーを紹介しました．
是非，私のブログで学びましょう！

[元東大教員/アメリカ企業CEO兼CTO](https://hiroyukichishiro.com/)
勝手にスリープが解除されるのを抑止する方法 UpdateOrchestrator\Schedule Wake To Work編

# 概要
以下のような、Windows Update絡みのスケジューラで勝手にスリープを解除されたWindows 10 ユーザーのための抑止方法を書きます。
```システムは低電力状態から再開しました。```
```スリープ状態の解除元: タイマー - Windows は、スリープ状態の解除を要求したスケジュールされたタスク 'NT TASK\Microsoft\Windows\UpdateOrchestrator\Schedule Wake To Work' を実行します。```


# 1.PSToolsをダウンロード
スケジューラを削除する際にSYSTEM権限上で実行するために使用する。
ダウンロードし、適当な場所へ配置。
https://docs.microsoft.com/ja-jp/sysinternals/downloads/pstools

# 2.以下を管理者権限でコマンドプロンプト上で実行

```c
sc.exe stop UsoSvc
cd /d "PSToolsのフォルダを指定"
start /wait PsExec.exe -s -i schtasks.exe /Delete /F /TN "\Microsoft\Windows\UpdateOrchestrator\Schedule Wake To Work"
cd /d "C:\Windows\System32\Tasks\Microsoft\Windows\UpdateOrchestrator"
md "Schedule Wake To Work"
attrib +r +h +s "Schedule Wake To Work"
sc.exe start UsoSvc
```
# 3.今回実行してる内容
Orchestrator Serviceを事前に停止し、Schedule Wake To Workのタスクを削除する。

削除しただけでは復活してしまうため"Schedule Wake To Work"の空フォルダを作成し、
読み取り専用属性・隠しファイル属性・システムファイル属性を"Schedule Wake To Work"のフォルダに付与し変更を防止する。

Orchestrator Serviceを再開し、スリープ解除抑止設定完了。

# 4.元に戻したい場合
元に戻したい場合は、"Schedule Wake To Work"のフォルダを削除するだけ。
フォルダーオプションからシステムファイルを表示し、エクスプローラー上から削除するか、以下のコマンドで削除。

```c
cd /d "C:\Windows\System32\Tasks\Microsoft\Windows\UpdateOrchestrator"
attrib -r -h -s "Schedule Wake To Work"
rmdir "Schedule Wake To Work"
```
robots.txtでQiita投稿件数の年度別推移などを分析してみた

## はじめに

robots.txtの中身を調べたらQiitaのいろいろランキングのようにいろいろ分析できそうだったのでやってみました。

## 年度別、残存する投稿件数の推移グラフ

最初の分析はQiitaの投稿件数の年度別推移です。記事の投稿日の年ごとの投稿件数を数えます。

![年度別、残存投稿件数](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311399/e0901659-17ba-eb79-6f6e-87d42b160d38.png)

2020年まで右肩上がりに投稿記事数が増えましたが、2021年度の投稿件数が減っています。Qiitaに何があったのでしょうか？:thinking:

:::note warn

この記事のデータはすべて2022/3/4時点のデータです。分析の途中で１日前に取得したデータと見比べたら数十件の投稿記事が減っていました。自身の記事を削除されたと思いました。過去時点の投稿件数とは一致しません。

::: 

| 年度 | 投稿件数 |
| :--: | :------: |
| 2011 |   528    |
| 2012 |  6,529   |
| 2013 |  14,969  |
| 2014 |  37,734  |
| 2015 |  53,976  |
| 2016 |  66,866  |
| 2017 |  70,458  |
| 2018 |  96,245  |
| 2019 | 125,729  |
| 2020 | 142,590  |
| 2021 | 114,591  |

2021年度の投稿件数114,591は投稿日が2021年の記事総数（2022/3/4時点）です。

最初の記事の投稿日が2011/9/16で2011年度の期間が短いためグラフから省きました。

## どのようにしてグラフを作成したか

robots.txtを調べたら記事のURLが投稿日順に並んでいました。

年度別に年始と年末の投稿を見つけてURLの件数を数えました。:tired_face:

## 投稿者別、投稿記事数ランキング

分析することで初めて見える景色があります。:satisfied:

| 順位 |     投稿者     | 投稿記事数 |
| :--: | :------------: | :--------: |
| 1位  |      7of9      |   6,196    |
| 2位  | kaizen_nagoya  |   3,142    |
| 3位  | ohisama@github |   2,526    |

## いろいろな分析データ

他のデータについてもrobots.txtを調べてURLの件数を数えました。

|              分析項目              |  データ   |
| :--------------------------------: | :-------: |
|            ユーザー総数            | 2,502,520 |
|     記事を作成したユーザー総数     |  86,346   |
|              記事総数              |  747,405  |
|          Organization総数          |   1,537   |
|              タグ総数              |  73,636   |
|              質問総数              |   6,003   |
|    記事を作成したユーザーの割合    |   3.5%    |
| 記事を作成したユーザーの平均記事数 |    8.7    |

スパムユーザーが多いのかもしれませんが、記事を作成したユーザーの割合が低いのが気になりました:frowning:。

## Qiitaのユーザー総数を出すブックマークレット

robots.txtには存在する記事のURLが載っているためユーザー総数を出せませんでしたが、このブックマークレットならユーザー総数を出せます。

```javascript
javascript: (() => document.location.host === "qiita.com"
	? fetch("https://qiita.com/api/v2/users").then((a) => alert("Qiitaのユーザー数は " + a.headers.get("link").match(/page=(\d+)>; rel="last"/u)[1] * 20 + " です"))
	: alert("qiita.comで実行してください")
)();
```

## さいごに

Qiita検索でrobots.txtを調べてもあまり記事が出てこなかったことからrobots.txt自体があまり知られていないのではないかと思いました。robots.txtが分析するのに役に立ちます:blush:。

以前はQiita User Ranking というサイトでContributionの上位を確認できたそうです。データ量が多くなったせいか、サービスが止まり、分析者にとって冬の時代が来たのかもしれません:worried:。

2021年度以降のいろいろランキングが公式から提供されています。ありがたいことです:smile:。

データ量の多さにパソコンが悲鳴を上げましたが、分析は楽しかったです:blush:。
neosでlogix その61

# 概要

neosでlogixやってみる。
Attach Audio Clipノード、使ってみた。

# 写真


 

![2022-03-04 22.41.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8eb79e06-feaf-4492-0d98-9c8056fbaceb.jpeg)


# Attach Audio Clip

```
Inputs
 	Impulse	Attach
 	Uri	URL
 	Slot	Target
 	Bool	GetExisting
Outputs
 	Impulse	OnAttached
 	StaticAudioClip	AttachedProvider
```

# 手順

- logixtooltipを装着
- Assets>Attach Audio Clipをスポーン
- urlにneosdb入れる
- Slots>Root Slotをスポーン
- Audio>Play One Shotをスポーン
- つなぐ

以上。
CSSで文字をキーボード風 ：：ショートカットキー表記/説明：：

# CSSで文字をキーボード風 ：：ショートカットキー表記/説明：：
**キーボード風とは：**
`command`+`F`や、`⌘`+`F`、`⌥`+`F`など、__ショートカットキー表記/説明__ する時の見え方(CSS装飾)を想定。

※ここでの例はmacのショートカットキー表記
※`span`タグにclassを指定するのではなく、`kbd`タグを使う方法

## 百聞は一見に如かず：CodePen
まずは見てもらうとこう。CodePen埋め込み：
<p class="codepen" data-height="500" data-default-tab="result" data-slug-hash="bGYzJWM" data-user="Reng_code" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Reng_code/pen/bGYzJWM">
  css_keyborad_style</a> by Reng (<a href="https://codepen.io/Reng_code">@Reng_code</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

- 前提：Google fonts の "Fira Code"、太さ(weight)はレギュラーの"400"使用。
- 前提：アルファベットは、キーボードに表示のものを表示しているものとする (例:｢a｣とあっても大文字の｢A｣の shift+aという意味ではない)

③と④は微妙・よくわからない 
→ fontを変えると判りやすく影響出るのかも？ =詳細未確認=
→ 直前の親要素の関係する設定値によっては判りやすく影響出るのかも？ =詳細未確認=

## CSS部 -抜粋-
・以下が`kbd`タグに関連するところ(body部や親要素のdiv分は除外)
・コメントアウトが多いのは解説を兼ねてるから、コピペの際不要なら削除で
```css:cssコピペ用サンプル
/* Googel fontsの "Fira Code" と "Noto Sans Japanease" */
@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400&family=Noto+Sans+JP&display=swap');

/*=== kbdタグ---キーボード指示など ====*/
kbd{
   /*display:inline-block; __⭐️これ要るかな？*/ 
}
kbd > kbd{ 
  font-family: 
    'Fira Code', /*<--'googleフォント等幅_Fira Code'、 DLにレギュラー400指定*/
    /*'Courier', <--これ使うとまた違った感じになる*/
    /*'menlo',   <--これ使うとまた違った感じになる*/
    monospace;   

  background: #f2f2f2;/*灰薄め*/
  border:1px solid #d9d9d9;/*灰やや濃いめ*/  border-radius:0.2em; 
  
  padding:0.2em 0.4em  0.1em; /*<--④padding --*/
  /*--影的なもの--*/

  font-size: 0.88em;  /*<--②サイズ感の調整：他の文章と文字サイズ --*/
  line-height: 1; /*__タテ領域の調整：親要素の行間に影響されない  --*/
  margin:0 0.2em;  /*<--③marginの調整：前後の文字と近すぎないように --*/
  transform:translateY(-0.1em);  /*<--①タテ位置感の調整：
  文章中の縦位置を微調整(少しだけ上に) --*/
} 
.sdw kbd > kbd{
  box-shadow: 0.15em 0.15em 0 rgba(0, 0, 0,  0.3) ; 
  /*--影的なもの:ボカシなし--*/
}

/*===== 調整無し版 各種 ======*/
.non_y kbd > kbd{
  /*__①(設定しなかった場合と同等)タテ位置感の調整無しの場合：
    文章中、上下余白などの分、位置が下気味になる__*/ 
   transform:translateY(0);  
}
.non_lh kbd > kbd{
  /*__前提条件：⭐️kbdにinline-block設定時 __*/
  /*__(設定しなかった場合と同等)タテ領域の調整：親要素の行間値を継承__*/ 
  line-height:inherit ; 
}
.non_sz kbd > kbd{
  /*__②(設定しなかった場合と同等)サイズ感の調整：親要素の値を継承__*/ 
  font-size: inherit;
}
.non_mg kbd > kbd{
/*__③(設定しなかった場合と同等)左右余白の調整ナシ：
  前後の文字と近すぎな場合が起こるかも？__*/
  margin:0 0;
}
.non_pd kbd > kbd{
/*__④padding(設定しなかった場合と同等)padding調整ナシ：
  1文字の場合の幅が狭すぎ__*/
  padding:auto auto; 
}
```
備考：`padding`や`margin`の...
3つ続くときはこう(カンマ無し、半角スペースで列挙)
　　`padding:(上) (左右) (下);`　 `margin:(上) (左右) (下);`

2つ続くときはこう(カンマ無し、半角スペースで列挙)
　　`padding:(上下) (左右);`   `margin:(上下) (左右);`

以上。

-----
`kbd`タグの書き方は下記のページを参考にしています

http://www.htmq.com/html5/kbd.shtml
完全無料本格太平洋戦争戦略級シミュレーションゲーム"Gary Grigsby's PACIFIC WAR"のプレイ方法(2)

### 戦略級シミュレーションゲーム「ゲイリー・グリグズビー版パシフィックウォー」
### 和訳ルールブック（1章から4章まで）
（原本は、以下のURLにてRich Dが配布しているPDFファイル
https://www.tapatalk.com/groups/pacific_war_update/pacific-war-update-version-3-2-16-t176.html
PcwWgaRules-100512.pdf）
#### 1. ゲーム概要
　ゲイリー・グリグズビー版パシフィックウォー（以下、パシフィックウォー）は、1940年代に勃発した大日本帝国と西側連合国の間の戦争全体をカバーする戦略級シミュレーションゲームです。戦争における様々な側面がカバーされています。航空母艦同士の戦い・水陸両用攻撃・戦略爆撃・神風特攻・商船に対する潜水艦戦は、すべて戦争の結果を決定する上で重要です。パシフィックウォーでは、あなたはニミッツ提督または山本司令長官の役割を担います。あなたは国のすべての戦略的資産を管理・運用し、敵を撃破するために海軍・空軍・陸軍の進軍を指揮していきます。
#### 2. システム設定
　初期のバージョンはフロッピーディスクにプログラムとデータが保存されていたためバックアップディスクの作成が必要でした。現在のバージョン3.0はネットワークからダウンロードすることができるので、バックアップ作業は不要です。さらに、上述したRich Dが配布しているパッケージ（2022年3月5日時点の最新版は3.2.16c）では、解凍したZIPファイルに含まれるバッチプログラム0START THE GAME.batをダブルクリックするだけでゲームがスタートするので、設定作業は不要です。ただし、DOSBoxエミュレーター上で動作するので、キーボードのアサイン、動作速度、画面サイズなどの設定がDOSBoxの機能を用いることで可能です。詳細は付録1を参照して下さい。
#### 3. 操作方法
　ゲームが扱う範囲は広く、およそ200の基地と陸上・海上の兵力と航空機が含まれます。以下に示す操作によりあなたはゲームを始めることができます。
##### 3.1 基本操作
　どのようにゲームを進めたらよいかを知るためのチュートリアルが22章に用意されているので参考にして下さい。
##### 3.2 水陸両用作戦
　ほとんどの敵基地の制圧に際しては、水陸両用作戦を実行する必要があります。多くの異なるタイプの部隊についての理解を図るため、21章の「水陸両用作戦」を参照して下さい。このことは強固に防衛された敵基地の攻略を成功させるために重要です。
##### 3.3 ゲームシナリオの意味
　プレイヤーは多数の基地からなる広大な作戦区域を扱う必要があり、これを助けるために複数のシナリオが用意されています。これらはそれぞれの時期において何を為すべきかの指針を提示します。詳細については6章の「ゲームセットアップ」を参照して下さい。
##### 3.4 戦闘の歴史
　25章の「タイムライン」には、実際の戦争で行われた数々の戦闘とその発生日が日付順で示されています。
##### 3.5 チェックリスト
　ターン毎にプレイヤーがなすべきことを確認することができるチェックリストを8.6節に用意しています。
##### 3.6 戦略と戦術のヒント
　24章にゲームプレイにおいて役立つ戦略と戦術のヒントを示しています。
##### 3.7 操作方法の概要
　付録2に、操作と操作方法の一覧表を示しています。これらは特にキーボードを使った操作において役立ちます。
#### 4. ゲームコンセプト
##### 4.1 空間と時間のスケール
　マップはヘックス（6角形）で構成され、ヘックスのサイズは100マイル（約160km）です。1ターンは1週間です。
##### 4.2 マップ
　マップは次の地形要素から成ります。
![mapDetail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/cc94f4e5-467d-79a2-c574-e3884e27b4cd.png)
+ 海（青）
+ 沿岸（明るい青、水色、緑）
+ 陸地（緑、茶色）
　地形は海軍兵力の移動に次のように影響します。
+ 機動部隊は陸地のヘックスに入れません。
+ 機動部隊は陸地のヘックスを通り越して移動することはできません。
　機動部隊(TF; Task Force)は船のアイコンによりマップ上に表されます。陸上部隊と航空兵力は基地の内部に配置され、アイコンとしては表示されません。マップ上に置かれるその他のアイコンとして、次のものがあります。
![otherIcons.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/39cdd764-dc4b-ec1e-4fbb-1f416cdd4333.png)
+ 1隻の米国国旗の船は連合国の単一の機動部隊
+ 2隻の米国国旗の船は連合国の複数の機動部隊
+ 1隻の日本国旗の船は大日本帝国の単一の機動部隊
+ 2隻の日本国旗の船は大日本帝国の複数の機動部隊
+ 米国国旗の潜水艦は連合国の潜水艦隊
+ 日本国旗の潜水艦は大日本帝国の潜水艦隊
+ 米国国旗は米軍の支配基地
+ 英国国旗は英国の支配基地
+ 日本国旗は大日本帝国の支配基地
+ 他国旗はそれぞれの国の支配基地
+ 歩兵アイコンは、同一の基地に両サイドの陸上部隊が存在することを示す（赤は大日本帝国、青は連合国の支配基地）
##### 4.3 戦闘部隊
　本ゲームは、以下のすべてまたは一部の戦闘部隊が登場します。括弧内のアルファベットはゲーム内で使用される略称です。
+ 航空母艦(CV)、軽空母(CVL)
+ 補助空母(CVE)
+ 戦艦(BB)
+ 巡洋戦艦(BC)
+ 重巡洋艦(CA)
+ 軽巡洋艦(CL)
+ 対空巡洋艦(CLAA)
+ 航空巡洋艦(CS)
+ 駆逐艦(DD)
+ 補助駆逐艦(DE)
+ 巡視艇(PC)
+ 輸送駆逐艦(APD)
+ 輸送艦(AP)
+ 上陸艇(LST)
+ 商船(MC)
+ 補給艦(AO)
+ タンカー(TK)
+ 潜水艦(SS)
+ 陸上航空隊
+ 陸上部隊
+ 司令部
+ 司令官
##### 4.4 その他の略称
　ゲーム画面で出現するその他の略称については付録3を参照して下さい。

#### （5章に続く）
ARKitでシーンの明るさを推定する

# ARKitでシーンの明るさを推定できます

# 方法

```swift
func session(_ session: ARSession, didUpdate frame: ARFrame) {
    let lightEstimate = frame.lightEstimate
    print(lightEstimate)
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/91842f2a-e888-4a15-df23-4f25622dc093.png" width=200>

**↑
ambientIntensity=588.18(lumens) 
ambientColorTemperature=6132.34(Kelvin)**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/222b463f-b1b3-fc94-97aa-c5ca3977153b.png" width=200>

**↑
ambientIntensity=1071.78(lumens) 
ambientColorTemperature=4593.86(Kelvin)**

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)