OmniAICreator/Qiita-1.07M huggingface dataset:
FaceBook グラフAPIエクスプローラで広告の情報を取得する。

#概要
FaceBookの広告アカウントで出稿している広告のレポートデータを取得しようとしたがドキュメントが壮大なので読み込みや理解に時間が掛かってしまった。「最初に、これが解ってれば早かったのに。。」というところをまとめておきます。

(2020/12/05時点の内容)
#### 準備
ビジネスアカウントに開発アカウントで作成したAPP（開発用）を追加する必要があります。
開発アカウントでAPPを作成し、ビジネスアカウントの設定画面から登録する流れになります。
登録フローは、仕様によって変わるのでご自身で検索して見てください。


##グラフAPIエクスプローラとは

Developersアカウントにて使用できる開発ツールです。
テストでデータの取得するなど様々なことが出来ます。
どのAPIを使うかわからないとき、とりあえず試せるのが素敵。

![スクリーンショット 2020-12-05 12.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658904/fa0439f3-9160-c3f4-e51f-47a37fe55187.png)


###FaceBook広告の概念
階層として、キャンペーン/広告セット/広告 となっています。
各種にIDが振られています。

ビジネスアカウントID　= act　　
自分のアカウントID　　= business_id
キャンペーンのID　　　 = selected_campaign_ids 
広告セットのID　　　　= selected_adset_ids
広告のID　　　　　　　= selected_ad_ids     

指定するとき必要になるので覚えておいてください。



###APIのURL

キャンペーン　　【各種ID】/campaigns
広告セット　　　【各種ID】/adsets
広告　　　　　　【各種ID】/ads
クリエイティブ　【各種ID】/adcreatives
広告レポート　　【各種ID】/insights


ビジネスアカウントIDの場合のみ'act_'をつける必要があります。例 : act_12345678/ads


###取得したい値
取得したい値は,fieldsで指定することが出来ます。
例 : fields=name,status
上記のURLと組み合わせて使用します。
#####例 ：  act_12345678/campaigns?fields=name,status

作成したキャンペーンの名前とステータスを取得することが出来ます。



####実践
####1. FaceBookアプリを指定し、アクセストークンを発行します。
![スクリーンショット 2020-12-05 13.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658904/ee78b421-ee7d-9fad-9289-25e19e2af281.png)
#####2. URLにIDと参照したいものを指定する。
ここでは、ビジネスアカウントIDの所有するキャンペーンの名前とステータスを呼び出します。
例 act_12345678/campaigns?fields=name,status
![スクリーンショット 2020-12-05 13.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658904/7195185d-8955-7d0b-23f2-57d91e387094.png)
####3. 送信ボタンをクリックして下記の結果になっていれ取得出来てます！
```
{
  "data": [
    {
      "name": "キャンペーン名",
      "status": "ACTIVE",
      "id": "123456789"
    },
    {
      "name": "キャンペーン名",
      "status": "PAUSED",
      "id": "12345678"
    },  
  ],
  "paging": {
    "cursors": {
      "before": "hoge",
      "after": "hoge"
    }
  }
}
```

この基本的な検証方法さえ解っていれば、簡単に欲しい情報をドキュメントから得れると思います。

キャンペーン　https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group
広告セット　https://developers.facebook.com/docs/marketing-api/reference/ad-campaign
広告　https://developers.facebook.com/docs/marketing-api/reference/adgroup
広告レポート　https://developers.facebook.com/docs/marketing-api/insights
クリエイティブ　https://developers.facebook.com/docs/marketing-api/reference/ad-creative

公式スタートガイド
https://developers.facebook.com/docs/marketing-apis/get-started



####あとがき
このツールを知らずに、Laravelにコマンドを作成しては、検証を行っていたのでツールを知ったときに便利すぎて膝から崩れ落ちました。。。
私自身、FaceBookAPIの知識はまだまだですが、概念や基本的な検証に時間を使ってしまうのはもったいないと思い作成致しました。9ヶ月目のエンジニアの拙い記事ですが、同じ広告系エンジニアの力になれたと思います。
Vagrantのprivate_networkが設定されない（Windows10）

WindowsでVagrantのプロバイダーをHyper-Vで動かす時に、どうやってもプライベートIPが設定されないので諦めていたのですが、公式文章を見つけました。
現時点(2020/12/5)では対応していないようです。

[Vagrant公式 Limited Networking](https://www.vagrantup.com/docs/providers/hyperv/limitations#limited-networking)

```:Vagrantfile
config.vm.network :private_network, ip: "192.168.33.10"
```
アプリケーションの作成準備

## 最初に
・アプリケーションの内容を考える
・アプリケーションの名前を決める
・アプリケーションの雛形を作る
・データベースを作る

#### 追加で下記も行う。
■ 効率よく書く為にSlimを使える様にする
■ 見栄えを良くする為にbootstrapを導入する
■ Railsのエラーメッセージを日本語で出せる様にする

##1.作成するアプリケーションの内容を考える
今回はタスク管理のアプリケーションを作ります。
**CRUD**という基本的なデータベース操作を使用します。
**C**　Create(作成)
**R**　Read(参照)
**U**　Update(更新)
**D**　Delete(削除)
###作りたい機能のリスト
・一覧表示機能
・詳細表示機能
・新規登録機能
・編集機能
・削除機能

##2.アプリケーションの名前を決める
私は今回は**taskleaf_2**という名前にします。

##3.アプリケーションの雛形を作る。
書式

```terminal
$ rails new アプリケーション名 [オプション]
```
今回はデータベースにPostgreSQLを使用するするので「オプション」部分には「postgreSQL]を指定。

```terminal
$ rails new taskleaf_2 -d postgresql
```
taskleaf_2のディレクトリに移動したら、データベースを作成しましょう。

```terminal
$ bin/rails db:create
```

データベースの作成が出来ればサーバを起動してテストしてみましょう。

```terminal
$ bin/rails s
```
##4.タスクモデルを作成する
**モデルってなに？**
簡単に言うとデータベースにアクセスする為の機能を持ったクラス（オブジェクト）のことを言います。 コントローラーの命令に従って、データベースから何らかの情報を取り出したり、あるいはデータベースに何らかの情報を書き込んだりするのがモデルの主な仕事です。
![mvc_pattern.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377131/b2219f75-bdc4-d113-823c-ad4a337202e9.png)
らしいです。。
ということで、これからタスクの登録や削除といったタスク管理の機能を実装する為に、
まずは、コントローラーの操作の対象となる**「タスク」モデル**の実装を行ます。

###★モデルのクラスの名前を決める
名前は以下のような命名規則があります。

```text
1.モデルのクラス名はキャメルケース
2.モデルのデータベース名はスネークケース
```
【キャメルケース】
単語の**先頭を大文字**にする命名規則です。
【スネークケース】
単語の間を**アンダーバー**でつなぐ命名規則です。

今回は素直にモデルのクラス名はキャメルケースで 「Task」とつけます。

###★データベースのテーブル名を決める
テーブル名はモデルのクラス名の複数形となります。

クラス名が**「Task」**なので、テーブル名は**「tasks」**と言うことになります。

##★タスクモデルの属性を設計する
今回のタスクモデルには５つの属性が必要そうです。
**「ID」「名称」「詳しい説明」「登録日時」「更新日時」**
IDや、登録・更新は、railsが自動的に用意してくれるので、残りの２つを準備します。

| 属性の意味 | 属性名・カラム名 | データ型 | NULLを許可するか | デフォルト値 |
|:-:|:-:|:-:|:-:|:-:|
| 名称  | name  | string  | 許可しない  | なし  |
| 詳しい説明  | description  | text  |許可する   | なし  |

##★タスクモデルのひな形を作成する
Railsにはモデルを作成する為に便利なジェネレーターがあります。

```terminal
書式
$ bin/rails g model [モデル名] [属性名:データ型 属性名:データ型 属...] [オプション]
```
今回はこうなります。

```terminal
$ bin/rails g model Task name:string description:text
```
実行されると
「モデルのクラスファイル」「マイグレーションファイル」「モデルの自動テストのファイルのひな形」が自動で作成されます。

##★マイグレーションでデータベースにテーブルを追加する
モデルのクラスはテーブルの定義を読み込んでから動く為、モデル作成の場合はテーブルの追加から行うとスムーズ。
「tasks」テーブルを追加したいので**追加する**という**マイグレーションファイルが必要。**
```db/migrateにXXXXXXXXXXXXXX_create_tasks.rb
```と言うファイルが出来ているので開いて確認します。
今回は必要な物が揃っているので追加変更はせずに進みます。

マイグレーションをデータベースを適用するには、

```terminal
$ bin/rails db:migrate
```
を行う。

**次回　コントローラーとビュー**
プリミティブ型のソートでは最悪計算時間に注意する

Java11にはさまざまなソートAPIが用意されていますが、ソートアルゴリズムとして、プリミティブ型のソートにはDual Pivot Quick Sortが、参照型のソートにはTimsortがそれぞれ採用されています (以下は`java.util.Arrays`より抜粋したもの)

```java:Arrays.java
public class Arrays {
    public static void sort(int[] a) {
        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
    }
    
    public static void sort(Object[] a) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a);
        else
            ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
    }
}
```

