OmniAICreator/Qiita-1.07M huggingface dataset:
クラスはなぜNewしないと使えないのか

※追記：主にC言語の次にJAVAかC#を勉強したときの話です。
　　　　それ以外の言語では異なる仕様があるようです。

# オブジェクト指向言語で一番最初に躓いたところ
これはかなり大昔の話になりますが、私はもともとC言語からプログラミングの世界に入りました。
オブジェクト指向言語で特徴的なのは、何といってもクラスではないかと思います。

勉強を始めた当初、私の理解では
「クラス？あ～Cで言うと構造体みたいなもんね。」
という感じでした。

いざプログラミングを始めてみると

- クラスを使う前にNewするのは何の意味があるのか？
- クラス変数を定義するのとNewするのはどう違うのか？ 
- クラス変数を別のクラス変数に代入した場合、なぜオブジェクトがコピーされないのか。

ということがさっぱりわかりませんでした。

# 今になって振り返ってみてわかっていなかったこと
なぜ上記のことがわからなかったかというと、プログラミングにおける基礎的な知識が不足していたからです。
それは、メモリ確保の概念です。
（そういう意味では当時はC言語もさほど理解できていなかったですね…）

Cであれば

```c:構造体
struct sample {
  int item1;
  const char* item2;
};
int main(void){
  struct sample a;  //構造体変数を定義
  a.item1 = 1;
  a.item2 = "aaa";
}
```

のように構造体変数を定義した時点でプログラム上にメモリが確保され、使用することができます。
C言語において変数を定義すると、変数の内容分のメモリ領域を確保することになります。

一方、クラスの場合は

```c#:クラス
public class sample{
   public int item1;
   public string item2;
}
class TestClass
{
  static void Main(string[] args)
  {
     sample a;              //クラス変数を定義
     a = new sample();      //インスタンスを作成
     a.item1 = 1;
     a.item2 = "aaa";
  }
}
```

のように、クラスをnew（インスタンスを作成）した時点でプログラム上でメモリが確保され、初めて使用できるようになります。

インスタンスとはクラスで定義された内容を取り扱うために確保されたメモリ領域のことであり、インスタンスを作成するとはメモリ上に領域を確保することである、ということが勉強をはじめた当初はわかっていませんでした。

構造体変数は変数自体が構造体の本体であり構造体用のメモリ領域を持っていますが、クラス変数は使用できるメモリ領域を持っていません。[^1]
クラス変数は、インスタンスを指し示しているだけです。Cで言うところのポインタのようなものです。

例えば、Cで

```c:
int main(void){
  struct sample a;  //構造体変数を定義
  struct sample b;  //構造体変数を定義

  a.item1 = 1;
  a.item2 = "aaa";
  b.item1 = 2;
  b.item2 = "bbb";

  a = b;
}
```

としたとき、構造体変数aとbの中身は同一になりますが、それぞれa用のメモリ領域とb用のメモリ領域の2か所に同じデータを持っている状態になります。
このとき

```c:
a.item1 = 3;
b.item1 = 4;
```

と更新すると、それぞれ違うメモリ領域を更新し、違う値になります。(a.item1=3,b.item1=4)

一方、C#で

```c#:
static void Main(string[] args)
{
   sample a;              //クラス変数を定義
   sample b;
   a = new sample();      //インスタンスを作成
   a.item1 = 1;
   a.item2 = "aaa";
   b = new sample();      //インスタンスを作成
   b.item1 = 2;
   b.item2 = "bbb";

   a = b;
}
```

としたとき、クラス変数aとbの中身は同一になりますが、元b用のメモリ領域にある１つのデータをaとbが共通して指し示している状態になります。このとき元aが指し示していたメモリ領域はどこに行くのかという話になりますが、ガベージコレクションが実装されている言語では、どの変数からも参照されなくなったメモリ領域は自動的に解放されます。

この場合

```c#:
a.item1 = 3;
b.item1 = 4;
```

と更新すると、aもbも同じ1か所のメモリ上のデータを更新しているので両方とも同じ値になります。(a.item1=4,b.item1=4)

# 初心者にとって大事だと思うこと
今になって思うことはプログラムを始めて早い段階で理解しておくべきはメモリ確保に関する概念だったなぁということです。
そこをあやふやにしたまま進んでいくと、どこかで先に進めなくなるタイミングが来ると思います。
昔のオブジェクト指向言語の入門書などでは、最初は何も考えずにとりあえずオブジェクトはnewしとけみたいな感じでかなり先まで進んでしまったような気がしますが、最初にそこを追及しておけば後々苦労しなかったと思います。

まぁ、ある程度わかるようになった後だから言えることかもしれませんが…。


---
[^1]: 参照先を示す領域は持っているというツッコミはなしで…
Matlabで別のFigureファイルを操作する

メインのfigureとサブのfigureをGUIDEなどで作成して、
メインのfigureからサブのfigureを操作したいときのやり方。

サブのfigureには、1つのaxisしか存在しない場合を想定。

```matlab
% サブのfigureを非表示でオープン
fig = openfig('subfigure.fig','invisible')

% サブのfigureのaxisのハンドルを取得
subAxis = findobj(fig.Children, 'Tag', 'axes1');

% サブのfigureに散布図を表示
scatter(subAxis, x, y, 50, 'red', 'filled');

% サブのfigureをpngとして保存
print(fig, '-dpng', 'subfigure.png');

% サブのfigureを表示
fig.Visible = 'on'
```
修改VScode行号区的背景颜色

vs code是相当不错的一个编辑器，现阶段我用来编写nim程序。
vs code非常丧心病狂一点就是行号区和编辑区的背景颜色都是一样，
这样会导致要看行首有没有对齐会非常吃力。这个问题让我纠结了非常久。

我第一次找到的解决方法是，通过修改workbench.main.css ，在里面定义margin-view-overlays的背景颜色。
但是会导致vscode文件提示损坏，这虽然不会影响正常使用。如果更新或者默认安装新版本的VSCODE，
workbench.main.css肯定会被覆盖掉，所以这个还不是最好的解决方法。
不过，如果你想魔改vscode, 直接去改workbench.main.css应该是个好方法。

**更好的方法是在用户设置用定义加入：**

```json
    "workbench.colorCustomizations": {
        "editorLineNumber.foreground": "#17a346",
        "editorGutter.background": "#020230",
        "editorCursor.foreground": "#d41313",
    },
```
打开用户设置的方法是文件-首选项-设置，快捷键是ctrl + ,
这个用户设置会保存在settings.json中
完整路径是 `%appdata%\Code\User\settings.json`

以下是我个人设置的完整内容:

```json
// 将设置放入此文件中以覆盖默认设置
{
    "vsicons.dontShowNewVersionMessage": true,
    "window.zoomLevel": 1,
    "workbench.activityBar.visible": true,
    "workbench.iconTheme": "vscode-icons",
    "workbench.statusBar.visible": true,
    "editor.accessibilitySupport": "on",
    "editor.renderIndentGuides": false,
    "[nim]": {},
    "editor.tabSize": 4,
    "workbench.colorCustomizations": {
        "editorLineNumber.foreground": "#17a346",
        "editorGutter.background": "#020230",
        "editorCursor.foreground": "#d41313",
    },
    "workbench.colorTheme": "Monokai",
    "terminal.integrated.cursorBlinking": true,


}
```
如以上设置，行号是亮绿色，行号区是暗蓝色，光标是亮红色的。

codegay 2018年2月24日 17:46:31
GitHubのマージ済のブランチをCircleCIで定期的に削除する

:warning: **2019年7月にGitHubにマージしたブランチが自動削除される機能が入ったためこの記事は内容の非推奨です。** :warning:

