OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle Cloud Platform for Integration

統合のためのオラクルクラウドプラットフォームは、データ統合(Data Integration)、アプリケーション統合(Application Integration)、デバイス統合(Device Integration)の三つの主要分野があります。
それぞれの分野で提供しているプラットフォームサービスと公式リファレンスをリストアップします。

## データ統合

### Oracle Data Integration Platform Cloud (DIPC)

[Oracle Data Integration Platform Cloud](https://docs.oracle.com/en/cloud/paas/data-integration-platform-cloud/)

## アプリケーション統合

### Oracle API Platform Cloud Service

[Oracle API Platform Cloud Service](https://docs.oracle.com/en/cloud/paas/api-platform-cloud/)

### Oracle Integration Cloud (OIC)

[Oracle Integration Generation 2](https://docs.oracle.com/en/cloud/paas/integration-cloud/index.html)

### Oracle SOA Cloud Service

[Oracle SOA Cloud Service](https://docs.oracle.com/en/cloud/paas/soa-cloud/)

## デバイス統合

### Oracle Internet of Things Cloud Service

[Oracle Internet of Things Cloud Service](https://docs.oracle.com/en/cloud/paas/iot-cloud/index.html)
pythonで変数が存在しているかどうかは`locals()`で判断すればOK

pythonで変数が存在しているかどうかは`locals()`で判断すればOK

```python:test.py
## in
if 'num' in locals():
    print('param exist')
else:
    print('param not exist')

## not in
if 'num' not in locals():
    print('param not exist')
else:
    print('param exist')
```

実行結果

```
$ python test.py 
param not exist
param not exist
```

# 参考

https://yumarublog.com/python/variable-ver/
リファクタリングでお世話になったQiita記事まとめ

##はじめに
最近、仕事で40本以上のAPIを全てリファクタリングすることになったので、
リファクタリングについて改めて勉強し直しました。
その時にとても勉強になった記事をまとめてみました。
リファクタ以外でもかなり有用な内容ばかりなので、1年目～3年目ぐらいの方にもおすすめです。

##記事一覧

[リファクタリング自爆奥義集]
(https://qiita.com/MinoDriven/items/dac5505cf8442e1721d1)

[何かのときにすっと出したい、プログラミングに関する法則・原則一覧]
(https://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63)

[初心者プログラマが犯しがちな過ち25選]
(https://qiita.com/rana_kualu/items/379eefb3a40c6b44cb92)

[良いコードの書き方]
(https://qiita.com/alt_yamamoto/items/25eda376e6b947208996)

[糞コードは直すな。]
(https://qiita.com/kotauchisunsun/items/d03c1e6936ffb250e4a1)

[中規模Web開発のためのMVC分割とレイヤアーキテクチャ]
(https://qiita.com/yuku_t/items/961194a5443b618a4cac)

[技術的負債とどうやって戦うか]
(https://qiita.com/kamykn/items/ad687e772da454e3f614)

[クソコードにならない為に、これだけは守って欲しい７つのこと]
(https://qiita.com/koitaro/items/c3720d9c3ac1e7b0590f)

[読み手にやさしい if 文を書きたい]
(https://qiita.com/Nossa/items/3fb1f1e4c429cacd3365)

[単一責任原則で無責任な多目的クラスを爆殺する]
(https://qiita.com/MinoDriven/items/76307b1b066467cbfd6a)

[TODO: 以外のアノテーションコメントをまとめた]
(https://qiita.com/taka-kawa/items/673716d77795c937d422)
【AWS】AWS Certified Solutions Architect – Associate合格体験記

# はじめに
表題でも記載した通り、AWSソリューションアーキテクトアソシエイト試験に合格した体験記となります。
※合格したのは2021年8月となります

# AWS Certified Solutions Architect – Associate
下記から詳細が確認いただけます。
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

# 勉強したこと
## 参考書
下記参考書を5周くらいしました。
正直、最初見たときは「？？？」となり、全然理解できませんでした。
なので、AWSの資格に興味があるけど、実際参考書を買ったはいいが自分には無理だ・・・と思った方がいましたら、そこまで落ち込むことはありません。
私は3周くらいしたところでようやく理解しました。←
AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト
https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X

## Udemy
下記を購入し、試験問題に慣れていきました。※購入したのはだいぶ前なので、厳密にいうと下記のバージョンは買っておりません。
結構Udemyのセールがやっていたりするので、セールのときに買うとお得に勉強できるかもしれません。
ちなみに難易度としてはめっちゃ高いです。吐きそうになります。
ただ、参考書だけでは乗っていない細かい内容についても試験問題として出てきたりするので、幅広く勉強が可能です。
私は正答率が100%になるまで何度も試験を行いました。ほぼ覚えているレベルになってしまうのであまりよくない勉強法かもしれませんが、、
ちなみに初回の正答率は毎回40%レベルなので、試験を受けて正答率が低くても落ち込まなくても大丈夫かと思います。

【2022年版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座
https://www.udemy.com/course/aws-associate/

## Cloud Tech
youtubeなどで勉強していく中で、結構わかりやすいなーと思っていたyoutuberのくろかわさんが立ち上げを行っているCloud Techというサービスで無料の試験問題が受けることができます。
Udemyよりも簡単なので気持ち楽に取り組めるかなと思います。
200問くらい無料で試験を受けることができ、有料会員になるとよりよいサービスを受けられるみたいです。
ただ、私は無料会員の200問だけで十分勉強になりました。
さくさく解けるようなレイアウトになっているので、すごい使いやすくておすすめです。
https://kws-cloud-tech.com/

## Black Belt
AWS公式のサービス別の参考資料です。
PDFなどで各サービスの資料を閲覧することができるので、苦手なサービスや知らないサービスについてINPUTすることができます。
暇さえあればBlack Beltを読んでいたので、スマホを見る時間をBlack Beltに置き換えたりする習慣ができればよいかなと思います。

https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

# 試験結果
1回目：不合格（691点）
2回目：合格（730点）
1回目落ちたときは死にたくなりましたが、2回目受かった時は最高にうれしかったです。
試験結果は、試験完了後の画面にアンケート入力後に合否がわかるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306026/fb9ac9e0-b03a-9085-da4a-89f09d965ddd.png)

# 最後に注力したほうがいいサービス一覧
EC2 / EBS / lambda / AutoScalling / ALB / NLB / CloudFront / AWS kinesis / EFS / Snowball Edge / Cloud Formation / S3 / AMazon S3 transfer Acceleration / VPC / NAT ゲートウェイ / Direct Connect / AWS Shield / AWS WAF / Amazon FSx for Windows File Server
データマネジメント DMBOK2 まとめ

# はじめに

データマネジメントについて勉強するために読み進めているDMBOK2の内容を自分用にまとめています。
メモとして、関連しそうなAzure (Microsoft)サービス・リソースを記載しています。
勉強しながらまとめているものなので、もしご指摘などありましたらフィードバックお願いいたします。

# DMBOK2全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/25f1c65f-873b-04c8-b6e8-36554da1003a.png)
https://www.dama-japan.org/Introduction.html より


## 3. データガバナンス
データマネジメント活動を推進するために、データ資産の統制を行う。全体方針とルール決め、組織的な意思決定を行う。
(もう少し確認して変更する)


## 4. データアーキテクチャ
ビジネスとデータを結びつけるアーキテクチャを描く。

アクション：
既存のアーキテクチャを書き出し、理想のアーキテクチャを設計し、ギャップを埋めていく。

メモ (関連するMicrosoftサービス・リソース)：
- Azure Reference Architecture


## 5. データモデリングとデザイン
- データ同士の関係性を表す。

データモデルの粒度：
1. 概念レベル
2. 論理レベル
  詳細なデータ要件が記述。具体的な技術や実装からは独立。
3. 物理レベル
  論理モデルをDB上のテーブルで表したもの。ER図。

## 6. データストレージとオペレーション
DBA (データベース管理者)としてDBの保守運営を行う。
業務ニーズに合わてDBを選定、管理していく。RDBMSなのか、ものによってはNoSQLも。

メモ：
- Azure DB系サービス (Azure SQL DB, Azure Synapse Analytics 専用 SQL プール)


## 7. データセキュリティ
データに関する、セキュリティポリシー、取り扱い・アクセスルールを定め、監査する。

メモ：
- データソースの適切なアクセス権設定
- Azure Purview (メタデータ管理部分で、個人情報や機密性レベルを識別・管理する)


## 8. データ統合と相互運用性
データの移動・変換を行う。ETL/ELT。

メモ：
- Azure Data Factory, Synapse Pipeline
- Azure Databricks


## 9. ドキュメントとコンテンツ管理
DBの外にある非構造データを管理する。ワードファイル、エクセルファイル、PPDF等。

メモ：
- Purviewでどこまで可能？

## 10. 参照データとマスタデータ
定義を一貫するためのマスターデータを作成し、参照できるように管理する。
マスターデータとして、システム間で一貫したデータソースを提供することで、業務領域やアプリケーションを横断してデータを利用可能にする。

メモ：
- Azure DB系サービス (特にRDBMS)
- Power BI


## 11. データウェアハウジングとビジネスインテリジェンス
データウェアハウス (DWH)の構築と、BIツール等での意思決定のためのデータ活用

アクション：
利用者のニーズに合わせて、意思決定システムを設計・開発する。

メモ：関連するMicrosoftサービス・リソース
- Azure Synapse Analytics (サーバレス/専用SQLプール)
- Power BI
- Azure Databricks


## 12. メタデータ
データの説明をメタデータとして保存し管理していく。

アクション：
1. メタデータの分類
  ビジネス、テクニカル、オペレーショナル
2. 要件決め
3. リポジトリ
  集中型 or 分散型
4. 検索システム
  メタデータ管理ツールの導入等
5. 記述タイミング決め
  DWHへの投入時、など

メモ：
- Azure Purview (集中型のメタデータリポジトリとして)


## 13. データ品質
データ品質は、データ利用者の要求を満たしている度合い。目的との合致度。
品質の基準を定め、現状を測定し、品質向上に向けたプロセスを設計する。

アクション：
まずはニーズを知り、データ品質の評価軸をもとに評価する。そごのデータ品質を測定、評価、向上させるための計画を立てる。

# 参考
- データマネジメントが30分でわかる本, ゆずたそ  (著, 編集), はせりょ (著)
- データマネジメント知識体系ガイド 第二版, DAMA International
【Swift】VIPERでアプリ開発してみた

# 目的
システムアーキテクチャである VIPER を理解すること


# 流れ
1. システムアーキテクチャとは
2. 欠点のあるアーキテクチャ Apple MVC
3. VIPER とは
4. アプリの作成(← コードあり)
5. コードを踏まえてVIPERの説明


# 1.システムアーキテクチャとは
ここを参考にしてください



# 2. 代表的なシステムアーキテクチャ Apple MVC
iOSアプリ(プロフィール画面)を作成すると仮定し、Apple MVC を考えていく。

画面の描画は UIView が行う。
UIView の操作は UIViewController が行う。
<img width=350 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/87e9ba12-305c-60bb-1fe6-8742d77f1d49.png">
<img width=350 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/e21fe9c6-381e-802a-1579-4159cd60fa81.png">

この時、ドメイン( =Model ) の実装方法が明確に決められていない。
そのため、開発者によって ドメイン の実装方法がバラバラになり、関係性の認識が異なっていた。
影響範囲の分からないコードの量産に繋がる
これは、UIViewController に ドメイン が含まれがちになる。
この現象を 「Fat ViewController」「Massive ViewController」と呼ばれる。
→ 解決策として MVP や MVVM, VIPER といったシステムアーキテクチャが開発された


# 3. VIPER とは
クリーンアーキテクチャがもとになっている。
クリーンアーキテクチャをiOSアプリ用に再整理されたアーキテクチャ。
VIPERは、`View`/`Interactor`/`Presenter`/`Entity`/`Router`の略語

#### VIPERの目的
依存性の分離, 要素単体で存在できるようにする
・要素同士が関心のない状態
・互いにプロトコルで繋がる
・実態は外部から差し込めるようにする

単一責任の原則
Single Responsibility Princible
「クラスの中身を変更する理由は複数存在しない(クラスに複数の機能を存在させない。そうすればクラスの中身を変更する理由は1つに絞られるはずだ。)」
1ビジネスロジック = 1クラス という原則
「データの取得」 「計算」 「結果を送信」 といったビジネスロジックは、それぞれ1クラスに収める

#### VIPER それぞれの責務(役割)
<img width=500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/a9683675-2edb-040b-0329-3d251636a6d9.png">

**View**
・UIを操作すること
・MVC上の VとC
・Presenterから教わったとおりに表示する事

**Interactor**
・ビジネスロジックを担当
・データのやりとり(CRUD, API)
・Entity の作成と破棄
・一つの役割に対して一つのファイル
※単一責任の原則 を強く意識する必要がある

**Presenter**
・UIKit を import しない
・View からの依頼を捌く
・Interactor への要求
・Router への指示
Interactorからデータ構造を受け取り、データ上にViewロジックを適用し、コンテンツの準備をし、最後にViewに何を表示するか教える

**Entity**
・データそのものの定義
・原則としてロジックを持たない
・ドメインに抽象化されたモデル
Entity を直接扱えるのは、Interactorのみ

**Router**
・画面遷移を担当
・画面遷移分ファイルを作成する
・Presentor からの指示で画面遷移を行う
・遷移先の画面を作成
・依存性注入を行う
・モジュール間のナビゲーションロジック
・モジュール間がどうなるべきか

### デメリット
・ファイル数が多くなる
・学習コストが高い

# 4. アプリの作成(← コードあり)
コードは[こちら](https://github.com/hamadayuuki/practice-iOS-architectures/tree/VIPER/VIPER/VIPER-sampleApp/VIPER-sampleApp)に載ってます。


# 5. コードを踏まえてVIPERの説明
### View
**見た目に集中**
・データの取得についての記述がない
・一覧から選択・ボタンを押す 等のプログラムを Presenter に任せることで、`見た目にのみ集中できる`
・命令に対してのみ「画面をどう見せるか」だけを考える。View がデータを取得し画面を操作することはない。
・if, for 文はなくなる傾向にある
・UIKitを使用して「背景色や文字」を変更する必要があるときは、if文を使っても良い

### Interactor
**1クラス1機能に集中**
・単一責任の原則 に従って、1クラス1機能とする
(機能の例 : お気に入り記事の登録・APIからのデータ取得)

### Presenter
**仕様書のように振る舞う**
・アプリの仕様書 をプログラムに落とし込むイメージ
・コード量が多くなりすぎないよう気をつける
・命名規則を意識する → コード量が多くなっても見通しの良いコードになる
・イベント内容と表示したいViewを合わせて書く → コードの見通しが良くなる

### Router
**画面遷移に集中**
1クラス1グループ → ○
(1クラス1画面 → ×)
(グループの例 : アカウント登録系(メールアドレス/パスワード入力,ログイン...)・メニュー系・設定系)

### Entity
・使用する変数を定義しておく
？Entity の構造体(struct)はそのままプリミティブ値で受け取る
？モデルクラスでは使いやすいように詳しい型で定義する



# 参考文献

https://dev.classmethod.jp/articles/developers-io-2020-viper-architecture/

https://qiita.com/YKEI_mrn/items/67735d8ebc9a83fffd29
Webサーバとアプリケーションサーバの違い

#Webサーバ
* Webブラウザからのリクエストを受け付けて、アプリケーションサーバに渡し、アプリケーションサーバからのレスポンスを返す。
* 静的処理
* Apache, IIS, nginx等

#アプリケーションサーバ
* Webサーバからリクエストを受け取り、プログラム実行し、結果を返す。
* 動的処理
* Tomcat, GlassFish(Java)

#補足
*　Webサーバの機能を持つアプリケーションサーバもあるので紛らわしい（Apache HTTP Server）
【Git】過去のコミットを修正したい

#0 はじめに
Gitを使用して開発をしている時、過去のコミットを修正したいと思った事はないでしょうか？
今回は、その方法を解説していきます。

#1 過去のコミット一覧を表示する

```
$ git log --oneline
``` 

####■ 過去のコミット一覧が表示される

```
c527b51 Merge pull request #12 from ユーザ名/ブランチ名
d8a3a71 (origin/ブランチ名, ブランチ名) 会員登録の処理も共通化
490aed0 トップページの共通化の処理の変更
40f1936 読み込むファイルのパスを変更
f04236b カテゴリー一覧も共通化
96820b8 新規共有情報登録も共通化に対応
aaba6cc 共通化の処理を変更
d7c5d94 会員登録の処理を追加
```

#2 コミット番号を指定して履歴を修正します。
rebaseとはコミット履歴を綺麗に整えるために使われるコマンドになります。

```
$ git rebase -i 490aed0
```

#3 「pick」となっている箇所を「edit」に変更する
「I」と打つ事でINSERTモードになり編集できるようになります。

```
edit d8a3a71 会員登録の処理も共通化
pick a586b7c 登録処理の修正
pick b47d0fd 共通化の処理の追加
pick 1b41885 ログアウト機能追加
pick a5b7bc2 ログイン処理の追加
pick 906695f カテゴリー事の一覧表示
pick a632c0c 新規登録の処理の変更
pick f66e19a マイページの画面作成
```

editに変更したら「esc」→「:wq」を押して保存します。

#4 ファイル修正を行う
修正は「I」と打つ事でINSERTモードになり編集できるようになります。
また、編集が完了したら「esc」→「:wq」を押して保存します。

```
vi src/join/check.php
```

#5 編集したファイルをgit addしてステージングします。

```
$ git add src/join/index.php
```

#6 編集したファイルを含めてトを修正します。
先ほどrebaseを実行したことでeditに変更しているコミット番号が直前のコミットに変更。

```
$ git commit --amend
```

修正は「I」と打つ事でINSERTモードになり編集できるようになります。
また、編集が完了したら「esc」→「:wq」を押して保存します。

#7 490aed0以降のコミットを戻す

```
$ git rebase --continue
Successfully rebased and updated refs/heads/ブランチ名.
```

#7 最後に
以上で修正が完了となります。
少しでも誰かの手助けになれば幸いです。

そして、LGTMもらえるとルンルン♪になるんですよね！
LGTM押してください！！！
アダプティブカードに入門する

#アダプティブカードとは

チャットボットの開発などで、ユーザーに送信するメッセージに入力フォーム等を含めたいときに使用します。
例えば日付や時間、入力必須のバリデーションチェックまでもアダプティブカードを使用すれば簡単に実装できます。

例えば、チャットボットの開発でユーザーに日付や時間を入力してほしいケースなどで使用することでユーザー的にも開発側にも実装がしやすくなるメリットがあります。

以下、Microsoftの公式ドキュメントです。
https://docs.microsoft.com/ja-jp/power-automate/overview-adaptive-cards

##アダプティブカードを作成してみよう

アダプティブカード自体はJsonで作成します。
と言っても初めての方に難しいと思うので、試しに一つ作成してみました。

```json:test.json
{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.5",
    "body": [
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "デモ版のアダプティブカードです。"
        },
        {
            "type": "Input.Text",
            "placeholder": "名前を入力してください"
        },
        {
            "type": "Input.Date"
        },
        {
            "type": "Input.Time"
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "送信する"
        }
    ]
}
```

上記のjsonはアダプティブカードとしてこのようにレンダリングされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/b92737b3-aef9-4e30-3a0a-2649c1596550.png)

このアダプティブカードでは、以下の三つのことを実現しています。
1、ユーザーが名前を入力する。
2、日付を入力する。
3、時間を入力する。

チャットボットでこのカードをユーザーへ送信するにはBotFrameworkなどプログラム側からメッセージを作成する際このjsonを呼び出します。
(アダプティブカードの送信方法については後日別の記事でまとめようと思います・・・)

ここまでだとアダプティブカードの作成には深い知識がいるのではと思った方もいるかもしれません。
しかし実はアダプティブカードは簡単に作成できます。
それがこのサイトです。
https://adaptivecards.io/designer/

このサイトの左の赤枠の部分にパーツがあるのでそれをカードの上にドラッグするとパーツがカードの上に実装されます。
そして画面下の方にJsonもともに作成されるので、後はそのJson部分をコピーして保存するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/cc0256b0-e0dd-f387-4641-6cf8ec9da5ee.png)

パーツも多く用途にあったアダプティブカードを簡単に作成できます。
しかし、私が今携わっているチャットボットの開発では、少し踏み入った実装をする必要があったのでそこで学んだことについては次回投稿しようと思います。
IE11をやめてEdgeに移行した際のトラブル事例

## この文書は？

　IEサポート切れに関して参考にした文書や事例のまとめ。


## 背景

　もうそろそろIEのサポートが本当に切れるというところもあるため、IEでしか動かないものを何とかする、新しいブラウザに移ってもらう活動の中で必要な情報をまとめておきたく。


## IEモードについて

 既存サイトとの互換性のためにIEを使い続ける必要がある場合は、まずIEモードの利用を検討する。

- [Internet Explorer モードとは \| Microsoft Docs](https://docs.microsoft.com/ja-jp/deployedge/edge-ie-mode)
- [Chromium版Edge内でIE専用Webページを開く「IEモード」の簡単設定法：Tech TIPS \- ＠IT](https://www.atmarkit.co.jp/ait/articles/2009/02/news022.html)
- [【Chromium Edge】特定サイトを IEモードで開く設定 \| インフラ基盤の備忘録](https://infra-memorandum.com/chromium_edge_and_ie_mode/)



## IE→Edge移行対応・トラブル

- [Microsoft Teams が Edge、Internet Explorer、または Google Chrome のログイン ループでスタックする \| Microsoft Docs](https://docs.microsoft.com/ja-jp/microsoftteams/troubleshoot/teams-sign-in/sign-in-loop)
    - TeamsのURLをEdgeで開くと無限ループするトラブル。原因と対応については上記URLにバッチリ乗っているためそちらを参照にして対応

- [富士通Q&A \- \[Microsoft Edge\] Internet Explorerの「お気に入り」をインポートする方法を教えてください。 \- FMVサポート : 富士通パソコン](https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=3110-8217)
    - ユーザによく聞かれる問合せなので、すぐ参照出来るリンクを知っていると便利
PostgreSQL Linux  備忘録 

https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-20-04-quickstart-ja

##インストール
```
sudo apt update
sudo apt install postgresql postgresql-contrib
```
https://qiita.com/tom-sato/items/8ac20e8ab589c83795f2#contrib-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%AF

>contrib モジュール とは、限られたユーザ向けだったり、実験的すぎたりして、PostgreSQL 本体に取り込まれていないモジュールのことです。ちなみに contrib は contribution の略で、ユーザから寄贈されたモジュールであるのに由来するものだからでしょう。

##ロール
>デフォルトでは、Postgresは「ロール」と呼ばれる概念を使用して認証と承認を処理します。 

* インストール時に自動で「postgres」ユーザーが作成される

https://qiita.com/YuichiTanaka007/items/c074f887c51c65732c89#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D-%E4%B8%80%E8%A6%A7

##大まかな流れ
###ロールの追加
  1. sudo -u postgres createuser --interactive<
  2. Enter name of role to add: <b>sampleuser001</b>
  3. Shall the new role be a superuser? (y/n) y<br>
  
###DB作成 
  1.sudo -u 〇〇〇 createdb <b>sampleDB</b>

###linux側にユーザーを追加
  1.上記で作成したロールと同名のlinuxユーザー（上記例では<b>sampleuser001</b>)を作成する




##DROP DATABASEができない時
```
 sudo -iu postgres dropdb sampleDB
```

##A5M2で接続
```:エラー
接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。
```
→SSH接続設定ミス

```:エラー
 password authentication failed for user "sampleuser001"
```
→ユーザーにパスワードを設定する
##ユーザーにパスワードを設定
```
sudo su sampleuser001 -c 'psql --username=sampleuser001'
ALTER USER sampleuser001 with encrypted password '××××××××××';
```
##pg_hba.conf設定
```/etc/postgresql/12/main/pg_hba.conf
# Database administrative login by Unix domain socket
local   all     sampleuser001     md5

# "local" is for Unix domain socket connections only
local   all             all                                     trust
```

##Posgre再起動
```
sudo /etc/init.d/postgresql restart
```
Gitの基本操作その２

##1.はじめに
この記事は前回の続きなので、未読の方は「Gitの基本操作その１」から読み進めることをお勧めします。
今回は前回掲載した予定のうち、「２．リポジトリの作成」と「３．ファイルの作成・編集」について書いていきます。

##2.リポジトリの作成
リポジトリという、今後ステージした内容をコミットする場所を作成します。
まず、前回作成したディレクトリに移動します。なお、コマンドの「git001」は前回作成したディレクトリ名です。作成したディレクトリが異なる場合はそのディレクトリ名と「git001」を入れ替えてください。

```
$ cd git001
```

次に以下のコマンドを実行してリポジトリを作成します。

```
$ git init
```

##3.ファイルの作成・編集
リポジトリを作成したら、次にファイルを作成し、そのファイル内に入って編集します。
まず、ファイルを以下のコマンドで作成し、

```
$ touch readme.txt
```
そのファイル内に入り編集をします。「readme.txt」の部分は自身が作りたいもの(タイトルや拡張子)に合わせて変更してください。


```
$ vi readme.txt
```
上記のコマンドを実行すると編集ができる画面に移動しているかと思いますので、デフォルトのコマンドモードから「i」を実行してインサートモードに切り替えます。このモードで適当な文字列を打ち込んだら「ESC」キー(エスケープキー)を押してコマンドモードに戻ります。そして「:wq」を実行すると「保存(w)」と「終了(q)」が同時に実行されます(もし編集内容を保存せずに終了したい場合は「:q」を実行してください)。
「3.ファイルの作成・編集」の内容は、作成したフォルダ内をエクスプローラーで開き右クリックからファイルを作成し、メモ帳などで編集(もしくはメモ帳から作成)することも可能です。しかし、今後もGitをご利用される予定があるならコマンドをする癖をつけておくことが大切かと思います。

##4.まとめ
これでコミットするものを作り終わったので、次回はステージとコミットの説明をしていきます。
引用符以外を検索するperl#2

ある仕事で引用付以外を対象に検索・置換する要件があったので、休日に作って見た。本業はこれから開発するが、プロトタイプの位置付けとして。

# 要件

## 処理概要
- 指定された文字を、検索・置換する
- 文字列部分など引用符ない（'...' "...")は検索・置換の対象外

## 詳細
- 検索・置換対象はファイルで指定する
- 文字での指定に加え、１６進でも指定もできる
- どの行で・どの文字が検索・置換となったかなど、処理結果ログを出力する
- ディレクトリを指定すると、配下のファイルを対象とする。ファイル指定はそのファイルのみ。

# 使い方
## インストール
- URL先の、 ``` Common.const.pl, Replace.pm, replaceM.pl ``` を同一ディレクトリに配置し、 replaceM.pl が起動スクリプト。
- ``` replace.test.pl ```はReplace.pm(package  Replace)のテストスクリプト

## ヘルプ
``` sh:replacem.pl
usage: replaceM.pl Ver00.01_Rev_20220124

replaceM.pl --mode S|R|HS|HR --srch SRCH-FILE --dir SEARCHDIR|SEARCHFILE --out OUTDIR|OUTFILE --log LOGFILE
  [--enc ENCODE] [--summary] [--srchdump: [--LL=n]

  --mode : S(earch) | R(eplace) | H(ex)S | H(ex)R 
  --enc  : utf8|cp932|hex defaultis utf8 
  --LL(Loglevel) 6:fn-trace 5:dbg 3:info 1:err 0:alw 
  --summary  : print Searched-file Matched-file to STDOUT
  --srchdump : print SRCH-FILE to STDOUT
  enc == hex : INF -> no-decode       -> OUT(no-enc),LOG(no-enc)
  enc != hex : INF -> decode to inner -> OUT(encode to ENC),LOG(encode to UTF8)
```

## gist
- gistに投稿しています。

[gist](https://gist.github.com/harasakih/3f241961a2edd0508e8c5f87438d1482)
<script src="https://gist.github.com/harasakih/3f241961a2edd0508e8c5f87438d1482.js"></script>
eGPU error code12対策のためのDSDTの編集の際の注意点

#eGPU error code12対策のためのDSDTの編集の際の注意点

laptopに外部GPUをつなげたがerror `code12`が生じて使えなかったため，試したことの一つの備忘録．
ただ，私のerror `code12`はこれでは解決できなかったのでさらに別の方法を試す．

##参考
(e)GPUを接続する時にデバイスマネージャ上のgpuに黄色三角アイコンがついてerror `code12`が表示されているときの対策の一つとして
DSDTの編集によってLerge Memoryを確保する方法がある．
error `code12`の対応策を含め，eGPU関連の問題は以下のスレッドが詳しい．

https://egpu.io/forums/expresscard-mpcie-m-2-adapters/mpcieecngff-m2-resolving-detection-bootup-and-stability-problems/

今回のerror 12の対応策はとしてのDSDT編集は以下の方法をとる

https://egpu.io/forums/pc-setup/fix-dsdt-override-to-correct-error-12

日本語記事は以下のサイトが詳しい．（ただし`↑`で紹介されているうちのIntel Methodのみ）

http://battleformac.blog.jp/archives/52438135.html

egpu.ioの方はコミュニティに（無料）メンバー登録することで見れる記事なのでここでは詳しくは書かないが，やることとしては

1. 現状のdsdt構成の読み取り
1. dsdt設定ファイル(`.dsl`または`.asl`)の編集および`.aml`をコンパイル
1. `.aml`の読み込みと再起動

である．`.dsl`と`.asl`は内容的には同じで

- `.dsl`を用いて`.aml`を作るのが`intel method`
- `.asl`を用いて`.aml`を作るのが`microsoft method`

と名付けられていた．
多くの場合`intel method`が推奨されているが，lenovoの一部laptopを使用している場合`microsoft method`が推奨されているようである．

##dslファイル編集の注意点
[件のGUIDE](https://egpu.io/forums/pc-setup/fix-dsdt-override-to-correct-error-12)でdatからdslファイルをデコンパイルし，編集してamlにコンパイルする際，多くの場合syntax errorが起こる．
上述した[日本語記事](http://battleformac.blog.jp/archives/52438135.html)でも同様のsyntax errorが起きているようである．

このsytax errorは環境によって異なるようで私が直面したsyntax errorの場所は前述した2つの記事とは異なる．
ただしsyntax errorはいずれも`iasl`でデコンパイルするとき一部コードの前後を間違えてしまっていることに依るものであるようだった．

これに対し，`.asl`ファイルも同様の情報を持っていて，それこそsyntaxが違うだけなため，
`.asl`ファイルの内容から`.dsl`で書かれるべき内容を予測してそれっぽく`.dsl`のsyntaxをまねればsyntax errorを修正できる．

私が直面したsyntax errorとその修正例を載せる：
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/920d23b0-e743-86b9-96aa-511e377695e7.png)
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/c7bbdf2f-0413-b445-7806-aa640ed31845.png)

これを修正すると今度は変数が多重に宣言しているみたいなことで怒られが生じるので
ファイルの初めの方に書いてある`External(...)`という感じで宣言されている変数を削除したらコンパイルが通った．

変数の多重宣言の解消法としてこれが正しいのかは分からず雰囲気で対応したが，一応[件のGUIDE](https://egpu.io/forums/pc-setup/fix-dsdt-override-to-correct-error-12)のステップ3で紹介されているLarge Memoryの確認はできていた．
Google Places APIで駅周辺の病院情報を取得してみた。

#はじめに
こんにちは、山田です。
今回は、作成中のアプリでGoogle Places APIを使用したので、使用方法について記載していきます。

#前提条件
APIキーを取得していること。

#取得手順
以下にコードを記載する。
例として、西馬込駅周辺の病院情報を取得していきます。


```php
function searchPlaceHospital($keyword) {
  $api_key = "自分のAPIキーを入力";  #1
  $keyword = urlencode($keyword);  #2
  $url = "https://maps.googleapis.com/maps/api/place/textsearch/json?&language=ja&query={$keyword}&key={$api_key}";  #3
  $json = file_get_contents($url);  #4
  $result = json_decode($json, true);  #5
  $lat = $result["results"][0]["geometry"]["location"]["lat"];  #6
  $lng = $result["results"][0]["geometry"]["location"]["lng"];  #7
  $url2 = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={$lat},{$lng}&radius=1000&language=ja&type=hospital&key={$api_key}";  #8
  $json2 = file_get_contents($url2);  #9
  $test =json_decode($json2, true);  #10
	return  $test;  #11
  }

$hospital = searchPlaceHospital("西馬込駅");  #12

$hospital_count = count($hospital["results"]);  #13

for ($i=0; $i<$hospital_count; $i++){  #14
 echo ($hospital["results"][$i]["name"]);
 echo '<br>';
}

```
①：`$api_key`に自分のAPIキーを入れる。
②：`unlencode($keyword)`にてURLとして使用できない文字や記号を、使用できる文字の特殊な組み合わせで表すように変換する。
③：`language=ja`にて日本語を設定。`query=`に検索したい言葉を入力する。今回は、西馬込駅が入る。
④：`file_get_contents`にてURLの情報を取得。
⑤：`json_decode`にてJSON エンコードされた文字列を受け取り、それをPHPの変数に変換。
⑥：検索した場所の`経度`を取得。
⑦：検索した場所の`緯度`を取得。
⑧：`location={$lat},{$lng}`にて経度、緯度の場所を指定。`radius`にて、半径どれくらいの情報を取得するのか指定。今回は、`radius=1000`で半径1kmの情報を取得。`type=hospital`で病院の情報を取得。
⑨：`file_get_contents`にてURLの情報を取得。
⑩：`json_decode`にてJSON エンコードされた文字列を受け取り、それをPHPの変数に変換。
⑪：return 文により値を返す。
⑫：`searchPlaceHospital`を実行。今回は引数に`西馬込駅`を指定。
⑬：`count`を用い要素をカウント。
⑭：`for文`を用い値を出力し、情報が取得できている確認。
サイト更新確認を自動化したい　PADによるスクレイピングの第一歩

![サイト更新業務を自動化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491190/40a4b4a3-117a-8ff7-3bdd-d5607dc49a35.png)
## 毎日のサイト巡回がメンドクサイ！
私はとある企業で企画部門に所属しています。部門業務の一つとして、業界動向の把握に向けた他社のリリースや業界団体Webページのチェック、および各所への情報共有を毎朝行っています。

毎日きちんと確認出来れば良いと言えばそうなのですが、急な用事で遅れたり、そもそも忘れてしまう事もあります。そして何より、更新されていないページを確認する時間を別の業務に使いたい！

という事で今回は、スクレイピングの第一歩として、Power Automate Desktopを使って巡回ページリストに記載したWebページの最終更新日を確認。併せて更新有無を部署メンバーへメール通知するフローを作成しました。

##フローで出来たこと
* 巡回ページのURLと前回確認時の更新日を記載したExcelフォーマットを用いて、更新されたWebページのメール通知を実現しました。
* 従来手作業で10分程度かけていたサイト巡回を自動化しました。
* 更新されたWebページのURLを合わせて通知することも可能です。

[![Image from Gyazo](https://i.gyazo.com/211255538b7873e3179be3991b0e2efe.png)](https://gyazo.com/211255538b7873e3179be3991b0e2efe)
画像: [通知メールサンプル]( https://gyazo.com/211255538b7873e3179be3991b0e2efe)

## フロー概要
###使用ツール
* Power Automate Desktop(バージョン2.15.00573.21354)
* Google Chrome
* Microsoft Excel
* Microsoft Office Outlook

###フロー全体像
[![Image from Gyazo](https://i.gyazo.com/486c71b124882d92b5190386fa71f55b.png)](https://gyazo.com/486c71b124882d92b5190386fa71f55b)
[![Image from Gyazo](https://i.gyazo.com/244f902f23c87331764e195b8f37a3ae.png)](https://gyazo.com/244f902f23c87331764e195b8f37a3ae)
[![Image from Gyazo](https://i.gyazo.com/c4727b0ef79ec3ffb6f980f3a9a75293.png)](https://gyazo.com/c4727b0ef79ec3ffb6f980f3a9a75293)

###フロー処理手順
1. 特定フォルダ内に格納したExcelフォーマットから処理対象のWebページURLと前回確認時の更新日データを取得します。
[![Image from Gyazo](https://i.gyazo.com/a32b50404cb588f38da20ea885323eaa.png)](https://gyazo.com/a32b50404cb588f38da20ea885323eaa)  
画像: [Excelフォーマットサンプル]( https://i.gyazo.com/a32b50404cb588f38da20ea885323eaa.png)
1. 変数設定後、下記の処理をループアクションで実行します。
    1. Google ChromeでWebページURLへアクセスします。
    1. JavaScript関数でアクセスしたページの最終更新日を取得します。
    1. 分岐アクションを用いてJavaScript関数で取得したページ上の最終更新日と前回確認した更新日データを比較します。
     1. サイト更新時があった場合のみフォーマットの更新日データを上書きし、通知リストへ追加しています。
     1. URLを合わせて通知したい場合は併せてリストに登録します。
    1. ループ処理のため、変数を変更します。

1. 処理対象すべての確認完了後、フォーマットを上書き保存します。
1. Microsoft Office Outlookを起動し、作成した通知リストを本文へ記載の上メール送信し、完了です。 

## フローの改善点
 **動的コンテンツからの更新日取得**

* 動的コンテンツを使用したWebページを対象とした場合、最終更新日がWebページへのアクセス時点の日付データとなります。
* JavaScript関数の `document.write `を使用しているため、更新日が取得できず必ず通知対象となっています。

## 今後の方針
今回は更新通知に留まりましたので、引き続きアウトプット部分の作成にも取り組んでいきたいと思います。
また、動的コンテンツの更新日取得についても併せて検討を続けていきます。
お気づきの点がございましたら是非ご教示下さい。

閲覧ありがとうございました！
Excel申請に紐づいたメール送信業務の自動化に挑戦

![タイトル見出し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491190/efba89d7-9e7b-6b83-bfc0-ee88439721f7.png)
## 申請認可後の素材提供メールを自動化してみた！
私はとある企業で企画部門に所属しています。その部署では自社のロゴ素材の管理も行っており、業務の一環としてロゴ使用申請があります。
業務の流れとしては使用を希望する画像の種類や用途、掲載媒体といった情報から使用許諾を出します。その後、制作物を作るための素材を申請時に指定されたメールアドレスへ提供するというものです。

使用許可自体は掲載媒体など個別の事情を考慮した判断が必要ですからどうしても担当者の手がかかります。しかし、許可を出した後の素材提供は限定されたパターンを記載された先にメール送信するだけですし、人の手で送信するとコピーミスや添付漏れといったリスクもあります。

という事で今回は、Excelによる申請書から所定の画像素材をメール送信してくれるフローを作成しました。

## フローで出来たこと

* Excel形式の申請書記載パターンに応じて素材提供のメール送付を実現しました。
* 従来手作業で一つの申請につき約10分程度かけていた送付作業を自動化したことで効率化と誤送信リスクの削減が図れました。
[![Image from Gyazo](https://i.gyazo.com/410231da89e32bba67c500b8970c51fa.gif)](https://gyazo.com/410231da89e32bba67c500b8970c51fa)
GIF: [通知メールサンプル3種]( https://i.gyazo.com/410231da89e32bba67c500b8970c51fa.gif)

## フロー実施の事前準備
* 使用するデータは画像のフォルダ構造で保存しています。
![Image from Gyazo](https://i.gyazo.com/f9cbda5331b1c0828fa7cbdb5ce2012a.png)
画像: [フォルダ概要]( https://i.gyazo.com/f9cbda5331b1c0828fa7cbdb5ce2012a.png)
* 今回使用している申請書は画像の通りです。
[![Image from Gyazo](https://i.gyazo.com/78e1f0272a76f216c80030f567e7535b.png)](https://i.gyazo.com/78e1f0272a76f216c80030f567e7535b.png)
画像: [申請書イメージ](https://i.gyazo.com/78e1f0272a76f216c80030f567e7535b.png)

* 申請書の名称は必ず独自の名称にしてください。(申請書名+日付など)
* 提供する素材と申請書で取得する素材名称が合致するようにしておいてください。


## フロー概要
### 使用ツール
* Power Automate Desktop(バージョン2.15.00573.21354)
* Microsoft Excel
* Microsoft Office Outlook

### フロー全体像
[![Image from Gyazo](https://i.gyazo.com/46605deed553db2e953cbe23ce8b3a43.png)](https://gyazo.com/46605deed553db2e953cbe23ce8b3a43)

### フロー処理手順
1. 未処理フォルダ内のファイルを取得した後、Microsoft Office Outlookを起動します。
1. 下記の処理をループアクションで実行します。
    1. フォルダ内のExcelファイルを起動します。
    1. 変数となる以下の項目を取得した後にExcelファイルを閉じる。
     1. 画像セット
     1. 送付先担当者名
     1. 送付先メールアドレス
    1. 取得した変数を用いてMicrosoft Office Outlookでメール本文を作成、送信します。
1. ループ処理完了後、Microsoft Office Outlookを終了します。
1. 未処理フォルダ内にあるすべてのExcelファイルを処理済みフォルダへ移動します。

## フローの改善点
**メール送信時に添付する素材の拡張子が一種類に限定されている**
メールの添付ファイル設定において拡張子をテキストで指定しているため、複数の拡張子を送付する際の対応が出来ていません。  
**未処理フォルダから処理済みフォルダへの移動を一括で行っている**
フォルダ移動の処理を一括で行っているため、エラー等でループ処理が停止した場合にExcelファイルの移行が出来ません。

##今後の方針
エラーを考慮してExcelファイルのフォルダ移動を1ファイル毎にしたいと考えています。処理が完了したExcelファイルからフォルダ移動を行うようループ処理内に組込む方法で解決を目指します。

また、今回の挑戦で担当者が必要な業務にも効率化する余地がある事に気づくことが出来ましたので、再度身の回りの作業を見直してみようと思います。

閲覧ありがとうございました！
PowerAppsで自動メール送信に挑戦！契約管理を簡単にしたい！

　【毎日の定例業務で少し困っている事】
　契約日の異なる企業12社分の契約書の作成が大変。
そこで、契約日30日前になったら担当者にメールを送って通知するフローの作成をしたいと考えた。

　【改善したいこと】
　契約日30日前にお知らせメールを送信。

 【作成したもの】
１エクセルデータの作成。
テーブル作成→エクスポート（sharepointのアドレスを張り付け）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/8c39706c-6bd5-28df-28fe-8e03788bd1d8.png)
2　PowerAppsでフローの作成スケジュール済みフローで作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/6122c34e-adad-82bb-36ac-8011c925f4bd.png)

3 SharePointで複数項目の取得を選択→送付したい件名、メッセージを入力


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/6d79cab1-c3cb-43a4-73d4-9fc346b9cdd1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/34c871d7-1884-57eb-0ac5-77a32e85a801.png)

4メール送信完了
※担当者（お客様）へいきなりメールを送る設定だと失敗したときにご迷惑になるので、今回は自分のアドレスで行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/33707233-6a96-eb91-62b1-07e73e61e01c.png)



【使用ツール】
Power　Apps
SharePoint

【参考サイト】
https://econoshift.com/ja/power-automate-auto-notification-email/

【難しかった点・反省点】
　30日前に特定の人へのメッセージ設定がうまくいかず、12社分のメッセージが届いてしまった。
特定の人への送付ができれば今後、使用できそうだと思った。


【今後に向けて】
　特定の人へ、30日前に送付できるように改善してみる。
SQLServerに100万件データをブチ込むBCPコマンドについて

## :confused:BCPコマンドとは？:confused:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552268/07c85adb-2d6f-942a-beda-d5cae3353cb5.png)

BCPコマンドによって以下のようなことができます。
 **・テーブル内のデータをファイルに一括エクスポートする
 ・予め作成したファイルのデータをテーブルに一括インポートする**

テーブルにデータを大量登録する機会があったため利用しました。
 
ちなみに、BCPは「**B**ulk **C**opy **P**rogram」の略称。

【参考】：[bcp ユーティリティ Microsoft公式](https://docs.microsoft.com/ja-jp/sql/tools/bcp-utility?view=sql-server-ver15)

## SQL文じゃダメ？BCPを使う利点:confused:

個人的には以下がイケてるなーと思っています

**・大量データを(楽に)扱える
・DBとのインポート/エクスポートが一つのコマンドを覚えるだけで実現できる**

 **`BULK INSERT`文で一括インポート**したり、 **SSMSのSELECT結果を`Save Result as...`して一括エクスポート**したりはできますが、一つのコマンドラインとしてまとまってるのはありがたいなと思いました。覚えることが少なく済むので。

BCP以外にも、経験上こうやってエクスポート/インポートしてたよとかあれば、ぜひ教えてください。

参考
https://qiita.com/fuk101/items/d98716a48d69d5c7f1a7

## 主な使い方（大量データインポート）

**コマンド例**
※テーブル1つにつき1コマンドずつ叩く

```
bcp {テーブル名} in {データ登録ファイル(txt)}
-c -S {DBServer名} -d {Database名} -U l{User名}-P {パスワード} -q -E
```

**オプション一覧（有志のブログ）**
https://mr-star.hatenablog.com/entry/sqlserver/020

**挿入元のファイル形式**
タブ切り分けファイル。Excelのフィル機能で大量データ作って、かつ"エクスポート"機能を使うと気軽にデータ作りこめます
**"ファイル" > 左リボンから"エクスポート" > "ファイルの種類の変更" > "テキスト（タブ区切り）*.txt"**


**コピーに成功した時のログ:smile:**
100万件突っ込むのに30分ぐらいかかりました。

```
コピーを開始しています...
SQLState = 22005, NativeError = 0
1000 rows sent to SQL Server. Total sent: 1000
1000 rows sent to SQL Server. Total sent: 2000
1000 rows sent to SQL Server. Total sent: 3000
1000 rows sent to SQL Server. Total sent: 4000
...
1000 rows sent to SQL Server. Total sent: 998000
1000 rows sent to SQL Server. Total sent: 999000
999997 行コピーされました。
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 1423593 平均 : (702.45 行/秒)
```

**エラーあるある:expressionless::expressionless::expressionless::expressionless::expressionless:**

このサイトがめっちゃ分かりやすい。4つ上がっているが、本当にあるあるofあるあるでした。
http://comfair2.blog24.fc2.com/blog-entry-143.html?sp

↓テーブルのフィールド長よりもインポートデータのほうが長い場合。

```
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]String data, right truncation
```
↓int型の項目に日付型をセットしようとした場合など

```
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification
```
↓テーブルとファイル間で項目数が異なる場合など

```
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]Unexpected EOF encountered inBCP data-file
```
↓DB固有の制約に違反した場合（これは非NULLカラムにNULLを入れたとき）

```
SQLState = 23000, NativeError = 515
Error = [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot insert the value NULL into column 'id', table 'dbo.user'; column does not allow nulls. INSERT fails.
```
**非NULL違反の原因が、Excelシートの仕様(?)で勝手に空文字が入ってるのが原因な時がある。ctrl + End押して、セルが意図したデータの終わりに飛ぶか確認してみてください。**

## 主な使い方（データエクスポート）

あんまり使わなかったのでちょっと熱意薄いですが、DBからファイルにエクスポートするときのコマンドも紹介します。
**インポート時の「in」を「out」にするだけで使えます。**

**コマンド例**

```
bcp {テーブル名} out {データ登録ファイル(txt)}
-c -S {DBServer名} -d {Database名} -U l{User名}-P {パスワード} -q -E
```

## ちょっと気に要らんところ...

・空文字orNULLをスキップできるようにしてほしい
AtCoder Beginner Contest 098

##[A - Add Sub Mul](https://atcoder.jp/contests/abc098/tasks/abc098_a)

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int A, B;
    cin >> A >> B;

    cout << max(max(A-B, A+B), A*B) << endl;

    return 0;
}
```

##[B - Cut and Count](https://atcoder.jp/contests/abc098/tasks/abc098_b)

O(N)

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9

using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int N;
    string S;
    cin >> N >> S;

    int ans=0;
    repx(n, 0, N-1){
        int l=n;
        set<char> lst;
        rep(i, l+1) lst.insert(S[i]);

        set<char> rst;
        repx(i, l+1, N)  rst.insert(S[i]);

        set<char> result;
        set_intersection(lst.begin(), lst.end(), rst.begin(), rst.end(), inserter(result, result.end()));

        ans = max((int)result.size(), ans);
    }

    cout << ans << endl;

    return 0;
} 
```

##[C - Attention](https://atcoder.jp/contests/abc098/tasks/arc098_a)

O(N)

```python:python
N = int(input())
S = str(input())
W=[0] * N
E=[0] * N
 
for i in range(1, N):
    if S[i-1] == "W":
        W[i]=W[i-1]+1
    else:
        W[i]=W[i-1]

for i in range(N-2, -1, -1):
    if S[i+1] == "E":
        E[i]=E[i+1]+1
    else:
        E[i]=E[i+1]
 
tmp=W[0]+E[0]
for i in range(1, N):
    if tmp > W[i]+E[i]:
        tmp = W[i]+E[i]
 
print(tmp)
```
TypeScript が公式のチートシートを公開していた

TypeScriptが公式のチートシートを公開してました。

https://www.typescriptlang.org/cheatsheets

https://twitter.com/orta/status/1482083318376112137

ドキュメントは英語しかありませんが、上記サイトからチートシートをダウンロードできます。

これは読み込むしかないですね。

中身はこんな感じ。

![Screen Shot 2022-01-24 at 22.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/edea52c7-596c-6636-d669-7678b40cdf8c.png)

# チートシートの中身
- TypeScript Classes
- TypeScript Control Flow Analysis
- TypeScript Interfaces
- TypeScript Types

これらが、PDFとPNGでダウンロードできます。

# まとめ
- 良い
crowdinのxliffファイルをpythonで読む。

# 背景

crowdinにある翻訳依頼を翻訳者に割り振りするのに、copy string url相当のURLを生成したい！翻訳箇所を送りたい！

# crowdinのxliff

https://support.crowdin.com/file-formats/xliff/

xliff/file/body/trans-unit/target の属性stateがneeds-translationのものが未翻訳で翻訳が必要。このstringのtrans-unitのidとbase_urlを組み合わせると翻訳箇所を指すurlになる。

base_urlはenus（米国英語）からja（日本語）に翻訳する場合はこうなる。

## copy string urlの構成
```
https://crowdin.com/translate/<project_name>/<file id>/enus-ja#<trans-unit id>
```

# xliffをダウンロードしてurlを生成する
```python:makeCopyStringUrl.py
from lxml import etree

folder=<your folder>
project_name= "<your_projectname>"

tree = etree.parse('./'+folder+'/crowdin_export.xliff')
root = tree.getroot()
mynsmap = dict()
mynsmap['x'] = root.nsmap[None]

target_lang = tree.xpath("//x:file/@target-language",namespaces=mynsmap)
file_id = tree.xpath("//x:file/@id",namespaces=mynsmap)
tus = tree.xpath("//x:target[contains(@state,'needs-translation')]/../@id",namespaces=mynsmap)

base_url = "https://crowdin.com/translate/"+project_name+"/"+file_id[0]+"/enus-"+target_lang[0]+"#"
for id in tus:
   print(base_url+id)
```

> python3 makeCopyStringUrl.py > url.log

あとはurl.logを開いて、誰に何件送るかをごにょごにょしてタスクを回す。
N予備プログラミング　〜冬コンテスト作品制作過程を晒してみる②〜

みなさんこんばんわ。
昨日つくった”covidリスク確認くん（開発用）”のアプリ設計書にしたがって、ぐいぐいコードを描いて行きます。
”4ｰ17.【サービス開発2】プロジェクトの作成と認証の実装”のテキストの通りに何も考えずに手を動かす。そーれ、ワン・ツー・写経！！

さすがにdocker-compose.ymlだけは書き換えなきゃでしょ。
---quote---
version: '3'
services:
  app:
    build: .
    tty: true
    ports:
      - 8000:8000
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    build:
      context: "."
      dockerfile: "db.Dockerfile"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: covid_riskcalk
---enquote---
⇒最下行のデータベース名だけcovid_riskcalcに変更しましたよと。

ルーター類も、自分で変えた部品名だけ注意してファイル作ってと。
![スクリーンショット 2022-01-24 21.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345137/2419a896-1041-d08a-1b59-18f8794ee125.png)

テキストの手順通りに描き進めてここ↓までたどり着く。ちょっと感動。
うーん圧倒的ではないか！われらがN予備カリキュラムは！！
![スクリーンショット 2022-01-24 21.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345137/106860f3-45a2-65d8-35c0-36c1f828616d.png)

とりあえずサービス開発２のところまで実装できたので、あとは1日に2回分づつ実装していけば一応締め切りまでに終わるハズ！なるか！たぬきの皮算用！（つづく）
AWS CDK Intro WorkshopをCloud9で途中までやってみた

# <font color="red">**2023.01.15追記**</font>
全部日本語訳された内容で再度行った内容を、以下で記事にしました。
参考にされる方はそちらをご覧ください。

https://qiita.com/a_b_/items/d42d0aebf8b02ae618ec

# はじめに
今までIaCをCloudFormationで記述してきましたが、規模が大きくなると比例して行数も多くなり、可読性が悪いと感じてきました。
AWS CDKで記述すれば可読性が良くなると聞き、AWS CDK Intro Workshopをやってみました。

# リンク

https://cdkworkshop.com/

日本語版は以下になりますがコードのバージョンが古いです。

https://catalog.us-east-1.prod.workshops.aws/v2/workshops/99731164-1d19-4d2e-9319-727a130e2d57/ja-JP/

日本語を見つつ、コードは英語の方を写経しました。

# 環境

Cloud9を使いましたので、PCはブラウザのみ。
言語はTypeScriptで行いました。

## 環境構築

Cloud9であれば中にすべて入っていましたので、何もインストールする必要ありませんでした。

- Cloud9作成
    - デフォルトVPC
    - デフォルトIAMロール
    - インスタンスタイプはメモリが2GB以上
        - 1GBで作ってしまいcdk diffでメモリが足りなくなり、インスタンスタイプを変更することになりました。
    - Node.jsはインストール済み
    - AWS CDKもインストール済み
 
# 気づいた点
テキスト通りに行えば問題ありませんが、気になった点をいくつか挙げていきます。

## サンプル未使用で始めるとどうなるのか
テキストでは`cdk init sample-app --language typescript`と、 "sample-app"で始めているため、最初からある程度のファイルが配置されています。
指定しない場合はどうなるのか、以下のサイトに解説ありました。

https://zenn.dev/ufoo68/books/3fbd1969bd4b21c5454b/viewer/cdkinit

比較して、どのファイルが素の状態で作成されるのか、最初に把握しておきたかったです。

## DynamoDBコンソールのUI変更
テキストが書かれたときと、現時点でのUIが異なっていたので、確認するのに苦労しました。
現時点では、左ペインの[テーブル]-[項目の探索]を選択し、対象のテーブルを選択することで中身が見れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2e70e82b-030d-d1c7-e92d-b5d80bbc2fc1.png)

## EXTRA CREDIT(追加課題)のヒント
以下のところに使い方が書いてありました。

https://github.com/cdklabs/cdk-dynamo-table-viewer#usage-typescriptjavascript

## `cdk destroy`で消えなかったリソース
テキストには`cdk destroy`で消える、とありましたが、消えなかったのが多数ありました。
そのため、以下の手順で削除を行いました。

1. 対象のCloudFormationのスタックを削除
    - S3バケットも中にありましたので、空にする必要があります。
        - destroyで消えなかったのも、このためか？
1. DynamoDB
    - コンソールから削除。
1. LambdaFunctionのロググループ
    - コンソールから削除
    - /aws/lambda/CdkWorkshopStack-　で始まるもの
        - 他のは消さないように

## Advanced Topicsが英語のみ
テストやパイプラインのワークショップで大変重要な部分かと思いましたが、日本語訳されておらず、また時間も無かったのでここは出来ませんでした。。。

# おわりに
事前準備不要で、Cloud9だけでAWS CDKが実現できることがわかる大変有用なワークショップでした。
弊社ではPCにソフトをインストールするのに紙での申請が必要なため、クラウド上で完結できる環境を重宝しております。

AWS CDKに少しでも興味ある方は、気軽に始められてはいかがでしょうか。
Jest でタイムゾーン考慮

# 概要

- unixtime を取得する関数のテストを書きたかった
- ローカルと Github 上で挙動が違った（ローカルでは通るけど Github 上だと落ちた）

# 詳細

- **2022-01-01 01:01:01** を表す `Date` を用意
- 変換サイトを使い、 **UTC+9** の状態での unixtime が **1640966461** だとわかる
- 以下の記事を参考に、そのままテストを書いた

https://qiita.com/mima_ita/items/558ec8cee2c0e1005ffd

```typescript
describe("テストしたい関数名", () => {
  jest.useFakeTimers("modern");
  jest.setSystemTime(new Date(2022, 0, 1, 1, 1, 1));
  it("", () => expect(現在時刻の unixtime を取得する関数).toBe(1640966461));
});
```

- 出たエラーは以下の通り

```zsh
● 関数名 › 

    expect(received).toBe(expected) // Object.is equality

    Expected: 1640966461
    Received: 1640998861

    >  96 |   it("", () => expect(現在時刻の unixtime を取得する関数).toBe(1640966461));
                                                                  ^
       97 | });
       98 |

```

# 修正結果

- 正しい値を UTC で計算し直した（1640998861）
- `Date` クラスで使える関数 `getTimezoneOffset()` でローカルと UTC のタイムゾーンのさを取得
- 差分を UTC に加える（減算しないよう注意）

```typescript
describe("テストしたい関数名", () => {
  jest.useFakeTimers("modern");
  const date = new Date(2022, 0, 1, 1, 1, 1);
  const timeZoneOffset = date.getTimezoneOffset() * 60;
  jest.setSystemTime(date);
  it("", () => {
    expect(現在時刻の unixtime を取得する関数).toBe(1640998861 + timeZoneOffset);
  });
});
```

# 読んだ記事

- https://qiita.com/mima_ita/items/558ec8cee2c0e1005ffd
- https://www.javadrive.jp/javascript/date_class/index12.html
Docker Desktop for Macでlocationを外部ストレージに「できなかった」話

# エクスキューズ
「できなかった」という話で恐縮です。自分の課題解決能力がうらめしい。
こうすればできたという人がいる、ということをお伝えだけしたいと思います。

# 諸元

2015earlyのストレージが128GのモデルからM1ProのMacbookProに買い換えてウキウキでした。
いやほんとなぜか「その他」が逼迫していてXcodeとかEclipseとかAndroidStdioとか消さなきゃもうなにも動かない！みたいなレベルで吐きそうになってました。いやもう吐いてた。すごい嘔吐。
OSのアップデートもままならないので、えいやって購入しました。
だけどやっぱり空き容量は不安なのでDockerのイメージファイルなどは外部ストレージに保存したい。

# 「できなかった。」「本当に？」「君にとって、あるいは違うかもしれない。」

https://docs.docker.com/desktop/mac/

Docker立ち上げたら`Preferences...`を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27987/ca1449b8-bf29-6ad4-a813-ed15ccf3e3bb.png)

`Resources > ADVANCED`の`Disk image location`で希望のディレクトリを指定すればいいはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27987/af807551-bdf1-7a5f-a9a0-5ffc497d7c67.png)

> Desktop-go-backend': Error: {"message":"no such file or directory"}

***oh...***

# 解決するかもしれない方法または時間の浪費。

っていうことが結構前から発生したので、どうやら同様のissueである以下を時折ウォッチしてました。

https://github.com/docker/for-mac/issues/6048

先ほどの`Preferences`でDisk image sizeをなにかしら変更して`Apply & Start`するとうまくいくひともいるみたいです。***わたしはちがいましたさようなら。***

# その他

## アプリからのアンインストールもできなくなったら

いろいろいじくり回してたらTroubleshootの`Reset to factory defaults`も`Uninstall`も効かなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27987/1f3265b2-e14c-b974-9a8f-c8559dbd9dc0.png)

下記のStackOverflowを参考に無心で以下のコマンドで不要なDocker関係のファイルを消し、強制的にアンインストールしました。
既にイメージファイルやコンテナがある場合、消えてしまうので注意してください。

https://stackoverflow.com/questions/44346109/how-to-easily-install-and-uninstall-docker-on-macos

> sudo rm -Rf /Applications/Docker.app
> sudo rm -f /usr/local/bin/docker
> sudo rm -f /usr/local/bin/docker-machine
> sudo rm -f /usr/local/bin/docker-compose
> sudo rm -f /usr/local/bin/docker-credential-desktop
> sudo rm -f /usr/local/bin/docker-credential-ecr-login
> sudo rm -f /usr/local/bin/docker-credential-osxkeychain
> sudo rm -Rf ~/.docker
> sudo rm -Rf ~/Library/Containers/com.docker.docker
> sudo rm -Rf ~/Library/Application\ Support/Docker\ Desktop
> sudo rm -Rf ~/Library/Group\ Containers/group.com.docker
> sudo rm -f ~/Library/HTTPStorages/com.docker.docker.binarycookies
> sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
> sudo rm -f /Library/LaunchDaemons/com.docker.vmnetd.plist
> sudo rm -Rf ~/Library/Logs/Docker\ Desktop
> sudo rm -Rf /usr/local/lib/docker
> sudo rm -f ~/Library/Preferences/com.docker.docker.plist
> sudo rm -Rf ~/Library/Saved\ Application\ State/com.electron.docker-frontend.savedState
> sudo rm -f ~/Library/Preferences/com.electron.docker-frontend.plist

---

もし解決方法をご存知の方がいたら教えていただけると嬉しいです。
【iOS版】Unityを使ったアプリリリースの知見

（今後作成予定）
以下の知見を定期的に更新していく予定

#リリースまでの手順：参考サイト
・UnityでiOSモジュールを入れる
・iOS向けにビルド
・Appleのデベロッパー登録をする
・App Store Connectでアプリの登録をする
・Apple Developer ProgramでIdentifiersの登録をする
・Xcodeで開いてアーカイブを作る
・Xcodeのアーカイブからサーバーにアップロード
・ストア情報を入力する
・審査に出す
参考サイト：https://deve-cat.com/unity-ios-app-process/

#エラー別対処法

#Xcodeのarchiveが"Unable to authenticate"で失敗した場合の対処法
https://qiita.com/hide-snow/items/bdf0647e15597e6e7551

##NCMBを入れた際にXcodeで出るエラー
![スクリーンショット 2022-01-20 2.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/3f16bdf1-48bf-4384-f6f9-78ccc3310604.png)
対処：[こちら](https://unity-yuji.xyz/unity-ncmb-ioslinker-command-failed-with-exit-code-1/
)のサイトの通りにする

## Xcodeで「ld: XX duplicate symbols for architecture arm64」のエラー
原因：ファイルが重複している
対処：[こちら](https://stackoverflow.com/questions/43776236/how-to-solve-duplicate-symbols-for-architecture-arm64-error)を参考にXcodeの「Target　> Build phase　> Compile source search」で検索して重複しているものを削除する

#審査落ち
##Guideline 2.5.10
>Guideline 2.5.10 - Performance - Software Requirements
We noticed that your app or its screenshots include test advertisements. Apps or metadata items that include features that are for test or demonstration purposes are not appropriate for the App Store.
Next Steps
To resolve this issue, please revise your app to complete, remove, or fully configure any partially implemented features. Please ensure your screenshots do not include any images of demo, test, or other incomplete content.

**意味：テスト広告のままだよ！** 
##Guideline 4.2
>Guideline 4.2 - Design - Minimum Functionality
We continued to find that the usefulness of your app is limited by the minimal amount of content or features it includes. 
Next Steps
We encourage you to review your app concept and incorporate different content and features that are in compliance with the App Store Review Guidelines.
We understand that there are no hard and fast rules to define useful or entertaining, but Apple and Apple customers expect apps to provide a really great user experience. Apps should provide valuable utility or entertainment, draw people in by offering compelling capabilities or content, or enable people to do something they couldn’t do before or in a way they couldn’t do it before.
Please see attached screenshot for details.

**意味：もっとクオリティやユーザー体験を上げてね** 
**対策：これで解決できたよ例**
・UIのずれがあれば直す
・ゲームの目的と遊び方の説明を入れる（どんなゲームかわからないと評価はされない）
・ちゃんとゴールできるゲームにする（難しすぎるものはダメかも）
　・ゲームモードを２つ作り1つはクリアできる

#リリース関係の記事
https://qiita.com/simanezumi1989/items/8e68c769b4437c5ef821
Azure CLI を使用して VM を管理してみました（stop/start）

### 概要

Azureで動いているIaaSの仮想マシンの停止等を いちいち Azure Portal に入らずに、サクッと Azure CLI で実行するための手順となります。

### ローカル環境

- macOS Monterey 12.1
- python 3.8.3
- Azure CLI 2.28.0

### 前提条件

1. Azure環境がすでに用意されていること（テナント/サブスクリプション）
2. ローカル環境に「azure cli」がインストールされていること

---

### Azure CLI からの 仮想マシン

#### リソースグループ内にある仮想マシンの一覧の取得

```
$ az vm list -g <Resource_Group_Name> -d --output table

Name             ResourceGroup    PowerState    PublicIps     Fqdns    Location    Zones
---------------  ---------------  ------------  ------------  -------  ----------  -------
vm-ituru-ubuntu  rg_ituru_vm02    VM running    20.188.24.42           japaneast
```

#### 仮想マシンのIPアドレスの確認

```
$ az vm list-ip-addresses --resource-group <Resource_Group_Name> --name <vm-name> --output table

VirtualMachine    PublicIPAddresses    PrivateIPAddresses
----------------  -------------------  --------------------
vm-ituru-ubuntu   20.188.24.42         10.0.1.4
```
#### 仮想マシン・インスタンスの確認

```
$ az vm get-instance-view --resource-group <Resource_Group_Name> --name <vm-name> --query instanceView.statuses --output table

Code                         Level    DisplayStatus           Time
---------------------------  -------  ----------------------  --------------------------------
ProvisioningState/succeeded  Info     Provisioning succeeded  2022-01-24T12:18:02.460457+00:00
PowerState/running           Info     VM running
```

#### 仮想マシンの停止

```
$ az vm stop --resource-group <Resource_Group_Name> --name <vm-name>

About to power off the specified VM...
It will continue to be billed. To deallocate a VM, run: az vm deallocate.
```

このままだと、課金されたままなので、メッセージ通りのコマンドを実行

```
$ az vm deallocate --resource-group <Resource_Group_Name> --name <vm-name>
```

いちおう、仮想マシンのステータスを確認

```
$ az vm list -g <Resource_Group_Name> -d --output table

Name             ResourceGroup    PowerState      PublicIps    Fqdns    Location    Zones
---------------  ---------------  --------------  -----------  -------  ----------  -------
vm-ituru-ubuntu  rg_ituru_vm02    VM deallocated                        japaneast
```

#### 仮想マシンの起動

```
$ az vm start --resource-group <Resource_Group_Name> --name <vm-name>
```

再度、仮想マシンのステータスを確認（グローバルIPアドレスが変わってます）

```
$ az vm list -g <Resource_Group_Name> -d --output table

Name             ResourceGroup    PowerState    PublicIps       Fqdns    Location    Zones
---------------  ---------------  ------------  --------------  -------  ----------  -------
vm-ituru-ubuntu  rg_ituru_vm02    VM running    20.210.209.139           japaneast
```

---

### まとめ

これで、Azure CLI でサクッと 仮想マシンの停止・起動ができるようになりました。
javascriptで既存の同期関数を非同期で実行させたい

# やりたいこと
関数A (重い)
↓
関数B (軽い)

同期処理を上から順に実行していたが、`A`と`B`に順序性はなく`A`は非同期でもいいと気づいた。

非同期の関数を作るとかではなく、いかにシンプルに非同期にできるかに重点を置いて考えてみた。

# 既存の処理例
```main.js
// 重い処理
function heavy() {
  // ...
  console.log('heavy');
}

// 軽い処理
function light() {
  console.log('light');
}

// メイン
function main() {
  heavy();
  light();
}

// 実行
main();
```

実行結果は当たり前だが以下の通り

```実行結果.
heavy
light
```

# 改善案
```main.js
// 重い処理
function heavy() {
  // ...
  console.log('heavy');
}

// 軽い処理
function light() {
  console.log('light');
}

// メイン
function main() {
  Promise.resolve().then(heavy);
  light();
}

// 実行
main();
```

実行結果は以下の通り

```実行結果.
light
heavy
```

# 改善案　重い処理に引数1つ
```main.js
// 重い処理
function heavy(name) {
  // ...
  console.log('heavy:', name);
}

// 軽い処理
function light() {
  console.log('light');
}

// メイン
function main() {
  Promise.resolve("tanaka").then(heavy);
  light();
}

// 実行
main();
```

実行結果は以下の通り

```実行結果.
light
heavy: tanaka
```

# 改善案　重い処理に引数複数
```main.js
// 重い処理
function heavy(name, age) {
  // ...
  console.log('heavy:', name, age);
}

// 軽い処理
function light() {
  console.log('light');
}

// メイン
function main() {
  Promise.resolve(["tanaka", 20]).then(arg => heavy(...arg));
  light();
}

// 実行
main();
```

実行結果は以下の通り

```実行結果.
light
heavy: tanaka 20
```

# 感想
もっといい方法、スマートな方法あれば教えてください。