OmniAICreator/Qiita-1.07M huggingface dataset:
PsychoPyのモニターセンター

PsychoPyではモニター（ディスプレイ）の設定を複数保持しておき、実験に応じて使い分けることができます。
特に、刺激のサイズなどをdeg（視角　度）で指定している場合には、モニターセンターでの設定が必須になります。

#モニターセンター
以下のアイコンをクリックするとモニターセンターが開きます。
<img width="445" alt="スクリーンショット 2019-09-20 11.29.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/72becaf6-ca40-4365-402f-b76ad2051486.png">

「新規」をクリックして新しく設定を作りましょう。
<img width="1052" alt="スクリーンショット 2019-09-20 11.42.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/c2303bd7-89e3-3afc-d516-82bb489540fc.png">

スクリーンの観察距離、解像度、スクリーンの横幅に適切な値を入力します。

観察距離の初期の値が57cmになっているのは、この距離では、1cmが約1degになり計算しやすいためです。

解像度は、OSのディスプレイ設定で確認します。方法が分からないときは、[ディスプレイ解像度の確認と変更 - Web便利ノート](https://note.cman.jp/monitor/dpi/)を参照してください。最近のMac OSの解像度の確認が特に分かりにくくなっているのですが、下の図を参照してください。

<img width="780" alt="スクリーンショット 2019-09-20 11.52.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/dd953776-5725-54b4-1a54-9469d2dfd270.png">

スクリーンの横幅は、定規やメジャーなどで横方向の長さを測ります。モニター本体の横幅ではなく、**スクリーン**の横幅であることに注意してください。つまりパソコンの画面が表示されないモニターの枠のような部分は含めないという意味です。

モニターの設定を新規に作成したら「保存」します。下の図では、新たに「test2」という名前の設定が加わっています。

<img width="1052" alt="スクリーンショット 2019-09-20 12.11.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/6f51d689-4df0-ac71-1b1e-12cf149a87f6.png">

#実験に反映させる
以上でモニターの設定ができましたが、このままではこの設定が実験に反映されません。実験の設定を開きます。

<img width="400" alt="スクリーンショット 2019-09-20 12.12.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/e8eb9191-3abd-7cdd-a1e5-211a9880763b.png">

スクリーンのモニターで「test2」を指定します。こうすることで初めて、意図したサイズで刺激が呈示されるようになります。

<img width="605" alt="スクリーンショット 2019-09-20 12.10.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/2556a187-c984-0d0c-e212-2dbbd584263f.png">

もしCoderで実験プログラムを作成している場合には、`win = visual.Window`のなかで、`monitor='test2'`のように指定します。 

#必ず実測
すべての設定を終えたあと、例えばPolygonを使って、幅と高さが3degの正方形を呈示してみます。その正方形の長さを測って、本当に3degになっているかを確認するよう心がけてください。もし観察距離が57cmであれば、3degは約3cmになります。

興味のあるかたは[ガンマ補正](https://qiita.com/kurokida/items/87567d5c21318c8200cf)についての記事もご覧ください。
AWS SDK for PHP で ~/.aws/config に書かれた profile を使うときの注意点

## TL:DR
- `~/.aws/config`に書かれた`profile`を使う場合は、`AWS_SDK_LOAD_NONDEFAULT_CONFIG`を設定しなければいけない
- ただし、`aws/aws-sdk-php`が`v3.102.0`以降の話
- 詳しくは「[AWS 認証情報ファイルと認証情報プロファイルの使用 - AWS SDK for PHP](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/guide_credentials_profiles.html)」参照のこと

## 詳細
以下のように、`AWS`の認証設定がしてあるとします。

```~/.aws/config
[profile project1]
role_arn = arn:aws:iam::123456789012:role/testing
source_profile = default
role_session_name = OPTIONAL_SESSION_NAME
```

```~/.aws/credentials
[project2]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY
```

で、`AWS SDK for PHP`を使ったプログラムを実行すると、以下のコードあたりでエラーになります。

```vendor/aws/aws-sdk-php/src/AwsClientTrait.php

    public function execute(CommandInterface $command)
    {
        return $this->executeAsync($command)->wait();
    }
```

私の場合は、`PHPUnit`で動作確認していたのですが、コンソールに出力されるメッセージが、接続に失敗したことだけわかるような感じだったので、この解決策にたどり着くのに相当時間がかかってしまいました。

```bash
$ AWS_PROFILE=project1 vendor/bin/phpunit

1) App\Tests\ExampleTest::testMethod
GuzzleHttp\Exception\ConnectException: cURL error 28:  (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
```

ちなみに、私は前述のドキュメントではなく、下記のソースコードから`AWS_SDK_LOAD_NONDEFAULT_CONFIG`が必要なことを知りました。

```vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php
    private static function loadProfiles($filename)
    {
        $profileData = \Aws\parse_ini_file($filename, true, INI_SCANNER_RAW);

        // If loading .aws/credentials, also load .aws/config when AWS_SDK_LOAD_NONDEFAULT_CONFIG is set
        if ($filename === self::getHomeDir() . '/.aws/credentials'
            && getenv('AWS_SDK_LOAD_NONDEFAULT_CONFIG')
        ) {
            $configFilename = self::getHomeDir() . '/.aws/config';
            $configProfileData = \Aws\parse_ini_file($configFilename, true, INI_SCANNER_RAW);
            foreach ($configProfileData as $name => $profile) {
                // standardize config profile names
                $name = str_replace('profile ', '', $name);
                if (!isset($profileData[$name])) {
                    $profileData[$name] = $profile;
                }
            }
        }

        return $profileData;
    }
```

```bash
$ AWS_PROFILE=project1 AWS_SDK_LOAD_NONDEFAULT_CONFIG=1 vendor/bin/phpunit
PHPUnit 7.5.16 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.2.19
Configuration: /path/to/app/phpunit.xml

...                                                                 3 / 3 (100%)

Time: 4.01 seconds, Memory: 18.00 MB

OK (3 tests, 3 assertions)
```

## 補足
冒頭にも書きましたが、この記事は、`aws/aws-sdk-php`が`v3.102.0`以降の話です。
それ以前は、前述の`CredentialProvider::loadProfiles`関数ごと存在しないです。

- [Release Version 3.102.0 · aws/aws-sdk-php](https://github.com/aws/aws-sdk-php/releases/tag/3.102.0)
- [assume role using profile(s) in ~/.aws/config by srchase · Pull Request #1824 · aws/aws-sdk-php](https://github.com/aws/aws-sdk-php/pull/1824)
MacからSSH接続した時にlocaleが変更されてしまう問題

CentOS7にて正しくlocale設定している（はず）なのに、想定通りにlocale設定されなかった。
いろいろ調べたところ、クライアント側（Mac）の環境変数がSSH接続の際に引き継がれているのが原因と分かったため、備忘録としてメモ

#何が問題だったか
サーバにSSH接続した後、locale設定が想定通りになっていなかった

```
初めのlocale設定を確認
$ localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
       X11 Model: pc105

キーボードをjp109に変更
$ localectl list-keymaps | grep jp
jp
jp-OADG109A
jp-dvorak
jp-kana86
jp106
$ sudo localectl set-keymap jp-OADG109A
$ localectl 
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp-OADG109A
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

サーバ再起動後、再度SSHログインしてみると、↓の通り、LANG=ja_JP.UTF-8のままになっていた。

```
$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

しかし、`localectl`コマンドで確認すると、LANG=en_US.UTF-8に設定できている（？）

```
$ localectl 
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp-OADG109A
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

#原因と解決策

調べたところ、MacやLinuxからSSH接続を行うと、接続元のクライアントに設定されている環境変数が接続先に引き継がれる場合があるとのこと。
これにはクライアント側、接続先側の両方の設定が関係するが、今回はクライアント側（MAC）の設定変更により解決した。
`ssh_config`ファイルの「SendEnv」というパラメータで、「LANG」や「LC_〇〇」関連の設定が接続先に送信されていたため、ここをコメントアウトする。（↓の最下行）

```
$ tail /etc/ssh/ssh_config 
#   EscapeChar ~
#   Tunnel no
#   TunnelDevice any:any
#   PermitLocalCommand no
#   VisualHostKey no
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h

Host *
	SendEnv LANG LC_*
```

すると、再度SSH接続した時にlocale設定が変わっているのが確認できた。

```
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
```

#参考
[ユーザのロケール設定方法]
(https://www.server-memo.net/centos-settings/system/user-locale.html)

[【 localectl 】コマンド――ロケール設定の確認と変更]
(https://www.atmarkit.co.jp/ait/articles/1811/30/news060.html)
Flask-SocketIOで`No 'Access-Control-Arrow-Origin'`になる

Flask + Flask-SocketIOの構成で、
socket-ioの通信が `No 'Access-Control-Arrow-Origin'` となった。

「Flask CORS」とかでググって出てくる`Flask-CORS`を使った方法では解決できずハマった。

## 環境
- Python 3.7.4
- Flask 1.1.1
- Flask-SocketIO 4.2.1


## 解決
最終的に下記のコードで解決した。

```
from flask import Flask, render_template, request, redirect, url_for, session, make_response
from flask_socketio import SocketIO, emit, join_room, leave_room, close_room, rooms, disconnect

app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")

...

socketio.run(app, host="0.0.0.0", port=8000)
```

SocketIOサーバーオブジェクトを立ち上げる時の引数で `cors_allowed_origins` を指定できる

##参考
https://stackoverflow.com/questions/50632723/flask-socketio-failed-to-set-access-control-allow-origin-response-header
GoogleColabでネットワーク図を出力する

# Last updated : 2019-09-20 

今日現在はこれでうごいた

```python
# version check
import tensorflow as tf; print(tf.__version__)

# modeling
import tensorflow as tf
from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential([
        Dense(512, input_shape=(784,)),
        Activation('sigmoid'),
        Dense(10),
        Activation('softmax')
        ])

# figure
from keras.utils import plot_model
# from keras.utils.vis_utils import plot_model

plot_model(model, to_file='model.png')
```
Cool UI - CSSアニメーションボタン 002

## Cool UI - CSS Animation Button 002

<p class="codepen" data-height="358" data-theme-id="dark" data-default-tab="html,result" data-user="loki__codepen" data-slug-hash="GRKwMBZ" style="height: 358px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Cool UI - CSS Animation Button 002">
  <span>See the Pen <a href="https://codepen.io/loki__codepen/pen/GRKwMBZ/">
  Cool UI - CSS Animation Button 002</a> by Loki (<a href="https://codepen.io/loki__codepen">@loki__codepen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

暇だったので以下のサイトのボタンを再現しました。

> CRAZY
> https://www.crazy.co.jp/

スクロールでの出現は、Waypointsで対応しています。

> Waypoints
> http://imakewebthings.com/waypoints/

---
Twitterのフォロワーを募集しております！
すでにWeb業界にいらっしゃる方や、業界未経験の方、どんな方でも募集しておりますので、どうぞよろしくお願いいたします(\*^^\*)

Twitter - https://twitter.com/hiroki_web
PHPでネストした連想配列を <input type="hidden"> の配列に組み立てる

# 概要

元ネタ↓
[php: generate html hidden input elements from a php array](https://gist.github.com/anjan011/a9789eb7ecb59e1c0f02#gistcomment-3032897)

### Input

```php
$data = [
    'transaction_id' => '123',
    'items' => [
        ['id' => '1', 'name' => 'cat'],
        ['id' => '2', 'name' => 'dog'],
    ],
];
```

### Output

```html
<input type="hidden" name="transaction_id" value="123">
<input type="hidden" name="items[0][id]" value="1">
<input type="hidden" name="items[0][name]" value="cat">
<input type="hidden" name="items[1][id]" value="2">
<input type="hidden" name="items[1][name]" value="dog">
```

# 実装

まじめに実装するとだるいので `http_build_query` 関数にキーの組み立て処理はすべて任せちゃいます。配列で出力されるので `foreach` で回してテンプレート内でよしなにどうぞ。

### Pure PHP 向け

```php
<?php

function buildHiddenInputs(array $data): array
{
    $pairs = explode('&', http_build_query($data, '', '&'));

    $inputs = [];
    foreach ($pairs as $pair) {
        [$key, $value] = explode('=', $pair);

        $inputs[] = sprintf(
            '<input type="hidden" name="%s" value="%s">',
            htmlspecialchars(urldecode($key), ENT_QUOTES, 'UTF-8'),
            htmlspecialchars(urldecode($value), ENT_QUOTES, 'UTF-8')
        );
    }

    return $inputs;
}
```

### Laravel 向け

```php
<?php

use Illuminate\Support\HtmlString;

function buildHiddenInputs(array $data): array
{
    $pairs = explode('&', http_build_query($data, '', '&'));

    $inputs = [];
    foreach ($pairs as $pair) {
        [$key, $value] = explode('=', $pair);

        $inputs[] = new HtmlString(sprintf(
            '<input type="hidden" name="%s" value="%s">',
            e(urldecode($key)),
            e(urldecode($value))
        ));
    }

    return $inputs;
}
```
コンストラクタ, getter/setter の 自動生成

`private String name;
private int price;
private String color;`
対象のフィールドを右クリック → ソース → フィールドを使ってコンストラクタを生成
(ソースまでは、Alt + Shift + S で、ソースのクイックメニューから開くこともできる。)

#####// 参考サイト
* java – コンストラクタで単純な代入を生成するためのEclipseのショートカット 
https://codeday.me/jp/qa/20190219/303482.html
ベストアンサー
* 覚えないと仕事にならないeclipse ショートカットキー(Windows)
https://qiita.com/toshi0383/items/1d2a990392998789062c
getter/setter の生成
Rでテキストマイニングの際にstringrで前処理後RMeCab(RMeCabC,DocDF)かけると文字化けする件

#はじめに
Windowsを使い、RMeCabでテキスト解析を行う際に前処理はエディタで行っていたけれど、どうせならR上で前処理をということで、stringrで前処理をやってみたけれどうまくいかない。
よく見ると文字化けしているようでした。

#環境
Windows10 64bit 言語：日本語
R 3.6.1 64bit
RStudio 1.2.1335
MeCab 0.996-32bit
RMeCab　1.04

#状況確認
##文字列置換し、RMeCabで形態素解析
stringrのstr_replace_all関数で
「今日は焼肉食べに行こう。」の「焼肉」を「寿司」に置換し後
RMeCabCで形態素解析してみます。

コードは以下の通りです

```
> library(dplyr)
> library(stringr)
> library(RMeCab)
>         
> text<-"今晩は焼肉食べに行こう。"
> text1<-text %>% str_replace_all("焼肉","寿司")
> RMeCabC(text1) %>% unlist
        名詞         名詞         名詞         名詞         名詞         名詞         名詞         名詞 
        "莉"       "頑勦"         "縺"          "ｯ"         "蟇"          "ｿ"         "蜿"          "ｸ" 
        名詞         名詞         名詞         名詞         名詞         名詞         名詞         名詞 
      "鬟溘"         "∋"         "縺"          "ｫ"         "陦"         "後"         "％"         "縺" 
        記号 
"<86>縲<82>" 
```
文字化けしているようです。
念のため形態素解析をかけてないtext1を表示。

```
> text1
[1] "今晩は寿司食べに行こう。"
```

こちらは大丈夫。

str_replace_allで置換する前のtextを形態素解析すると、

```
> RMeCabC(text) %>% unlist
  名詞   助詞   名詞   動詞   助詞   動詞 助動詞   記号 
"今晩"   "は" "焼肉" "食べ"   "に" "行こ"   "う"   "。" 
````

text,textのエンコードをEncoding関数で調べてみましょう。

```
> Encoding(text1)
[1] "UTF-8"
> Encoding(text)
[1] "unknown"
```

なんと変換後のtext1はUTF-8となるではないですか。
#解決方法
理由が分かったところで、落ち着いてiconv関数でUTF-8からWindow標準のCP932に変換し、
RMeCabCで形態素解析したところうまくいきました。

```
> text2<-text1 %>% iconv(from="UTF-8",to="CP932")
> Encoding(text2)
[1] "unknown"
> RMeCabC(text2) %>% unlist
  名詞   助詞   名詞   動詞   助詞   動詞 助動詞   記号 
"今晩"   "は" "寿司" "食べ"   "に" "行こ"   "う"   "。" 
> 
```

docDFでも同じ方法で文字化け問題を解決できました。
iconv関数はベクトルも引数にとれるので、データフレームの1列を取り出しベクトルを引数にとって
処理可能です。Rのありがたき仕様。
テストコードは誤検知が発生しにくい書き方を選ぼう

今現在RSpecの学習のために『Everyday Rails - RSpecによるRailsテスト入門』を読んでいるところなのですが、3章でわからない記述が出てきたので個人的に調べてみて理解した内容をまとめます。RSpec初学者向けの小粒な記事になります。

次のコードは、3章の「バリデーションをテストする」という見出しの最初に示されている実例です。Userモデルの存在性のバリデーションがうまく働いているかどうかをテストするexampleになります。

````ruby
# 名がなければ無効な状態であること
it "is invalid without a first name" do
  user = User.new(first_name: nil)
  user.valid?
  expect(user.errors[:first_name]).to include("can't be blank")
end
````

このブロックの最後の2行についてなんですが、私が初めに見たときは
**単に無効であることを調べるだけなら`expect(user.valid?).to eq false`の1行で済む話じゃないの？なんでわざわざ「エラー文を生成→その内容を確認」なんていう書き方をするんだろうか**
と、疑問に思ってしまったのでした（私だけでしょうか？）

しかし調べてみるとこれにはちゃんとした理由があるようです。

というのも、先程の2行を`expect(user.valid?).to eq false`という1行にしてしまった場合、

仮にテストがパスした（user.valid?がfalseを返した）としても、**本当に存在性のバリデーションに引っかかったのかどうかが分からない**（別のバリデーションが原因で無効になった可能性が生じてしまう）といった問題が出てくるのです。

一方で、元の記述であれば生成したインスタンスが無効であることを調べると同時に、**無効になった原因まで特定することができる**ようになります。

````ruby
user.valid? #エラー文を生成する
expect(user.errors[:first_name]).to include("can't be blank") # エラー文が存在性の検証に関するものであることを調べる
````

このように、**テストの誤検知**を防ぐためにも「今書こうとしているテストの目的は何か？」というところを、より突き詰めた書き方を意識していかないといけないようです。
【Docker初心者】localhostに繋がらなくなった時

#はじめに
Dockerでアプリ開発中の初心者向けの記事になります。
いつも通りlocalhostサーバーを走らせアクセスしようとしたところ`サーバに接続できません`との表示が。その時の対処法になります。
#試したこと
`docker-compose.yml`ファイル内に`command: bundle exec rails s -p 3000 -b '0.0.0.0'`確認。
ターミナルにて`docker-compose build`、`docker-compose up`コマンド実行後に`docker exec -it コンテナID /bin/bash`でコンテナ内に入ろうとしてみるも、

```
Error response from daemon: Container コンテナID is not running
```
このコンテナが動いていないとエラー。
こういう時はlog確認、ということで`docker logs コンテナID`コマンド実行

```
A server is already running. Check /myapp/tmp/pids/server.pid.
=> Booting Puma
=> Rails 5.2.3 application starting in development 
=> Run `rails server -h` for more startup options
Exiting
```
今度はサーバーはすでに動いているとのメッセージが。
上記メッセージにある`/myapp/tmp/pids/server.pid`の中身を確認、すると

```server.pid
1
```
ポツンと数字の1発見、これを削除し再び`docker-compose up`コマンドで正常にlocalhost復旧しました。
#結論
本来`docker-compose up`コマンド実行でサーバーが走っている時は中身に`1`が入っている`server.pid`が作られ、`docker-compose down`時には自動で削除されますが、自分の場合はどこかのタイミングで誤ってサーバーを`Ctrl-c`で閉じてしまったらしく`server.pid`が正常に削除されなかったことがlocalhostに接続できないエラーに繋がってしまったようです。
非常に単純な原因でしたが、このあたりの情報があまり多くなくエラー解決に結構な時間が掛かってしまいました。
この記事が少しでも誰かの役にたてば幸いです。
VSCodeでREADME.mdに絵文字を使うと開くときに文字化けするので毎回イライラしてたけど、設定を見直せば大丈夫だった件

# vscodeでマークダウンの中に絵文字を使いたかった

自分用のgitコメントの絵文字プレフィックスを整理したこともあり、README.mdに書いておきたかったので、README.md（マークダウンファイル）に絵文字を入れていた。。

もともと、コメントのプレフィックスを使うのにREADME.mdに書いてた。文字プレフィックスだったので問題にならなかった。
今回、絵文字プレフィックス使ってみようかな、って思って、1,2個のリポジトリで使ってみてたときにこの問題が起こった。

絵文字を入れると毎回文字化け（エンコードが変わる）ので、毎回右下のエンコードを押して「エンコード付きで再度開く」をしてたけど、面倒になったので、一時期は絵文字を削除してコミットしてみたりしてた。
でも、自分用のプレフィックスを整理してみたし、せっかくなので絵文字を入れておきたいと思ったのでちゃんと設定を調べてみた。
（とかって大層にまえがきを書くほどのことは書いてないのであしからず_(:3」∠) _



## 困った件

絵文字を使うと勝手にUTF-8じゃないやつで推測しやがる。
（日本語が1箇所だけの場合もこうなることがあるのは知ってる）

## 解決方法

設定で、エンコードを推測しないにしておけばおけ。

`    "files.autoGuessEncoding": false,`

これを入れればOK。


GUIの設定画面から行く場合は

ファイル→基本設定→設定　で設定画面を開いたのち

検索に「エンコード」と入れると

```
Files: Auto Guess Encoding
✔　有効な場合、ファイルを開くときに文字セットエンコードをエディターが推測します。言語ごとに構成することも可能です。
```

というのが出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59927/3ca143c7-7cd5-e7f8-456b-4ad30344a351.png)
↑　エンコードと入れたときの画面。

このチェックを外せばOK。

### マークダウンファイルに限る場合は

設定に入れる必要がある。

```
  "[markdown]": {
    "files.autoGuessEncoding": false,
  },
```

GUIの設定画面は無理ぽ。たぶん。



## おわりに

絵文字楽しいキラキラしててかわいい🌟　にゅーぶる会のところを使ってりんごバージョン作ったので今度また書きます。
Next.jsでMaterialUI利用するコンポーネントのオーバーライド

#Next.jsでMaterialUI利用するフロントエンド開発メモ

やってみたらできたのでメモ。。

##コンポーネントのオーバーライド

![NoName_2019-9-20_11-24-33_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/78e5951f-ac18-e4f3-41c9-e5cdce042983.png)


スライダーのthumbと背景の大きさ変更した際のソースコード

```
import React from 'react';
import { createMuiTheme, makeStyles } from '@material-ui/core/styles';
import Box from '@material-ui/core/Box';
import Slider from '@material-ui/core/Slider';

const useStyles = makeStyles(theme => ({
  thumb: {
    width: 24,
    height: 24,
    marginTop: -9,
    borderStyle: "solid",
    borderWidth: 3,
    borderColor: "#ffffff",
    boxSizing: "content",
  },
  rail: { height: 6, },
}));

export default function Test() {
  const classes = useStyles();
  return (
    <Box>
      <Slider
        aria-label="custom thumb label"
        defaultValue={50}
        disabled
      />
      <Slider
        ThumbComponen={<span className={classes.thumb} />}
        aria-label="custom thumb label"
        defaultValue={50}
        classes={{ rail: classes.rail, track: classes.rail, thumb: classes.thumb }}
      />
    </Box>
  );
}
```

下記で上書きできた

```
classes={{ rail: classes.rail, track: classes.rail, thumb: classes.thumb }}
```


##参考サイト
- Slider<br>https://material-ui.com/components/slider/
- Slider API<br>https://material-ui.com/api/slider/
「詳解 ディープラーニング」の間違い

## 書籍
[詳解 ディープラーニング](https://www.amazon.co.jp/dp/4839962510/)

## 注意書き
一部しか試していないので、すべてを網羅しているとは限りません。

## 間違い

### P.175

```python:修正前.py
def evaluate(self, X_test, Y_test):
  # 中略
  return self.accuracy.eval(session=self._sess, feed_dict={
  # 以下略
```

```python:修正後.py
def evaluate(self, X_test, Y_test):
  # 中略
  return accuracy.eval(session=self._sess, feed_dict={
  # 以下略
```

エラーメッセージ
`'function' object has no attribute 'eval'`

## 他の間違いなど

[「詳解 ディープラーニング」サポートサイト](https://book.mynavi.jp/supportsite/detail/9784839962517.html)
受注日、売上日を持つテーブルで共通の年月で集計する方法

初投稿。よく理解できていないこと書いている可能性があるので、お気づきの点はご指摘ください。:sweat_smile:

#要件
一つのファクトテーブルで受注日と売上日をもつテーブルがあった場合、
受注日と売上日をベースに月ごとに集計したり、前年比を出したい要件がある。


#課題
当然カレンダーテーブルを用意しリレーションを張るのがセオリーだが、
POWERBIのモデリング上リレーションは1本しか張れないため、カレンダーテーブルのキーを受注日に張るか、売上日に張るかのどちらかになってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/5a6cabf8-0836-6803-3b2f-3c3a218513df.png)
そもそも2本張れたとしても、たぶん求める結果にならないような気がする。
じゃあどうすればいい？


#２つの解決法
##1)　カレンダーテーブルを2つ用意する方法
マスタとなるカレンダーテーブルをNEWTABLEで複製(受注カレンダー=(出荷)カレンダー)し、
受注日、売上日にリレーションを張る。
二つの日付ディメンションでフィルターをかけることができるが、受注日、売上日がand条件になり使う要件が限られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/ebbbe377-5f6c-07a7-de1a-097ad19d12aa.png)

##2)　DAXのUSERERATIONSHIP関数を使用する方法
売上金額UR = CALCULATE(SUM('受注テーブル'[受注金額]),USERELATIONSHIP('受注カレンダー'[年月日],'受注テーブル'[売上日]))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/8e40563c-7226-562e-7e8c-e1ddc08e6aad.png)
このままだとエラーが出てしまうので、リレーションを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/e1bf53c7-4137-bee8-a755-222f6b5d35a5.png)
今度はちゃんと表示された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/3b91e16c-5561-319c-c5ec-0149c318d1bf.png)