* [Automatically delete head branches of pull requests \- GitHub Changelog](https://github.blog/changelog/2019-07-31-automatically-delete-head-branches-of-pull-requests/)
* [ブランチの自動的削除を管理する \- GitHub Docs](https://docs.github.com/ja/free-pro-team@latest/github/administering-a-repository/managing-the-automatic-deletion-of-branches)

以下は古い記述

# 前置き
マージ済のブランチは基本的に消しても問題ないので、GitHub上には進行中のブランチだけがあるきれいな状態に保ちたいところ。

PRをマージした後にブランチを消すボタンが出るんですが、チームで開発してるとどうしても消し忘れる人が1人はいるので [^human-wasureru]CircleCIで定期的に消すようにしました

[^human-wasureru]: 人間は忘れる生き物なので仕方ないです

# 前提
* GitHub
* CircleCI 2.0

# 準備
GitHubにpushするための権限が必要なので「Settings -> Checkout SSH keys」でuser keyを追加してください

![circleci.png](https://qiita-image-store.s3.amazonaws.com/0/8059/0d3070fb-29f6-33c2-a757-c911c4b7aa11.png)


# 設定ファイル
毎日18:30にマージ済のブランチを自動で消すための設定です

```yml:.circleci/config.yml
version: 2

jobs:
  remove_merged_branches:
    working_directory: ~/app
    docker:
      - image: circleci/ruby # gitが入っていればなんでもいい

    steps:
      - checkout

      - run:
          name: Remove merged remote branches
          command: git branch -r --merged origin/master | grep -v -e origin/master -e origin/develop | sed -e 's% *origin/%%' | xargs --no-run-if-empty -I% git push --delete origin %
          # デフォルトの/bin/bash -eo pipefailだとマージ済ブランチが1つもない場合にgrepでexit 1されてジョブが失敗するので上書きする
          shell: /bin/bash

workflows:
  version: 2

  daily_branch_cleaner:
    triggers:
      - schedule:
          # NOTE: CircleCIはUTCで動いてるのでJSTにしたければ-9時間した時間を書く
          cron: "30 9 * * *" # JST 18:30
          filters:
            branches:
              only: develop
    jobs:
      - remove_merged_branches
```

## 備考
* cronの時間やbranchはよしなに変えてください
* 万が一スクリプトがバグって消したくないブランチが消えても泣かないように、GitHubでProtected branchの設定をしておくと安全です
Oracle オブジェクト権限取得(テーブルなどのGRANT)

```SQL:get_ddl_grant_objects_privs
-- #!/bin/sh
-- #@(#) \$Id get_ddl_grant_objects_privs.sh, v1.0
-- #
-- # su - oracle
-- # export ORACLE_SID=xxxx
-- # export ORACLE_HOME=/opt/app/oracle/product/12.2.0
-- #
-- # ../sql/get_ddl_grant_objects_privs.sh
-- #
-- #export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
-- ${ORACLE_HOME}/bin/sqlplus / as sysdba << EOF
--
-- オブジェクト権限取得(テーブルなどのGRANT)
--
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET LINESIZE 100
SET PAGESIZE 50000
SET TAB OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
-- SPOOL pass includes CONNECT_IDENTIFIER, USER_NAME and SYSDATE
COLUMN USER_NAME    NEW_VALUE USER_NAME
COLUMN SYSTEM_DATE  NEW_VALUE SYSTEM_DATE
SELECT USER || '_' AS USER_NAME
     , TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') AS SYSTEM_DATE
FROM DUAL ;
SPOOL get_ddl_grant_objects_privs_&&_CONNECT_IDENTIFIER._&&USER_NAME&&SYSTEM_DATE..sql
-- Windows ↑,  UNIX/Linux では ↓ を有効に
-- SPOOL get_ddl_grant_objects_privs_\&&_CONNECT_IDENTIFIER._\&&USER_NAME\&&SYSTEM_DATE..sql
COLUMN GRANTS  FORMAT A100
SELECT
    '-- FROM ' || TP.GRANTOR || ' or OWNER:' || TP.OWNER || CONST.LF
 || 'GRANT ' || RPAD(TP.PRIVILEGE, 10) || ' ON ' || RPAD(TP.TABLE_NAME, 30)
 || ' TO ' || TP.GRANTEE || ' ;' AS GRANTS
FROM(
    SELECT COLUMN_VALUE AS OWNER FROM TABLE(PKG_USERS_SCHEMA.GET_USERS_SCHEMA) -- ユーザーが作成したスキーマのみ
    ) MS
INNER JOIN DBA_TAB_PRIVS TP  -- http://docs.oracle.com/cd/E57425_01/121/REFRN/GUID-4AC57A96-FF55-4788-9301-AFED23AE3934.htm  reference
ON  TP.GRANTEE = MS.OWNER
ORDER BY
    TP.GRANTEE
  , TP.OWNER
  , TP.TABLE_NAME
  , TP.PRIVILEGE ;
SPOOL OFF
COLUMN GRANTS  CLEAR
SET ECHO ON
SET FEEDBACK ON
SET HEADING ON
SET LINESIZE 80
SET TERMOUT ON
-- exit
-- EOF
-- #export NLS_LANG=en_US
-- # ---------------------- End of get_ddl_grant_objects_privs.sh ------------------------------
```
参考
[Oracle 純粋にユーザー側のスキーマのみを取得](https://qiita.com/Papageno/items/2d4ccae4b99d79d0b48b)
[Oracle 定数](https://qiita.com/Papageno/items/7eb6b6207db3fce65e1a)
カプセル化

#カプセルの目的
フィールドを公開しない事により、変更してはならないフィールド値を謝って変更出来ない様にする。

#アクセス制御について

##アクセス制御のレベル
| 名前 　　　　　　　　　　　      　| プログラム中の記載方法 | アクセスを許可する範囲    | 
|:----------------|:-------------------|:---------------------|
|private          |private            　|自分自身と同じクラスのみ    |
|package private  |何も書かない（デフォルト）　 |自分自身と同じパッケージのみ |
|protected        |protected         　 |自分自身と同じパッケージに属するか、自分を継承した子クラス |
|public           |public　             |全てのクラス　　　　　　　　　　　　　　　　　　　　　　　　 |

##フィールド及びメソッドに対するアクセス制御について
**(考え方)**
基本的にフィールドには`private`を使用する事が多い。メソッドは作成する度に適用範囲を考える。

#メソッドを経由したフィールドの設定
##getter

**(使い方)**

```
public 値を返す型 getフィールド名(){
  return this.フィールド名;//
}
```
**(コード)**

```java
private String name;

public String getName(){
   return this.name;//このクラスのnameの値を返す
}
```
**(呼出方法)**

```
System.out.println(getName());
```


##setter

**(使い方)**

```
public void setフィールド名（引数のデータ型 引数を入れる変数名）{
  this.フィールド名＝引数を入れる変数名
}
```
**(コード)**

```java
private String name;

public void setName(String name){
   this.name = name
}
```
**(呼出方法)**

```
インスタンス名.setName("ヨシヒコ");
```
##getter/setterを使うメリット
**Read Only Write Only　のフィールドを実現出来る。**
→setだけの場合write Only、getだけの場合Read Only

**フィールド名を変更しやすい**
→フィールドの名前を変えた際、他のクラスがフィールド名を直接使用している場合は、他のクラスまで修正が必要になるが、get/setを使用している場合は、自身のクラス内のget/set内のクラス名の修正だけで済む。

**フィールドに対する、アクセスを検査出来る**
→（例）mpというフィールドに、0以下の値が代入された場合、`throw new IllegalArgumentException`で強制的にエラーを発生させ、システムを終了する。

```java
	public void setMp(int mp) {
		if (mp < 0) {
			throw new IllegalArgumentException("mpは0以上を設定して下さい");
		}
		mp = this.mp;
	}
```

#クラスに対するアクセス制御

##アクセス制御のレベル
| 名前 　　　　　　　　　　　      　| プログラム中の記載方法  | アクセスを許可する範囲    | 
|:----------------|:------------------- |:---------------------|
|public            |public            　  |全て    |
|package private  |何も書かない（デフォルト）　  |自分自身と同じパッケージのみ |

##非publicクラスの特徴
・クラス名はソースファイル名と異なっても良い
・1つのソースファイルに複数のクラスを宣言して良い
[Python]静止画を動くGIFにするプログラムの作り方その２

静止画を動くGIFにするプログラムと解説です。

「その１」はこれです。
[[Python]静止画を動くGIFにするプログラムの作り方その１ - Qiita](https://qiita.com/nikainotensor/items/d1b8eb276d85546a26e1)


おおまかに言うとこのプログラムは、
元の画像の一部を切り取るという作業を繰り返しているだけです。
そして、切り取る際には少し位置を変えて切り取ってゆきます。
そして最後に、切り取り後の画像をひとつにまとめてGIFにしています。

画像のY座標とx座標のようなものを表す変数がありますが、元の画像と、GIF用の画像の二種類の変数あります。



詳細は以下のプログラムに書きました。


```py
from PIL import Image, ImageDraw



images = [] #複数の画像を入れるリストを定義

iti=0 #画像を切り取る位置を表す変数

im1 = Image.open('a.jpg') #元になる画像を入れる

im1 = im1.convert('RGB') #RGBにする

size = im1.size #元になる画像の縦横の大きさを変数に入れる

yokohaba = size[0] // 2 #GIFにするときの横幅を決めて変数に入れる。今回は元の画像の２分の１。size[0]は元の画像の横幅を意味する。size[1]は元の画像の縦幅を意味する。

size2 = (yokohaba, size[1]) #GIFにするときの縦横の大きさを変数に入れる


#yとxは、もとの画像のY座標とx座標のようなものを表す
#y2とx2は、GIFになる画像のY座標とx座標のようなものを表す
#r、g、bはそれぞれ赤、緑、青の色の濃さを表す


for num in range(10): #10回くりかえす（枠が右に進む動き）
    im2 = Image.new('RGB', size2) #画像のベースをim2に入れる
    y2=0
    for y in range(size[1]):
        x2 = -1
        for x in range(size[0]):
            if iti <= x < yokohaba+iti: #切り取りたい範囲のときだけ実行する
                x2 = x2 + 1
                r, g, b = im1.getpixel((x, y)) #元の画像（im1）の(x,y)の色の情報をr、g、bに入れる。
                im2.putpixel((x2 ,y2) ,(r,g,b)) #GIFにする画像の(x2 ,y2)の場所に色の情報を入れる
            else:
                pass #条件にあてはならないなら何も実行しない
        y2 = y2 + 1

    images.append(im2) #出来上がった画像（im2）をリスト(images)に追加（append）する

    henka = size[0] // 60 #動かす距離を決めて変数に入れる。今回は元の画像の６０分の１

    iti=iti+henka #次に切り取る位置を計算して変数に入れる



for num in range(10): #10回くりかえす（枠が左に進む動き）
    im2 = Image.new('RGB', size2)
    y2=0
    for y in range(size[1]):
        x2 = -1
        for x in range(size[0]):
            if iti <= x < yokohaba+iti:
                x2 = x2 + 1
                r, g, b = im1.getpixel((x, y))
                im2.putpixel((x2 ,y2) ,(r,g,b))
            else:
                pass
        y2 = y2 + 1

    images.append(im2)

    henka = size[0] // 60

    iti=iti-henka #動きが逆なのでここはマイナスになる



im3 = images.pop(0)
im3.save('a.gif', save_all=True, append_images=images, optimize=False, duration=50, loop=0) #並んだ複数の画像をGIFにして保存
```

ちなみに「duration=50」の部分は数値を変えると画像の切り替えが早くなります。
それでは以上が静止画を動くGIFにするプログラムの作り方でした。
Slack でメッセージボックスに入力した People の絵文字をクリックすると Skin Tone の変更ができる件 👸👸🏻👸🏼👸🏽👸🏾👸🏿

メッセージボックス内に入力した人の絵文字をクリックすると肌の色を切り替えることができます :information_desk_person: :information_desk_person_tone1: :information_desk_person_tone2: :information_desk_person_tone3: :information_desk_person_tone4: :information_desk_person_tone5:

![1519470167ukv_r6RvSBcK_E11519470164.gif](https://qiita-image-store.s3.amazonaws.com/0/6881/2b71cbc1-5636-cced-e742-d607508d302a.gif)

（[Web 版](https://slack.com/)と [Mac アプリ版](https://itunes.apple.com/jp/app/slack/id803453959)の Slack で確認しました）

現場からは以上です。

## 関連記事

https://qiita.com/YumaInaura/items/5d51ef4eda1074acae87
C++:基底クラスの配列から派生クラスのメソッドを呼び出す

**※これは自分用のメモです※**
**C/C++を始めたばかりの超初心者（というか、プログラミング初心者）なのであんまり真面目に見ないでください。**

#間違い#
```c++:inheritance.cpp
#include <iostream>
#include <vector>

class Sounds{
public:
  virtual void pulse(){
    std::cout << "This is Super Class." << std::endl;
  }
};


class Sin : public Sounds{
private:
  std::string sound;

public:
  Sin(){
    this->sound = "po---------";
  }

  Sin(const std::string& sound){
    this->sound = sound;
  }

  void pulse() override{
    std::cout << this->sound << std::endl;
  }
};


class Noise : public Sounds{
private:
  std::string sound;

public:
  Noise(){
    this->sound = "za---------";
  }

  Noise(const std::string& sound){
    this->sound = sound;
  }

  void pulse() override{
    std::cout << this->sound << std::endl;
  }
};

int main(){
  Sin s1, s2("aa---------");
  Noise n1, n2("bo---------");
  std::vector<Sounds> sounds;

  sounds.emplace_back(s1);
  sounds.emplace_back(s2);
  sounds.emplace_back(n1);
  sounds.emplace_back(n2);

  for(auto i : sounds){
    i.pulse();
  }

  return 0;
}
```
```Console:出力
This is Super Class.
This is Super Class.
This is Super Class.
This is Super Class.
```

#正解
```c++:inheritance.cpp

.../*省略*/

int main(){
  Sin s1, s2("aa---------");
  Noise n1, n2("bo---------");
  std::vector<Sounds *> sounds;

  sounds.emplace_back(&s1);
  sounds.emplace_back(&s2);
  sounds.emplace_back(&n1);
  sounds.emplace_back(&n2);

  for(auto&& i : sounds){
    i->pulse();
  }

  return 0;
}
```

```Console:出力
po---------
aa---------
za---------
bo---------
```

↓↓↓もちろん、これでもOKだった↓↓↓

```c++:

int main(){
  std::vector<Sounds *> sounds;

  sounds.emplace_back(new Sin());
  sounds.emplace_back(new Sin("aa---------"));
  sounds.emplace_back(new Noise());
  sounds.emplace_back(new Noise("bo---------"));

  for(auto&& i : sounds){
    i->pulse();
  }

  return 0;
}
```

仮想関数テーブルを正しく使うには、きちんとクラスのポインタからメンバ関数を指定してあげなければならないようです！！！
基礎的なところ


#Mongoose
- serverに接続するものなのでフロントサイド(react)では一切書けない　→ Axiosなどでサーバーに渡すこと
- mongoのconnectやSchemaはわかりやすく　modelのファイルをつくってそこに個別に保存し import する

##サーバーサイドとフロントサイドをしっかり分離して、どちらで何ができるか考える。
Railsのmigrationファイルをまとめる

https://github.com/jalkoby/squasher を使ってみました。便利ですが、作成されたmigrationファイルを補正する必要があります。

| [Railsのmigrationファイルをまとめる](http://www.cherub.jp/2018/92/)<BR>開発開始から３年ほど経過したシステム。migarationファイルが400ファイルになりました。過去のmigrationファイルをまとめてくれるGemでsquashしました。... | ![](http://www.cherub.jp/wp/wp-content/uploads/2018/01/ruby.png)|
|:--|:-:|
Excel マクロ VBA ～関数の書き方、使い方

#関数とは
>値を受け取り、処理結果を返す。

- 受け取る値は、<font color="Red">**引数**</font>。
- 処理結果は、<font color="Red">**戻り値**</font>。
- 値には種類があり、<font color="Red">**型**</font>（数値型、文字列型、日付型など）という。

※引**数**というけど、数字以外の文字、日付などもOK。
※引数（受けとる**値**）、戻り**値**には、型がある。

#関数を書く
書き方は人それぞれ、ここから↓は、私の書き方。

（例）三角形の面積を求める関数。


##コーディング前
↓を考える。

| No. | 項目 　　  |例　　　          　　      |
|:---:|:--------  |:-------                   |
| 1.  |関数名　　　|TriangleArea               |
| 2.  |引数　（型）|base（数値）、height（数値） |
| 3.  |戻り値（型）|三角形の面積（数値）         |
| 4.  |処理手順　　|底辺 × 高さ ÷ 2             |

※関数名、引数は、好きな名前でOK。

##コーディング

外側を書いて、処理（中身）を書く。


###外側
コーディング前に考えた、1～3を使う。

```vb:VBA
Function TriangleArea(base As Integer, height As Integer) As Integer
Dim result As Integer        '戻り値（処理結果）を入れる変数を宣言

'後で、ここに処理を書く

TriangleArea = result        '戻り値（処理結果）を返す
End Function
```

<details>
<summary>Function　～　End Function</summary>
関数を書く範囲。
</details>

<details>
<summary>Dim　変数名　As　型</summary>
変数の宣言、および、型の指定。

※`Dim`はないけど、引数も変数。
※`As Integer`は、数値型。`As String`は、文字列型など。
※変数名は好きな名前でOK。
</details>

###内側（処理）
コーディング前に考えた、4を使う。

```vb:VBA
'Function TriangleArea(base As Integer, height As Integer) As Integer
'Dim result As Integer       '戻り値（処理結果）を入れる変数を宣言

result = base * height / 2   '底辺×高さ÷2

'TriangleArea = result       '戻り値（処理結果）を返す
'End Function
```

<details>
<summary>補足</summary>
↑のコードは、↓のように書くこともできる。
コードはできる限り書かないことが理想なので、↓の方が理想的。
処理が複雑な場合、戻り値を入れる変数を用意した方が、コードが読みやすいと思うので、↑の書き方にしてる。
今回、処理は簡単だけど、説明のため書いた。

```vb:VBA
Function TriangleArea(base As Integer, height As Integer) As Integer

TriangleArea = base * height / 2   '底辺×高さ÷2

End Function
```

</details>


#関数を使う
↓を考えてから使う。

- 関数を使うと得られる結果（戻り値）は？
- 引数は何個？
- 引数の型は？

間違えると、大変。。。

##使い方
>関数名（値1、値2、・・・）

関数を使う場合、関数名と渡す値を記述するだけ。
↓だと、`TriangleArea(7, 4)`の部分

```vb:VBA
'関数を使う側
Sub AnyName()

Dim answer As Integer       '戻り値を受け取る変数を宣言。
answer = TriangleArea(7, 4) '関数に値7、4を渡す。answerに戻り値14が返ってくる。

End Sub


'関数  （値を受け取る　base = 7, height = 4）
Function TriangleArea(base As Integer, height As Integer) As Integer
Dim result As Integer       '戻り値（処理結果）を入れる変数を宣言

result = base * height / 2  '底辺×高さ÷2

TriangleArea = result       '戻り値（処理結果）を返す。
End Function
```
<details>
<summary>Sub　～　End Sub</summary>
関数を使う側のコードを書く範囲。
</details>



##エラーになる場合
>anser = TriangleArea(7, "よん")　<font color="Red">違う型を渡す</font>

`TriangleArea`の引数は、数値型。よって、文字を渡すとエラーになる。

>anser = TriangleArea(7)　<font color="Red">渡す値が少ない</font>

`TriangleArea`の引数は、底辺と高さの2つ。1つしか渡さない場合は、エラーになる。

>Dim anser As String
>anser = Triangle(7,4)　<font color="Red">処理結果と異なる型で受け取る</font>

`TriangleArea`の戻り値は数値型。しかし、戻り値を文字列型で受けようとするとエラーになる。

*2018.03.02追記*
*3つ目は、Excelではエラーにはなりませんでした。。。*


#さいごに
Excelには、SUM、AVERAGE、VLOOKUPなど様々な関数がデフォルトで用意されているため、<font color="red">**関数を書く必要はほとんどない。**</font>
※全文みてくれた人、ありがとうごめんなさい。

つまり、Excelで覚えるべきことは、

- **関数の使い方**
- **関数を使う側のコードの書き方（Sub ～ End Sub）**

関数が使えれば、Excel作業は十分できる。
関数を使う側のコードの書き方がわかれば、マクロの作成・編集ができる。
Xamarin.FormsでListViewの行をタップしたときのハイライトを消す

Xamarin.FormsでListViewを試してみると以下のように。

![xamarin_listview1.gif](https://qiita-image-store.s3.amazonaws.com/0/94929/35cac68e-0e6f-5911-7c2f-2434446d34ab.gif)

タップした行にハイライトが付いてる。

うーん、今作りたいアプリにはこの機能はあんまり嬉しくない…。
できればAndroidのListViewみたいになってほしいです。

ということで消す方法を試してみた。

```cs
listView.ItemTapped += (sender, e) => {
    ((ListView)sender).SelectedItem = null;
};
```

イベントハンドラの中で、タップされたらすぐ未選択にすればいいみたいです。

これでAndroidのネイティブな動きのようになりました。

![xamarin_listview2.gif](https://qiita-image-store.s3.amazonaws.com/0/94929/8d5a7f94-ffb5-82ed-5469-6d3863a5f462.gif)

# 参考

[How to disable highlight on ListView in Xamarin.Forms - Stack Overflow](https://stackoverflow.com/questions/26657932/how-to-disable-highlight-on-listview-in-xamarin-forms)
Emacs のキーバインドが忘れられない VisualStudio ユーザーに捧げる

いくら Emacs だって言語に特化したIDEには敵わない場合もある。
というかそこまでして Emacs を使い続けるほどの愛と根性はない。
頭ではそう割り切っているつもりでも手指はキーバインドたちのことが忘れられない。
そんな未練がましい VisualStudio ユーザーに捧げるポストです。

# 実現方法
拡張機能には頼らない。シンプルにキーバインドを変更する。
Emacs と VisualStudio に誠意を見せつける。
（一部好みが入ってます。）

# キーバインドの設定
| コマンド | 使用する場所 | ショートカットキー |
|:-----------|:------------|:-------------|
| 編集.検索 | テキストエディター | Ctrl + Alt + F |
| 編集.置換 | テキストエディター | Ctrl + Alt + H |
| 編集.すべて選択 | テキストエディター | Ctrl + Alt + A |
| 編集.現在の単語を選択 | テキストエディター | Ctrl + Shift + W |
| 編集.右に1文字移動 | テキストエディター | Ctrl + F |
| 編集.左に1文字移動 | テキストエディター | Ctrl + B |
| 編集.行頭に移動 | テキストエディター | Ctrl + A |
| 編集.行末に移動 | テキストエディター | Ctrl + E |
| 編集.削除 | テキストエディター | Ctrl + D |
| 編集.後退削除 | テキストエディター | Ctrl + H |
| (編集.1語削除) | テキストエディター | Ctrl + H |
| 編集.次の単語へ移動 | テキストエディター | Ctrl + W |
| 編集.前の単語へ移動 | テキストエディター | Ctrl + R |
| 編集.単語の最後まで削除 | テキストエディター | Del |
| 編集.単語の最初まで削除 | テキストエディター | Bkspace |
| 編集.1行下へ | テキストエディター | Ctrl + N |
| 編集.1行上へ | テキストエディター | Ctrl + P |

# まとめ
この手の話題はやり尽くされるている感じがしつつも VisualStudio と Emacs のユーザー層が重なることが少ないためか実用的な情報は少ないです。
[Emacs emulation](https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.Emacsemulation) というのも存在しているのですが，キーバインドの中途半端感も否めない上にコードスニペットが死んだりコピペ周りの操作性が格段に落ちまくったりして，いまひとつ踏み込めなかった。

これからは Emacs とも VisualStudio とも仲良くできるはず。
macOS High Sierraでrbenv installに失敗する

# 問題
標題の通り。
install出来ない。。

# 最初のエラー
```
Last 10 log lines:
checking host system type... x86_64-apple-darwin16.7.0
checking target system type... x86_64-apple-darwin16.7.0
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... configure: error: in `/var/folders/9s/64j0hkxj5m97r6b6bqf7kx0m0000gn/T/ruby-build.20180225005030.86114/ruby-2.5.0':
configure: error: cannot run C compiled programs.

```

# 対応
xcodeを更新
command line tool のアップデート

# 次のエラー
```
BUILD FAILED (OS X 10.12.6 using ruby-build 20171226)

Inspect or clean up the working tree at /var/folders/9s/64j0hkxj5m97r6b6bqf7kx0m0000gn/T/ruby-build.20180225012153.25770
Results logged to /var/folders/9s/64j0hkxj5m97r6b6bqf7kx0m0000gn/T/ruby-build.20180225012153.25770.log

Last 10 log lines:
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
compiling miniinit.c
error: error reading '/dev/fd/8'
1 error generated.
clang: error: unable to remove file: Operation not permitted
dtrace: failed to compile script probes.d: Preprocessor failed to process input program
make: *** [probes.h] Error 1
make: *** Waiting for unfinished jobs....

```

# やったこと
`sudo chmod -s /usr/sbin/dtrace`
https://github.com/rbenv/ruby-build/issues/1061

それでもダメだったので、、
`RUBY_CONFIGURE_OPTS="--disable-dtrace" rbenv install 2.5.0`

https://stackoverflow.com/questions/48838498/failed-to-install-ruby-2-5-0-thru-rbenv-macos-high-sierra
Atcoder Beginer Contest 68 A問題 解説

#問題
https://beta.atcoder.jp/contests/abc068/tasks/abc068_a

#解法考案
入力を受け取り，「ABC」と出力した後に取得した入力を出力すればAC

#コード
```
1    ,>,>,
2    >+++++++++++++
3    [->+++++<]
4    >
5    .+.+.<<<<.>.>.
```

#解説

```
,>,>,
```
入力の受け取り
入力は3桁と決まっているので，「受け取り」→「ポインタをインクリメント」→「受け取り」→「ポインタをインクリメント」→「受け取り」で先頭から3つのポインタに入力が格納される．

```
>+++++++++++++
```

「4つ目のポインタへ移動」→「値を13に」

```
[->+++++<]
```

「4つ目のポインタの値を1減らす」→「5つ目のポインタに5を足す」を4つ目のポインタの値が0になるまで(13回)繰り返し，ASCIIコード65番"A"まで進める．

```
>
```

5つ目のポインタへ移動．

```
.+.+.
```
「"A"を出力」→「値をインクリメント(66)」→「"B"を出力」→「値をインクリメント(67)」→「"C"を出力」

```
<<<<
```
先頭ポインタへ戻る

```
.>.>.
```
「格納した値を出力」→「ポインタをインクリメント」を繰り返し，最初に格納した値を出力．

#感想
入門的問題であったが，インクリメント回数を間違える等の初歩的な間違いがあり，少し時間がかかってしまった．
精進したい．
Let’s EncryptにてACME v2でワイルドカード証明書を発行

ACME v2はacme.shのマスタブランチにマージ済み
https://community.letsencrypt.org/t/acme-v2-is-merged-in-to-master-branch-of-acme-sh/52242

下記でACME v2用のスクリプトを取得
```
curl https://get.acme.sh | sh
acme.sh --test --dns --issue -d *.example.com
_acme-challenge.example.comのTXTレコードを更新したあと、renewコマンドを実行
```
```
acme.sh --renew -d *.example.com
gcloud compute ssl-certificates createで証明書を登録
```
ACME v1と変わらず利用可能

リリースは2/27予定をしていたみたいです。
しかし、品質を優先する為に遅れるという報告があります。
https://community.letsencrypt.org/t/acmev2-and-wildcard-launch-delay/53654/7
Wordpressのビジュアルエディタ（TinyMCE）上で、"ペースト"でイベントを発火させる

Wordpressのビジュアルエディタ「TinyMCE」のカスタマイズをしていくなかで、テキストをコピペした時にイベントを発火できるといいな〜と思いやり方を調べたので備忘録として残しておきます。

具体的にやりたかったのは、「はてなブログ」のエディタで採用されている仕様。
URLをペーストすると**「「リンクを挿入」ウィンドウ」**が立ち上がって、リンクの表示タイプを選択することができるアレです。
[リンクの挿入とコンテンツの埋め込み@はてなブログ ヘルプ](http://help.hatenablog.com/entry/editor/advlink)

はてなブログのエディタが使いやすいと評判だったので触ってみると「確かにいいな〜」と思うところが多いので、採用できるものは採用したいな、と。

# ペーストでイベントを発火させる

やりたい！と思う人がいないのか、あまり情報がなかったんですが、仕組みは結構簡単につくれました。
TinyMCE自体が持っているPlugin Optionを使って、ペーストのタイミングでJavascriptの処理を走らせることができます。

タイミングは`paste_preprocess`と`paste_postprocess`の2種類。
ペーストしたテキストをDOMに変換する前と後で、プレーンなテキストとして使いたい場合はpreprocess、DOM要素として使いたい場合はpostprocessを使います。

あとは、fucition.phpで`tiny_mce_before_init`にフックしてオプションを呼べばOKです。

```function.php
  function my_tiny_mce_before_init( $initArray ){
    $initArray['paste_preprocess'] = "function(plugin, args){
      alert( 'paste_preprocess: ' + args.content );
    }";
    $initArray['paste_postprocess'] = "function(plugin, args){
      alert( 'paste_postprocess: ' + args.node.innerHTML);
    }";
    return $initArray;
  }
  add_filter( 'tiny_mce_before_init', 'my_tiny_mce_before_init' );
```
`paste_preprocess`と`paste_postprocess`のそれぞれのオプションに、コンテンツの中身をアラート表示するスクリプトを設定しています。"(ダブルクオーテーション）で囲んであくまでテキストとして設定している点がポイントです。
また、DOM変換の前後で引数の中身も変わるので、中身を取り出す処理もちょっと違います。

# 実行してみると…、
![wordpress_mce_paste.gif](https://qiita-image-store.s3.amazonaws.com/0/86634/43d10b22-cf24-52b5-5241-907f91e9dfea.gif)
ペーストした文字列が、ちゃんとアラートで表示されました。

HTMLをゴリゴリ書くのが苦手なクライアントがいる場合や、オリジナルのテーマを配布している人にとって、ビジュアルエディタの使い勝手が向上するのは嬉しいポイントのはず。
処理が重くなってしまっては本末転倒ですが、ビジュアルエディタの機能追加としてはなかなか使えるチップスだと思います！
仮想通貨取引所のリアルタイムAPIまとめ

仮想通貨取引所の価格情報を調べるため、リアルタイムAPIについて調べてみました。

# bitFlyer

Pubnub経由で提供されています。

- https://lightning.bitflyer.jp/docs?lang=ja
- https://qiita.com/kkanazaw/items/64c184ab03099dce755b

価格だけ取るなら、tickerを見ていれば問題なくて、ちゃんとやる場合は差分情報を使用します。

# bitbank

こちらもPubnub。ティッカー情報でよさそうです。

- https://docs.bitbank.cc/

# Zaif

WebSocketで提供されています。板情報も含まれているので `last_price` を取得するのがよさそう。

https://corp.zaif.jp/api-docs/

# CoinCheck

WebSocketで提供されています。

- https://coincheck.com/ja/documents/exchange/api#public-channels
- http://team-6.hatenablog.jp/entry/2017/08/08/224656
    - 注文なのか約定なのかはまだ調べていない

# Quoinex

公式ドキュメントにも過去合ったみたいですが、現在は非公式のようです。Pusher経由で提供されています。

- https://github.com/yamorijp/quac/blob/master/quoinex/api.js

# Bitpoint

WebSocket（認証あり）で提供されています。

- https://public.bitpoint.co.jp/bpj-api/api#

# その他

海外勢はUSD(T)→JPYのレートも挟まるのでいったん放置。
pandasノススメ -pandasだからできること-

# 背景
書いてて辛くなったのでSQLと同じように出来ることとpandasだからできることの2段階に分けている
前回記事はこちら
https://qiita.com/open_cans/items/c1568eaf497bd82cdf29

# pandasだからできること
色々方法はあると思うがapply関数を紹介後,DataFrame型から二次元配列への変換を紹介する。

## apply関数(引数がリストじゃない)
applyで列に対して引数を一つとる関数を適用することができる。
例えばfloatの値をintに変換するint()関数がある。これを以下のcsv_dataのb列に適用すると

```py
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")
csv_data['b'] = csv_data['b'].apply(int)
```
↓csv_data

|a  |b  |string  |
|---|---|---|
|1  |2.0  |ﾎｹﾞ  |
|4  |5.1  |ﾋｹﾞ  |
↓適用後

|a  |b  |string  |
|---|---|---|
|1  |2  |ﾎｹﾞ  |
|4  |5  |ﾋｹﾞ  |
自作の関数を適用する例も載せておく

```py
import pandas as pd

def hoge(data):
    data += 10
    return data

csv_data = pd.read_csv("csv_data.csv")
csv_data['b'] = csv_data['b'].apply(hoge)
```
↓csv_data

|a  |b  |string  |
|---|---|---|
|1  |2.0  |ﾎｹﾞ  |
|4  |5.1  |ﾋｹﾞ  |
↓適用後

|a  |b  |string  |
|---|---|---|
|1  |12.0  |ﾎｹﾞ  |
|4  |15.1  |ﾋｹﾞ  |

## apply関数(引数がリスト)
applyは複数列のデータを引数にとる関数を適用することもできる。
csv_dataのa列とb列の和が5よりも上なら1,それ以外は0を返す関数を適用する例を示す。

``` axis=1``` を追加するといい。
追加すると、適用する関数にデータフレームの各行の列の値がリストで与えられる

```py
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")

def hoge(data1):
    if data1[0]+data1[1] > 5:
        return 1
    return 0

sample1['c']=sample1[['a','b']].apply(hoge, axis=1)
```
↓csv_data

|a  |b  |string  |
|---|---|---|
|1  |2.0  |ﾎｹﾞ  |
|4  |5.1  |ﾋｹﾞ  |
↓適用後

|a  |b  |string  |c  |
|---|---|---|---|
|1  |2.0  |ﾎｹﾞ  |0  |
|4  |5.1  |ﾋｹﾞ  |1  |

##DataFrameをリストに変換する
applyだけではやりたいことが実現できない！！ということもあるだろう
ということで2次元配列に変換してピュアなpythonで弄ってしまおうというお話
これらを適用すると(あなたがpythonで出来ることなら)なんでも出来るようになる

###1次元DataFrameをリストに変換する


```py
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")
csv_data = pd.DataFrame(csv_data['a']) #i次元のDataFrame
list_data = list(csv_data.values.flatten())
```
↓csv_data

|a  |b  |string  |
|---|---|---|
|1  |2.0  |ﾎｹﾞ  |
|4  |5.1  |ﾋｹﾞ  |
↓適用後

```py
list_data
>> [1,4]
```

###2次元DataFrameをリストに変換する

```py
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")
list_data= [list(row) for _, row in csv_data.iterrows()]
```
↓csv_data

|a  |b  |string  |
|---|---|---|
|1  |2.0  |ﾎｹﾞ  |
|4  |5.1  |ﾋｹﾞ  |
↓適用後

```py
list_data
>> [[1, 2.0, 'ﾎｹﾞ'], [4, 5.1, 'ﾋｹﾞ']]
```
【UE4】AIPerceptionをAIControllerとCharacterにアタッチした時の違い

#はじめに
過去に書いたAIPerceptionの紹介記事（[【UE4】AI Perception の紹介と使い方](https://qiita.com/Dv7Pavilion/items/741402f4da609ec595a2)、[【UE4】AI Perception の紹介と使い方 その２](https://qiita.com/Dv7Pavilion/items/2984f2b03711492aa451)）では

>AI Perceptionコンポーネントでは「コントローラー側にコンポーネントを追加する」という形になります。

と説明しました。
記憶が朧気なのですが、最初の紹介記事を書いた時点でAIPerceptionはAIControllerでアタッチされた時にしか動作しなかったと思います。ですので、紹介記事ではコントローラー側にコンポーネントを追加するようにと書きました。

最近AIPerceptionをCharacter側にアタッチして問題なく動作する場面（その時はAISense_Sightでした）を見てしまったので「Character側に付けても問題ないのならば、AIControllerに付ける意味とは一体...？」と考え、自分なりに検証してみたのでその結果を書いていきます。

#検証処理
検証に使用したバージョンは4.18.3です。

Characterを継承したBlueprintにAIPerceptionを付けたもの。AIControllerを継承したBlueprintにAIPerceptionを付け、Characterを継承しただけのBlueprintにそのAIControllerをセットしたものの２種類用意しました。
AIPerceptionが付いている方にはそれぞれ以下のような処理を追加しました。

![2018-02-25_00h03_34.png](https://qiita-image-store.s3.amazonaws.com/0/104467/a6c763f0-d2ae-e982-4a5e-3321ee1f22fd.png)

![2018-02-25_00h04_40.png](https://qiita-image-store.s3.amazonaws.com/0/104467/244de9e0-affd-c241-d001-99a52cfb8bd9.png)

>AISense_TeamとAISense_Touchについては検証していません。

#検証結果
##AISense_DamageとAISense_Predictionは動作しない


[【UE4】AI Perception の紹介と使い方 その２](https://qiita.com/Dv7Pavilion/items/2984f2b03711492aa451)で紹介したAISense_DamageとAISense_Predictionは**Character側にAIPerceptionを付けた場合、動作しません**でした。

AISense_Damage.cppで定義されている関数Updateは以下のように書かれています。

```cpp
float UAISense_Damage::Update()
{
	//~~ 省略 ~~
			UAIPerceptionComponent* PerceptionComponent = PerceptionListener->GetPerceptionComponent();
			if (PerceptionComponent != nullptr && PerceptionComponent->GetListenerId().IsValid())
			{
				// this has to succeed, will assert a failure
				FPerceptionListener& Listener = ListenersMap[PerceptionComponent->GetListenerId()];

				if (Listener.HasSense(GetSenseID()))
				{
					Listener.RegisterStimulus(Event.Instigator, FAIStimulus(*this, Event.Amount, Event.Location, Event.HitLocation));
				}
			}
		}
	}

	RegisteredEvents.Reset();

	//~~ 省略 ~~
}
```

PerceptionListener->GetPerceptionComponent()を呼び出しAIPerceptionComponentを取得しています。（この関数はAIControllerで定義されています）
Character側にAIPerceptionを付けた場合、関数GetPerceptionComponentはNULLが返り、刺激が登録されず、Blueprint側で書いたOnPerceptionUpdateが呼び出されません。

AISense_Predictionも関数Updateの形はほぼ同じなので同様の理由で受けた刺激が登録されず、OnPerceptionUpdateで定義したDamageとPredictionの刺激を受けた際の処理を通ることはありません。

##じゃあAISense_SightとAISense_Hearingは？
この２つの検証は上記で示した検証コードのブランチ部分をそれぞれ**AISense_Sight**と**AISense_Hearing**に変更し、PrintStringの内容を変えただけです。
AISense_SightやAISense_HearingはAIPerceptionを付けた時に必ずと言って良い程追加される刺激ですが、この２つの刺激についてはCharacter側に付けようがAIController側に付けようが**問題なく動作します**。

エンジンコードを見てみると２つのクラスの関数Updateでは関数GetPerceptionComponentを呼び出し条件分岐させるような部分が無いため、Characterに付けてもAIControllerに付けても影響は受けないものと思われます。


#結論
簡単な検証ではありますが得られた結果として

Character側にAIPerceptionを付けた場合**AISense_SightとAISense_Hearingは動作する**が**AISense_DamageとAISense_Predictionは動作しない**。
AIController側の場合は**４つのAISenseは問題なく動作する**。

ということがわかりました。
render-prop で 状態を扱うコンテナコンポーネントに型を付けたい

このコードは動いた

```js
class WithState<State> extends React.Component<
  {
    render: (State, ((State) => State) => void) => Node
  },
  State
> {
  render() {
    return this.props.render(this.state, this.setState.bind(this))
  }
}

// -- usage --

type State = {
  value: number
}

const initialState: State = { value: 0 }
const _el = (
  <WithState
    render={(state = initialState, update: ((State) => State) => void) => {
      return (
        <button
          onClick={_ => {
            // should be error
            update(prev => ({ value: prev.value + '' }))
          }}
        >
          {state.value}
        </button>
      )
    }}
  />
)
```

しかし update に型をつけるのをサボるとエラーが起こらなくなる

```js

const _el = (
  <WithState
    render={(state = initialState, update) => {
      return (
        <button
          onClick={_ => {
            // should be error
            update(prev => ({ value: prev.value + '' }))
          }}
        >
          {state.value}
        </button>
      )
    }}
  />
)
```

いろいろ試したが、ジェネリクスを取る引数で引数同士で型の関係があっても、一つが確定しても他に関与しない。返り値やキャストからは推論される

```js
function f<T>(t: T, u: T => T): T {
  return u(t)
}

const s = { v: 1 }
f(s, p => {
  return { v: '' + p.v }
})

// error
const s2: { v: number } = f(s, p => {
  return { v: '' + p.v }
})
```

諦めて型を書くのが良さそう
PowerShellでテキストファイルを結合する

サブフォルダを含めてテキストファイルを結合したい場合の備忘録として...

Get-ChildItem でファイルを取得します（拡張子は大文字と小文字を区別しません！）

```PowerShell
Get-ChildItem ".\Folder" -Recurse -File -Filter "*.txt" 
```

Get-Content でテキスト内容を取得します

```PowerShell
Get-ChildItem ".\Folder" -Recurse -File -Filter "*.txt" | Get-Content
```

Add-Content で出力します

```PowerShell
Get-ChildItem ".\Folder" -Recurse -File -Filter "*.txt" | Get-Content | Add-Content "out.txt"
```
PHPでES6っぽくdestructuring of arrays

PHP7.1で追加された destructuring of arrays は、下記のようだが

```php
$user = ['name' => 'Nancy'];
['name' => $userName] = $user;

echo $userName // => Nancy
```

下記のようにネストできることに気づいた


```php
$user = [
    "address" => [
        "country" => "jp",
        "prefecture" => "Hokkaido",
    ],
];

['address' => ['country' => $country, 'prefecture' => $prefecture]] = $user;

echo $country; // => "jp"
echo $prefecture; // => "Hokkaido"
```

ES6みたいに、キー名がそのまま変数名になったら良いのに・・・できる方法は無いのだろか。
心拍数とanimation-duration

### durationを設定しているとき、無闇矢鱈に行うよりある程度目安があったほうが良い。
そこで人間の心拍数を目安の一つとする。

| status | 心拍数 | duration  |
|:---:|------------------:|:------------------:|
| 緊張 |              150 |        0.4s    |
| 通常 |               60 |       1s       |
| 安静|               40 |       1.4s    |

### 実情は0.7sをよく使う。中間値としては適当なのだろう。
【TensorFlow】softmax_cross_entropyの前後に付く謎のsparse, with_logitsについて

# はじめに
[TensorFlowのMNISTのチュートリアル](https://www.tensorflow.org/tutorials/layers)をしていたら、そのページでは損失関数（Loss fucntion）に`tf.losses.softmax_cross_entropy`を使っていたのですが、[公式のGitHub](https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/examples/tutorials/layers/cnn_mnist.py)では`tf.losses.sparse_softmax_cross_entropy`を使っていて、その違いを調べてもなかなか出てこなかったので、自分のメモ代わりに残しておきます。
ついでに`with_logits`が付く場合も書いておきます。

# sparseがある場合とない場合の違いは？
公式のAPIを読んでもわけがわからなかったのですが（無能）、[stack overflowで質問兄貴](https://stackoverflow.com/questions/37312421/tensorflow-whats-the-difference-between-sparse-softmax-cross-entropy-with-logi)と[ブログ執筆外人兄貴](http://ywpkwon.github.io/post/tf_cross_entropy/)によると、両者の結果に違いはないそうです。
`sparse`が付いていると、自動でinputをone-hotにしてくれるそうです。はい、便利！
one-hot codingについては[こちら](https://www.quora.com/What-is-one-hot-encoding-and-when-is-it-used-in-data-science)を参考にどうぞ。

例えばこうしてたのが

```python3:without_sparse
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=10)
loss = tf.losses.softmax_cross_entropy(
    onehot_labels=onehot_labels, logits=logits)
```

これで済むというとです。

```python3:with_sparse
  loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
```

# with_logitsがある場合とない場合の違いは？
[Qiita執筆兄貴](https://qiita.com/exy81/items/8c9ab6ba8d4a03873d7c)によると
>"with_logits"というのは、この関数は内部でソフトマックスも計算するから、ニューラルネットワークの出力をそのまま入力してね、という意味です。

だそうです。ありがたい。

# 参照
- [TensorFlow: what's the difference between sparse_softmax_cross_entropy_with_logits and softmax_cross_entropy_with_logits?](https://stackoverflow.com/questions/37312421/tensorflow-whats-the-difference-between-sparse-softmax-cross-entropy-with-logi)
- [cross-entropy in tensorflow](http://ywpkwon.github.io/post/tf_cross_entropy/)
- [TensorFlowのクロスエントロピー関数の動作](https://qiita.com/exy81/items/8c9ab6ba8d4a03873d7c)
技術ブログを書きましょうか

# 前書き
数年前に中国語で技術ブログを書きましたが、来日の関係でもあるし、途中で中止しました。
[博客园-鸿鹰](http://www.cnblogs.com/liuhy)
最近様々な技術を軽く勉強したんですが、数日後に、Google先生に聞かないと、コードをかけ無さそうです。

# 技術ブログを書ける原因
1. 日本語を勉強するため
2. 技術メモを残すため
3. 他者に役に立てたいため

# 考えるテーマ
1. 環境構築
    - 自分で利用する開発環境
    - 開発に役に立つツールの紹介
2. 最近触った言語・技術のデモ
    - NodeJS
    - Spring Boot
    - AWS Lambda
    - など

# 友達を作りたい
何か勉強する時、同じことをやる友達がいれば、きっと心強いでしょう。
だから、面白い技術を一緒に勉強しましょうか。
Skype工学勉強会で、コンテンツ作りながら勉強会を実践してみる

Skype勉強会開いてます。

https://engineeringskype.connpass.com/

「Hacking 美しき策謀」「独習C#」「DevOps　Handbook」の勉強会を開いてます。
ひたすら朗読していって、疑問点を議論し合う勉強会にしてましたが、次回から、勉強した内容で記事を書いて行きながら、勉強会を開くことにしました。
なぜこういう結論に達したかというと、以下のような考えからです。

*  Skype勉強会を広めたい
*  ノートを作ることによって、記憶が定着する   
*  一人で記事書くの辛そう   
*  Skype勉強会の成果をわかりやすい形にしたい  
*  丁寧に、理解したかどうかを確認しながら勉強会を進めたい。  
まあ、正直な話、一人で勉強するよりも能率的です。エラーがあれば全員で議論できるからです。しかし、主催者、参加者に、利益があるような勉強会にする必要があります。  
主催者に利益があるといっても、お金を取るようなことはできないです。
なので、コンテンツを作りながら勉強会をすることで、主催者、参加者はコンテンツでドヤ顔ができる。
そして、Skype勉強会の宣伝ができる。そして、コンテンツによって読者が喜ぶ。  
ノートを作りながら勉強会をすることによって、記憶が定着する効果も狙っています。  
戦略としては、リーダーがQiitaのエディタをSkypeの画面共有で共有して、リーダーが書いていくのを見て、周りがマサカリを投げていくという形式でやろうかと思います。
Skype勉強会では、色々な有用な議論がなされているのですが、それが外部にパブリッシュされないというのは結構勿体無いなと思っていて、こういう戦略を考えました。  
Skype工学勉強会で作られたコンテンツには、「Skype工学勉強会」のタグをつけるようにすれば、一元化できてわかりやすくなるのではと思います。
RedisをJava(jar)で使ってみる

#<b>Redisとは</b>
* <a href ="http://tmg0525.hatenadiary.jp/entry/2017/07/19/201501">URL</a>
* NoSQLです。
* メモリ上で動作します。
* キーバリューストア（KVS）です。
* リアルタイムランキング集計などに向いています。

#<b>目次</b>
1. MacでRedis（対話テスト・Ecripse上のJavaで実行）
2. UbuntuでRedis（対話テスト・jarの実行）

#<b>MacでRedis</b>
* 環境
* MacOS Sierra ver 10.12.6

##EclipseとHomebrewをインストール
* MacにEclipseをインストールと日本語化<br><a href="https://qiita.com/kyosuke5_20/items/988832ae339150e3dbcd">URL</a>
* MacにHomebrewをインストールする<br><a href="https://qiita.com/is0me/items/475fdbc4d770534f9ef1">URL</a>

##MacにRedisをインストール<br>jedisをlib配下へダウンロード<br>外部ライブラリとして追加し実行
* RedisとHBaseを試してみよう<br><a href="https://techblog.gmo-ap.jp/2017/03/29/redis%E3%81%A8hbase%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/">URL</a>

* jarにしてMac上で動かしてみます。<br>Ecripseでjarを作成します。
* プロジェクト名の上で右クリック→エクスポート→Java→JARファイル「次へ」→エクスポート先を選択→完了→OK
* ターミナルを開き、redisを起動します。<br>redis-server

* エクスポートしたフォルダに移動し、jarを実行します。<br>java -jar RedisTest.jar
* 動く！！！

#<b>UbuntuでRedis</b>
* 環境
* VirtualBox
* Ubuntu_16_04_LTS

##UbuntuにRedisをインストール
* sudo apt -y install redis-server

* Redisを起動して対話テストを行います。<br>redis-cli<br>127.0.0.1:6379> ping<br>PONG

* 任意のフォルダにEcripseで作成したjarを配置します。<br>java -jar RedisTest.jar
* 動く！！！

#<b>今後の予定</b>
気が向いたら冗長化に挑戦したいと思います。気が向いたら、ですが……。
pyenvを用いたpython環境構築手順（CentOS7.1）

## 環境

| OS/ミドルウェア | バージョン |
| :---- | :---- |
| CentOS | 7.1 |
| pyenv | 1.2.2 |
| python | 3.6.4 |

## 1. pyenvとは

[pyenv](https://github.com/pyenv/pyenv) とは複数バージョンのpythonを簡単に管理 / 変更することができる仕組みです。
同様の仕組みとして、rubyの複数バージョンの管理が可能な[rbenv](https://github.com/rbenv/rbenv)などがあります。
本投稿では、pyenvを利用して python環境を構築する手順をまとめていきます。

## 2. 依存パッケージを yum install

まず、pyenvを利用するために必要となるパッケージを ```yum install``` でインストールしていきます。

```
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git libffi-devel
```

## 3. pyenvのインストール

続いて、ホームディレクトリはいかにpyenvのリポジトリをクローンして、pyenvを利用可能な環境を構築していきます。

* pyenvリポジトリのクローン

```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

* bash_profileにpyenvのパスを追加

```
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

* pyenvのバージョンを確認

```
$ pyenv --version
pyenv 1.2.2-6-g694b551
```

## 4. python 3.6.4のインストール

最後に、pyenvを用いて、python 3.6.4をインストールしていきます。

* デフォルトでは python 2.7.5がインストールされているようです。

```
$ python --version
Python 2.7.5
```

* インストール可能な pythonバージョンを確認します。

```
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5
  2.5.1
  2.5.2
  2.5.3
  2.5.4
  2.5.5
  2.5.6
  2.6.6
  2.6.7
  2.6.8
  2.6.9
  2.7-dev
  2.7
  2.7.1
  2.7.2
  2.7.3
  2.7.4
  2.7.5
  2.7.6
  2.7.7
  2.7.8
  2.7.9
  2.7.10
  2.7.11
  2.7.12
  2.7.13
  2.7.14
  3.0.1
  3.1
  3.1.1
  3.1.2
  3.1.3
  3.1.4
  3.1.5
  3.2
  3.2.1
  3.2.2
  3.2.3
  3.2.4
  3.2.5
  3.2.6
  3.3.0
  3.3.1
  3.3.2
  3.3.3
  3.3.4
  3.3.5
  3.3.6
  3.3.7
  3.4.0
  3.4-dev
  3.4.1
  3.4.2
  3.4.3
  3.4.4
  3.4.5
  3.4.6
  3.4.7
  3.4.8
  3.5.0
  3.5-dev
  3.5.1
  3.5.2
  3.5.3
  3.5.4
  3.5.5
  3.5.5rc1
  3.6.0
  3.6-dev
  3.6.1
  3.6.2
  3.6.3
  3.6.4
  .
  .
  .
```

* python 3.6.4 のインストール

```
$ pyenv install 3.6.4
Downloading Python-3.6.4.tar.xz...
-> https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
Installing Python-3.6.4...
Installed Python-3.6.4 to /home/vagrant/.pyenv/versions/3.6.4
```

* pythonバージョンの切り替え

```
$ pyenv global 3.6.4
$ pyenv rehash
$ python --version
Python 3.6.4
```

最後にpythonのバージョンを確認し、バージョン3.6.4に変更されていれば作業完了です。

## 参考文献

1. CentOS に pyenv で Python インストールしてみた - enomotodev’s blog, https://enomotodev.hatenablog.com/entry/2016/12/29/142900, Online; accessed 16-March-2018.
2. rbenvを用いたruby環境構築手順（CentOS7.1） - Qiita, https://qiita.com/ksugawara61/items/e3bb87d5e0dd49d20c8f, Online; accessed 16-March-2018.
3. pyenv/pyenv: Simple Python version management, https://github.com/pyenv/pyenv, Online; accessed 16-March-2018.
Active Recordのコールバックの記述方法について

callbackの書き方で、`def`がシンボルを返すことを利用して以下のコードの様に書くのはどうだろうかと最近思ったのであげて見ました。

```ruby
class Hoge < ApplicationRecord
  private

  ## validate
  validate def _check_maintenance_time
             errors.add(:created_at, "メンテナンス中のため作成できません") if _in_maintenance_term?
           end, on: :create

  ## callback
  after_create def _owner_join
                 event_members.create(owner: owner, state: :approved)
               end
end
```

## メリット
- メソッドとcallbackの指定がDRYになって変更時に、エディターであちこち移動しなくていい
- grepした時にcallbackだと分かる
    - 複数ある場合は都度callbackを頭につける想定

## デメリット
- 記述が増える
- インデントが微妙

## private指定でも使える
```ruby
class Fuga < ApplicationRecord
  private def fuga
            "fuga"
          end
  # private validate def fuga とはできない
end
```

## 緩募
ダメな理由とかあればゆるく知りたい感じなんで、コメントかブックマークコメントいただけると嬉しいです。
mavenやjcenterに上がっているReactNativeは古いので気をつけよう


## はじめに

普段ReactNativeでアプリを開発する際には、`react-native run-android`で自動的にAndroidのプロジェクトが生成されるので、build.gradleに指定するReactNativeのrepositoryについて意識することは少ないと思います。

ただ、今回ReactNativeのNativeUiComponentのライブラリを作るために1からAndroidプロジェクトを作成してbuild.gradleも記述したためにハマってしまったことを書き留めておきます。

## 問題

早速build.gradleに以下のように記述し、ReactNativeの最新版を利用するようにしていました。

```gradle:build.gradle
dependencies {
    compile 'com.facebook.react:react-native:+'
}
```

ですが、作成したNativeUiComponentを実際に使ってみると、どうもうまく動かない。 javaのエラーであるはずのメソッドがなかったり、存在しないclassをimportしていたりと、ライブラリを作るために使っているReactNativeと、それを利用する側のアプリで利用しているReactNativeのバージョンが違うような挙動を示しました。

両方最新のバージョンを使うようにしているはずなのにおかしいなとハマってしまいました。

## 原因

調べてみると、今現在のReactNativeの最新バージョンが`0.54.2`であるのに対して、mavenやjcenterにあるReactNativeは最新バージョンが`0.20.1`とかなり古いことが原因であることがわかりました。

## 対処法

Androidプロジェクトで最新のReactNativeを利用する場合は、`npm install react-native`でインストールしておきつつ、

```gradle:build.gradle
repositories {
    maven {
        url "$rootDir/../node_modules/react-native/android"
    }
}

dependencies {
    compile 'com.facebook.react:react-native:+'
}
```

こんな感じで`node_modules/react-native/android`にjarやaarがおいてあるのでそちらを参照するようにしましょう。

## 終わりに

https://github.com/facebook/react-native/issues/8391

記事にまとめている最中に見つけたissueですが、同じ問題に対して同じ対処法が示されていました。

基本的に普通にアプリを作る際には気にしなくて良いですが、NativeUiComponentのライブラリを作りたいと思っている方はお気をつけください。
AutolayoutのCompression resistanceとhuggingについて

よく忘れるので備忘録です。

## Content hugging priority

|-A-B-C-D-| は固定のHorizontal Spacingで繋がっている
それぞれのUILabelのwidthは未設定

<img width="389" alt="スクリーンショット 2018-03-16 22.22.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/65bf59fd-c7ad-21e2-711d-f5e2026f6dfc.png">  

Aの文字列を減らすとエラーになる

<img width="385" alt="スクリーンショット 2018-03-16 22.23.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/e57bc3f6-c485-b339-2cfb-d2066908ed03.png">

AのContent hugging priorityを他のViewよりも下げる(例では250)と幅を埋めてくれるようになる

<img width="384" alt="スクリーンショット 2018-03-16 22.23.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/184e1cdf-acdf-370f-1513-223f606abd34.png">

この状態でA-BのHorizontal Spacingを固定ではなく可変 (>= 5, <= 100 など) にするとこうなる（Aはテキストのサイズに戻る）
gte, lte指定のHorizontal Spacingが優先的に使われる模様

<img width="383" alt="スクリーンショット 2018-03-16 22.23.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/7251e502-c76a-c5a9-e1ff-cfe2f431e613.png">

## Content compression resistance

|-A-B-C-D-| は固定のHorizontal Spacingで繋がっている
それぞれのUILabelのwidthは未設定

<img width="350" alt="スクリーンショット 2018-03-16 22.49.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/1e270997-8189-4616-b969-fb120192c392.png">

Aの文字列を増やすとエラーになる

<img width="348" alt="スクリーンショット 2018-03-16 22.49.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/44ddc056-4cf3-a5a9-b197-cb22d5dba794.png">

BのContent compression resistanceを他のViewよりも下げる(例では749)と縮むようになる

<img width="349" alt="スクリーンショット 2018-03-16 22.50.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/8fd4da38-4786-a069-3245-b02e3a1d256e.png">

CのContent compression resistanceをBよりも下げる(例では748)とこうなる
(Bと同じ749にするとエラー)

<img width="345" alt="スクリーンショット 2018-03-16 22.50.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/41e3b6be-a257-40cc-f0ad-49c622471dea.png">

この状態でA-BのHorizontal Spacingを固定ではなく可変 (>= 5, <= 100 など) にするとこうなる（Bはテキストのサイズに戻る）
こちらもgte, lte指定のHorizontal Spacingが優先的に使われる模様

<img width="345" alt="スクリーンショット 2018-03-16 22.54.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/94bf5354-4e9b-0550-6cbd-09409475e58a.png">
spring bootのチュートリアルをとりあえずやってみる(2)

[spring bootのチュートリアルをとりあえずやってみる(1)](https://qiita.com/colet/items/6184b3b9477b2e1af1f1)の続きです。

今回も[spring bootのチュートリアル](https://spring.io/guides/gs/spring-boot/)の続きをやります。
今回は、前回書いたコードをunitテスト（単体テスト）します。

# 依存関係の追加

```build.gradle
dependencies {
 // add
 testCompile("org.springframework.boot:spring-boot-starter-test")
}
```

# テストの作成
(1)で作成したControllerに対してテストを作成します。

```
mkdir -p src/test/java/hello/
touch src/test/java/hello/HelloControllerTest.java
```

javaファイルの中身はチュートリアルからコピペ

HelloController.javaで定義したアクセス先（今回は"/"）のステータスと戻り値をテストします。

```HelloControllerTest.java
    .andExpect(status().isOk()) //ステータスがOKか？
    .andExpect(content().string(equalTo("Greetings from Spring Boot!"))); //戻る文字列がこれか？
```

# テストの実施
実際テストを動かします。

```
// 成功ケース
./gradlew test
・・・色々出る
BUILD SUCCESSFUL in 1s //成功

// 失敗ケース 文字列を変えたりとかしてみる
./gradlew test
hello.HelloControllerTest > getHello FAILED
    java.lang.AssertionError at HelloControllerTest.java:29
2018-03-16 22:31:13.652  INFO 949 --- [       Thread-6] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@5da17b83: startup date [Fri Mar 16 22:31:10 JST 2018]; root of context hierarchy

1 test completed, 1 failed


FAILURE: Build failed with an exception.
```

以上で、unitテストもできそうです。
次回は、spring bootからJPAを用いてMySQLに接続してみようと思います。
複数のAzure環境を同一アカウントで管理する(権限付与,アクセス権管理)

## 1.はじめに

ここで主に伝えたいのは、テナント(hoge.onmicrosoft.com)にxxx@fuga.onmicrosoft.comアカウントでアクセス可能にすることです。
複数のAzure環境を管理したり作業したりする場合、テナントが違う場合にいちいちアカウントを切り替えるのは面倒です。
そこで１つアカウントに様々なAzure環境(テナント毎やサブスクリプション毎)にアクセス件を付与するが可能です。

*テナント、サブスクリプションについては以下でまとめてくれています。
[Azureのテナント／ディレクトリ／アカウント／ロールについて]
 (https://qiita.com/uekikazuki/items/472dac7de0032745a336)

権限付与は、サブスクリプション単位で行うことができます。
さらに細かくVM単位でも可能ですが、ここではサブスクリプション単位での権限設定方法をまとめます。
サブスクリプションは請求をまとめるときに便利ですが、リソースに対してアクセス権をまとめてつけることもできるので、開発、検証、本番環境などアクセス権も意識して作成すると、アクセス管理がしやすくなります。



## 2.ユーザー追加
1. Azure Portal のサブスクリプションにアクセスします。
2. アクセス権を付与するサブスクリプションを選択します。
3. メニューから [アクセス制御 (IAM)] を選択します。
4. ＋追加をクリックしアクセス許可の追加を表示します。
5. [ロール] ボックスで、ロールを選択します。
6. [アクセスの割り当て先] ボックスで、[Azure AD のユーザー、グループ、またはアプリケーション] を選択します。
7. [選択] ボックスに、追加するユーザーのメールアドレスを入力します。 ユーザーを選択し、[保存] を選択します。

|ロール        　| 説明      | 
|:-------------------|:-----------------|
|所有者　　　　　　　　|リソースの所有者でありすべての管理ができる<br>リソースへのアクセス権を管理できる|
|共同作成者           |リソースの所有者でありアクセス権管理以外の管理ができる|
|閲覧者　　　　　　　　|リソースを表示できるが管理ができない|
|ユーザーアクセス管理者|リソースへのアクセス権を管理できる|

![](https://msdnshared.blob.core.windows.net/media/2018/03/image_thumb135.png)


## 3.認証　*外部ユーザー(アクセス件を付与した人がテナントに含まれていないの場合)のみ

上記の登録を行うと、外部ユーザーにはアクティブ化リンクが含まれた確認メールが届きます。 
このメールの「Get Started」(日本語だと「はじめに」)リンクを表示します。
! **2018年3月時点では、chromeでは"Bad Request"と表示される場合があるので、その場合がIEでリンク先を表示します。**
![](https://msdnshared.blob.core.windows.net/media/2018/03/image_thumb135.png)


「はじめに」をするとブラウザが起動して確認画面が表示されるので、画面に従って進めていきます。
*内部的には、対象のAzure(サブスクリプション)に外部のユーザーである新しいユーザーは、AzureADディレクトリ内に既存の属性がありません。 外部ユーザーがディレクトリ内に属性を記録されることに対して同意確認でる。

![](https://docs.microsoft.com/ja-jp/azure/active-directory/media/role-based-access-control-create-custom-roles-for-internal-external-users/6.png)


これで異なるAzure環境(テナントまたはサブスクリプション)にアクセスが可能になります。
Azure環境(テナント)に切り替えるには、ポータルの右上隅で選択します。
![](https://docs.microsoft.com/ja-jp/azure/includes/media/active-directory-b2c-switch-b2c-tenant/switch-to-b2c-tenant.png)

## 参考サイト

[ロールベースのアクセス制御の概要](https://docs.microsoft.com/ja-jp/azure/active-directory/role-based-access-control-create-custom-roles-for-internal-external-users)

[Azure Portal で Azure Active Directory B2C テナントを作成する](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/active-directory-b2c-get-started)