OmniAICreator/Qiita-1.07M huggingface dataset:
仙台CTF2017 [Log01] 大量アクセス 100

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/bd946e86-39ff-9f01-d0ca-65b69a231533.png)

#解いてみた

問題のファイルをダウンロードして、解凍します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6724fb42-3203-df70-66f6-7ae609c11951.png)

中身は一般的なアクセスログでした。
まずは先頭のIPアドレスだけ抽出します。

正規表現で

```
^\S+
```

とやれば、先頭からスペースまでを取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d3e2b6d7-24ac-9985-768f-31cd998765dd.png)

これでgrepします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cc75b50d-a2dd-5868-d350-d18472f9fef8.png)

こんな感じで抽出できました。
これをExcelとかで集計します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e6058c00-112c-e62b-74b3-7939a509b7f5.png)

明らかに一つ数が多いのでこれが正解です。
ssh、slogin、su が遅くなった場合の対応の一つ

# 状況
* ubuntu 16.04 から 18.04 に upgrade した後に発生
* slogin でのログイン、及び、su で root になる場合に時間がかかる
* /var/log/auth.log には、以下のようなエラー 

```
Oct  9 19:55:38 XXXXX sshd[4982]: pam_systemd(sshd:session): Failed to create session: Connection timed out
```

* このメッセージで web を探すと見つかる、以下の対処方法が効かない

```
systemctl restart systemd-logind
```

# 有効な対処法
* しばらく探し続けて見つけた、 https://www.ogre.com/node/518 の対応が有効だった。すなわち、

  * /etc/pam.d/common-session
  * /etc/pam.d/runuser-l
  * /etc/pam.d/systemd-user

の3つのファイル中にある、文字列 "pam_systemd.so" を含む行の先頭に "#" マークをつけて、コメントアウトする
AutoCad.NET Intersect 列挙型

#クラス階層
**Autodesk.AutoCAD.DatabaseServices.Intersect Enumeration**

#定義
```csharp
[Wrapper("AcDb::Intersect")]
public enum Intersect {
    OnBothOperands, // 0
    ExtendThis,     // 1
    ExtendArgument, // 2
    ExtendBoth      // 3
}
```
####ObjectARX 定義

```cpp
// AcDb::Intersect Enumeration
enum Intersect {
    kOnBothOperands = 0,
    kExtendThis = 1,
    kExtendArg = 2,
    kExtendBoth = 3
};
```

#説明
| 定 義 名 | 説 明 |
|:--|:--|
|**OnBothOperands**|両方の図形の延長線上の交点は含めない（実際の交点のみ含める）|
|**ExtendThis**|この図形の延長線上の交点も含める  |
|**ExtendArgument**|引数図形の延長線上の交点も含める  |
|**ExtendBoth**|両方の図形の延長線上の交点も含める  |
openflipper

# はじめに
openflipperというmeshベースのモデラーのインストール方法を説明します。
BSDライセンスなので、ライセンス的にも使いやすいと思います。

https://www.openflipper.org/

### 環境
Ubuntu 16.0.4

### 作るもの
![Peek 2019-10-07 21-49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100466/84e4d92f-565b-1430-66f1-26909a1d001d.gif)


### 対象読者
オープンソースでライセンス的にも使い勝手のよいmesh modelerでよいものを探しているかた。

# 内容
### install
下記URLの手順にしたがってインストールしていきます。

http://openflipper.org/Documentation/latest/a14840.html

#### QT
5.9 <= Qt <= 5.1のversionのものが良いとのことだが、下記URLには5.9か、5.12以降しか見つからないため、今回は5.9を用いる。
http://download.qt.io/official_releases/qt/

下記URLより、5.9.8のrunファイルをダウンロード。
http://download.qt.io/official_releases/qt/5.9/

後は、下記qitta記事を参考にインストールをしてください。
https://qiita.com/chlochan/items/53f1276522d03f460a81

### other dependencies
```
sudo apt-get install doxygen doxygen-gui graphviz
sudo apt-get install libeigen3-dev
sudo apt-get install libglew-dev
```

### openflipper
``` bash
git clone --recursive https://graphics.rwth-aachen.de:9000/OpenFlipper-Free/OpenFlipper-Free.git OpenFlipper-Free
```
submoduleのOpenFlipper-Free/OpenFlipperをcloneする際に下記のようなエラーが出ます。

```
fatal: clone of 'https://www.graphics.rwth-aachen.de:9000/OpenFlipper-Free/OpenFlipper' into submodule path 'OpenFlipper' failed
```

その場合、他のsubmoduleも含め全てgit clone出来ていない可能性がある。そのため、下記コマンドを実行しsubmoduleをダウンロード

```
git submodule update --init --recursive
```


### make
openflipperのドキュメントに従い、OpenFlipperのソースコードがある階層にて、下記を実施。

```
mkdir build
cd build
cmake ../OpenFlipper-Free
```

cmake中にQTが見つからないと出た場合は、CMakeList.txtの頭の方にに下記を追加。

```
set(QT5_INSTALL_PATH "/home/ユーザー名/qtがある場所/5.9.8/gcc_64/")
```

cmake中にOpenMeshが見つからないと、下記のようなエラーが出る。

```
Could NOT find OpenMesh (missing: OPENMESH_CORE_LIBRARY OPENMESH_TOOLS_LIBRARY OPENMESH_INCLUDE_DIR)
```

その場合は、OpenFlipper-Free/OpenFlipper/libs_requiredのフォルダに移動し、下記コマンドでOpenMeshをダウンロード

```
git clone https://www.graphics.rwth-aachen.de:9000/OpenMesh/OpenMesh.git
```

cmakeが無事に通ったら、makeを実行

```
make -j 4
```

### 実行
Build/binフォルダに移動し、下記コマンドでopenflipperを起動

```
./OpenFlipper
```

無事に下記画面のように起動すれば、インストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100466/f76c6608-db04-afd9-5d9a-277c6e394e32.png)




# 参考サイト一覧
https://www.openflipper.org/download/
http://openflipper.org/Documentation/latest/a14859.html
VueとCanvasでサクッと使えるルーレットアプリを作った

# TL;DR
* VueとCanvasでルーレットを作ったよ
* ルーレットの各要素のウェイトを変えると確率を調整できるよ
* レスポンシブなのでモバイルでも使えるよ