##気づき
USERERATIONSHIPの使い方
モデリングでのリレーションで点線で表示されるアクティブでないリレーションはこんな使い方があるんだね。

Special Thanks to Guy in Cube
https://www.youtube.com/watch?v=2BxaUXlx3K4
読みやすいクリアなコードを書きたい〜ガード節〜【リファクタリング】

### 最初に

一般的にプログラミングの寿命はシステムの稼働寿命と同義だと考えると
システムの予想稼働が５年だとして、
プログラミングを書いている時間より、プログラミングを読んでいる時間の方が圧倒的に長くなります。
チーム開発などで携わる人数が多ければ多いほどそれは比例していきます。
よって保守性の高く、メンテナンスをしやすい可読性の高いコードを書くのはとても大切です。

今回はリファクタリングにおけるガード節の簡単なメモです。

### ガード節とは

> ある分岐で処理を続けるために真 (true) と評価されなければならない[1]式である。偽の場合は残りの処理のほうに進む。

https://ja.wikipedia.org/wiki/ガード_(プログラミング)

wikipediaによるとこういう説明になっていますが、言語化するとよく分からないですね。

- ネストが深くなりすぎるのを防ぎ可読性を上げる
- 正常系パターンと例外的な異常系の頻度を明確にする

簡単にいうとこのようなものです。