詳細は[英語版Wikipedia](https://en.wikipedia.org/wiki/Timsort)や[ニコニコ大百科](https://dic.nicovideo.jp/a/%E3%83%86%E3%82%A3%E3%83%A0%E3%82%BD%E3%83%BC%E3%83%88)の記事などを見てほしいのですが、Timsortはざっくりいってしまうとマージソートの改良版みたいなもので、平均計算時間・最悪計算時間ともに$O(nlog{n})$です。一方、Dual Pivot Quick Sortは改良版とはいえもともとはクイックソートなので、平均計算時間はTimsortと同じ$O(nlog{n})$ですが、最悪計算時間は$O(n^2)$になります。**つまり、Java11でプリミティブ型のソートを行う場合は$O(n^2)$になる可能性があることに注意する必要があるということです。**

実をいうと、プリミティブ型のソートの最悪計算時間が$O(n^2)$だということはJavaDocにもきっちり書かれていることで、たとえば以下は`Arrays.sort`からの抜粋になります。

> Implementation note: The sorting algorithm is a Dual-Pivot Quicksortby Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithmoffers O(n log(n)) performance on many data sets that cause otherquicksorts to degrade to quadratic performance, and is typicallyfaster than traditional (one-pivot) Quicksort implementations.

要は知らなかったではすまされないということですね…

プリミティブ型のソートの計算時間が$O(n^2)$になるのは天文学的な確率というか、現実的にはJavaを意図的に攻撃するような場合にしか起きないのですが、例えばCodeforcesにはHackという、他人のソースコードが正解できないようなテストケースを考えて提出できる仕組みがあり、このHackでは狙われる場合があります。Codeforcesユーザの中ではこれをAnti Quick SortとかQuick Sort Killerとかいうそうで、そういうテストケースのジェネレータを公開している人もいます: https://codeforces.com/blog/entry/4827

現実のアプリケーションを作っている現場では、俗に「いじわるテスト」などと称して、ある種のストレステストを行うことがありますが、このときにAnti Quick Sort / Quick Sort Killerを試してみても良いかもしれません。
【NeosVR】面白い所と楽しみ方

#【はじめに】
NeosVRというゲームがめちゃくちゃ面白いのにあまり人が増えないので、
面白さと楽しみ方を伝えていきたいと思います。

#【NeosVRの面白い所】
__1.同じ場所・複数人でものがつくれる__
これが本当にすごい。最初に1番感動したところです。
NeosVRでは自分・他者が作ったものを保存・編集できるので、
自分1人では何年かかっても作れないようなワールドが数時間で作れてしまいます。
自分は全然NeosVRの操作が分からず、プログラム知識もほぼ0だったのですが、カラオケワールド作りたい！
の一言であっという間にできてしまったのには本当に感動しました。
![2020-05-05 21.17.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927736/ef3118af-16ba-ed82-5ece-007c302aa2a8.jpeg)

__2.できることが多すぎる__
できることが多すぎて可能性の塊しかないです。
正直NeosVRでできることを全て把握している人はいないと思っています。

ちょっと数例をできることを挙げてみます
　テトリスができる、カードゲームができる、ギャンブルができる、麻雀ができる
　魚釣りができる、カラオケができる、テニスができる、クライミングができる、
　スマホが使える、買い物ができる、プログラムが組める、PvPやPvCゲームを作れる
　PC内のデータをもってこれる、PCの画面共有できる、
　Youtubeが見れる、DJができる、Twitterができる、サイン会ができる、
　配信ができる、音声認識ができる、音声通訳ができる
　アバターの作成/調整ができる、表情を設定できる、
　目や舌のトラッキングができる、触覚デバイスが使える...など

これらのほとんどはユーザーが遊ぶことで実現しており、
NeosVRでものを作ることはプログラミングの知識がなくてもできます。(自分がそうです)
できることは日々増えていくので、毎日新しい発見を楽しむことができます！


#【NeosVRの楽しみ方】
__1.フレンド申請をしまくる__
これは必須です。必ずやっておきましょう。
なんか面白そうなことをやっているのに参加したり、分からないことを聞いたり、遊びにきてもらえたりします。
ユーザー検索はもちろんのこと、プレイヤーのネームプレートにレーザーを当てトリガーしたり、
Neos Stationというワールドで日本人ユーザーにフレンドが送れるのでどんどん申請してみましょう。
![neost.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927736/831e0444-bee8-ff4b-e163-19f8c3cd3bd5.png)

__2.作りたいものは遊んで見つける__
「色んなことができるのは分かったけど、何を作ったらいいか分からない..」
っていう人もいるかと思います。
全然OKです! 自分も特に何も作りたいものがないときがあります。
そういう人はまずワールド・アイテム・イベントで遊んでみてください
遊んでみることで、
「これ楽しい！」
「こんなことできるんだ！」
「こういうものがあるのか！」
「こうしたらもっと面白いんじゃない?」
と自分が何に興味があるのかが分かります。
そうすればあとは簡単で、興味があるものを自分なりに作ってみればOKです
コツとしては
「これは簡単にできそう」「ちょっと設定をいじってみようかな」
のような小さいことから初めていくのがおすすめです。


__3.分からない所は気軽に聞いてみる__
自分はUnityやBlenderでものを作ってみようとしたことがありましたが、
途中で断念してしまいました。
理由としてはネットや本を見て調べてもやり方が分からず、調べているだけで1日が終わってしまったためです。
作りたいものがあるのになかなか作れないのはかなりストレスでした。
でも、NeosVRは違います。

①分からなかったら、その場で聞くことができます。
②やり方をその場で見ることができます。
③経験と知識が豊富な方がたくさんいます。

この3つがあるから、やりたいことがあって調べるのに1日を費やす必要はないんです。
数分で解決します。
最初は聞くことばっかりになってしまいますが、
これを繰り返していくと、あるとき急にものがつくれるようになります。
これが本当に楽しく、NeosVRで2番目に感動したことです。


__4.聞き方のコツ__
・暇なそうな人を見つける
　基本的には作業しておらず、ぐるぐる回っている人やふらふら移動している人が
　おすすめです。そういう人はたいてい暇してます。
・内容によって聞く人を変える　
　人によって得意としている分野が全然違います。
　聞いてみると色々分かるので、ある程度分かってきたら聞き分けてみるとよいです
　(参考程度に頭のバッチが多い人ほどNeosVRに詳しい方が多いです)
・同じ人に聞きすぎない
　当然、聞かれる人にもやりたいことがあるので、
　長時間ずっと同じ人に聞きすぎるのは控えた方がよいです
　
...色々書きましたが、最初はあまり深く考えずに、
　 「今大丈夫ですか？」から、聞いてみるのが一番よいです
　　聞かずに1人でずっと悩んでいるとなかなかできることが増えずに
　　楽しめない状態になりがちです。
　　NeosVRは優しい人が多いので、聞いてみると色々教えてもらえますよ！

#【さいごに】
NeosVRはVR機器がなくてもデスクトップモードでもできますので、
気になった方はぜひSteamからダウンロードしてみてください～
まず最初はJP tutorial worldへ行くことをお勧めします！
↓NeosVRの日本人コミュニティはこちらから！イベントなどの情報盛りだくさんです！
https://discord.gg/3gGkWFt3TT


(アドベントカレンダー12/6担当spoil  https://adventar.org/calendars/5277 )
ローカル環境、ローカルサーバーの「ローカル」の意味


# ローカルとは
エンジニアになるための勉強を始めてみれば、ローカルという言葉が当たり前のように使われており、初めて目にした方は若干の戸惑いを覚えてしまうかもしれません。ローカルとは、自分のパソコン内の環境を指す言葉であり、対義語はリモートである。よりわかりやすく言い換えるならば、それぞれの家がインターネット回線などで結ばれている状況下、自分の家の中がローカルであり、他人の家の中がリモートとなります。

# ローカルサーバーとリモートサーバー
ローカルサーバー、リモートサーバーといった呼び方も同様のイメージであり、Ａさんが自分のパソコンの中に立てたサーバーはＡさんにとってのローカルサーバーであり、インターネットを通じてつながれているＢさんのサーバーはリモートサーバーとなる。もちろんＢさんにとってのリモートサーバーはＡさんにとってのローカルサーバーとなります。データベースについても同じであり、ＡさんとＢさんの両方にとって、Ｃさんが構築したデータベースはリモートなデータベースサーバーということになる。つまり、他人がネットワーク越しにアクセスする先はすべてリモートであり、自分が独自の環境で完結できるものだけをローカルということができる。

# ローカル環境、ローカルマシン
これまでの説明を踏まえれば、ローカル環境、ローカルマシンという言葉についてもスムーズに理解しやすくなります。いまあなたが触っているパソコンがローカルマシンに他ならない。ローカルマシンには定義が設けられており、ネットワークに接続されていなくても利用できる状態のハードであるとされている。他方、ローカル環境には明確な定義が設けられていないが、おそらくそれは一言で環境と言っても広義すぎるからであり、少し具体性のあるローカル開発環境という言葉であれば、“ローカルマシン1台で完結する開発環境”であると表現されている。つまり、Webサーバーとデータベースサーバーを同じ1台のマシンで運用している状態であると理解できる。

# まとめ
例えば、自分のPCからlocalhost8080でサーバーを立てても、そのサーバーはリモート環境に含まれない。自分の目の前にあるパソコン、つまりローカルマシンで立てているのだから、リモートという表現は当てはまらないため、リモート環境とはいえないのである。
学習習慣がついてきて、よかったことをあげてみます

## はじめに
@milkybear さんからバトンを受け取り、[TechCommit Advent Calendar 2020](https://qiita.com/advent-calendar/2020/tech-commit)の7日目を担当させていただきます。そう と申します！

Kubernetesについてのお話をしようと思ってたのですが、こちらは後のお楽しみにさせていただきますw
[TechCommit](https://www.tech-commit.jp/)で勉強しはじめて多分半年ぐらいなのですが、学習習慣が身についてきてよかったなと思うことをつらつらと書かせていただきます。

## 忙しい人向けのざっくりとした概要
こんな感じの内容が書かれてます！

- Kubernetesのアプリケーション開発者向けの資格である、CKADを取得しました
- 仕事でできない技術があっても落ち込まず、まぁ勉強すればいいんじゃない？、と割と楽観的になりました
- いろんな人が扱っている技術に興味がでてきました
- どうやったら勉強が続けられるかなんとなくつかめてきました
- 今までやってこなかったけど興味があることにチャレンジするようになりました

## 前書き
前提として、私はエンジニア歴は割とあるのですが、広く浅くの分野が多く、得意分野を聞かれてもパッと答えられない問題がありました。
広く浅くの知識や技術を少しずつ深めたい、得意分野をつくっていきたい、の想いから学習をつづけています。
何か一つでも参考になると嬉しいです。

さぁ、ここから本編です！！

## 本編

### Kubernetesのアプリケーション開発者向けの資格である、[CKAD](https://training.linuxfoundation.org/ja/certified-kubernetes-application-developer-ckad-jp/)を取得しました

Kubernetesを業務で触る機会はあったものの、かなり知識が断片的だったので、どうにかしたい想いで勉強してました。
理解することが多くて結構大変でしたが、無事~~ぎりぎり~~受かりました！
KubernetesとかCloudNativeの分野わからないことだらけですが楽しいですね。

この辺をひたすら勉強してました。

- [Docker + Kubernetes で構築する Webアプリケーション 実践講座](https://www.udemy.com/course/web-application-with-docker-kubernetes/)
- [Kubernetes Certified Application Developer (CKAD) with Tests](https://www.udemy.com/course/certified-kubernetes-application-developer/)
- [Kubernetes完全ガイド 第2版 impress top gearシリーズ Kindle版](https://www.amazon.co.jp/dp/B08FZX8PYW)

### 仕事でできない技術があっても落ち込まず、まぁ勉強すればいいんじゃない？、と割と楽観的になりました
タイトル通りなのですが、よく考えてみたら今できない分野があっても勉強すればいいだけじゃね？、って感じですよね。
新しく何かに挑戦する時も、まあやれば良いんじゃ無い？ってなるので自分は○○ができない、とか考えて落ち込むの無駄だなって気付けました。経験がないと難しいこともありますが、チャンスは間違いなく広がるかな、って思います。
勉強系のコミュニティなら、つよつよの方とか同じく勉強している方にアドバイスがいただけるのでありがたいですね！！

### いろんな人が扱っている技術に興味がでてきました
こちらもタイトルの通りですが、いろんな分野の勉強をされている方がいらっしゃいます。
あ、次これやってみたいな、ってなります！
そうしてやりたいことだらけになり時間が足りなくなるという別の問題がおきてます笑

### どうやったら勉強が続けられるかなんとなくつかめてきました
私は眠気にとても弱いので、睡眠時間削って勉強はほぼ100%挫折するタイプです。
またアニメ観賞やネサフが好きなので、毎日だらだらみてしまうタイプでもありますが、
もくもく会のある、平日の夜だったり、たくさん寝た次の日の朝だったら割と勉強できることが判明しました。
周りで勉強している人がいる、という事実が目に入るだけでも私も勉強しよう〜って効果ありますよね。

あとは普段の生活や仕事で、とある技術について気になったら都度勉強するスタイルなら楽しくできるようです。
こんな感じに、これからもゆるふわにマイペースに勉強してこうと思います！

### 今までやってこなかったけど興味があることにチャレンジするようになりました
QiitaのAdvent Calendar（この記事です）初めて書きました。
基本目立ちたくないタイプで人前に積極的に立ちたがらないタイプでもありますが勉強会で教える側としてチャレンジ中です。
Kubernetes、Linux、TOEICだったり色々資格試験にもチャレンジするようになりました。
勉強していくと勉強が楽しくなってくる、みたいな感じでしょうか。

引き続きTechCommitを使わせていただきながら、学習をつづけてみて自分がどう成長していくかを楽しく見届けたいと思います。

## 後書き
夏休みの宿題、読書感想文だけ苦手すぎて作文用紙には「わたしは、」だけを書き夏休み後に泣きながらやるタイプだったのですが、この記事は無事に書けてほっとしました。
最後まで読んでくださりありがとうございました！

明日はLinuxが大好きな @kenyuu2143 さんです、お楽しみに！
Automation Anywhere A2019.17 のアップデート情報

12月2日にリリースされた[Automation Anywhere A2019.17](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/release-notes/release-a2019-17.html)に関するアップデート✨ by [AA de Knight #6](https://aaj.connpass.com/event/192638/)

# 1. AISense
対象: CE, Enterprise

AISenseは通常の画面タグの要素分解ができない場合 (例: 画像)に使うレコーダーですが、A2019.17からはひとつの「ユニバーサルレコーダー」ボタンから起動するようになったとのこと。

A2019.16まで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/cde24bec-c0be-0075-372b-a91230ebcfab.png)

A2019.17より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/7582f858-84ee-2f41-2edd-920232131651.png)

一番左のボタンを押すと、こういうウィンドウが起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/e0b36a41-0935-6675-9ca2-ab7bb9b5d7a8.png)

AISenseのモードだと、画像であってもフィールドの部分っぽいところを認識して指定できるようになるとのこと。
![aisense.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/3e5f104c-3511-1e5e-92bf-dcbcb879b0a5.png)

今後のアップデートとして、レコーディング中のスマートレコーダー/AISenseの切り替え、オブジェクト検出時に自動で切り替える機能が予定されているとのこと、これは便利！

# 2. Edge (Chromium)ブラウザ対応
対象: CE, Enterprise

Chromium ベースの Edge に対して、オブジェクトベースの自動化をサポートとのこと。従来の Edge についても今後対応予定。Edge アドオンストアからプラグインのインストールが必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/77f01524-7919-eda6-15da-eb54ca77e961.png)

# 3. Bot Scanner
対象: Enterprise

未対応のコマンドについて ETA (実装予定バージョン)が記載されるようになったので、待つ側の期待値が持てるようになった。他にも全 Bot についての "Download CSV"やタイムアウト機能などが実装された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/3594ecdd-14d1-c9d1-c42c-da83a1e651fb.png)

# 4. EWS - OAuth 2.0 サポート
対象: CE, Enterprise

全 Email パッケージでEWS OAuth2 を使用して認証可能になった（初回は接続の認証が必要）。EWS client ID と tenant ID を使用する。ベーシック認証と選択になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/6d792923-0384-d737-396d-261925cf00c2.png)


# 5. Excel、Terminal Emulatorのセッション共有
対象: CE, Enterprise

親 Bot と子 Bot で Excel と Emulator のセッションを共有可能になり、より柔軟な処理のモジュール化が可能になった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/9605006f-d15a-b6d1-642d-ea8615551673.png)

* 新規にセッション型の変数が追加、セッション情報の受け渡しを行う
* Excel とターミナルエミュレーターの全コマンドで、セッションとしてセッション型変数を指定できるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932396/9b66149e-0cb8-20a0-fb37-0981a938fef9.png)

