OmniAICreator/Qiita-1.07M huggingface dataset:
R(R studio)からAWSを利用

#はじめに
aws環境に建てられた分析環境(EC2,Redshit,S3等の鉄板構成)でデータ分析を行うとき、
なんらかのsqlクライアントでredshiftからデータ引っ張って、rやpythonでデータを弄り、webブラウザやcli等でs3にデータを置いて、、、などがよくある作業だと思います。
これらの作業をR studioやjupyter notebook 上でsdk用いてワンストップで実行したくなる時がありますが、
Rに関してググっても情報が少なかったり古かったりしたので、tipsとしてまとめます。
適宜更新予定。

#S3
とりあえずパッケージ用意

```r
install.packages("aws.s3", dependencies = TRUE)
library(aws.s3)
```

###接続設定
やり方2だと以降のオブジェクト取得の関数などが動かず多く、
結局やり方1のように環境変数を設定しなければいけませんでした。
おそらく~/.aws/.credentialgにregion記載がないからなのですが、.configのほうを見に行く関数が見当たりません。。

```r
# 1.環境変数によって設定
Sys.setenv(
    "AWS_DEFAULT_REGION" = "<REGION>",
    "AWS_ACCESS_KEY_ID" = "<ACCESS_KEY_ID>",
    "AWS_SECRET_ACCESS_KEY" = "<SECRET_ACCESS_KEY>"
)
# 上記は秘匿するために~/Documents/.Rprofile上に記載が推奨

# 2.aws cliで発行するconfigureのアカウント情報の利用
# defaultのアカウント情報を用いた署名
aws.signature::use_credentials()
# ユーザのアカウント情報を利用する場合
aws.signature::use_credentials(profile = "xxx")

```

###バケット・オブジェクトの表示

```r
# バケット一覧表示
aws.s3::bucketlist()
# バケットに含まれるオブジェクトの表示
aws.s3::get_bucket("bucket_name")

```

###RとS3でのデータのやり取り
```r
# R上のデータをバケットへ保存
mtcars
aws.s3::s3save(mtcars, bucket = "bucket_name", object = "/prefix/object")

# S3オブジェクトを取得しメモリへ読み込み
x <-aws.s3::get_object(bucket = "bucket_name", object = "/prefix/object")
load(rawConnection(x))
"mtcars" %in% ls()

# S3オブジェクトを取得し保存
y <- save_object(bucket = "bucket_name", object = "/prefix/object")
y %in% dir()
```



#Redshift
当初JDBCで頑張ろうとしましたが、rjavaのexceptionが一生解決できず、psqlに逃げてきました。
とりあえずパッケージ用意

```r
install.packages("RPostgreSQL")
library(RPostgreSQL)
```

###接続設定

```r
drv <- dbDriver("PostgreSQL")
con <-dbConnect(drv,host='host_url',port='5439',dbname='dbname',user='user_name',password='pass')

# 上記は接続上は~/Documents/.Rprofile上に以下のように記載してあれば
Sys.setenv(
    "AWS_REDSHIFT_HOST" = "<host_url>",
    "AWS_REDSHIFT_PORT" = "5439",
    "AWS_REDSHIFT_DB" = "<dbname>",
    "AWS_REDSHIFT_USER" = "<user_name>",
    "AWS_REDSHIFT_PASS" = "<pass>"
)
# 以下のように呼び出せる
con <-dbConnect(drv,host=Sys.getenv("AWS_REDSHIFT_HOST")
	,port=Sys.getenv("AWS_REDSHIFT_PORT")
	,dbname=Sys.getenv("AWS_REDSHIFT_DB")
	,user=Sys.getenv("AWS_REDSHIFT_USER")
	,password=Sys.getenv("AWS_REDSHIFT_PASS")
	)

```

###テーブル一覧取得

```r
dbListTables(con)
```

###クエリ発行

```r
rs <- dbSendQuery(con,"select * from table_name")
data <- dbFetch(rs)
dbClearResult(rs)
```

### テキストファイルからクエリ発行

```r
install.packages("magrittr")
library(magrittr)

scan_query <- function(query_path) {
    return (
        scan(query_path, what='', quote='', sep='\n', comment.char = '', encoding='UTF-8') %>% 
            gsub(pattern='--.*$', replacement='') %>% # 正規表現でコメントアウトを消す
            paste0(collapse=' ')
    )
}

# ファイルパスからSQLを読み込む
sql <- scan_query('./test.sql')

rs <- dbSendQuery(con,sql)
data <- dbFetch(rs)
class(dbFetch(rs))
```
###エンコードの調整
```r
rs <- dbSendQuery(con,sql)
data <- dbFetch(rs)
dbClearResult(rs)

# Redshiftから読み込んだutf8をWindows上のR環境で文字化けしないように調整
data_conv <- data.frame(lapply(data, iconv, from = "utf-8", to = "cp932"))
```



#参考
https://kiito.hatenablog.com/entry/2016/04/25/211105
https://cran.r-project.org/web/packages/RPostgreSQL/RPostgreSQL.pdf
https://www.rdocumentation.org/packages/aws.s3/versions/0.2.1
SysdigでBlackbox Exporterを（無理やり）使って監視する

# 目的

SysdigはSaaS型のモニタリングサービスです。IBM Cloudでは[IBM Cloud Monitoring with Sysdig](https://cloud.ibm.com/docs/Monitoring-with-Sysdig?topic=Sysdig-about&locale=ja)サービスとして利用することができます。

一方Blackbox ExporterはPrometheusのためのエクスポーターです。指定したURLやホストのHTTPレベルやソケットレベルでの死活監視を行うことができます。

Sysdigは専用のエージェントでメトリクスを収集しますが、Prometheus形式のメトリクスにも対応しています。今回はBlackbox Exporterによる外部サービスの死活監視結果をSysdigに（無理やり）表示してみます。

# 手順

## Sysdigのセットアップ

Sysdigはすでにオーダー済とします。

> https://docs.sysdig.com/en/setting-up-the-environment.html

エージェントをデプロイする際に、次の環境変数をenvに追加します。


```
- name: ADDITIONAL_CONF
  value: "prometheus:\n  enabled: true"
```

## Blackbox Exporterを実行

次のようなマニフェストでPodをデプロイします。ここでのポイントは2つです。

* Blackbox ExporterはデフォルトでIPv6での通信をしてしまうのでIPv4に変更
* Sysdigがスクレイプしてくれるようアノテーションを追加
* ``prometheus.io/path``で``target=監視対象&モジュール名``を指定

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: blackbox-config
data:
  config.yml: |
    modules:
      http_2xx:
        prober: http
        http:
          preferred_ip_protocol: ipv4 # 追加
      http_post_2xx:
        prober: http
        http:
          method: POST
      tcp_connect:
        prober: tcp
      pop3s_banner:
        prober: tcp
        tcp:
          query_response:
          - expect: "^+OK"
          tls: true
          tls_config:
            insecure_skip_verify: false
      ssh_banner:
        prober: tcp
        tcp:
          query_response:
          - expect: "^SSH-2.0-"
      irc_banner:
        prober: tcp
        tcp:
          query_response:
          - send: "NICK prober"
          - send: "USER prober prober prober :prober"
          - expect: "PING :([^ ]+)"
            send: "PONG ${1}"
          - expect: "^:[^ ]+ 001"
      icmp:
        prober: icmp
---
apiVersion: v1
kind: Pod
metadata:
  annotations:
    prometheus.io/path: /probe?target=https://www.google.com/&module=http_2xx # 監視対象
    prometheus.io/port: "9115"
    prometheus.io/scrape: "true"
  name: blackbox-exporter
spec:
  containers:
  - name: blackbox-exporter
    image: prom/blackbox-exporter
    volumeMounts:
    - name: blackbox-config
      mountPath: /etc/blackbox_exporter/
      readOnly: true
  volumes:
  - name: blackbox-config
    configMap:
      name: blackbox-config
```

## Sysdigダッシュボードで確認

スクレイプされるまで数分待ちます。その後ダッシュボードでパネルを追加し、Blackbox Exportのメトリクスである``probe_success``が選択できるようになっていればOKです。0は失敗、1は成功ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/996f1dc1-df1e-db4b-ad80-917018d8d522.png)

# 考慮点

Prometheusに詳しい方なら気づいたと思いますが、この方式では監視対象ごとにBlackbox ExporterのPodを起動する必要があります。Prometheusの場合は監視対象がいくつあってもBlackbox Exporterは1つあればいいので。Sysdigで外部サービスの死活監視をしたい場合の苦肉の策と理解ください（もっといい方法があれば教えてください）。
Pythonで シグナルをトラップするサンプルスクリプト


# 目的
シグナルの勉強をしてて、SIGTERMをトラップするスクリプトをメモとして残します

# 参考
こちらを参考にしました
https://engineeringnote.hateblo.jp/entry/python/signal

# スクリプト

``` signal.py
import signal
import time
from threading import Thread

FLAG = False

def handler(signum, frame):
    global FLAG
    print("signal={}".format(signum))
    FLAG = True

def waiting():
    global FLAG
    while not FLAG:
        print("Waiting for signal...")
        time.sleep(5)

t1 = Thread(target=waiting, args=[])
t2 = Thread(target=waiting, args=[])
t1.start()
t2.start()

signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGINT, handler)
signal.pause()
```

# 挙動

```shell

