OmniAICreator/Qiita-1.07M huggingface dataset:
zxing-android-embedded を使ってみる (Kotlinで)

## はじめに
この前、授業成果物として簡易的なQRコード読み取りアプリケーションを制作したときに使ったライブラリについてメモを残しておきます。

## 今回使用したライブラリ
* ZXing Android Embedded  
https://github.com/journeyapps/zxing-android-embedded  

## できること
簡単に QR 読み込み機能のアプリケーションが作成できます。
![デモのキャプチャ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276546/d7232f58-b0f1-9f49-0f65-98a7701a2d82.gif)

## 使ってみる
公式ドキュメントもあり書かれている通りに進めれば、動作できると思います。
あまり面倒な作業は必要なく、インポートするだけで実行可能です。

#### Gradle ファイルにライブラリを記載する  
`build.gradle (app)` に以下の内容を追記します。

``` gradle
repositories {
    jcenter()
}

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:4.0.0'
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.zxing:core:3.3.0'
}

android {
    buildToolsVersion '28.0.3'
}
```  

#### ハードウェアアクセラレーションを有効にする
`AndroidManifest.xml` に `android:hardwareAccelerated="true"` を追記します。

``` xml
<application android:hardwareAccelerated="true" ... >
```

#### QR 読み取り用のアクティビティを追記する
QR コード読み取り部分のアクティビティが必要なので、ライブラリに存在している QR コード読み取りアクティビティを `AndroidManifest.xml` に追記する。

``` xml
<activity android:name="com.journeyapps.barcodescanner.CaptureActivity"
          android:screenOrientation="fullSensor"
          tools:replace="screenOrientation" />
```

#### コードを書く
基本的にコピペで OK です。
適当なサンプルを置いておくので参考にどうぞ！

``` kotlin
class QRReaderActivity : AppCompatActivity() {

    internal var qrScanIntegrator: IntentIntegrator? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_qrreader)

        qrScanIntegrator = IntentIntegrator(this)

        // 画面の回転をさせない (今回は縦画面に固定)
        qrScanIntegrator?.setOrientationLocked(false)

        // QR 読み取り後にビープ音がなるのを止める
        qrScanIntegrator?.setBeepEnabled(false)

        // スキャン開始 (QR アクティビティ生成)
        qrScanIntegrator?.initiateScan()
    }

    // 読み取り後に呼ばれるメソッド
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        // 結果の取得
        val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)

        if (result != null) {
            // result.contents で取得した値を参照できる
            Toast.makeText(this, result.contents, Toast.LENGTH_LONG).show()
        }

        else {
            super.onActivityResult(requestCode, resultCode, data)
        }
    }
}
```

これで QR コードを読み取るアプリを簡単に作成することができます！

## まとめ
正直、自作するのだるいですからね。サボれるところはサボってしまいましょう。
今回は QR コードを読み込む最低限の機能しかないアプリケーションを作成しましたが、サンプルを見た感じだともっと細かく作ることもできそうだなあと思いました。楽に QR コードを読み込むアプリケーションを作成したい人は使ってみてはどうでしょうか 
ありがとうございましたー 🥳
【Go言語】作成したpackageをimportして使用。「cannot find module for path」エラー時の解決

# ◇ 流れ
【Go言語】packageを作成
↓
importに「./XXXXX」でパス指定
↓
実行
↓
「cannot find module for path」と怒られる
↓
解決

# ◇ ディレクトリ構成
:file_folder: GOPATH
　┣━ :file_folder: bin
　┣━ :file_folder: pkg
　┗━ :file_folder: src
　 　　┗━ :file_folder: test
　 　　 　　┣━ :file_folder: route
　 　　 　　┃ 　 ┗━ :page_facing_up: route.go
　 　　 　　┣━ :page_facing_up: go.mod
　 　　 　　┗━ :page_facing_up: main.go

# ◇ go環境
``` ruby:ターミナル
$ go version
go version go1.13.4 windows/amd64

$ go env
set GO111MODULE=on
set GOBIN=C:\GOPATH\bin
set GOENV=C:\Users\XXXXXX\AppData\Roaming\go\env
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOOS=windows
set GOPATH=C:\GOPATH
set GOROOT=C:\Go
```
# ◇ go.mod を作成。

プロジェクトルートに、``$ go mod init``で``go.mod``を作成。

``` ruby:ターミナル
$ cd C:\GOPATH\src\test

$ go mod init
go: creating new go.mod: module test
```


```ruby:go.mod
module test

go 1.13
```
# ◇ main.go と route パッケージを作成。

```ruby:main.go
package main

import "./route"

func main() {
	route.Route()
}
```
```ruby:route/route.go
package route

import (
	"github.com/labstack/echo"
	"net/http"
)

func Route() {
	e := echo.New()

	e.GET("/", getHandler)

	e.Logger.Fatal(e.Start(":1323"))
}

// サイトを表示させる
func getHandler(c echo.Context) error {
	return c.String(http.StatusOK, "Hello, World!")
}
```

# ◇ 実行
``` ruby:ターミナル
go run main.go
go: finding golang.org/x/crypto latest
build _/c_/GOPATH/src/test/route: cannot find module for path _/c_/GOPATH/src/test/route
```

``cannot find module for path``とエラーがでて怒られた。。。

パスはあっているのに何故か、
package の読み込みが出来ていないのでかなり詰まりました。

↓↓↓↓↓　解決策　↓↓↓↓↓↓

`` go.mod ``にmoduleの名前があるので
「./route」を「test/route」に置き換える

```ruby:go.mod
module test ←　moduleの名前

go 1.13
```

```ruby:main.go
package main

import "./route" →　"test/route"  に変更

func main() {
	route.Route()
}
```




# 参考サイト
go 1.11のmodules(vgo)が有効な環境で相対importが cannot find module for path でエラーになった話。
https://pod.hatenablog.com/entry/2018/12/26/074944
#Stripe でテストのクレジットカードを追加する時の番号は？ Visa なら 4242 4242 4242 4242

https://stripe.com/docs/testing

カードごとに以下の通り
年月はてきとうで良いっぽい


```
NUMBER | BRAND | CVC | DATE
-- | -- | -- | --
4242424242424242 | Visa | Any 3 digits | Any future date
4000056655665556 | Visa (debit) | Any 3 digits | Any future date
5555555555554444 | Mastercard | Any 3 digits | Any future date
2223003122003222 | Mastercard (2-series) | Any 3 digits | Any future date
5200828282828210 | Mastercard (debit) | Any 3 digits | Any future date
5105105105105100 | Mastercard (prepaid) | Any 3 digits | Any future date
378282246310005 | American Express | Any 4 digits | Any future date
371449635398431 | American Express | Any 4 digits | Any future date
6011111111111117 | Discover | Any 3 digits | Any future date
6011000990139424 | Discover | Any 3 digits | Any future date
3056930009020004 | Diners Club | Any 3 digits | Any future date
36227206271667 | Diners Club (14 digit card) | Any 3 digits | Any future date
3566002020360505 | JCB | Any 3 digits | Any future date
6200000000000005 | UnionPay | Any 3 digits | Any future date
```






# ダッシュボード

顧客単位のページで「カード」の項目から設定可能

https://dashboard.stripe.com/test/customers