### 可読性の悪い例
こういうコードがあったとします（あえてものすごく分かりにくくしています）

```php
<?php

function validate($a, $b, $c) {
  if (!empty($a)) {
    if (!empty($b)) {
      if (!empty($c)) {
        $ret = true;
      } else {
        $ret = false;
      }
    } else {
      $ret = false;
    }
  } else {
    $ret = false;
  }

  return $ret;
}
```

### ガード節を使ってみると

ガード節を使うとこういう書き方もできます

```php
<?php

function validate($a, $b, $c) {
  if (empty($a)) {
    return false;
  }
  if (empty($b)) {
    return false;
  }
  if (empty($c)) {
    $ret = false;
  }

  $ret = true;

  return $ret;
}
```
どういうチェックをしているか、メソッドの役割が少し見やすくなったのではないでしょうか？

例としては極端に書きましたが、
実際にはビジネスロジックが長く複雑になってくると分岐のネストがどんどん見づらくなっているコードはよく見かけます。

エンバグしないように保守性の高い、読み手に伝わるコードを書くことを自分も意識づけたいところです。
ネットワークとは？簡単に説明してみた。

ちょっと間が空きましたが、今日はAWSではなく
ネットワークのお話しです！
そもそもネットワークって何？ってお話しなんですが、
これについて今回はいろいろ調べました。