python signale.py 
Waiting for signal...
Waiting for signal...
```

# プロセスの確認

```shell
ps aux | grep test
ec2-user 21269  0.0  0.1 275896  9144 pts/1    Sl+  16:40   0:00 python36 test.py
```

# SIGTERM の発行
```
kill -SIGTERM 21269
```

# トラップされたことを確認
```
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
Waiting for signal...
signal=15
```
AWSで配信をしてみる準備 (Cloud Frontを介してS3にアクセス)

自分用メモ。

以前書いたShaka Packagerを使った配信環境を構築してみるにあたって、CDNを介した環境を作ってみたいと思った。
Shaka Packagerを使った配信環境はEC2で構築してみようと思ったので、オリジンはS3で、EdgeとしてCloud Frontを使ってみることに。

Cloud Frontを介したほうが安いのか、S3のみを使ったほうが安いかは調べてない。

## やりたいこと

S3へのコンテンツへのアクセスをCloud Frontからのアクセスに限定して、S3のオブジェクトへの直接のアクセス (XXXX.s3-ap-northeast-1.amazonaws.com のURLでのアクセス) をさせないこともついでにやろうと思った、なぜか。

色々ドキュメントを探したところ、端的に書いていたのはこのページだった。
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

以下のページから辿った。
https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html


## バケットの設定

バケットの「アクセス権限」 > 「ブロックパブリックアクセス」について。
今回、パブリックアクセスは許可しないので、全部ブロック（「パブリックアクセスを全てブロック」が「オン」の状態）で良い。


## Cloud Frontの設定

1. 先にDistributionを作成していたので、作成済みのDistributionを選択し「Origins and Origin Groups」タブを選択。
2. 「Origins」のセクションで「Create Origin」ボタンを押下
3. 表示された画面で、「Origin Domain Name」にて作成済みのバケットのドメインを選択する。自動でOrigin IDが入るので、それは編集しない。
4. 「Restrict Bucket Access」でYesを選択する。
5. 後の項目はヘルプでも読みながら選択・入力すれば迷うことはない。


ちなみに、 「Grant Read Permissions on Bucket」で「Yes, Update Bucket Policy」を選んでおくと、バケットの「バケットポリシー」にOAIを使ったポリシーが勝手に更新されてくれた。

## 動作確認

バケットに適当なファイルを置いて、以下を確認した。

- S3のバケットのURLでファイルにアクセス → アクセスできないこと
- Cloud FrontのURLでファイルにアクセス → アクセスできること
- S3のバケットのURLでルートフォルダにアクセス → アクセスできないこと
- Cloud FrontのURLでルートフォルダにアクセス → アクセスできないこと



---

感想
EC2は以前から開発環境として使っていたけど、初めてそれ以外を使ってみた。
AWSを知っている人はすごいんだなと思った。
触り始めたので個人的な書き方のメモ

編集中。

# メモ
これはメモです。

# ソース

まずはダーッとソースを貼る。公式の使い方を見つつ適当に切ったり貼ったり。
gitとかで差分管理しながらやればいいんだろうけど、そういうの苦手。メモを大枠でどかっと載せて、あとから分解していこう作戦。気が向いたら更新。

```golang
package gcp

import (
	"context"
	"crypto/tls"
	"crypto/x509"
	"encoding/base64"
	"fmt"
	"net/http"

	"k8s.io/client-go/rest"
	"k8s.io/client-go/kubernetes"
	// istioはやりたいことに合わせてどれをimportするか変える
	// 一覧：https://godoc.org/istio.io/client-go/pkg/clientset
	// kubernatesと同じでclientsetから一通りのクライアント（とバージョンの組み合わせ）が取れる
	istio "istio.io/client-go/pkg/clientset/versioned"
	"golang.org/x/build/kubernetes"
	"google.golang.org/api/container/v1"
)

// SetupRestConfig returns an kube rest config.
func SetupRestConfig(cluster container.Cluster) (rest.Config, error) {
	// Decode certs
	// Base64で加工してあるからもとに戻す
	decode := func(which string, cert string) []byte {
		if err != nil {
			return nil
		}
		s, decErr := base64.StdEncoding.DecodeString(cert)
		if decErr != nil {
			err = fmt.Errorf("error decoding %s cert: %v", which, decErr)
		}
		return []byte(s)
	}
	clientCert := decode("client cert", cluster.MasterAuth.ClientCertificate)
	clientKey := decode("client key", cluster.MasterAuth.ClientKey)
	caCert := decode("cluster cert", cluster.MasterAuth.ClusterCaCertificate)
	if err != nil {
		return nil, err
	}

	return rest.Config {
		Host: cluster.Endpoint,
		TLSClientConfig {
			// 検証スキップフラグ
			// Insecure: true
			// サーバー名はよくわからないこんな感じでいけるだろうか
			ServerName: cluster.Endpoint,
			CertData: clientCert,
			KeyData: clientKey,
			CAData: caCert,
		}
	}
}

// GetCluster クラスター情報の取得
func GetCluster(ctx context.Context, name string, project string, zone string) (container.Cluster, error) {
	containerService, err := container.New()
	if err != nil {
		return nil, fmt.Errorf("could not create client for Google Container Engine: %v", err)
	}
	return containerService.Projects.Zones.Clusters.Get(project, zone, name).Context(ctx).Do()
}

// NewKubernatesClient kubernatesのclientsetを作って返す
func NewKubernatesClientset(ctx context.Context, cluster string, project string , zone string) (*kubernates.Clientset, error) {
	cluster, err := GetCluster(ctx, cluster, project, zone)
	if err != nil {
		return nil, err
	}

	config, err := SetupRestConfig(cluster)
	if err != nil {
		return nil, err
	}

	return kubernetes.NewForConfig(config)
}

