OmniAICreator/Qiita-1.07M huggingface dataset:
PMP試験に出てくる(5.4) Create WBSのITTOを覚えよう

# (5.4) Create WBS
プロジェクトスコープ管理の6つのプロセスにある`WBS作成`プロセスのこと

- [プロジェクトスコープ管理の6つのプロセス](https://qiita.com/Yumenoshima/items/1f313379b20aacb30c7a)

## (5.4) Create WBSはPMBOKガイドのどこに出てくるか
PMBOKガイド`156ページ`の`5.4`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (5.4) Create WBSのITTOのI(インプット)
- Project management plan
- Project documents
- Enterprise environmental factors
- Organizational process assets

## (5.4) Create WBSのTT(ツールと技法)
- Expert judgement
- Decomposition

## (5.4) Create WBSのO(アウトプット)
- Scope baseline
- Project documents updates

# まとめ
`(5.4) Create WBS`プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上
調整さんに入力する文字列をPythonで自動生成してみた

恒例のクソコード

#調整さんの入力は結構面倒

ご存知[調整さん](https://chouseisan.com/)は複数人での日程調整に便利なオンラインツールですが、候補日程を全部手書きするとなかなかな手間です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/f39652d4-002e-beaf-6ace-24e712ae654a.png)
例えば候補日を「5/20~29の10日間」、時間帯も各日3つずつ候補があったりすると手で入力するのはなかなか大変なので自動化しました。

#Python
内容はコメントしてるとおりです

```Python:chousei.py
# Python3
import datetime
import locale

date = datetime.datetime(2020, 5, 18) #候補日初日(西暦年,月,日)
days = 10 #候補日数(最初の日-最後の日)
arg=["9:00~12:00", "12:00~15:00", "15:00~18:00", "18:00~"]#時間帯とかの文字列
locale.setlocale(locale.LC_TIME)

def main(date,days,arg):
    out=[]
    arg_len=len(arg)
    locale.setlocale(locale.LC_TIME)
    while(days>0): #日付を変えてループ
        counter=0
        while(counter<arg_len): #同じ日の候補時間帯を追加していくループ
            out.append( str(date.year) +"年"+ str(date.month) +"月"+ str(date.day) +"日"+ "(" + str(date.strftime('%a')) + ")" + str(arg[counter]) )
            counter+=1
        date+=datetime.timedelta(days=1) #入力する日付を1増やす
        days -= 1 # 残る候補日数を1減らす
    return out # 関数から配列を返す

out=main(date,days,arg)
for l in out: # 配列の要素を1行ずつプリント
    print(l)
```

これをそのうちSlackbotに機能追加する予定

## 最初からJSで書いてWebにすれば良かったのでは
それ以上言うな
PMP試験に出てくる(5.3) Define ScopeのITTOを覚えよう

# (5.3) Define Scope
プロジェクトスコープ管理の6つのプロセスにある`スコープ定義`プロセスのこと

- [プロジェクトスコープ管理の6つのプロセス](https://qiita.com/Yumenoshima/items/1f313379b20aacb30c7a)

## (5.3) Define ScopeはPMBOKガイドのどこに出てくるか
PMBOKガイド`150ページ`の`5.3`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (5.3) Define ScopeのITTOのI(インプット)
- Project charter
- Project management plan
- Project documents
- Enterprise environmental factors
- Organizational process assets

## (5.3) Define ScopeのTT(ツールと技法)
- Expert judgement
- Data analysis
- Decision making
- Interpersonal and team skills
- Product analysis

## (5.3) Define ScopeのO(アウトプット)
- Project scope statement
- Project documents updates

# まとめ
`(5.3) Define Scope`プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上
PMP試験に出てくる(5.2) Collect Requirements のITTOを覚えよう

# (5.2) Collect Requirements 
プロジェクトスコープ管理の6つのプロセスにある`要求事項収集`プロセスのこと

- [プロジェクトスコープ管理の6つのプロセス](https://qiita.com/Yumenoshima/items/1f313379b20aacb30c7a)

## (5.2) Collect Requirements はPMBOKガイドのどこに出てくるか
PMBOKガイド`138ページ`の`5.2`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (5.2) Collect Requirements のITTOのI(インプット)
- Project charter
- Project management plan
- Project documents
- Business documents
- Agreements
- Enterprise environmental factors
- Organizational process assets

## (5.2) Collect Requirements のTT(ツールと技法)
- Expert judgement
- Data gathering
- Data analysis
- Decision making
- Data representation
- Interpersonal and team skills
- Context diagram
- Prototypes

## (5.2) Collect Requirements のO(アウトプット)
- Requirements documentation
- Requirements traceability matrix

# まとめ
`(5.2) Collect Requirements `プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上
#PowerApps View in MR 外部から変更できない？

Power Apps の Mixed Reality（以降、MR）機能の1つ「MRで表示」（View in MR）お試しになりましたか？Power Apps で MR がグリグリ動かせるのは面白いですよね。

View in MR は、指定した3D画像をスマートフォンのカメラを利用して現実の映像に組み合わせることが可能なコントロールになります。記事投稿時点ではプレビュー機能であり、[事前準備](https://qiita.com/yamad365/items/48d021bca0c99418ea80) を実施しないと利用できません。

今回は、その View in 3D で表示する3D画像を外部からのアプローチで動的に変更できないか？を軽く調べてみた結果のまとめです。

# 結論
はじめに結論をお伝えしておきます。
残念ながら、タイマーコントロールによる[Source]変更はできませんでした。残念。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> + MR(Change .glb from timer -&gt; NG😢 <a href="https://t.co/32rQtcyqB3">pic.twitter.com/32rQtcyqB3</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1260392553221812224?ref_src=twsrc%5Etfw">May 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 試してみた仕組み
どうやって試したか？を簡単に記録しておきます。

## アプリ全様
画面の配置はこんな感じになっていました。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/268c6fde-4397-8acc-4d0d-f4ac275205d8.png)
タイマーコントロールでMR表示する対象を切り替えています。ギャラリーコントロールの表示は検証内容にはあまり関連性がありません。”いるか.glb”が1番で、それに続いて順番になってます、というのを示したかっただけです。

## ギャラリーコントロール
「3Dで表示」（View in 3D）コントロールと、ラベルが配置してあるだけです。
[View In 3D ＃03：ODfB+Excelで表示](https://qiita.com/yamad365/items/2621b4f122b0bfa286a4) で紹介した、OneDrive for Business に .glb ファイルを格納して、Power Apps から Excel のテーブル経由で3D画像をギャラリー表示しているだけです。ラベルは同データソースの名前を表示させています。

## タイマーコントロール
10秒毎に、変数（アプリでは wkCnt）を +1 しています。
タイマーコントロールの左側にあるラベルは、その変数の値が「いま何か？」を表示しています。

## MR で表示（View in MR）コントロール
指定した3D画像をMR表示するコントロールです。Docs は下記。

[View 3D content or images in the real word (Preview)](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/mixed-reality-component-view-mr)

[Source]プロパティに表示したい 3D画像（.glb）を指定します。指定する方法は「3D で表示」（View in 3D）と同様です。そのため、その[Source]プロパティを外部要因（今回はタイマーコントロール）で10秒置きに変更してやろう、という作戦でした。なお、該当プロパティに指定した値は下記になります。

```ViewinMR.Source
Last(FirstN(<テーブル名>,wkCnt)).'3DModel'
```
上記関数については、以前にまとめています。詳細はそちらを参照ください。

[【#PowerApps Tip's】配列のｎ番目を取得する](https://qiita.com/yamad365/items/11e9cece46df161138a0)

wkCnt が 10秒毎に+1されるため、ギャラリーコントロールの表示順でMRされる対象が切り替わる予定になります。結果は冒頭で説明したとおり、NGでしたけど…

# まとめ
**「MR で表示」（View in MR）コントロールの起動中は、
外部から3D画像を切り替えられない** 
※記事投稿時点で

なお、コントロール起動前であれば切り替えるコトが可能です。

せっかく、MR機能が利用可能になったので、MR表示しながら色々遊べると面白いのになぁ、と思って試してみましたが、現状はダメでした。まー、プレビュー機能なのでショウガナイネ。

それでは、皆さま。素晴らしい Power Platform Life を！
個人アプリ開発　記事投稿やユーザ登録機能の流れ

備忘録として！

#新規投稿
newアクションを設定する
#
```
@tweet = Tweet.new
```

投稿フォームの編集
#
```
   <%= form_with(model: @tweet, local: true) do |form| %>
      <%= form.text_field :name, placeholder: "Nickname" %>
      <%= form.text_field :image, placeholder: "Image Url" %>
      <%= form.text_area :text, placeholder: "text" , rows: "10" %>
      <%= form.submit "SEND" %>
    <% end %>
```
routes.rbを編集
#
```
resources :tweets
```

createアクションを追加する
#
```
 def create
    Tweet.create(tweet_params)
  end

  private
  def tweet_params
    params.permit(:name, :image, :text)
  end
```

#詳細ページの表示
１．ツイート詳細画面のルーティングを記述する
２．ツイート詳細画面へのリンクを作成する
３．tweets_controllerにshowアクションを作成する
４．ツイート詳細画面のビューを追加する

リファクタリングする
#
```
  before_action :set_tweet, only: [:edit, :show]

private
  def set_tweet
    @tweet = Tweet.find(params[:id]) 
  end
```
#投稿内容の編集や削除
１．ツイートを削除するためのルーティングを設定する
２．削除ボタンをビューに追加する
３．destroyアクションをコントローラーに定義する
４．削除後のビューを追加する
#
```
    @tweet.destroy
    redirect_to root_path
```
#ツイート編集機能の実装

１．ツイート編集画面のルーティングを設定する
２．編集ボタンをビューに追加する
３．editアクションをコントローラーに定義する
４．編集画面のビューファイルを作成する
５．ツイートの更新を行うためのルーティングを設定する
６．updateアクションをコントローラーに定義する
７．更新後のビューファイルを追加する
#
```
    @tweet.update(tweet_params)
    redirect_to root_path
```
【IQ Bot】検証用のインストールをやってみよう

[IQ Bot](https://qiita.com/IQBotter/items/fab5f59230ff38a98bbd)は使い始めると楽しいですが、筆者の経験上、インストールでつまずくことが多かったです。。。
公式の手順は<a href="https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/control-room/install/installation.html#Zj0vY2F0ZWdvcnkvaW5zdGFsbD9wPUluc3RhbGw=" target="_blank">こちら（ベンダー公式ドキュメントサイト）</a>にありますが、これを見ながらでも最初は苦戦した部分がありました。

自分自身の頭の整理も兼ねて、このページに手順を載せてみます。

#前提

筆者がやっているインストールの手順を以下に記載します。
筆者の検証環境はCRとIQ Bot同梱（[※本番環境用としてはベンダー非推奨](https://qiita.com/IQ_Bocchi/items/5d435b1db96f9fb21d9a#cr%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8iq-bot%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AF%E5%88%86%E9%9B%A2)）なので、手順もそちらをベースにしていますが、別建てのときに必要になる手順も追記しました！

IQ Bot6.0時代からお付き合いをしている筆者の経験上、バージョンによって微差はありますが、大まかな流れは同じです。
この手順を作る際に検証したバージョンは、A2019.12オンプレです。

想定所要時間は、クリーンなマシンへのフルインストールを問題なく進めた場合で約１時間ほどです。
上記の想定時間にはインストーラーのダウンロード時間は含みません。
インストーラーのダウンロード時間は通信速度によりけりですが、CRで1.5GB, IQ Botで2GB近いサイズになるので相応の時間がかかります。

#IQ Botインストールの手順

IQ Botのインストールに必要な手順は以下です。
**各手順をクリックすると、ステップバイステップの手順を紹介しているページに飛べます**。

**<a href="https://qiita.com/IQ_Bocchi/items/2fe2b46f43d8728c34d7" target="_blank">1. インストールに必要な環境を揃える</a>**
→　必要スペックのマシンを調達し、必要なポートを開け、Chromeをインストールするなどの事前準備をします。
→　インストーラーのダウンロードも行います。

**[2. DBのインストールと設定](https://qiita.com/IQ_Bocchi/items/7f02939799347b4db501)**
→　CRやIQ Botと接続するDBMSをインストールし、必要なインスタンスやDB、ログイン等を作ります。
→　筆者の検証環境ではSQL Server ExpressとSSMSを使っているので、その手順を説明します。
→　既に上記のDBMSが入っている場合でも、CRやIQ Botを使う用の準備が必要になるのでそれを実施する必要があります。

**[3. CRをインストールする](https://qiita.com/IQ_Bocchi/items/37d0632770bffb1e33f8)**

**[4. 必要なユーザーを作る](https://qiita.com/IQ_Bocchi/items/e29fc3bf7762148a6565)**

**[5. クライアントをインストールする（V11の場合）](https://qiita.com/IQ_Bocchi/items/450fe26076b0c6631627)**

**[6. IQ Botをインストールする](https://qiita.com/IQ_Bocchi/items/fef152c38a5d18cac896)**

**[7. OCRの設定 ＆ その他の便利な諸設定](https://qiita.com/IQ_Bocchi/items/b75d84be6784f5fd51fb)**
→　ABBYYのSDKを入れたり、カスタムロジックを有効化したりなど、IQ Botを便利に使いこなすための諸々の設定をします。
→　CRとIQ Bot同梱ということで、[Bot Insightを落としておく](https://qiita.com/IQ_Bocchi/items/cbea5d88ee2c7e06124d)のもおすすめです。

**[8. 稼働確認](https://qiita.com/IQ_Bocchi/items/112e4e6bebb325566e05)**
→　稼働確認は「こうしなければいけない」というわけではないですが、効率よく確認できる手順を上記リンクにまとめていますので参考にしてみてください。
バッチファイルで半角小文字英数字以外をはじく処理をつくる

* バッチファイルに引数を渡し、そののちの処理で半角小文字英数字以外の文字列はpowershellスクリプトにわたさない、という動作を書く必要ができた。
    * C#でexeつくればすぐにできるのに…
* めちゃくちゃ時間かけているので自分のためにもメモを残す。

`echo [文字列1] | findstr [文字列2 A-Z記号の羅列]`
findstrは文字列2にある文字を、1文字でも含んでいると見つけたことになるようだ。
以下の文字列を列挙したテキストファイルを作成する。
abc
199
abc90
ABC
ABc
AB90
an*
199+
**++
作成したファイルの中身を検索する。
文字列2 [a-z0-9]の場合、記号のみで構成される文字列以外が出力される。
文字列2 [^a-z0-9](実際はオプション/Vで実験)記号のみで構成される文字列が見つかる。

* 疑問点1
 * 大文字の英字を見つけてしまっている
* 疑問点2
 * 実際は[a-z]などの範囲指定の時、^が効いていない（/vなら否定してくれる）
 * [^a]は[a]に/vと同じ挙動
 
findstrはオプションをつけることで大文字と小文字を区別しなくなるって書いてあるんだけど…
環境がおかしいんですかね…

powershellの-matchと結果が異なる。-matchは[^a-z0-9]で、記号を含む文字列を見つけてくれるんだよね…
findstrの仕様なのかなあ。
PMP試験に出てくる(8.3) Control Quality のITTOを覚えよう

# (8.3) Control Quality
プロジェクト品質管理の3つのプロセスにある`品質コントロール`プロセスのこと

- [プロジェクト品質管理の3つのプロセス](https://qiita.com/Yumenoshima/items/0eb4d0934d5802417bf7)

## (8.3) Control QualityはPMBOKガイドのどこに出てくるか
PMBOKガイド`298ページ`の`8.3`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (8.3) Control QualityのITTOのI(インプット)
- Project management plan
- Project documents
- Approved change requests
- Deliverables
- Work perfomance data
- Enterprise environmental factors
- Organizational process assets

## (8.3) Control QualityのTT(ツールと技法)
- Data gathering
- Data analysis
- Inspection
- Testing / product evaluations
- Data representation
- Meetings

## (8.3) Control QualityのO(アウトプット)
- Quality control measurements
- Verified deliverables
- Work performance information
- Change requests
- Project management plan updates
- Project documents updates

# まとめ
`(8.3) Control Quality`プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上
PMP試験に出てくる(8.2) Manage Quality のITTOを覚えよう

# (8.2) Manage Quality
プロジェクト品質管理の3つのプロセスにある`品質管理`プロセスのこと

- [プロジェクト品質管理の3つのプロセス](https://qiita.com/Yumenoshima/items/0eb4d0934d5802417bf7)

## (8.2) Manage QualityはPMBOKガイドのどこに出てくるか
PMBOKガイド`288ページ`の`8.2`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (8.2) Manage QualityのITTOのI(インプット)
- Project management plan
- Project documents
- Organizational process assets

## (8.2) Manage QualityのTT(ツールと技法)
- Data gathering
- Data analysis
- Decision making
- Data representation
- Audits
- Design for X
- Problem solving
- Quality improvement methods

## (8.2) Manage QualityのO(アウトプット)
- Quality reports
- Test and evaluation documents
- Change requests
- Project management plan updates
- Project documents updates

# まとめ
`(8.2) Manage Quality`プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上
PMP試験に出てくる(8.1) Plan Quality ManagementのITTOを覚えよう

# (8.1) Plan Quality Management
プロジェクト品質管理の3つのプロセスにある`品質管理計画`プロセスのこと

- [プロジェクト品質管理の3つのプロセス](https://qiita.com/Yumenoshima/items/0eb4d0934d5802417bf7)

## (8.1) Plan Quality ManagementはPMBOKガイドのどこに出てくるか
PMBOKガイド`277ページ`の`8.1`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (8.1) Plan Quality ManagementのITTOのI(インプット)
- Project charter
- Project management plan
- Project documents
- Enterprise environmental factors
- Organizational process assets

## (8.1) Plan Quality ManagementのTT(ツールと技法)
- Expert judgement
- Data gathering
- Data analysis
- Decision making
- Data representation
- Test and inspection planning 
- Meetings

## (8.1) Plan Quality ManagementのO(アウトプット)
- Quality management plan
- Quality metrics
- Project management plan updates
- Project documents updates

# まとめ
`(8.1) Plan Quality Management`プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上
GASメモリ不足のためエラー

GASでメモリ不足エラーに悩まされたので記録です。

約25,000件(1件あたり10～20文字)の文字列を配列にセットし、
配列をループで、文字列変換処理を回し、変換後文字列配列にpush
変換後文字列配列を出力

という処理だったのですが、「メモリ不足のためエラーが発生しました」
というエラーで処理中断。178秒での中断でした。

対応策としては、配列に格納せずに、1件ずつ出力してメモリを軽くしてあげるしかないかなと
お絵かきできるSNSを作りたい！7

線の太さを実装していきたいと思います。

↓この部分
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104527/4411b4c5-774b-deea-e581-edb0b64d7754.jpeg)

前回同様、今度は[type="range"]の値を取得し、lineWidthに入れるだけです。

```html:
<input type="range" value="1" min="1" max="10" step="1" oninput="LineWidth(this)">
<output id="LineWidthValue">1</output>pixel
```

```javascript:
//線の太さ用変数（デフォルトは1px）
var strLineWidth="1";

function LineWidth(obj){
	document.getElementById('LineWidthValue').value=obj.value;
	strLineWidth=obj.value;
}
```

最後に

```javascript:
	ct.lineWidth=strLineWidth;
```
↑ここだけだと伝わらないと思うので↓のgithubの差分をを参照ください。

これで線の太さ変更が可能になりました。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104527/79b230a5-05a7-255b-730b-c45540347acc.jpeg)

次：[お絵かきできるSNSを作りたい！8](https://qiita.com/cardcapt/items/303104991b3ceb4a8e8c)
最初：[お絵かきできるSNSを作りたい！](https://qiita.com/cardcapt/items/d15fedf80d336f6b4bb9)
PMP試験に出てくる33個のProject Documentsを覚えよう

# Project Documentsとは
プロジェクト文書のこと

## PMBOKのどこに出てくるのか
PMBOKガイド`559ページ`の`Part2 - Standard`の`Table 1-2`に出てくるぞ

# プロジェクト文書
1. Activity attributes
- Activity list
- Assumption log
- Basis of estimates
- Change log
- Cost estimates
- Cost forecasts
- Duration estimates
- Issue log
- Lessons learned register
- Milestone list
- Physical resource assignments
- Project calendars
- Project communications
- Project schedule
- Project schedule network diagram
- Project scope statement
- Project team assignments
- Quality control measurements
- Quality metrics
- Quality report
- Requirements documentation
- Requirements traceability matrix
- Resource breaddown structure
- Resource calendars
- Resource requirements
- Risk register
- Risk report
- Schedule data
- Schedule forecasts
- Stakeholder register
- Team charter
- Test and evaluation documents


----

よかったよかった
PMP試験に出てくる19個のProject Management Planを覚えよう

# Project Management Planとは
プロジェクト計画書のこと

## PMBOKのどこに出てくるのか
PMBOKガイド`559ページ`の`Part2 - Standard`の`Table 1-2`に出てくるぞ

# プロジェクト計画書
1. Scope management plan
- Requirements management plan
- Schedule management plan
- Cost management plan
- Quality management plan
- Resource management plan
- Communications management plan
- Risk management plan
- Procurement management plan
- Stakeholder management plan
- Change  management plan
- Configuration management plan
- Scope baseline
- Schedule baseline
- Cost baseline
- Performance measurement baseline
- Project life cycle description
- Development approach
- Management reviews

----

よかったよかった
お絵かきできるSNSを作りたい！6

カラーパレッドを実装していきたいと思います。

↓この部分
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104527/ee59775a-2ee7-53b4-10e0-7d4f7f9fdc5f.jpeg)

このままでも良いのですが、好きな色を追加出来る用にもした方がいい気がしてきたので、その他というパレットも追加します。
後々、カラーセット機能を用意してDBに保存させたいですね。

```html:
その他：<input type="color" id="color_other" name="color" onChange="Color(this);">
```

onchageイベントを付与しました。
JavaScriptやjQueryでバインドしても良いのですが、それだと後からどの要素にイベントが入っていたか分かりにくいので直接書く派です。

↓ということで、１番下にその他を追加。
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104527/15434e66-369f-349b-ea5c-af72501cac3f.jpeg)

前回作った色の四角形を選択した時に枠線を付けているColorという関数があったので、それを改造します。

```javascript:
//カラー設定用変数（デフォルトは黒）
var strStrokeStyle="#000000";

//カラー選択関数
function Color(obj){
	for ( i = 1; i <= 15; i++ ) {
		id_name = "color_" + i;
		if (id_name == obj.id){
			id_name2 = "#" + id_name;
			document.getElementById(id_name).classList.add('active');
		} else {
			document.getElementById(id_name).classList.remove('active');
		}
	}
	if (obj.id == "color_other"){
		strStrokeStyle = $("#color_other").val();
	} else {
		strStrokeStyle = "#" + $(id_name2).css("background-color").match(/\d+/g).map(function(a){return ("0" + parseInt(a).toString(16)).slice(-2)}).join("");
	}
}
```

追加したのはid_name2変数の追加と↓以下の部分です。

```javascript:
	if (obj.id == "color_other"){
		strStrokeStyle = $("#color_other").val();
	} else {
		strStrokeStyle = "#" + $(id_name2).css("background-color").match(/\d+/g).map(function(a){return ("0" + parseInt(a).toString(16)).slice(-2)}).join("");
	}
```

その他を押した時は、タグのidが”color_other”なので[type="color"]の値を取得・それ以外の場合は選択した四角形の背景色を取得しています。

type="color"は、そのままだと10進数のRGB表記だったので、上と揃えようと思い16進数表記への変換も行っています。

ここに来てjQueryが無い事に気が付き追加しました。
3系で問題無いのですが、古参なのでIEも考慮し1系で。
color関数の上のfor文はjQueryなら数行で収まるはずですが、この程度のループなら速度的にも影響ないかなそのままにしました。

そして、最後にグローバルなstrStrokeStyle変数に格納した情報をcanvasのgetContextでstrokeStyleが取得出来る用にします。

```javascript:
	ct.strokeStyle=strStrokeStyle;
```

かくして、色の変更が可能になりました。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104527/e71665e5-6a86-cac0-4f64-b5c3e6c9c47a.jpeg)

次：[お絵かきできるSNSを作りたい！7](https://qiita.com/cardcapt/items/5a00c0d3568e84592c78)
最初：[お絵かきできるSNSを作りたい！](https://qiita.com/cardcapt/items/d15fedf80d336f6b4bb9)
PMBOKガイドPart 1のREFERENCESを知ろう！

# PMBOKガイドのREFERENCESとは
PMBOKガイドの参考文献のこと

## PMBOKのどこにあるのか
PMBOKガイドの`537ページ`のPart1の`REFERENCES`にあるぞ

# PMBOKガイドの参考文献
- [1] The Standard for Project Management.
- [２] The Standard for Portfolio Management - Third Edition.
- [3] The Standard for Program Management - Fourth Edition.
- [4] The PMI Lexicon of Project Management Terms.
    - https://www.pmi.org/lexiconterms
- [5] Code of Ethics and Professional Conduct.
    - https://www.pmi.org/codeofethics
- [6] Managing Change in Organizations.
- [7] Business Analysis for Practitioners.
- [8] Implementing Organizational Project Management.
- [9] Project Management Institute Excellence in Practice-Research Collaboration, PMI-RI Standards Program: Making Sense of PPP Governance, December 19, 2014.
- [10] Governance of Portfolios, Programs, and Projects
- [11] PMI's Pulse of the Profession In-Depth Report: The Competitive Advantage of Effective Talent Management
    - https://www.pmi.org
- [12] White Paper, Complexity Management for Projects, Programmes and Portfolios: An Engineering Systems Perspective, March 2015.
- [13] Navigating Complexity: A Practice Guide.
- [14] Requirements Management: A Practice Guide.
- [15] Practice Standard for Work Breakdown Structures (WBS).
- [16] Practice Standard for Scheduling - Second Edition. 
- [17] Practice Standard for Earned Value Management - Second Edition.
- [18] ISO 9000:2015 Quality Management Systems - Fundamentals and Vocabulary.

----

よかったよかった
プロジェクトマネジメントに関係があるISO/TC258を知ろう

# ISOとは
国際標準化機構のこと

## ISO/TC258とは
プロジェクト管理に関する標準を開発しているISO内のグループ`ISO/TC 258 Technical Committee
`のこと
https://www.iso.org/committee/624837.html

## プロジェクト管理のISOはどのようなものがあるのか

- ISO 21500
    - 2012
    - Guidance on project management
- ISO 21503
    - 2017
    - Guidance on programme management
- ISO 21504
    - 2015
    - Guidance on portfolio management
- ISO 21505
    - 2017
    - Guidance on governance
- ISO TR 21506
    - 2018
    - Project management vocabulary
- ISO 21508
    - 2018
    - Earned value management
- ISO 21511
    - 2018
    - Work breakdown structure

## 参考リンク
https://www.pmi.org/pmbok-guide-standards/about/international

----

よかったよかった
PMP試験に出てくるVUCAを知ろう！

# VUCAとは
`Warren Bennis`と`Burt Nanus`の1987年のリーダーシップ論で提唱された4つの要素（変動性・不確実性・複雑性・曖昧性）を表す造語

VUCAとは、ビジネスや市場といった世界におけるさまざまな不安定要素を示す4つの言葉の頭文字を取ったもの。

## PMBOKのどこに出てくるのか
PMBOKガイドの`416ページ`の`11.2.2.5 Prompt Lists`に出てくるぞ

- 11 Project Risk Management
    - 11.2 Identify Risks 
        - 11.2.2 Tools & Techniques
            - 11.2.2.5 Prompt Lists

## VUCA
- Volatility
    - 変動性
- Uncertainty
    - 不確実性
- Complexity
    - 複雑性
- Ambiguity
    - 曖昧性

----

よかったよかった
ページ遷移はどうするの？

# ページ遷移ってどうするの？
## あれ？ルーターがなくない？
今までReactを書いていてそろそろサーバーサイドレンダリングに手を出した私、よしポートフォリオサイトを作ってやろ！と考えたわけですよ！ここである問題が発生！あれ、Reactのときはページ切り替えはrouterを使ってたけど...Nextって**Routerないやんけ**どうするんや〜！
いや安心してくださいませ〜
別にないわけではないです。
NextではRouterを使わなくてもページ繊維なんてちょちょいのちょいで行えるのです！
（あ！ReactでRouterを使うときは `npm install router`でルーターが使えるようにしてimportしてからでないと 使えませんので〜）npmとかのコマンドはまたどこかで説明するとして、話が逸れてしまったので本題に行ってみましょう！
## じゃあ実際にどうすればいいの？
話は意外と簡単です！
Nextのアプリケーションは基本的にpageディレクトリ内に様々なファイルを記述しますが、そこにある.jsファイル、つまりページコンポーネントに `import Link form 'next/link'`と記述しましょう。これでNextで作成した各ページのjsファイルを遷移できるようになりました。あとはリンクを配置します。ページコンポーネントに以下のように記述します。  

```~.js
export default () => (
  <Layout header ="Top page" title ="Top page.">
    <p>Welcome to Next.js</p>
    <Link href ="./other">
      <button>Go to Other &gt;&gt;</button>
    </Link>
  </Layout>
);
```
とりあえず現在のページタイトルとかはtoppageとかにしといて遷移先のページのjsファイルの名前をother.jsとすると`<Link href = "./other"> </Link>`と言うように記述することでハイパーリンクが完成し、画面に表示されるようになります。つまり...

```.js
<Link href = " 遷移先のjsファイルの名前（.jsはいらない） ">
ここにボタンやテキストを入力する　（ex）<p>,<h3>,<button>,もしくは生テキスト....
</Link>
```
以上！これでNextにおける画面遷移はご理解いただけたでしょうか？
あ！忘れていました！今回のトップページはindex.jsとしていますが、もし遷移先にother.jsから戻るための画面遷移がしたいと思えばohter.jsの方でが上記のようなもの書きます。しかし、この時に遷移先がトップページであれば、`href = "./index"`と記述せず`href = "/"`で行うことができます！覚えておきましょう！
初心者によるプログラミング学習ログ 316日目

#100日チャレンジの316日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
316日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>316日目 1.5h<br>・架空LP模写7日目1.5h（<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>）<br>・架空LP模写：制作一覧部分を作成<br><br>急用が入ったのでこんなもん<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1261025444784037888?ref_src=twsrc%5Etfw">May 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
IIBA認定制度の資格を知ろう！

# IIBA認定制度とは
`International Institute of Business Analysis`が提供する認定制度

## どのような認定制度があるのか

- ECBA (レベル1)：ビジネスアナリスト向け
    - [Entry Certificate in Business Analysis](https://www.iiba.org/certification/iiba-certifications/ecba/)

- CCBA (レベル2)：ビジネスアナリスト向け
    - [Certification of Capability in Business Analysis](https://www.iiba.org/certification/iiba-certifications/ccba/)

- CBAP (レベル3)：ビジネスアナリスト向け
    - [Certified Business Analysis Professional](https://www.iiba.org/certification/iiba-certifications/cbap/)

- CBATL (レベル4)：ビジネスアナリスト向け（開発中)
    - [Certified Business Analysis Thought Leader] (https://twitter.com/IIBA/status/770800473993601026)

- CCA : サイバーセキュリティアナリスト
    - [Certificate in Cybersecurity Analysis](https://www.iiba.org/certification/iiba-certifications/specialized-business-analysis-certifications/certificate-in-cybersecurity-analysis/)

- CBDA : ビジネスデータアナリスト
    - [Certification in Business Data Analytics](https://www.iiba.org/certification/iiba-certifications/specialized-business-analysis-certifications/business-data-analytics-certification/)

----

よかったよかった
AzureのメディアサービスとFunctionsとBatchのバージョン問題

久しぶりにSDKのバージョン依存に悩まされたので簡単にまとめておきます。

# Azureメディアサービス v2

Azureメディアサービスは現在、v2とv3が利用可能です。
v3は漸くポータルでも対応してきましたが、[Media Encoder Premium Workflow](https://docs.microsoft.com/azure/media-services/previous/media-services-premium-workflow-encoder-formats)はv2しか対応していないなど、まだまだv2も使う機会があります。

とはいえ、v2の開発は既に止まっているようで、最後に更新されたのは2018年9月です。.Net Core非対応です。

windowsazure.mediaservices 4.2.0
https://www.nuget.org/packages/windowsazure.mediaservices/

# Azure Functions v1.x

メディアサービスをどのPaaSで制御しようかと考えたとき、今時ではAzure Functionsになるかと思いますが、
メディアサービスのSDKが.Net Core非対応となると、Functionsも.Net Frameworkを使うことになります。
そうなるとAzure Functionsは v1.x 一択です。

ところが、数日前のv1.xの最新版ですら、Newtonsoft.Jsonのバージョンが9.0.1に固定されているのです。以上ではなく、イコールです。

Microsoft.NET.Sdk.Functions 1.0.36
https://www.nuget.org/packages/Microsoft.NET.Sdk.Functions/1.0.36

GitHubのissueでもこれまで何度も話題に挙げられたものの、この件を改善する気はないように見えます。
https://github.com/Azure/azure-functions-host/issues/2414
https://github.com/Azure/azure-functions-host/issues/3228
https://github.com/Azure/azure-functions-host/issues/4049

windowsazure.mediaservices 4.2.0のNewtonsoft.Jsonへの依存は6.0.8以上なので特に問題にはなりませんが、今度はAzure Batchの利用で制限が生じてきます。

# Azure Batch

メディアサービス v2を利用し続ける理由は、Premium Workflowでしたので、ファイルサイズの大きい動画ファイルを扱うことを想定できます。
Azure Functionsでは心許ないので、実際のファイルのアセットアップロードやダウンロードはAzure Batchを利用するのが良いかと思います。

ところが、今時点でのMicorosft.Azure.Batchの最新版13.0.0は、Newtonsoft.Jsonの10.0.3以上に依存していますので、
Azure Functions v1.xでは使えません。

Microsoft.Azure.Batch 13.0.0
https://www.nuget.org/packages/Microsoft.Azure.Batch/13.0.0

約1年前にリリースされたv.11.0.0であれば、Newtonsoft.Jsonの依存は6.0.8以上なので、利用することができます。

Microsoft.Azure.Batch 11.0.0
https://www.nuget.org/packages/Microsoft.Azure.Batch/11.0.0

1年前のものであれば・・・とは思うものの、Azure Batchでは2017年9月以前のAPIの削除が通知されています。
https://docs.microsoft.com/ja-jp/rest/api/batchservice/batch-api-status

今後のことを考えると少々不安は抱えます。

# まとめ

何かしら制約がないのであれば、Azureメディアサービス v3を使いましょう。（元も子もない）
KVMでVM立ち上げやバックアップをする

##あらすじ
前回、「[Packstackを使ってCentOS7.7にOpenstack SteinのAll in One環境を立ててみる](https://qiita.com/A0yama_anpl/items/126dfdaffe884c0bd6cf)」という記事を書いた時ですが、VMware Player上にCentOSを立ち上げOpenStackをインストールしました。
その後ですが、好き勝手にあれやこれやと設定を弄っているうちに、再起不能な状態になってしまいました。
バックアップを取りながら作業をしなかった自分が悪いのですが…。

定期的にバックアップを取ることと、qcow2ファイルでOSを管理したいという目的から、KVMを間に挟むことにしました。

今回はKVMを立ててqcow2ファイルのバックアップをとることを目的とします。

##目次
- 環境
- KVM用CentOSのインストール作業
- KVM操作

##環境
前：Windows10(VMWare) → CentOS7(OpenStack)
後：Windows10(VMWare) → CentOS7(KVM) → CentOS7(OpenStack)

という構成にすることを考えました。

##KVM用CentOSのインストール作業

VMwarePlayerの仮想マシン設定で、「Intel VT-x/EPTまたはAMD-V/RVIを仮想化」「CPUパフォーマンスカウンタを仮想化」の2つにチェックを入れます。
![2020-05-14 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/59cc1fcd-3b3f-5f69-d27a-2116eccbf1ff.png)
これを忘れるとKVM上でVMが動かないと思われます。
その他設定は今回はデフォルトで行いました。

CentOSのインストールに進みます。
CentOSのインストール時にソフトウェアを選択します。
KVMはGUIでの操作も考えます。サーバー(GUI使用)をベース環境として選び、仮想化クライアント、仮想化ハイパーバイザー、仮想化ツールのアドオンを選択しておきます。
![2020-05-14 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/923724fe-3b16-be89-75a4-57e1f85e86ac.png)
これで、インストール直後からKVMの機能が使えます。

##KVM操作
「アプリケーション」→「システムツール」→「仮想マシンマネージャ」でKVMを操作することができます。
![2020-05-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/bfd0539e-b056-313a-b886-7e50c2f12cd0.png)

マシンを新規作成する時は、いくつかの方法があります。
![2020-05-15 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/862ee52a-9399-09b8-2b4f-32657c2bad09.png)
私はisoファイルをWinSCPで転送し、ローカルでインストールしました。

環境構成の設定は、ほとんどの内容は後から変えられるので、大まかな値でも構いません。
ストレージファイルは、フォーマットはqcow2を選択し、任意の場所と容量を選択します。
![2020-05-15 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/177342c4-b263-ef42-cf87-1824ed7cccb2.png)


そのあとはまたインストール作業です。
![2020-05-14 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/123622d8-8146-0689-7598-e412aa488b22.png)
インストールが完了したら、VMをシャットダウンさせます。

デフォルトだと、/var/lib/libvirt/imagesの配下に作成したqcow2ファイルがあります。

    # ls
    centos7.0.qcow2

これをコピーして、qcow2ファイルを他へ転送したり管理することができます。
とりあえず、また壊す前にバックアップを。

    # cp -p centos7.0.qcow2 centos7.0.qcow2_bk1

VMが起動している状態だとファイルに書き込みが発生している場合があるので、ファイルに不整合が生じる可能性があります。

CUIでは、virshコマンドで操作をします。

    # virsh list --all
     Id    名前                         状態
    ----------------------------------------------------
     -     centos7.0                      シャットオフ

virsh editで、マシン環境を編集することができます。
CPUやメモリ量の調整はここで行えます。ネットワークI/Fの数も増やすことができます。

    # virsh edit centos7.0

      <domain type='kvm'>
       <name>centos7.0</name>
       <uuid>f09026ca-7060-4879-a22d-bc337c2cd074</uuid>
       <memory unit='KiB'>8290304</memory>
       <currentMemory unit='KiB'>8290304</currentMemory>
       <vcpu placement='static'>6</vcpu>
      <os>
        <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
        <boot dev='hd'/>
      </os>
       ～(略)～

/etc/libvirt/qemu配下には、初回にマシンを立ち上げるときに読み込むXMLファイルがあります。


    # pwd;ls
    /etc/libvirt/qemu
    centos7.0.xml  centos7.0.xml_bk1  networks

こちらも念のためバックアップをとりました。
VM名や指定するqcow2ファイル、NWなどの内容を少し書き換え、UUIDやMACアドレスを消したxmlを用意し、virsh defineすることで似た構成のVMを作ることもできます。

これで、HOST・GUEST共にバックアップを取れる環境を作りました。
今後失敗することがあってもある程度は安心です。
AWS RDSのバックアップからデータをサルベージする方法

# はじめに
AWSのRDSを使っている方は、RDSの機能でバックアップを取っている方も多いでしょう。
とても簡単にバックアップが取れて便利ですよね！
今回はそのバックアップからデータが必要になった場合にサルベージする方法を書いていきます！

最新で正確な情報は下記に記載されており、今回はそれを元に作業をした為そちらもご確認ください。
[AWS 公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.BackupRestore.html)

# 検証環境
RDS Mysql: 5.7.22

# サルベージ方法
データをサルベージする方法としては現状2つ方法が存在します。

- [バックアップからDBスナップショットを復元する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html)
    - DBインスタンス自体が新規作成され、そこにDBが複製されます
- [バックアップデータをS3にエクスポートする](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html)
    - S3へエクスポート後,Glue, Athenaを使用すればデータの解析ができるはずです
    - 対象なるDBエンジンのバージョンがある為注意

Mysql 5.7.22はバージョン対象外なので、バックアップデータをS3にエクスポートする方法は今回使用できませんでした。
恐らく後者の方法の方が楽な気はします。
(5.7.24からは対応していた為、よく見ずに試してエラーが出て対象外な事に気付きました:joy:)

# バックアップからDBスナップショットを復元する
基本的にはAWS コンソール RDSメニュー内からスナップショットの復元を行い、DBへアクセスすればデータをサルベージできると思います！

やってみた上での注意点としては下記かなと感じました

- スナップショットの復元はRDSのインスタンス自体が新規作成される為、インスタンスサイズ等に注意
    - 復元する際のデフォルトの設定が、元のインスタンスと同じ設定だったので不要に大きなインスタンスで立てそうになりました、、、
    - 意外と時間がかかる。今回20GiBのインスタンスの復元をして数十分かかりました、、、
- Sequel Pro等のMysqlクライアントからDBのデータを確認するためには、踏み台サーバーを用意してあげる必要がある

今回はSequel Proからデータを確認したかった為踏み台サーバーを用意してあげて接続しました。
公式でもしっかり[ドキュメント](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-connect-ec2-bastion-host/)用意してくれている為、特に困らず接続できました！
(踏み台ってスラング的な言葉だと思っていたのですが、公式でも言うんですね、、、)

踏み台サーバーを経由してあげれば、問題なくSequel Pro等のクライアントからアクセスできると思います！

# まとめ
AWS RDSはバックアップするのも簡単であれば、復元、データのサルベージも簡単で嬉しい！
PMP試験に出てくる force majeure を知ろう！

# force majeure とは
天変地異などの不可抗力のこと

## PMBOKのどこに出てくるのか
PMBOKガイドに記載は無いが、一般常識として出てくるぞ！気を付けろ！

## どのような問題で出てくるのか
force majeure = powerful and unexpected event

----

よかったよかった
いろんなBOKを知ろう！

# いろんなBOK(Body Of Knowledge)を知ろう！

- BABOK
    - https://www.iiba.org/standards-and-resources/babok/
- DMBOK
    - https://dama.org/content/body-knowledge
- DSBOK
    - https://zenodo.org/record/1044350#.Xr2DGhP7QlJ
- DPBOK
    - https://publications.opengroup.org/c196
- EITBOK
    - http://eitbokwiki.org/Main_Page
- CYBOK
    - https://www.cybok.org/knowledgebase/
- HRBOK
    - https://www.amazon.co.uk/Guide-Human-Resource-Knowledge-HRBoK/dp/111937488X
- PMBOK
    - https://www.pmi.org/pmbok-guide-standards/foundational/pmbok
- QBOK
    - https://asq.org/quality-resources/about-the-quality-body-of-knowledge
- REBOK
    - https://rebok.engineersaustralia.org.au/
- SBOK
    - https://www.scrumstudy.com/sbokguide
- SEBOK
    - https://www.sebokwiki.org/wiki/Guide_to_the_Systems_Engineering_Body_of_Knowledge_(SEBoK)
- SHRMBOK
    - https://www.shrm.org/certification/recertification/Documents/18-1534%202019%20BoCK_WEB.pdf
- SQuBOK
    - https://www.juse.or.jp/sqip/squbok/index.html
- SWEBOK
    - http://swebokwiki.org/Main_Page
- UsabilityBOK
    - https://www.usabilitybok.org/
- USMBOK
    - http://www.usmbok.com/

----

いろいろあるんだね！よかったよかった
Minecraft Skript 入門編 Part.5 空間にプレイヤーがいることを確認する

# 空間にいるプレイヤーとは...？
二つの座標間にいるプレイヤーのことです。
このシステムは私がわからず[とあるグループ](https://discordapp.com/invite/svYv3EK)にて質問した結果このやり方を知りました。

一種のメモとしても残させていただきます（企画作成に使えるんですわ、これが）
# コード
```yaml:code.sk
command /test:
    trigger:
        location of player is within {first.location} and {second.location}
        broadcast "プレイヤーが範囲内にいます"
```
`within <location> and <location>`という構文はよく`loop within <location> and <location>`という形で使用されるのですが`<location> is within <location> and <location>`という形でも使えたんです。

次は[コチラ](https://qiita.com/meoto2408/items/77c9bf18eecd1544e91e)

前は[コチラ](https://qiita.com/meoto2408/items/ca6cee3c48c65a1fd5ea)
ドラゴンボールをadalineで分類してみた

# はじめに
- adalineとは
- 今回使用するデータ
- 実装

## adalineとは
とてもわかりやすい記事があったので貼らせてもらいます。
いわゆるパーセトプロンの改良版ですね。
[2.ADALINE](https://riverage.tokyo/neural-network/adaline/#0)

## 今回使用するデータ
今回は結構有名なirisのデータを使用します。
https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
こちらをダウンロードしておいてください。

## 実装
今回はpythonで実装したいと思います。授業の一環で自分であまり調べずに書いたので、関数化していなかったりする部分がありますがご了承ください。

~~~adaline.py
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

df = pd.read_csv(‘iris-data.csv’,header=None)
df_new = df.drop(columns=[1,3])
df_new = df_new.replace(‘Iris-setosa’,0)
df_new = df_new.replace(‘Iris-versicolor’,1)
df_new

eta = 0.001
epoch = 100
cost_=[]
t = np.array(df_new[4])
X = np.array([df_new[0],df_new[2]]).T
w = np.random.normal(0.0, 0.01, size=X.shape[1] + 1)

# 重みの初期値の確認
print(w)

for I in range(epoch):
        input_ = np.dot(X,w[1:])+w[0]
        predict = np.where(input_>= 0, 1, 0)
        errors = t - predict

        # 重みに更新
        w[1:] += eta * np.dot(errors,X)
        w[0] += eta * errors.sum()

        # コスト関数の計算
        cost = (errors**2).sum() / 2.0
        cost_.append(cost)

# 重みの確認
print(w)


# とりあえずプロット        
x_a = range(4,8)
y_a = [-(w[1]/w[2])*xi-(w[0]/w[2]) for xi in x_a]
plt.scatter(df_new.iloc[:50,0],df_new.iloc[:50,1],label = ‘Iris-versicolor’)  
plt.scatter(df_new.iloc[50:,0],df_new.iloc[50:,1],label = ‘Iris-setosa’)
plt.ylabel(“petal length[cm]”)
plt.xlabel(“sepal length[cm]”)
plt.plot(x_a,y_a)
plt.legend()
plt.show()
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637759/323ec0b2-4374-618b-e795-93a774ac12a1.png)


ほとんど逐次処理で書いていますが、うまくグラフがプロットされています。自分的にもadalineの理解を深めることができたのでよかったです。

## 最後に
いかがだったでしょうか？あまりきれいなコードではありませんが、pythonも書いているということで載せてみました。今後はもっとレベルの高いものを載せていきたいと思います。
Google maps APIでピンにドラゴンボールの情報を埋め込んでみよう！

# はじめに
- 複数のピンの立て方のおさらい
- 情報を付け加える方法１
- 情報を付け加える方法２
- 最後に

## 複数のピンの立て方のおさらい
私の一個前の記事に複数のピンの立て方が掲載されていますので、そちらを参照してください。
[Google maps APIで複数のドラゴンボールの場所にピンを立てよう！ - Qiita](https://qiita.com/Ryunosuke-watanabe/items/77b05ec6cab162b3fe62)

今回は立てたピンに情報を付け加えていきたいと思います。前回同様、複数のピンを目標としますのでfor文をうまく活用していきたいと思います。

Htmlは前回のままです。

~~~maps.html
<html>
<head>
    <meta charset=“UTF-8”>
    <title>map</title>
    <link rel=“stylesheet” href=“css/style.css”>
</head>
<body>
    <div id=“map”></div>
    <script src=“js/map.js”></script>
    <script src=“data/place.json”></script>
    <script src=“https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEYg&callback=initMap” async defer></scriptsrc>></script>
</body>
</html>
~~~

Cssも前回と同様です。

~~~style.css
body {
    height: 100%;
    width: 100%;
}

#map {
    height: 100%;
    width: 100%;
}
~~~

## 情報を付け加える方法１

ここまでは前回と同じですが、JSONの方から改善していきたいと思います。JSONにその場所の紹介文を載せておきたいと思います。今回は全てtestとしておきます。

~~~place.json
var place_data = [
    {
        “Loc”: “バンナ公園”,
        “lat”: 24.375031,
        “lng”: 124.160795,
        “balloon”: “test”
    },
      {
        “Loc”: “石垣島鍾乳洞”,
        “lat”: 24.361743,
        “lng”: 124.154466,
        “balloon”: “test”
    },
      {
        “Loc”: “石垣やいま村”,
        “lat”: 24.40489,
        “lng”: 124.144636,
        “balloon”: “test”
    }
]
~~~

## 情報を付け加える方法２

次にJavaScriptの変更です、前回とは異なりmarkerの情報を保存するリストとウィンドウの情報を保存するリスト二つを用意します。

~~~map.js
var map;
var marker = [];
var infowindow = [];
var Center = {lat: 24.4064, lng: 124.1754};
function initMap() {
    map = new google.maps.Map(document.getElementById(‘map’), {
        center: Center,
        zoom: 11.5
    });
    markerset()
};

function markerset(){
    for(var i=0;i<place_data.length;i++) {
        marker[I] = new google.maps.Marker({
            position: {lat: place_data[I].lat, lng: place_data[I].lng},
            map: map,
            title: place_data[I].loc
        });

        infowindow[I] = new google.maps.InfoWindow({
            content: ‘<div class=“mapsballoon”><h2>’ + place_data[I].loc + ‘</h2>’ + place_data[I].balloon + ‘</div>’
        });
        markerEvents(i)
    }
}

function markerEvents(i) {
    marker[I].addListener(‘click’, function() {
        infowindow[I].open(map, marker[I]);
    });
}
~~~

このように書くことで、for文でmarker・infowindowにそれぞれ値を格納していくことができます。addListenerメソッドをしようすることで、クリックしたときにinfowindowが表示されるようにすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637759/2d3598e8-2069-5f3d-03d4-f67ce73277ab.png)


## 最後に
いかがだったでしょうか？前回の予告通りピンに情報を付け加える方法を紹介しました。次回はピンを表示する際の工夫を施していこうと思います。
参考文献
https://developers.google.com/maps/documentation/javascript/examples/event-simple
Unityでマウスポインタでドラッグ＆ドロップ 

Unityでマウスポインタでドラッグ＆ドロップするときは、

1)カメラにPhysics Raycasterをつける必要あり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/3c002df6-4640-adec-03ce-b0e22ccc3e97.png)

2) UI.Text
必要以上に大きくすると干渉する。適切なサイズにするか、Raycast対象外にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/c8e8ec7f-ff28-3627-f82b-7df01ec61261.png)
【Docker】docker-maven-pluginでdocker:startするとContainer stopped with exit code 141 unexpectedly after ${time}ms while waiting on log out 'mysqld: ready for connections']で落ちる問題への対処【Maven】

# TL;DR
ボリュームを使い切っていたことが原因だったため、クリーンアップしたら解決しました。

- [vagrant \+ docker \+ mysql で mysql を起動したら Check that your OS and file system support files of this size のエラーが出た \- pospomeのプログラミング日記](https://www.pospome.work/entry/20160505/1462444972)
- [未使用のコンテナ、volumeなどを一括削除 \- Qiita](https://qiita.com/reflet/items/5caa88abcf1e8964783a)

調査方法に関しての備忘用に書きます。

## 利用しているプラグイン
今回の件に直接は関係しませんが、利用しているプラグインは`fabric8io/docker-maven-plugin`です。

- [fabric8io/docker\-maven\-plugin: Maven plugin for running and creating Docker images](https://github.com/fabric8io/docker-maven-plugin)

# 調査経緯
そのまま実行してもログには特に具体的なエラーは表示されず、何がどうエラーになっているか分からなかったため、`mvn docker:start -X`として`full debug logging`を有効にして実行しました。
すると以下のようなログを見つけました。

```bash
[ERROR] InnoDB: Write to file ./ib_logfile101failed at offset 6291456, 1048576 bytes should have been written, only 393216 were written. Operating system error number 28. Check that your OS and file system support files of this size. Check also that the disk is not full or a disk quota exceeded.' [Pattern: mysqld: ready for connections] [thread: 17]
```

要するにディスク周りを調べろということだったので色々検索し、`docker volume prune`するとエラーが解消しました。
TSLint + Prettierを入れたがIntelliJでうまくlintエラーを表示してくれなくてハマった話

# ハマりポイント
下記記事を元にTSLintとPrettierの統合を行ったときにIntelliJ上でどうも適切にPrettierの設定をlintエラーとして表示してくれなくてハマりました。
[Integrating with Linters · Prettier](https://prettier.io/docs/en/integrating-with-linters.html#tslint)

CLIで直接lintをかけた場合は適切にlintエラーが表示されたのでIDEとの連携の問題です。

# バージョン
この問題にハマった時点のツールやプラグインのバージョンを記載しておきます。

|ツール・プラグイン名|バージョン|
|:-:|:-:|
|IntelliJ IDEA|2020.1.1|
|TSLint|6.1.1|
|Prettier|2.0.5|
|tslint-config-prettier|1.18.0|
|tslint-plugin-prettier|2.3.0|
|IntelliJ上のPrettierプラグイン|201.7223.99|

# 原因・解決策
Prettierの設定を`.prettierrc.js`に書いていたのですが、どうやらこれだと適切にIDEがlintエラーを表示してくれないようです。
こちらの記事に何気なく書かれていましたが、Prettierの設定を`tslint.json`に直接書くとIDE上でうまくエラー表示できたとのことです。
[Prettierを導入する際に調べたことまとめ - なになれ](https://hi1280.hatenablog.com/entry/2018/12/09/223134)

ということで、Prettierの設定を`.prettierrc.js`ファイルから`tslint.json`に書くとうまくいきました。

before

```js:.prettierrc.js
module.exports = {
  trailingComma: 'none',
  tabWidth: 2,
  semi: true,
  singleQuote: true
};
```

after

```json:tslint.json
{
  ...
  "rules": {
    "prettier": [
      true,
      {
        "trailingComma": "none",
        "tabWidth": 2,
        "semi": true,
        "singleQuote": true
      }
    ],
    ...
```

[tslint-plugin-prettier](https://github.com/prettier/tslint-plugin-prettier)のREADMEにも`tslint.json`に直接Prettier設定を記載することもできるとは書かれていたのですが、まさかそれで変わるとは思っておらず少々ハマってしまいました。。

ちなみに[tslint-plugin-prettier](https://github.com/prettier/tslint-plugin-prettier)のREADMEには、`tslint.json`にPrettierの外部設定ファイルのパスを記載することもできると書かれていますが、これも試したところIntelliJ上でうまくlintエラーは表示されませんでした。

# まとめ
TSLint + Prettierを入れた際にIntelliJ上で適切にエラーを表示させたい場合はPrettierの設定を`tslint.json`に書きましょう。
ESLintは知らん。というかAngular ESLint化はよ。
【Golang】関数

#【Golang】関数

Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//関数

import "fmt"
/*
//定義
func 関数名（引数 引数の型）戻り値型{

}
*/

//funcで関数宣言(引数の型)（返り値の型）
//同じ型の場合(x, y int)と省略できる。通常は(x int,y int)
//return で返す場合は返り値の型が必要。
func add(x, y int) (int, int) {
	return x + y, x - y
}

//ネームドリターンバリュー
//引数、返り値を見ただけで、何をするのかが分かるので推奨。
//reslut int で変数名と返り値の型指定
//最初に返り値を指定しているので、returnは省略できる
func cal(price, item int) (result int) {
	//返り値で指定しているので、:=にしなくてもいい
	result = price * item
	return
}

//戻り値のない関数
func noreturn(){
	fmt.Println("No Return")
	return
}


func convert(price int) float64 {
	return float64(price)
}

func main() {
	r1, r2 := add(10, 20)
	fmt.Println(r1, r2)

	//戻り値の破棄 _
	//r1, _ := add(10, 20)


	r3 := cal(100, 2)
	fmt.Println(r3)

	noreturn()

	a := convert(1)
	fmt.Println(a)
	

	//無名関数
	//オブジェクトに関数を格納
	f := func(x int) {
		fmt.Println("inner func", x)
	}
	f(1)
	
	//簡易的な関数ならそのまま実行する方法
	func(x int) {
		fmt.Println("inner func", x)
	}(1)
}

```
【Python】Cloud StorageにアップロードするオブジェクトのCache-Controlを変更する

# 目標
PythonでCloud StorageにアップロードするオブジェクトのCache-Controlを変更します。

[公式のドキュメント](https://cloud.google.com/storage/docs/viewing-editing-metadata?hl=ja#edit)にPythonのサンプルコードがなく、ハマりポイントがあったので書き残します。

## コード

```Python:upload.py
def main():
    _, temp_local_filename = tempfile.mkstemp()
    with codecs.open(temp_local_filename, 'w', 'utf_8') as f:
        f.write('テキスト')

    os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'credencialsファイル名'
    client = storage.Client()
    bucket = client.get_bucket('バケット名')
    blob = bucket.blob('アップロード先ファイル名')
    blob.upload_from_filename(filename=temp_local_filename)
    blob.cache_control = 'no-cache'
    blob.patch()
    return "success"
```

### 正しい方法

```Python:upload.py
    blob.cache_control = 'no-cache'
    blob.patch()
```

設定されているか確認します。

```bash:bash
$ curl -v "https://storage.googleapis.com/バケット名/ファイル名" 2>&1 | grep -i Cache-Control
* h2 header: cache-control: no-cache
< cache-control: no-cache
```

![screenshot-console.cloud.google.com-2020.05.15-09_50_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390632/ea10b839-8b1e-204e-6fa2-fc9a9adf2366.png)

Cache-Controlがno-cacheになりました。

### 間違った方法

metadataには

- [固定キーデータ](https://cloud.google.com/storage/docs/metadata?hl=ja#mutable)
- [カスタムメタデータ](https://cloud.google.com/storage/docs/metadata?hl=ja#custom-metadata)

があり、Cache-Controlは固定キーデータにあたります。以下のコードはカスタムメタデータを設定するため、Cache-Controlが正常に設定されません。


```Python:upload.py
    blob.metadata['Cache-Control'] = 'no-cache'
```

どのように設定されているか確認します。

```bash:bash
$ curl -v "https://storage.googleapis.com/バケット名/ファイル名" 2>&1 | grep -i Cache-Control
* h2 header: cache-control: public, max-age=3600
* h2 header: x-goog-meta-cache-control: no-cache
< cache-control: public, max-age=3600
< x-goog-meta-cache-control: no-cache
```

x-goog-meta-cache-controlに設定されてしまっています。

![screenshot-console.cloud.google.com-2020.05.15-09_36_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390632/2e6fc5d6-afd2-ab9d-bf32-b2d855d65f31.png)

コンソールで見ても本来のCache-Controlとは別項目に値が設定されています。

## 参考
- [Setting Content-Encoding header for Cloud Storage Uploads with upload_from_file](https://github.com/googleapis/google-cloud-python/issues/3099)
Google maps APIで複数のドラゴンボールの場所にピンを立てよう！


# はじめに
- ピンの立て方のおさらい
- for文で回してピンを立てる
- JSONからデータを取得する
- 最後に

## ピンの立て方のおさらい
私の一個前の記事にピンの立て方までが乗っていますので、そちらを参照してください！
[Google maps APIでドラゴンボールのある場所にピンを立てよう！！ - Qiita](https://qiita.com/Ryunosuke-watanabe/items/ba34ad5c0a5564982a57)

今回は複数のピンの立て方について解説していきます。複数のピンを立てる際に、一個ずつ立てるのもいいですがそれだと効率が悪いです。ですのでfor文をしようして効率よくピンを立てていきたいと思います。

HTMLは前回のままです。

~~~maps.html
<html>
<head>
    <meta charset=“UTF-8”>
    <title>map</title>
    <link rel=“stylesheet” href=“css/style.css”>
</head>
<body>
    <div id=“map”></div>
    <script src=“js/map.js”></script>
    <script src=“https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap” async defer></scriptsrc>></script>
</body>
</html>
~~~

Cssも前回と同じです。

~~~style.css
body {
    height: 100%;
    width: 100%;
}

#map {
    height: 100%;
    width: 100%;
}
~~~

## for文で回してピンを立てる

今回はJavaScriptでピンを複数立てる操作をしていきます。

~~~map.js
var map;
var marker;
var place_data = [
    {
        “Loc”: “バンナ公園”,
        “lat”: 24.375031,
        “lng”: 124.160795,
    },
      {
        “Loc”: “石垣島鍾乳洞”,
        “lat”: 24.361743,
        “lng”: 124.154466,
    },
      {
        “Loc”: “石垣やいま村”,
        “lat”: 24.40489,
        “lng”: 124.144636,
    }
]
var Center = {lat: 24.4064, lng: 124.1754};
function initMap() {
    map = new google.maps.Map(document.getElementById(‘map’), {
        center: Center,
        zoom: 11.5
    });
    marker()
};

function marker(){
    for(var I=0;i<place_data.length;i++) {
        marker = new google.maps.Marker({
            position: {lat: place_data[I].lat, lng: place_data[I].lng},
            map: map,
            title: place_data[I].loc
        });
    }
}
~~~

Markerというファンクションを作成しその中でfor文で回します。place_dataという配列を作成しその中に位置情報・場所の名前を記入しておきます。あとはfor文でmarkerを立てていくだけです。

## JSONからデータを取得する
先ほどはJavaScriptの配列の中に位置情報や場所の名前を入れていましたが、今後のことを考えてjson の方にデータを移してJavaScriptとつなげたいと思います。

~~~place.json
var place_data = [
    {
        “Loc”: “バンナ公園”,
        “lat”: 24.375031,
        “lng”: 124.160795,
    },
      {
        “Loc”: “石垣島鍾乳洞”,
        “lat”: 24.361743,
        “lng”: 124.154466,
    },
      {
        “Loc”: “石垣やいま村”,
        “lat”: 24.40489,
        “lng”: 124.144636,
    }
]
~~~
JSONの方でこのように書き込むとJavaScriptでスムーズにJSONと接続することができます。あとはhtmlでscriptを追加するだけです。

~~~maps.html
<html>
<head>
    <meta charset=“UTF-8”>
    <title>map</title>
    <link rel=“stylesheet” href=“css/style.css”>
</head>
<body>
    <div id=“map”></div>
    <script src=“js/map.js”></script>
    <script src=“data/place.json”></script>
    <script src=“https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEYg&callback=initMap” async defer></scriptsrc>></script>
</body>
</html>
~~~

これだけで簡単にJSONと接続することができます。これからたくさんのピンを立てたいと考えたときは、やはりJSONでデータを分けた方がいいと思いますのでこちらで書いたほうがいいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637759/d86d000b-1f98-2ade-cbfd-ca09f14540c3.png)


## 最後に
いかがだったでしょうか？前回の予告通り複数のピンを立てる方法を紹介しました！次回はこのピンに情報を埋め込む方法を紹介したいと思います！