今回の参考サイト様：
http://www5e.biglobe.ne.jp/aji/3min/01.html

<h1>ネットワークとはそもそもなんだ？</h1>
まず、ネットワークを直訳すると<b>「網」</b>という意味です。
一般的には<b>「何か」と「何か」が通信してる</b>ってことで
ネットワークという言葉が使われますね！

パソコンがインターネットに繋がっていて読み込んでるときに通信したり・・・
みたいに、ふわっとした感じで理解してる人が多いかと思います。
<br>

でも、調べてみるとネットワークという言葉はパソコン以外のところでも
使われていたのです！

例えば、物流や交通でもネットワークという言葉を使います。
つまりネットワークとは<b>「何か」を運ぶ</b>という意味で使われるんですね。
なのでパソコン上やインターネットの世界では
<b>ケーブルで網状に繋がって、情報（データ）を運ぶ。</b>
ということですね！
これがこれから勉強していく<b>コンピュータ・ネットワーク</b>になります！

<h2>コンピュータネットワークのはじまり</h2>
もともとは<b>スニーカーネット</b>と呼ばれていたらしいです。
まぁ人が運ぶってことですね。
データであれば、フロッピーに入れて会社から出て電車に乗って相手の会社に行って・・・
まぁめんどくさいですね。。。
しかもその間に交通事故やフロッピー事態をなくしたら・・・
もう恐怖ですね笑

ってことでこの無駄を省くために、誕生したのが、<b>LAN</b>な訳ですよ！
一般的には地域的に限定されたネットワークという意味ですが
超絶ウルトラ簡単に説明すると！！
ビル1個、部屋1個に専用のネットワークを作ってしまうということですね！

ビルで例えると、
パソコンが１階にあって２０階にプリンターがあるとします。
この場合、スニーカーネットの場合は人が運ぶのでもちろん
歩いて、２０階までいきますよね？（絶対しんどい・・・）
だけど、LANがあれば、１階のパソコンから「プリントしてーー」とボタンを
押すだけでプリントアウトできてしまうのです！
これが<b>LAN</b>のすごさです！
もちろんパソコンが複数あれば、データをビル内の全パソコンに共有したりもできます！

そしてさらに進化しものがあるんです・・・！！（な・・なんだと！？）