# 6. その他

### AWS Workspaces でのBot Agent 動作サポート
いままではAWSはEC2でのみであったのが、より廉価盤のWorkspacesでもOKになった。

ちなみに、他には[Bot agent compatibility](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/deployment-planning/on-prem-install/cloud-bot-agent-compatibility.html)によると以下をサポートしている。

* Amazon Web Services EC2 on Windows 10, Windows 2012, Windows 2016, and Windows 2019
* Amazon Web Services WorkSpaces on Windows 10
* Google Compute Engine on Windows 2012, Windows 2016, and Windows 2019
* Microsoft Azure on Windows 10 Pro
* VMware VMs on ESXi 6.7
* Oracle Virtual Box version 6.1

### AARI
Community Edition 、フリートライアルで利用可能に (ただし制限あり)、ユーザーインターフェースの改善、ヒューマンタスクの自動割り当て、などなど。

### Bot Insight
AARI ダッシュボードが追加された。

### Discovery Bot
レコーディング時に選択部分をハイライト表示するようになった。

などなど。
strapiで自動生成されるAPIのカスタマイズをする

こんにちは。株式会社dottの山上です。
普段はQiita:teamで社内向けの記事しか書いてないので若干ビクビクしておりますが、
Strapi Advent Calenderの6日目の本日は、Strapiが自動生成するAPIのカスタマイズ方法について書いて行きたいと思います。

