OmniAICreator/Qiita-1.07M huggingface dataset:
【DNS】CNAMEのTTLは転送先のTTLが適用されるっぽい？

今回のは試してみたらそういう挙動っぽかったような気がするという話であり、確定した情報ではありません。
私の勘違いとかなんか設定ミスとかだったらすみません。

どこ探してもこの件について書かれてないし、[RFCにも](https://datatracker.ietf.org/doc/html/rfc2181)[いまいち](https://datatracker.ietf.org/doc/html/rfc2308)[見当たらない](https://datatracker.ietf.org/doc/html/rfc8499)っぽいです。
ここに載ってるよってのがあったら教えてください。


# どういう意味？

サーバAのzoneファイル

```bash
@   IN    SOA    ns1.a.com.    root.a.net. (
    99999 ; Serial
    60    ; Refresh 60秒
    60    ; Retry
    60    ; Expire
    60    ; Negative cache
)

foo IN  A      10.0.0.1
bar IN  CNAME  bar.b.net.
```

サーバBのzoneファイル

```bash
@   IN    SOA    ns1.b.com.    root.b.net. (
    99999 ; Serial
    10800 ; Refresh 10800秒
    10800 ; Retry
    10800 ; Expire
    10800 ; Negative cache
)

bar IN  A  10.1.2.3
```

このときにサーバAのzoneファイルを更新すると、`foo.a.net`は60秒でRefreshされるけど、`bar.a.net`は10800秒になるっぽい。


# 何が起きた？

`bar.a.net`の実体を`bar.b.net`から`bar.c.net`に移動することになりました。

ということで、まず数日前にサーバAのzoneファイルを更新し、Refreshを60秒にしました。
そして当日、再度サーバAのzoneファイルを更新し`bar IN  CNAME  bar.b.net.`の行を`bar IN  CNAME  bar.c.net.`に書き替えました。

60秒で切り替わるはずが全く切り替わらない！
どうして？？？


# どうすればいい？

今回はサーバBのzoneファイルを触る権限がなかったんですが、こういう場合はどうすればいいんですかね？
4K対応ホームページ制作メモ part7 写真高解像度化

## バックナンバー

https://qiita.com/nanakochi123456/items/253f82f82a40627edc52

https://qiita.com/nanakochi123456/items/532e801b56d023a70dc5

https://qiita.com/nanakochi123456/items/7a0756b33d42c3a76503

https://qiita.com/nanakochi123456/items/95dbaff738d4654aee54

https://qiita.com/nanakochi123456/items/1475e8c4ce7a9d43ad1d

https://qiita.com/nanakochi123456/items/2a200c2f46e5608740bb

## 適当にどくったら

調べたらこんなのもあったので、raisr を導入
```
git clone https://github.com/movehand/raisr.git
pip install opencv-python
pip install matplotlib
pip install matplotlib
pip install scipy
pip install scikit-image
```

## 高解像度写真を無料ダウンロードしまくる

https://pixabay.com/ja/

画像の解像度は、解像度に3000以上の数値が入っているのが目安

基本的にどの画像をダウンロードしても良いのですが、使用する写真に近い素材の写真であると、よりよいです。

人間を対象として撮影された写真を高解像度化するには、女性の髪の毛が多く写っている写真がよりよいです。

これらの画像を、学習用画像として trainディレクトリにコピーする

train.py　を実行する

```
python3 train.py
```


16枚ぐらいダウンロードしたが、Ryzen 7 5800U (WSL) で結構お時間かかる

ディープランニング（正確にはハッシュテーブルの生成）させて、お眠りにつくとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/7a492230-50b1-ef3e-8e71-713c91f2fb50.png)
マルチスレッド対応していないようで、ほんと重い

## 高解像度化する
高解像度化する画像を test ディレクトリにコピーする

test.py を実行
```
python3 test.py
```
※これも結構時間かかります

そうすると、resultディレクトリに入る

## 高解像度化した結果

- やはり、社内で保持しているもともとの画質がかなり悪いので、ちょっとマシになったというレベル。
- もともとの解像度が高くても、写真の撮影技術が下手なら、何も意味ない
- 悪くはなってないが、良くもなってない画像もある

p.s. 既に解像度が4000超えのも高解像度化しちゃっています

## 画質が良いかどうか判断する方法

- 髪の毛（黒髪）の1本1本が区別できるか - これは地デジでも髪の毛の1本1本が判別できるという売りでもありました
- わざとぼかしたのであっても、画像全体のうち1/3以上がピントがあっており、ぼけてないこと
- 変にドットが埋められてないか

## 最後に

- 写真は、おちついて、ブレずに、あわてず、静かに撮影しましょう
- 組織の歴史となる素材の画像は、無加工のオリジナル画像を保管するようにしましょう
【Laravel】Fakerで日本語テキストを使う方法

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## Fakerで日本語テキスト

以前、テストを書くときはFakerを使おうという記事を書いた。

https://qiita.com/kat0/items/5b7190e61df0163ee3d7

テキストのFakerを見つけたが、デフォルトだと英語のテキストになってしまう。
（第一引数に文字数指定できる）


```database/factories/PostFactory.php
public function definition()
  {
    return [
	  'content' => $this->faker->realText($maxNbChars = 35),
    ];
  }
```
Fakerを日本語に設定することで日本語テキストのFakerを入力できた。

```config/app.php
'faker_locale' => 'ja_JP',
```
ちなみに日本語バージョンでは『銀河鉄道の夜』の文章がランダムで表示される。

```
"content": "げしいように川に沿そっちかけたばかり機嫌きげんか。これからす」カムパ。"
```

## 参考

https://github.com/fzaninotto/Faker
APIPA とは

## 勉強前イメージ

APIのなにか？

## 調査

### APIPA とは

Automatic Private IP Addressing の略で、AutoIP友呼ばれています。
DHCPでIPアドレスが取得できなかった際に、機器が自分自身のIPアドレスを自動で設定する機能です。

具体的にどこのレンジで設定されるかというと
169.254.0.0～169.254.255.255 の 169.254.0.0/16 に特殊なリンクローカルアドレスというものがあり、
その中からランダムに選び他の機器での使用がないことを確認した後設定を行います。
具体的には、乱数でIPアドレスを一つ選んでARP要求をブロードキャストで送信。
ARPが返ってきたら使われているので、ARPが返らなくなるまで続けます。

実際はAPIPAで設定されたアドレスで通信できる場合がほとんどないので
DHCPでIPアドレスが取得できなかった際にAPIPAで設定され、回線が接続されてないなど問題が発生しているということがわかる。

### どの機器で使用されている？

windowsだと、windows 98から実装されて10でも使用されています。
またMac OSでも使用されています。
CentOSやRedhatには実装されているようです。

## 勉強後イメージ

はじめて知った機能・・・
PCだと基本ネットに接続すること多いから、LAN内だけ接続できてもーって感じはある。
大体失敗したときに設定されるかーくらいのイメージなのかな。

## 参考