// NewIstioNetworkClient 
// 以下を見ながら適当に使いたいものを引っ張ってくる
// https://godoc.org/istio.io/client-go
func NewIstioClientset(ctx context.Context, cluster string, project string , zone string) (*istio.Clientset, error) {
	cluster, err := GetCluster(ctx, cluster, project, zone)
	if err != nil {
		return nil, err
	}

	config, err := SetupRestConfig(cluster)
	if err != nil {
		return nil, err
	}

	return istio.NewForConfig(config)
}
```
STM32+IAR EW+CubeMXで環境構築～書込み

初投稿です。
IAR Embedded Workbenchを使ったSTM32マイコンの環境構築について書かれた記事がなかったので、リマインドとして記録しておきます。

# 環境
Windows10

# 準備
・STM32マイコン（STM32F401RET6 Nucleo）
・USBケーブル

# 接続
Nucleoを使用する場合、別売りの書き込み器は不要。
PCとUSBケーブルで接続できればOK。

#インストールするもの（手順は後で記載）
STM32 ST-LINK Utility v4.0.0：書込みツール
IAR Embebeded Workbench(IAR EW)：統合開発環境
cubemx：コード自動生成ツール

# 構築手順
### ST-LINK Utilityのインストール

以下公式サイトからST-LINK Utility（STSW-LINK004）をダウンロードしてインストールする。
https://www.st.com/content/st_com/ja/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stsw-link004.html

ダウンロードにはライセンス登録が必要となる。面倒。
詳細な流れは以下のサイトが詳しい。
http://tri-s.world.coocan.jp/SfStS_N64/ST_LINK/Install_ST_LINK.html

### Firmwareのアップデート
初期状態のままではマイコンにリセットがかかったままになり、動作しない（らしい）ので、ST-LINK Utilityを使用してFirmwareのアップデートを行う。

ST-LINK Utility を開き、S-LINK > Firmware update を選択する。
マイコンを接続した状態でDevice Connectを押すと以下の画面が出るので、Yes >>>>をクリックして成功すれば完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/9dcb054c-dd5b-4bc2-cdaf-cec4652a268d.png)

### STM32CubeMXのインストール

正直どこでインストールしても構わないが、ST-LINKと同じアカウントを使用するため、続いてやっておくのがよい。以下サイトからダウンロード（ソフトウェアの入手）をする。
https://www.st.com/ja/development-tools/stm32cubemx.html

「JAVA SE」をダウンロードせよ、というページに飛ばされたら、素直にJAVA SEをダウンロードする。その後、もう一度CubeMXをダウンロードすると、ちゃんとダウンロードを始めてくれる。

### IAR Embebeded Workbenchのインストール
こいつのダウンロードページに行き着くまでが最大の鬼門である。どこをクリックしても同じ画面が表示されるような仕様なので、検索はおすすめしない。

以下のページから「コード制限版」をダウンロードする。
https://www.iar.com/jp/iar-embedded-workbench/#!?currentTab=free-trials

手順は、以下pdfのP.1～P.8までがめちゃくちゃ参考になるので絶対見るべし。
https://www.adwin.com/image/support/AKE-1101_1_ewarm.pdf

新たにライセンス登録が必要となるため、一度心を落ち着ける必要がある。しかもPC毎にライセンス登録が必要となるため、環境構築は1日1台までにしておいた方が精神的によい。ここまででセットアップは終了！

# ビルド～書込み手順
### ワークスペースの作成
「STM32CubeMX」を起動し、New Projectを選択する。
碁盤目状に表示されたMCUs Listの中から、自分のマイコンを選ぶ。
CPUのイラストが表示された画面が表示されるので、左上（左から６番目）の歯車アイコンをクリックする。Project NameとProject Location(置き場)を入力（必須！）し、Ok。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/b27a351b-50ee-f53a-1ffa-306f67c343e0.png)

プロジェクト生成後、「OpenFolder」から、作成したプロジェクトフォルダの下にあるEWARM\Project.eww でワークスペースを開く。
※OpenFolderから開かず、Project.ewwを直接開いても問題ない。

### ビルド
作成したワークスペースのEWARMフォルダの下にある「Project.eww」を開く。
メニューバーのプロジェクトから、「メイク」 or 「全てを再ビルド」 ⇒ ビルド
メニューバーのプロジェクトから、「ダウンロードしてデバッグ」⇒ 書き込み

簡単！！

### おまけ（バイナリの作り方）
IAREWでビルドすると.outファイルが作られるが、このファイルは他のツールで書き込むことができない。一般的なバイナリを生成するには、画面左のワークスペースを右クリックし、オプションから「出力コンバータ」を選択する。「追加出力ファイルを生成」にチェックボックスを入れ、好きなバイナリ形式を選べば完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/b90a9974-c445-604f-165e-7c4bc4dc4732.png)


以上！！
ShaderGraphの結果をComputeShaderで使う方法

`Graphics.Blit` を介すことで、ShaderGraphの結果をComputeShaderで使うことができます。 

ShaderGraphで書いたシェーダーを使う`material`を用意し

```
//  結果をdstのテクスチャに書き出す
Graphics.Blit(src, dst, material);
//  dstテクスチャをComputeShaderに渡す
MyComputeShader.SetTexture(0, "_Texture", dst);
```
bin/rails sしたら「`require': Could not load the 'ecto' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.」と言われなんのことだかわからず発狂しそうになったが解決できた話

# はじめに
- **昨日まで動いていた**Railsのプロジェクトが動かなくなりました
- なにもしていないことはなくて、**バッチリなにかをしていました**
- が、まさかそんなところに影響がでるとはおもわず、右往左往した話です

```
`require': Could not load the 'ecto' Active Record adapter. 
Ensure that the adapter is spelled correctly in config/database.yml and 
that you've added the necessary adapter gem to your Gemfile.
```

- こんなエラーがでました
  - 指示通り、`config/database.yml`をみても不審な点は見当たりません
  - `ecto`です
  - [ecto](https://hex.pm/packages/ecto) です
  - `ecto` で[Phoenix](https://www.phoenixframework.org/)でのなにかが影響しているのだろうなあとはおもいましたが、なかなかわかりませんでした
- 私は、[Ruby on Rails](https://rubyonrails.org/)と[Elixir](https://elixir-lang.org/)のWebアプリケーションフレームワーク[Phoenix](https://www.phoenixframework.org/)をよく使っています


# 結論
- [Rubyの変数DATABASE_URLでハマった話](https://note.gosyujin.com/2016/08/31/ruby-database-url/)
- ↑こちらの記事に詳しいです
- こちらと同じく、[Phoenix](https://www.phoenixframework.org/)の作業で、環境変数`DATABASE_URL`を追加していました
- どうやらRailsが`DATABASE_URL`を読み込むようです

# なぜ追加したの？
- [Phoenix](https://www.phoenixframework.org/)のガイドの中にある[Introduction to Deployment](https://hexdocs.pm/phoenix/deployment.html#content) ここの記事の内容を写しているときに追加しました

```
export DATABASE_URL=ecto://USER:PASS@HOST/database
```
- Yay!

- `~/.zshenv` や `~/.bashrc`、`~/.bash_profile`等に追加している場合は、環境変数`DATABASE_URL`を消してターミナルを立ち上げ直してください
    - `DATABASE_URL`を消したあとに、`source ~/.zshenv`なんてやっても、**しぶとく`DATABASE_URL`は残っていますから！**
    - いわれてみればその通りなのですが、`DATABASE_URL`が怪しいと気づいたあとでも老い先短い人生の時間を浪費してしまいました
- `Could not load the 'ecto' Active Record adapter. ` は私がググった限りはでてこなかったので、ここに記しておきます
Mac用 Apple英字配列(UK)キーボードとATOKの設定

# ローマ字入力でキーボードのカナは不要ですね

以下の記事を見てMacbookAir13をUKキーボードにしてみました(BTO注文時に)。
![magic-keyboard-uk.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223848/2d54eff3-d4df-1741-2fa6-00b8c240c6ec.jpeg)
すっきりしていますね。
[初めて英字配列キーボードのMacを買うなら ｢US配列｣ ではなく ｢UK配列｣ を選ぶべき理由](https://corriente.top/mac-keyboard-uk/)
漢字入力（InputMethod)は昔からの流れでATOKを利用しています。

# 「~」や「`」が入力できない？

「£」は[Shift]+[3]で、「#」は[Option]+[3]で入力できるのですが、[左Shift]と[Z]の間の、「~(チルダ)」や「`(アクサングラーヴ)」が打てなくて困っていたので色々試した結果を記録しておきます。

| JIS配列/US配列  | UK配列 |   |
|----------------|--------|---|
| [2]+[Shift]    | @      | @ |
| [2]+[Option]   | ™      | € |
| [3]+[Shift]    | #      | £ |
| [3]+[Option]   | £      | # |
| [\\]           | ¥      | \ |

# ATOKの環境設定を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223848/8d199092-7e96-5ab2-3708-693e88089841.png)
「キーボード配列」-「英字入力時のキーボード配列」⇒[イギリス]にするだけでした。
結構悩んだのですが、あっさり解決しました。