それは<b>WAN</b>です。
WAN（ワン）はビル内だけでなく、ビルとビルをつないでしまうのです！
これがネットワークですよ！
きましたね。。。
人類が一歩、未来に進んだ瞬間ですね

ってことで今日は以上！
【Android】AlertDialogでNumberPickerを使うときはフォーカスを外す処理を入れる

# AlertDialogでNumberPickerを使う

```picker_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="horizontal"
        android:gravity="center"
        android:descendantFocusability="beforeDescendants"
        android:focusableInTouchMode="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <TextView
            android:text="なんかの文字"
            android:textSize="32sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    <NumberPicker
            android:id="@+id/picker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

</LinearLayout>
```

```PickerDialog.kt
private lateinit var dialogView: View
var pickerNum: Int = 0
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.picker_dialog, null)
    dialogView.picker.setOnValueChangedListener { _, _, newVal -> pickerNum = newVal }

    return AlertDialog.Builder(requireContext())
        .setView(dialogView)
        .setPositiveButton(android.R.string.ok) { _, _ ->
            Log.d("PickerDialog", "${pickerNum}")
        }
        .setNegativeButton(android.R.string.cancel, null)
        .create()
}
```

上記のようにしてNumberPickerを使うときの注意点です。

## テキスト入力だとNumberPickerの値が反映されない

NumberPickerをドラムロールとして使う分には上記の構成でも問題ありません。OKボタンを押すとログに選択している値が表示されるという想定通りの動作となります。

しかし、NumberPickerをタップしてテキスト入力の場合に問題があります。

テキスト入力で値を設定し**入力ダイアログが表示された状態**でOKボタンを押しても、変更前の値のままになっているかと思います。**入力ダイアログを閉じてから**ならば変更後の値になります。

## NumberPickerのテキスト入力はフォーカスが外れたときに設定される

原因はNumberPickerのテキスト入力はフォーカスが外れたときに設定されるという動作になっているためです。

入力ダイアログが表示された状態ではNumberPicker(の中のEditText)にフォーカスした状態のままなので、値の設定が行われません。

そのため、


```PickerDialog.kt
private lateinit var dialogView: View
var pickerNum: Int = 0
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.picker_dialog, null)
    dialogView.picker.setOnValueChangedListener { _, _, newVal -> pickerNum = newVal }

    return AlertDialog.Builder(requireContext())
        .setView(dialogView)
        .setPositiveButton(android.R.string.ok) { _, _ ->
            dialogView.clearFocus()
            Log.d("PickerDialog", "${pickerNum}")
        }
        .setNegativeButton(android.R.string.cancel, null)
        .create()
}
```

のようにしてOKボタンを押したときにフォーカスを外す処理を入れる必要があります。
Istioで特定のDeployment(Pod)だけDisenabledにする方法

# はじめに

Namespaceのラベルにistio-injection:enabledが付いていると
全てのpodにIstioがinjectionされてしまう

PodにIstioがinjectionされないようにしたい

# 方法

以下のannotationを追加する

```
sidecar.istio.io/inject: "false"
```

```yaml:deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ignored
spec:
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
    spec:
      containers:
      - name: ignored
        image: tutum/curl
        command: ["/bin/sleep","infinity"]
```
俺的mongodbスニペット


すぐ忘れるのでよく使う書き方をメモっとく

```
# 環境
node v10.16.0
mongoドライバ 3.2.7
```

### in句
```js
  const ids = [10, 20, 30 ]
  const results = await db.collection('products').aggregate([
    { $match: { $expr: { $in: ["$id", ids] } } },
  ]).toArray()

```
LaravelでViewに共通の変数をmiddlewareで設定する

# 概要
ログインユーザーの情報などサイト全体で常に使うデータがあると思います。常に必要なデータmiddlewareでViewに渡しておくことで処理を共通化出来ます。

# 手順
1. middlewareを作成
2. middlewareを登録

## middlewareを作成

middlewareを新規作成します。

```
php artisan make:middleware SetUser
```


ViewFactoryに変数を渡しておくと、デフォルトの値として入ります。

```php:app\Http\Middleware\SetUser.php
<?php

namespace App\Http\Middleware;

use Illuminate\Auth\AuthManager;
use Illuminate\View\Factory;

class SetUser
{
    public function __construct(Factory $viewFactory, AuthManager $authManager)
    {
        $this->viewFactory = $viewFactory;
        $this->authManager = $authManager;
    }

    public function handle($request, \Closure $next)
    {
        $user = $this->authManager->user();
        $this->viewFactory->share('user', $user);

        return $next($request);
    }
}
```

## middlewareの登録

Kernel.phpにmiddlewareを登録します。

```php:app\Http\Kernel.php
<?php

class Kernel extends HttpKernel {

    ...略...

    protected $routeMiddleware = [
        ...略...
        'setUser' => \App\Http\Middleware\SetUser::class,
    ];

}
Rspec モック

# はじめに
晴れてエンジニアになりテストを書き始めたところで、初めてRspecのモックというものを使用したので忘れないように個人メモとして残す

# 概要
- モックとは
- モックオブジェクトを作成する
- オブジェクトの返り値を設定する
- 設定したメソッドを使用してテストを実行する

# Rspecのモックとは
簡単にいえばダミーのオブジェクト

本物のデータベースにアクセスできない、もしくはアクセスしたくない時に使うことができる
今回の場合、外部APIを叩いて情報を取得する必要があったためダミーのオブジェクトを作成してテストを書いた

# モックオブジェクトを作成する
### double
例）ダミーユーザーを作成する

```Ruby
user = double('User', name: 'もっくん')
p user
#=>#<Double "User">
p user.name
#=>"もっくん"
```
- ```double```というメソッドを使用して```User```というダミークラス([テストダブル](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E3%83%80%E3%83%96%E3%83%AB))を作成します。
- userというダミーオブジェクトを作成します。
- p user で```double```に渡した引数 'User' を取得できます
- nameというメソッドを使用して'もっくん'という名前を取得できます

# オブジェクトの返り値を設定する
### allow

```Ruby
allow(user).to receive(:name).and_return "もっちゃん"
allow(user).to receive(:age).and_return "7さい"
```
```allow(作成したオブジェクト).to receive(置き換えたいメソッド名).and_return(希望する返り値)```

- and_returnでメソッドを使用した時の希望する返り値を設定することができます 
- nameメソッドを使用すると"もっちゃん"が返り値になるように設定します
- ageメソッドを使用すると"7さい"が返り値になるように設定します

# 設定したメソッドを使用してテストを実行する
```Ruby
    describe "Rspec mock test" do
      user = double("User", name: "もっくん")
      p user
      p user.name
      allow(user).to receive(:name).and_return "もっちゃん"
      allow(user).to receive(:age).and_return "7才"
      p user.name
      p user.age
    end
 #=>#<Double "User">
 #=>"もっくん"
 #=>"もっちゃん"
 #=>"7さい"
```

# 参考にした記事

https://qiita.com/sesame/items/8d4419da0afde3bb845f
https://qiita.com/fuku_tech/items/261e958b35ab809213da
SchemaSpyを使って、RedmineのER図作成を自動化する

## 目的
RedmineのER図が無かったのだが、手で描くのが非効率なのでなるべく自動化したかったため

## 方法
SchemaSpyを使用。railsモードを使ってER図を描画した。

公式：
https://schemaspy.readthedocs.io/en/latest/index.html

### 環境情報

- CentOS 7
- MySQL 5.7.26
- MySQL JDBCドライバ 5.1.48
- SchemaSpy 6.1.0

### 実施スクリプトのディレクトリ構成

※ 出力ディレクトリは割愛しています。

```sh:
schemaspy
    ├─config
    │      config.file
    │
    └─jar
            mysql-connector-java-5.1.48.jar
            schemaspy-6.1.0.jar