![image](https://user-images.githubusercontent.com/13635059/69945371-c10fbd80-152c-11ea-8275-3209465541ec.png)

![image](https://user-images.githubusercontent.com/13635059/69945237-7ee67c00-152c-11ea-8634-e2e0afef52ef.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2803








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vegas Restaurant

## ラスベガスのレストランで比較的気軽に行けて気持ちも満たされそうなリスト

1. Hash house a go go at the LINK（シーフード、24時間） 
https://goo.gl/maps/7r8eZYxqJjfFWwME9

2. Bubba Gump Shrimp Co.（23時まで） 
https://goo.gl/maps/dj9oWXhKqBwBJBBh6

3. Planet Hollywood（23時まで） 
https://goo.gl/maps/97fdqR8UQMsoFUks7

4. Maggiano's Little Italy（23時まで） 
https://goo.gl/maps/AUX31vpSmQmgjqYX9

5. California Pizza Kitchen（24時まで）ミラージュ内 
https://goo.gl/maps/bFYjciaMJ6JLZFZ88

6. California Pizza Kitchen at The Park（23時まで）ニューヨークニューヨーク内 
https://goo.gl/maps/so1rXRXPh1bVRZVw8

7. Nacho Daddy（深夜2時まで）タコベルと同じビル。こっちにすればよかった 
https://nachodaddy.com/locations-strip/

他にもあればぜひ
ローコードプログラムで業務アプリを作成するには？Azure+Access+Excel

## なぜローコードプログラムのツールが必要か？

	1. 現場の変化の速さ
	2. 技術の変化の速さ
	3. 技術習得に長時間必要
	4. 打合せの時間ロス

### 現場の変化の速さ
現場の変化は速い、上司からの要望に迅速こたえなくてはならない。
それをSI業者に委託すると、見積＞稟議＞承認＞発注・・・と時間がかかる。

### 技術の変化の速さ
Excel で作成する。Googleのスプレッドシートで作成する。Access で作成する。FileMaker で作成する。Kintone で作成する。

どれを使ったらいいのかわからない。

## ノンプログラムによる、デメリット

	1. ノンプログラムによる、設定ヶ所の分散
	2. 分散することによる属人化
	3. ノンプログラムツールの継続性(Ver Up)
	4. ノンプログラムツールの機能不足の解決方法

### ノンプログラムによる、設定ヶ所の分散/分散することによる属人化
ノンプログラムになると、プログラムの設定はコードで書くことではなくプロパティのような方法になります。そうすることにより、色々な箇所に条件や命令を設定をするようになります。

すると、設定した人にはわかるのですが、他の人にはどこに設定したのかわからない状態ができてきます。このことが、属人化（設定した人にしかわからない）状態になるのです。

つまり、担当者が退職したので保守できない状態が発生してしまいます。

## 必要不可欠な実行条件

	1. スマホなど複数デバイスに対応
	2. 外出先からのアクセス
業務アプリは、社内ではパソコンで操作し、外出先からはスマホなどで操作することが多いと思います。複数の人で共有してシステムを運用するには、色々なデバイスで操作できる必要があります。

## ノンプログラムの解決策

	1. データベースは、Azure SQL データベースを利用
	2. データベース操作は、Access を利用
	3. データの出力は、Excelに出力
1. Azure SQL を選択する理由<br>外出先からでもシステムにアクセスできるようにするには、クラウドデータベースを利用する必要があります。色々なクラウドデータベースサービスがありますが、私は Microsoft Office との関連性を考えると Microsoft の Azure SQL データベースを利用することをお薦めします。

2. Access を利用する理由<br>データベースを表示したり集計するには、Accessを利用することをお薦めします。Accessは、25年以上の実績があり、データベースを操作するには業務アプリを策するのに十分な機能があります。

3. Excel を利用する理由<br>業務アプリを運用するには、業務アプリの機能だけでは満足できません。色々な条件に応じてデータを抽出・集計する機能が必要です。抽出・集計は、Access でも可能ですが、いつも使い慣れているアプリで操作できることが重要です。それには、多くの人が利用している Excel を使うことをお薦めします。

## 上記の解決策で、解決できること

	1. Azure SQL データベースを利用することで、外出先からのアクセスが可能になる。
	2. データの出力先をExcelにすることで、関数の設定で書式を設定でき、現場の変化応じた変更を担当者で対応可能になる。
	3. Access を利用することで、クエリーやユーザーフォームを使ってノンプログラムでデータベースを操作可能になる。
	4. ノンプログラムツールが機能不足な場合は、VBAで解決できる。
	5. スマホなど複数デバイスに対応するには、ASP.NET、PHP、C#などWeb系の言語で対応できる。

## これを可能にするプログラムに取り組んでいます。
[エクセルカードHARI](https://www.excel-access-japan.com/excelcard-hari/) と [カードボックスBARI](https://www.excel-access-japan.com/cardbox-bari-access/)

VBAには、限界があるとは思いますが、いまはこの方法で頑張っています。

## ノンプログラム／ローコード は、完成していた。
ノンプログラム／ローコード と盛んに言っているが、MS-DOS 時代の データベース［桐］では、既に完成されていた。ユーザーが、自分でプログラムを組めるようになっていたし、各地で［桐］のユーザー会ができて技術交流が行われていた。

Nifty Serve と言う掲示板を通じて、全国的に交流会も行われていた。

その結末は、［桐］がマイナーになり、［桐］の技術者がいなくなり、［桐］で作成された業務アプリだけがいまだに動いている。しかし、そのプログラムを保守できる技術者がいない。

ノンプログラム／ローコード の結末は、システムが属人化して、担当者がいなくなると保守できなくなることだ。これを解決するには、メジャーなアプリを使って ノンプログラム／ローコード を実現することだと思う。

その結論が、私は Azure SQL + Access + Excel なのである。
favicon.ico へのリクエストをData URIで回避する

```
<link rel="icon" href="data:image/x-icon;,">
```

雑にFaaSでHTML吐いてブラウザで開くと `/favicon.ico` にリクエストが来て2重リクエストめんどくさいとかないですかね？ 私はありました。
これをheadに入れて解決！

参照元
https://hail2u.net/blog/webdesign/data-uri-for-a-favicon.html
Mavenのscopeに何を書いたら良いのかわからなかったので調べてみた

Maven使うときにpom.xmlにimportするとき、だいたいネットから拾ってコピーしてくるけど、ものによって<scope>タグが異なることに躓いたので、メモ。

公式（[Dependency Scope : Maven – Introduction to the Dependency Mechanism](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope)）によると、主に5種類のパターンがある。（依存型pom - dependencyManagement でのみ使える、Maven 2.0.9で追加された `import` を含めると6種類）

> | scopeの種類 | 説明 |
|:--|:--|
| compile | scope の指定を省略した場合のデフォルト値です。全ての状況でクラスパスに追加されます。 |
| provided | ライブラリが JDK やコンテナによって提供される場合に指定します。コンパイル時のみクラスパスに追加されます。 |
| runtime | 実行時のみに必要な場合に指定します。テストの実行および通常の実行のときにクラスパスに追加されます。 |
| test | テストのときのみ必要な場合に指定します。テストのコンパイルと実行のときにクラスパスに追加されます。 |
| system | 明示的にクラスパスに追加する場合に指定します。このスコープのライブラリは常に有効であるとみなされ、リポジトリの検索は行われません。 |

> [3. Maven 入門 (2) | TECHSCORE(テックスコア)](https://www.techscore.com/tech/Java/ApacheJakarta/Maven/3/)より引用

ピンポイントでは、下記のようなJDBCについてscopeがあったりなかったりする例があったため迷ったが、[Mavenの依存範囲 - CodeFlow](https://www.codeflow.site/ja/article/maven-dependency-scopes)によるとruntimeが良いようだ。

```
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
    <scope>runtime</scope>
</dependency>
```
FlaskでSlack認証を完了するまでの流れ（Python）


FlaskでSlack認証を実装してみました。大体は、公式のドキュメントを見れば通るのですが、認証すると同時にユーザー情報も取得したいみたいな時にやや戸惑った部分もあるので、備忘録も兼ねて残しておきます。

## 前提

Slackアプリの登録については前回詳しく流れを書いています。
[https://qiita.com/svfreerider/items/0e1fe74c70e2047f0ce9](https://qiita.com/svfreerider/items/0e1fe74c70e2047f0ce9)

ほとんどは下記の公式ドキュメントのコードのまんまです。
[https://slack.dev/python-slackclient/auth.html](https://slack.dev/python-slackclient/auth.html)

## ソースコード

```Python:auth.py
import functools
import pdb
import slack

from flask import (
    Blueprint, flash, g, redirect, render_template, request, session, url_for
)

from app.db import (
    search_user, register_user, search_team, register_team, search_team_user, register_team_user
)

bp = Blueprint('auth', __name__, url_prefix='/auth')
client_id = 'XXXXXXXXXXXXXXX'
client_secret = 'XXXXXXXXXXXXXXX'
oauth_scope = 'channels:read,chat:write:bot,users:read,users:read.email'
```

認証機能を実装していく`auth.py`を用意します。Slackアプリを登録した際に取得した`client_id`と`client_secret`を定義します。また、これに加えて`scope`を定義します。scopeは、今回のアプリを作るにおいてユーザーに求める権限の範囲を指定します。アプリ側でも設定しておく必要があります。また、申請する際には「なぜ、このscopeが必要か」の理由を書かなければなりません。

自分の場合は、ボットを作ってそこから通知を送るので、チャンネルを指定する`channels:read`と、`chat:write:bot`を加えました。それから、あとでユーザーの個人情報と、メールアドレスも欲しいので、`users:read`と`users:read.email`も入れておきました。

```Python:auth.py
@bp.route('/redirect', methods=['GET'])
def authorize():
    authorize_url = f"https://slack.com/oauth/authorize?scope={ oauth_scope }&client_id={ client_id }"

    return redirect(authorize_url)
```

こうしておくと、`/auth/redirect`へ移動することでSlackの認証画面へリダイレクトされます。

```Python:auth.py
@bp.route('/callback', methods=["GET", "POST"])
def callback():
    auth_code = request.args['code']
    client = slack.WebClient(token="")
    oauth_info = client.oauth_access(
        client_id=client_id,
        client_secret=client_secret,
        code=auth_code
    )
```

`callback`した後に、URLの先についている`code`を使ってユーザーの情報を取得します。ユーザーの取得は`oauth_access`で行なっています。

ですが、この時はまだユーザーの名前や、メールアドレスの情報は取れていません。今度は取得した`oauth_token`を使ってユーザーの詳細情報を別で呼んでいきます。

```Python:auth.py
    access_token = oauth_info['access_token']
    client = slack.WebClient(token=access_token)
    user_id = oauth_info['user_id']
    response = client.users_info(user=user_id)
```

`users_info`でユーザーのメールアドレスや、名前だけでなくアイコン画像やタイムゾーンなど欲しい情報は全部取ってくることができます。

これはFlaskに限らず、Pythonであればそのまま流用できるかと思います。ちょうど2週間前にFlaskを入れてみたのですが、Railsを長年やってきた身としては、全然文献が見当たらないなというのが感想です。

これから、機械学習＋Flaskでアプリを作るケースは確実に増えていくと思うので、随時共有していくようにします。
Python lambda,map,listの1行のコードを解読

## 背景
python初心者です。
yolov3のコードを勉強しているとき、 lambda,map,listが1行で表記されていたので、頭が痛くなった。
簡単に自分のメモとしても残しておきたく、記載します。

## lambda,map,listの1行のコード
keras-yolov3のyolo.pyにおける85行辺りのコードである。

```python:1_yolo_code_around_85.py
self.colors = list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples))
```

困難にしている要素とそれのザックリ解説
・(*x)：可変長引数
・lambda：無名関数 　　
・map：組み込み関数
・list：リスト化

hsv_to_rgbではhsvに対応する引数が3つ必要である。
そのため以下のようにも変更できる。

```python:2_yolo_code_around_85.py
self.colors = list(map(lambda x: colorsys.hsv_to_rgb(x[0],x[1],x[2]), hsv_tuples))
```

リストxを上記のようにするとイメージがしやすいです。
lambdaによってリストxを用いた関数を定義し、
hsv_tuplesの値を関数に代入します。
mapにより、全要素に同じ処理を行い、
リスト化する。
ShellScript Bash 変数に「*」を格納して出力する時に少し詰まったところ

# 目的

- ShellScriptのBashで変数に文字列として`*`を出力する際に詰まったところをまとめる

# 結論

- 変数を出力するときに変数名を`""`で囲む
- `echo "${変数名}"`

# 筆者が困った流れ

1. 変数`FOO`に`*`を格納して出力したくなった。
1. 下記コマンドを実行して`*`を変数`FOO`に格納した。

    ```terminal
    FOO="*"
    ```
1. `~/`ディレクトリで下記コマンドを実行して変数`FOO`を展開しようとしたが、カレントディレクトリのフォルダが出力されてしまった。

    ```terminal
    echo ${FOO}
    >Applications Desktop Documents Downloads Library Movies Music Pictures Public tig workspace
    ```
1. `*`が出力されない・・・。

# 解決方法

- 変数名を`""`で囲むことで出力することができた。
- 下記に`*`を出力する方法を記載する。

    ```terminal
    $ echo "${FOO}"
    >*
    ```
DebugLog デバッグログ 条件を絞り込んで、ログ出力を行います。

salesforceのデバッグログ出力のところで、検索条件を絞り込んで、一括にログの出力ができないと思います。
対策：
①Dataloaderを使って、デバッグログのデータをエクスポートします。
　例：SELECT Id, StartTime, LogUserId, LogLength, Location FROM ApexLog
②EXCELで、フィルターを利用して、出力したいレコードを確定できます。
③確定できたデバッグログのIDを利用して、SFDXのコメンドを作成します。
　例：
　sfdx force:apex:log:get -i 07L0w000003C6tDEAS > 07L0w000003C6tDEAS_log.txt
　「07L0w000003C6tDEAS」は、ApexLogのIDです。
　「07L0w000003C6tDEAS_log.txt」は、出力されるファイル名です。
④visual studio code開発ツールで、③で作成したSFDXコメンドを実行します。
　「07L0w000003C6tDEAS_log.txt」ファイルがSFDXコメンド実行するフォルダー「C:\workspace」の直下に出力されます。

結論：
複数件（100件以上）なデータログを一括に出力したいか、検索条件を絞り込む場合は、
100件のSFDXのコメンドを作成すれば、一括（SFDXコメンドを実行）にログ出力ができます。

例：
sfdx force:apex:log:get -i 07L0w000003C6t1DEAS > 1.txt
sfdx force:apex:log:get -i 07L0w000003C6t2DEAS > 2.txt
sfdx force:apex:log:get -i 07L0w000003C6t3DEAS > 3.txt
sfdx force:apex:log:get -i 07L0w000003C6t4DEAS > 4.txt
sfdx force:apex:log:get -i 07L0w000003C6t5DEAS > 5.txt
sfdx force:apex:log:get -i 07L0w000003C6t6DEAS > 6.txt
sfdx force:apex:log:get -i 07L0w000003C6t7DEAS > 7.txt

以上です。
自分の出したプルリクがScipyに取り入れられた話

# 何をやった?

`scipy.optimize.minimize`には、とても微妙な仕様? バグ? がありました。
バグに近いと思ったのですが、直すと既に使ってる人が困りそうな内容だったので、Issueを立てて「もし修正するならプルリク出すけどどう?」って聞いてみました。
プルリク出して、ということだったので、出しました。
つい最近、ようやくマージされました。

## `scipy.optimize.minimize`とは?
何か関数を与えたら、パラメータをいい感じに最適化し、関数が返す値を最小化してくれます。
例えば、$z = 2x^2 + (3y - 2)^2 + xy$という式があったとしましょう。
$z$を最も小さくする$x, y$はなんですか? というのを解いてくれます。
パッと見て分かるのは$x = 0, y = 2/3$のときゼロになるなー、それより小さいのはなるのかなー、程度でしょう。

```py
def f(x, y):
    return 2 * x**2 + (3*y - 2)**2 + x*y
    
print(scipy.optimize.minimize(f, [0., 0.]))
```

と、関数と適当な初期値(`[0., 0.]`)を与えるといい感じの値を求めてくれます。
array([-0.16901447,  0.67605677])のとき、 -0.05633802816721355になるらしいです。

## 何が問題だったのか

`scipy.optimize.minimize`には、最小化のためのアルゴリズムは複数用意されていて、`method="..."`の引数を与えることで選ぶことができます。
ところで、引数がひとつだけのとき、かつ、"Powell"法を使ったときだけ、少しだけ嫌なことが起こります。

```py
import numpy as np
import scipy.optimize

def fun(x):
    return x*x

res = scipy.optimize.minimize(fun, [0.1], method="Nelder-Mead")
print("Nelder-Mead:")
print("Optimized:", res.x, "Shape:", res.x.shape)
res = scipy.optimize.minimize(fun, [0.1], method="COBYLA")
print("COBYLA:")
print("Optimized:", res.x, "Shape:", res.x.shape)
res = scipy.optimize.minimize(fun, [0.1], method="Powell")
print("Powell:")
print("Optimized:", res.x, "Shape:", res.x.shape)
```

```
Nelder-Mead:
Optimized: [1.94289029e-16] Shape: (1,)
COBYLA:
Optimized: [0.00010234] Shape: (1,)
Powell:
Optimized: 4.163336342344337e-17 Shape: ()
```

お分かりいただけただろうか。
返り値の`shape`が違うのである。

実はこれ以外にも、ヤコビアンを指定しなければいけないもの、ヘシアンを指定しなければいけないものなども含め、全14種類試したんですが、"Powell"法だけが、このようになっていました。

まぁ、バグっちゃバグなんですが。歴史あるプロジェクトです。今更直すべきかどうか、というのは判断に迷うところかもしれません。
既に、Powellはこうだと信じて使っている人に、影響出ちゃうかもしれないですし。
けど、まぁ、せっかくなので聞いてみることにしました。

# やったこと時系列

(2019年1月)
ということで、とりあえずフォークして、自分のリポジトリで直してみました。直せると分かったのでIssueを立てて、直したリンクも貼って「もしこれでよければPR出す」と言ってみました。
https://github.com/scipy/scipy/issues/9715

(2019年8月)
そしたら「バグだから修正した方がいいが、互換性の問題から、修正を入れる関数を変えてほしい」とのことだったので、そのようにしてPRを出しました。
https://github.com/scipy/scipy/pull/10640

(2019年9月)
変更内容はいいけど、付け加えたテストがやや冗長だから直してくれ、とコメントもらったので直して、などとして、
しばらく返事がないまま放置されていました。

(2019年12月)
masterにマージされました。

約1年かかったことになります。開発者も忙しいのと、内容が大したことないので優先度が低かったのもあると思います。

# 学び・感想

- Scipyにあった形式でIssueを立てたり、コミットメッセージを書いたり、PRを出したりする必要があったので「そもそもどういう風にすることになっているんだ」を調べたり、その形式に合わせたりするのが結構しんどかったです
    - 普段からちゃんとコミットメッセージ書いてないのが祟ったのかもしれません
- 時間はかかりましたが、開発者たちもちゃんと対応してくれて優しかったです
- 小さなことであっても、scipyという私もみんなも利用している有名ライブラリの改善に貢献できたので、やってよかったです
- 怖がらずに、ベストを尽くして人に聞く姿勢が大切だなぁ、と改めて思いました

オープンソースは、ただ無料で使えるだけでなく、こういうチャンスにも溢れています。
すごくつまらないことでも「あれ?」と思ったら貢献チャンスかもしれません。
今後も、できそうなことがあればオープンソースに貢献したいです。
Zabbix 4.0.14から4.0.15でのエージェント起動方法変更

日本Zabbixユーザー会の田中です。
Zabbix Advent Calendar 2019の3日目の記事です。

小ネタですが、ある程度はカレンダーを埋めたいので投稿します。

# 発生していた問題

一部の方は気づかれているようですが、Zabbix 4.0.14から4.0.15で、RHEL 7以降用のZabbixエージェントの起動方法に若干の変更が入っています。

具体的には、/usr/lib/systemd/system/zabbix-agent.serviceというファイルの、[Service]セクションに、以下の行が追加されています。

```
User=zabbix
Group=zabbix
```

4.4.1から4.4.2でも同様の変更が行われています。


# 問題発生の原因

これは、OSのディストリビューションによるsystemdを使用したサービスの起動の動作の違いがあったことが原因です。その差を吸収するために追加されたようです。
違いがあった現象の一例としては、環境変数の設定有無の違いがあり、4.4で追加された新しい監視用テンプレートを使用しようとしたときに発覚しました。

より具体的な内容としては、パッケージでZabbixをインストールした場合は、/etc/zabbix/zabbix_agentd.d/userparameter_mysql.confにMySQL監視用のUserParameterの設定があります。

このファイルの、Zabbix 4.0のデフォルトで用意されているファイルとZabbix 4.4で用意されているファイルを見比べていただくとわかるのですが、4.4の方は、環境変数HOMEを明示的に指定しないものとなっています。

環境変数HOMEが明示的に指定されていない場合、特定のディストリビューションでは環境変数HOMEが設定されるようなのですが、RHELやUbuntuでは設定されないので、ホームディレクトリに.my.cnfを用意してもMySQLの監視ができないという状況が発生していました。
そこで、zabbix_agentdをsystemdを使って起動する時に、明示的にユーザーとグループを指定するようにしたようです。


# 検討と対策の経緯

以下のURLでも議論されていましたが、きっと、より汎用的な監視の設定となるようにするということで、UserParameterでの環境変数HOMEの設定は行わないという方向で決まったということですね。

- [Discussion thread for official Zabbix Template DB MySQL](https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/384189-discussion-thread-for-official-zabbix-template-db-mysql)
- [ZBX-16629 : On ubuntu home environment variable is not set for user zabbix](https://support.zabbix.com/browse/ZBX-16629)


# 新しいテンプレート

4.4から本格的に、ガイドラインに合わせた監視用テンプレートの見直しが行われています。
新しいMySQL用のテンプレートは以下のURLにあります。

- [Template DB MySQL](https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/db/mysql)

4.4自体にも取り込まれてはいますが、依存アイテムや保存前処理など新機能も活用して、より多くの監視(Apache HTTP Sever、nginx、RabbitMQ、MySQL、PostgreSQL、各種ネットワーク機器など)ができるようになっているので、4.4以降を使用されている方や、今後、4.4や5.0を使おうと思っている方は新しいテンプレートを参考にしてみてください。


明日は、誰でしょう？
どなたかよろしくお願いします。
Azure CLI (az) でリージョン一覧見るコマンド az account list-locations 

Azure CLI 2.0 (az) で、リソースどこに置くかとかで location を指定するときに、リージョン名前一覧が欲しかったのでここにメモ。

az account 公式リファレンス
→ [https://docs.microsoft.com/ja-jp/cli/azure/account](https://docs.microsoft.com/ja-jp/cli/azure/account?WT.mc_id=docs-blog-machiy)

## location 全表示

````bash
az account list-locations 
````

![Azure location cloud shell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/f9011935-d3c4-d65d-4640-92a7084af414.png)

## テーブル (表) 表示

`-o table` で、アウトプットを指定します

````bash
az account list-locations -o table
````

![Azure location cloud shell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/c30d0866-972d-1ddb-b131-9b6d1d5864bb.png)

## 表示名と名前だけテーブル表示

クエリ `--query "[].{DisplayName:displayName, Name:name}"` を追加します

````bash
az account list-locations --query "[].{DisplayName:displayName, Name:name}" -o table
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/c16fa910-7c02-7425-2206-a71cd2f7555e.png)

````bash
DisplayName           Name
--------------------  ------------------
East Asia             eastasia
Southeast Asia        southeastasia
Central US            centralus
East US               eastus
East US 2             eastus2
West US               westus
North Central US      northcentralus
South Central US      southcentralus
North Europe          northeurope
West Europe           westeurope
Japan West            japanwest
Japan East            japaneast
Brazil South          brazilsouth
Australia East        australiaeast
Australia Southeast   australiasoutheast
South India           southindia
Central India         centralindia
West India            westindia
Canada Central        canadacentral
Canada East           canadaeast
UK South              uksouth
UK West               ukwest
West Central US       westcentralus
West US 2             westus2
Korea Central         koreacentral
Korea South           koreasouth
France Central        francecentral
France South          francesouth
Australia Central     australiacentral
Australia Central 2   australiacentral2
UAE Central           uaecentral
UAE North             uaenorth
South Africa North    southafricanorth
South Africa West     southafricawest
Switzerland North     switzerlandnorth
Switzerland West      switzerlandwest
Germany North         germanynorth
Germany West Central  germanywestcentral
Norway West           norwaywest
Norway East           norwayeast
````

## Reference

* [az account 公式リファレンス](https://docs.microsoft.com/ja-jp/cli/azure/account?WT.mc_id=docs-blog-machiy)
* [Azure CLI の GitHub の issue](https://github.com/Azure/azure-cli/issues/1520)
* [逆引きAzure CLI - Qiita](https://qiita.com/mutz0623/items/d03cee7232dea18c3620)
[503を許すな]ELB知らない人は，本当に危険!!

#ELBについて解説
![elb_instances_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/130974bb-b83c-0159-8b13-8d2fae9b3bee.png)

こんばんわ．
運用経験のある方ならわかると思うのですが

ELBってめっちゃ大事です．
ECサイトやネイティブアプリケーションの運用でかかせません．
大事な勝負日に503エラーなんてしてられないですよね？

EC2,S3,Lambda,cloud9あたりはみなさんよく使うと思います．

僕もその辺しか最初は知りませんでした．

S3なんかは覚えたての頃はかなり感動しました．
SNS作るときなんか，オブジェクトURLで保存すれば，DB容量の節約になりますからね．

その辺は使っていて直感的に覚えるのがベストでしょう．

さて，本題．
ELBって知ってますか？
マネジメントコンソールに書いてありますが，よくわからず，煙たがっていました．

しかし，クラウド運用する方は必須．
また，ソリューションアーキテクトアソシエイトを取るには不可避です．
みなさん嫌いなセキュリティですね．

基礎となるVPCに関しては[こちら](https://qiita.com/moyuta/items/78e50804e63d7ca70952)


##ELBのド基礎
ELBとは，
*仮想ロードバランスサービス*
です．

なにそれ？

ですよね．


まずはロードバランサーについて，
オンプレでロードバランサーとは，
web鯖やapp鯖など，複数ある場合に通信負荷を軽減するために，通信を分散させる事です．

つまり，**クラウド版の通信分散をさせる為の割り当て役**
とでも定義しておきましょう．
これがオーバーした時に503エラーが返されるのですね．


[前の記事](https://qiita.com/moyuta/items/78e50804e63d7ca70952)でも書きましたが，おさらい．
AWSでは，[VPC](https://qiita.com/moyuta/items/78e50804e63d7ca70952)を設定して仮想ネットワークを制御します．

ELBはVPC上に位置付けされます．
VPCが正常に動くように，割り当てやヘルスチェックをするものです!!

ちなみにヘルスチェックで異常を発見しても
インスタンスへのトラフィック送信を停止するのみです．

##ELBの種類とその特性
ELBは3種類のロードバランサーが提供されています．
それぞれ特性が違うので，最適な種類を選べるようになりましょう．

**1.ALB**
*Application Load Balancer*
HTTP,HTTPSをサポートしています．
パスやホストのルーティングサポートをしています．
基本的にこいつ

**2.NLB**
*Network load Balancer*
TCP,TLSのサポートです．
固定IPアドレスを設定できます．
例えば，クライアントが
「ドメインじゃなくてIPでアクセスしたい」
なんて言ってきたらこいつの出番．

**3.CLB**
*Classic Load Balancer*
古いです．いりません．
簡単に説明すると，ALBの旧ver .
VPCの前の仮想ネットワークはEC2 Classicってやつでした．
なので，古参のEC2 Classicで構築されている場合はこいつ．
まあ，見ないので，気にしなくていいです．


##ELBのお仕事
※🔽このページがエラーというわけじゃ無いですのでご安心を.
![503error1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/b14063af-3362-b3ac-cad1-60af96c059b4.png)

負荷が増減すると，
負荷に応じて**自動でスケール**します．
スケーリングが間に合わないとき**503エラー**をクライアントに返します．

だんだん見えてきました？

でも，例えば
アプリのメンテ明け．
ECサイトでの新商品発売日
なんて日は，トラフィックがかなり増えます．
結果的にサーバー負荷が大きくなるでしょう．

そんな時は，
*Pre-Warming*です．
上記のように，多くの負荷が予測できる場合，
AWSに申請することが出来ます．
事前にスケーリングさせます．

ちなみにAWSコンソールではなく，
[AWSサポート](https://aws.amazon.com/jp/premiumsupport/)に申請が必要です．


##SSL Termination
![ssl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/87efd8e2-9bf6-6f91-f71d-c7ca256a2f06.png)

外部公開ではSSLはもはや必須です．
公開鍵暗号設定でセキュリティを強化してくれる仕組みですね．
オンプレでも簡単にポチッと押せばssl化してくれます．

ELBの"SSL Termination"では,
クライアント,ELB間をhttps通信
ロードバランサーとインスタンス間をhttp通信してくれます．
**通信処理の負荷が軽減出来ます**

ただ，利用する時は，ロードバランサーにSSL証明書を構成する必要があります．

##スティッキーセッション
![cookie.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/93b07c57-36eb-4191-5376-ad40b41c5ca5.jpeg)
セッションを引き継いで，cookieに設定した値を利用しながら動作する時．
例)会員制のサイトなど
ELBによって，毎回reqを同一のインスタンスに送信したいですよね？

まさしくそれを可能にするのがスティッキーセッションです．
こちらの実装方法は2つ

1.任意の有効期限の間は，同じインスタンスを使用するよ
2.アプリのCookieに従うよ

Cookieを使うアプリなら2でいいです．


この辺覚えてないと，AWSデプロイ後には苦しむかも．
1度ぶち当たると，ELBはめちゃめちゃ大切なことに気付かされた．



仮想ネットワークから復習したい方は下の記事も読んでください
[[必須]プライベートな仮想ネットワークを制御する](https://qiita.com/moyuta/items/78e50804e63d7ca70952)
寮ネットのゲートウェイサーバをリプレースした話

木更津高専 Advent Calendar 2019 5日目担当、自称学寮ネットワーク委員顧問のぴーおかです。
委員会名の通り、学寮内のネットワークインフラの管理や障害対応の業務を ~~無給で~~ しています。
先日サーバのリプレースが完了し、安定してきたので色々まとめようと思います。

## 寮ネット概要
ゲートウェイサーバが寮内サブネットと学内サブネット（外界）を繋いでおり、利用申請したMACアドレスだけを通すようにパケットを捌いています。
また、寮内の各居室及びゲートウェイサーバはL2で接続されていて、DHCPやDNSもこのサーバから配布しています。
利用者は申請書を提出し、それをネットワーク委員が承認・サーバに反映することで、外部ネットに接続できるようになります。
ところが利用申請は紙媒体のみ。そこで、「Web上で利用申請できるようにしよう！」というのが今回のリプレースの第一目標です。

## 従来のサーバにおける問題点
### MACアドレス手打ち問題
申請を適用する際はサーバにSSHログインし、申請書の内容を独自規格のCSVファイルに手動で打ち込む作業をしなければなりませんでした。
しかも反映実行時にリスト内にMACアドレスの重複や申請台数の間違いが1つでもあれば、寮生全員の外部接続が断たれるシビアな仕様です。（相部屋で共同のルータを使う寮生も多く、MACの重複は結構起こります）
そんなわけで、年度始めは200件近い申請書を血眼になって処理するのがネットワーク委員の恒例行事でした。

### 秘伝のソース化した設定反映スクリプト
設定反映はシェルスクリプトひとつ実行すれば完了するように作られていて、作業自体は非常に簡単です。（申請リストのCSVファイルに不備が無いことが前提ですが）
いざ中身を読んで見ると、スクリプトから別のスクリプトを呼び出し、また別のスクリプトを呼び出し、iptablesを設定するスクリプトを生成し、それを呼び出し...といった具合に解読が困難な状態でした。
昔はそうするしかなかったのかもしれませんが、これもどうにかしたい。

### 既存のシステムを再現する手段がない
既存のシステムに変更を加えようにも、実稼働しているサーバ上で万が一のことがあって動かなくなっては本末転倒です。
しかし、同じ環境を別マシンで再現できないことには開発に着手できません。

これらの理由から、このゲートウェイサーバを一から再設計することにしました。

## 新サーバの設計
### 利用申請Webフォームの実装
申請リストはDBで管理されるので、MAC重複の心配が無くなります。
後述するファイアウォールのルール生成もこのWebアプリが行います。

### ファイアウォール設定の簡素化
従来はiptables直接実行でしたが、簡潔にルール設定できるufwでファイアウォールを管理します。
Webアプリによって生成されたルールをcronで定期的に反映し、申請されたMACアドレスからの外部接続を許可します。

### 再現性、冪等性の確保
Ansibleを導入しました。
RedHat製の構成管理ツールで、各種パッケージのインストールや設定を自動実行でき、人的ミスも無くなります。

### アプリはできるだけDockerコンテナで駆動させる
Webアプリ用の環境構築や監視アプリを動かすのはコンテナの方が容易だと感じたからです。
実行環境のバージョンがOSのバージョンに依存しないのも魅力です。

### Prometheus+Grafanaによる監視
従来は監視にMuninを使っていたのですが、グラフの期間指定ができず不便だったので変更しました。
ざっくり説明すると、Prometheusが監視データを時系列に蓄積し、Grafanaがグラフ化して表示してくれます。
DataDogやNetDataも検討したのですが、保存期間が短かったりリアルタイム性重視でちょっと違うかなといった感じ。

## リプレース当日に見舞われた主な障害
### サーバが持つデフォルトルートのエントリが突然消える
再起動で直りましたが、原因が分からない上に立て続けに2度起こったので、安定稼働3日目の今でもちょっと怖いです。
原因分かる方コメントお願いします。

＜2019/12/13追記＞
どうやらNICオフロードが原因でインターフェースごと落ちてたみたいです。
詳細→[RHEL6 公式ドキュメント](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/network-nic-offloads)

### 申請フォームのWebページが重い
申請フォームのWebページがGoogleFontsのCDNを参照していたのが原因でした。
未申請のユーザは外部へアクセスできないため、ブラウザがタイムアウトと判断するまで読み込みが終わらない仕様になってしまったようです。

### 寮生「なんか繋がらないんだけど」
それはだいたいルーターが悪い。

## まとめ
色々使ったツールが多すぎて、一つ一つ掘り下げられなかったのが申し訳ないです。
リプレース自体はWeb申請の導入を目標として始まったのですが、それ以上にAnsibleを導入できたことのメリットが大きいなと感じています。
実際、サーバのセットアップ作業もコマンド一つで完結し、作業時間も10分ほどでした。
あとはこのシステムを今後のスタッフが使いこなせるよう、卒業までにドキュメントをしっかり書き上げたいと思います。

卒研？お察しの通りです...
【Mac】Eclipse 外観の変更（ダークテーマ）

ひとまず、自身の開発環境構築用に記載。

###1.外観をダークテーマに変更
環境設定（または「⌘,」） ＞ 一般 ＞ 外観 より「ダーク」に変更。

<img width="620" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/ff5bae45-188d-8fd5-b37e-b8d94a514538.png">


###2.色テーマを変更
環境設定（または「⌘,」） ＞ 一般 ＞ 外観 ＞ 色テーマを「Sublime Text2」に変更。
変更後は「適用して閉じる」を押下。

<img width="801" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/801247ea-14ab-06ed-2f8d-1947822b313e.png">


###3.以下のような画面が表示されるので、「OK」ボタンを押下

<img width="517" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/70367754-8c21-c37d-97dc-8203f27c7d57.png">

###4.一度、Eclipseを終了する

###5.ダークテーマ設定時に読み込んでいるCSSの修正

/Applications/Eclipse.app/Contents/Eclipse/plugins/org.eclipse.ui.themes_1.2.1.v9999-9999/css/e4-dark_mac.css

```css
CTabFolder Tree, CTabFolder Canvas {
    background-color: #2F2F2F;
    /* color: #CCC; <-- 変更前 */
    color: #ffdf7f; 
}
```

###6.Eclipseを-cleanで起動する


###7.GitまたはSVNのコミット前ファイルの文字色を変更する。
変更後は「適用して閉じる」を押下。

環境設定（または「⌘,」） > 一般 > 外観 > 色とフォント > Git

※私はコミット前のものを目立たせる設定にしてみました。

<img width="799" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/6951e84c-1fcd-1596-e220-20ed226e0c74.png">




※以降、その他にも設定追加次第、更新する予定。
Thymeleafで三項演算子を使って画像を表示する方法

Thymeleafで三項演算子を使い、画像を表示する方法を自分用メモで残します。

```
<p th:utext="${zahyou eq 1}?'<img src=&quot;./ship.png&quot;/>':' '></p>"
```
↑例

三項演算子が
```
th:utext"${条件式}?'A':'B'"
```
中に画像を埋め込むのが
```&quot;``` html内の二重引用符をエスケープするためのものです。

```utext```プレーンテキストを「<a href ..」として印刷しないようにthymeleafに指示する


##参考記事
[三項演算子](https://qiita.com/miyazawa-ta/items/a4f1b8c3fc78e15c0952)
[画像表示](https://stackoverflow.com/questions/56330195/how-to-use-anchor-link-or-html-in-ternary-operator-in-thymeleaf)
さくらVPSでサーバ構築(CentOS7.x)その２

## let's encryptでSSL証明書を発行
Let's encryptのコマンドの導入

```bash
# curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
# chmod 700 /usr/bin/certbot-auto
```

証明書の必要な情報は
サーバのdocument root、ドメイン名、メールアドレス

```bash
# certbot-auto certonly --webroot -w /var/www/html/sub1 -d sub1.domain.com

```
以下のフォルダにpemファイルが生成される。フォルダはドメイン名

```bash:/etc/letsencrypt/live/sub1.domain.com/
cert.pem
chain.pem
fullchain.pem
privkey.pem
```

## nginxのconfファイルにsslの設定行を追加

```bash:/etc/nginx/conf.d/sub1.conf
server {
    listen 80;

}
sever {
    listen 443 ssl;

    ssl_certificate     /etc/letsencrypt/live/sub1.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sub1.domain.com/privkey.pem;
}
```

nginxを再起動してブラウザでアクセス(httpsで)。

## SSL証明書の更新
Let's encryptの証明書は3ヶ月で切れるので
再取得のスクリプトをcronで更新する。

`vi /etc/cron.d/letsencrypt`

```bash:/etc/cron.d/letsencrypt
00 16 * * 0 root /usr/bin/certbot-auto renew --post-hook "systemctl restart nginx"

```
reduceを使った集計データへの変換

# 概要
配列の形で持っているデータをグループごとに集計したデータの形に変換したときの話。

こんなデータを

| グループ | 目標 | 実績 |
|:-------:|:----:|:----:|
| A       | 100  | 200  |
| A       | 100  | 50   |
| B       | 50   | 100  |

こんな形に集計する

| グループ | 目標 | 実績 |
|:-------:|:----:|:----:|
| A       | 200  | 250  |
| B       | 50   | 100  |

# 詳細
まずはreduceで呼び出す、集計処理の関数
```hasOwnProperty``` でマップに対象キーのデータが登録済みかどうかで判断している。

```javascript
const convertDataMap = function(dataMap, d) {
  const key = d.group1;
  //const key = `${d.group1}-${d.group2}`; // keyの作り方次第で複合キーでの集計も可能
  if (dataMap.hasOwnProperty(key)) {
    const tmp = Object.assign({}, dataMap[key]);
    dataMap[key] = {
      target: tmp.target + d.target,
      result: tmp.result + d.result
    }
  } else {
    dataMap[key] = {
      target: d.target,
      result: d.result
    }
  }
  return dataMap;
}
```
上記の関数を呼び出す部分
```reduce``` 内でさっきの関数を呼びだす。

```javascript
const data = [
  { "group1":"A","group2":"C", "target":100, "result":50 },
  { "group1":"A","group2":"D", "target":50, "result":50 },
  { "group1":"A","group2":"D", "target":10, "result":100 },
  { "group1":"B","group2":"D", "target":100, "result":50 },
  { "group1":"B","group2":"C", "target":50, "result":50 },
  { "group1":"B","group2":"C", "target":10, "result":100 },
]

const convertMap = data.reduce(convertDataMap, {});
```
作成後のデータの形はこんな感じ

```json:変換後データ
{
  "A": {
    "target": 160,
    "result": 200
  },
  "B": {
    "target": 160,
    "result": 200
  }
}
```

データを配列の形にしたい場合は、以下のような処理をしてあげると

```javascript
const _data = [...Object.entries(convertMap)].map(([key, value]) =>({key, value}));
```
配列になる（value の部分もフラットにしたい場合は、上記の関数のmap内の処理を書き換えてください）

```json:変換後データ
[
  {
    "key": "A",
    "value": {
      "target": 160,
      "result": 200
    }
  },
  {
    "key": "B",
    "value": {
      "target": 160,
      "result": 200
    }
  }
]
```



# まとめ
サーバー側で集計まで処理して返すことは結構あったが、JavaScriptでやるのは何気に初めてだった。

画面側で集計処理できれば、集計キーが複数あった場合の階層を変更してもリクエスト投げずに処理できてしまうので、今後も使いどころはあるかも。。。
CatalinaでMT4を動かす

# きっかけ
　何も知らずにCatalinaにアップデートしてしまい，EasyWineが動かないことに気づく・・・。

# 今までは
　EasyWineのおかげで、快適なFX生活だったはず・・・。

# そもそもWineって
　Unix系OSでWindowsアプリケーションを動かすめっちゃすごいやつ。

# 目指すゴール
　BootCampを使わずに，MT4が使いたい！！

# Vitural Boxをインストール
　[Oracleの公式](https://www.oracle.com/virtualization/technologies/vm/downloads/virtualbox-downloads.html#vbox)よりダウンロードします。
　ゴニョゴニョってインストール！
![スクリーンショット 2019-12-03 17.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/c4a11c5e-a98e-7a9f-131b-11b242e9a63e.png)
![スクリーンショット 2019-12-03 17.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/f6bd8c1a-3347-668f-3fc9-8d6797dae6bc.png)

# UbuntuMATEを仮想環境上にセットアップ
　なんとなくUbuntuMATEを使いたかったので、[公式](https://ubuntu-mate.org/download/)よりイメージをダウンロードする。32bit版をダウンロードしました！
落としてきたイメージを仮想環境の光学ドライブに入れて起動します。
![スクリーンショット 2019-12-03 17.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/1ceb8a46-8f25-de48-9a67-7eaa965a868b.png)
![スクリーンショット 2019-12-03 17.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/959b1b91-a159-f4be-2227-df342c0913d3.png)
![スクリーンショット 2019-12-03 18.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/df738af4-c632-f9ec-bce8-33b304050a88.png)


# Wineのインストール
まず，Wineを入れます。
システムが64ビットの場合，32ビットアーキテクチャを有効にします。

```sh
sudo dpkg --add-architecture i386 
```

キーを追加します。

```sh
wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo apt-key add winehq.key
```

Ubuntu 19.10の場合

```sh
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ eoan main' 
```

Ubuntu 19.04の場合

```sh
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ disco main' 
```

Ubuntu 18.04の場合

```sh
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main' 
```

Ubuntu 16.04の場合

```sh
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ xenial main' 
```

アップデートして，安定版を入れます。

```sh
sudo apt update
sudo apt install --install-recommends -y winehq-stable
```

次に豆腐フォントを修正するパッケージを入れます。

```sh
sudo apt install -y winetricks
winetricks cjkfonts
```

インストールを押します。
![mono.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/80f36e3c-83e9-edbf-d8fa-5a877640b925.png)

インストールを押します。
![gekko.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/6c670a65-e8b1-a698-7095-27ded7c9fcee.png)

# MT4のインストール
　MT4をダウンロードします。
![スクリーンショット 2019-12-03 18.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/aa6d7e25-7ea0-1a5a-90c9-c82f5217a283.png)

コンソールからダウンロード先のディレクトリに移動して

```sh
chmod +x xmtrading4setup.exe
wine xmtrading4setup.exe
```

![スクリーンショット 2019-12-03 18.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/2518d2a7-fb12-846b-a605-d1496252c355.png)

![スクリーンショット 2019-12-03 18.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531802/aa9aa326-0e43-8419-6471-ae6020c75b46.png)


以上！
快適なFXライフをお楽しみください！

# 参考文献
[UbuntuでMT4 - Qiita](https://qiita.com/fxst24/items/007ba0c4336b1d699f15)
[Wineのパッケージのインストール](https://wiki.winehq.org/Ubuntu)
RaspberryPi3を使って統合版Minecraftサーバーを作る方法

#前置き
Realmsが期限切れになったのと、ワールドがセーブされないことがあったので
試しにラズパイを使ってサーバーを作ってみることにしました

Minecraft公式が配布しているサーバーソフトウェアはARMチップに対応しておらず
ラズパイでは動かせない為、NukkitXというサーバーソフトウェアを使用します
#準備
NukkitXはJavaを使用します。RaspbianのLiteバージョンの場合、Javaが入っていないようなので以下のコマンドを実行してJavaをインストールしてください

```
sudo apt-get install openjdk-11-jdk 
```
以下のURLにアクセスしてサーバーjarをダウンロードします
>https://ci.nukkitx.com/job/NukkitX/job/Nukkit/job/master/
![nukkitx_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/bebc45d4-ee57-46d4-a852-793b40d29c37.png)

jarファイルの保存が出来たら、作業・管理しやすい場所にフォルダーを作成してjarファイルを移動させてください
**※今回はデスクトップに作ります**
cdコマンドを使用して作成したフォルダーに移動します

```
cd /home/pi/Desktop/作成したフォルダーの名前
```
次に起動するためのスクリプトファイルを作成します
[Wiki](https://nukkitx.com/wiki/nukkit-installation/#linux)では1GBを割り当てていますが、RaspberryPi3は全体で1GBしかないので512MBを割り当てます

```start.sh
#!/bin/sh

java -Xms512M -Xmx512M -jar nukkit-1.0-SNAPSHOT.jar
```
##起動
**サーバー完成まであと一歩です！**

サーバーを起動しましょう

```
./start.sh
```
![nukkitx_qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/d3224459-84b1-3a2e-55ac-12e636de29c1.png)
このようにファイルが生成されていれば成功です👍
次にコンソールでの作業を行います
![nukkitx_qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/5657d5fa-b33a-68dd-c92c-48d598917ad7.png)
特にこだわりがなければ日本語でいいと思うので、jpnを入力します
![nukkitx_qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/d85dec10-22fb-9236-5184-a3e07584c146.png)
「起動完了」が表示されればOKです
それでは試しに参加してみましょう
「フレンド」タブに表示されているLANゲームを押すと参加できます
![nukkitx_qiita5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/3c389162-62f1-8e61-bcd6-8d7d6813d530.jpeg)
`ip a`でローカルIPを確認して「サーバーを追加」に入力しても参加できます
![nukkitx_qiita6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/5f9351c7-4555-414e-c6fd-414a1f1a02e5.jpeg)
![nukkitx_qiita7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/d4d4bec1-752b-11c0-05a1-af89f63c66cb.jpeg)
参加できれば完成です。お疲れさまでした🎉🎉


#感想
5分ほど遊んでみましたが、ラグもほとんどなく2、3人でなら全然いけるのでは！？っといった印象です
ただ、Mobが発生しない・スポーンエッグで出しても動かないなどのバグもあるので、スナップショットから正式リリースになった際にもう一度試そうと思います。
また、ワールドとネザーを行き来した際にかなりひどいラグが発生するので、いつかラズパイ4を買って改善されるかどうかの検証もしたいと思います。
ここまで読んでいただいてありがとうございました！！
BigQueryのスキーマ変更あたりのドキュメントを改めて読んだメモ

### [対象ドキュメント](https://cloud.google.com/bigquery/docs/managing-table-schemas?hl=ja)



# スキーマの指定

- BigQueryのスキーマを指定する方法は以下のいずれか
  - GCPConsoleを使用する
  - 従来の BigQuery ウェブ UI を使用する
  - CLI を使用してインラインで指定する
     - JSON 形式のスキーマ ファイルを作成する
  - APIで作る

### 手動でのスキーマの指定

- UI, bq client, スクリプトでスキーマ設定できる
  - 運用が楽そうなのは、 bq client + jsonでのスキーマ管理
    - コード管理できるのが良い
    - スクリプト書いてもいいけど、bq clientの方が楽そう

### JSON スキーマ ファイルの指定

bq client使って既存のテーブルからjsonとる

```bash

bq show --schema --format=prettyjson project_id:dataset.table > path_to_file
```

bq client使ってJSONのスキーマファイル使って空テーブル作成する

```bash
bq mk --table project_id:dataset.table path_to_schema_file

```

bq client使って、用意したJSONスキーマファイルのテーブルを作成し、csvファイルのデータをloadする

```bash
bq load --source_format=CSV mydataset.mytable ./myfile.csv ./myschema.json
```

# スキーマの自動検出
- データソース内のファイルをランダムに選出
- ファイルの最大100行をスキャンして推定する
- 大きいファイルだと結構失敗するので、個人的には、String, nullableでとりあえず、BQ tableに突っ込んで、後からparseしていくのがおすすめ

# スキーマの変更

- モードが required -> nullalble は可能。
- 以下はできない
  - カラム名変更
  - データ型変更
  - モード変更(required -> nullable以外)
  - 列の削除
  - requiredの列の追加

nullableの列の追加などであれば、`bq update` でやるのが良さそう

まずは既存テーブルからJSONスキーマを取得し

```bash
bq show --schema --format=prettyjson mydataset.mytable > /tmp/myschema.json
```

手元でJSONスキーマに、追加した列を追加して、bq updateコマンドを叩く

```bash
bq update project_id:dataset.table schema
```

# テーブルスキーマの手動変更

### 列の名前変更 & 列のモード変更 & 列の削除
`bq update`　ではできなかった、列の名前変更や、列のモード変更や、列の削除は、以下の2つの実現方法がある

#### 1. SQLを使用する
  - 簡単だが、金額的コストがかかる
    - カラム名を変更した結果となるSQLを書いて、自身のテーブルを上書きする
  - `bq --replace` を使うのが楽そう
  - 以下のようにすると、列の名前が変更できる
  - 超巨大なサイズのテーブルでなければこれがいいと思う

```bash

bq query --destination_table mydataset.mytable --replace --use_legacy_sql=false \
'SELECT
  * EXCEPT(column_one, column_two),
  column_one AS newcolumn_one,
  column_two AS newcolumn_two
FROM
  mydataset.mytable'
```

#### 2. GCSにexportしてから取り込む
  - 面倒だが、金額的コストはかからない
  - exportジョブも読み込みジョブも無料
GCPでgcloudコマンドを利用する

## はじめに
GCPのCompute EngineでCentOS8のサーバを作成した。
gcloudコマンドはデフォルトでインストールされているらしく、すぐに利用できた。
と思ったが、以下のコマンドでスナップショット一覧を確認すると怒られた…

```
$ gcloud compute snapshots list
ERROR: (gcloud.compute.snapshots.list) Some requests did not succeed:
 - Insufficient Permission: Request had insufficient authentication scopes.
```

## Cloud SDK ツールの承認
詳細は以下のURLに記載がありますが、Cloud SDKツールを承認させる必要があるとのこと。

https://cloud.google.com/sdk/docs/authorizing?hl=ja

gcloud auth loginコマンドを実行

```
$ gcloud auth login

You are running on a Google Compute Engine virtual machine.
It is recommended that you use service accounts for authentication.

You can run:

  $ gcloud config set account `ACCOUNT`

to switch accounts if necessary.

Your credentials may be visible to others with access to this
virtual machine. Are you sure you want to authenticate with
your personal account?

Do you want to continue (Y/n)?  Y
```

つらつらと表示されるが、続けるべくYを押下。

```
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?code_challenge=jNfasfasforuaaf87anfda17nagagadfasdo&prompt=select_account&code_challenge_method=S256&access_type=offline&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=44456445.5533453.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.admin+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcompute+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth
```

するとこんな感じのURLが表示されるので、ブラウザで表示してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527863/cfc67bde-2596-c2c8-1747-ef3aa0f9a343.png)

googleアカウントのメールアドレス、パスワードでログイン。
すると以下の表示になるので、許可を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527863/545fd017-447e-791c-dc16-217641ad6101.png)


コードが表示されるので、コピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527863/abd4e1e6-b844-00a1-c681-1445237f7e8e.png)

で、ターミナルにもどりコピーしたコードを入力します。

```
Enter verification code: ここにコード入力
```

これで、Cloud SDKツールの承認が終わりです。

```
You are now logged in as [someone@example.jp].
Your current project is [yourproject-0000000].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID
```

## gcloudコマンドを試す
実際に試してみよう。

```
$ gcloud compute snapshots list 
NAME                       DISK_SIZE_GB  SRC_DISK                         STATUS
sample-snapshot-20190611   100           asia-northeast1-b/disks/server2  READY
webserver2-snap-20191203   100           asia-northeast1-b/disks/server2  READY
```

こんな感じでGCPのプロジェクトに対して、gcloudコマンドが使えるようになりました。
Catapult(NEM2) AccountRestrictionの機能

NEMとは、Catapultとは:point_down:
https://nemtech.github.io/ja/getting-started/what-is-nem.html
https://nemtech.github.io/ja/

NEMはパブリックチェーン、Catapultはブロックチェーンのコアエンジンです。
レッドブル・ホンダF1チームのエンジンはホンダですが、レッドブル・ホンダはホンダではありません。ホンダエンジンを積んでいるだけで、あくまでレッドブル・ホンダF1チームです。そういうことです。

# AccountRestriction

- Account(アカウント)
- Restriction(制限)

名前の通り、アカウントに制限をかける機能がCatapultにあります。具体的には、自身が管理するアドレスに特定のモザイクが振り込まれないように例外的に拒否したり、基本的にどのアドレスからの送金も受け付けないかわりに、例外的に特定のアドレスからの送金を許可したりすることができます。

https://nemtech.github.io/ja/concepts/account-restriction.html

これは "人間" が "社会" でパプリックブロックチェーンを扱うのに、とても重要になる機能のひとつです。

# 3つの制限

AccountRestrictionの機能には3つの種類があります。それぞれ以下の通りです。

1. アドレス制限 (特定のアドレスからの送金などを拒否・許可する)
2. モザイク制限 (特定のモザイクの受取を拒否・許可する)
3. 操作制限 (特定のトランザクションの送信などを拒否・許可する)

# 使用されるトランザクション

拒否・許可を行うには、他のノードに ___「私は拒否・許可します」___ という旨を伝えて、認めてもらわないといけません。つまり、意思表示のためのトランザクションを送り、それがブロックチェーンに含まれたはじめて制限をかけることが出来ます。

意思表示に使うトランザクションはそれぞれ、以下の通りです。

1. アドレス制限 => AccountAddressRestrictionTransaction
2. モザイク制限 => AccountMosaicRestrictionTransaction
3. 操作制限 => AccountOperationRestrictionTransaction

それぞれ見ていきましょう。

# アドレス制限

特定のアドレスからの拒否・許可の制限をかけます。

アドレス制限に限らず、他の2つとも共通であるのが、`Block`と`Allow`という基本的な制限方針に、例外を加えていくというやり方で制限を決めます。

![20191012-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/40576489-3157-70e0-720d-8a635079dd35.png)

### Block

原則OK、例外的に、NGなアドレスを指定します。

### Allow

原則NG、例外的に、OKなアドレスを指定します。

これらは、同時に設定することは出来ません。最初に`Block`の基本方針を取った場合に、後から基本方針を`Allow`に変更したければ、一度全ての`Block`指定を外す必要があります。ニュートラルな（通常の）アカウントの状態になれば、`Allow`指定で制限の設定を再開できます。

typescriptのSDKでトランザクションを作ってみると、以下のようになります。

```ts
import * as nem from 'nem2-sdk';

// 基本的な制限方針
const restrictionType = nem.AccountRestrictionType.BlockIncomingAddress;
// 例外指定
const action = nem.AccountRestrictionModificationAction.Add;
const targetAddress = nem.Address.createFromRawAddress('例外となるアドレスをここに');
const modifications = [
  nem.AccountRestrictionModification.createForAddress(action, targetAddress)
];
// Txの作成
const accountRestrictionTx = nem.AccountRestrictionTransaction.createAddressRestrictionModificationTransaction(
  nem.Deadline.create(),
  restrictionType,
  modifications,
  netType
);

// 発行者アカウントを作成して
const modifiedAccount = nem.Account.createFromPrivateKey('制限元アドレスの秘密鍵をここに', netType);
// 署名
const signedTx = modifiedAccount.sign(accountRestrictionTx, 'ネメシスジェネレーションハッシュをここに');

// あとは、TransactionHttpでsignedTxを送信すればOK
```

上記の場合、基本的にはOKですが、例外的に指定したアドレスからの送金がブロックされるようになります。

ちなみに、制限には `Outgoing (アドレス "から" の送金制限)` と `Incoming (アドレス "へ" の送金制限)` があるので、必要な制限を考えてカスタマイズしてください。

![20191012-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/38f54535-139b-2bd6-8f17-b4fd487f5122.png)

# モザイク制限

アカウント制限を理解できれば、それのモザイク版だと思ってもらって大丈夫です。

ただし、モザイク制限にはアドレス制限でいうところの `Incoming` の設定しか無いことに注意です。そとから来るモザイクを弾くことは出来ますが、そのアドレスから発信されるモザイクを制限することは出来ないということです。

# 操作制限

簡単に言えば、そのアドレスから発信できるトランザクションの発信に制限をかけます。これは、誤って望まない種類のトランザクションを発信してしまうことがないようにするためのセーフティロックの役割を果たします。

「金庫として使っているので予定にないトランザクションを誤って投げたりすると嫌だな」と思ったら設定しましょう。

# 総評

いいね！
seleniumでログイン用の簡単なRPAをやってみた

#きっかけ
飲み会の席で、会社の同僚がRPAで勤怠の自動入力をしてくれるプログラムを作ったということを聞きました。
そこで彼の話からseleniumの存在を知り、自分も触ってみたいと思いました。

導入には下記サイトを参考にさせていただきました。

【超便利】PythonとSeleniumでブラウザを自動操作する方法まとめ
[https://tanuhack.com/selenium/](https://tanuhack.com/selenium/)

つまづいた点として、Google Chromeとchromedriverのバージョンを合わせる必要がありました。
12/3日時点ではGoogle Chromeの最新バージョンが78なのに対し、
chromedriverの最新版はベータ版の79用のものでした。
そのため、chromedriverの最新版では動きませんでしたので改めて78用をダウンロードしました。


#作ったもの
ブラウザを起動し、AWSのマネジメントコンソールにログインしてくれるプログラムを作りました。

まずはモジュールのインポートです。

```aws.py
from selenium import webdriver
```

次に、関数を2つ作成しました。
send_idは、htmlの中の入力フォームのidを指定し、その入力フォームに対してkeyを入力します。
id_clickは、htmlの中の送信ボタンのidを指定し、そこをクリックします。

```aws.py
#idの入力フォームにkeyを入力
def id_send(id,key):
    driver.find_element_by_id(id).send_keys(key)

#idのボタンをクリック
def id_click(id):
    driver.find_element_by_id(id).click()
```

次に、ローカルにあるクローム用のドライバーを指定します。
開くブラウザはAWSのマネジメントコンソールです。

```aws.py
#ローカルにあるクローム用のドライバーを指定
driver = webdriver.Chrome('C:\\Users\\username\\Desktop\\selenium\\chromedriver')

#ブラウザを開く
driver.get('https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#')
```

開かれたブラウザでF12、入力フォームの情報を探します…(htmlの知識が全然ないので手探り)
`id="resolved_inut"`ってやつがそれっぽいですね。
![キャプチャ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389437/d5272822-c2d6-cf62-5452-b8ba1862134c.png)

では、ここにアカウントIDを入力&送信するように、作った関数を使います。
アカウントIDのところには実際には12桁の数字を入れます。

```aws.py
#1つ目の画面の入力、送信
id_send('resolving_input','アカウントID')
id_click('next_button')
```

するとアカウントIDが入力されて…
![キャプチャ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389437/30e77c94-41d1-2fd9-2dc1-82535a37e882.png)

次のページに飛びました。
![キャプチャ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389437/fb3115f2-e16e-ec89-c6c5-c9975cacde54.png)

ここでも同じようにユーザー名、パスワードの入力フォームのIDを探し、プログラムに落とし込みます。

```aws.py
id_send('username','username')
id_send('password','password')
id_click('signin_button')
```

そして無事に送信されると、ログインできました。
![キャプチャ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389437/5eed4e67-8466-6a78-273b-a1fcced37313.png)

以上が今回のプログラムでした。

#感想・今後の課題
今回はこの程度の簡単なログインでしたが、htmlやcss、javascriptについてもっと勉強すれば、
自動化の幅も広がりそうだなーと感じました。
自分でサイトを作ってみたりしながら知識を深めたいです。
Androidアプリのデバッグ中に "Source code does not match the bytecode"というエラーが出る

# エラー内容

Android Studioでアプリをデバッグ中に、以下の画像に示す
`Source code does not match the bytecode`
というエラーが出て正常にデバッグができない際の対処法です。

<img width="283" alt="ZLHg5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189802/a0b50b8b-f472-339e-19fd-dedccf82357f.png">

# 原因
Gradleで参照しているコードが最新版でない。

# 解決方法
## その1
以下のコマンドを実行して、Gradleの依存関係をリフレッシュする。

```
./gradlew build --refresh-dependencies
```

# 参考
https://stackoverflow.com/questions/39990752/source-code-does-not-match-the-bytecode-when-debugging-on-a-device