Strapiの概要や始め方については、[strapi advent calendar](https://qiita.com/advent-calendar/2020/strapi)の以下の記事を参照お願いします！
[HeadlessCMS Strapiの使いどころ](https://qiita.com/watalucky/items/13bba3ece7ac7605bc57)
[Strapi Quick Start Guide 日本語訳](https://zenn.dev/tomigie/articles/e6c77540fb42f5)(こちらの記事は[zenn](https://zenn.dev/)へ飛びます)

# まずはモデルを作成する
[こちら](https://zenn.dev/tomigie/articles/e6c77540fb42f5#3.content-types%3A-restaurant%E3%82%92%E4%BD%9C%E6%88%90)を参照してください。

# strapiが自動生成してくれるAPI
strapiはモデルを作成すると以下6種類のAPIを自動生成してくれます。
基本的なCRUDとエントリ数のカウントをするAPIですね。

|Method|Path|Description|
|---|---|---|
|GET|/{content-type}|{content-type}のエントリ一覧を取得する|
|GET|/{content-type}/:id|{content-type}の指定したidのエントリを取得する|
|GET|/{content-type}/count|{content-type}のエントリ数を取得する|
|POST|/{content-type}|{content-type}のエントリを作成する|
|DELETE|/{content-type}/:id|{content-type}のエントリを削除する|
|PUT|/{content-type}/:id|{content-type}の指定したidのエントリを更新する|

# APIのカスタマイズ
APIは、モデル定義後にプロジェクト内に自動生成される`./api/{content-type}/controllers/{content-type}.js`を編集する事でカスタマイズできます。
[公式ドキュメント](https://strapi.io/documentation/v3.x/concepts/controllers.html#core-controllers)にカスタマイズするためのベースになるコードが紹介されているので、まずはそれをコピペしてから編集していくことになります。

まずはこのrequire文でparseMultipartDataとsanitizeEntityを使えるようにします。

```js
const { parseMultipartData, sanitizeEntity } = require('strapi-utils');
```
`parseMultipartData`: formData形式のリクエストをdata(json部分)とfiles(アップロードするファイル)に分けるメソッド
`sanitizeEntity`: モデルからprivate fieldとして定義したフィールドを削除するメソッド

例えば、restaurantというモデルのcreateでメールアドレスの重複をチェックして、重複していれば409エラーで返却する、という事をしたい場合は、以下のような感じです。

```js:./api/restaurant/controllers/restaurant.js
// restaurantというモデルにemailというフィールドが存在するという前提です。
const { parseMultipartData, sanitizeEntity } = require('strapi-utils');

module.exports = {
  async create(ctx) {
    let entity;
    if (ctx.is('multipart')) {
      const { data, files } = parseMultipartData(ctx);
      if (await strapi.services.restaurant.isDuplicated(data.email)) {
        return ctx.response.conflict('duplicate email.');
      }
      entity = await strapi.services.restaurant.create(data, { files });
    } else {
      if (await strapi.services.restaurant.isDuplicated(ctx.request.body.email)) {
        return ctx.response.conflict('duplicate email.');
      }
      entity = await strapi.services.restaurant.create(ctx.request.body);
    }
    return sanitizeEntity(entity, { model: strapi.models.restaurant });
  }
}
```

`isDuplicated`はサービス側に定義してあげるとコントローラ側の記述がスッキリするのでオススメです！

```js:./api/restaurant/services/restaurant.js
module.exports = {
  // restaurant内に同じemailが存在する個数を数えて、1個でもあればtrueになって返却されるメソッド
  isDuplicated: async (email) => {
    return await strapi.services.restaurant.count({email}) > 0;
  }
}
```
# まとめ
- モデルを作るとAPIが自動生成されます、すごい！
- 自動生成されるAPIはカスタマイズが可能。基本的なCRUD以外で何かしたいときはカスタマイズしてみましょう。
- サービスをうまく使ってコントローラ側の処理を読みやすくしましょう！

今回は以上になります、ではまた次回！
react-router 同ページ内で再描画されない解決メモ

コピペで動くようなコードじゃないので、具体例思いついたら修正予

```react

import React, {
  useState,
  useEffect
} from 'react';

import { useLocation } from "react-router";

export default function Foo(props) {

  // カレントロケーション
  const location = useLocation();
  
  // コンポーネントに渡す変数等
  const [bar, setBar] = useState();
  
  // ロケーションに変更があったら、stateを書き換える
  useEffect(() => {
    setBar();
  }, [location]);

  return (
     <Baz bar={bar} />
  );
}
```
[iOS14]SwiftUIで追加読み込み

## iOS14で簡単になった「追加読み込み」

iOS14で追加された`LazyVStack`, `LazyHStack`を使うと、iOS13ではできなかったSwiftUIによる「追加読み込み」機能が簡単に実現できます。
iOS13では、UITableViewを使って実現する方法しかありませんでした。

## ポイント

- LazyVStackを使い、アイテムの表示領域と、一番下に追加読み込み中のViewを配置します
- 追加読み込み中Viewの`onAppear`を使い、追加読み込みをトリガーします

## ソース

### View

```swift
struct ContentView: View {
    
    @ObservedObject var viewModel: ViewModel = .init()
    
    var body: some View {
        
        ScrollView {
            LazyVStack {
                //アイテム表示領域
                ForEach.init(self.viewModel.items, id: \.self) { value in
                    Text(value)
                        .frame(height: 50)
                        .frame(maxWidth: .infinity)
                        .background(Color.init(white: 0.9).clipShape(RoundedRectangle(cornerRadius: 8))
                                        .shadow(radius: 4))
                        .padding(4)
                }
                
                if self.viewModel.canLoadMore { //さらに読み込める時、表示する
                    Text("Loading ...")
                        .padding()
                        .onAppear {
                            debugPrint("onAppear")
                            self.viewModel.loadMore() //このViewが表示された時、追加読み込みをトリガー
                        }
                }

            }

        }
        
        
    }
}
```

### ViewModel

```swift
class ViewModel: ObservableObject {
    
    @Published var items: [String] = [] //アイテム表示用の情報
    
    private let max: Int = 100 //最大アイテム数
    private let countPerPage: Int = 20 //ページあたりのアイテム数
    
    init() {
        
        items = (0..<countPerPage).map({ "Item : \($0+1)" })
        debugPrint(items)
    }
    
}

extension ViewModel {
    
    /// さらに読み込めるかどうか
    var canLoadMore: Bool {
        return items.count < max
    }
    
    /// さらに読み込み処理
    func loadMore() {
        
        //通信的な感じを出すため、１秒後に追加を実行
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
            self?.appendItems() //アイテムを20個追加
        }
        
    }
    
}

.....

```

## スクリーンショット

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/29374222-2eb5-719e-1387-c9ea0ca96fec.png"/>

最後の「Loading ...」が表示されてから１秒後に、アイテムが２０個ずつ追加されます。

## 参考

https://developer.apple.com/documentation/swiftui/lazyvstack
https://developer.apple.com/documentation/swiftui/list/onappear(perform:)
https://www.donnywals.com/implementing-an-infinite-scrolling-list-with-swiftui-and-combine/
flutterでExpected ios/Runner.xcodeproj/project.pbxproj but this file is missing.ってエラーが出たとき

Flutterでビルドしてたら、(なんかコンフリクトが起きてたのを対処したからか)「Expected ios/Runner.xcodeproj/project.pbxproj but this file is missing.」ってエラーがでました。
ググったら、英語のサイトばっかりひっかかったので、日本語のメモを残しておきます。

### 環境
Mac OS 11.0.1
Android Studio 4.1
Dart 2.10.4
Flutter 1.22.4
Macに元から入ってるSimulatorのiPhone 12 Pro Max(iOS 14.2)

### 解決策
新しいflutterプロジェクトを作って、それのios/Runner.xcodeproj/project.pbxprojをコピペして、エラーの出たプロジェクトの同じ場所にペーストするだけ！
以上です。。

### 参考させていただきました。
https://stackoverflow.com/questions/59500596/flutter-project-on-mac-copied-from-windows

### ちなみに、これの通りやってみてもうまくいかなかったサイト
https://github.com/flutter/flutter/issues/28231
https://github.com/flutter/flutter/issues/22886
(英語が読めてないだけだったらごめんなさい。)
Intrinsic SizeのPlaceholder

#Placeholderとは
実行時のサイズは決まってないが、とりあえずレイアウトを作成しておきたい時にサイズ設定などを保留できるものだそうです。
#使ってみた
画像のように`ImageView`を置いてTopとLeadingの制約だけ追加した状態にします。
今の段階だと、WidthとHeightが決まっていないのでエラーになっています。
![スクリーンショット 2020-12-05 12.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/78fb2162-e754-0f81-44c0-7613891876c4.png)
そこでPlaceholderの出番です。
右下にある`Intrinsic Size`をPlaceholderに設定します。
![スクリーンショット 2020-12-05 12.35.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/cc00ab6a-22a6-6f2a-c15f-5132456c1e0b.png)
![スクリーンショット 2020-12-05 12.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/8e98467c-a41d-c380-7e9a-540903eda8fc.png)
無事にエラーが消えで実行することができます。
#実行してみた
実行するとImageViewの表示はありません。
一旦レイアウトとして置いておく為のものなので反映はされないわけです。
![スクリーンショット 2020-12-05 12.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/bc996e21-cefd-4ae6-3705-4e19417b220d.png)
#どんな時に使うか
結局ここがわからないとイメージしづらいです。
この例で言うと、実行時には何かしらの画像を入れるのでWidthとHeightは決まるが、今はまだ画像の設定はしないでレイアウトにだけ置いときたい！
と言うような場面で使うらしいです。
【Swift】コレクションについて〜String〜

#コレクションとしてのString型
文字列のどこがコレクションなの？と思うかもしれませんが、
**文字列は文字の集まりなのでコレクションとして捉えることができます。**

実際、String型は単一の文字を表す型であるCharacter型のコレクションとして定義されており、
文字の列挙や文字数のカウントなどの機能を備えております。

###Character型 とは

Character型とは先ほども記載しましたが、単一の文字を表す型になります。

一つ注意しなければならないのが、明示的にCharacterと定義しないと
型推論によりString型として宣言されてしまうという点です。

```swift

let string = "abc"   // String型
let word = "a"   // String型

let char: Character = "a"   // Character型
```

##String.Index型

String.Index型は、文字列内の位置を表す型になります。

String.Index型を用いることにより、
**文字列内の特定の位置を指定しその位置に存在する文字にアクセスできます。**

String.Index型の`.`は、この型がString型の中にネストして定義されていることを表します。

**ネスト**とは・・・あるものの中に、それと同じ形や種類の（一回り小さい）ものが入っている状態や構造のこと。ITの分野では、コンピュータプログラムやデータ構造において、ある構造の内部に同じ構造が含まれている状態のことを指す。
~ IT用語辞典より引用 ~

つまり、**String型の中にIndexという型が存在しているということになります。**
そのIndex型を参照するのにString.Indexと記述します。

`.`は`〜の`と認識するのがいいかもしれません。
StringのIndexという感じですね！

String.Index型の値は、String型の先頭位置を表すstartIndexプロパティや、
String型の末尾位置を表すendIndexプロパティなどを利用して取得します。

```swift

let string = "abc"   // String型
let startIndex = string.startIndex   // String.Index型
let endIndex = string.endIndex   // String.Index型
```

String型からCharacter型の値を取り出すにはサブスクリプトを使用します。
インデックスにはString.Index型を指定します。
(サブスクリプトのインデックスとは[index]のindexの部分です！)

```swift

let string = "abc" (String型)
let char = string[string.startIndex]   // "a" (Character型)
```

`let string = "abc"`で、String型の文字列を宣言しています。

let char = string[string.startIndex]は、
まず初めに、`string.startIndex`でString型の定数stringの先頭位置を取得してます。
この時のstring.startIndexは、String.Index型になります。

次に、`string[string.startIndex]`でサブスクリプトにstring.startIndexを指定し、
定数stringの先頭の文字を取得しています。

それを最後に、`let char = ・・・`の部分で定数charに代入しています。

endIndexプロパティは末尾のインデックスを取得をします。
ですが、末尾のインデックスとは最後の文字のインデックスではなく、
その次のインデックを示します。

なので、サブスクリプトのインデックスにendIndexを入れると実行時エラーになります。

```swift

let string = "abc"   // String型
let char = string[string.endIndex]   //実行時エラー
```

エラー内容：`Fatal error: String index is out of bounds`
和訳：致命的なエラー：文字列インデックスが範囲外です


先頭の文字を取得する方法はわかりましたが、
末尾の文字や、n番目の文字を取得するにはどうしたらいいか。

そんな悩みを解決してくれるメソッドがString型には備わっています。
それは、`index(_:offsetBy:)`メソッドです。

index(_:offsetBy:)メソッドは、startIndexやendIndexが返す値をずらすことができます。
`index(元になるインデックス(String.index型): ずらす位置(Int型))`で記述します。

```swift

let string = "abcde"   // String型
let start = string.startIndex   // String.Index型
let end = string.endIndex   // String.Index型

//先頭から１つ後ろにずらす
let index1 = string.index(start, offsetBy: 1)   // String.Index型
let b = string[index1]   // b

//末尾から１つ前にずらす
let index2 = string.index(end, offsetBy: -1)   // String.Index型
let e = string[index2]    // e
```

また、最初に記載した通りString型は値の集合として表現されていますので、
for-in文を用いて全ての要素に順次アクセスすることが可能です。

```swift

let string = "abcde"   // String型

//文字数のカウント
string.count   // 5

//要素の列挙
for char in string {
    print(char)
}

実行結果
a
b
c
d
e

```

`string.count`は、Int型でstringの文字数の値を返します。

`for char in string { }`は、stringの文字数分{ }内の処理を繰り返します。
今回は、"abcde"の５文字なので５回処理を繰り返します

またcharに入る値ですが、
1回目の処理はcharにstringの1文字目が、
2回目の処理はcharにstringの2文字目がと順に入っていきます。
(for文に関しては別記事に詳しく記載する予定です！)



普段使っている特に意識せず使っていたString型ですが、
いろいろな機能を備えていたんですね・・・。

まだまだ自分の知識は足らないなと思ったので、
もっと勉強に励まなければなと思いました。

以上。最後までご覧いただきありがとうございました！
実践コミュニティ

これは [FOSS4G Advent Calendar 2020](https://qiita.com/advent-calendar/2020/foss4g) の記事です。

FOSS4G で作られた FOSS4G である [国連ベクトルタイルツールキット](https://unvt.github.io) では、実践コミュニティというアイディアを大切にしています。

国際連合には経済社会理事会の決議に基づいて作られた、[地球規模の地理空間情報管理に関する専門家委員会（UN-GGIM）](https://ggim.un.org)があります。

2020年の8月に、この専門委員会で[統合地理空間情報枠組（IGIF）」](https://ggim.un.org/IGIF/)の実装ガイドが承認されました。かつて空間データ基盤（SDI）と呼ばれた技術的枠組みは、IGIF で言われているような技術的枠組みに変わりつつあると感じています。具体的には、メタデータやポータルといった分析的・機械的アプローチの限界が明らかになり、より対話的・包摂的なアプローチが主流化されつつあるように思います。

私は、特に IGIF 実装ガイドの 8.6.10 で示されている「実践コミュニティ（Community of Practice）」というコンセプトが重要であると感じています。IGIF 成果文書では、実践コミュニティは次のように説明されています。

1. 実践コミュニティとは、ある話題について、関心や課題や情熱を共有するグループで、継続的なやりとりを通じて分野の知識や知見を深めていく。
2. 実践コミュニティのメンバーは信念や志をともにし、課題への関心を共有する。
3. 実践コミュニティのメンバーは実世界で証明済みの実践や新知識を共有し、能力と教育の価値や利益を高める。

ビジネスチャットの活用の道が政府でも開かれつつあるように思います。分散・非同期・非接触の実践コミュニティが増えることで、デジタル改革やデジタルトランスフォーメーションが進むことになるのではないかと思っています。また、国内実施と国際協力を不可分のものとして連携させることができる道が開けるのではないかと考えています。
UE4.26.0 RemoteControlAPI 初期手順メモ

## UE4 RemoteControlAPI
https://docs.unrealengine.com/ja/ProductionPipelines/ScriptingAndAutomation/WebControl/index.html

## クイックスタートドキュメント
https://docs.unrealengine.com/ja/ProductionPipelines/ScriptingAndAutomation/WebControl/QuickStart/index.html
こちらが、2020/12/05現在、UE4.23用であったため、手順をメモします

英語はUE4.26版になっています
https://docs.unrealengine.com/en-US/ProductionPipelines/ScriptingAndAutomation/WebControl/QuickStart/index.html

## 動作するまで
1. プロジェクト作成
サードパーソンで作成する
（クイックスタートはこのプロジェクトをベースに説明してあるため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/df08b4b3-d546-2887-6a44-40e3dbaae5b6.png)

1. プラグイン インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/ed4fd290-2a39-b86c-2fc9-5d971f5f3b8b.png)
プラグインを有効にし、UE再起動

1. APIサーバー起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/03b8a938-2fed-d01b-18e3-1fc028f416a4.png)
これでサーバーが起動しない場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/496d66b5-9074-9412-1818-cbcf6e1e86a5.png)
ログがここで止まってしまっている
WebControl.StopServerをしてもう一度WebControl.StartServerで起動した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/3f60da0a-5d13-6830-7f7e-bf30cc38ec2d.png)
ちゃんとログにListenポートがでている

1. APIをたたく
アプリケーションのインストールをドキュメントで勧められているが面倒なのでCURLで叩く
JSONファイルを作成、ue4command.jsonで保存
  
```
{
        "objectPath":"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightSource_0.LightComponent0",
        "access":"READ_ACCESS",
        "propertyName":"RelativeRotation"
}
```

実行
上記ログにでていたポートに向ける

```
$ curl -X PUT -d @ue4command.json -H  "Content-Type: application/json" http://localhost:30010/remote/object/property
```

## Remote Control Web Interface
https://docs.unrealengine.com/en-US/ProductionPipelines/ScriptingAndAutomation/WebControl/RemoteControlPresetsAndWebApplication/index.html
こちらのドキュメントにあるRemote Control Web Interfaceプラグインが見当たらないんですよね・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/84ff59fd-9c33-89e7-c140-9a90f8ff38ef.png)
Macで特定のバージョンのProtobuf(Protocol Buffers)のInstall方法

##コマンド
以下のコマンドをベースに好きなバージョンに書き換えれば、Installできます。

```bash

PROTOC_ZIP=protoc-3.12.0-osx-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.12.0/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local ‘include/*’
rm -f $PROTOC_ZIP
```


自分が今お世話になってるプロジェクトで、protobufのバージョンの指定があったんだが、色々試しても最新のVersion以外でInstall出来なかったので、ここに記してます。
※ここに来るまで、1時間強かかった。。。

##参考Web
http://google.github.io/proto-lens/installing-protoc.html
Notionでユーザグループを作る

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 5日目のエントリです。
4日目は[Notionでページに目次を作る Table of Contents](https://qiita.com/pictiny/items/af5d4dafcac846f0c095)でした。

# ユーザグループ
Notionではユーザグループごとにページの権限を設定することができます。
`Settings & Members` の `Groups` から `Create a Group` ボタンを押すことで作成できます。

## ページの権限設定
ページに対して、ユーザグループへの権限を以下の5段階で選択できます。

- 閲覧、編集、コメント、共有設定が全て可能な `Full access`
- 閲覧、編集、コメントのみ可能な `Can edit`
- 閲覧、コメントのみ可能な `Can comment`
- 閲覧のみ可能な `Can view`
- 閲覧不可とする `No access`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/8a8024a0-8798-b57e-6084-fe0a0fd69b6e.png)
ページの権限は `Full access` の権限を持ったユーザによって設定できます。

# まとめ
Notionでページの公開範囲を絞りたい場合には、ユーザグループを作りましょう！
ユーザグループ機能を使えるのはTeam Planからなのでご注意ください。

ユーザグループについての公式ドキュメントは[Group permissions](https://www.notion.so/Group-permissions-541a920f960c45319891ce9114413607)にありますので、そちらもご覧ください。
【Tips】Viewで参照しているテーブルスキーマを変更した場合に実施する必要があるコマンド

#はじめに
この記事は、[Azure SQL & Synapse Analytics Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-sqldb-and-synapse) の 6 日目の記事です。

Msdnフォーラム [(Msdn フォーラム (SQL Server/Azure))](https://social.msdn.microsoft.com/Forums/ja-JP/home?category=sqlserver&forum=sqlazureja%2Cwindowsazureja&filter=alltypes&sort=lastpostdesc) のQ/A対応を実施していますが、**Viewで参照しているテーブルスキーマを変更後に実施する必要があるコマンド**があることがあまり知られていないみたいなので、今回、紹介してみたいと思います。
#目次

[1. Viewで参照しているテーブルスキーマを変更した場合に実施する必要があるコマンド](#1-viewで参照しているテーブルスキーマを変更した場合に実施する必要があるコマンド)
[2. 参考情報](#3-参考情報)

#1. Viewで参照しているテーブルスキーマを変更した場合に実施する必要があるコマンド
Viewで参照しているテーブルスキーマを変更した場合、Viewのメタデータを更新する**「sp_refreshview」**というストアドプロシージャを実行する必要があります。

**[コマンド]**

*use [データベース名]*
*go*
***sp_refreshview [ビュー名]***
*go*

**[コマンド例]**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/92c45c54-8942-cf4f-0ac4-5ab28bf4b7a0.png)



**[補足]**
sp_refreshviewの中では、**sys.sp_refreshsqlmodule_internal**というストアドプロシージャが実行されています。 
**[コマンド : sp_helptext 'sp_refreshview']**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752487/10e54fe1-3d14-aac5-776b-4a5373670280.png)


#2. 参考情報
・[sp_refreshview (Transact-sql)](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-refreshview-transact-sql?view=sql-server-ver15)
EnOceanモジュールをM5Stackで使える環境を整える

この記事は、ALGYAN主催の [EnOcean IoT開発コンテスト](https://algyan.connpass.com/event/191271/) を機会に作った作品の流れで作り始めたもので、そのときの作品についてはこちらの [記事(EnOceanIoTシステム開発コンテストの参加レポート)](https://qiita.com/yukima77/items/bb1abb37cf708545b817) を参考に。

#この記事で説明すること
EnOceanの受信側をM5Stackなどで手軽に使えるようにしてみたよという話。なので、いろいろ作っている方の素材になればいいかなぁという程度の話です。

#EnOceanとは
とりあえず、EnOceanって何？って話もあると思うので、簡単に。
私の認識で非常に簡単に説明してみると、「エナジーハーベストの技術を使って、(基本的に)バッテリーが不要でセンサ情報を無線で飛ばせるもの」みたいな感じです。詳細はもっとすごいと思いますので、詳しくは以下のリンクを見て下さい。
センサ側が電池不要というのがかなり大きなメリットであると感じていて、IoT関連で使っている人もそれなりにいると思います。トイレの利用状況の可視化などで使われる例をよく見かけます。（ただ、ちょっとお高いイメージはあります）
https://www.enocean.com/jp/

#今回のポイント
EnOceanデバイスの送受信で手軽に組み込み系でも使えるのが、『TCM410J』というモジュールです。更に、シリアル通信で制御できるのでかなり簡単に使えます。その為、通常のマイコンボードでもArduinoでも手軽に使えます。なので、これがM5Stackなどで画面付きで作品が作れると面白いと思って、トライしてみました。

###以前にESP8266に無理やり繋いだ例
ちょっと以前のトライになります。このときは、EPS8266を使ってます。試行錯誤もあったので、とりあえずGNDを全部繋いでみたり、あまり綺麗ではない感じですが、この辺りで手軽に使えることを実感しました。ちなみに、これはドアの開閉情報に応じてLEDを光るようにして使っていました。
![DSC_0237.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/6d49bdd5-8104-c910-27b1-8953bf577537.jpeg)

###今回M5Stackで使えるようにした例
TCM410JのIO電圧が3.3V系なので、Groveインターフェイスのポートを使うのではなく、ピンヘッダ部分からで3.3Vを供給するようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/ff92d455-060d-9992-1f6b-707c31058597.png)

裏面：端子処理も最低限にして、シンプルになりました。チップ抵抗なども使ってシンプルにしています。これでも十分動きます。
![DSC_0239.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/e2677d47-9000-4a23-75c5-10c285d38470.jpeg)


###更にM5Stack/M5Stickでもっと手軽に使えるようにした例
基板を起こして、5V電源からLDOで3.3Vを作って、それで動作するようにしています。
これで、M5Stack/M5StcikなどのM5系で使えるようになりました（M5Stack/M5Stickは動作確認済み）
コネクタ部分が無理やり部品を実装していたり、電源供給が分かるようにLEDを搭載したりなどは、基板改版をして対応していくことにしました。（Eagleユーザーでしたが、KiCadに乗り換えましたｗ）
![DSC_0238.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/4be4df22-6dd8-f763-dbfa-c110042579c9.jpeg)

###他の人にも使ってもらえる環境を整える
試してみたい人が使えるように購入できるような環境も準備しています。上記の基板から以下の変更を加えています。
・電源供給が分かるように点灯LEDを追加
・5V/3.3Vを抵抗載せ替えで切り替えられるように追加
[スイッチサイエンスの販売サイト](https://www.switch-science.com/catalog/6776/)

また、実際に使ってもらった様子も知り合いがツイートしてくれています。
こちらでは、[micro:bit](https://www.switch-science.com/catalog/6600/)と[ATOM Matrix](https://www.switch-science.com/catalog/6260/)で使ってみてくれています。こんな感じで使えます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ついでに <a href="https://twitter.com/hashtag/M5Matrix?src=hash&amp;ref_src=twsrc%5Etfw">#M5Matrix</a> でも試した。UARTで受信するだけなので楽だった。 <a href="https://t.co/wsOjvlSCS9">pic.twitter.com/wsOjvlSCS9</a></p>&mdash; 五味 (@GomiHgy) <a href="https://twitter.com/GomiHgy/status/1339547247545991169?ref_src=twsrc%5Etfw">December 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#最後に
個人的にはちょっと値段が高いと思っているEnOceanデバイスですが、M5系を使えば受信側もそれなりの値段で手軽に使えるようになってきているかなと思います。あと、基板を作ったやつは近々販売する予定ですので、興味のある方はそれを待ってもらうか、個別に連絡してもらっても大丈夫です。
一応、[NT加賀2020](https://wiki.nicotech.jp/nico_tech/index.php?NT%E5%8A%A0%E8%B3%802020)では手売りする予定ですので、良かったら～

（12/26追記）
販売の用意が進んでいます。しばらくお待ちください。
教える人ほどよく学ぶ！Udemy講師のすすめ

# はじめに
Qiita、そしてQiitaへの投稿者の皆さんには日頃から大変お世話になっています。
この場を借りてお礼申し上げます。

分からないこと、ちょっと知りたいことをググるとQiitaの記事がヒットすることが多く、その度に、小さな学びや問題の解決を得ることが出来ます。

そんな「技術的な力」を持ったエンジニアの皆さんにおすすめしたいのが、Udemyの講師です。



# Udemy講師のメリット

Udemy講師になるメリットは以下の3つに整理できるかと思います。

1. [自分の知識の体系化と深め](#自分の知識の体系化と深め)
1. [自分ブランディング](#自分ブランディング)
1. [ちょっとしたお小遣い] (#ちょっとしたお小遣い稼ぎ)

## 自分の知識の体系化と深め

最初にお伝えしたいメリットは、自分の知識の体系化と深めです。

**「教える人ほどよく学ぶ」**と言われている通り、Udemyを通じて、第三者にお持ちの知識を伝えることで、自分自身の知識を体系化し、かつ、深めることができます。

というのは、コースを作成するには、レッスンプラン、つまり「章立て」を考える必要があります。
この作業から、皆さんの持つ知識をどのような塊に分けて、どのような順番で教えるべきなのかを考えることになります。必然的に自分の持つ知識を分解し、どの知識とどの知識が関連しているのかを考えなければいけません。関連している知識は通常、「最初にAを知っていないと、Bは理解できない」という関係性があり、レクチャーの順番をその順番で構成するべきということを自分で認識することになります。

つまり、レッスンプラン作成を通じて、お持ちの知識を自分で体系化することができます。

私は、[BigQuery で学ぶ非エンジニアのための SQL データ分析入門] (https://www.udemy.com/course/bigquerysql/?referralCode=30567486EBCB037EFAEC) という講座をUdemyで展開していますが、その際に作成したレッスンプラン(一部)は以下の通りでした。

![1205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/b76a9349-2ce7-acea-381d-69a670b1a8a9.png)

各セクションの順番の妥当性についてはもしかしたら議論があるところかもしれませんが、レッスンプランを考える過程で、SQLがどのような知識の「塊」でできているのかは自分自身、非常にすっきり理解できました。

## 自分ブランディング

メリットの2つめは**「自分ブランディング」**です。

エンジニアさんの知識やスキルや「腕前」というのは、実は意外と対外的に証明しづらいのではないかと思っています。（もちろん、Qiitaの記事を読む人が読めば、「むむ、この人できる！」というのはありますが、知識をまだ持っていない初心者の人には誰の記事が本当に「すごい」のか、分からないことがほとんどですね。）
私は、Google アナリティクスに基づく、Web解析コンサルタントなのですが、エンジニアの皆さん同様「実力を証明する方法」が、実はあまりないです。

そこで、Udemyでの講師です。講師をすることで、「この人は、他の人からお金を貰ってある技術を教える"先生"」なのだ。ということを対外的に証明できます。
ブランディングは自分で「私できる人なんです。」といくら言ってもまったく効果なく、第三者に「この人はできる人なんです」と言って頂く必要があります。

私は、[パフォーマンス改善のためのGoogle アナリティクス活用法] (https://www.udemy.com/course/google_analytics/?referralCode=BC62EAEF7C96CD9C39C9)という講座をUdemyで展開しています。そのコース紹介をごらんください。以下の通り「ベストセラー」のマークや、レーティング(5点満点中4.4点）、受講生数(2,386人)が表示されます。つまり、Udemyがブランディングしてくれます。

また、画像の下部にある「Udemy for Business」とは、Udemyが企業向けの提供しているBtoBプログラムです。該当の講座は、Udemyが企業内研修にふさわしいとして認めてくれた証でもあるのです。


![1205a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/def8526e-de18-70eb-ebbf-0f09d10cd999.png)

つまり、Udemy講師はエンジニアの皆さんの自分ブランディングにもなります。

## ちょっとしたお小遣い稼ぎ

メリットの3つめは、ちょっとしたお小遣い稼ぎです。

Udemyは有料の講座を「販売」できるプラットフォームですので、受講者の方がコースを購入してくれると、お小遣いになります。

私が一番最初に公開した講座は、[データサイエンティストを目指す人のための『ゼロからの Tableau 入門』](https://www.udemy.com/course/tableau-x/?referralCode=AE5AF40FCAFAC55DEDD8) です。2018年1月に公開しましたが、累計の登録者が3,200人を超えています。もちろん、全員が有料登録ではない（私が取締役をしている株式会社プリンシプルの社員には無料で提供しています）ですし、全員が定価でご購入いただいた訳ではありません（Udemyは、マーケティングプログラムにオプトインすると定期的に値引きキャンペーンをしてくれます。）が、それでもこの人数です。ある程度のお小遣いにはなっています。

![1205b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/00cc4ca0-9f98-3a74-25ef-65e753c9fbb6.png)

また、もし、エンジニアの方が複数のスキルをお持ちの場合、私のように複数の講座を展開することで、お小遣いはより稼ぎやすくなります。

# まとめ

如何でしたでしょうか？

もちろん、今、エンジニアの方は一般的には忙しい毎日を送られているとは思います。その上、Udemyの講師をするのは難しい。と思う方もいらっしゃるとは思いますが、この年末年始、頑張って講座を作ってしまうというのも良いお正月の過ごし方なのではないかと思います。

それでは。
cv2.putText 周りのエラー

## 出会ったエラー

- なんとなく `cv2.putText` していたら、`plt.imshow(img)` で怒られた

```
TypeError: Image data of dtype object cannot be converted to float
```

- 適当に対処しようとして出たエラー集

```
AttributeError: 'cv2.UMat' object has no attribute 'dtype'
```

```
TypeError: 'cv2.UMat' object is not subscriptable
```

## 対処法

```
img = img.get()
```

`.get()` で直接データにアクセスできる

## 出会ったエラー2

- pytorchの出力を `np.uint8` した後に `cv2.puttext` していたら怒られた

```python
x_t = model.step(x_0=vid[-1])
T = 10
for t in range(T):
    x_t = model.step(viw=viw[t], mot=mot[t])
    # x_tは np.uint8, 0~255, (256,256,3)
    # ↓エラー
    x_t = cv2.putText(x_t, "{:04} / {}".format(t+1, T), 
                        (5, 15), cv2.FONT_HERSHEY_PLAIN, 
                        1, (0, 0, 0), 1, cv2.LINE_AA)
    frames.append(x_t)
```

```
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<timed exec> in <module>

TypeError: Expected Ptr<cv::UMat> for argument 'img'
```

## 対処法

- どうやらpytorchの出力はnumpyに変換しても余計なものがついている気がする、ので

```
x_t = model.step(viw=viw[t], mot=mot[t]).copy()
```
- と、 `.copy()` をつけると動いた


## 対処法2

`cv2.UMat(numpy_img)` で強制的に `cv2.UMat` 形式にする
`cv2.UMat` 形式からnumpyに変換するには `.get()` をつける

```python
    x_t = model.step(viw=viw[t], mot=mot[t])
    x_t = cv2.putText(cv2.UMat(x_t), "{:04} / {}".format(t+1, T), 
                        (5, 15), cv2.FONT_HERSHEY_PLAIN, 
                        1, (0, 0, 0), 1, cv2.LINE_AA).get()
```

## 以上！
docker

1.イメージからコンテナを起動
2.コンテナの中でなにかコマンドを実行
起動したコンテナの中でライブラリのインストールとか
3.フェーズ2.をいちいちコマンドプロンプトから一行ずつ実行せずにまとめて実行
4.一気に複数のコンテナを起動する

1.関係
<image>
・起動したいimageを探す
docker search イメージ
・ダウンロードしたimageの一覧取得
docker image ls
・ダウンローとしたimageの詳細
docker image inspect イメージ名
・imageの削除
docker image rm イメージ名

<container>
起動
docker container run イメージ名
起動中のコンテナの一覧
docker container ls
起動中のコンテナを停止
docker container stop コンテナIDまたはコンテナ名
停止してるコンテナ全て削除
docker container prune

2.コマンド実行
-何か実行
docker container run イメージ名前　コマンド名
-操作可能にする: -itオプション
docker container run -it イメージ名　コマンド名
-コンソールを開放した形で実行　-dオプション
-終了と同時に削除　-rmメソッド
起動中のコンテナでコマンド実行　exec メソッド


***
その他メモ

【dockerエンジン構造】
dockerデーモン→containerd→containerd-shim/runc
・runc:コンテナを作成して起動
--libcontainer：コンテナを作成
  -namespace:ホストからコンテナを独立させる
  -cgroup:コンテナのホストリソースの使用を規定
・containerd-shim:作成したコンテナの管理

【docker ネットワーク】
libnetwork
・docker engineにより制御されている、いろいろな機能を実現するための基盤みたいなイメージ？
---サービスディスカバリー機能
名前解決関連機能
---ロードバランサー機能
アクセスをコンテナに分散させる

プラグイン：ネットワークのドライバー

【ストーレージ】
overlayfs：フェイル形式の差分からファイルシステムを作る

【docker file】
・概要
イメージを作成するための手順書
コンテナを作るためのコマンドをいちいち手でterminalに打っていたらミスの原因になるから作成手順をまとめてファイル化したもの

・イメージの作成
From:使用するイメージの宣言
Label:イメージに追加する情報
Run:実行するコマンド
Copy:ファイルのコピー　Copy ホスト相対パス コンテナディレクトリ
ENV:環境変数のデフォルト値
CMD:コンテナが起動されたときに発行されるコマンド
・docker image build -t 作成するイメージ名 dockerfileのパス
・docker image build ./ -t hogehoge
注1)dockerfileは拡張子をつけてはいけない
注2)dockerfileが存在するディレクトリに移動してコマンドを実行する
DroneBirdの隊員年齢分布について

アドベントカレンダー盛り上がってますね。

よくある質問でどのくらい隊員がいるのかって聞かれます。

公式では12/1現在505名の参加がありますが、訓練候補生としての参加しているFaceBook登録者は285名をカウントしています。
カウントされていない人というのは、以前にDroneBirdプロジェクトのクラウドファンディングを行った際に、支援を申し込んで頂いた方で、訓練候補制として参加されていない方々ということになります。

![スクリーンショット 2020-12-04 20.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322439/794f5ced-395e-c9a4-8345-c5ec372c4709.png)

285名の年齢分布になります。
男女比率としては、男性が参加している割合が多いという集まりになっていますね。

中央値は４０代となっていますが、女性に関しては30代となり、均等な人数分布を形成しています。
中年のオッサンが圧倒的に多いということですが、ドローンやマッピングの専門性を考えると、プロフェッションな内容であることは否めませんので、その筋の方が多いってことでしょう。

地域分布としては、第１位が横浜、第２位世田谷、第３位調布市と続きますが、第４位大阪と関西も検討しております。
（競ってませんが）

年齢分布として、ベストというものないですし、どの年齢でも活躍できるプロジェクトです。
ボランティア参加型の組織構成を行っていますし、活動される方のモチベーションがあれば、年齢は関係ありません！
ってことが言いたい回です。
【Linux】Network Name Space 学習まとめ



NameSpace

プロトコルの階層構造は下に行くほど中傷度が低くより具象的(電気やら光やら)になる
```
$ sudo ip netns exec ns1 tcpdump -tnel -i ns1-veth0 icmp or arp
```


ARP経過を確認するため``- or arp``を入れて確認
```
00:00:5e:00:53:01 > …
ethertype ARP (0x0806), length 42 : Request who-has 192.0.2.2 tell 192.0.2.1, length 28…
```


ARPがやりとりされている様子が見れる
ARPで``192.0.2.2``というIPアドレスを持った機器のMACアドレスを``192.0.2.1``に教えて欲しいとのコード
これが``ARPリクエスト``
次の行で``192.0.2.2``というIPアドレスは``00:00:00:33:03:00:00:``というMACアドレスを持っている
という``ARPリプライ``を送っている


一番最初などの``ff:ff:ff:ff:ff:ff``と言ったMACアドレスに送信をしているが
これはブロードキャストアドレスという
特殊なMACアドレス
「このフレームが届く限りの範囲で全ての聞きに聞いて欲しい」という意味
通信したIPアドレスのMACアドレスが分からないから教えてという発信


##### イーサネット観察

状態をupにさせて``ns1``と``ns2``を``veth``で繋ぐ一連の流れは一緒
その後の追加手順
**MACアドレスを変更することができる**
vethインターフェースのMACアドレスはデフォだとランダムに割り振られている
```
$ sudo ip netns exec ns1 ip link set dev ns1-veth0 address 00:00:5E:00:53:01
$ sudo ip netns exec ns2 ip link set dev ns2-veth0 address 00:00:5E:00:53:02
```


これで``ns1-veth0``と``ns2-veth2``の``MACアドレス``が変更される
```
$ sudo ip netns exec ns1 ip link show | grep link/ether
　link/ether 00:00:5e:00:53:01 brd ff:ff:ff:ff:ff:ff link-netnsid 1　
```


``$ ip link show``でインターフェースのMACアドレスを確認できる
```
$ sudo ip netns exec ns1 tcpdump -tnel -i ns1-veth0 icmp
    tcpdump : verbose output suppressed, use -v pr -vv for full protocol decode
    listening on ns1-veth0, link-tyoe EN10MB (Ethernet), capture size 262144 bytes
```


パケットキャプチャの用意コマンド``tcpdump``
ここで``ns1``の``vethインターフェース``を観察する
```
$ sudo ip netns exec ns1 ping -c 3 192.0.2.2 -I 192.0.2.1
```


準備ができたので``ns1``から``ns2``に向けて``Ping``を打つ
コマンド実行が終わったら``tcpdump``を実行したターミナルに戻って確認
```
$ sudo ip netns exec ns1 tcpdump -tnel -i ns1-veth0 icmp
    tcpdump : verbose output suppressed, use -v or -vv for full protocol decode
    listening on ns1-veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800),
    length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 23582, seq 1, length 64
    00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800),
    length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 23582, seq 1, length 64
```

オプションをつける``(-e)``とイーサネットを見ることができる
先程の設定をしたMACアドレスに送信元と送信先に表示されている
(上記の``tcpdump``で上からMACアドレス、IPアドレスと表示されているのは
レイア3.2.1と順番になっているように表示されている構造なのかもしれない)
(イーサネットはレイア2、IPはレイア3のプロトコルなのでフォーマット機略図もそのように書かれているのかも)


# はまった件
(名前を間違えて作ってしまったので…)試しに作成したvethを消そうと思ったが
```
error…
cannot remove namespace file Permission denied
```
``permission``は何らかの権限が絡んでいる可能性があるらしく

``sudo``コマンドを加えて実行したところ削除ができた
Azure for Studnetsを使おう！

本記事は[東京学芸大学 櫨山研究室 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hazelab)の五日目の記事になります．

# はじめに

みなさん，Microsoftが学生向けに提供している[Azure for Students](https://azure.microsoft.com/ja-jp/free/students/)というサービスはご存知ですか？

Microsoftと提携している大学などの教育機関の学生であれば使用することができます．
(大学の学内メールがoffice365なら使用できるかと思います…)

# Azure for Studnetsを有効化しよう

以下のURLにアクセスします．

> https://azure.microsoft.com/ja-jp/free/students/

大学のアカウントでログインし「今すぐアクティブ化」をクリックして電話番号による認証をすれば利用を開始することができます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/d2f34572-0786-bdcd-3840-b2695f7ac93e.png)

# Azure for Studentsでできること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/26a61903-b08b-0c25-9063-9a1024e86d08.png)


Azure for Studentsでできることは画像にあるように主に3つです．

1. ソフトウェアを無料でダウンロードできる
2. Azureのクラウドサービスをテンプレートに則って構築できる
3. Microsoftが提供する教材を使って学習をすることができる

## ダウンロードできるソフトウェア

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/58674a8b-fb9b-df8c-39dd-82a2cf7b7227.png)

2020年12月現在でAzure for Studentsからは191項目のソフトウェアをダウンロードすることができます．
ここで驚くべきは，なんと**Windows 10などのOSのライセンスを取得することができるんです．**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/0b79168c-f223-bca8-f191-b3887e2264f0.png)

Windows 10 Education(使用感はWindows 10 Proに近い)などの教育機関専用のエディションも手に入れることができます．
また**Windows Server 2016/2019のライセンスも利用可能です．**

- 自作PCを組むけどOSのラインセンスが…
- macbook買ったけどwindowsが必要だ…

などで困っている学生は試す価値があると思います！

## 学習教材

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/13002883-768e-8710-0d9e-8cb9005b1653.png)

2020年12月現在，20項目の学習教材が用意されています．
各教材には学習に含まれる教材の数，レベル，必要な時間が載っています．

時間が載っているので学習計画が立てやすいですね．

# おわりに

本記事ではMicrosoftが提供するAzure for Studentsについて取り上げました．

**非常にお得なサービスなので利用できる学生はぜひ使ってみてください🙇‍♂️**
asm6でnesファイルを作ってみた

#環境
- Windows 10 Home (64bit)

#手順
##アセンブラの用意
cc65、nesasmも試してみたけどasm6が作りやすいかと。

[Tools - Nesdev wiki]
(https://wiki.nesdev.com/w/index.php/Tools)
から`asm6.zip`をダウンロード。
例）`C:\etc\asm6`に配置。

##サンプルソースの作成
例）`C:\Projects\nes`に作成。

```nes:test1.asm
	; asm6 test1.asm test1.nes

PRG_COUNT	= 1

	; iNES header
	.db	"NES", $1a
	.db	PRG_COUNT	; PRG-ROM
	.db	$01		; CHR-ROM
	.db	$00		; mapper / mirroring
	.dsb	9, $00

	.base	$10000 - (PRG_COUNT * $4000)
Reset:
	sei
	ldx	#$ff
	txs

	lda	#%00000001
	sta	$4015
	lda	#%10111111
	sta	$4000
	lda	#$00
	sta	$4001
	lda	#%11010101
	sta	$4002
	lda	#$00
	sta	$4003
-
	jmp	-

	.org	$fffa
	.dw	0	; NMI
	.dw	Reset
	.dw	0	; IRQ

	.incbin	"tiles.chr"
```

##ビルド

```dev.bat
@echo off
path C:\etc\asm6;%path%
cmd
```

のようなバッチファイルを用意すると便利。

```
C:\Projects\nes>fsutil file createNew tiles.chr 8192
ファイル C:\Projects\nes\tiles.chr が作成されました

C:\Projects\nes>asm6 test1.asm test1.nes
pass 1..
test1.nes written (24592 bytes).
```

##NESエミュレータで実行
何でもいいが取り敢えず
[nesterJ - NES Emulator for Win32]
(http://www.dcn.ne.jp/~otim2/nesterj/dl.html)
から`nj051b_ja.zip`をダウンロード。
`test1.nes`を実行する。

[FaithJS]
(http://sairoutine.github.io/faithjs/public/)
というWebブラウザ版NESエミュレータもある。

#参考リンク
- [ASM6 templates - nesdev.com]
(https://forums.nesdev.com/viewtopic.php?t=6160)
- [ファミコンはいいぞ - Qiita]
(https://qiita.com/jumdtw/items/1f78f5327fb14b8e3d8c)
- [NES研究室]
(http://hp.vector.co.jp/authors/VA042397/nes/index.html)