```

### 制御ファイル

jarファイルや、ER図の出力ディレクトリは、フルパスで記述しています。
データベース名も含め、適宜、自身の環境に読み替えてください。
**schemaspy.sオプションは、指定しないとエラーになりました**。

```yaml:config.file
# type of database. Run with -dbhelp for details
schemaspy.t=mysql
# optional path to alternative jdbc drivers.
schemaspy.dp=/media/sf_work/script/schemaspy/jar/mysql-connector-java-5.1.48.jar
# database properties: host, port number, name user, password
schemaspy.host=localhost
schemaspy.port=3306
schemaspy.db=ew_dev_redmine33x
schemaspy.u=root
#schemaspy.p=database_password
# output dir to save generated files
schemaspy.o=/media/sf_work/script/schemaspy/er_output
# db scheme for which generate diagrams
schemaspy.s=ew_dev_redmine33x
```

### 実行コマンド

```sh:
java -jar /media/sf_work/script/schemaspy/jar/schemaspy-6.1.0.jar -configFile /media/sf_work/script/schemaspy/config/config.file -vizjs -rails -connprops useSSL\\=false
```

オプション解説：

- -vizjs
    - Graphvizという描画モジュールを使わず、SchemaSpyに組み込まれている描画モジュールを使用する
- -rails
    - DBに外部キー制約が定義されていなくても、カラム名から推察してリレーションの線を作ってくれる。RedmineはRailsで、かつ、外部キー制約がなかったので、このオプションを使った。
- -connprops useSSL\\=false
    - SSL関係でワーニングが出るのを回避したかったので、公式を参照して付けたオプション。


### 出力結果

出力ディレクトリに指定したフォルダにindex.htmlが作成されるので、ブラウザで見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34636/3cc3d6a9-6430-3199-ee66-0c80e90bf53e.png)


とても全体を見切れないことがわかりました。テーブル単位で見てみましょう。
issuesテーブルがRedmineの要なので、ここを見てみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34636/3b7fe9ed-edec-d210-e5dc-3a6c69d13a08.png)

なんとか見れないこともないですが、データベースのカラム名から推察しているので、Redmineのソースコードを読み取っているわけではありません。ActiveRecordで独自に作成されたリレーションは取り込めないということですね。手でリレーションを追加することもできますが、自動化したいという目的には合っていません。

## まとめ
外部キー制約が貼られているのであれば、ER図の作成を非常に効率化できそうです。
しかしRailsのソースコードを解析していないので、精度の高いER図を出力するには別の手段が必要だと分かりました。
Rails ERDというツールがあったので、こちらを調べてみようと思います。

## 参考情報

https://blog.hatappi.me/entry/2017/03/28/083000
EthereumのERC20トークンについて

#ERC20トークンとは
ERCとはRequest for Commentsの略であり、Ethereumのプラットフォームで使用されることを目的とした規格のことであり、その規格に基づいて作られたトークンをERC20トークンと言う。
ERC20の他に、ERC223やERC721などの規格が存在し、ERC223は、ERC20を改良されたものであり、ERC721は、ERC20やERC223のように価値の指標を「量」とせず、「質」を価値の指標とし、Dappsゲームなどで使用される。
##ERC20規格が作られた理由
ERC20が生まれる前は、ICO(Initial Coin Offeringの略で、と呼ばれる仮想通貨を使った資金調達)の参加者は特に決められたルールがないトークを作成していたので、きちんと売買可能なのか判別するのが困難であり、またそれぞれのトークンに対してウォレットや取引所が対応しているので多くのウォレットを管理、運用するのはあまり実用的ではない。それを改善するために作られたのがERC20トークンである。

#ERC20トークンの特徴
上記のような理由からERC20トークンが作られ、以下のような特徴が挙げられる。

- トークンを発行する際の基準を統一化することで開発コストや手間を省く
- 複数のトークンを一つのウォレットで管理、運用を可能にし、参加者の利便性を高める
- ERC20で統一することによりプロトコルで発生する問題点に多くのエンジニアが対応できるため、セキュリティー面の安全性が保証される

上記に挙げた通り、大きな特徴はERC20トークンを一元管理できることで、取引所への上場や利便性の向上が期待でき、基準統一化により参加者は容易にトークンの発行が可能で、安全に売買取引が可能であることである。

#ERC20トークンの関数とイベント
ERC20トークンは6つのメソッドとイベントにより作成できる。[openZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts)ライブラリを使用することでERC20トークンの実装が簡単にできる。スマートコントラクトの開発にはsolidityという言語が使われており上記はその言語で書かれたメソッドであるため今回は簡単にメソッドの説明をする。今度実装も含め具体的な解説を行います。参考は[github](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md)より。

##メソッドの説明

| 関数名                                                     |       説明 |
|:----------------------------------------------------------|:------------------|
| totalSupply()                                             |トークンの合計供給量を返す           |
| balanceOf(address _owner)                                 |_ownerアカウントの残高を返す             |
| transfer(address _to, uint256 _value)                     |指定されたaddressに指定された量のトークンを転送する               | 
| transferFrom(address _from, address _to, uint256 _value)  |address _formから_toへ指定されたトークンを転送する                |
| approve(address _spender, uint256 _value)                 |_spenderから_value分引き出すことを許可する             |  
| allowance(address _owner, address _spender)               |_spenderが_ownerから引き出せる量を返す            |

##イベントの説明

|イベント         |       説明     |
|:-------------|:---------------|
|Transfer|トークンが転送されたときに発生するイベント。どのアドレスからどのアドレスに送られたかを通知|
|Approval|承認がされた時に発生するイベント。承認情報を通知|

#ERC20トークンの問題点
ERC20規格は上記のようなメリットだけでなくデメリットもあるようです。その問題となっているデメリットは誤送信による通貨消失問題である。これは誤って送金先のEOA(送金アドレス)ではなく、コントラクトアドレスに送金してしまい、結果的にトークンの消失となることです。イーサリアムには2つの「送金「送金アドレス」と「コントラクトアドレス」が存在します。送金アドレスと言うのは銀行口座のようなもので送金する際に用いられるアドレスである
。一方コントラクトアドレスは、直訳すると「契約アドレス」であり、イーサリアム上で、スマートコントラクトを実行する際に用いられるアドレスである。
コントラクトアドレスそのものには送金できないようになっており、そのアドレスに送金してしまうと、送金されたトークンは失われてしまいます。（スマートコントラクトとは自動的に契約をイーサリアム仮想マシン(EVM)の上で実行されるプログラムのこと。）一度誤ってコントラクトアドレスに送金してしまうと、トークンの返還が不可能なので、これによる数百万ドルのトークンが引き出し不可能となっているようです。一部の取引所では「コントラクトアドレスにETHを送らないでください」という警告メッセージも出るようになっているようです。ICOへ投資する際にはコントラクトアドレスに送金するので、この時は取引所からではなく、自分のウォレットからでないと、上記のような誤送金が発生します。

#まとめ
ERC20規格は、利便性や安全性において大きなメリットがあるのですが、誤送金によるトークンの消失問題も抱えていて、損失額が400万ドル近くあることもあり、利用者にとって初めは困惑するんじゃないかと思いました。
また次回、ERC20の問題点を改善して作られた新しい規格がERC223についてまとめてみたいと思います。
JetsonNanoのインストールでSD書き込みや電源で困る

#JetsonNanoのインストールでSD書き込みや電源で困る

基盤とか普段は触らないので、少しのことで躓いたので備忘録

##EcherでSDカードへの書き込みが失敗
->USBタイプの機器でやり直したら解決しました

Echerを利用してSDカードのImageを書き込む時
PC組み込みのSDカードReader/Writerでで実行したら
failedしてしまいOSがブートできないで書き込みになってしまいました。
![63213419-6a8b8a00-c0c9-11e9-8244-b4f806ab4038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/7609b3f3-20b6-a570-f8d9-dc2a93e3c158.png)
画像引用：https://github.com/balena-io/etcher/issues/1725



##起動中に電源落ちる

ACアダプタ (5V – 4A）差し込んだけど
電源はいらない。。

ジャンパーピンを使って、電源パスを通す必要が合ったようです
![IMAG2761.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/0d0dfdd0-c576-03b9-d073-80bd12bdccb1.jpeg)


##参考サイト
- はじめてみよう！NVIDIA Jetson nano まずは知識と最初の起動！<br>https://www.fabshop.jp/firstsetpjetson/
- Jetson Nano開発キットの基本と注意点 (2/2)<br>https://ednjapan.com/edn/articles/1907/18/news010_2.html
- Getting Started With Jetson Nano Developer Kit<br>https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write
AsciiDoc with Visual Studio Code

Visual Studio CodeのRemote Containerを使ってAsciidocの環境を作りました。

以前[AsciiDoc+ブラウザ自動更新環境のDockerイメージを作った - Qiita](https://qiita.com/dbgso/items/927c4e3d0f739855f8d6) という記事を書いたのですが、
この記事ではAsciiDocのプレビュー環境をdockerを使って構築していました。
この方法では、docker-composeで環境を起動してあとは自分でVisual Studio Codeの環境を作ってね、という形でちょっと面倒な状態でした

ただ、今はVisual Studio Code のRemote Container機能があり、これを使えばプロジェクトの構成から一発で作れるだろうということで作ってみました。
(ベースとなるコンテナがAlpine Linuxだったので[Visual Studio Code August 2019](https://code.visualstudio.com/updates/v1_38)の更新でのサポート待ち状態でした)

使っているDockerイメージなどは[AsciiDoc+ブラウザ自動更新環境のDockerイメージを作った - Qiita](https://qiita.com/dbgso/items/927c4e3d0f739855f8d6)と変わっていませんので、詳細気になる方はこっちを参照ください。

# 環境

Visual Studio Codeは**1.38**以上が必須です

```
$ code --version
1.38.1
b37e54c98e1a74ba89e03073e5a3761284e3ffb0
x64
```

[Remote - Containers - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) の拡張機能も必要です。

# 使い方

手順概要

1. プロジェクトをcloneする
1. Visual Studio Codeで開く
1. Remote Containerで開く
1. index.adocを編集する
1. ブラウザで `http://localhost:18080/index.html` を開く