＜参考情報＞
[サポートFAQ:キーボードの配列通りに入力できない](http://support.justsystems.com/faq/1032/app/servlet/qadoc?QID=025624)
Mac HomebrewでMySQLをインストールする

# 目的

- MySQL 8.0.18をインストールする方法をまとめる

# 実施環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

# 前提条件

- HomeBrewが使用できる状態になっていること。

# 実施方法

- 作業中にrootのパスワードが分からなくなってしまった方はこちら→[MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d)

1. 下記コマンドを実行してbrewのインストールリストを更新する。

    ```terminal
    $ brew update
    ```
1. 下記コマンドを実行して最新のMySQLをインストールする。

    ```terminal
    $ brew install mysql
    ```
1. 下記コマンドを実行してエラーが出ない事を確認する。

    ```terminal
    $ mysql --version
    ```
1. 下記コマンドを実行してMySQLを起動する。

    ```terminal
    $ mysql.server start
    >Starting MySQL
    >. SUCCESS!
    ```
1. 下記コマンドを実行してMySQLのrootユーザでログインする。エラーが出ない事を確認する。

    ```terminal
    $ mysql -u root -p
    >Enter password: 何も入力せずにEnterを押下する。
    ・
    ・
    ・
    mysql> 
    ```
1. 下記コマンドを実行してrootユーザのパスワードを設定する。

    ```terminal
    mysql> USE mysql;
    >Database changed
    mysql> ALTER USER 'root'@'localhost' identified BY '任意のパスワード';
    >Query OK, 0 rows affected (0.00 sec)
    ```
1. 下記コマンドを実行して一旦MySQLから出る。

    ```terminal
    mysql> exit
    ```
1. 下記コマンドを実行してrootユーザでログインする。

    ```terminal
    $ mysql -u root -p
    >Enter password: 先に入力した任意のパスワードを入力する。
    ・
    ・
    ・
    mysql>
    ```
1. インストール完了である。
時系列データの微分(離散)

一般にセンサーから得られたデータは離散データになります.
離散データの場合、最も簡易的に近似的に微分すると
$f'(x) =\frac{f(x + h) - f(x -h)}{2h}$
となります.誤差は$\omicron(h^2)$.

この計算はスライス機能を使うと簡単.

```python
import numpy as np

def diff(x, h):
    res = x[2:] - x[:-2]
    return res/(2*h)
```




以下の式ではもう少し誤差が少なくなり誤差は$\omicron(h^4)$.
$f'(x) = \frac{-f(x +2h) + 8f(x+h)-8f(x-h)+f(x-2h)}{12h}$<br>


```python
def diff4(x, h):
    """
    1回微分{-f(x+2h)+8f(x+h)-8f(x-h)+f(x-2h)}/12h
    xは時系列データ,　hはデータ間の時間(second)
    """
    res = -x[4:] + 8*x[3:-1] - 8*x[1:-3] + x[:-4]
    return res/(12*h)
```


誤差をそれぞれ確認
.今回は1 Hzのcos波を作成し,微分.
$f(x) = cos(2\pi x)$
今回最もわかりやすい値として最大値の誤差を計測.
$max(f'(x))=2\pi$


```python
#10secondの1 Hzのcos波
time = np.linspace(0, 10, num=10000, endpoint=False)
wave = np.cos(2*np.pi*time)

#誤差が多い方法
vel2 = diff(wave, time[1] - time[0])
#誤差が少なくなる方法
vel4 = diff4(wave, time[1] - time[0])

#理論値2πと比較
print(vel2.max()-2*np.pi)
print(vel4.max()-2*np.pi)
```

出力結果
-4.134161924973512e-05
-3.241460433400789e-10

後者の式の方が誤差が少なくなるのが分かります.



2回微分の場合
$f''(x) = \frac{-f(x +2h) + 16f(x+h)-30f(x)+16f(x-h)-f(x-2h)}{12h^2}$
となる.

```python
def diffdiff4(x, h):
    """
    2回微分,xは時系列データ,　hはデータ間の時間(second)
    {-f(x+2h)+16f(x+h)-30f(x)+16f(x-h)-f(x-2h)}/12h^2
    """
    res = -x[4:] +16*x[3:-1] -30*x[2:-2] +16*x[1:-3] -x[:-4]
    return res/(12*h*h)
```
【ajax】JqueryでJSONを一件ずつ取得する【なるほど】



入れ子になっているjsonを一件ずつ取り出すのに苦労したのでまとめてみました。

#入れ子になっているjson
ajaxでjsonを取得すると、多分こういう形になってる

```json
{ 
  "lists": [
        {
            "text": "aaa",
            "name": "a",
            "created_at": "2020-03-16 09:02"
        },
        {
            "text": "bbb",
            "name": "b",
            "created_at": "2020-03-16 09:06"
        },
        {
            "text": "ccc",
            "name": "c",
            "created_at": "2020-03-16 09:06"
        }
    ]
}
```


#これを一件ずつ取り出す
```javascript

$(function(){
            $.ajax({
                url: 'http://localhost',
                type:'GET',
            }).done(function(data){
                    for(var i in data['lists']){
                        //textをひとずつ出力
                        console.log(data['lists'][n].text);
                        console.log(data['lists'][n].name);
                        console.log(data['lists'][n].created_at);
                    }
               });
            });


```

`data['lists'][n].text`ここの部分すごく苦労した、、、
mockyでリクエストの内容をレスポンスに反映しようとしてハマったメモ。

# やりたいこと
node.jsで動くWebAPIモックサーバーの[mocky](https://github.com/2do2go/mocky)を使って、

```
{ "name": "John Smith" }
```
をPOSTリクエストしたら

```
{
  "id": 1,
  "name": "John Smith"
}
```
が返却され、

```
{ "name": "Taro Yamada" }
```
をPOSTリクエストしたら

```
{
  "id": 1,
  "name": "Taro Yamada"
}
```
が返却されるように、リクエストの内容をレスポンスに反映したかったのだが、つまづいたのでメモを残す。
mockyのインストール方法、基本の使い方はGithubのREADMEを参考にしてください。

# 結論
基本の使い方は公式のREADMEといいつつ、mocky自体かなりメンテされていないみたいなので少し書き方は今風にしてる箇所もあるが基本的に一緒。

```mock.js
const mocky = require('mocky');

mocky.createServer([
  {
    url: '/users',
    method: 'POST',
    res: (req, res, callback) => {
      const params = JSON.parse(req.body);
      callback(null, {
        status: 201,
        body: JSON.stringify(
          {
            "id": 1,
            "name": params.name
          }
        )
      });
    }
  }
]).listen(4321);
```

`JSON.parse`でリクエストのjsonをパースしてあげないとうまく変数を抽出できなかったり、`JSON.stringify`でjson形式で書いたレスポンスをstring型に変換しないとうまく動作しない。（ここでつまづいた...😢）
特に`JSON.stringify`を忘れたために、

```
_http_outgoing.js:670
    throw new ERR_INVALID_ARG_TYPE('first argument',
    ^
TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer. Received an instance of Object
    at write_ (_http_outgoing.js:670:11)
    at ServerResponse.write (_http_outgoing.js:638:15)
    at sendRes (/app/node_modules/mocky/lib/mocky.js:166:9)
    at /app/node_modules/mocky/lib/mocky.js:74:10
    at Timeout._onTimeout (/app/mocky.js:16:9)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  code: 'ERR_INVALID_ARG_TYPE'
}
```
というエラーが出続けて泣いた😿

# 動作確認
これでcurlで確認すればうまくいくはず。

```
$ curl -X POST 'http://localhost:4321/users' -d '{ "name": "John Smith" }'
{"id":1,"name":"John Smith"}
```
みにくいので`python -m json.tool`をパイプで渡すと見やすくなる。

```
$ curl -X POST 'http://localhost:4321/users' -d '{ "name": "John Smith" }' | python -m json.tool
{
    "id": 1,
    "name": "John Smith"
}
```

# Reference
- [JSON.stringify() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
- [json形式のAPIをcurlで確認するTips - Qiita](https://qiita.com/roana0229/items/585ce757e65850c7b37f)
入門の次のステップに進めないVue.js学習履歴（随時更新）

# 概要
ドットインストールの「Vue.js入門」を実施してある程度Vue.jsをわかった気になった。
https://dotinstall.com/lessons/basic_vuejs_v2

しかし、実際にリリースされているVue.jsのソースを見るとさっぱりわからなかった。
このため、疑問点と調査経緯を自分のメモ目的でこの記事に残していく。

# 疑問点

## yarn run xxx
package.jsonのscriptsで定義されたxxxを実行する。

```
"scripts": {
    "xxx": "～～～～～～～～",　←これを実行
    "yyy": "～～～～～～～～",
　　　　：
　　　　：
  },
```

■yarn runのドキュメントはこちら。
https://classic.yarnpkg.com/ja/docs/cli/run

## app.use(nuxt.render)

expressのミドルウェアとしてNuxt.jsを使う。

```
 const express = require('express')
 const app = express()
  :
 app.use(nuxt.render)
  :
```

Node.jsの「ミドルウェア」という概念がいまいちわかっていない・・・。

■API: nuxt.render(req, res)
https://ja.nuxtjs.org/api/nuxt-render/

■ExpressのミドルでNuxt.jsを利用
https://www.wakuwakubank.com/posts/666-nuxtjs-express-middle/


## module.exports={}

外部（別ファイル）から参照できるようにする。

```
module.exports = {
  mode: 'xxx',
  router: {
    base: '/yyy/'
  },
```

上記の定義をしたjsファイルをrequireすると、jsファイルの中身を参照できる。
 
■module.exportsとは何か、どうもわからなかったので実験してみた〜Node.jsにて外部moduleをrequireする〜
http://karoten512.hatenablog.com/entry/2018/01/28/191928

## this.$store.dispatch(～～～）

「$store」はどこにも宣言されていない。
Vuex（ビューックス？）のステートオブジェクトとのこと。
セッションみないたもの？？セッションよりは奥が深そう。

■Vuexステート
https://vuex.vuejs.org/ja/guide/state.html

■Vue.js + Vuexでデータが循環する全体像を図解してみた
https://qiita.com/m_mitsuhide/items/f16d988ec491b7800ace

## this.$store.dispatch(～～～）その②　dispatchについて
「$store.dispatch」でステートのactionを実行（らしい）
actionは非同期処理（らしい）

actionの実行とは何か？

## this.$store.dispatch(～～～）その③　actionについて

「$store.dispatch」でステートのactionを実行するとしてactionとは何をするのか？
実態が不明。

`\store\index.js`に`export const actions`や`export const mutations`があった。
つまり「$store.dispatch」を実行すると、`\store\index.js`に`export const actions`のような気がしてきた。

## async function() {const response = await this.$store.dispatch(～～～）}

asyncで非同期関数。
awaitでpromiseのresolveを実行。
つまり、`\store\index.js`のactionを非同期実行した結果がresponseに入る？
※このあたり、理解が曖昧。以下などを見て、なんとなく上記の理解。

　https://qiita.com/niusounds/items/37c1f9b021b62194e077

## () => {～～～}

何もない`()`はJavaScriptで１，２を争う理解できない記述。
catchは例外をキャッチするんだろうな～という何となく想像ができるがその後の`() =>`は全く想像できない。具体的なソースだとこんな感じ。

```
const response = await this.$store
          .dispatch('xxx', { 
           key1: valu1,
           key2: value2
          })
          .catch(() => {　　　　←ここがわからない。
            return false
          })
```

こちらがわかりやすかった。
https://qiita.com/may88seiji/items/4a49c7c78b55d75d693b

```
(引数,...)=>{...関数の本体...}
```

つまり`() => {～～～}`は引数なしの無名関数を宣言しているだけ。
上記具体例だと、catchが呼ばれたらfalseをreturnする無名関数を実行する、ということか。

## methods内のfunctionのあり、なし

メソッドの記載で`:funciton`を記載している場合としていない場合がある。
これはES2015からオブジェクトの中で記載する場合に省略できるようになっただけらしい。
（<script>～</script>をjsファイルで外出しする場合は省略不可ということ？）

```
        methods: {
            onItemTap: function(args) {
                ：
            },
            onButtonTap() {
　　　　　　　　　：
            }
　　　　　}
```

参考ページ
https://zukucode.com/2017/04/vuejs-es2015.html
Laravelでjs読み込む時に「$ is not defined javascript」エラー

めちゃめちゃ基本的なところでつまづいたので備忘録。


laravelを使ってjs読み込みたいのに何故か最初のおまじない部分でずっとコンソールエラー。
*$ is not defined javascript*

``` ruby:hoge.js
$(function(){ //←処理入る前のここで既に怒られる
 //ここに処理
});
```
<br>
なんでえ？？？と思ってたらjsの呼び出し方間違えてました。
↓こう書いてたのを

``` ruby:hoge.blade.php
 <script src="/js/hoge.js"></script>
```

こうしないといけなかったみたい。

``` ruby:hoge.blade.php
<script src="{{ asset('/js/hoge.js') }}"></script>
```





> 参考にさせていただいた記事
https://qiita.com/sakuraya/items/411dbc2e1e633928340e
CommandBoxを使ってみる

##CommandBoxってなに？

おおざっぱに言うと、CFMLフレームワークであるColdBoxを便利に使うためのCLI。でも他にも多分機能たくさんある。

##導入

ダウンロード
https://www.ortussolutions.com/products/commandbox

設置
box.exe（とランタイム入りならJREフォルダも）を任意のディレクトリに解凍。

初回起動時、ユーザーのホームディレクトリにフォルダが作られます。

```
C:\Users\hoge\.CommandBox
```

別のフォルダに作りたい場合は以下のリンクに方法があります。
https://commandbox.ortusbooks.com/setup/installation

##アップデート

最新バージョンへのアップデート方法

```
CommandBox> upgrade --latest
```

自動アップデート方法
https://www.forgebox.io/view/commandbox-update-check

##開発用ローカルサーバー

サーバー起動
server start --debug --console

サーバーログについて
https://commandbox.ortusbooks.com/embedded-server/server-logs

##その他

パッケージリポジトリ
https://www.forgebox.io/

`info`で、日替わりでステレオグラムアスキーアートが表示されるのがひそかな楽しみです。例えばこんな感じ。

```
****************************************************************************************************
*                                         About CommandBox                                         *
****************************************************************************************************
（中略）
****************************************************************************************************


                                  Here is an ASCII art stereogram.
                   Stare at it and diverge your eyes (the opposite of crossing them)
                             If you can't see it, you can come back later.
                This image will be here all day.  Tomorrow holds a new day and a new image.



          Dr.           Dr.            Dr.            Dr.          Dr.            Dr.
           H O    *    W H O     *    W H O     *    W H O*    *  W H O  *    *  W H O
           *        *     *        *     *        *     *        *     *        *     *
            \|/  *        \|/   *       \|/    *      \|/     *     \|/      *    \|/
           __^__      *  __^__        *__^__*        __^__ *       __^__  *      __^__
           |#|#|   *     |#|#|   *     |#|#|    *    |#|#|     *   |#|#|      *  |#|#|
           |L|L|     *   |L|L|      *  |L|L|       * |L|L|        *|L|L|*        |L|L|
           |L|L|*        |L|L| *       |L|L|  *      |L|L|   *     |L|L|    *    |L|L|
           |L|L|   *     |L|L|    *    |L|L|     *   |L|L|      *  |L|L|       * |L|L|
           -----      *  -----       * -----*       *----- *       -----  *      -----
          Dr.    *       Dr.    *       Dr.    *      Dr.     *       Dr.    *       Dr.
           H O      *   W H O      *   W H O      *  W H O       *   W H O      *   W H O



CommandBox>
```
Wordpressでプラグインを使わず人気記事ランキングを表示する方法

人気記事を作るには記事が表示された際にカスタムフィールドに加算していくようにするだけ。

## 人気記事のfunctions.php設定
functions.phpに以下のコードを追記する。対応するkeyのカスタムフィールドがない場合は新しく作成する。

2つめの関数で`wp_head`が実行されるときにカウントを実行するように設定。

```php
function my_popular_post_counter($post_id) {
	$count_key = 'view_count';
	$count = get_post_meta($post_id, $count_key, true);
	if ($count == '') {
		$count = 0;
		delete_post_meta($post_id, $count_key);
		add_post_meta($post_id, $count_key, '0');
	} else {
		$count++;
		update_post_meta($post_id, $count_key, $count);
	}
}
function my_popular_post_trigger($post_id) {
	if (!is_single()) return;
	if (empty($post_id)) {
		global $post;
		$post_id = $post->ID;
	}
	my_popular_post_counter($post_id);
}
add_action('wp_head', 'my_popular_post_trigger');
```

## テンプレートに表示
テンプレートにランキングを表示するには、`WP_Query()`でクエリを実行するだけ。

画面が表示されるたびにカウントするので、リロードを繰り返すとランクが変わるのがわかる。

```php
<h3>人気記事</h3>
<ul>
	<?php 
	$args = array(
		'orderby'=>'meta_value_num', 
		'order' => 'DESC', 
		'showposts' => 5, 
		'meta_key'=>'view_count',
	);
	$wp_query = new WP_Query( $args );
	if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : 
  $wp_query->the_post(); ?>
		<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php endwhile; endif; wp_reset_postdata();?>
</ul>
```
【WPF】キーボードフォーカスが当たらない

ウィンドウ初期表示時に、ある要素にキーボードフォーカスを当てたいのに当たりません。

以下やってみたこと。

- `FocusManager.FocusedElement="{Binding ElementName=ButtonOk}"`
- Focusableをtrueにする
- Keyboard.Focus()をActivatedイベントに登録

しかし思うように動作せずハマってましたが、こちらにどんぴしゃの解決法が載ってました。
https://stackoverflow.com/questions/20294658/focusedelement-is-not-being-honoured

備忘録として載せておきます。

```c#:class
namespace Invoices.Client.Wpf.Behaviors
{
    using System.Windows;
    using System.Windows.Input;

    public static class KeyboardFocus
    {
        public static readonly DependencyProperty OnProperty;

        public static void SetOn(UIElement element, FrameworkElement value)
        {
            element.SetValue(OnProperty, value);
        }

        public static FrameworkElement GetOn(UIElement element)
        {
            return (FrameworkElement)element.GetValue(OnProperty);
        }

        static KeyboardFocus()
        {
            OnProperty = DependencyProperty.RegisterAttached("On", typeof(FrameworkElement), typeof(KeyboardFocus), new PropertyMetadata(OnSetCallback));
        }

        private static void OnSetCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var frameworkElement = (FrameworkElement)dependencyObject;
            var target = GetOn(frameworkElement);

            if (target == null)
                return;

            frameworkElement.Loaded += (s, e) => Keyboard.Focus(target);
        }
    }
}
```

```xml:xaml
<UserControl xmlns:behaviors="clr-namespace:Invoices.Client.Wpf.Behaviors">
    <Grid behaviors:KeyboardFocus.On="{Binding ElementName=TextBoxToFocus}">
        <TextBox x:Name="TextBoxToFocus" />
    </Grid>
</UserControl>
```

私の場合はこれで無事解決しました。
React開発環境を作る1

reactを勉強するときに開発環境を作るところでいろいろ躓いたのでまとめていきます。
##使用ツール
- webpack4
- babel
- eslint
- css-loader
- style-loader

##ツールインストール

```
npm install
```

 まずはこれを叩いてpackage.jsonを作る。

```
npm install --save react react-dom
```

reactとreact-domのインストール

```
npm install --save-dev webpack webpack-dev-server
npm install --save-dev babel-cli babel-loader babel-preset-env babel-preset-react
npm install --save-dev eslint eslint-loader eslint-plugin-react 
npm install --save-dev css-loader style-loader babel-loader
```

開発をサポートするツールのインストール
開発で依存するパッケージを使うときは--saveで、開発をサポートするパッケージを使うときは--save-devを使うらしい。

##package.json

```package.json
{
  "name": "react_",
  "version": "1.0.0",
  "description": "react_",
  "private": true,
  "main": "index.js",
  "scripts": {
    "start": "webpack-dev-server",
    "build": "webpack-dev-server",
    "webpack": "webpack -d"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^16.13.0",
    "react-dom": "^16.13.0"
  },
  "devDependencies": {
    "@babel/preset-env": "^7.8.7",
    "@babel/preset-react": "^7.8.3",
    "@babel/register": "^7.8.6",
    "babel-cli": "^6.26.0",
    "babel-loader": "^8.0.6",
    "babel-preset-env": "^1.7.0",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^3.4.2",
    "eslint": "^6.8.0",
    "eslint-loader": "^3.0.3",
    "eslint-plugin-react": "^7.19.0",
    "style-loader": "^1.1.3",
    "webpack": "^4.42.0",
    "webpack-cli": "^3.3.11",
    "webpack-dev-server": "^3.10.3"
  }
}
```

できたpackage.jsonにいろいろ付け足したのがこれ
scriptsは```npm start```と```npm run build```コマンドを叩いたときにwebpack-dev-serverを起動してくれっていうことを書いている。
```npm run webpack```を叩いたときはwebpack -dが起動する。
--saveでインストールしたものはdependenciesに--save-devでインストールしたものはdevDependenciesに書かれている。


とりあえず、今日はここまで、
次はそれぞれのツールの解説をしていきます。
Google Apps Script(GAS)でスクリプトの更新が反映されないとき

# はじめに

**Google Apps Script (GAS)でスクリプトは更新したのに、いざアプリケーションとして実行すると変更が反映されない**
ということがあったので、GASのアプリケーションの更新方法をまとめました。

# 手順
ソースの更新をアプリケーションとして反映させるためには、**プロジェクトの更新が必要**です。

まずスクリプトのページの上部メニューから「公開」->「Webアプリケーションとして導入」を選択します。

![1ae88cad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73712/626df878-2456-3c85-2a18-431179dcf6b8.png)

「Project Version」のプルダウンで「New」を選択し、「更新」を押します。

![db537717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73712/670e52a5-d5c5-2b2c-2f52-612152ef6f82.png)

「OK」を押せば完了です。

<img width="474" alt="スクリーンショット 2020-03-16 23.54.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73712/a811de1b-fc6e-1904-34eb-cc870a426ff4.png">
ExpoでAndroidエミュレータが起動しない場合

## 概要

React Nativeを触るためにExpoをインストールしてIOS/Androidエミュレータを試しに起動したところ、Androidエミュレータで以下のエラーが発生してそれを解決した備忘録。

> Couldn't start project on Android: Error running adb: No Android connected device found, and no emulators could be started automatically.
>
> Please connect a device or create an emulator (https://docs.expo.io/versions/latest/workflow/android-studio-emulator).
>
> Then follow the instructions here to enable USB debugging:
>
> https://developer.android.com/studio/run/device.html#developer-device-options. If you are using Genymotion go to Settings -> ADB, select "Use custom Android SDK tools", and point it at your Android SDK directory.



## エミュレータを作ろう

1. Android Studioを立ち上げて右下のConfigureをクリック
2. プルダウンのうち「AVD Manager」をクリック
3. Android Virtual Device Managerが立ち上がるので、下の方にある「+ Create Vitural Device...」をクリック
4. デバイスの選択になるので、特にこだわりがなければデフォルトのPixel 2のまま「Next」をクリック
5. システムイメージの選択になるので、特になんでも良いがTargetがAndroid 10.0を選択して「Next」をクリック
6. そのまま「Finish」をクリック
7. エミュレータの完成



## Android Studio's toolsのセットアップ

1. Android Studioの左上のメニューから「Preference」をクリック

2. 左のツリーから、 Appearance & Behavior → System Settings → Android SDK を選択

3. 上の方にある「Android SDK Location」をコピーする

4. ターミナルを開く

5. vimなどで~/.bash_profile、zshなら~/.zshrcを開き、下記のようにexportをつけてペーストする(usernameはそれぞれのPCの名前）

   ~~~
   export ANDROID_SDK=/Users/username/Library/Android/sdk
   ~~~

   vim閉じずにそのまま次へ

6. platform-toolsを追加する

   ~~~
   export PATH=/Users/username/Library/Android/sdk/platform-tools:$PATH
   ~~~

7. ターミナルを再起動

8. adbコマンドが使えるか確認する

   ~~~
   $ adb version
   ~~~



## AndroidエミュレータにExpoをインストール

1. Android Studioを立ち上げて右下のConfigureをクリック

2. プルダウンのうち「AVD Manager」をクリック

3. 先ほど作成したエミュレータを選択し、右のActionsの中の▶︎をクリック

4. エミュレータが起動するまで待つ

5. 起動を確認したらターミナルへ移動

6. expoのプロジェクトがあるディレクトリへ移動しexpoを起動させる

   ~~~
   $ cd ~~~~~  ディレクトリの移動
   $ expo start
   ~~~

7. ブラウザが自動的に立ち上がるので、左の「Run on Android device/emulator」をクリック

8. エミュレータにexpoがインストールされる

9. 無事Androidエミュレータ上でexpoが動く



## 次回以降

IOS simulatorと違って、Androidでチェックしたい時は毎回Android Studioからエミュレータを起動して、expoからRunしないとダメなよう
Pythonはじめから勉強 Hour1：Hello World

# Python勉強 Hour1：Hello World

* Pythonで何かしようとしたときに、まずサンプルスクリプトを探してなんとなく実行してた私が、
* 自動実行でREST API叩いて、結果の確認、VM操作までやってみたいと思う7時間



## 学習資料

* たった 1日で基本が身に付く！ Python超入門 
  * https://a.r10.to/hbHMiv
  * 



## 環境

* Windows
* Python Ver3系



## 基礎	

### インストール

* 特に難しくないのでダウンロードしてウィザードに従って進める
  * 「Pythonインストール」とかで検索すれば
  * http://www.python.org
  * 環境変数を追加するチェックを入れること「Add Python 3.X to PATH」にチェック



### Pythonの起動

 * 自動実行やダブルクリックでの実行は 置いといて、インタラクティブに実行する

 * コマンドプロンプト / PowerShellで起動

   ```
   C:\>python
   Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
   Type "help", "copyright", "credits" or "license" for more information.
   >>>
   >>>
   ```



### Hello World

 * コマンド叩くだけ

   ```python
   C:\>python
   Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
   Type "help", "copyright", "credits" or "license" for more information.
   >>>
   >>> print("Hello Python!!")
   Hello Python!!
   >>>
   ```



### 変数

* 変数の代入とか

  * 変数宣言/代入/何度も使える/上書きできる



  ```python
  >>>### 変数 hogeo に10を代入して計算する
  >>> hogeo=10
  >>>
  >>> hogeo+5
  15
  >>>### 変数は何度も取り出せる
  >>> hogeo *20
  200
  >>>### 変数は上書きできる
  >>> hogeo=5
  >>> hogeo+10
  15
  >>>
  ```
* 型とか宣言ないのかな？ と疑問を持ちましたが 
 * 変数に型は無いとのこと。代入した値自身が型を持ってる。とのことでした 
 
 
 
* 変数のルールと命名規則の考え方 
  * 下記の変数はNG
    * 予約語(Pythonでの予約語 ifとかNG）
    * 数字から始まる変数名（1a とかNG)
  * 命名規則（人の命名規則を真似すると可読性が高くなるはず！）
    * 英単語で構成し単語間は「 _  」で区切る
      * 例) 消費税：tax_rate
    * 大文字のアルファベットは使わない （後述の定数で使う）
    * _ から開始しない
    * 無機質なのだめ abcとかaとか

  

* 定数（他の言語では上書きできない変数）

  * Pythonでは定数を上書きすることができます。これはPythonには定数という機能が無いため

  * 「アルファベットの大文字と数字だけの変数は定数として扱う」というのが一般的なようです。＜＜＜こういうの結構大事よね

    

```python
>>>### 価格計算のダサい例
>>> price=100
>>> price*1.1
110
>>>
>>>### 定数を使った良い例
>>> price=100
>>> TAX_RATE=1.08
>>> price * TAX＿RATE
108.0
>>>
```



### 変数の型・型変換

* 文字列
  * 「'」「"」 シングルクォートもしくはダブルクォートで囲みます
  * この本ではこのあと「'」シングルクォートで囲ってるのでこのほうが良いのかな
    * 文字列として「’」や「”」を扱うときにお互いを使うようだ

* 文字列操作

```python
>>> firstname='hogeo'
>>> lastname='matsumo'
>>> name=firstname+' '+lastname
>>> print(name)
hogeo matsumo
>>>
```



* 型変換
  * Price：XXX yen という風に変数の中の数字を文字列で扱いたいとき

```python
>>> price = 100
>>> 'Price:' + price + 'yen'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>>
```

* 文字列と整数は足し算（結合）できないと怒られたので
* 型変換します。

```python
>>> price = 100
>>> 'Price:' + str(price) + 'yen'
'Price:100yen'
>>>
```

* 数値を文字列として扱うことができました。



基礎のまとめ

* インストールからhello worldと変数と文字列の取り扱いまで超簡単
* メモを取りながらでも1時間程度でここまでできました。
* なんとなく知ってて書いたことあるようなことでしたが、基礎はきっちりやると身に付きますね



## 名言・ライトニングトーク用

* 使いこなす知識
* 廃れない知識（基礎・基本的な考え）
* Pythonは「簡単」「汎用性が高い」、欠点は速度 というが、インタプリタ型では高速の部類
  * ちょっとした数行のツール・スクリプト
  * 大規模プログラム まで
iMacの起動ドライブを外付けSSDにして高速化した時のメモ

# 環境

- iMac (Retina 5K, 27-inch, 2017)
- macOS Catalina

# 購入した外付けSSD

- [BUFFALO USB3.1(Gen2)対応 ポータブルSSD 500GB ブラック SSD-PH500U3-BA](https://www.amazon.co.jp/BUFFALO-USB3-1-Gen2-ポータブルSSD-SSD-PH1-0U3-BA/dp/B07QT8SVYK/ref=sr_1_3?adgrpid=78450270138&gclid=EAIaIQobChMI1JDb1aOf6AIV0aqWCh2Kyw3xEAAYASAAEgJcSvD_BwE&hvadid=376396031711&hvdev=c&hvlocphy=1009293&hvnetw=g&hvqmt=b&hvrand=903769338419205263&hvtargid=kwd-851498437610&hydadcr=9493_10352840&jp-ad-ap=0&keywords=ssd%2Bph1%2B0u3%2Bba&qid=1584371474&sr=8-3&th=1)

<img width="317" alt="スクリーンショット 2020-03-17 0.12.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9875/d2d72e2d-8b24-8983-60e5-b43a6e427b12.png">

### 購入した理由

- 安心のBUFFALO
- 値段が手頃
- リード/ライト性能が高い(約1000 MB/s)
- 暗号化可能
- 金属筐体で放熱性が高い

### 注意点

- このSSDはThunderboltには非対応です。
- お金に余裕がある場合はThunderbolt対応のSSDを買った方が良さそうです。[「TRIM機能」が使えるのはThunderboltだけ](https://www.hivoki.com/secure-erase/#toc_id_2)
なので。



# 外付けSSDのフォーマット方法

<img width="784" alt="スクリーンショット 2020-03-17 0.00.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9875/742df021-95b0-f2c2-6613-120e27630fb4.png">

- フォーマット: APFS(暗号化)
    - 起動ドライブにするにはAPFSにする必要があります。
    - 「大文字/小文字を区別」にはしないでください。Macのデフォルトでは区別しないので、区別するようにしてしまうと動かないアプリケーションがあるようです。
    - 念のため暗号化しましょう。

# 外付けSSDを起動ドライブにするまでの手順

以下のサイトを参考にしてください。

[旧型iMac・MacBookを外付けSSDから起動して高速化する方法！環境持ち運びもできる！](https://www.sin-space.com/entry/mac-gaibussd-speedup)

# 外付けSSDを起動ドライブにするとフリーズしやすくなる?

- 外付けSSDを起動ドライブにするとフリーズしやすくなる場合があるそうです。
- 私の環境でもフリーズする問題が発生したのですが、外部SSDを接続するポートを変えたところフリーズしなくなりました。
- 他にも以下のような回避策があるようです。
 - [マック(mac)が頻繁に固まる（フリーズする）解決策](https://b.hatena.ne.jp/entry/s/takakojima.com/%E3%83%9E%E3%83%83%E3%82%AFmac%E3%81%8C%E9%A0%BB%E7%B9%81%E3%81%AB%E5%9B%BA%E3%81%BE%E3%82%8B%EF%BC%88%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA%E3%81%99%E3%82%8B%EF%BC%89%E8%A7%A3%E6%B1%BA%E7%AD%96/)
【今日のアブストラクト】Representation Learning: A Review and New Perspectives【論文 ほぼ Google 翻訳 自分用】

1 日 1 回 (努力目標) 論文の Abstract を Google 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ Google 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Representation Learning: A Review and New Perspectives](https://arxiv.org/abs/1206.5538v3)


# Abstract

### 訳文

機械学習アルゴリズムの成功は一般にデータ表現に依存します. これは, さまざまな表現がデータの変動のさまざまな説明要因を多かれ少なかれ絡み合わせて隠すことができるためだと仮定します. 特定のドメイン知識を使用して表現を設計できますが, 一般的な事前学習も使用できます. AIの探求は, そのような事前を実装するより強力な表現学習アルゴリズムの設計を動機付けています. この論文では, 教師なしの特徴学習と深層学習の分野における最近の研究をレビューし, 確率モデル, オートエンコーダー, 多様体学習、深層ネットワークの進歩について説明します. これにより, 適切な表現の学習, 表現の計算 (つまり推論), および表現学習, 密度推定, 多様体学習間の幾何学的接続に関する適切な目的に関する, 長期にわたる未回答の質問に動機を与えます.


### 原文

The success of machine learning algorithms generally depends on data representation, and we hypothesize that this is because different representations can entangle and hide more or less the different explanatory factors of variation behind the data. Although specific domain knowledge can be used to help design representations, learning with generic priors can also be used, and the quest for AI is motivating the design of more powerful representation-learning algorithms implementing such priors. This paper reviews recent work in the area of unsupervised feature learning and deep learning, covering advances in probabilistic models, auto-encoders, manifold learning, and deep networks. This motivates longer-term unanswered questions about the appropriate objectives for learning good representations, for computing representations (i.e., inference), and the geometrical connections between representation learning, density estimation and manifold learning.
【Spring Boot】例外とレスポンスを紐づけてエラー処理を簡単にやる


# 環境

Spring Boot 2.2.4.RELEASE
Kotlin 1.3.61
axios 0.19.2
vue 2.6.11

環境は以下の記事のまんま

https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede

# 作り方

単純に`例外`＝`レスポンス200以外`っていう仕組みを作る
例えばログイン処理の中で、パスワードが間違ってた時に`InCorrectPasswordException`が発生するものとして作る

まずは、どういうときに起きる例外かっていうのを作っておく

```InCorrectPasswordException.kt
class InCorrectPasswordException : RuntimeException()
```

それ用のExceptionを作っておいて

```ExceptionHandler.kt
@ControllerAdvice
class ExceptionHandler {

    private final val descriptionKey = "Description"

    @ExceptionHandler(InCorrectPasswordException::class)
    @ResponseStatus( HttpStatus.BAD_REQUEST )
    fun handleInCorrectPasswordException(
            response: HttpServletResponse
    ){
        response.setHeader( descriptionKey , "InCorrectPassword" )
    }

}

```

適当な場所にクラスを作って`@ControllerAdvice`を付ける
今回はヘッダに詳細を追加してそこにどういうエラーかを書いておく

`@ExceptionHandler`は何の例外が出たらこのメソッドが呼ばれるかっていう印
`@ResponseStatus`は返るレスポンスのステータスを指定
普通のControllerと同じように引数に`HttpServletResponse`とか`HttpServletRequest`も受け取れるし、他にも`Throwable`とかも受け取れるからメソッドの中で加工してもOK

# 僕なりの非推奨

ちゃんと自前のExceptionを作ること

例えば`@ExceptionHandler(Exception::class)`とかやってすべてのExceptionを受け取るようにしてしまうと、
ほんとに何かバックエンド側で問題があった場合にエラーの内容を書き換えてしまうことになるから注意
（そういうことはないorそれでもクライアントにエラーの中身を見られたくないって場合なら別だけど・・・）

後、僕はいつも`@ControllerAdvice`を使うときはBodyじゃなくHeaderに追加
変更じゃなくて追加
エラーの詳細が書いてあるBodyを上書きしてしまうと何があったか追跡するのが大変になると思う
エラーの詳細って一番上の一文ググるだけで回答出てきたりするじゃん？
だから元の情報は残したまま、独自の情報を載せるようなやり方がいいと思う

開発環境だけ適用されるみたいなことができると強いかもね
[Amazon Linux 2]公開鍵認証からパスワード認証へ変更

# 内容
EC2への接続方法を公開鍵認証からパスワード認証へ変更する

**類似記事**
[(Amazon Linux 2の)sshd_configとauthorized_keysを学ぶ](https://qiita.com/Inon/items/84162368dd57e4356621)

# 手順
対象のEC２へSSH接続して、ユーザを**root**へ切り替えます。

## sshd_configのバックアップ取得
設定変更を行う前には必ずバックアップを取得しておきます。

```
# cd /etc/ssh/
# pwd
/etc/ssh

# ls -l
total 608
...
-rw-r--r-- 1 root root       2276 Mar 15 12:25 ssh_config
-rw------- 1 root root       3977 Mar 15 12:04 sshd_config
...

# cp -p sshd_config sshd_config_yyyymmdd
# ls -l
total 608
...
-rw-r--r-- 1 root root       2276 Mar 15 12:25 ssh_config
-rw------- 1 root root       3977 Mar 15 12:04 sshd_config
-rw------- 1 root root       3977 Mar 15 12:04 sshd_config_yyyymmdd
...
```

## sshd_config設定変更
sshd_configの設定を変更していきます。
(変更前)
 #PubkeyAuthentication yes
PasswordAuthentication no

(変更後)
PubkeyAuthentication no
PasswordAuthentication yes

```
# vi sshd_config
# cat sshd_config | grep PubkeyAuthentication
#PubkeyAuthentication yes
PubkeyAuthentication no

# cat sshd_config | grep PasswordAuthentication
PasswordAuthentication yes
#PasswordAuthentication no

# systemctl restart sshd.service
```
viコマンドで設定変更を行い、cat+grepで変更箇所が問題なく変更されていることを確認します。
その後、systemctlコマンドでsshd.serviceを再起動します。

## パスワード認証での接続確認
Teratermを使用して、パスワード認証でログインできるかを確認します。
その際、現在の接続は保ったまま行ってください。

IPアドレスを入力してOKを押下します。
![ss_000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/ed5bb684-79be-5ad0-b7eb-7ccc408d7d9e.jpeg)


ユーザ名とパスワードを入力して**ブレインパスワードを使う(L)**を選択して接続します。
![ss_001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/960d0e66-c413-3005-3327-2e8fd19c05f4.jpeg)

接続できました。
![ss_002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/33ec0f0c-b565-095f-4183-c2529899e714.jpeg)

# 終わり
これでパスワード認証へ変更が出来た。
出来たがパスワード認証はあまりよろしくないので元に戻しましょう。

```
# cp -p  sshd_config_yyyymmdd sshd_config
# systemctl restart sshd.service
```
Javascript命名規則

write_index → スネークケース(DBのカラム名)
getCookie → キャメルケース

JavaScriptは基本的に
関数、メソッド、変数命名→Lower Camel(小文字で初めて途中単語の頭文字を大文字に）
クラス名→Upper Camel(大文字で始めて途中単語の頭を大文字に)

#キャメルケースとは

キャメルケースは「単語の先頭を大文字にしてつなげる表記方法」です。
変数名の付け方の話で、よく出てきます。
Amazon ECS(EC2)を試す小さなサンプルメモ

# メモ
## 前提
- `hoge` を1秒おきにコンソール出力するだけのUbuntuをコンテナとして起動する
- 手元はUbuntu(18.04)
- docker インストール済
- AWS認証情報を手元の環境に登録済み
- ECS はEC2タイプで固定数のインスタンスとする

## 手順

1. AWSマネジメントコンソールでECRでリポジトリを作成する
2. 手元の環境で Dockerfile ファイルを作成する

```sh:Dockerfile
FROM ubuntu

CMD while :; do echo hoge ; sleep 1; done
```

3 . Dockerイメージ作成

ECRにプッシュすることを見据えてタグを付ける

```zsh
% docker build . -t "[ECRのURI]:[今回のイメージのタグ]"
（例）% docker build . -t "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ubuntu:sleep-echo"
```

4 . ECRにログイン

```zsh
% aws ecr get-login-password | docker login --username AWS --password-stdin [ECRリポジトリのドメイン]
（例）% aws ecr get-login-password | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
```

5 . ECR にイメージをpush

ECRにイメージがpushされることを確認する

```zsh
% docker push [イメージのタグ]
（例）% docker push xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ubuntu:sleep-echo  
```

（以下からはAWSマネジメントコンソールでの作業）

6 . クラスタの作成

- 「EC2 Linux + ネットワーキング」
- クラスター名を適当に入力
- EC2 インスタンスタイプを適当に選択
- あとはデフォルトで作成

デフォルトではインスタンス数が「１」のはずなので、EC2インスタンスが1台立ち上げるはず。

7 . タスク定義の作成

- 「新しいタスク定義の作成」
- 「EC2」
- 「タスク定義名」適当に入力
- 「コンテナの追加」
    - 「コンテナ名」適当に入力
    - 「イメージ」にECRにアップしたイメージのURIを記入
    - 「メモリ制限」に128入力
- 「作成」

8 . タスクの実行

- ECSダッシュボードでクラスタを選択
- タスクタブを選択
- 「新しいタスクの実行」選択
    - 「起動タイプ」をEC2選択
    - 「タスク定義」で７で作成したタスクを選択
    - そのままタスクの実行

作成したEC2インスタンスでコンテナが実行される。
SSMのセッションマネージャ等でログインし、 `docker ps` するとわかりやすい。
外付けキーボード接続時にMacbookのキーボードを無効化する 

次の記事のように`Karabiner-Elements`というアプリを使って簡単にできそう。
[Macbook : macOS Sierraで外付けキーボードを指した時、Macbookのキーボードを無効化 - Qiita](https://qiita.com/Jung0/items/df811a68bc704117f577)

しかし手順通りチェックを入れても無効化されないし、アプリを再起動するとチェックが外れている。
どうやら設定情報は` ~/.config/karabiner/karabiner.json `に保存されるらしいが`~/.config/karabiner`というディレクトリそのものがない。

原因は`~/.config`が別のアプリによって使われており、かつ書き込み禁止になっていたため`Karabiner-Elements`の設定を保存できなかったようだ。

私の場合は`~/.config`の中身を一応バックアップ取っておいてディレクトリを作り直した。

```shell
$ ls ~/.config
configstore wireshark
$ sudo mv ~/.config /tmp/config_backup
$ mkdir ~/.config 
```

あとは、`Karabiner-Elements`を再起動して、チェックを入れると内蔵キーボードが無効化された。

一応見てみると`karabiner`ディレクトリが作成されている。

```shell

$ ls ~/.config
karabiner
```



補足：解決しなかったらissueを見ましょう。（今回は見つからなかったけど）
https://github.com/pqrs-org/Karabiner-Elements/search?q=%22disable+built-in+keyboard%22&unscoped_q=%22disable+built-in+keyboard%22&type=Issues