- [APIPA 【Automatic Private IP Addressing】 AutoIP / 自己割り当てIPアドレス](https://e-words.jp/w/APIPA.html)
- [APIPA](https://www.wdic.org/w/WDIC/APIPA)
Reactのコンポーネントについて

### Reactのコンポーネントは関数とクラスがある
##### 関数コンポーネント
データの入ったprops（プロパティの意）というオブジェクトを引数として受け取り、returnでReact要素を返す。
```react:関数コンポーネント
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
```
##### クラスコンポーネント
コンストラクタを実装してsuper(props)の呼び出しが必要。render()メソッド内でコンストラクタで定義したpropsにアクセスして利用する。
```react:クラスコンポーネント
class Welcome extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}
```
### コンポーネントのレンダー
```react
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const root = ReactDOM.createRoot(document.getElementById('root'));
const element = <Welcome name="Sara" />;
root.render(element);
```
1. <Welcome name="Sara" />要素を引数としてroot.render()を実行する
1. ReactはWelcomeコンポーネントを呼び出し、そのときにpropsとして {name: 'Sara'} を渡す。
1. Welcomeコンポーネントは出力としてh1要素を返す。
1. ReactDOMは返されたh1要素に一致するようにDOMを書き換える。

### コンポーネントを組み合わせる
コンポーネントは他のコンポーネントを参照することができる。これにより、コンポーネントの再利用が可能になる。（同じコンポーネントを複数利用すること）
```react
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}
```
dense fusionで遊ぶ

## 動かし方
githubで公開されているからこれを使う。
https://github.com/iory/dense-fusion
```
git clone https://github.com/iory/dense-fusion.git
pip3 install dense-fusion
```

### YCBデータセットをダウンロード
以下のURLから265GのThe YCB-Video Datasetをダウンロードする、時々「ユーザーが集中してしてダウンロードできません」みたいなエラーが出ますが、１日待つとダウンロードできたりします。私はこのダウンロードに挑戦してから3日目にしてようやくできました。[ここで](https://github.com/yuxng/PoseCNN/issues/81)同じ悩みを持った人たちがmirrorサイトを作っていますが、私の環境ではこちらも駄目でした。
https://rse-lab.cs.washington.edu/projects/posecnn/
<img width="242" alt="image.png (12.1 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2022/05/23/111414/b5ddf0bc-dd80-4797-bfdb-5272a68c93d7.png">

### 実行
```
~/.local/lib/python3.6/site-packages/dense_fusion/datasets/ycb
vim ycb_utils.py
```
53行目のpathをYCB_Video_Datasetの保存先に合わせる。
```py
xyzpath = osp.join(
                '/home/ユーザー名/dataset/YCB_Video_Dataset',
                'models/{}/points.xyz'.format(label_name))

```
```
cd examples
python3 eval_ycb.py
```
```eval_ycb.py```を実行すると```examples```ディレクトリ内に```results```ディレクトリが作成され、姿勢推定された画像が保存されていきます。
### 実行結果
<img width="528" alt="image.png (544.7 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2022/05/23/111414/3eb4723d-3523-4397-984f-84a1df89f8a5.png">

## トラブルシューティング
```python3 eval_ycb.py```で画像のエラーが出た場合はpip3を更新する。
```
pip3 install -U pip
```
<img width="960" alt="Screenshot from 2022-05-23 17-20-29.png (38.7 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2022/05/23/111414/3ffba0b8-abb8-4619-89c9-4818ec72cc33.png">
Vue 3.0 composition apiによるAWS サーバーレス開発　シリーズ①　フロント側環境設定

# フロント:Vue.js-cli 3.0 + axios + vue-datepicker + json server

まずフロント側から着手、なんせまず動かすことが大事。
## 事前作業
Node.js , Vue.js 3.0 cli,Git,json_sever,vs_codeのインストール(いずれ最新のもので良い)
## コマンドプロンプトで環境設定
```
mkdir vue-app
cd vue-app
vue create develop 
```
Manually select featuresを以下のように選択
>select Babel,Router,Vuex,CSS Pre-processors,ESLint+error only,Unit Testing:Jest,E2E:Cypress;
Vue 3.xを選択
残りはすべてEnterキーで完了させる。 
```
cd develop 
npm install axios --save
npm install --save sass-loader node-sass
npm install @vuepic/vue-datepicker
```
コマンドプロンプトで下記コマンドを実行
```
npm run serve
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262523/b7ddf66b-b756-1555-8a48-09d3565e65c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262523/d249c844-beeb-bedc-f38a-8708583c2e8d.png)

ここまで表示できれば、フロント側のセットアップ一旦完了となる。お疲れ様でござる！！
【Laravel】配列のバリデーション

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 配列のバリデーション
Requestクラスでバリデーションする際に
リクエストパラメータがarrayで、そのarrayの中身のバリデーションをしたいときはワイルドカードを使う。

```php
$requestParams = [
  'post_ids' => [1, 2, 3],
]
```

```php
public function rules(): array
{
  return [
      'post_ids' => 'required | array',
      'post_ids.*' => 'integer',
  ];
}
```
PopupWindow + RecyclerView + NavigationComponentでPopupWindowが消えない

# PopupWindow + RecyclerView + NavigationComponentでPopupWindowが消えない

`RecyclerView` のItemとして`PopupWindow`を表示するとき、`PopupWindow`を表示したまま`NavigationComponent`で画面遷移をしようとすると`PopupWindow`が表示されたまま、取り残されたような表示になって対応が面倒だったので忘れないように対策をメモしておきます。

>The popup window is a floating container that appears on top of the current activity.

公式ではこう説明されているのですが、どうやら`PopupWindow`は最前面に表示されるみたい？

画面タップで消えることは消えるんですが、うっかり`PopupWindow`の中身を押してしまうと`NavigationComponent`のdestination errorになってしまうため、対策することに。

`RecyclerView`のItemに表示しているため、`ViewHolder`内の関数にアクセスしなければいけません。

```MainItemAdapter.java
public class MainItemAdapter extends
        PagingDataAdapter<User,
                MainItemAdapter.MainViewHolder> {
    public VisitorItemAdapter(@NonNull DiffUtil.ItemCallback<User> itemCallback){
        super(itemCallback);
    }

    public MainViewHolder(@NonNull ItemVisitorBinding binding) {
            super(binding.getRoot());
        }

        public void closePopup(){
            if(popupWindow != null && popupWindow.isShowing()){
                popupWindow.dismiss();
            }
        }

        public void bind(User item){
        //Item処理実装
        }
//以下略
```
こんな感じですね。

FragmentのLifecycleに対応してclosePopup()を呼びたいため、
FragmentのCallbackに実装します。

```MainFragment.java
private RecyclerView recyclerView;
private LinearLayoutManager manager;

@Override
    public void onPause(){
        if(manager!=null&&recyclerView!=null) {
            final int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
            final int lastVisibleItemPosition = manager.findLastVisibleItemPosition();
            for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
                VisitorItemAdapter.VisitorViewHolder holder = (VisitorItemAdapter.VisitorViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                try {
                    holder.closePopup();
                } catch (NullPointerException | ClassCastException e) {
                    e.printStackTrace();
                }
            }
        }
        super.onPause();
    }
```

これでNavigation画面遷移前に呼ばれるonPause()でPopupWindowを消せます。
でももっといい実装方法がある気がする
誰か最適解を教えてくださいｗ
MySQL　よく使うコマンド

# MySQL

## 1.データベースへのログイン
```
 mysql -u ユーザー名 -p パスワード -d データベース名
```

### （例）
|項目  |値 |
|---|---|
|ユーザー  |root |
|パスワード　  |1111|
|DB名　 |sample |


```
 mysql -u root -p 1111 -d sample
```

## 2.DBの消去(tuencateで行うことで、deleteよりも処理が早い)
※コンソール上で行う

```:コンソール
  # schema_migrations以外のテーブル内の全データを削除
       ActiveRecord::Base.connection.tables.each do |table|
         if table != "schema_migrations"
           ActiveRecord::Base.connection.execute("TURNCATE TABLE #{table};")
         end
       end  
```
[TextMeshPro] text.textInfo.linkInfo.Lengthが間違った値を返す

TextMeshProに
```
<style=name>太郎</style>こんにちは。<style=flag1/><link=msgptr:0/>
```
のような文字列を渡すと、linkタグを拾ってくれます。その情報は
```text.textInfo.linkInfo```に格納されるのですが、正しいLink情報だけ拾ってくるためには
```text.textInfo.linkCount```を参照する必要があります。

つまり[```text.textInfo.linkInfo.Length```で取得しようとすると間違った値を返すことがあります。](https://forum.unity.com/threads/tmp-textinfo-linkinfo-does-not-update-after-changing-text.1070729/)
どうやらこのバッファは一度サイズが大きくなるとそのままのサイズが維持され、後ろのほうには過去に取得したlinkInfoが入ったままになるようです。
Requirements on Libraries, No.314, AUTOSAR R21-11(120) CP

Requirements on Libraries, No.314, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SRS_Libraries.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 84文書読んだ。2022年6月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

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

# 用語(terms)

|Term|Description|
|:--|:--|
|API |Application Programming Interface. Preferred term is "function".
|AR,nAR_|Abbreviation used in place of AUTOSAR
|BFX| Library of Bit handling
|CRC |Cyclic Redundancy check
|DET |Default Error Tracer
|E2E| End to End
|EcuM |ECU Manager
|EFX |Extended function on Fixed point
|IFL| Interpolation function s of FLoating point
|IFX |Interpolation function s of FiXed point
|Library| Set of APIs (i.e. functions) that may be called from any modules(BSW modules or SW-C)
|MFL |Mathematical FLoating point calculation
|MFX |Mathematical FiXed point calculation
|OS| Operating System
|Mfx| Library of Mathematical FiXed point calculations
|Mfl |Library of Mathematical FLoating point point calculations
|Ifx| Library of Interpolation functions of FiXed point
|Ifl |Library of Interpolation functions of FLoating point
|Bfx| Library of Bit handling
|Efx| Library of Extended functions on Fixed point
|Crc|| Library of CRC routines
E2E |SW-C End-to-End Communication Protection Library

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Standardisation Template, AUTOSAR_TPS_StandardizationTemplate.pdf.
PowerPointのスライド番号でハマった


# 事象
一部のスライドだけスライド番号が反映されない（〈#〉のままになる）


# 原因
Offiece365のデスクトップアプリケーションから起動していた
ダウンロードしたファイルから見るとちゃんとスライド番号が表示された

詳細は不明
スライドマスターでも異常がないのに表示されない場合は、
一度ファイルをローカル環境にダウンロードしたりして確認してみて。
Specification of Basic Software Multicore Library, No.946, AUTOSAR R21-11(119) CP

Specification of Basic Software Multicore Library, No.946, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_BSWMulticoreLibrary.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 84文書読んだ。2022年6月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

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

# 用語(terms)

|Trem|Description|
|:--|:--|
|Bmc| Basic Software Multicore Library
|DET| Default Error Tracer
|s16 |Mnemonic for sint16, specified in AUTOSAR_SWS_PlatformTypes
|s32 |Mnemonic for sint32, specified in AUTOSAR_SWS_PlatformTypes
|s64 |Mnemonic forsint64, specified in AUTOSAR_SWS_PlatformTypes
|s8 |Mnemonic for sint8, specified in AUTOSAR_SWS_PlatformTypes
|u16| Mnemonic for uint16, specified in AUTOSAR_SWS_PlatformTypes
|u32| Mnemonic for uint32, specified in AUTOSAR_SWS_PlatformTypes
|u64 |Mnemonic for uint64, specified in AUTOSAR_SWS_PlatformTypes
|u8 |Mnemonic for uint8, specified in AUTOSAR_SWS_PlatformTypes

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Glossary
AUTOSAR_TR_Glossary
[2] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral
[4] Requirements on Libraries
AUTOSAR_SRS_Libraries
[5] Specification of Platform Types
AUTOSAR_SWS_PlatformTypes
[6] ISO/IEC 9899:2011
http://www.iso.org
JavaScript 直書きでGA4にカスタムイベントを発行する方法

## 留意点

- 本記事の情報は 2022 年 5 月 23 日時点の情報を元に記載しています
- Web での GA4 利用を前提に記載しています

## 背景

GTM を用いた GA4 のイベントハンドリングの方法は数多くネットに落ちていますが、何らかの事情によって GTM を使用できない場合は（ビジネス上の制約であることが多いように感じます）、どのようにイベントハンドリングするかという観点では情報が少ない印象だったので、JavaScript で直接任意のイベント情報を GA4 に送る方法について、簡単ではありますが情報を載せておこうと思います。

## カスタムイベントのリファレンス情報

GA4 のカスタムイベントリファレンスはこちらになります。

https://support.google.com/analytics/answer/9310895?hl=ja

UA では「イベント カテゴリ」、「イベント アクション」、「イベントラベル」、「イベント値」の各フィールドがありましたが、GA4 では「イベント名」と「パラメータ」で構成されます。パラメータには `send_to` プロパティを含めることで、特定の GA4 プロパティのみにイベントを送信することが出来ます。

```javascript
gtag('event', event_name, {
  parameter_1: parameter_1_value,
  parameter_2: parameter_2_value,
  parameter_3: parameter_3_value,
  // ...
  send_to: ga4_property_id,
})
```

## サンプルコード

或る入力欄を有するスマートフォンサイトの入力欄のタップ回数を、各欄それぞれの id 名によって個別に計測したい。そしてそのイベントを特定の GA4 プロパティ `G-xxxxxxxxx` のみに送信したい場合は下記のようになります。（jQuery で書いてしまいました）

```html
<input type="text" id="name1" name="name1" placeholder="山田" />
<input type="text" id="name2" name="name2" placeholder="太郎" />
<!-- ・・・ -->
```

```js
$('input').on('touchstart', (e) => {
  gtag('event', `touch_${e.target.id}`, { send_to: 'G-xxxxxxxxx' })
})
```

## TypeScript を使っている場合は

gtag() メソッドの型定義をする必要がありますが、@types/gtag.js が公開されているのでインストールしましょう。

https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/gtag.js

npm を使っている場合は下記などになります。

```bash
npm install -D @types/gtag.js
```
【スクレイピングツール】ScrapeStorm VS ParseHub 徹底比較!

元記事：https://jp.scrapestorm.com/tutorial-list/blog/
Webスクレイピングツールとして、ScrapeStormとParseHubはどちらが強いか？ScrapeStorm VS ParseHub 機能対決を始まりましょう！

## ScrapeStormとは？
ScrapeStormとは、強い機能を持つ、プログラミングが必要なく、使いやすく人工知能Webスクレイピングツールです。違う基盤のユーザーに二つのスクレイピングモードを提供し、1-Clickで99％のWebスクレイピングを満たします。ScrapeStormにより、大量のWebデータを素早く正確的に取得できます。手動でデータ抽出が直面するさまざまな問題を完全に解決し、情報取得のコストを削減し、作業効率を向上させます。
## ParseHubとは？
ParseHubは無料のWebスクレイピングツールです。 この高度なWebスクレイパーを使用すると、必要なデータをクリックするだけでデータを抽出できます。 それは分析のために任意のフォーマットで収集されたデータをダウンロードすることを可能にします。
## 機能の比較
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/05/%E7%89%B9%E5%BE%B4%E6%AF%94%E8%BC%83-3.png)
## ScrapeStormのメリットとデメリット
**メリット**
・インテリジェントな識別、1-Clickでページのリスト、ページボタンを取得する
・IPローテーションと確認コードの識別
・データ処理と重複排除ができる
・ファイル、画像、ビデオなどをダウンロードできる
・抽出されたデータを自動的にローカルまたはデータベースにエクスポート
・RESTful APIおよびWebhook
・EコマースのSKUと大きな画像を自動識別できる
・キーワードによってデータを抽出する
・正規表現とXPathを使える
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/05/%E8%87%AA%E5%8A%A8%E8%AF%86%E5%88%AB.gif)
**デメリット**
ScrapeStormはソフトウェアとして、コンピューターにインストール必要があります。ですから、偶にインターネットが不安定の場合、スクレイピングが中断するかもしれません。もちろん、ブレークポイントからデータを引き続き取得できます。
もう一つは、クラウドサービスがないの原因で、データ抽出をクラウドで実行できません。サーバーにインストールできますが、同じくインターネットが不安定の状況があります。

## ParseHubのメリットとデメリット
**メリット**
・使いやすいインターフェイス
・データをダウンロードする前にテキストとHTMLをクリーンアップ
・サーバー上のデータを自動的に収集して保存する
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/05/ParseHub.png)
**デメリット**
ParseHubはさまざまな機能を提供しますが、それらのほとんどは無料プランに含まれていません。無料版は40分に200ページまでしか対応できません。また、ParseHubは日本語サービスがありませんから、英語に苦手なら、使いにくいでしょう。

## 結論
ScrapeStormはAIで自動的に識別できるスマートモードとクリックしてページ内の要素を識別するフローチャートモードが提供します。両方とも使いやすいですが、初心者向けのチュートリアルをご参照すれば、より素早くソフトウェアの操作方法を把握できます。たくさんのチュートリアルとビデオを提供しますから、お役に立てれば幸いです。

ScrapeStormに比べるとParseHubは直接WebサイトをJSON Pathに変更できます。ScrapeStormはもっと素人友好のために、コーディング機能が少ないです。

最後に、両方とも使いやすいWebスクレイピングツールです。ノーコードでWebサイトから簡単にデータを取得することを目指し、初心者向けに無料で利用できるWebスクレイピングツールです。
SpringBootでログインユーザーの登録情報を使用

# やりたいこと
SpringBootにおいて、フロント側でログインしているユーザーの情報を扱いたい。ユーザーidごとに表示を変えたり、ログインしているロールによって表示を変えたりなどが柔軟に表現できる。

# 手順
いかに大まかな手順をメモ。
## DAOでサーバー側からユーザー情報を取得
これはシンプルにapiを叩いてユーザー情報を取得するDAOを実装するだけ。略。

## UserDetailsServiceを実装したクラスの作成
UserDetailsServiceはSpringBootが提供するインターフェースである。抽象メソッドであるloadUserByUsernameをオーバーライドする。このメソッドはUserDetails型のオブジェクトを返却するように実装する。
```java
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    private final Dao dao;
    
    public UserDetailsServiceImpl(Dao Dao) {
        this.dao = dao;
    }

    @Override
    public UserDetails loadUserByUsername(String username) {
        /** daoからuser情報を取ってくる処理
        * 略
        */
        // UserDetails型のオブジェクトをreturn
        return loginUser; 
    }
}
```

## WebSecurityConfigurerAdapterクラスを継承したクラスを実装
WebSecurityConfigurerAdapterクラスもSpringBootが提供するクラスであり、内部で先ほど実装したUserDetailsServiceImplをインジェクトすれば良い。
```java
@EnableWebSecurity
public class LoginUserConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    UserDetailsServiceImpl userDetailsServiceImpl;
}
```
ここで<span>@</span>EnableWebSecurityアノテーションも忘れないこと。

## 呼び出し
ここまでできれば後は、コントローラー側からloginユーザーの情報をバインドできる。
```java
@Controller
@RequestMapping("/hoge")
public class HogeController {
    /** 諸々省略
    * コンストラクタ、インジェクション、など
    */
    
    @GetMapping(path = "/fuga")
    public String fuga(@AuthenticationPrincipal LoginUser loginUser) {
        // 処理
    }
}
```
ここではLoginUserはUserDetailsを継承したクラスとしている。
これでコントローラーのメソッド内でログインユーザーの情報が扱えるようになる。
YouTubeの音楽をiPhoneに入れる

次の2ステップでYouTubeからiPhoneに音楽を入れる：

- step1. YouTubeの動画をMp3のファイル形式に変換
- step2. パソコンとiPhoneを同期する

（パソコンはMacを前提として話します）

# step1. YouTubeの動画をMp3のファイル形式に変換

次のアプリを使います：

https://www.mediahuman.com/youtube-to-mp3/22/

このアプリはとても優秀で、YouTubeはもちろん、それ以外にもSoundcloudやMixcloud等その他さまざまなサービス上の動画や音源をMp3に変換できます。

まずはiPhoneに入れたいYouTubeの動画を再生します。

その後、動画の下にある共有（画像中のSHARE）をクリックして、コピーします：
![copyurl.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/4347ec79-f401-ea20-07bd-89c40076e4c1.jpeg)

そしたら、先にダウンロードしたMediaHuman YouTube to MP3 Converterを起動します。

その上で`⌘`+`v`で貼り付けると次のように表示されます：
![dropto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/c783f087-0714-67de-c413-9534e6e7d641.png)

あとは右端にある下向き矢印のマークを押せばMp3への変換が始まります。

変換が終わると次のように”完了”の文字が表示されます：
![kanryo.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/8b004f7c-1038-40a7-b114-bbf8e3ef7bf9.jpeg)

## Macのミュージックappに入れる

まずMacでミュージックappを起動してください。

次に、Download by MediaHumanのディレクトリが作成されてるはずなので、そこにある.mp3ファイルをミュージックappにドラッグ&ドロップします：
![tomusciapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/cbc55850-c2e9-4e9a-3523-08f90d636a44.png)

Macのミュージックappに入ってることを確認します：
![kakunin.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/51f1fcf5-b6be-d28c-860d-f4956600ff80.jpeg)

以上の作業で、Mac上でYouTubeの音楽が聴けるようになりました。

次にこれをiPhoneと同期して、iPhone上でYouTubeの音楽が聴けるようにします。

# step2. パソコンとiPhoneを同期する

[USB-C - USBアダプタ](https://support.apple.com/ja-jp/guide/macbook-air/apd46ed8a373/mac)を使ってiPhoneとMacを繋げます。

その状態で、Macでミュージックappを起動すると左のバーの「デバイス」というところに「〇〇のiPhone」と表示されます。

そこを右クリックして「同期」を押します：
![douki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/ea71adb5-1d97-9280-2924-bb82017d2b1e.png)

同期には少し時間がかかります。

それが終わればiPhoneの方に音楽が入ってることを確認して終了です：

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/5b01acad-68fa-fd71-18cd-7bdafa2dd35c.jpeg" width=50%>
シッカリとエンジニアを目指す前に最低限押さえたい技術要素

# エンジニアのことがわかる様になりたいと言われる。
みなさん、言われますよね。

TechAcademy講師をやったり、社内のマーケターに技術的なことを教えたりする中で
エンジニアのことをわかる様になりたいと言われることが多くあります

端的にSQLやRailsを少し教えたところで
方法論がわかるだけで、本質的なことを理解してもらえないでしょう。

システムが動く原理、何が作れて何が作れないのかわかる様になり
自分で考える手段を得るには
私たちが歩んできた基礎をなぞってもらいましょう。

全てなぞる必要はないのです
私たちがやってきた事の中で重要だと思う部分をまとめましょう。


## ITパスポート(基本情報)の「テクノロジ系」分野
基本的にITパスポートや基本情報と聞くと業務で役立たないというエンジニアが多いと思います。

私もそうでしたが、 「基礎理論」「コンピュータシステム」「技術要素」の部分に関しては
ITパスポートの中で開発に必要な知識が詰まってる部分です

### 【TODO】 基本情報の本でテクノロジ分野だけ学びましょう
出来れば基本情報の本でテクノロジ分野だけ学びましょう
ITが苦手で少しわかれば良いと言うのであればITパスポートの書籍で学ぶと良いでしょう。

ちなみに、資格自体に価値はないので資格は取らなくて良いと思ってます。

## MacOS(Linux)に慣れよう
基本的にサーバはLinuxで動いてます、Windowsではありません。
なので開発もLinuxでやらないと、開発してた時は動いてたのに本番環境に反映したら動かなくなったとなります。

そこでAppleのMacです。
彼は実はLinuxと父親が同じなので、Macで開発したものは大体動きます。

その経緯から、ネットにある情報や本の解説は9割Mac向けに書かれてます。
Windowsで開発していると、これもMac向けの解説だ、この本もMac向けだ.......と絶望します。

Macと仲良くなりましょう。


## ターミナル（tarminal)に触れてみよう
tarminal、そう、あの黒い画面のプログラマーが触ってるやつ。
tarminalです、プログラミングを学ぶ上で必ず触ります。

プログラマーが触ってるので何やらすごく難しそうな雰囲気を感じているかもしれませんが安心してください

難しいこともできますが、基本はやってることなんて
ファイル開いたり、フォルダ作ったり、フォルダクリックしたりしてるだけです。

ネットで「Linux 基本コマンド」とか調べると無限に情報が出てきます。
基本Linuxと親が同じなのでLinuxのコマンドはMacで使えます。

どれでも良いので、普段行なっているファイル操作くらいはシェルでできる様になりましょう。


## git（バージョン管理ツール）を使ってみよう
開発を行う上で、必須中の必須ツールです。
きっと隣にいるエンジニアも使ってます。

これを使わないと言うことは、初見でFF（ファイナルファンタジー）をセーブなしでボス戦までプレイしろと言われる様なものです。無理ゲーです。

今後プログラミングを行う上で、すべてのコードを git を用いてバージョン管理しましょう。
必ずあなたを助けます。

1：さっきまで動いてたのに動かなくなった！
2：なんか動かなくなった！
3：何もしてないのに壊れた！
4：なぜか全てが消えた！

これらの災害からあなたを守ります

こちらもネット情報に無限に情報があります。
本を買っても良いですし、ネットで勉強しても良いです。

是非やりましょう。

## 初めてのプログラミング
ここまでやってきたあなたなら、プログラミングを始める準備はできています。
tarminal には実はデフォルトでプログラミング言語がインストールされてます

ターミナルで irb とタイプしてエンターを押してみましょう。

rubyというプログラミング言語が使えます。

プログラミング言語何を学ぶかはやりたいことによって変わります。
是非ここからは自分で学びたいことを決めて学び始めましょう。
Recoilについて

最近注目されているRecoilについてです！

# Recoilとは？
Recoilは、Meta（旧Facebook）が2020年5月頃に発表した状態管理ライブラリです。
現在まだ***実験的な状態管理ライブラリ***になりますので、実際の案件で使用することは現段階ではまだ難しいと思います。

# そもそもRedux（useState）とRecoilの違いとは？
Reactの状態管理といえば、Reduxだと思いますがReduxとRecoilの違いについて気になると思います。
ReduxとRecoilでは、「***グローバルな状態管理が可能になる***」という点では同じですがそれぞれの状態を個別に管理できるということが、ReduxとRecoilの大きな違いではないかなと思います。
Recoilでは、[Atom](#Atom)を受け渡すだけで、どのコンポーネントでも変更が可能ということにです。
ReduxとRecoilの使い分けとして、少数のコンポーネントで状態管理を行う際は`Redux`で、複数のコンポーネントで状態の変更を行う祭は`Recoil`となると思います。

それでは、実際に`Recoil`の使い方について説明させていただきます！


# Recoilをインストール
まずは、Recoilをインストールします。

✅ npmの場合
`npm install recoil`

✅ yarnの場合
`yarn add recoil`

✅ TypeScriptに対応する場合
`npm install --save @types/recoil`


# RecoilRootの設定

Recoilを使用するために、対象のスコープの外側を`RecoilRoot`で囲む必要があります。
`RecoilRoot`で囲むことでグローバルな状態管理をすることができます。

```javascript
import React from 'react';
import {
  RecoilRoot,
  atom,
  selector,
  useRecoilState,
  useRecoilValue,
} from 'recoil';

function App() {
  return (
    <RecoilRoot>
      <CharacterCounter />
    </RecoilRoot>
  );
}
```

# Atom
`Atom`とはRecoilにおけるデータストアのことで、***状態の単位***になります。

```javascript
const textState = atom({
  key: 'textState', // unique ID (with respect to other atoms/selectors)
  default: '', // default value (aka initial value)
});
```

`Atom`からの読み取りと、`Atom`への書き込みが必要なコンポーネントは、`useRecoilState()`以下に示すように使用する必要があります。
状態の取得だけしたい場合は`useRecoilValue()`を使い、状態の更新だけしたい場合は`useSetRecoilState()`を使用します。

```javascript
function CharacterCounter() {
  return (
    <div>
      <TextInput />
      <CharacterCount />
    </div>
  );
}

function TextInput() {
  const [text, setText] = useRecoilState(textState);

  const onChange = (event) => {
    setText(event.target.value);
  };

  return (
    <div>
      <input type="text" value={text} onChange={onChange} />
      <br />
      Echo: {text}
    </div>
  );
}
```


# Selector

`Selector`は、`Atom`の状態を加工した値を返したり、更新するなどの処理を可能にします。

```javascript
const charCountState = selector({
  key: 'charCountState', // unique ID (with respect to other atoms/selectors)
  get: ({get}) => {
    const text = get(textState);

    return text.length;
  },
});
```

# まとめ
今回、注目の`Recoil`の使用方法についてまとめました。
まだ実験的なライブラリなので、情報収集程度に記事を読んでいただけたらと思います。


### 参考記事
✅ 公式ドキュメント
https://recoiljs.org/

✅ Github
https://github.com/facebookexperimental/Recoil

https://zenn.dev/yuki_yuki/articles/c3bac6943f70b6

https://ics.media/entry/210224/
[Flutter] 良さそうなタイマーのパッケージ集

![eyecatch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/1548cf0f-461d-5759-8288-47f0fa1bfd72.png)


こんにちわ。アプリ開発をする中で、ゲームに近いようなタイマーを作ろと思った時に、Dart Packageで何かいいものはないかと探してみた結果、色々あったので共有します👍


## time_remaining

https://pub.dev/packages/time_remaining

## slide_countdown

https://pub.dev/packages/slide_countdown

![slidecountdown_separated.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/3d9066af-4e37-d887-d0b6-23f8f5fe6a47.gif)


## cupertino_timer

https://pub.dev/packages/cupertino_timer

![Advanced.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/6d6c6419-6baf-a3b7-2bf8-7e7ebda79049.png)


## 最後に

ぜひ使ってみてください。もし良さそうなものがあれば、教えてもらえると嬉しいです。
我が家にVRがやってきた

![スクリーンショット 2022-05-20 22.18.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/42a32b1b-e579-9502-afb6-c220cf9273ec.jpeg)

先日、Meta社が初の実店舗"Meta Store"がカリフォルニアでオープンし話題となり、メタバースの発展は更なる盛り上がりを見せている。

>参考 : exciteニュース　
[「Meta初の実店舗「Meta Store」がカリフォルニアにオープン、デバイス購入や体験スポットに」](https://www.excite.co.jp/news/article/MoguraVR_meta-store/)


そんな中、私もついに念願のVRゴーグルを手に入れたので、今日は「Oculus Quest 2」(Meta Quest 2)について良い点、悪い点などを実際に使用してレビューを行っていく。因みにストレージは256Gで約４万円した。専用のケーブルでPCコンテンツも使用可能だが、今回は本体のみで遊べる「**スタンドアローン型**」として遊んでいく。

![オキュラス2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/993480a9-7d69-5dc1-4b3d-340cca824a19.jpeg)


## 開封
一応開封から書いていく。想像より大きい箱に入ってきた。VRゴーグルは初めて手にするが少し重いかな？という感じ。ゴーグルを固定するバンドは白いゴム的な素材で、初代Oculus Questよりはチープだが使いやすくなったらしく、個人的には満足なかけ心地だ。肌と接する所はグレーのスポンジだがラバーのカバーがついてきたので、衛生的にも安心出来る。コントローラーは想像より軽いが、乾電池式なのが少し残念。そしてよく左右を間違える。

![IMGｆ_1192.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/b1af2961-50bd-513f-6b6c-37cadcfb8f88.jpeg)


## 電源ON！
とりあえずゴーグルを被って電源を入れてみた。
人生初、3D映像によるチュートリアルが一通り終わると"デスクトップ"的な位置づけの場所につく。本当に別の世界に居る様な没入感には素直に感動した。ただ画像は若干粗い印象。初期設定は和風な所だったが、せっかくVRなので非日常を味わえる、下の写真の様な場所に変更した。チルっている。

![スクリーンショット 2022-05-20 22.24.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/03cba93e-f2ec-56a2-9d61-89e9c1f53cbb.jpeg)

## 感動したこと
初VR体験をしてみて、感動した事はこんな感じ。

○音が良い
→眼鏡でいうテンプル（耳の所）から音が出ているので、音に臨場感があり没入感を更に上げている。

○「ガーディアン」が設定出来る
→ガーディアンという、現実世界での行動範囲を設定出来るので、障害物や壁に当たる心配が無い。

○好きな時に現実の周りが見える
→こちらも設定で、ゴーグルを２タップすると、ゴーグルを着用したまま、周りを見る事が出来るので、部屋を歩く時に、わざわざ着脱しなくても良い、面倒臭がりにはマスト機能。

○手でも操作出来る
→コントローラーが無くても、素手である程度の操作が出来、手の形で操作方法が変わるという便利機能も。(下の画像はメニューを出しているところ)

![スクリーンショット 2022-05-20 22.25.39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/891a3948-8c38-7c7c-3c98-cc8c410d32cc.jpeg)

## 気になった事
✔︎少し重い
→体感としては１時間はつけ続けられないくらい。(ただ他社製品より軽めらしい)

✔︎画質
→360°で楽しむならYouTubeだと4K以上は必須。

✔︎動きが重め
→スタンドアローンだからなのか我が家のWi-Fiが悪いのか、少し動きが遅く感じる時がある。

✔︎酔う
→リフレッシュレート90Hz、視野角110°と良い感じのスペックではあるが、アプリによっては一瞬で酔う、少し慣れも必要。酔い止めで対処する方法もあるくらいだ。

✔︎英語が多い
→通常行っている様な翻訳はVR上で,いざという時出来ないので、大体「Agree」を押しているが、きっと危険。頭を良くするしかない。

## まとめ
ゴーグルに関するレビューだと、ざっとこんな感じだろうか。
感想を一言で言うなら、とても楽しかった。特にYoutubeで色んな国のツアー動画を360°で見たが、本当に旅行している気分になれて非常に良い経験をした。
Oculus Quest 2は対応アプリも多く、他の端末レビューを見てもコスパは高い思われる。
今後もこの端末を使って、様々なチャレンジをして、また記事に残していく予定だ。
皆にも是非VRゴーグルを試してみほしい。
酔い止めを飲んでから、、、

[→ Meta Quest 2公式ページ](
https://store.facebook.com/jp/quest/?utm_source=gg&utm_medium=ps&utm_campaign=11066622607&utm_term=%2Boculus%20%2Bquest%20%2Bvr&utm_content=597074009979&utm_ad=104309082130&utm_location=20636&utm_location2=&utm_placement=kwd-753028195160&utm_device=c&utm_matchtype=b&utm_feed=&utm_adposition=&gclid=Cj0KCQjwm6KUBhC3ARIsACIwxBhyQ8tVn73-1TMz16A5ZAIfaAzDgGUd9wgUyO_ahVPXcK_BgCLvrXcaAvRkEALw_wcB&gclsrc=aw.ds)
Azure Resource Mover でAzureリソースを別のサブスクリプションに移動する  

## はじめに
Azureを利用していてAzureリソースを別のサブスクリプションに移動したくなる場面があるかと思います。
そんな時はAzure Resource Mover というサービスを利用すると簡単に移動することができます。
本記事ではAzure Resource Mover を利用した移動手順の概要と移動前の確認事項について記載します。

## Azure Resource Mover とは

> - 単一のハブを使用してリージョン間でリソースを移動できます。
> - 移動時間と複雑さを軽減できます。 必要なものをすべて 1 か所にまとめることができます。
> - シンプルかつ一貫性のあるエクスペリエンスによって、さまざまな種類の Azure リソースを移動できます。
> - 移動するリソース間の依存関係を簡単に識別できます。 これにより、関連リソースをまとめて移動することができるため、移動後にすべてのリソースがターゲット リージョンで期待どおりに動作します。
> - 移動後にソース リージョンのリソースを削除する場合は、自動的にクリーンアップされます。
> - テスト。 移動を試してみて、完全に移動することは望まない場合は破棄することができます。

https://docs.microsoft.com/ja-jp/azure/resource-mover/overview#why-use-resource-mover

リージョン間の移動用途だけでなく、リソースグループ、サブスクリプション間の移動にも利用することができます。

## 移動手順の概要
1. Azure管理ポータルよりAzure Resource Mover を選択
　　![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177177/9a9a919d-5296-2172-0da3-961560c7e4ef.png)

1. サブスクリプション間の移動を選択
　　![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177177/581736b1-3036-f642-b822-08819d1728a1.png)

1. 移動元及び移動先のサブスクリプション、リソースグループを選択​
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177177/a3aab5a2-cd4c-4dde-5223-6e99104acc8b.png)

1. 移動するAzureリソースを選択​し、移動の検証を実施
   - Azure Resource Mover により、移動するAzureリソースの依存関係の確認が行われます​
   - [移動をサポートしているAzureリソース](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/move-support-resources)なのかの確認も行われます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177177/123935d3-3003-e7e1-5106-32e6aa4dc382.png)


1. 検証が成功していることを確認し、リソース移動を実施

## 確認事項
リソース移動時の確認事項については下記公式ドキュメントにまとまっています。
https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/move-resource-group-and-subscription#checklist-before-moving-resources

移動するAzureリソース間の依存関係や移動をサポートしているAzureリソースなのかは
Azure Resource Moverがチェックしてくれますが、下記については移動前に確認しておいたほうが良いかと思います。
1. 移動元と移動先のサブスクリプションがアクティブであること。
2. 移動元と移動先のサブスクリプションが同じ Azure Active Directory テナント内に存在していること。 
3. ソース、ターゲットのリソースグループに必要なアクセス許可がされていること。
   - ソース リソース グループの Microsoft.Resources/subscriptions/resourceGroups/moveResources/action
   - ターゲット リソース グループの Microsoft.Resources/subscriptions/resourceGroups/write
4. リソースの移動先となるサブスクリプションのクォータの制限を上回らないこと。 
 

## おわりに
最後まで記事を読んでくださり、ありがとうございました。
これからAzureリソース移動を検討している方の参考になれば幸いです。

## 参考文献
- [サブスクリプション間のリソース移動](https://jpaztech1.z11.web.core.windows.net/%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%93%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E7%A7%BB%E5%8B%95.html)
Railsのdraper decoratorでtagヘルパーを使いたい。例えばtag.span("hello")などと。

## やりたい事
Railsのdraperのdecoratorで、スマートにHTMLタグを生成したい。
今回は例えで`"<span>hello</span>"`をば。

`"<span>hello</span>".html_safe`でもできるけど、tagヘルパーを使ってもうちょいスマートに。

- tagヘルパー参考サイト
  - https://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-tag
  - https://techracho.bpsinc.jp/hachi8833/2022_01_13/48191

## 実装！

単にこう書いただけではエラーになる。
```ruby:app/decorators/hello_decorator.rb
>> tag.span('hello')
=> undefined local variable or method 'tag' for #<HelloDecorator:0x00000000000> Did you mean?  tap
```

### 答え１

```ruby:app/decorators/hello_decorator.rb
>> ApplicationDecorator.helpers.tag.span("hello")
=> "<span>hello</span>"
```

### 答え２

Draperのドキュメントをちゃんと読むと、もっと簡単に書けるらしい。
https://github.com/drapergem/draper#accessing-helpers

```ruby
>> h.tag.span("hello")
=> "<span>hello</span>"
```

毎度ありがとうございます、　@Y_uuu さん。
CUDA11.3 インストール(Ubuntu18.04)

CUDA11.3を選んだ理由は、Pytorchが2022/5/16時点では10.2と11.3に対応しているから。
<img width="831" alt="image.png (45.5 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2022/05/16/111414/73ba7ad6-abbf-4ab7-8ba5-a04fa0d6d5ae.png">

## インストール
https://developer.nvidia.com/cuda-toolkit-archive
↑ここからCUDA11.3を選択する

Installer Typeはdeb(network)を選んだほうが早くインストールできる、最後の```sudo apt install cuda```は```sudo apt install cuda-11-3```とする。こうした方が確実。
<img width="1323" alt="image.png (105.9 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2022/05/16/111414/c8c8bf7e-d234-49ab-b25c-239e576acdfa.png">
インストール後はbashrcを以下のとおりに変更する。
```
export PATH=/usr/local/cuda-11.3/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH
```
### バージョン確認
```
sudo apt install nvidia-cuda-toolkit
nvcc -V
```
<img width="435" alt="image.png (22.1 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2022/05/16/111414/ee517f24-f135-499e-a4b9-6dee1aa21b29.png">

## CUDAを消したい or 入れ直したい
これで元どおり。
```
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
```
## 参考
- https://qiita.com/1O1/items/c7b0cec503d48b2efde1
- https://qiita.com/Yoshitaka_Engineer/items/bd8edcb36396df878641
【メモ】特定のサイトのキャッシュを消したい



ローカルで開発中に、DBを入れ替えたが
ログイン情報が消えておらずエラーになってしまいました。
(google chrome)

検証モードで更新ボタンを右クリック、
「キャッシュの消去とハードの再読み込み」を行いましたが
改善されず。。。

そんな時に、下記の方法でキャッシュをクリアできました。

画面樹で右クリック→検証を選択
Elementsなど並んでいる項目で「Application」を選択
storage内の「clear site date」をクリック
![スクリーンショット 2022-05-23 17.11.13.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635167/41a2a88b-b5a9-ee9f-605f-5a5001aff3e3.jpeg)




以上です。
下記記事を参考にしました。

●参考記事
https://www.searchlight8.com/chrome-cache-delate/
Spring Boot設定ファイル読み込み

# 設定ファイルに記述
Spring Bootではapplication.ymlやapplication.propertiesに設定項目を書き込んでいく。
例
```yml
server:
  port: 8080

api:
  host: [ホストのドメイン]
  port: 8080
```

# 読み込み
設定ファイルに項目を書き込んだ後には読み込みが必要。ここで<span>@</span>ConfigurationPropertiesアノテーションを使用することで、Config用のクラスから読み込み可能。通常はセッターでプロパティを設定する必要があるが、<span>@</span>ConstructorBindingを使用することで、コンストラクタで初期化時でプロパティを設定し、以降は変更しないようにできる。（セッターは不要）
```java
@ConstructorBinding
@ConfigurationProperties(prefix = "api")
public class ApiConfiguration {
    private final String host;
    private final int port;

    public ApiConfiguration(String host, int port) {
        this.host = host;
        this.port = port;
    }

    // getterは略。実装は必要。
}
```
# 使用
実際の通信はDAOに任せるので、上の例ではDAOの実装クラスで使えれば良い。なので、DAOのプロパティにApiConfigurationを定義し、コンストラクタインジェクションを行えば良い。また、インジェクション後にゲッターでhostとportを取ってきて、urlを作成するにはInitializingBeanを実装しafterPropertiesSetをオーバーライドすれば問題なくいける。Apiが呼び出されるたびにhostとportをgetしてきてもいい気はするが、無駄を省くならインジェクション後に行うべきなのかもしれない。
VimeoをWordpressのPHP内で出力する

VimeoのリンクURLは記事にそのまま突っ込めば、あとは勝手にiframeを生成してくれます。（oEmbed APIという機能）
ただ、これをPHPで出力しようと思うと別の関数に渡して上げる必要があります。

# wp_oembed_getを使う

```php
<?php
  //カスタムフィールドの値を取得
  $vime_url = get_field( 'vimeo_url' );// https://vimeo.com/xxxxxx
  //Vimeoのiframeを取得
  $embed_code = wp_oembed_get( $vime_url );// <iframe....
  //出力
  echo $embed_code;
?>
```
Web入門　HTTPS

# HTTPS
インターネット普及のためにありとあらゆる情報が行き来するようになった。
その中でもショッピング、チケット予約で使う。クレジットカード番号などの個人情報が盗まれる可能性が出てきた。
そこでデータを守る仕組みで```HTTPS```が出てきた。
```HTTPS```とは略称で "HTTP over SSL/TLS" と呼ばれる。
どのようにして安全性を確保しているのか？

## 安全性を確保する仕組み
### 盗聴防止(暗号化通信）
Webサイトを閲覧するときは実際いくつものサーバーを通っている。
そのため通信内容を見ることは簡単です。
なのでみられてもいいように通信内容を暗号化している。

### 改ざん防止
送信するときに```メッセージダイジェスト（計算法）```を利用してそこから送信するデータのハッシュ値を計算してデータと一緒に送る。
#### 思ったこと
途中で改ざんすればメッセージダイジェストで新たにハッシュ値が生成されるからそれと比べられるのかな。
どうやって比べられるのかな？
とりあえず元のハッシュ値は改ざんされても残るんだな。

### なりすまし防止(Webサイト運営元の確認)
サーバーの信頼性があるかを確認するために証明書が発行される。
それが```SSLサーバー証明書```だ。
これは誰でも発行することができる。
しかし信頼された```認定局```以外のSSLサーバー証明書の場合は信頼性が低いのでWebブラウザ上で警告画面が表示される。

とは言ってもいきなりHTTPS通信は始まらない。
手順がある。その手順を```SSL/TLSハンドシェイク```という。

# SSL/TLSハンドシェイク
この手順には４つある。
### 暗号化方式の決定
WebブラウザとWebサーバーの両方が利用可能な暗号化方式を決める。
またHTTPSで利用されるSSL、TLSのバージョン、
そしてメッセージダイジェストの方式も決定する。

### 通信相手の証明
通信相手のWebサーバーが正しい相手なのかを確認する。
そのためにSSLサーバー証明書で確認する。

### 鍵の交換
ここで暗号化方式の決定、通信相手の証明もされたので
ようやく
暗号化するための鍵をサーバーに渡す。
（自分とサーバーにしかわからないようにするため）

### 暗号化方式の確認 
今までの手順で確認できたので今までの確認を改めて再確認する。
これでHTTPSの通信が始まる。

出典 Web技術の基本（SBcreative)
Elixir:List[1, 2, 5, 4, 3]って数字が並ぶ配列みたいだけど、違うんです


はじめに
----
ElixirのListは`[1, 2, 5, 4, 3]`とデータがならんでいる配列のように記述しています。
また、`[head | tail]`と最初のデータを`head(1)`と残りを`tail([2, 5, 4, 3])`となっています。

ここでは、どうしてこのように書く必要があるのか、データ構造を含め、説明したいと思います。


リストって何だろう
-----
メモリ上、リストって以下のような構造になっています。

![liststructure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146500/74e9b9e6-8fa5-abb3-67ee-e6150e1b81b7.png)

次のデータを指す情報(ポインタ)とデータと繋がっています。
`[1, 2, 5, 4, 3]`は 
```mermaid
flowchart LR
1 --> 2 --> 5 --> 4 --> 3
```
となり、便宜上、データが並んでいる配列のように書き、`リスト`としています。



縦一列に並んでいる人を真正面から見る
-----
メモリの構造、ポインタといっても良くわからないので、例として、縦一列に並んでいる人を考えます。
![rowingpic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146500/ea688bb3-ad1b-31f5-238e-5dc6dbba23b8.png)

真正面から見た時、先頭の顔しか見えず、その後ろの人が誰なのかわかりません。
そして、次の人が誰であるかは先頭の人が回れ右と後ろに向き直し、と次の人を見て初めてわかります。
次の人が誰かはその前の人しか、わからないんです。

`[1, 2, 5, 4, 3]`のリストは先頭(head)は何かはわかるが、後残り(tail)は何かわからず、並んでいる列(リスト)でしかありません。そして、先頭(head)を読んで、初めて次のデータが読むとの順番で繰り返しとなります。

`[head | tail] = [1, 2, 5, 4, 3]`では`head`: 1、`tail`: [2, 5, 4, 3] (リスト)と、先頭データと残りリストとなり、記号`,`でなく、記号`|`で繋ぎます。

この事から`[1, 2, 5]`は実際には`[1 | [2 | [5 | []] ] ]`となりますが、便宜上、`[1, 2, 5]`と書きます。

では、配列の場合はどうなんでしょう。配列は横一列に並んでいて、左から何番目(添字)の人が誰かわかると言ったものになります。
`a[5] = [1, 2, 5, 4, 3]`でa[0]:1、a[1]:2、a[2]:5、...となります。

配列にしないのはなぜ?
-----
今、a[4] = [1, 2, 4, 3]と言う配列があるとします。ここで`2`と`4`の間に`5`を割り込んで入れる事とします。
`5`を途中に入れるため、厄介な事に`4`、`3`をずらす必要があります。a[3]:3 -> a[4]、a[2]:4 -> a[3]、`5` -> a[2]
[1, 2, 5, 4, 3]となる。つまり、追加または削除したデータ以降の番号付けをすべて変える必要があります。

リストの場合は、`[2] -> [4]`の間に`[2]`の繋がる先を`[5]`に変え、`[5]`の繋がる先を`[4]`にする、繋ぎを変更するだけとなり、データの追加、削除が簡単になります。
![Screen Shot 2022-05-23 at 3.46.55 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146500/2ba54ac3-037b-204e-8d1d-c4c42ba1ef67.png)

もうひとつの利点は配列の場合、データのサイズによりどのように保存するかが問題となりますが、リストの場合、データはどこにあっても良く、サイズには影響はありません。データが新たな違うリストでも構わないんです。`[1, 2, [5, 4], 3]`


最後尾から見るなんて無茶な
-----
`[1, 2, 5, 4, 3]`の3番目は何かを見ようとすると、先頭から順番に見ていくため、3回目で初めて、`5`なんだとわかります。
このリストを最後尾から順番に見ていこうとすると、先頭から順番に見て、5回目に`3`とわかり、次に再度先頭から順番に見て4回目に`4`とわかると言った毎回先頭からとなり、先頭を読むまで、5 + 4 + 3 + 2 + 1 = 15回も検索する必要があります。

従って、リスト(片方向リスト)では最後尾から読んでいく場合、一旦reverse()によりリストを並び替えるのが一般的です。

縦一列に並んでいる人全員が一旦後ろに向き直し、後ろが順番に見ていくと上記の場合、5回で済みます。


ついでに、Mapデータってハッシュテーブルなんだ
------
Listデータの他にMapデータがあります。
`map = %{:foo => "bar", "hello" => :world}`
ハッシュテーブルとはkeyデータを元にハッシュ計算により求めた指定位置にデータが保存しているものです。
これにより、データの数が何個あっても、keyにより、一回でデータを求める事ができます。
Mapデータはこのハッシュテーブルにより、keyとデータとの関連テーブルが作られています。
従って、データ数により、回数が変わるListとは違い、Mapの場合は一回となります。それと同時にデータの順番は全く意味がなくなります。


[ハッシュテーブル詳細](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)


まとめ
-----

* Listデータは片方向リストで `[先頭データ | 残りリスト]`の構造になっていて、配列とは違うもの。
* 検索はデータ数で決まる。
* 先頭から処理するのが普通だが、最後尾からする場合は一旦reverse()により並び変えてからする。
* Mapデータはkeyによる一回で検索するデータで、データの順番は関係がない。

となります。
rspecでETagのテストを追加した

## 背景
Android端末とサーバーの同期（一方通行）を実装するために、ETagを使いました。サーバーのコードを変更したため、テストを追加した

## サーバー側
```ruby
def sync
    return unless stale?(@program)

    render json: { success: 1, data: @program }
  end
```

## Rspec
```ruby
context "on a subsequent request" do
      before(:each) do
        # first time request
        get api_sync_path, params: { device_id: device.id }
        assert_response 200, response.body
        @etag = response.headers["ETag"]
      end

      context "check ETag exist" do
        it 'both should exist' do
          expect(@etag).to be_present
        end
      end

      context 'when no update' do
        before(:each) do
          @headers = { "ACCEPT" => "application/json", "HTTP_IF_NONE_MATCH" => @etag }
        end

        it 'should return 304' do
          get api_sync_path, params: { device_id: device.id }, headers: @headers
          assert_response 304, response.body
        end
      end

      context 'when there is update' do
        before(:each) do
          @headers = { "ACCEPT" => "application/json", "HTTP_IF_NONE_MATCH" => @etag }
          # program_slot.touchだと時間が短すぎて、変わらない可能性がある
          program_slot.update(updated_at: 1.hour.from_now)           
        end

        it 'should return 200' do
          get api_sync_path, params: { device_id: device.id }, headers: @headers
          assert_response 200, response.body
        end
      end
    end
```

## 参考
- [Caching with Rails: An Overview — Ruby on Rails Guides](https://guides.rubyonrails.org/caching_with_rails.html#conditional-get-support)
- [Introduction to Conditional HTTP Caching with Rails](https://thoughtbot.com/blog/introduction-to-conditional-http-caching-with-rails)
- [request spec \- Request specs \- RSpec Rails \- RSpec \- Relish](https://relishapp.com/rspec/rspec-rails/v/5-1/docs/request-specs/request-spec)
Reactのコンポーネント指向について

Reactに入門しましたが、「コンポーネント指向」「コンポーネントの責務」「コンポーネントのカプセル化」などなど。
「コンポーネント」というキーワードをよく使います。
そもそも「コンポーネント」についてしっかり調べようと思いました。

# コンポーネントとは
javascriptの関数と似ている。
任意のデータ(props)を受け取り、画面を構成するReact要素を返す。
UIを独立したコンポーネントに分割することで、部品として再利用できるようになる。
また、それぞれの部品を分離して考えることができる。（新しい部品を追加しても影響を受けない）

**コンポーネントはロジックと見た目をあわせもったもの。関数のようにロジック機能があり、React要素を返すことで見た目を作り出している。**

# コンポーネント指向（コンポーネントベース）
Reactの3つの特徴の一つに「コンポーネントベース」がある。
>自分自身の状態を管理するカプセル化されたコンポーネントをまず作成し、これらを組み合わせることで複雑なユーザインターフェイスを構築します
参考URL：https://ja.reactjs.org/

##### カプセル化されたコンポーネント？
カプセル化の目的はコンポーネントを保護にある。
コンポーネントの変更はStateなどの状態に任せることで、コンポーネントの不正な変更を防ぐことができる。これによってバグ（不整合）を回避する。
![カプセル化されたコンポーネント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/ecffafe1-cb1a-00d5-506b-85595d4e8196.png)

##### カプセル化を壊すことはおすすめしない
> **DOM の Ref を親コンポーネントに公開する**
> まれに、親コンポーネントから子コンポーネントの DOM ノードにアクセスしたい場合があります。**これは、コンポーネントのカプセル化を壊すため、一般的にはおすすめできません**が、フォーカスを発火させたり、子の DOM ノードのサイズや位置を計測するのに役立つことがあります。
参考URL：https://ja.reactjs.org/docs/refs-and-the-dom.html


- フォーカスを発火
- 子のDOMノードのサイズや位置の計測

Reactでは、これらの例以外での使用はおすすめしてない。
使用は限定的にすることで、コンポーネントの不正な変更を防ぐことができる。

> React 16.3 以降を使用している場合、これらの場合には
**ref のフォワーディング を使用することをおすすめします。**
Ref のフォワーディングを使うと、コンポーネントは任意の子コンポーネントの ref を自分自身の ref として公開できるようになります。

親が子コンポーネントにアクセスする場合は、Refのフォワーディングを推奨。（React 16.3以降）

##### getElementById()を使うこともカプセル化を壊すのでは？
getElementById()は使えるが・・・
使う場所や用途に気を付ける必要がある。
- 仮想DOMでidを使うとレンダリング時にid名が被る可能性がある
- DOMを直接操作するのでstateに関係なく書き換えができてしまう（カプセル化を壊す）

これらの理由でバグの温床になるのではないかと考える。
レンダー先のコンテナの指定くらいにとどめて、あまり使うべきではなさそう。


# 単一責任の原則
Reactの流儀の中で、 UI をコンポーネントの階層構造に落とし込む際には単一責任の原則が理想とされている。
これは、コンポーネントの変更理由（状態）は一つであることが理想的であるということ。コンポーネントが変更される場合はそのコンポーネントの状態を変更することになる。
つまり、他のコンポーネントがあるコンポーネントを変更したい場合は、コンポーネントにアクセスするのではなく、そのコンポーネントの状態を変更して渡すことになると考える。![カプセル化での操作.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/507dbc6b-a1ac-1a4d-62ef-285511dc1625.png)

![単一責任.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/3884383d-dd96-6bba-ca7a-fa6170b634b0.png)

> ひとつのコンポーネントは理想的にはひとつのことだけをするべきだということです。将来、コンポーネントが肥大化してしまった場合には、小さなコンポーネントに分割するべきです。
参考URL：https://ja.reactjs.org/docs/thinking-in-react.html#step-1-break-the-ui-into-a-component-hierarchy

# コンポーネントは小さく
小さなコンポーネントに分割されていれば、コンポーネントの責務も小さくなる。
確認すべきコードも短くなるので、管理面でのメリットがある。
注意しなくていけにことは、コンポーネントの粒度は開発者によって異なること。すり合わせをしていく必要がある。

# 参考
https://ja.reactjs.org/docs/components-and-props.html

https://www.i3design.jp/in-pocket/8854

https://zenn.dev/panda_program/articles/deep-dive-into-react#component-based-%E3%81%BE%E3%81%A8%E3%82%81
Nuxt, TypeScriptのスニペット設定(vscode)

NuxtJSのTypescript環境でテキストタイプがvueに対してスニペットを登録するが候補に上がってこなくすんなり設定できなかったので備忘録。
setting.jsonにて``editor.snippetSuggestions:"top"``は設定済みでした。

## 解決
グローバルスニペット用のファイルを作り、項目``scope``を追記して設定。

```json
{
	// Place your GLOBAL snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
	// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
	// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
	// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
	// Placeholders with the same ids are connected.
	// Example:
	"Print to console in vue ts": {
		"scope": "typescript,vue",
		"prefix": "log",
		"body": [
			"// eslint-disable-next-line no-console ",
			"console.log($1)"
		],
		"description": "Log output to console"
	}
}
```

## 過程

テキストタイプがvueだったのでvue用のスニペットを最初作成していました。
vscode左下の設定からユーザースニペットをクリックしvueを入力しファイルを作成。
登録したいスニペットの内容を記述しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974496/d788b562-ecc6-ece1-ec76-644c23b1d2e1.png)

実際vueファイル上で目的のものを打ってみても候補に上がって来ないので調べたところ
scopeを設定している人もいるようなので設定してみましたが
``Property scope is not allowed``
の表示がされたのでちがうなと…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974496/a3f41a53-b779-2520-1e7f-27e655639dd7.png)




試しにグローバルスニペットファイルを作成し、scopeの設定すると上記の表示がされなかったので
グローバルスニペットファイルで設定したところ無事に登録したスニペットが候補に上がってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974496/2145a2e6-f7c8-cb7e-2d02-4d39a72f944e.png)
情報システム戦略とシステム企画

## 情報システム戦略
経営戦略について情報システム全体のあるべき姿を明確にする。
### 全体最適化計画
<b>全社的な観点から情報システムのあるべき姿を明確にする計画。組織全体で整合性・一貫性を確保した情報化を推進していくことを目的に計画する。
### 情報システム管理基準
<b>情報システムの管理を効果的に行うための実践規範を、経済産業省が体系的にまとめたもの。
### CIO
<b>全社的な観点から情報戦略を立案し、経営戦略との整合性の確認・評価を行う役員のこと
### ITガバナンス
<b>情報システム戦略の策定と実行をコントロールする組織の能力のこと。
## EA
<b><font color = blue>エンタープライズアーキテクチャ</font>は、各業務と情報システムを、全体最適化の観点から見直すための技法。現状の姿(<font color = blue>As-lsモデル</font>)とあるべき理想の姿(<font color = blue>To-Beモデル</font>)との差を分析(<font color = blue>ギャップ分析</font>)しながら改善していく。

![key43_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/0eb4c97d-3db0-acb7-4bee-1be44de0c4aa.gif)
## 共通フレーム
<b>ソフトウェア開発作業全般にわたって「共通の物差し」となるガイドラインのこと。作業内容・範囲を明確にし、取引内容を可視化する。<font color = blue>共通フレーム2013</font>ともいわれている。
## 企画プロセス
### システム化構想
<b>経営事業の目的・目標を達成するために、経営上のニーズと課題を確認し、経営戦略に基づいたシステム化の方針を立案すること。
### システム化計画
<b>システム化構想を具現化する為に立案する計画。対象業務・スケジュール・体制・役割・コストなど。
## 要件定義プロセス
<b>利用者のニーズを整理し、新たに構築する業務とシステムの仕様や範囲を明らかにして、利害関係者間で合意する。
<font color = blue>業務要件</font> - 業務上実現すべき要件であるもの。
<font color = blue>機能要件</font> - 業務要件の実現のために必要なシステムの機能。
<font color = blue>非機能要件</font> - 機能要件以外の性能・信頼性・セキュリティ・移行方法・運用方法など。

## 調達計画・実施
### RFI
<b><font color = blue>情報提供依頼</font> - ベンダ企業に対して、システム化の目的や業務内容などを示し、利用可能な技術や製品、導入実績などの実現手段に関する情報提供を依頼すること。
### RFP
<b><font color = blue>提案依頼書</font> - ベンダ企業に対して、対象システムや調達要件などを示し、提案書の提出を依頼する文書のこと。
### 提案書
<b>ベンダ企業がRFPを基に開発体制、システム構成、開発手法などを検討し、提案する文書。
### 見積書
<b>ベンダ企業がシステムの開発や運用、保守などにかかる費用を提示する文書。
### NDA
<b>秘密保持契約のこと。
### CSR
<b>企業が本来の営利活動とは別に、社会の一員として社会的責任を果たすこと。
環境への配慮を行っている情報通信機器を選定する<font color = blue>グリーンIT</font>など。
国の機関は<font color = blue>グリーン購入</font>を義務付けられている。
Promise の then() / catch() / finally()　とは何か？

- then()  は、 Promise のインスタンスの状態が fulfilled となったときに実行する関数を登録できるインスタンスメソッドです。
- catch()  とは、 Promise のインスタンスの状態が rejected となったときに実行する関数を登録するインスタンスメソッドです。
- nally() は、処理が成功しても失敗してもいずれの場合でも最後実行される関数を登録するインスタンスメソッドです。