以上です

これで、`index.adoc`を変更すればブラウザが自動で更新される環境のできあがりです。
次から詳細について

## プロジェクトをcloneしてVisual Studio Codeで開く

プロジェクトのテンプレートはgithubにあげているのでcloneで取得してください。

```console
$ git clone https://github.com/dbgso/vscode-asciidoc-container.git
$ code vscode-asciidoc-container
```

## Remote Containerで開く

コマンドパレットで`Remote-Containers: Reopen Folder in Container`コマンドを実行

あるいは以下のダイアログで`Reopen in Container`を選択する

![reopenincontainer](https://camo.qiitausercontent.com/f57c1f5989a79a862b46bc86d6a14115a37a21f9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3333303531342f39633039333066302d393135652d656461322d383938302d3035623130313461353936642e706e67)

# index.adocを編集する

サンプルとなるファイルを置いているので、これをベースに編集してもらえれば良いです。

# ブラウザで `http://localhost:18080/index.html` を開く

`index.adoc`が変更されると自動で`index.html`が生成されます。
`http://localhost:18080/index.html`を開いておけばこの変更が自動で反映されます。
ポート18080を変えたい場合は`docker-compose.yml`を適宜変更してください。


# 表示結果

以下のようなサンプルコードがプロジェクトに最初から置いてありますので、適当に編集するなりしてください

[vscode-asciidoc-container/index.adoc at master · dbgso/vscode-asciidoc-container](https://github.com/dbgso/vscode-asciidoc-container/blob/master/data/index.adoc)


レンダリング画面は以下のようになります。縦長なので閉じました

<details open>
<summary>プレビュー結果</summary>
![sample_adoc.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330514/4c6b06c9-6d66-c70f-2195-c143be6ad414.jpeg)
</details>

# まとめ

AsciiDocの執筆環境をVisual Studio Codeを使ってお手軽構築できました。
良かったら使っていただいて、改良してもらえると嬉しいです
Ansible 入れ子になってる変数と変数を合体させて、変数と認識させる方法

#やりたいこと
タイトルでちょっとアレですが。。やりたいこととしてはインベントリに定義された変数を組み合わせたパターンから、varsのから呼び出す値を変えたい！ってことです。

こんな感じで。。

```yaml

[インベントリ]
head=an #head変数には、ユーザー次第でanだったりteが入ったりする
tail=sible #tail変数には、ユーザー次第でsibleだったりstが入ったりする

[vars]
ansible:
  ansible: success!!! #head変数の値が`an`で、tail変数`sible`が定義された場合に出力したい
  test: test!!! #head変数の値が`te`で、tail変数`st`が定義された場合に出力したい
```

head変数とtail変数を合体させて`ansible`になれば`success!!!`
`test`になれば`test!!!`を出力したいという感じです。

##実現方法
playbookのリスト内の変数を[]で括ります。これだけ。
今回は変数で定義された値を出力するだけのplaybookです。

```yaml
[playbook]
---
- name: ansible変数合体
  debug:
    msg: "{{ ansible[head + tail] }}" 
```

###結果

インベントリのhead変数の値が`an`で、tail変数に`sible`が定義された場合の記載と出力結果が下記です。success!!!が出力されます。

```yaml

[インベントリ]
head=an
tail=sible

[出力結果]
PLAY [all] ******************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************
ok: [test1]

TASK [var_practice : ansible変数合体] *******************************************************************************************************
ok: [test1] => {
    "msg": "success!!!"
}

PLAY RECAP ******************************************************************************************************************************
test1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

```

インベントリのhead変数の値が`te`で、tail変数に`st`が定義された場合の出力結果が下記です。test!!!が出力されています。

```yaml

[インベントリ]
head=te
tail=st

[出力結果]
PLAY [all] ******************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************
ok: [test1]

TASK [var_practice : ansible変数合体] *******************************************************************************************************
ok: [test1] => {
    "msg": "test!!!"
}

PLAY RECAP ******************************************************************************************************************************
test1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

```

###おまけ
変数と変数の間に`_`とかの文字列があっても出来ます。
文字列は""で括るんですが、ダブルクオーテーションを`\`の前に入れます。
playbookの記述以外は変わりません。

```yaml

[playbook]
- name: ansible変数合体
  debug:
    msg: "{{ ansible[head + \"_\" + tail] }}" 
```

これでOK。


##最後に
変数の呼び方とか用語があんまり知らないので、
使い方間違ってたりしたら指摘もらえると有難いです。

全く大した量では無いですが、GitHubに上げているので参考にしたい方はどうぞ。
tasksフォルダとvarsフォルダ以外使ってませんが。。

https://github.com/atsushi-815/practiceAnsible/tree/develop/roles/var_practice
RubyでYouTube検索を実装するAPIを使ってみた

# APIの作成
1. APIコンソールにログイン（https://console.developers.google.com/?hl=ja）
2. プロジェクトを作成
3. サイドバー「認証情報」から「認証情報を作成」「APIキー」を選択しAPIキーを作成
4. APIキーをコピー（後でプログラムに使用します）
5. 「ダッシュボード」「APIの有効化」から「YouTube Data API v3」を選択

# RubyからAPIを利用

## Gemのインストール

```
gem install google-api-client
```

Gemfileに記述する場合

```
gem 'google-api-client'
```

## APIの初期化

```rb
require 'google/apis/youtube_v3'

# 動画データを取得できるオブジェクトを作成
youtube = Google::Apis::YoutubeV3::YouTubeService.new
# 先ほど作成したAPIキーを入力
youtube.key = "APIキー"
```

## 動画データの検索

```rb
require 'google/apis/youtube_v3'

youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = "APIキー"

youtube_search_list = youtube.list_searches("id,snippet", type: "video", q: "久保", max_results: 50)
```

## タイトルとURLを抽出

```rb
require 'google/apis/youtube_v3'

youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = "APIキー"

youtube_search_list = youtube.list_searches("id,snippet", type: "video", q: "久保", max_results: 50)

text = ""

youtube_search_list.items.each do |item|
  title = item.snippet.title
  video_id = item.id.video_id

  text +=<<~EOS

  タイトル：#{title}
  URL：https://www.youtube.com/watch?v=#{video_id}

  EOS
end

puts text
```
環境変数（自分用メモ）

## 環境変数を設定する！

### Windows - DOS プロンプト

```
C:\> SET ENV_VAR_NAME=env_var_value
C:\> echo %ENV_VAR_NAME%
env_var_value
```


### Windows - PowerShell !!!

結構書き方違う。プログラム（リテラル）っぽく書く感じある

```
PS C:\> > $env:ENV_VAR_NAME = "env_var_value"
PS C:\> $env:ENV_VAR_NAME
env_var_value
```

### Linux 

（シェルによって書き方違うんかも）

```
$ export ENV_VAR_NAME=env_var_value
$ echo $ENV_VAR_NAME
env_var_value
```

---

### 参考:プログラムから参照する

これは、OSが違ってもそんなに書き方変わらないはず

#### node.js

```js
C:\> node
> process.env.ENV_VAR_NAME
'env_var_value'
```

#### ruby

```ruby
C:\>irb
irb(main):001:0> ENV['ENV_VAR_NAME']
=> "env_var_value"
```
GithubでReadme.mdを作らずにRepositoryをnewした時

Readme.mdファイルを作るを選択せずに倉庫(repository)を作ってしまった。


![openjij.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/0abd1921-5ed4-3ca1-147d-35238e293382.png)

どこを押したらいいかわからず。

「add readme.md github」検索

How do I give my GitHub repository a README after the repo is already created?
https://www.quora.com/How-do-I-give-my-GitHub-repository-a-README-after-the-repo-is-already-created

「Create a new file」が「Quick setup - if you've done this kind of thing before」の見出しの下の下にある。

![openjij2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/7f8cdfd5-2215-2226-e28b-92cac8d9f325.png)

必要最小限の事項を書いて「Commit new file」

![openjij3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/bc0a93ca-d8e4-a68e-e223-f15fa90f9b27.png)

p.s.
今日(20191106)、Readme.mdファイルの作り方がわからず検索した。

「Readme.md github」この記事に出会った。
よかったと思ったら、自分が作ったものだった。

1 Create a new file
はできたが、保存しようとしたら、緑色が薄くなっていて、保存できない。
何がいけないのか、

最初はcommentが書いてないからかと思い、見出しと文の両方入れた。
それでもまだ緑が薄い。
![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/cbe4d6b2-d690-9de3-766e-dc01d35c23ac.png)

2 upload!

![readme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/5c2171c3-889f-d61a-8658-e61b501f76a2.png)


[warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/87cd6923-c58f-5066-3b04-dbd42cd406c7.png)


![uploading.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/96165b79-e2dc-a4b6-ff0a-3db154654dfc.png)

![safari.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/b2fb14a7-4346-fb5f-d15b-3decb290a7d8.png)

アプリを更新し、Readmeの方を押したら保存できるようになった。
https://github.com/kaizen-nagoya/deeplearning/blob/master/README.md

Create new fileではまだ。

#Creating new files

https://help.github.com/en/github/managing-files-in-a-repository/creating-new-files




#文書履歴(document history)
ver. 0.01 初稿 20190920
ver. 0.02 p.s. 追記　20191106
Firestoreにテストデータを作る（＋注意点）


やること自体は難しくない。
for等でループしてadd()かset()するだけ。

私は、docを指定したかったので、set()を利用しました。以下。

```js:index.js
var admin = require("firebase-admin");
var serviceAccount = require("./serviceAccountKey.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://{project}.firebaseio.com"
});

var db = admin.firestore();

//memoly leakのwarningを出ないようにする。
require('events').EventEmitter.defaultMaxListeners = 0;

//ループ
for (let i = 1; i < 100; i++) {

    let i0 = ('0000000000' + i).slice(-10);

    db.collection('users').doc(i0).set({
        member_id: i0,
        name: "user" + i,
        email: "user" + i + "@test.com",
        age: Math.floor(Math.random() * 60) + 15, //15 ~ 74
        created_at: admin.firestore.FieldValue.serverTimestamp()
    });
    console.log("create:" + i0);
}
```

### 注意？点

set()処理自体は正しくされましたが、（最初）下記のようなエラーがでました。

```bash
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit
```

標準ではListenerの上限が10になってることから起こるようです。とりあえずWarningを消すには、下記のようにdefaultMaxListenersの数を適切に設定するといいようです。


```js
require('events').EventEmitter.defaultMaxListeners = 0;
```

>なお、0に設定すると無制限ということのようです。

## fakerを使ってみる

ダミーデータといえばfaker。使ってみます。

```bash
npm install faker
```

書いてみる。いちおうlocalでjaが指定できるみたい。

>ただ、jaにするとメアドとか超テキトーな感じになります。

```js

....（省略）...

const faker = require('faker');
faker.locale = "ja";

for (let i = 1; i < 100; i++) {

    let i0 = ('0000000000' + i).slice(-10);

    db.collection('users').doc(i0).set({
        member_id: i0,
        name: faker.name.findName(),
        email: faker.internet.email(),
        age: Math.floor(Math.random() * 60) + 15,
        created_at: admin.firestore.FieldValue.serverTimestamp()
    });
    console.log("create:" + i0);
}
```

その他の使い方は[こちら](https://www.npmjs.com/package/faker)を見る。
UIStackView in UIScrollView


```
class StackScrollView: UIScrollView {
    private(set) lazy var stack: UIStackView = {
        let stack = UIStackView()
        stack.axis = .vertical
        stack.alignment = .center
        return stack
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(stack)
        stack.snp.makeConstraints { (make) in
            make.top.equalTo(self)
            make.left.equalTo(self)
            make.right.equalTo(self)
            make.centerX.equalTo(self)
        }
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        contentSize = stack.frame.size
    }

　func push(view: UIView) {
        stack.addArrangedSubview(view)
    }
}
```
VSCodeの起動時にタスクも起動したい

# Extention があるじゃない！


* **Blade Runner - Run Task When Open**  
　→ <https://github.com/doiyuki/Blade-Runner>

1. インストールして
2. 起動したいタスクを選択するだけ。
    3. 構成がありませんって言われるので Enter 押下して
    4. タスク選択する
5. んでコマンドパレット出して *reload* する
6. Happy!
iOS 13 以降でモーダルを fullScreen 表示させる3つの方法

iOS 13 以降は `UIModalPresentationStyle` がデフォルトで `.automatic` になり、大抵の場合はカード型の UI（ `.pageSheet` ）で表示されるようになりました（iOS 13 SDK でビルドした時に `.automatic` になります）。が、今まで通り全画面（ = `.fullScreen` ）で表示したいというケースもあるはず。ここでは fullScreen 表示にする3つのパターンについて紹介します。

# コード x present

単純に style 指定をするだけで大丈夫です。

```swift
let vc = ViewController2()
let nav = UINavigationController(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
present(nav, animated: true, completion: nil)
```

# コード x segue

Show Detail なんかを使っていると Storyboard 上で style 指定ができないと思います。なので prepare あたりで指定してあげると良いのかなと思います。

```swift
override func prepare(for segue: UIStoryboardSegue, sender _: Any?) {
    if segue.identifier == "toView2" {
        if let vc = segue.destination as? ViewController2 {
            vc.modalPresentationStyle = .fullScreen
        }
    }
}
```

# Storyboard x segue

Storyboard で Present Modally を使っているなら style 指定ができます。

![スクリーンショット 2019-09-17 17.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/26380239-38ad-c7dc-206f-b82518cf2c7a.png)
![スクリーンショット 2019-09-17 17.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/c5c362e5-eef2-d5ce-ecb5-74c36acc3996.png)