[BanG Roullet!](https://bang-roullet.firebaseapp.com)
![demo_1](https://user-images.githubusercontent.com/41538196/66265804-56f1d980-e857-11e9-8bc4-d99db19b242e.gif)

#こだわりとか
#### カラーテーマ
バンドリの25人のキャラのイメージカラーがルーレットの各要素に割り振られます
これがやりたかったために作ったと言っても過言ではないです
そのためルーレットの要素は25個までしか設定できません
~~バグではなく仕様です~~
ちなみにBanG RoulletというタイトルはBanG Dreamからです

#### UIをシンプルにした
結果の表示や、ルーレットの初期化の確認メッセージ等を除き、UIから文字を廃して直感的に操作できるようにしました
操作できるボタンはカラーにして、操作できないものはグレーにすることで視覚的なわかりやすさも意識しました

#### ルーレットの減速時の挙動
停止ボタンを押すと徐々に減速するようにしました
停止するのが遅すぎるとイライラするし、早すぎると抽選してる感がないので、いい塩梅に減速させるのに苦労しました
結果としてなかなかリアルな動きになったのではないかと思います

#### レスポンシブにしてモバイルにも対応
ルーレットを使いたいときに目の前にPCがあることって稀だと思うんです
通常はモバイルで使いたいと思うので、頑張ってCanvasの描画を維持したままリサイズできるようにしました
`addEventListener`でウィンドウのリサイズされるとCanvasの幅を更新するようにしています

# 使った技術とかライブラリ
* Vue.js
* Canvas
* Bootstrap
* Element UI
* Firebase

できるだけライブラリは利用せずに作りました（リファレンスを読むのがめんどくさかった）
`setInterval`でルーレットの描画処理をかなりの回数呼び出すことになるので、その処理を重くしたくなかったというのもあります
円グラフの描画ライブラリとかを使えば、見た目をもっとよくできるかもしれませんが…

CSSフレームワークはElement UIを使用していますが、レスポンシブデザインには対応してないっぽいので結局Bootstrapも導入しました
正直Bootstrapだけで完結できる気がするので、Element UIはそのうちはがすかもしれません

デプロイ先としてFirebaseを初めて利用しましたが、サーバー側の機能はまったく使ってないので活用できてない感がすごいです
認証などの機能を利用するアプリを開発する際は使ってみたいですね

# できなかったこと
本当はルーレットの針も一緒に動くようにしたかったのですが諦めました

ルーレットの低速時には、要素の境界が針に差し掛かったときに針が動くようにしないと視覚的に違和感があるため、針は止めたままにしました
単純にルーレットの減速に合わせて針の動作頻度を落とすだけならできるのですが、境界に合わせて動作させるとなるとかなり難しいです

# まとめ
なかなか使いやすい操作性にできたんじゃないかと思います
要素の編集、削除、確率調整、ルーレットのリセット、リロードの機能もあるので、総じて満足いく作りにできました
ただ、要素を25個を超えて追加しようとしたときのアラートのデザインがデフォルトのままなので、UIはもう少し詰めようと思います

使った感想や、こういう機能が欲しいという要望があればコメントしてもらえると嬉しいです！

最後に、バンドリはいいぞ。

# ソースコード
GitHub
https://github.com/rootsuke/BanG-Roullet

# 参考
こちらの記事でCanvasでルーレットを描画する着想を得ることができました
ありがとうございました
https://tech-blog.s-yoshiki.com/2019/01/1024/
routingでtypoしてるとrspecでActionController::UrlGenerationErrorがでる件

## 概要
routingでtypoしていると、railsは無視して解釈してアクセスできるようにしてくれますが、rspecはそのコントローラーのテストでエラーを返します。

## 例えば

```config/routes.rb
resources :examples, excpet: %i[new update destroy] 
```
**except**を`excpet`のように書く。

こんな感じで解決される。

ちなみにrails routesはこんな感じになる

```
examples      GET         /examples(.:format)            examples#index {:excpet=>[:new, :update, :destroy]}
              POST        /examples(.:format)            examples#create {:excpet=>[:new, :update, :destroy]}
new_example   GET         /examples/new(.:format)        examples#new {:excpet=>[:new, :update, :destroy]}
edit_example  GET         /examples/:id/edit(.:format)   examples#edit {:excpet=>[:new, :update, :destroy]}
example       GET         /examples/:id(.:format)        examples#show {:excpet=>[:new, :update, :destroy]}
              PATCH       /examples/:id(.:format)        examples#update {:excpet=>[:new, :update, :destroy]}
              PUT         /examples/:id(.:format)        examples#update {:excpet=>[:new, :update, :destroy]}
              DELETE      /examples/:id(.:format)        examples#destroy {:excpet=>[:new, :update, :destroy]}
```

routingではtypoは解釈されず、resourcesは全て解釈される。

そしてcontrollerを作りアクセスすると

```examples_controller.rb
class ExamplesController < ApplicationController

  def index
  end
```

```
{"method":"GET","path":"/examples","format":"html","controller":"ExamplesController","action":"i
ndex","status":200,"duration":4429.18,"view":4345.9,"db":3.32,"backtrace":null,"host":"localhost
","message":"[200] GET /terms_of_uses (TermsOfUsesController#index)"}
```

そして普通にアクセスできてしまう。

しかしこの状態でrspecのcontroller_specを作成して実行すると

```
require "rails_helper"

RSpec.describe ExamplesController, type: :controller do

  describe "GET #index" do
    it "returns a 200 status code" do
      get :index
      expect(response.status).to eq(200)
    end
  end
end
```

```spec/controller/exmaples_spec.rb
  1) AnnouncementsController GET #index responds successfully with an HTTP 200 status code
     Failure/Error: get :index
     
     ActionController::UrlGenerationError:
       No route matches {:action=>"index", :controller=>"announcements"}
     # /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:35:in `block in process'
     # /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:102:in `catch'
     # /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:102:in `_catch_warden'
     # /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:35:in `process'
     # ./spec/controllers/youtube_channel_platform_histories_controller_spec.rb:58:in `block (3 levels) in <top (required)>'
```

このように解釈してくれない。

## 結論
typoするやつ許すまじ(ブーメラン)
structのMemberwise Initilaizer(swiftが用意してくれてるinit)の挙動

structの生成ができない！と焦った経験があり、忘れないようにメモ程度で残します。

## structのMemberwise Initilaizerについて

``` swift
struct MyData {
	var name: String
}
```

上記のようなstructはinitを定義してなくても

``` swift
let data = MyData(name: "hoge")
```

とMemberwise Initilaizerが存在します。

ただ場合によっては利用出来ないこともあります。

``` swift
struct MyData {
	var name: String
	private var age: Int?
}
```

上記のようなstructがある場合、MyDataを生成することは不可能です。

#### `age`がprivateになっているため、initを用意してくれてしまうと`private`としての意味がなくなってしまうから。
だと思います。

``` swift
struct MyData {
	var name: String
	private var age: Int?
	
	init(name: String, age: Int?) {
		self.name = name
		self.age = age
	}
}
```

そういうときにはinitを定義してあげるしかないですね。

### privateな変数がある場合、initを定義せずにデータを生成する方法

`private`な変数があるけどinitがないstructはたくさんのプロジェクトで使われてるはずです。

生成できないけど、どこで使われるのか。

``` swift
import Foundation

struct MyData: Codable {
	var name: String
	private var age: Int?
}
```

jsonデータをdecodeするために、Codableを採用してる場合です。

----

ちなみにprivateな変数があるstructを生成しようとすると

```
error: 'MyData' initializer is inaccessible due to 'private' protection level
```

と怒られますが、
あまり経験したことがなく、
initも特に深く考えずに使ってることが多かったので焦りましたね。

initしてるだけだから、特にprivateの変数に外部からなにかしようとしてないんだけど！！なんで！？と思いハマっちゃいましたｗ

用意されるinitはinternalのものになるので、privateを勝手にinternalには変えてくれないということです。すごい当たり前の挙動ですねｗ

まあ考えてみれば当たり前のことなので、
お恥ずかしいですが、自分のような人はあまりいないと思いますが、メモとして残します！
何をやってもRails Serverが切れなかった


こんにちは[@yukifreeworld12](https://twitter.com/yukifreeworld12)です。

# 何をやってもRails Serverが切れなかった話


いつも通りrails severを立ち上げると

```
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Exiting
```
と表示される。

###とりあえずkillコマンドをググる
定番のコマンドを試しまくってもダメ...
ターミナルを停止して立ち上げ直したり、エディターを再起動してもダメ...

（killコマンド一覧）
`lsof -wni tcp:3000`
`ps ax | grep puma + kill -9 PID`
`ps ax | grep rails + kill -9 PID`
`kill -9 $(lsof -i tcp:3000 -t)`

###結果
ただのRoute設定ミスでした...

よくエラー文を見てみると下にplease check your routes の文が書かれていました。

```
=> Booting Puma
=> Rails 5.2.3 application starting in development 
=> Run `rails server -h` for more startup options
Exiting

(中略)

in `check_part': Missing :controller key on routes definition,
 please check your routes. (ArgumentError)
```

まさかRouteの設定ミスでもserverがExitingと表示されるとは思わなかった。
長いエラー文でもしっかり見ないといけないなと勉強になりました。

色々試してダメな方はエラー文見直すかルーティング確認するといいかもしれません。

###追記

ルーティングがおかしいとコントローラーなども作成出来なくなります。
【PHP8.0】オブジェクト初期化子のRFCが却下されそう

いつのまにやら[Object Initializer](https://wiki.php.net/rfc/object-initializer)というRFCが投票に入っていました。
ちょっとだけ面白そうと思ったのですが、ただ、ほぼ確実に却下されるので詳しく見てもしょうがないのでざっくり紹介してみます。


# Object Initializer

## 文法

```php
class Customer{
  public $id;
  public $name;
  private DateTimeImmutable $createdAt;
}

$customer = new Customer{
  id = 123,
  name = "John Doe",
};
```

newするときに中括弧で引数を渡すと、自動的にプロパティにセットされます。

キーが文字列ではないところが、PHPとして物凄い違和感がありますね。

上の例は、下のようなよくある文と同等です。

```php
$customer = new Customer();
$customer->id = 123;
$customer->name = "John Doe";
```

従って、privateである`$createdAt`に値を突っ込むことはできません。


## 制約

オブジェクト初期化子を使う場合、全てのpublicプロパティを指定しなければなりません。

```php
$customer = new Customer{
  id = 123, // RuntimeException class object failed due to missing required properties
};
```

オブジェクト初期化子自体を使わない場合は、普通にインスタンス化できます。

```php
$customer = new Customer();
```


## 未定義プロパティ

未定義のプロパティに値を突っ込めます。

```php
$baz = 'baz';

$obj = new stdClass {
  foo = "bar",
  $baz = true,
};
```

ええー、と思いますが、そもそもこれPHPの仕様だったわ。


## コンストラクタ

オブジェクト初期化子を使う場合、コンストラクタに引数は渡せません。
即ち、以下のような書き方は文法エラーになります。

```php
$customer = new Customer($dateTime){
  id = 123,
  name = "John Doe",
};
```


## マジックメソッド

可視プロパティがなかった場合、普通にマジックメソッド`__set`が呼ばれます。
RFCに書かれている以下の例では、`$name`はpublicなので直接値が入り、protectedである`$email`はマジックメソッド`__set`が呼ばれることになるようです。

```php
class EmailAddress
{
  protected string $email;
  public ?string $name = null;
 
  public function __set(string $name, $value): void
  {
    if ($name !== "email") {
      return;
    }
    if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
      throw new InvalidArgumentException("Invalid email address");
    }
    $this->email = $value;
  }
}

$email = new EmailAddress {
  email = "john.doe@example.org",
  name = "John Doe",
};
```


## 将来の予定

無名クラス`stdClass`を使うときは、もうクラス名すらも書かなくてよくない？

```php
$obj = new {
  foo = "bar",
  $baz = true,
};
```

配列展開してpublicプロパティ突っ込めたらよくない？

```php
$array = [
  'a' => 1,
  'b' => 2,
];

$obj = new { ...$array };
```

## 投票

2019/10/07投票開始、2019/10/21投票終了、可決には2/3+1の賛成が必要です。
2019/10/09現在は賛成3反対18で、ほぼ確実に却下されます。

この投票期間、RFCには何故か書かれていません。


# 感想

うん、まあ却下だよね。

特にpublicプロパティは全て指定しなければならないという厳格さと、未定義プロパティを指定できるという緩さが同居してるのは気持ち悪いというかなんというか。
これならまだ[Automatic Property Initialization](https://wiki.php.net/rfc/automatic_property_initialization)のほうがいいと思います。
[Code free constructor](https://qiita.com/rana_kualu/items/041724987393696ec926)よりはいいと思いますが。


ただ無名クラスはすごい便利そうなので、これは欲しいところですね。

```php
$obj = new{
  'id' = 123,
  'name' = 'John Due',
};
```

まあ、今でもほぼ同じように書けたりはするんですけどね。

```php
$obj = (object)[
  'id' => 123,
  'name' => 'John Due',
];
```
pythonで実行時間を計測する



# 背景・問題

`time.time()`の差分をとる方法で計測すると、返ってくる値が秒数であり、`hh:mm:ss`の形式になっていない:frowning2:


# 提案

秒数を見やすい形に変換する関数を自作しました。


```python
from time import time
from contextlib import contextmanager


@contextmanager
def time_counter(label='elapsed time:'):
    """with文で処理の実行時間を測るやつ

    Example
    -------
    >>> from time_counter import time_counter
    >>> from time import sleep
    >>> with time_counter(label='elapsed time:'):
    ...     sleep(.05)
    ...
    elapsed time: 50.9 ms
    """
    t0 = time()
    yield
    t1 = time()
    print(f'{label} {timedelta(seconds=t1 - t0)}')


def timedelta(seconds: float) -> str:
    """1秒未満の場合はミリ秒を表示し、1秒以上の場合はhh:mm:ssの形式にする

    Example
    -------
    >>> from time import time, sleep
    >>> t0 = time()
    >>> sleep(.05)
    >>> t1 = time()
    >>> print(f"elapsed time: {timedelta(t1 - t0)}")
    elapsed time: 51.5 ms
    """
    if seconds < 1:
        return f'{seconds*1000:.3g} ms'
    else:
        m, s = divmod(round(seconds), 60)
        h, m = divmod(m, 60)
        return f'{h:02d}:{m:02d}:{s:02d}'

```


# 使用例

```python
from time import sleep

with time_counter():
    sleep(.05)
    y = 1 + 1
print(y)
```

```
elapsed time: 50.5 ms
2
```
動作しているプログラムがあるディレクトリ名を取得する

vscodeでプロジェクト全体のディレクトリを開いている時に内包する個別プロジェクトのプログラムを動作させたとき、相対パスで出力を書いていると全体のディレクトリに漏れ出す

```python:foo.py
## global/local/foo.pyのプログラムを端末のpwdがglobalのところで実行したとする
## 例　`python3 blobal/local/foo.py

# こう書くと実行時のpwdに漏れ出す
with open("bar.txt", "w") as bar:
    bar.write("hello")

# 変更する
dir = os.path.dirname(__file__)
with open(os.path.join(dir, "bar.txt") as bar:
    bar.write("hello")

```
Flash Player 2020年12月31日廃止に立ち向かうためのAdobe Air乗り換え概要

# 初めに

　日本のWeb界で一時代を築いたFlashアニメや高度なWebアプリを世の中に提供した偉大なAdobe Flashが2020年12月に廃止になります。Flashアプリの中でも業務アプリなどで利用されているFlexアプリはApache Royale、OpenFL、Haxeなど既存のActionScriptを活用して、乗り換えをする手段があります。しかし移行の難易度は高めです。また2019年も半ばを過ぎて、生き残っているようなFlexアプリケーションは大きな規模のものであると推定されます。とても重要な役割を担っているアプリだとは思いますが、残念ながらFlexアプリをWebアプリとして簡単に生き残らせる方法はありません。
　Adobe Flex BuilderはFlexアプリのほかにAdobe Airアプリとして出力する機能があります。WebアプリではないですがとりあえずAdobe Airアプリにして、急場をしのぎましょう。
　この記事の注意事項は下記です。
- Adobe Airアプリの作り方に関しては自分で調べてください。ググればすぐわかります。
- Flex SDK3.3あたりをイメージして書きます。つまりMXプロジェクトです。Sparkプロジェクトでもほぼ一緒です。
- Windows版しか作れません。

#　変更項目
| 変更内容       |       詳細説明 | 
|:-----------------|:-----------------|
| Airアプリへのコンパイル | https://help.adobe.com/ja_JP/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7fa1.html|   |
| ベースアプリケーションのタグを書き換える | ベースとなるMXMLを書き換える必要があります。<br>mx:Application<br>↓<br>mx:WindowedApplication |   
| HTMLからFlashアプリの起動時に渡していた情報を別途通信などで取得する | 表示などの変更のため、HTML上にFlashアプリの起動引数を記載している場合は通信経由で取得するように変更しましょう。 |   
| BlazeDSを用いた通信部分のURL | Webアプリの場合はAMF通信で用いるベースURLをベースとなるhtmlのURLから生成していることが多いと思います。<br>Air化したアプリでは下記の対応が必要。<br> - Air化したアプリの起動時に”接続先ホスト名/IPアドレス”を入力するダイアログを表示<br> - ダイアログに入力されたホスト名/IPでAMFの接続先のURLを生成する|   
| SWFの動的ローディングの廃止 | Flexアプリの時はローディング時間の短縮のため、SWFを分割し、遅延ローディングをしていることが多いと思います。Adobe AirではSWFの動的ローディングはできません。分割ローディングを廃止し、一つのSWFにまとめてしまいましょう。|   
|JavaScriptを経由していた処理のAdobeAir化| JavaScript経由でほかのSWFと通信したり、JavaScriptライブラリを呼び出していたり、HTML5のWebStorageを使用していた場合、その部分はAdobeAirで代替処理を書き直しましょう。|
| クッキーを用いたSSOの廃止 |クッキーはブラウザでのみ使用できる機能です。Air化したアプリからHTMLのページをブラウザで表示する際にクッキーを用いたSSOシステムがあると、そのHTMLページは表示できなくなります。呼び出しURLに認証情報を含める方式に変更しましょう。|
| バージョンの管理| ブラウザで動く場合、常にサーバと同じバージョンのものがロードされて使用されますが、AdobeAir化してアプリにしてしまうと、バージョンをサーバと同じにすることは難しくなります。<br> Adobe　Airのランタイムを別途インストールする形式なら、サーバにあるバージョンをチェックして、新しいものを自動取得させる方法が用意されています。<br>AdobeAirのランタイムを利用せずに起動できるようにするため、Exe化した場合は、別途バージョンをチェックしてアップデートするラウンチャプログラムが必要となります。|   
|Adobe Airのダウンロード元の用意|FlashアプリのHTMLにアクセスした際にダウンロード促して、利用してもらう必要があります。|
|マニュアル修正|使用方法が変わるのですから書く必要があります。|

#ブラウザ経由でアプリをSSO起動したい場合
WindowsではURIをレジストリに登録することにより、ブラウザからアプリを起動することが可能になります。<br>
[URI に応じた既定のアプリの起動](https://docs.microsoft.com/ja-jp/windows/uwp/launch-resume/launch-default-app)
このページではUWPアプリのみが対象のような書き方ですが、レジストリに登録すれば、AdobeAirのアプリでも対応できます。JavaWebStartのアプリをスタンドアロンJavaアプリにする際にも応用できます。

| 変更内容       |       詳細説明 |
|:-----------------|:-----------------|
| SSO時のプロトコルをHTTPから変える | httpではなく独自のプロトコル名を決めましょう。SSO元から”プロトコル名://”でアクセスするように変更します。|
| レジストリへの登録 | 下記のように設定する<br>HKEY_CLASSES_ROOT\\<プロトコル名>\\<br>　((既定)) REG_SZ URL:xxプロトコル<br>　BrowserFlags REG_DWORD 0x0000008<br>　EditFlag     REG_DWORD 0x0000002<br>　URL Protocol REG_SZ <br>HKEY_CLASSES_ROOT\\<プロトコル名>\\DefaultIcon<br>　((既定)) REG_SZ Airアプリケーションのパス<br> HKEY_CLASSES_ROOT\\<プロトコル名>\\shell\\open\\command<br>　((既定)) REG_SZ Airアプリケーションのパス<br>|

#ちなみに
Flashアプリの改造なしに、HTML5化したいという人のためにOSSの組み合わせで実装するアイディアも書きました。
[xvfbを用いたAdobe FlashアプリケーションのHTML5化](https://qiita.com/MypaceEngine/items/c6d91910f2a56535d05e)
【TC39 Proposals】do expressions

# 注意書き

2019 年 10 月 9 日に開催の [#tc39_study](https://web-study.connpass.com/event/147538/) 用に作成した資料です。
執筆時点で TC39 の Proposals に上がっている機能を紹介します。
将来的に JavaScript（ECMAScript）に取り入れられるかもしれませんし、取り入れられないかもしれませんし、紹介内容から仕様が大きく変更になるかもしれません。
TC39 の承認プロセスについては、https://tc39.es/process-document/ をご覧ください。

---

# do-expressions

ブロックの末尾の式（completion value）を値として返せるようにします。

例えば、変数 `x` を初期化するために一時変数 `tmp` を使うとします。
`tmp` は `x` のためにしか使わないので、適切にブロックで囲ってあげたくなります。
現時点だと以下のように即時関数を用いるのが簡単な方法でしょう。

```javascript
const x = (() => {
  let tmp = f();
  return tmp * tmp + 1
})();
```

これをより簡潔にするのが do-expressions です。
doブロックの最後の式が値として返るので、以下のように書くことができます。

```javascript
const x = do {
  let tmp = f();
  tmp * tmp + 1
};
```

---

# if文との組み合わせ

doブロックの末尾にif文を書くことで、if文のブロックの末尾の式がdoブロックの戻り値として返ります。

```javascript
let x = do {
  if (foo()) { f() }
  else if (bar()) { g() }
  else { h() }
};
```

---

# JSXでの利用

JSX内で以下のような書き方ができるようになります。

```jsx
return (
  <nav>
    <Home />
    {
      do {
        if (loggedIn) {
          <LogoutButton />
        } else {
          <LoginButton />
        }
      }
    }
  </nav>
)
```

---

# 懸念点

do-while と組み合わせた場合の文法上の曖昧性を回避する必要があります。

```javascript
do do f(); while (x);
```

---

# その他の議論点

issueに上がってる論点をいくつか紹介します。

---

## 非同期まわり

`do async {}` （or `async do {}`）とか

https://github.com/tc39/proposal-do-expressions/issues/4

## Generatorまわり


 `do * {}` とか

https://github.com/tc39/proposal-do-expressions/issues/10

## 例外まわり

こんな感じで動いてほしい。

```javascript
const foo = () => do { throw new Error('foo'); };
const bar = () => 3;
const res = do {
  try { foo(); } catch (e) { bar(); }
}
console.log(res); // 3;
```

https://github.com/tc39/proposal-do-expressions/issues/6

## doいらなくね？

代替案

* `{>let x = 100; x * x}`
* `let x = {| /* blah */ |}`
* non ASCIIな記号を使う（« »  「 」 〈〉 《 》 【 】 〔 〕 ⦗ ⦘）

https://github.com/tc39/proposal-do-expressions/issues/32

---

### doブロック内でのreturnとか

doブロック内で `return` した場合に、doブロックの値になるべきか関数の戻り値になるべきか？

あと `var` `continue` `break` をどうするか。

https://github.com/tc39/proposal-do-expressions/issues/30
https://github.com/tc39/tc39-notes/blob/master/meetings/2018-07/july-24.md#update-on-do-expressions


---

# 今すぐ使いたい人へ

babelのpluginが使えます。

https://babeljs.io/docs/en/babel-plugin-proposal-do-expressions

---

# 所感

気持ちはわかったが議論を見る限り標準化はなかなか難しそう。
条件分岐に関してはPattern Matchingでもできるので、もう少し複雑なケースでの住み分けか。

---

# 参考情報

* https://github.com/tc39/proposal-do-expressions
前処理済のTCGAがんゲノムのデータおよび臨床データをCSV形式で取得する方法について書いておく

## はじめに
　このページの内容は、がんのゲノムデータを触りたい・知りたいと思いはじめた一部の人にとっては、めちゃくちゃ役に立つであろう情報が書かれています。もしかしてこのページは自分のために書かれたんじゃないか？と感じた人はぜひ最後まで読んでください。当然そうじゃない人もいると思いますが、そういう人も一応読んでくれると嬉しいです。

　具体的な方法については、あまり丁寧には書かれていないので、プルリクエストや質問などありましたらコメント欄にお願いします。

## 前処理済みのTCGAデータを求めて

　がんの遺伝子情報を自由に観察してみたいと思う人は少なからずいると思います。がんの遺伝子情報といえば、TCGAです。しかしながらTCGAのデータをダウンロードする時は申請が必要であったり、自分でバイオインフォマティクス処理をするには容量が膨大です。そこで、すでに前処理されたデータが求められます。

　有名なサイトは２つあります。一つはスローンケタリングがんセンターの[cBioPortal](https://www.cbioportal.org/)です。もう1つはカリフォルニア大学サンタクルーズ校の[UCSC Xena](https://xenabrowser.net/)です。これらのサービスは非常に素晴らしいUIを提供しているため、ブラウザからボタンをクリックするだけでも必要な情報の大半は手に入れることができます。

　これらのサービスはそれぞれWebAPIを提供しています。特にcBioPortalの提供するWebAPIは非常に素晴らしく使いやすいです。私はこのAPIが好きで結構使っていました。

　しかし、実は、そのような本家のWebAPIを使用せずとも、実はGitHubで前処理済みのデータが公開されているのです。こちらがcBioPortalのデータのリポジトリです。ここにタブ区切りテキストファイルが保存されています。

https://github.com/cbioportal/datahub

（ここまでTCGAデータベースに気が付き、さらにcBioPortalで前処理済みデータが入手できることに気がついた人は、CSVを使う前にMySQLを使おうとするかもしれませんが、個人的にはMySQLのデータベースから直接データを取得するのは案外煩雑で難しいと感じました。それをやるぐらいなら、自分専用のcBioPortalインスタンスを立ち上げて利用者にとってわかりやすいようにまとめられたWebAPIを叩く方が簡単だと思います。cBioPortalはそれ自体がオープンソースのWebアプリケーションであり、誰でもcbioportal.orgとほとんどおなじように動作する自分専用のインスタンスをデプロイすることができるのです。（その方法もDockerを使って本家のマニュアル通りに進めるだけなので、いずれ気が向いたら記事にしようと思います。）

　ところが、これが普通のGitコマンドでは取得できません。git-lfsというコマンドを使用します。Git LFSはGitHubが中心となって開発しているラージファイル(画像・音声・映像等)を扱うためのコマンドだそうです。

　このコマンドを利用することで、上記のDataHubのリポジトリからTCGAの前処理済みのタブ区切りテキストファイルを取得することができます。あとはこれを好きなプログラミング言語で処理すれば、さまざまな事が可能になると思います。

2020年9月7日追記

UCSC XenaもTCGAのデータを公開しています。
https://xenabrowser.net/datapages/

## おしまい　そして　お願い
上記のような情報は、最期までネタがわかってみれば、な〜んだ、とう感じで簡単で何ら難しいところはないのですが、意外とWebを検索していても見つからない知識だったりしますので、この情報をすごく喜ぶ人も要るのも想像されます。実際、私はこれを知るまでえらい遠回りをしてしまいました。これが欲しかったけど、たどり着けなかった初心者の方も沢山要るだろうなと想像します。要するに知ってるかどうかだけの問題です。もちろん、cBioPortalのグループが前処理したTCGAのデータが完全に正しいとうわけではありませんので、もっと生データから詳しい情報を知りたいんだ、自分で前処理する！という気の強い人は、それはそれで頼もしく思います。

前処理済みのTCGAデータがどこで手に入るかとか、そういうちいちゃなノウハウは、公開してもあまりメリットがなく、むしろデメリットの方はありそうな感じで、しかもターゲット層が薄いため、どうしても溜め込みがちなのですが、こんな風にコードが１行もない散文であってもQiitaは許してくれると思うし（まあ一応プログラミングの話題なのでね）必要としている人もいると思ったので公開しました。

これを読んで良かったな、と思った人は、ぜひ各人のお持ちのノウハウを、人助けだと思って、ブログとかQiitaとかに書いてもらえると嬉しいです。どこかにあなたの持ってる情報を求めている人がきっといます。

この記事は以上です。
【CSS】iOS13, Safari13から指定なしで慣性スクロールできるようになりました。

# 背景
iPhoneでモーダルを表示するときなど、デフォルトで慣性スクロールしてくれないので`-webkit-overflow-scrolling: touch`を指定して、慣性スクロールを実現させているページがありました。
ですが、fixed+慣性スクロールの掛け合わせだと、動きが止まるときがあったので指定を外しました。
そしたら`overflow-scrolling`の指定がないのにiPhoneでも慣性スクロールになっている？と思ったので、検証してみます。

# 検証用
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="cubkich" data-slug-hash="jOOPBYo" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="menu scroll test">
  <span>See the Pen <a href="https://codepen.io/cubkich/pen/jOOPBYo">
  menu scroll test</a> by かぶきち (<a href="https://codepen.io/cubkich">@cubkich</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 端末・バージョン別
## iPhone7 iOS 13.1.2
私の持っている端末では、慣性スクロールが確認出来ました。

## iPhone6 iOS 12.3.1
会社にある端末では、慣性スクロールの確認は出来ませんでした。

## iPhone10s iOS ??.?.?
先輩の端末で見てみたら、慣性スクロールしていませんでした。

# 考察
もしかしたらiOS13からデフォで慣性スクロールしてくれるのかもしれない。
ただ、まだシェアがそこまで広がっていないと思うので、慣性スクロールできないことを前提に対応するべき。
かなぁ。

お使いのiPhoneでは慣性してますか？

# 追記 (2019/12/11)

@spaceonly さんより、以下の情報をいただきました。

> https://developer.apple.com/documentation/safari_release_notes/safari_13_release_notes#3314682
> にて、Appleが公式に

>> Added support for one-finger accelerated scrolling to all frames and overflow:scroll elements eliminating the need to set -webkit-overflow-scrolling: touch.」
>> 
>> （雑訳：　全てのフレームや overflow:scroll な要素に慣性スクロールのサポートを加えたことで、 -webkit-overflow-scrolling: touch を指定する必要が無くなりました　）
> 
> と書いているので、確実のようです。

公式に発表されているようなので、安心して慣性スクロールができるようになったようです。

> Safari 13 ships with iOS 13 and macOS 10.15. It’s also available for macOS 10.14.5 and 10.13.6.
> 
> (Google翻訳：　Safari 13にはiOS 13とmacOS 10.15が付属しています。 macOS 10.14.5および10.13.6でも利用可能です。）

対象はSafari13～のようなので、旧バージョンの対応をしつつ、シェア状況をみて記述を省略、みたいにすると良さそうですね。
メモ(form・パスワード・redirectとrenderの違い)


<h3>form helperについて</h3>
form_forとform_tagの二種類ある
特定のモデルを編集したいときform_for
編集の前提となるモデルが存在しないときform_tagを使う(検索フォーム)


<h2>DBに入る要素を限定した場合、データの検証は行わなくても良いのか？</h2>



<h2>パスワード関連の開発</h2>

gemfileにbcryptの記載・bundle install
+
password_digestモデルの設置
↓
has_secure_passwordが使用可能に
→password_digestに暗号化したパスワードを保存できるように
→仮想属性passwordと、password_confirmation　が使えるように。この二つが一致しているか？を検証するためのバリデーションも追加
→authenticateメソッドが使用可能に。(authenticateは上記のpasswordとpassword_confirmationで入力されたパスワードが、password_digest一致しているとUserオブジェクトを渡す、間違っているとfalse)



<h2>redirectとrenderの違い</h2>

redirectは呼び出すViewのみ指定

redirect_toはHTTPリクエストを送る(基本はGET)
Minecraft Forge Mod開発環境 ～Re:ゼロから始める環境構築～

#経緯

4年ぶりに(当時はバージョン1.7.2だった)MinecraftのMod開発の***[続き](http://www.9minecraft.net/people-mobs-mod/)***をしようとしたのですが、環境構築の方法から苦戦しました。
しかもどのサイトを参考にしても全く解決しない!ということで、記録に残しておこうと思います。

Minecraft 1.13以降の環境だとこの方法で行けると思います。

# #0 準備

必要なもの

- [Minecraft:Java Edition](https://www.minecraft.net/ja-jp/download/)
- [Java **8** JDK](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
- [Forge MDK](https://files.minecraftforge.net/)
- [Eclipse **Luna**](https://www.eclipse.org/luna/)
- [ハリボー ゴールドベア](https://www.amazon.co.jp/dp/B000QUYF50)(ダウンロード時間を優雅に過ごすために**必須**)

Minecraft 1.13から構築方法も大きく変わっているみたいですが、開発環境はJavaのバージョンの関係上、上記のものが必要です！（たぶん）

# #1 作業フォルダを作る

1. Java 8 JDK、Minecraft:Java Edition、Eclipse Lunaをダウンロード&インストールしておきます。
2. Modding用のフォルダを作ります。(ex. ExampleMod)
3. さらにその中に、プロジェクト用のフォルダを作ります。(ex. ExampleMod/examplemod-1.14.4)
4. 最後に作ったフォルダの中に、ダウンロードしたForge MDKのzipファイルを展開します。

こうなっていたら正解

```
ExampleMod
　┗ examplemod-1.14.4
　　　┣ src
　　　┣ gradle
　　　┣ README.txt
　　　┣ LICENSE.txt
　　　┣ gradlew.bat
　　　┣ gradlew
　　　┣ gradle.properties
　　　┣ CREDITS.txt
　　　┣ changelog.txt
　　　┣ build.gradle
　　　┗ .gitignore
```

ポイントは、フォルダを2つ入れ子にしているところです！

# #2 コマンドプロンプトで作業環境を構築

1. コマンドプロンプトを開きます。
2. CDコマンドで、プロジェクト用フォルダまで行きます。
3. `gradlew genEclipseRun`を実行し、完了までハリボーを食べながら数分待つ。
4. `gradlew eclipse`を実行し、完了までハリボーを食べながら数分待つ。

ここまでエラーが出なければコマンドプロンプトでの作業は完了です！

# #3 Eclipseでプロジェクトを開く

> 私はここで1週間悩みました。
> 　　　　　　　　　　―― [どどど素人](https://qiita.com/super_amateur)

1. Eclipse Lunaを開く。
2. 先ほど作った*Modding用フォルダ*をワークスペースに指定する。(ex. ExampleMod)
3. ファイル > 新規 > Javaプロジェクト
4. 「デフォルト・ロケーションを使用」をオフにし、ロケーション欄にプロジェクト用のフォルダのパスを入れます。(ex. ExampleMod/examplemod-1.14.4)
5. ロードが完了した後(もちろんハリボーを食べながら待ちます)、完了を押すと、Eclipsのパッケージ・エクスプローラー内にプロジェクトが表示されます。

これで環境構築はほぼ完了です！

# #4 実行テスト

1. Eclipseの、実行 > 実行構成 を開きます。
2. ウィンドウ左の一覧から、「Java アプリケーション」のツリーを開き、「runClient」を選びます。
3. 実行を押して、しばらく待った後、Minecraftのウィンドウが表示されれば実行成功です！
4. スタート画面からModボタンを押して、ExampleMod(もともとプロジェクトに作られていたサンプルのMod)があることを確認しましょう！

# #5 まとめ

ここが本題なのですが、私が1週間も行き詰まった理由は、**Eclipseの最新版を使っていた**からでした。
Eclipseの最新版だと、Java 12 JDKしか使えないんですよね…
というわけで、環境構築でうまくいかずModdingをあきらめる人が減り、Minecraft:Java Editionの人口がまた増えますように、祈ってまとめを終えます！
(ここで残りのハリボーを食べる。)
Zabbix Server2.2 Dockerコンテナのリソース監視

こちらのサイトを参考に進めています。
 https://dev.classmethod.jp/cloud/zabbix-docker-monitoring/

## 概要
対象のホスト機へ監視用のDockerコンテナを作成し、zabbix_serverで監視することで、その他のDockerコンテナも監視できる。
取得できる値　-> CPU MEM SWAP 死活監視
その他にも未検証ですが、ネットワーク監視用のテンプレートもありました。
https://raw.githubusercontent.com/cavaliercoder/zabbix-module-sockets/master/templates/Template_App_TCP_Sockets_3.2.xml

## 注意
以下手順では、Dockerimageを「zabbix-agent-xxl」ではなく一つ古い「dockbix-agent-xxl-limited」を使用してます。
（dockbix-agent-xxl-limited はCPUの値が取得できず断念...）

### テンプレートの入手 -> インポート
テンプレートURL: https://github.com/monitoringartist/zabbix-docker-monitoring/blob/master/template/Zabbix-Template-App-Docker.xml
リンクのままだと使えないので以下のように編集する
(zabbix2.2ではfilerが使えないようです。ここでだいぶハマりました...)

```
52行目の「filter」をコメントアウト
<!--               <filter>
                        <evaltype>0</evaltype>
                        <formula/>
                        <conditions/
                    </filter>
 -->
```

■zabbix-server へテンプレートをインポート

```
設定 -> テンプレート -> インポート -> ファイルを選択 しインポート
```

##dockerコンテナの作成
docker監視対象へモニタリング用のdockerコンテナを起動させる。
（portは適宜使用していないportを使用。下記では、ホスト機もzabbix-agentを入れているので、10150使用。）
<ZABBIX SERVER IP/DNS NAME> には監視元serverのIPを入力

```
docker pull monitoringartist/dockbix-agent-xxl-limited
docker run \
  --name=dockbix-agent-xxl-limited \
  -h docker-host-1 \
  -p 10150:10050 \
  -v /:/rootfs \
  -e "ZA_Server=<ZABBIX SERVER IP/DNS NAME>" \
  -d monitoringartist/dockbix-agent-xxl-limited:latest
```

### zabbix管理画面で新たにホストの追加
```
- ホスト名はわかりやすいように {$HOSTNAME}_docker_monitoring など
- 設定 -> ホスト -> ホストの作成
ホスト名: example_docker_monitoring
グループ: 適宜
IP: ホストのIP
ポート: 10150
テンプレート: Templates -> Template App Docker - www.monitoringartist.com
しばらくすると値が取得できます。
```
監視サーバーから以下コマンド実行すると値が取得できているかわかります。

```zabbix-server
zabbix_get -s  <監視対象IP> -k docker.discovery -p 10150
```

## 追伸 (トリガーの設定,不具合など)
```
トリガー設定
■5分間値が取得できなかったら (dockbix-agent-xxlが停止したことを想定)
Container {#HCONTAINERID} is not running
条件式: {Template App Docker - www.monitoringartist.com:docker.up[/{#HCONTAINERID}].nodata(5m)}=1

■5回連続でdocker.upが0の値(Exited 状態の場合)
Container {#HCONTAINERID} is not running
条件式: {Template App Docker -www.monitoringartist.com:docker.up[/{#HCONTAINERID}].count(#5,0,"eq")}=5

■dockbix-agent-xxlを一度停止すると起動できなくなるので（謎ですが）
再度作成し直す。

docker stop dockbix-agent-xxl
docker rm dockbix-agent-xxl
docker run \
  --name=dockbix-agent-xxl \
  -h docker-host-1 \
  -p 10150:10050 \
  -v /:/rootfs \
  -e "ZA_Server=<ZABBIX SERVER IP/DNS NAME>" \
  -d monitoringartist/dockbix-agent-xxl-limited:latest
```

## 参考
https://dev.classmethod.jp/cloud/zabbix-docker-monitoring/
https://github.com/anapsix/zabbix-haproxy/issues/1
https://github.com/anapsix/zabbix-haproxy/pull/2
https://hub.docker.com/r/monitoringartist/dockbix-agent-xxl-limited/
フリーワード検索のテストパターン

検索条件がフリーワード形式のときのテストパターンについて、自分の考えを纏めてみました。

##前提の話
フリーワード形式の検索条件がどういうものか、以下で説明します。

###フリーワード形式の検索条件
イメージとしては、検索条件にテキストを入力するフォームがあるようなものです。
値を設定後に検索ボタンを押下すると、入力したテキストに一致する情報が取得されます。
検索したいユーザが、どんな値でも設定可能なところが特徴です。

ただ、このとき注意しないといけないのは、**<font color="Red">一致</font>**に関していくつか手法があることです。
テストを行う前に、テスト対象の検索条件がどの一致の手法なのかを明確にしておく必要があります。
テキストの検索の場合、以下の5種類が存在します。

|手法|内容|例|
|:--|:--|:--|
|部分一致|条件の値が含まれるデータを取得|Bと検索したとき、Bが含まれるデータを取得|
|完全一致|条件の値と完全に一致するデータのみ取得|ABCと検索したとき、ABCのデータのみ取得|
|前方一致|条件の値と前方が一致するデータを取得|ABと検索したとき、ABから始まるデータを取得|
|後方一致|条件の値と後方が一致するデータを取得|BCと検索したとき、BCで終わるデータを取得|
|中間一致|条件の値が中間部分と一致するデータを取得|Bと検索したとき、Bが中間にあるデータを取得<br>※Bが先頭や末尾にある場合は取得しない|

###部分一致
部分一致は、設定した値に関連するデータを全て検索したいときに使用されます。
一般的な検索はだいたい部分一致だと思います。
###完全一致
完全一致は、設定した値のデータのみを検索したいときに使用されます。
検索したいデータが1件のみで、かつIDなどの一意な値を検索したい場合に採用されたりします。
※IDが34のデータを検索したいけど、1～999999までデータがあり、かつID順に表示されない場合（更新日時順）は、手間を省くため完全一致の方がいいかもです。
###前方一致
前方一致は、データの先頭にプレフィックス（カテゴリごとの目印みたいなもの）が付いている場合に採用されたりします。
過去、そういった仕様の検索条件を目にしたことはありますが、あまり見たことはありません。
###後方一致、中間一致
後方一致や中間一致を採用した検索条件は出会ったことがないので、いい例が浮かびませんでした。



##テストパターンについて
自分は、検索条件がフリーワード形式のときは、上記の一致部分をなるべく網羅できるようにパターンを作成しています

###事前準備データ
| |対象項目の設定値|その他（対象に関連の無い項目）|
|:--|:--|:--|
|データA|[未設定]|任意|
|データB|い|〃|
|データC|あい|〃|
|データD|いう|〃|
|データE|あいう|〃|
|データF|え|〃|

###検索結果の確認
**例：部分一致の場合**

| |対象項目の<br>検索条件|その他の<br>検索条件|取得結果|補足|
|:--|:--|:--|:--|:--|
|no.1|[未設定]|[未設定]|A, B, C, D, E, F|条件未設定を確認|
|no.2|い|〃|B, C, D, E|部分一致を確認|
|no.3|あい|〃|C, D|前方一致を確認|
|no.4|いう|〃|D, E|後方一致を確認|
|no.5|あいう|〃|E|完全一致を確認|
|no.6|お|〃|検索結果なし|一致なしを確認|

　
ポイントとして、まずフリーワード検索に限らないところでは
　●検索条件が複数設定できる場合は、対象以外の検索条件は必ず**<font color="Red">未設定</font>**にし、試験対象に影響が出ないようにする。
　　⇒組み合わせのテストは、それぞれの対象1つずつのテストが完了してから行う。
　●事前準備データの設定値が未設定の場合も考慮する。
　●検索条件が未設定の場合や全て不一致となる場合も考慮する。
辺りを思っています。

フリーワード検索に関連するポイントとしては、
　●その検索条件だと、あるデータでは前方に一致しているが、別のデータでは後方で一致している
といったケースや
　●その検索条件だと、前方一致のデータしかない
といったケースを組み合わせているところです。
そうすることで、部分一致のはずが、前方一致になっていたなどが検出できるようにしています。

##最後に
フリーワード検索の場合、検索条件をほぼ無限に設定できるため、全てを確認することは事実上不可能です。
どこまで効率よくパターンを削れるかが大事だと思っています。

検索画面の試験の場合は、個々の検索条件が仕様通り動作しているかを確認した後に、それぞれの条件を組み合わせた検索についても試験を行う必要があると思っています。流れとしては、
　①個々の検索条件が正しく動作する
　②それぞれの検索条件を組み合わせた検索が正しく動作する
だと思っています。
⇒①の試験で個々の条件の担保を取ったうえで、②にて組合せの試験を行うなど

検索条件を組み合わせる場合の試験パターンについては、以下のページに記載しています。
[複数の条件がAND条件/OR条件で繋がれているときのテストパターン](https://qiita.com/yasuhisa_ito/items/ca7ad58abd2b408110f0)
参考になれば幸いです。
iPadOSのブラウザでフォントサイズが変わる

[WEAR](https://wear.jp/)フロントエンドエンジニアのむーさん([@murs313](https://twitter.com/murs313))です！

iPadOSが出て、User Agentやらフォント太り問題やらで騒がれましたが、他にもこっそり変わっていることがありました…。

# フォントサイズが変わってる！
小さい文字が大きくなって、崩れてるボタンがあるじゃないですか！！！

BEFORE & AFTER
<img width="110" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309128/8c9b03a1-156a-3b9d-16c2-e824d2686f06.png"><img width="120" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309128/4c6b9947-e6cc-7d33-b8c0-b69674555d5e.png">
あかんでえ…。

# 対応
bodyに`text-size-adjust: none;`を設定すると解決します。
サポートしたいブラウザ・バージョンに合わせて、必要ならベンダープレフィックスも設定しましょう。
https://developer.mozilla.org/ja/docs/Web/CSS/text-size-adjust

```css
text-size-adjust: none;
-webkit-text-size-adjust: none;
```

小さい文字を大きくしてアクセシビリティを良くしようという考えの元での調整なのだと思うのですが、後述の通り基準が分からず扱うのがむずかしいことと、崩れてる見た目を一旦直すために無効とすることにしました。

# 補足① フォントが大きくなる基準は？
WEARのサイトでは13,14pxより小さい文字が大きくなるようですが、同じ14pxでも変わる箇所と変わらない箇所などがあり、基準は謎…。

BEFORE (フォントサイズが変わる箇所を赤枠で囲っています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309128/e67555d3-811a-3f70-0ddb-b6f6e0c799f6.png)
AFTER
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309128/73880fa2-9530-34c0-cd13-398928b1fd02.png)
どこを大きくするかはAppleの采配なんだろうか…。

# 補足② `text-size-adjust: none;`のバグ
[こちらのブログ](http://tech.nitoyon.com/ja/blog/2013/02/14/text-size-adjust/)にもあるように、`text-size-adjust: none;`を指定するとブラウザで拡大・縮小しても文字サイズが変わらないというChromeのバグがあったようですが、現在は直っています。

> Instead of ignoring the -webkit-text-size-adjust property, a bug prevents desktop Chrome users from zooming in or out. The bug was fixed after Chrome 26.

引用元: https://developer.mozilla.org/ja/docs/Web/CSS/text-size-adjust

# 最後に
サイトを持っている方は、一度Simulatorでチェックしてみることをおすすめします！（最新のXcodeでiPadOSのSimulatorが使えます！）

# スペシャルサンクス
今回のこの現象と対応法を共有してくださったのは、ZOZOTOWNフロントエンドエンジニアのあーさーさんです！（iPadOSのUser Agentの影響調査をしていたところ発見したそう）
あーさーさんと、情報共有ができる会社の風土に多大なる感謝を…！！

風通しの良い風土でWEARの開発をしたい方はJOIN US!!!
https://tech.zozo.com/recruit/mid-career/detail59/
RailsのmigrateをAWS Fargateに移行した時の話

# 前提
- ECSでRailsアプリが起動されていること
- migrateはfargateでやってなかった
- テスト環境でやること

# 作業内容
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs_run_task_fargate.html
これ見ながら作業する。実際は、コマンドでやると何をしているのかよくわからないので、まずはGUIでやる。把握した後にコード化するというのが良い。そうすることで、全てのオプションやらパラメータの世界が見えてくる。

## 念の為、新規DBを作成
t2.microなどで良い
何らかのエラーが出たときの切り分けにしたい。
インスタンスが作れたら、アプリケーションデプロイ用のタスクにDBの環境変数を設定する（Systems Managerが使えるなら ECS containerから `valueFrom` で呼び出せるのでjson自体をgit管理できる。AWSでマネージドされているのが良い。暗号化したいならKMSを利用する）

## taskを定義する

実際は、コマンドなどを付与したりするのでENTRYPOINTで設定している。
これは、Initial,Migrate,Seedそれぞれリビジョンで分けるだけで良い。Initial,Seed,Migrateの順で作る。
※なお、実際の運用ではInitialやらSeedは使わない。これは、今回新規でRDSを立ち上げたので必要になっただけ。LATESTリビジョンだけがあれば良い。

|key|value|
|:--:|:--:|
|ネットワークモード|awsvpc|
|互換性が必要|FARGATE|
|タスクメモリ(GB)|0.5GB|
|タスクCPU(vCPU)|0.25 vCPU|

### containerの環境設定(Initial)

|key|value|
|:--:|:--:|
|エントリポイント|`bundle,exec,rails,db:create`
|作業ディレクトリ|`/app`(アプリがある場所）

```json
  "containerDefinitions": [
    {
      "entryPoint": [
        "bundle",
        "exec",
        "rails",
        "db:create"
      ],
      "workingDirectory": "/app"
    }
  ]
```

### containerの環境設定(Migrate)

|key|value|
|:--:|:--:|
|エントリポイント|`bundle,exec,rails,db:migrate`
|作業ディレクトリ|`/app`(アプリがある場所）

```json
  "containerDefinitions": [
    {
      "entryPoint": [
        "bundle",
        "exec",
        "rails",
        "db:migrate"
      ],
      "workingDirectory": "/app"
    }
  ]
```

### containerの環境設定(Seed)

|key|value|
|:--:|:--:|
|エントリポイント|`bundle,exec,rails,db:seed,a=b`
|作業ディレクトリ|`/app`(アプリがある場所）

```json
  "containerDefinitions": [
    {
      "entryPoint": [
        "bundle",
        "exec",
        "rails",
        "db:seed",
        "a=b"
      ],
      "workingDirectory": "/app"
    }
  ]
```

## taskを実行する
- VPCを設定、subnetを設定
- ネットに繋がるものを設定しておく

### ２つエラーが発生した
- メモリ不足エラー　→　メトリクスをチェックして、スペックの問題ならスペックを上げる
  - コンテナインスタンスのリソースから、メモリ使用量を見る
- ECRからイメージをpullしてこれず、エラー　→　インターネットにつながるネットワークを設定する

## 結果を見る
- PROVISIONING→PENDING→RUNNING→STOPのようなフローだったような気がする
- タスクのStoppedの中でログを確認する。
- Migrateタスクならば、以下のようなログが吐かれているだろう。

```
2019-10-09 18:16:45D, [2019-10-09T09:16:45.290941 #1] DEBUG -- : [1m[35m (572.8ms)[0m [1m[35mCREATE DATABASE "test_database" ENCODING = 'unicode'[0m
2019-10-09 18:16:45Created database 'test_database'
```

- 実際にアプリケーション側でも確認する。
- 問題がなければCodeDeployやCIなどで連携する。
imeファイル – 入力しづらい丸英数字のメモ

入力しづらい丸英数字のメモ - Qiita https://qiita.com/yoh-nak/items/fcea0b5ba51a6dd762ef
からimeテキストファイル作成。

~~imeファイル – 入力しづらい丸英数字のメモ – tknr.com https://tknr.com/p/253/~~

# 20210527

githubに移行。

google_ime_dictionary/丸英数字.txt at main · tknr/google_ime_dictionary https://github.com/tknr/google_ime_dictionary/blob/main/%E4%B8%B8%E8%8B%B1%E6%95%B0%E5%AD%97.txt
【備忘録】it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods【sklearn】

#概要 

sklearnを使ってる時、下記のようにBagging等のアンサンブルをしてる時に

```{python}
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
import numpy as np

#X 何かのデータ
#Y 何かのラベル
Train_X,Test_X,Train_Y,Test_Y=train_test_split(X,Y,train_size=0.8,shuffle=True)

B_dtree_clf = BaggingClassifier(base_estimator=DecisionTreeClassifier,n_jobs=12)
B_dtree_clf.fit(Train_X,Train_Y)

```
これを実行すると
```it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods```

が出るときがある。どういうこと？って思うが、単純な話だった。以下のコードが正解

```{python}
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
import numpy as np

#X 何かのデータ
#Y 何かのラベル
Train_X,Test_X,Train_Y,Test_Y=train_test_split(X,Y,train_size=0.8,shuffle=True)

B_dtree_clf = BaggingClassifier(base_estimator=DecisionTreeClassifier(),n_jobs=12)
B_dtree_clf.fit(Train_X,Train_Y)

```

間違い探しです。どこが違うでしょうか。

...答えは()が足りなかっただけです。本当にありがとうございました(

#元々どういうエラー？

TensorFlowとかで作ったモデルをアンサンブルしたい時とかに、必要な機能が足りてないという意味のエラーっぽい
自作モデルをSklearnでアンサンブルする作り方は[こちらのブログ](http://yamaguchiyuto.hatenablog.com/entry/python-advent-calendar-2014)を参考にどうぞ。
（自分も記事書くかも）
【Python】20行で作る「数当てゲーム」

# はじめに

こちらは、CUI操作のPythonで簡単に20行のコードで作れる「数当てゲーム」の記事になります。
よろしくお願いします。

# 環境

- Windows 10 home
- Python 3.7.3


# ルール

このゲームはプログラムが始まると1~5まで数字の中からランダムに、1つ目と2つ目の数字が決まるので、それぞれの数字がなんなのかを当てていくゲームになります。
片方正解すると、`どちらかは合ってます！`とヒントを出してくれるので、試行錯誤しながら、答えの数字を見つけていきましょう。

# プログラム

```数当てゲーム.py
import random as rd

questionNumber = []
for i in range(2):
	questionNumber.append(rd.randint(1,5))

print("数当てゲームになります。\n二つの数字を当ててください。\n")
num1 = input("1つ目の数字を入力してください:")
num2 = input("2つ目の数字を入力してください:")

while questionNumber[0] != int(num1) or questionNumber[1] != int(num2):
	if questionNumber[0] == int(num1) or questionNumber[1] == int(num2):
		print("どちらかは合ってます！")
	else:
		print("間違い！ もう一度入力してください。\n")

	num1 = input("1つ目の数字を入力してください:")
	num2 = input("2つ目の数字を入力してください:")

print("正解です！終了！")
```

ぜひ、いろいろアレンジしてみてください！
ここまで読んでいただき、ありがとうございました。
Vue.js + moment.jsでカレンダーと連動する前日翌日ボタンをつくる

間違えや、もっと良い方法があれば教えていただけますと幸いです

(久々に確認したところバージョンが変わってcodepenのカレンダーが非表示になってました...)

#必要なもの
・vue.js
・V-Calendar(カレンダーライブラリ)
・moment.js

#動作

※倍率を0.5にして確認して下さい

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="natsume0718" data-slug-hash="PooqKja" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Vue 連動するカレンダーと前日翌日ボタン">
  <span>See the Pen <a href="https://codepen.io/natsume0718/pen/PooqKja">
  Vue 連動するカレンダーと前日翌日ボタン</a> by natusme (<a href="https://codepen.io/natsume0718">@natsume0718</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#解説

流れとしては

１．カレンダーがDateじゃないとダメなのでdataはDateで作成
２．filterでmoment.js を用いて表示形式を変える
３．前日翌日ボタンにclickイベント設定し、dateに±1する

##１．カレンダーがDateじゃないとダメなのでdataはDateで作成

```HTML:HTML
<v-date-picker class="mx-2" v-model="date" :popover="{ placement: 'bottom', visibility: 'click' }">
    <button variant="outline-primary">カレンダー</button>
</v-date-picker>

```

```js:JS

data: {
    date: new Date()
}

```

`V-Calendar`はDate型だと双方向バインディングできるのでDate型で作成

##２．filterでmoment.js を用いて表示形式を変える
次に日付の表示部分

```HTML:HTML
{{date | moment}}
```

```js:JS
 filters: {
    moment: function(date) {
      return moment(date).format("YYYY-MM-DD");
    }
  }
```

`YYYY-MM-DD`の形式にフォーマットしているだけ

##３．前日翌日ボタンにclickイベント設定し、dateに±1する

```HTML:HTML
  <button v-on:click="subDay">前日</button> {{date | moment}}
  <button v-on:click="addDay">翌日</button>
```

```js:JS

methods: {
    addDay: function() {
      const next = this.date.getDate() + 1;
      const tmp = new Date(this.date);
      tmp.setDate(next);
      this.$set(this, "date", tmp);
    },
    subDay: function() {
      const prev = this.date.getDate() - 1;
      const tmp = new Date(this.date);
      tmp.setDate(prev);
      this.$set(this, "date", tmp);
    }
  },

```

まず、翌日、前日を取得します。(数値が得られる)
現在のdateから一時用Date変数を作成
作成した一時用変数に翌日または、前日をセット
それをdataプロパティのdateにセット

の流れです

#参考にさせていただいた記事
https://ti-tomo-knowledge.hatenablog.com/entry/2018/07/09/163051

https://blog.photosynthesic.jp/2018/10/vue-js%E3%81%A8%E3%81%AA%E3%81%8B%E3%82%88%E3%81%8F%E3%81%AA%E3%82%8D%E3%81%86%EF%BC%9A%E6%97%A5%E6%9C%AC%E6%99%82%E9%96%93%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%ABfilter%E3%82%92%E4%BD%BF%E3%81%A3/

#追記
年月日表記にしたい場合ローカライズの指定をします

```js:JS
 filters: {
    moment: function(date) {
      moment.locale('ja');
      return moment(date).format("LL");
    }
  }
```
PowerShellの文字コードを変更する

# PowerShell上での文字コード
- PowerShellのコマンド出力をテキストに渡したりする際やコンソールでの表示にて、文字コードが異なるため文字化けする場合があった。
- 出力先で文字コードを変更すれば問題ないけれど、PowerShell側で変更できるようにしておくと便利かなと。

# 文字コードの変更手順
PowerShellのデフォルト文字コードが「US-ASCII」みたいなので、コマンド実行前に「シフトJIS」へ変更し、コマンド実行完了後に「US-ASCII」へ戻すようにする。

## 文字コード確認
現在の文字コードを確認する。

```
> $OutputEncoding.EncodingName
US-ASCII
```

## 文字コード変更(シフトJIS)
「シフトJIS」へ変更する。

```
> $OutputEncoding = [console]::OutputEncoding;
> $OutputEncoding.EncodingName
日本語 (シフト JIS)
```

## 文字コードを戻す(US-ASCII)
「US-ASCII(元の文字コード)」へ変更する。

```
> $OutputEncoding = New-Object System.Text.ASCIIEncoding;
> $OutputEncoding.EncodingName
US-ASCII
```
Ryzen上でwindows hypervisor platform(WHPX)が有効化されてるにも関わらずandroid emulatorが立ち上がらない

#結論
Windows 10(home)のバージョンを1809から1903にすると通りました。
当時の記事では

>"「Android Emulator」がAMD製CPUをサポート、「Hyper-V」での利用も可能に"
>OS：Windows 10 April 2018 Update（［Windows の機能の有効化または無効化］ダイアログで［Windows ハイパーバイザー プラットフォーム］オプションを有効化・再起動する必要がある。***Windows 10 Homeでは利用不可***）

とのことなのでなにか仕様変更でもあったのかもしれません。~~時間返せ~~

##引用元
「Android Emulator」がAMD製CPUをサポート、「Hyper-V」での利用も可能 
  https://forest.watch.impress.co.jp/docs/news/1132197.html
[Django] restframeworkのserializerの書き下しをサボる

restframeworkを使ってシンプルなCRUDをするサーバーを建てるとき、単純にDBと一対一対応するシリアライザはこのようにすればいちいち書き下さなくて済む。

```python

from django.db import models
from rest_framework import serializers

from my_app.models import Company # 開発するアプリで使うモデル

def _create_vanilla_serializer(
        table_cls: Type[models.Model]) -> Type[serializers.ModelSerializer]:

    def _list_field_names(table_cls):
        return tuple(map(lambda f: f.name, table_cls._meta.fields))

    class VanillaSerializer(serializers.ModelSerializer):
        class Meta:
            model = table_cls
            fields = _list_field_names(table_cls)

    return VanillaSerializer

CompanySerializer = _create_vanilla_serializer(Company)
```
オンプレミス環境の仮想ハードディスクをより便利にアップロード！　Azure managed disksの新機能紹介

# はじめに
この記事はマイクロソフトの["Introducing the preview of direct-upload to Azure managed disks"](https://azure.microsoft.com/en-us/blog/introducing-the-preview-of-direct-upload-to-azure-managed-disks/)の要約記事です。
先日、Azure managed disksの直接アップロード機能のプレビュー版が発表されました。
この記事では、「そもそもAzure managed disksとは」といったところから今回の発表のポイントまで紹介していきます。
始めに今回の発表のハイライトを紹介し、Azure managed disksの基礎的な内容や発表の詳細について述べていきます。

# 今回の発表のハイライト
仮想ハードディスクであるAzure managed diskに直接アップロード機能が追加されたことで、オンプレミス環境の仮想ハードディスクをより便利にアップロードできるようになりました。

# そもそもAzure managed disksとは
Azure managed diskとは仮想ハードディスクです。
ハードディスクと聞くと、オンプレミスの物理的なディスクを想像しがちですが、Azure managed diskは仮想的なものです。
その実態はAzure内でランダムIOストレージであるページblobとして保存されています。
また、Azure managed diskの"managed"は、「管理者の操作がディスクをプロビジョニングするだけ」で、それ以外の処理はすべてAzureが行ってくれることを意味しています。

# 今回発表された内容
今回発表された新しい機能はAzure managed disksの直接アップロード機能です。
今まで、オンプレミス環境の仮想ハードディスクをmanaged disksとしてAzureにもっていくには以下の２つの方法しかありませんでした。

1. managed disksに変換する前にストレージアカウントへ仮想ハードディスクをステージングする
2. 空のmanaged disksをVMへアタッチし、その後内容をコピーする

しかし、どちらの方法も欠点がありました。
１つ目の手法はmanaged disksを管理するために余分なストレージを必要とし、２つ目の手法はVMを余計に稼働させるためコストが余分にかかるということです。

今回発表された直接アップロード機能はこれら両方の問題に対応することができます。
具体的にはオンプレミスの仮想ハードディスクをmanaged diskとして、直接コピーできるようにすることでワークフローを簡素化しています。
この直接アップロード機能はサポートされているすべてのサイズのStandard HDD・Standard SSD・Premium SSDで利用することができます。

また、特にAzureのIaaS仮想マシンのバックアップソリューションを提供する独立系ソフトウェアベンダー(ISV)の方々は、この直接アップロード機能を活用し、顧客のバックアップをmanaged diskに復元することがおすすめです。
それによって、ストレージアカウント管理から脱却し、復元プロセスを簡素化することができます。
また、大規模なmanaged diskに対するAzure Backupサポートは直接アップロード機能によって、さらに強化されています。

また、生産性の向上のためにAzure Storage Explorerはmanaged disksのサポートもしています。
具体的にはGUIで数回クリックするだけで、ローカルの仮想ハードディスクをmanaged disksに直接アップロード機能で移行することができます。
また、直接アップロード機能を用いて、managed disksを別のAzureリージョンにシームレスにコピーや移動することができます。
このクロスリージョンコピーはAzCopy v10でも強化されています。

以下では[記事](https://azure.microsoft.com/en-us/blog/introducing-the-preview-of-direct-upload-to-azure-managed-disks/)で紹介されていたAzure CLIでの方法について紹介します。

## Azure CLIでの操作
まず、空のmanaged disksを作成していきます。
作成するときは以下のことに注意して作成します。

-  createOptionプロパティ：Upload 
-  uploadSizeBytesプロパティ：仮想ハードディスクの正確なサイズに合わせる

例えば、以下のようなコマンドになります。

```
az disk create \
-n mydiskname \
-g resourcegroupname \
-l westus2 \
--for-upload \
--upload-size-bytes 10737418752 \
--sku standard_lrs
```

以下のコマンドで、ディスクの書き込み可能なSASを生成します。
それによって、アップロード先としてSASを参照することができます。

```
az disk grant-access \
-n mydiskname \
-g resourcegroupname \
--access-level Write \
--duration-in-seconds 86400
```

以下のAzCopy v10を用いたコマンドを実行し、作成したSAS URIを指定してローカルの仮想ハードディスクを空のmanaged diskにアップロードします。

```
AzCopy copy "c:\somewhere\mydisk.vhd" "SAS-URI" --blob-type PageBlob
```

アップロードが完了したら、以下のコマンドでSASを無効化します。
SASを無効化すると、managed diskの状態が変化し、VMにmanaged diskを接続できるようになります。

```
az disk revoke-access -n mydiskname -g resourcegroupname
```

# おわりに
以下の機能はすべてのリージョンでサポートされているそうです。

-  Azure Compute Rest API version 2019-03-01
-  Azure CLIの最新版
-  Azure PowerShell SDK
-  Azure .Net SDK
-  AzCopy v10
-  Azure Storage Explorer 

詳細な利用方法などはこちらの[Azure managed disksのドキュメント](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/managed-disks-overview)を参照してください。