OmniAICreator/Qiita-1.07M huggingface dataset:
【Kubernetes エラー】 Error from server: error dialing backend:  dial tcp  :10250: getsockopt: connection refused

##現象
Kubernetesクラスタ構成のマスターノード上のPodにおいて、kubectl exec (コンテナ内のコマンド実行)が、下記のエラーメッセージで失敗する
※ワーカーノード上のコマンド実行は成功

 [Error from server: error dialing backend:  dial tcp  :10250: **getsockopt: connection refused**]

```
[root@master ~]# kubectl get pods -o wide
NAME                                 READY     STATUS    RESTARTS   AGE       IP             NODE
sample-deployment-3071066810-l4qn1   1/1       Running   0          1h        172.17.0.3     worker
sample-deployment-3071066810-qlt24   1/1       Running   0          1h        172.17.0.2     worker
sample-deployment-3071066810-xx2p5   1/1       Running   6          1h        172.17.0.131   master
sample-env                           1/1       Running   6          30m       172.17.0.130   master

[root@master ~]# kubectl exec -it sample-deployment-3071066810-xx2p5 /bin/bash
Error from server: error dialing backend: dial tcp 10.44.59.113:10250: getsockopt: connection refused」

[root@master ~]# kubectl exec -it sample-deployment-3071066810-l4qn1 /bin/bash
root@sample-deployment-3071066810-l4qn1:/#

```


##前提
* [クラスタ構築手順1](https://qiita.com/m-eno/items/6caae931ea727f55f5c0)、[クラスタ構築手順2](https://qiita.com/m-eno/items/4fa92ce812ce2a655d6c)
* マスターノードのfirewalld：無効化済み
* マスターノードのSELINUX：無効化済み

##対処
KUBELET_ADDRESSを、マスター自身のIPアドレス（今回はAPI Serverと兼用）に変更

```
[root@master ~]# vi /etc/kubernetes/kubelet
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=127.0.0.1"

→　
KUBELET_ADDRESS="--address=10.44.59.113"
KUBELET_API_SERVER="--api-servers=http://10.44.59.113:8080"
```

##原因
API Serverと、マスターノード上のKubeletサービス間の通信エラー

##参考
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/4906b4fc-74fb-855a-cb95-639862300b51.png)
出典：Wikipedia「Kubernetes」



* API server：
REST APIにて各ノード（master/worker）の設定を実施し、Kubernetesの内部/外部インターフェースを提供するコンポーネント

* Kubelet：
各ノード及びノード内のPod（コンテナの集合単位）の状態を監視し、障害のあったPodを自動的に再デプロイするコンポーネント
.pgpass を設定しても postgresql に接続できなかった

# 概要
Postgresql からスキーマ情報を、シェルスクリプトにてダンプしようとしたところ、パスワードによる認証が必要でした。[.pgpass](https://www.postgresql.jp/document/9.2/html/libpq-pgpass.html) でシェルスクリプトから Postgresql に接続できるとあったので、設定してみましたが、正常終了しませんでした。

## 環境
Postgresql : 10.4 on x86_64-pc-linux-gn
クライアント : psql (PostgreSQL) 11.1

## 実行したシェル
.pgpass をホームディレクトリに配置して、chmode で 600 を付与しました。

```
sqlFileName=./result.sql
\cp -f ./.pgpass $HOME/
chmod 0600 $HOME/.pgpass
pg_dump --schema-only --username=user -t 'schema.tb*' -n dbname --no-password --host=host.domain.name > $sqlFileName

pg_dump: [archiver (db)] connection to database "dbname" failed: fe_sendauth: no password supplied
```

# 回避策
　非推奨の方法として、[PGPASSWORD環境変数](https://www.postgresql.jp/document/8.1/html/libpq-envars.html) を使用して回避。幸い本番で稼働しているようなものではなかったのでこれで回避しました。
chmode 600 をしないと、下記の警告が出るので、認識はしているらしいのですが、、、謎です。

```
WARNING: password file "/Users/username/.pgpass" has group or world access; permissions should be u=rw (0600) or less
```

なぜ .pgpass で入れないのだろう？
クライアントとサーバーのバージョン差異が影響しているのかな？
pip install opencv-contrib-pythonでPermission denied発生したときの対処法

環境

- wiindows 10

- Python 3.7.2

 

pip install opencv-contrib-pythonを実行したところエラーが発生

 

    Could not install packages due to an EnvironmentError: [WinError 5] アクセスが拒否されました。: 'c:\\users\\user\\appdata\\local\\programs\\python\\python37\\Lib\\site-packages\\cv2\\cv2.cp37-win_amd64.pyd'
    Consider using the `--user` option or check the permissions.

 

--userをつけたらいいよと言ってるので

 

```
pip install opencv-contrib-python --user
```

 

を実行したところ成功
aws ec2の容量を変えてみた

## 背景
ec2の容量が足りたいので、増やしたい。

## ハマったこと
aws consoleでEBSを増やすだけだと増やした容量を反映されないです。

8Gから20Gにしても

```shell
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        3.9G   56K  3.9G   1% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/xvda1      7.8G  3.5G  4.2G  46% /
```

## 解決
```shell
[~]$lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   20G  0 disk
└─xvda1 202:1    0   8G  0 part /

# Expand the modified partition
[~]$sudo growpart /dev/xvda 1

# resize the file system to the new volume capacity.
[~]$sudo resize2fs /dev/xvda1

[~]$lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
└─xvda1 202:1    0  20G  0 part /
```

## 参照
- [Increasing your EC2 Volume Size \| Amimoto Help Center](https://support.amimoto-ami.com/english/self-hosting-accounts/increasing-your-ec2-volume-size)
- [Linux の EBS ボリュームのサイズ、IOPS、またはタイプの変更 \- Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-modify-volume.html)
AdoptOpenJDK 11(11.0.2)をDockerイメージで検証してみた

#Java11でHTTP通信時の不具合が11.0.2で修正された！
下記エラーのため通信できない・・・
https://stackoverflow.com/questions/52016415/jdk-11-ssl-error-on-valid-certificate-working-in-previous-versions

Exception in thread “main” javax.net.ssl.SSLHandshakeException: extension (10) should not be presented in server_hello


#Dockerイメージ
https://hub.docker.com/r/adoptopenjdk/openjdk11

#準備
Dockerfile

```
FROM adoptopenjdk/openjdk11:latest
RUN mkdir /opt/app
COPY hoge.jar /opt/app
CMD ["java", "-jar", "/opt/app/hoge.jar"]
```

```
$ docker build -t japp .
$ docker run -it --rm japp
```

#注意点
くだらないことですが、、
Dockerfileの階層にhoge.jarを配置しないと
COPY failed: stat /var/lib/docker/tmp/docker-builderXXXXXXX/xxx no such file or directory
のようなエラーがでてしまいます。

#結果
今回はHTTP通信の結果を出力するだけのコードの記述のみなので、
コンソールにresponseが出力されることをもって通信成功を確認しました。

![スクリーンショット 2019-01-22 14.55.56.png](https://qiita-image-store.s3.amazonaws.com/0/262530/9dd5e1c2-6abd-9d93-29be-21d2403456e8.png)
Mac に anyenv で ndenv をインストール

# 概要

anyenv で ndenv をインストールして、Node.js を入れてみます。anyenv のインストールについては、以下をご参照ください。  
  
[Mac に anyenv をインストール](https://stangler.hatenablog.com/entry/2019/01/22/153349)
 
#　なんとか env の確認

ターミナルで以下のコマンドを実行し、anyenv でインストールできる、なんとか env を確認します。

```
% anyenv install -l
```
  
以下のように表示されると思います。Node.js をインストールするためには、ndenv、nenv、nodenv のどれかを入れることになるのですが、今回は、ndenv をインストールします。
  
```
Available **envs:
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  luaenv
  ndenv
  nenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
```

### ndenv インストール
  
それでは、anyenv を使って ndenv をインストールします。ターミナルを開いて以下のコマンドを実行してください。  
  
```
% anyenv install ndenv
```
  
### 確認

以下のコマンドを実行して、ndenv が作動するかどうか確認します。  
  
```
% ndenv
```
  
以下のように表示されていれば OK です！  
  
```
ndenv 0.4.0-5-g6ee4840
Usage: ndenv <command> [<args>]

Some useful ndenv commands are:
   commands    List all available ndenv commands
   local       Set or show the local application-specific Node version
   global      Set or show the global Node version
   shell       Set or show the shell-specific Node version
   install     Install a Node version using the node-build plugin
   uninstall   Uninstall a specific Node version
   rehash      Rehash ndenv shims (run this after installing executables)
   version     Show the current Node version and its origin
   versions    List all Node versions available to ndenv
   which       Display the full path to an executable
   whence      List all Node versions that contain the given executable

See `ndenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/riywo/ndenv#readme
```
  
以上です。
Rancher2.x で 起動可能ポッド数 max-pods を変更する方法

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体も関係ございません。

# 0. はじめに

KubernetesのワーカーノードでのPodの数は、100とされています。

Building Large Clusters - Kubernetes
https://kubernetes.io/docs/setup/cluster-large/

GKEでは、110です。
Rancher GUIからKubernetesクラスターをデプロイした場合も 110になります。
IPアドレスの/24 CIDRブロック（256アドレス）によるものだと書かれています。

Optimizing IP address allocation  |  Kubernetes Engine  |  Google Cloud
https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr

# 1. Rancher の場合

Rancher 2.xで Kubernetesクラスターのワーカーノードの Pod数を変更にはどうすればいいでしょうか？
多くしたい場合も、少なくしたい場合もあると思います。
ということで起動可能なPod数を変更する方法について調べました。

`注意:`
　起動可能Pod数制限は、Kubernetesのkubeletが起動する時に指定します。
　変更する方法は、Pod数制限を変更したKubeletのコンテナーを新しく起動する必要があります。
　Pod数を大きくしすぎてしまうと1ホストで動くPodの起動が多くなりすぎ、ホストダウン時に
　その起動しているPodが全て別のホストに移動することになりますので余裕を持った
　リソース配分をお勧めします。

## 1-1. Rancher UIでKubernetesをデプロイする場合

このUIで変更できる場合と変更できない場合があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/d090a472-4b4e-64cb-986c-cccb5bd7bf10.png)

上記が、Rancherのクラスター追加画面ですが、以下の青枠で囲んであるものはPod数を変更できます。
赤枠の場合は変更できません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/b02126b9-77be-8221-33b7-80422862b62b.png)

### 1-1-1. 変更できないパターン

- 赤枠のGKE、EKSなどのクラウドと既存クラスターインポート  

Rancher UIから変更できません。理由は、各Kubernetesサービス事業者がKubernetesの実行時の設定を指定しているからです。既存のKubernetesをインポートする場合もUIから変更できません。変更したい場合は下の方法で行う必要があります。

### 1-1-2. 変更できるパターン

- 青枠側のクラウドとCustomでのインポート

上記の場合、クラスターオプションの上に以下のような「Edit as YAML」というリンクが出てきます。
この機能により設定できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/b343b970-ad92-1c9f-6ff6-265dee47c0b2.png)

上記をクリックすると以下のようにHTMLフォームでの設定ではなく、YAMLで設定することができるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/7595b8b0-4292-6ced-a36f-20b93e96f27d.png)

この画面は、普通のエディターのように編集することができます。
55行目に `services: ` がありますので、kubeletの項目を以下のように追加します。他の項目を消さないよう注意してください。（この例ではPod数を250にしていしています。IPアドレスのレンジも考えて起動可能Pod数を指定してください）

```yaml
services:
  kubelet:
    extra_args:
      max-pods: 250
```

## 1.2 Rancher CLI RKEで変更する場合

RKEで Kubernetes をデプロイしていた場合、1-1-2 同様にrke コマンドで指定するcluster.yml で上記と同じように`max-pods` を指定してください。

```yaml
services:
  kubelet:
    extra_args:
      max-pods: 250
```

# 2. サンプル Cluster.yml ファイル

上記 cluster.yml ファイルのサンプルは以下のページにあります。

Example Cluster.ymls | Rancher Labs
https://rancher.com/docs/rke/v0.1.x/en/example-yamls/
dockerでflaskとのコンテナ間通信をする

こんんちは。脱サラして日々スマブラ、したりコード書いたりとニートみたいな生活を送っているrevenue-hackです。
今回はまさかのそんなとこでドハマリするとはという記事を書きたいと思います。

## docker-composeでコンテナ間通信

まずdocker-composeでコンテナ同士の通信をします。
以下がdocker-composeのyamlです。

```
version: '3.7'
services:
  proxy:
    image: nginx:1.15.8-alpine
    environment:
      LANG: ja_JP.UTF-8
    volumes:
      - ./conf/dev/404.html:/usr/share/nginx/html/404.html
      - ./conf/dev/50x.html:/usr/share/nginx/html/50x.html
      - ./conf/dev/nginx.conf:/etc/nginx/nginx.conf
      - ./conf/dev/default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8880:80"
    container_name: proxy
    links:
      - front:front
  front:
    build:
      context: ../front
      dockerfile: ../.docker/Dockerfile
    container_name: front
    volumes:
      - storage:/app/src/assets/images/maps
    links:
      - image-processing
  image-processing:
    build:
      context: ../image_processing
      dockerfile: ../.docker/image.Dockerfile
    expose:
      - "5000"
    container_name: image-processing
    volumes:
      - storage:/app/dst

volumes:
  storage:
    driver: local

```


※Dockerfileは今回の話では不要なため載せていないです。

proxyのnginxでそこからfrontへ、またfrontからimage-processingへ5000へhttp通信をするというものです。
ここで詰まったのが、ここで詰まったのが、frontからimage-processingへアクセスできない！！！
ということ!

## Connection refused
普通にfrontコンテナに入りcurlすれば動くかなーと思い、試す

```
docker exec -it front sh
apk add curl
curl http://image-processing:5000/
```
結果


```
curl: (7) Failed to connect to image-processing port 5000: Connection refused
```


あれ？
とりまping

```
ping image-processing
```

結果

```
PING image-processing (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.164 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.224 ms
64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.147 ms
64 bytes from 172.19.0.3: seq=3 ttl=64 time=0.225 ms
```
hostのlinkは大丈夫そう。
nmapしてみる

```
Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-22 06:22 UTC
Nmap scan report for image-processing (172.19.0.3)
Host is up (0.000053s latency).
rDNS record for 172.19.0.3: image-processing.docker_default
All 1000 scanned ports on image-processing (172.19.0.3) are closed
MAC Address: 02:42:AC:13:00:03 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 3.25 seconds
```

あれ？全部closeされてる。だめじゃん！

## falskはhost 0.0.0.0で開放しないとだめ

flaskはデフォルトで外部アクセスできないようになっている。
結局解決方法として

```
flask run --host 0.0.0.0 --port 5000
```

hostをちゃんと指定してあげれば問題なくできました！
環境変数の

`ENV HOST 0.0.0.0`

とかではだめでした。環境変数をflaskでは見てなかった。

普通にdockerに問題あると思って色々dockerを試してしまっていた。。。。。
これだけにだいぶ時間を無駄にした。。。


## 参考
- https://qiita.com/tomboyboy/items/122dfdb41188176e45b5
[Please tell me who you are.] git commitできない時の対処方法

## [Please tell me who you are.]のエラーでgit commitできない
cloneしたリポジトリ内でファイルを編集しgit commitしようとすると何やらエラーが出ている。

```bash
local:Taylor$ git commit -m "modify_local-file"

*** Please tell me who you are.

Run

  git config --global user.email "taylor@example.com"
  git config --global user.name "taylor"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'Taylor@local.(none)')
```

`**Please tell me who you are.`
このエラーは**gitで自分の情報を登録していない**ことが原因のよう。

## 解決法
#### `git config`コマンドで自分の`user.name`と`user.email`を設定する。
`git config`コマンドで`email`と`name`を設定する

```bash
local:Taylor$ git config user.email taylor@email.jp
local:Taylor$ git config user.name taylor
```

設定後もう一度コミットしてみる。

```bash

local:Taylor$ git commit -m "modify_local-file"
[master 3ffaf07] modify_local-file
 1 file changed, 36 insertions(+)
 create mode 100644 repository/file
```

コミットが成功した。初期設定って大事だなぁ。

## まとめ
リポジトリをクローンしたらまず自分の情報をgit上で設定しよう。
最低限`email`と`name`は設定しておかないとコミットでこけるから忘れずに。
【一年生の頃の私へつづる言葉④】ひとまず、このバッチファイルを受け取っておいて。

・今となっては、当然のごとく使用していることを、ただ手紙としてしたためるだけの記事の第四弾。
・早くも第四弾だが、初学者時期が超人的無知であったたため、書くことが膨大。
・これが届く過去の私は、段ボールの用意は早急に行うように。
・よし。今回は入社後、知っておけばよかったことを書こう。

## バッチファイルについて
### ＜当時＞
- 「存在・概要」・・・なんとなく名前は聞いたことある程度の認識。  
→それがどういう仕組みで・何ができて・どういうときに便利なのか、をこれっぽちも理解していなかった。
- 「作成方法」・・・存在や概要もあやふやなため、もちろん作成方法もわかるわけもなかった。
  
→パソコンセットアップを手作業で行って、待ち疲れで休憩していると、先輩エンジニアから「バッチファイル使わないの？」との声に、ただただ頭が錯乱。

### ＜現在＞
概要や仕組みを学び、基本的な作業のプログラムをネット写経にて作成。

- ***概要***  
    - 複数のコマンド処理を一つにまとめて記述したファイル。  
    →通常のコマンドとは違って、変数や条件分岐、ループ処理も書ける。

- ***メリット***
    - 1. ファイル移動や削除等の手作業の自動化が簡単かつミスも減る。
    - 2. タスクスケジューラ使用で、定期的に実行可能。

- ***簡単な作成手順***
    - 1. テキストファイルを作成。（メモ帳でもなんでもいい。）
    - 2. そこにバッチ処理を記述。
    - 3. 名前をつけて保存で、拡張子を「.bat」にする。
    - 4. アイコンが歯車になるので、ダブルクリックで実行。  
    ※プログラム次第では、「管理者権限で実行」のみでの処理になることもある。

- ***簡単なサンプルバッチ***
①Windowsユーザー作成バッチ
・そのままメモ帳に書いてOK。
※ユーザー名 : 「test」
　パスワード : 「test01」
※管理者権限で実行。

```
@echo off
echo ユーザーを追加します
net user test /add
net user test test01
net localgroup "administrators" test /add
wmic useraccount where "Name='test'" set PasswordExpires=FALSE
wmic useraccount where "Name='root'" set PasswordExpires=FALSE
net user root RootP@ssw0rd
echo ユーザー追加完了ENTER後再起動
pause
shutdown -r -t 0
```
②Wi-fi設定バッチ
※SSID : 「sample」
  password : 「sample1234」

・バッチファイルを記述する前に、以下を行う。
1. コマンドプロンプトで`netsh wlan show profile`とうち、接続SSIDを確認。

```
C:\> netsh wlan show profile

インターフェイス Wi-Fi のプロファイル：

グループ ポリシー プロファイル （読み取り専用）
------------------------------------------
    <なし>
ユーザー プロファイル
-------------------
    すべてのユーザー プロファイル  : sample
```

2 . Cフォルダに「wifi」フォルダ（名前は何でもよい）を作成。
3 . コマンドプロンプトで、`netsh wlan export profile name="sample" folder=C:\wifi`とうつ。
4 . wifiフォルダに「Wi-Fi-sample.xml」が作成。
5 . 「wifi」フォルダをデスクトップに移動。（そのほうがやりやすい。）
6 . 「wifi」フォルダにバッチファイルを記述する「wifiSet.bat」を作成（名前は何でもよい）

・ここまで出来たら、下記のコードをバッチファイルに記述。
→記述したら、実行。

```
@echo off

SET wifi_prof="%~dp0WIFI
netsh wlan add profile filename="Wi-Fi-sample.xml"
netsh wlan set profileparameter name=sample keymaterial=sample1234 connectionmode=auto
 
pause
end
```
        
### ＜過去の私へ送る言葉＞
- <font color = "tomato">最初は、日常の簡単な定型作業からでいいから、バッチ化する癖をつけておこう。</font>
- <font color = "tomato">できないときは、焦らずに、聞くなり調べるなりしてみてね。</font>

## まとめ
- 今回は、バッチファイルということで、何もかも手作業で行っていた腱鞘炎瀬戸際技術者だった頃を想いながら、記事を書く。
- 覚えたてのころは、日常のふとした自動化に、冷静装い技術者の私は、顔のニヤケを抑えるのに全神経を注ぐ。
- このこともあり久々に、もっと奥深くまでの学習や他の作業のバッチ化をしてみるのもありだな。
anacondaを消去した日

###大蛇を消し去りたい日もあるでしょう。

##anaconda-cleanを入れて実行
```
$ conda install anaconda-clean
$ anaconda-clean
```

-pythonを起動するとまだAnacondaが呼び出される
-Anacondaフォルダを削除されたい

以下コマンドを実行

```
sudo rm -rf anaconda3
```

```
bash_profile/basic 　内の
PATH(export PATH="/root/anaconda3/bin:$PATH")
```
を削除



###success!


参考文献
https://qiita.com/osk_kamui/items/9ca86a5b96e3ff5382dc
【THETAプラグイン開発】工場出荷状態に戻します

こんにちは。リコーの@mShiiinaです。

みなさま、RICOH THETAプラグイン開発されてますか？
開発中いろいろなものをビルドしてしまって、「リセットしたい！」と思った方いらっしゃいますか？
この記事では、工場出荷状態に戻す方法を紹介いたします。

RICOH THETAプラグインの詳細については[RICOH THETAプラグイン開発者コミュニティ](https://qiita.com/organizations/theta-plugin/activities)をご覧ください。

なお各種情報は、[Twitter](https://twitter.com/thetaplugin)で配信中。また、コミュニティの交流の場[Slack](https://join.slack.com/t/thetadeveloper/shared_invite/enQtNzcxODI2MTk2ODg0LWY5YmU2ZTIxNGYwNzlmNWZjMWMyMWFlMzY3ZmQ3NGU3ZjZiZjI0Njk4MGIxMDU5NDJiMzQ4Y2FkNDEzYmFlNGU) もありますので、
もしよろしければフォロー・ご参加のほど、よろしくお願いします。
<br>
#<font color="Red">**!!!注意!!!**</font>

- 工場出荷状態に戻しますので、**画像も削除**されます！！！リセットする前に**必要なデータは保存**しておいてください。　　
- 工場出荷状態に戻しますので、本体内の**時刻があっていません**。スマホの基本アプリと接続すると、時間の設定がされます。**使用前にスマホの基本アプリとつなぐこと**をお勧めします。<br>

- 工場出荷状態に戻しますので、**開発モードもOFF**になっています。**PCアプリで開発モードON**にしてください。

---

さてさて、本題。
工場出荷状態に戻す方法ですが、Vysorを使用して行います。
Vysorで使ったことないときは、[こちら](https://qiita.com/KA-2/items/9dce1a165fcf0203b1cb)を参考にしてください。

# 手順
1. VysorでRICOH THETAを開き、![top_icon.png](https://qiita-image-store.s3.amazonaws.com/0/263023/d0d468ac-c15d-fad8-fe25-aeb8d999ad3b.png) をクリック
　　![top.png](https://qiita-image-store.s3.amazonaws.com/0/263023/2fe56e8f-3fe3-518b-3f6e-c59f82b0ec32.png)

1. Settingを選択
　　![Setting.png](https://qiita-image-store.s3.amazonaws.com/0/263023/d7c0b3a0-3843-466b-ee74-dc5ededc6345.png)

1. Settingの一覧から Backup & reset を選択
　　![Setting_detail.png](https://qiita-image-store.s3.amazonaws.com/0/263023/ca9e5685-6ec7-2ee6-ade2-f02f793dcb03.png)　 >  ![Backup&setting.png](https://qiita-image-store.s3.amazonaws.com/0/263023/9eff1ed1-a0d7-1469-80f6-4473a2914703.png)


1. Factory data reset をクリック
   ![Factory data reset.png](https://qiita-image-store.s3.amazonaws.com/0/263023/17b6de33-bb95-e237-e412-ef00add3271f.png)

1. RESET PHONE をクリック
   ![Factory data reset _detal.png](https://qiita-image-store.s3.amazonaws.com/0/263023/f7620c14-b2f7-dd44-2a13-a741d48b6cfb.png)

1. もう一度本当にリセットしてよいかどうか聞いてきます。リセットしちゃって問題がなければ ERASE EVERYTHING をクリック
  ![Reset.png](https://qiita-image-store.s3.amazonaws.com/0/263023/80e8f194-f499-6143-2cc6-ee61bb6dd49d.png)

1. はい！リセットされました！
  ![Erased.png](https://qiita-image-store.s3.amazonaws.com/0/263023/1164da46-06c7-e8ea-ed60-4cec3f168303.png)

-----

パチパチパチ。

**必要な情報をリセットしないよう気を付けながら、ぜひプラグイン開発時にご活用ください。**
MySQLに接続してからselectまで

💻おじいちゃんですぐに忘れちゃうからメモ_φ(･_･

# osに接続

# コマンド確認
$ history

# login
$ mysql -u ユーザ -pパスワード

# DB確認
mysql> show databases;

# DB選択
mysql> use データベース名;

# テーブル確認
mysql> show tables;

# select文ぶっこむ
SELECT *
FROM TABLE_NAME
WHERE hogehoge
AWS Translatorを使用した翻訳機を作ってみる(セカンドライフ)

# セカンドライフって？
セカンドライフの説明は省きます。興味があったら調べてみて！

https://secondlife.com/
こことか
https://ja.wikipedia.org/wiki/Second_Life
ここ

イメージとしてはどうぶつの森とかが近いかも？
(いろいろありすぎてここでは書ききれないですよ)

<<そもそもLSLでスクリプト作るレベルの人だと説明する必要すらないような気も・・・>>

# 必要なもの
1. 有効なAWSアカウント
2. セカンドライフアカウント
3. セカンドライフを使えるPC

# 実際に作ってみた

## IAMロール
まずLambda関数からの呼び出し先としてAmazon Translateを登録するためのIAMロールを登録

・名前
適当(ここでは「ExecutionLambdaFunctionWithTranslate」と長い名前に)

・ロールを利用するサービス
Lambda

・権限ポリシー一覧
CloudWatchReadOnlyAccess
TranslateReadOnly

## Lambda
つづいてAmazon Translateを使うためのLambda関数を作成です。

・名前
適当(ここでは「Translator」にする)

・ランタイム
Python 3.6

・ロール
既存のロール

・既存のロール
先ほど作成したIAMロールを指定です

・関数の中身
Translateにテキストとターゲット言語を送って翻訳後の文字列を返すだけです

```python
import boto3

def lambda_handler(event, context):
    translate = boto3.client("translate", region_name="us-west-2")
    response = translate.translate_text(
        Text=event["text"],
        SourceLanguageCode=event["source_lang"],
        TargetLanguageCode=event["target_lang"]
    )
    return response['TranslatedText']
```

## API Gateway
LSLではLambda関数使用できないのでAPI Gateway作ります。

### カスタムドメイン
独自ドメインを使いたい人は設定してね、無くても出来るけどURL長いよー

・ドメイン名
適当

・エンドポイントの設定
エッジ最適化

・ACM証明書
AWS Certificate ManagerでSSL証明書を作成してね(バージニア北部のみの対応だよー

### APIキー作成
認証無いと外部から使用されてお金いっぱいかかるかも

作成は「API キーを作成」クリックして名前入力するだけ。簡単。



## LSL Script
作成中・・・
Django で MariaDB の CRUD

こちらのプログラムに CRUD の機能をつけました。
[Django で MariaDB のテーブルを表示](https://qiita.com/ekzemplaro/items/ece3fea10ada67c99b16)

Django のコードはこちらです。
[ekzemplaro/django_mariadb_city
](https://github.com/ekzemplaro/django_mariadb_city)

アプリの構造

```text
$ tree city -I '_*'
city
├── admin.py
├── apps.py
├── forms.py
├── migrations
│   └── 0001_initial.py
├── models.py
├── static
│   └── city
│       └── css
│           └── city.css
├── templates
│   └── city
│       ├── create.html
│       ├── delete.html
│       ├── edit.html
│       └── index.html
├── tests.py
├── urls.py
└── views.py
```

1) GitHub からクローン

```bash
git clone https://github.com/ekzemplaro/django_mariadb_city
```

2) 必要なライブラリーのインストール

```bash
sudo pip3 install django-environ
```

3) .env の作成

```text:proj01/.env
DB_USER="django"
DB_PASSWORD="tiger123"
DB_NAME="django_city"
```

4) データベースの作成
ユーザー　django
パスワード　tiger123
データベース　django_city

```text
mysql> create database django_city;
mysql> grant all on django_city.* to django@localhost;
```

5) マイグレーション

```bash
cd prog01
python manage.py migrate
```

6) データをデータベースに入れる

```bash
cd data
./go_restore.sh
```

7) 開発サーバーを起動

```bash
python manage.py runserver
```

8) http://127.0.0.1:8000/city/ にアクセス

![city_jan2201.png](https://qiita-image-store.s3.amazonaws.com/0/179446/8f9b77d8-bcb0-5b54-95f9-90d9c591ce7f.png)

Create
![city_jan2202.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5e6c001d-d96a-14af-a7e6-e22ba37c507b.png)

Update
![city_jan2203.png](https://qiita-image-store.s3.amazonaws.com/0/179446/aed32e2d-6087-3a3e-d910-ae79f795d289.png)

Delete
![city_jan2204.png](https://qiita-image-store.s3.amazonaws.com/0/179446/912ce785-1883-a66f-68bf-d05ed19ca26f.png)
kintoneで作成した日直日誌を運用してみた結果のまとめ

#目次
[１．日直日誌について](#１日直日誌について)
[２．運用した結果の考察](#２運用した結果の考察)
[３．アンケートについて](#３アンケートについて)
[４．今後の展望](#４今後の展望)
[５．その他（アプリの資料・発表資料など）](#５その他アプリの資料・発表資料など）)




#１．日直日誌について
　紙で書く日直日誌は、取りに行ってから作成し担任に渡すまで時間が掛かり大変だと感じたためkintoneで日直日誌を作成しました。
時間に余裕があるときに簡単に作成できるよう簡単でわかりやすいアプリにしました。
日直日誌の特徴や操作方法などは[こちら][link-1]
[link-1]:https://qiita.com/tegoshi32/items/6779005c0c36a754ccac

#２．運用した結果の考察
　隙間時間に簡単に入力できるようになったため使いやすいという意見がとても多かったですが、日誌を簡単に作成できるようになった分記入を忘れてしまう人が増えてしまいました。
今までは1対1でコミュニケーションを図る日誌でしたが、コメント機能を使って多くの生徒がコミュニケーションを図っていたため、良い日誌を作り上げることができました。
また、下記の記入している時間に注目をしてほしいのですが高校生の隙間時間は運動部の生徒は夜遅くから朝早い時間に日誌を記入しており、文化部の生徒は夕方から夜遅い時間の間に記入している生徒が多かったです。これらのことから、生徒は夜、自分のプライベートな時間を使用して記入していることがわかりました。

他にも紙媒体での当番日誌だと閲覧できるのは2人までなのですがkintoneを使うことで多くの人数の人が閲覧することができました。（さらにいうと学校に通学するまでの時間に見ている生徒もいました）
担任の先生にも運用した結果について聞きましたが、担任の先生も部活の隙間の時間を使うことや、寝る前に・・・。など、学校以外の場所で使用できることがとても効率的で仕事の改善ができたとのことでした。以上のことから、このアプリは売れるかもしれないという野望も出てきました。

![kintonebokashi.png](https://qiita-image-store.s3.amazonaws.com/0/287032/2161981d-de72-ebd5-aaee-0e405b0aa342.png)






#３．アンケートについて
kintoneの日直日誌を使った生徒にアンケートをとりました

<h4>・「日直日誌は使いやすかったですか？」という質問に89.3％の生徒は「はい」、10.7％の生徒は「いいえ」と回答しました</h4>
![qiita gurahu.png](https://qiita-image-store.s3.amazonaws.com/0/287032/1ca2f2ae-e9b7-7ac5-063c-ad1620f0f329.png)

<h4>・「はい」と回答した理由</h4>
　「学校で日誌を書く必要がなくなったから」
　「移動教室が多い日でも焦らずに記入することができるから」
　「入力が簡単だから」

<h4>・「いいえ」と回答した理由</h4>
　「忘れてしまうから」
　「機械音痴だから」

<h4>・「改善点やほしい機能はありますか？」</h4>
　「通知がほしい」
　「パソコン版が見にくい」
　「氏名も選択にしてほしい」



<h4>・100％の生徒が紙よりも便利だったと回答してくれました</h4>
![qiita gurahu2.png](https://qiita-image-store.s3.amazonaws.com/0/287032/3cb2f9c6-7669-6abb-fc77-fc3077f5e8e8.png)



#４．今後の展望
・記入を忘れてしまう生徒がいたため通知を送るなど対策を立てて行きたいと思います。
・簡単に変更できる部分は生徒の意見を聞きながら変更を行い、これからもより良いアプリを作成します。
・また、2月の家庭学習のときに何か作ってみたいと改めて思いました。

YouTubeにもアップしましたのでプレゼンの様子もご覧ください。
https://www.youtube.com/watch?v=o12NuHM4L1A


#５．その他（アプリの資料・発表資料など）
cybozuのkintoneは[こちら][link-3]
[link-3]:https://kintone.cybozu.co.jp/

島田商業のホームページは[こちら][link-2]
[link-2]:http://www.edu.pref.shizuoka.jp/shimada-ch/home.nsf/IndexFormView?OpenView
GoogleAnalytics v4でCampaignTrackingReceiver is not registered, not exported or is disabled

GoogleAnalytics v4で不穏なログが出ていたのを発見。

```:logcat
CampaignTrackingReceiver is not registered, not exported or is disabled. Installation campaign tracking is not possible. See http://goo.gl/8Rd3yj for instructions.
```
日本語に翻訳

```
CampaignTrackingReceiverが登録されていない、エクスポートされていない、または無効になっています。
インストールキャンペーンの追跡はできません。
手順については、http：//goo.gl/8Rd3yjを参照してください。
```

### 解決策 1

ただの警告なので無視しても大丈夫

なぜ大丈夫かという、
`adb shell setprop log.tag.GAv4 DEBUG`
とするとLogcatでGAのDEBUGログが出力されるため、何も対処せずとも送信されている事が確認できた。

```
D/GAv4: Hit delivery requested: ht=****** 略
D/GAv4: Hit sent to the device AnalyticsService for delivery
```

### 解決策 2

このログを出したくない！という場合はAndroidManifest.xmlに以下を追加する。

```xml:AndroidManifest.xml
<application>
        <!-- Google Analytics -->
        <receiver
            android:name="com.google.android.gms.analytics.CampaignTrackingReceiver"
            android:enabled="true"
            android:exported="true"
            >
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>
```

これで不穏なログが出なくなった。

## 参考リンク

- android - CampaignTrackingReceiver is not registered - Google Analytics v4 - Stack Overflow https://stackoverflow.com/questions/30429530/campaigntrackingreceiver-is-not-registered-google-analytics-v4
- アナリティクスを Android アプリに追加する  |  Android 向けアナリティクス  |  Google Developers https://developers.google.com/analytics/devguides/collection/android/v4/
MacOSをMojaveにアップデートしたらpip installでxcrun error

備忘録。
タイトルどおり、osアップデートしたら、pip installで以下のようなエラーが発生

```bash
,,,省略,,,
    xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    error: command 'gcc' failed with exit status 1
```


なぜかはよくわからないが、コマンドラインツールへのパスが無効になってるので、Mojaveに対してもう一度xcode-selectをインストールする。
やっとかないと、pipだけじゃなくてgitとかbrewとかいろんなコマンドで同じようなエラー吐きそう。


ターミナルで

```bash
xcode-select --install
```

でインストール確認ポップアップが表示されるので、OKを選択。
完了後もういちどpip installすると今度は成功しました。


もしかしてOSメジャーアップデートするたびに必要？
【学習メモ】Bashとコマンドプロンプトの対応表

# はじめに
バッチファイルを書くときの忘備録。
Powershellも呼び出します。
bash: 4.2.46
cmd:10.0.17134.1

### コマンド
|内容|Bash|コマンドプロンプト|
|:--|:--:|:--:|
|実行結果を標準出力に出さない|行末に```>/dev/null```|行末に```>nul```|
|コマンドを非表示に|(表示されない)|行頭に```@``` または ```@echo off```|
|時刻|```echo `date +"%Y%m%d".%H%M` ```|```echo %date:~0,4%%date:~5,2%%date:~8,2%.%time:~0,2%%time:~3,2%```|
|引数|```$1 $2 $3 $*```|```%1 %2 %3 %*```|
|改行|```echo```|```echo .```|
|改行エスケープ|``` \ ```|```^```|
|スリープ|```sleep N```|```timeout N /nobreak```|
|パイプでgrep|&#124;grep A|&#124; findstr A|
|grep A or B|grep -E "A&#124;B" |findstr "A B"|
|grep "A B C"|```grep "A B C" ```|```findstr /C:"A B C" ```|
|サービスの操作|```systemctl (start/stop/status) hoge```|```sc (start/stop/query) "hoge"```|
|コメント|```#```|```rem```|
|関数の宣言|```function functionname(){}```|```:functionname```|
|関数の呼び出し|```functionname```|```call :functionname```
|コマンドの実行(終了を待つ)|```./hoge.sh```|```call hoge.bat```|
|コマンドの実行(別窓)|```./hoge.sh &```|```start hoge.bat```|
|子スクリプト/ラベルの終了|(なし)|```exit /b```|
|子スクリプト/ラベルの終了ステータスコード|(なし)|```exit /b 0```|
- ラベルは```call :check1 && :check2```みたいな使い方ができるので関数に分類。

### 比較演算子とか
|内容|Bash|コマンドプロンプト|
|:--|:--:|:--:|
|直前の終了コードで分岐|```[ "$?" = 0 ] && CMD```|```if %errorlevel% == 0 CMD```|
|ファイルの有無|```[ -e $filepath ] && CMD```|```if exist filepath CMD```|

### ネットワーク
|内容|Bash|コマンドプロンプト|
|:--|:--:|:--:|
|curl|```curl hoge.hoge```|```powershell Invoke-RestMethod -Uri "http://hoge.hoge/" -Method GET```
|ifup|```ifup eth0```|```netsh interface set interface "Ethernet0" enable```|
|ifdown|```ifdown eth0```|```netsh interface set interface "Ethernet0" disable```|
参考
[Windowsにcurlが無い？いいえ、Invoke-RestMethodがあります。GrailsアプリへのPOSTリクエストを試す](https://qiita.com/_y_u_/items/94dd8ad6fcc8d278f433)

### Windows特有のもの
|内容|Bash|コマンドプロンプト|
|:--|:--:|:--:|
|vbsの実行|(なし)|cscript hoge.vbs|
|画面のロック|(なし)|```rundll32 user32.dll, LockWorkStation```|
|バッチファイルの場所にカレントを移動|(なし)|```cd %~dp0```|

### vbsでメール送信
https://www.google.com/search?q=vbs+メール送信
AWS Glue の Python shell アイデア集

# Glue Python shell なにそれおいしいの？

Glue上で動く時間制限がないLambda(python)みたいなもの ？
サーバーレス ？
おもろいジョブフロー作れそう ？
Jupyter Notebookでなにかおもしろいことやれる ？
1回の実行で0.05円 ？

# Glue Python shell ネタを集めたい

おもしろいネタ
実用的なネタ
ちょっとした小ネタ
作った方いらしたら是非お気軽にコメントなどでご連絡ください。リンクをはらせてください。

# ネタ集

1.[Sparkジョブで出力された長い名前のファイル名をPython Shellでリネーム](https://qiita.com/pioho07/items/a24d188d67fe97034b34)

2.[AWS GlueのPython Shellジョブを使ってGlue Crawlerを呼ぶ](https://qiita.com/kanga/items/404513eaf61e13912cc6)

3.データの移動
https://aws.amazon.com/jp/blogs/big-data/our-data-lake-story-how-woot-com-built-a-serverless-data-lake-on-aws/
GlueがS3にデータを書き込んでいる間にユーザーがそのテーブルをクエリした場合、長時間実行されるジョブの中には読み取りの不一致が発生するものがあります。 AWS GlueジョブをSparkを使用して一時ディレクトリに書き込むように変更し、次にboto3を使用してファイルを所定の場所に移動しました。これにより、読み取りの不整合が最大90パーセント減少しました

4.[python shellでジョブフロー](https://dev.classmethod.jp/cloud/aws/20190129-aws-glue-python-shell/)
安定のクラメソさんのブログ。Redshiftの集計〜Glueのジョブ〜パーティションの追加といった一連の処理を、ETLパイプラインとしてまとめることができます

5.[python shellだけでRDS->S3](http://tech.connehito.com/entry/2019/04/18/164551)
コネヒトさんで、Glueのpython shellのみを使ったETL。データ量に応じて適切な処理エンジン選ばれてます

## こちらも是非

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f
Pandas初心者が基本の「き」をメモってみる(読み込み, 結合, 保存編)

こんにちは,いつもは羊の毛刈りなどをしている者です.
**「表の操作はPandasが便利だよ！」** って話を聞いていましたが,
毎回「Pandas 処理」などで検索して全く自分の身についてないので,
Qiitaにまとめてみようとおもい, 今回投稿させていただきます.
(同人界隈でいうと尻たたき的な投稿です, 稚拙なのは了承願います)

## 動作環境
win10, jupyter notebook上でpython3.7を使用しています.


## Pandasってなんだよ

wikipediaによると, 
> Pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。

という事で, データをいじる人にとって身に付けておくべきものなのかなぁって感じです.

## どうやって動かすんだ？
jupyter notebook上なら, pandasをEnvironmentsからインストールして利用が可能です.

### インポート

```py
import pandas
```

毎回pandasって書くのメンドイってひとは

```py
import pandas as pd
```

ってして, 省略もできる！(こっちが主流)

### 表の読み込み

今回私は, 10行1列のデータ(CSV)が複数あり, それらを縦方向にまとめたいです.

こんなやつ↓
```text:masked_hue.csv
  1.46E+03
  1.31E+02
  1.43E+02
  1.59E+02
  2.89E+02
  4.40E+02
  3.78E+02
  1.93E+02
  4.08E+02
  3.12E+02
```
今回の場合は, ヘッダー(表のタイトル的なやつ)が何もないので,

```py
data1 = pd.read_csv('hoge/piyo/masked_hue.csv', header=None)
```
とします.

(ヘッダーなどが付いてるのは他の投稿をご参考下さい)

### データの結合

こんな感じで, 簡単にデータを読み込めた.
という事で, データを結合する！

さっきと同様に``data1``と``data2``があるとします.

縦方向に結合する場合は,

``data_matome = pd.concat([data1, data2], axis=0)``

と書けばOKです！ 
ここで, ``axis=0``というものは「軸」という意味で,
``axis=0`` は「縦軸に」って意味らしい.

つまり, 横軸につなげる時には, 
``azis=1`` とすればOKですね！

## データを保存する.

結合したデータを保存したい！
今回はCSV形式での保存がしたいので,
``to_csv()``というものを使用します.

今回結合したデータは``data_matome``(汚い変数だな･･･）にしたので,

```py
data_matome.to_csv("matometayo.csv")
```

という風にすると, ``matometayo.csv``というCSV形式のファイルが保存されます.


##まとめ

ということで, Pandasの本当に初歩の初歩を触りました.
もっと奥は深いですが, 基礎を知ってる, 知らないは大きいと思うので,
日々精進していこうと思います.

(1/22 17:00 追記)
Pandasのheaderとかindex_colっていうのが凄くクセモノってことが分かった.
とりあえずここも頑張って理解しよう. 理解というか流暢な操作ができるように･･･
Node.jsのファイル操作について１

#Node.jsのファイル操作
Node.jsのファイル操作について簡単にまとめてみる
## Node.jsでファイル操作を行うには？
　　<font color="Red">**fsモジュール**</font>という**公式モジュール**を使用する。
## **fsモジュール**使い方
今回はファイルの読み込みについてまとめてみる
### ファイルの読み込み  
1. <font color="Blue">**require()**</font>を用いて**fsモジュール**を使用できる状態に
  
```javascript
//fsモジュールを使用できる状態にする
var fs = require('fs');
```
　以降は fs　を用いることでファイル操作が行える
2. <font color="Blue">**readFile()**</font>を用いてファイルを読み込む  

```javascript
//fs.readFile(ファイルパス,文字コード,コールバック関数);
fs.readFile("sample.html","utf-8",function(err,data) {
   if(err) {
   //エラー処理
   }
   //受け取ったデータを表示
   console.log(data);
)};
```
  - 第一引数：ファイルパス(文字列)  
  　-　`__dirname` を用いると実行中のソースコードが格納されているディレクトリパスを取得できる
  - 第二引数：文字コード(utf-8など)
  - 第三引数：ファイルを読み込んだ後に実行される関数(コールバック関数)
    - <font color="Green">**err(エラー処理)**</font>  
      - *if*文を用いてエラー処理を行う
    - <font color="Green">**data(ファイルの中身)**</font>  
      - 上記では**sample.html**の中身が<font color="Green">**data**</font>に格納されている  
  
## ファイルを読み込むメソッドについて
- <font color="Green">「**readFile()**」
 - <font color="red">「**同期処理**」</font>
- </font><font color="Green">「**readFileSync()**」</font>
 - <font color="red">「**非同期処理**」</font>　　
  - <font color="red">**ファイルを読み込んでいる間も処理が止まらず別の作業を行うことができる**</font>  


##最後に
今回はfsモジュールを用いてファイルの読み込みについてまとめた
次回はファイルの書き込みについてまとめてみる
Quantopianの損切り注文でエラーが出る

#問題
先日書いた[「Quantopian事始め」](https://qiita.com/akihirosasaki/items/b622479008e7d24b122d)の記事で、期間を長くしてバックテストを実行しようとするとなぜか以下のエラーエッセージにぶち当たる。（３ヶ月くらいの期間で実行すると回る。）

![スクリーンショット 2019-01-22 13.10.29.png](https://qiita-image-store.s3.amazonaws.com/0/325611/0afdf2ab-1412-8a79-14c0-99c91f566e92.png)

>BadOrderParameters: Attempted to place an order with a stop price of nan

どうやら損切り注文の部分で、なんかしらの銘柄の株価を取得できず、損切り価格の値がNanになっているために怒られているらしい。

#対策
損切り注文の部分でcan_trade()を使って、銘柄の取引が可能である場合に注文を実行するようにする。

```python
if (position > 0) & (data.can_trade(stock)):  
            order_target_percent(stock, 0, style=StopOrder(price - (price*0.005)))
```

#結果
無事直近3年でもバックテストが回った。（結果はさておき）

![スクリーンショット 2019-01-22 14.04.47.png](https://qiita-image-store.s3.amazonaws.com/0/325611/7b76775d-00ac-cdad-9da4-58875be28c60.png)

can_trade関数は偉大すぎるので、基本的に注文を実装する時には適用した方がいいのかもしれない。
GUIアプリケーションのメニュー選択をpytestでテスト

GUIアプリケーションのメニューから、正しいメソッドが呼び出されていることを確認するテストです。[pytest-qtのissue](https://github.com/pytest-dev/pytest-qt/issues/195)に書かれていますが、実際にメニューを選択することは難しいとのことで、メニュー項目に割り当てられているQActionオブジェクトにtriggerイベントを発生させること代用することを勧められています。

# 前提条件

## 開発環境

対象とするGUIアプリケーションはPython+Qtで開発されているとします。Qtのライブラリは以下のいずれにも対応するとのことですが、PySide2環境で検証しました。

- PySide2
- PySide
- PyQt5
- PyQt4

## インストールするパッケージ

以下のパッケージが必要です。

- [pytest](https://docs.pytest.org/en/latest/)
- [pytest-qt](https://pypi.org/project/pytest-qt/)
- [pytest-mock](https://pypi.org/project/pytest-mock/)

```console
pip install pytest pytest-qt pytest-mock
```

# 作業手順

## サンプルのプログラム

メニューが「メニュー」一つ、それにメニュー項目が「アクション」の一つのみのシンプルなプログラムです。

```python:qiita.py
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QAction
from PySide2.QtWidgets import QMenu

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        menu = QMenu('メニュー', self)
        action = QAction('アクション', menu)
        action.setObjectName('action')
        action.triggered.connect(self.action_function)
        menu.addAction(action)
        self.menuBar().addMenu(menu)
    
    def action_function(self):
        print('アクション')
        return


def main() -> None:
    app = QApplication()
    window = MainWindow()
    window.show()
    app.exec_()

if __name__ == '__main__':
    main()
```

注意点としては、テストスクリプトからメニュー項目のQActionオブジェクトを検索するために、以下を設定しています。

- メニュー項目のQActionオブジェクトにオブジェクト名を設定
- MainWindow(QWindowのサブクラス), QMenu, QActionが親子関係

## テストスクリプト

「アクション」項目に正しいメソッド(ここではaction_function)が設定されているかを確認するテストスクリプトです。

```python:test_qiita.py
from PySide2.QtWidgets import QAction

from qiita import MainWindow

def test_qiita(qtbot, mocker):
    window = MainWindow()
    mocker.patch.object(MainWindow, 'action_function')
    window.findChild(QAction, 'action').trigger()
    MainWindow.action_function.assert_called_once_with()
```

テストスクリプトは以下の動作をします。

1. 呼び出されるべきaction_functionをモックに置き換えます。
2. テスト対象のメニュー項目に該当するQActionオブジェクトをfindChildメソッドで検索して、trigger()イベントを発生します。
3. 置き換えたモックが呼び出された回数を確認します。

## テストの実行

以下のコマンドを実行します。

```console
$ pytest test_qiita.py
```

以下のように出力されます。

```console 
============================= test session starts ==============================
platform linux -- Python 3.6.7, pytest-4.1.1, py-1.7.0, pluggy-0.8.1 
cachedir: .pytest_cache
PySide2 5.12.0 -- Qt runtime 5.12.0 -- Qt compiled 5.12.0
rootdir: /home/user1/projects, inifile:
plugins: qt-3.2.2, mock-1.10.0
collected 1 item                                                               

test_qiita.py::test_qiita PASSED                                         [100%]

=========================== 1 passed in 0.19 seconds ===========================
```
ブラウザでzipファイルの展開後のファイルサイズを取得したい

クライアントサイドでzipファイルの展開後のファイルサイズの合計を出す要件があり、その対応をメモしておく。
ちなみに用語として展開を表す言葉は「解凍」や「伸張」等様々だが、本投稿では「展開」で統一しておく。＃個人的にはどれでもよいが

##要件
要件は以下の通り。
　・画面でzipファイルの展開後のファイルサイズを測り、サーバにリクエストしたい
　・画面には「input type="file"」のファイル入力欄がある
　・ライブラリは「zlib.js」を使用する
　・可能であれば展開せずにファイルサイズのみ知りたい

##zlib.jsとは？
簡単にzlib.jsについて説明。
zlibというC言語で作成されたオープンソースのライブラリを使用したjavascript向けのライブラリ。
詳しくはこちらを参照のこと。（https://github.com/imaya/zlib.js/）
＃zlibはgzipを開発した方が作成したらしく、圧縮・展開を取り扱う場合に広く利用されている。javaの圧縮・展開もzlibを使用しているらしい。

##展開後のファイルサイズを取得するコード
コードは以下の通り。

```javascript:
<script src="vendors/zlib/unzip.min.js"></script>
～中略～
var file = document.getElementById("file").files[0];	// fileがファイル入力欄
var reader = new FileReader();
reader.readAsArrayBuffer(file);
var unzip = new Zlib.Unzip(new Uint8Array(reader.result));
unzip.getFilenames();	// 呼び出すことでファイル情報のオブジェクトの配列が生成される
var fileInfoArray = unzip.i;	// ファイル情報のオブジェクトの配列
var decompressedFileSize = fileInfoArray.reduce((sum, file) => sum + file.J, 0);	// Jに展開後のファイルサイズが格納されている
```

##説明
注意すべき点はUnzipコンストラクタの引数。FileReaderで読み込んだ結果はArrayBufferなのでUint8Arrayに正している。
＃自分はこれをしないでエラーが出てハマってしまった。。。

もう一点、getFilenames()を呼び出しているところ。これを呼び出すことでファイル情報のオブジェクトが生成されるらしい。
ファイル情報のオブジェクトの配列の変数名や展開後のファイルサイズの変数名を見てわかる通り、一般に利用されることが想定されていないものなので、利用は自己責任で。

ちなみに、ディレクトリを含む場合、ディレクトリの要素の展開後のファイルサイズは必ず0になっているため、ディレクトリか否かを特段気にせず合計を求められる。
これで展開することなく全ファイルの合計が求められる。

＃展開は、unzip.decompress("filename")を呼び出すことで展開後のUint8Arrayが取得できる。この処理を行わずに展開後のファイルサイズを求めているため、展開することなく合計が求められていると判断している（一応元ソースも見たがdecompressを呼び出さない限り展開はされていないはず）
ブラウザからS3にPUTリクエストする際の注意（プリフライトリクエスト）

S3のPutObjectを一時的に使用可能なURLとして公開する必要があり、サーバ側のロジックより一時URLの取得ができたので、一時URLをブラウザに返却、ブラウザから一時URLにPUTリクエストした際に直面した問題についてメモ。
＃HTTP通信に詳しい方は聞き流して頂きたい
（ちなみにこのような仕様になっているのは、大容量のファイルをS3へ素早く登録するため。サーバからS3へPUTする場合はPUT対象のファイルをブラウザ→サーバ、サーバ→S3へ転送することになり処理時間がブラウザ→サーバへの転送分多くなる。また、アプリサーバやサーバ側フレームワークに最大ファイルサイズ設定があり、この最大ファイルサイズ設定を都度変更する必要があり、運用上この設定を頻繁に変更したくないとの要望があっため）

##一時的に使用可能なURL

まず、一時的に使用可能なURLについて。
今回はPHPのSDKを使用したため、以下のページを参照。
https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/s3-presigned-url.html

上記の内容に沿って実装すれば簡単に署名付きURLを作成可能。
上記のサンプルではGetObjectだが、コマンドの部分をPutObjectに変えるだけでPutObjectの署名付きURLを作成可能。
KeyにはバケットにPUTするファイル名を指定すればOK。（**既にキーが存在する場合は上書きされるので注意**）

##ブラウザからリクエスト！

話は戻って、サーバから返却された一時URLをブラウザから呼び出す。
javaScriptは、jQueryでajaxでリクエスト送信した。

```javascript:
	$.ajax({
		url: [一時URL],
		type: 'PUT',
		contentType : false,
		cache: false,
		processData: false,
		data: [PUTするファイル],
		success: function(json) {
			console.log("success");
		},
		error: function(xhr, status, error) {
			console.log("error");
		},
		complete: function(xhr, status) {
			console.log("done");
		},
	});
```

結果、

> jquery.min.js:4 OPTIONS [一時URL] 403 (Forbidden)
Failed to load [一時URL]: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin [リクエスト元のオリジン] is therefore not allowed access.

何故このような結果になったのか？？

##プリフライトリクエスト
エラー内容を見るとPUTリクエストではなくOPTIONSリクエストが送信された際のエラーとなっている。
HTTP通信に詳しい方はご存知かと思うが、オリジン (ドメイン、プロトコル、ポート番号) の異なるサイトへのPUTリクエストを送信する際、プリフライトリクエストなるリクエストが発行される。
（詳しくは→https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control#Preflighted_requests）
プリフライトリクエストはオリジン間リソース共有 (CORS)の仕組みにのっとった手法で、AWSにもCORSへの対応が記載されている。
（https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/cors.html）
上記を踏まえるとエラー内容は、「プリフライトリクエストのOPTIONSリクエストを送信した際に、送信先オリジンがリクエスト元のオリジンのリクエストを許可していなかったため」、と読むことができる。

##再度リクエスト！
前述のプリフライトリクエストが許可されるようにS3のバケットのCORSConfigurationのAllowedOrigin設定にリクエスト元のオリジンを、AllowedMethodにPUTを設定。
再度リクエストを送信！！！
結果、無事にS3へのPUTリクエストが完了した。

##まとめ
- 別オリジンへの一部のHTTP通信はプリフライトリクエストが発行される
- AWS S3の設定でオリジン間リソース共有 (CORS)に対応可能
- S3へのリクエストでGET以外のリクエストがエラーとなりリクエストメソッドがOPTIONSであった場合はS3のCORS設定を見直そう
Oracleネタ帳 セッションについていろいろ

# セッションの確認
V$ビューの詳細についてはマニュアルを確認してください。

- V$PROCESS

https://docs.oracle.com/cd/E82638_01/refrn/V-PROCESS.html#GUID-BBE32620-1043-4345-9448-51DB21547FEB

- V$SESSION

https://docs.oracle.com/cd/E82638_01/refrn/V-SESSION.html#GUID-28E2DC75-E157-4C0A-94AB-117C205789B9

``` sql
set lin 200
col sid format 9999999
col serial# format 9999999
col oracle_pid format 9999999
col os_pid format 9999999
col machine format a30
col status format a8
col username format a30
col program format a48
select
    s.sid,
    s.serial#,
    p.pid oracle_pid,
    p.spid os_pid,
    s.machine,
    s.status,
    s.username,
    s.program
from v$process p
left outer join v$session s
on p.addr = s.paddr
where
    p.background is null and
    p.pid > 1
    -- 自分のセッションを除外したい場合、下記を追加
    -- and s.sid <> SYS_CONTEXT('USERENV', 'SID')
order by 1, 2;
```

# セッションを切断するには
SID、SERIAL#を指定してKILLします。

``` sql
alter system kill session '<sid>, <serial#>';
```

# ブロックしている／されているユーザのWAITイベント名を参照

``` sql
select
    x.username "Blocking User",
    x.event "Wait Event",
    y.username "Blocked User",
    y.event "Wait Event"
from v$session x, v$session y
where y.blocking_session=x.sid
and   y.blocking_session_status='VALID';
```

# ブロックされているオブジェクトについて参照

``` sql
select
    x.username "Blocking User",
    y.username "Blocked User",
    y.row_wait_obj# "Object#",
    y.row_wait_file# "File#",
    y.row_wait_block# "Block#",
    y.row_wait_row# "Row#"
from v$session x, v$session y
where y.blocking_session=x.sid;
```

# オブジェクトの所有者と名前を参照

``` sql
select OWNER,OBJECT_NAME from dba_objects where OBJECT_ID = &ObjectId;
```

# ロックの状態を確認する

``` sql
SELECT SID, SERIAL#, PROCESS, MACHINE FROM V$SESSION
WHERE SID IN (
  SELECT SID FROM V$LOCK
  WHERE TYPE IN ('TM', 'TX')
);

Select V$SQLAREA.SQL_TEXT,V$SQLAREA.ADDRESS
 From V$SQLAREA, V$SESSION, V$LOCK
 Where V$SQLAREA.ADDRESS = V$SESSION.SQL_ADDRESS
 And V$SESSION.SID = V$LOCK.SID
 And V$LOCK.TYPE IN ('TX','TM');

Select V$SESSION.SID, DBA_OBJECTS.OBJECT_NAME, V$SESSION.OSUSER, V$SESSION.PROGRAM
 From V$LOCKED_OBJECT 
 Left Join DBA_OBJECTS on V$LOCKED_OBJECT.OBJECT_ID = DBA_OBJECTS.OBJECT_ID
 Left Join V$SESSION ON V$LOCKED_OBJECT.SESSION_ID = V$SESSION.SID
 Order By V$SESSION.SID, DBA_OBJECTS.OBJECT_NAME;
```
思い立ったのでGoでFizzBuzz書いた

面接の時にFizzBuzzが書けないプログラマーがいる！みたいな書き込みを見て、「あれ？僕もちゃんと書けたっけ？」と不安になったのでエイヤーっで書いた。

```fizz_buzz.go
package main

import (
	"fmt"
)

func main() {
	for i := 1; i <= 100; i++ {
		switch {
			case isFizzBuzz(i):
				fmt.Println("FizzBuzz")
			case isFizz(i):
				fmt.Println("Fizz")
			case isBuzz(i):
				fmt.Println("Buzz")
			default:
				fmt.Println(i)
		}
	}
}

func isFizzBuzz(i int) bool {
	return isFizz(i) && isBuzz(i)
}

func isFizz(i int) bool {
	return i % 3 == 0
}

func isBuzz(i int) bool {
	return i % 5 == 0
}
```

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

https://play.golang.org/p/E6IGF3wLM6z
tweepyで複数の画像を投稿する。

#使用するライブラリ
tweepy 3.6.0

#メソッド
tweepyで複数の画像を投稿するためには

- media_upload メソッド
- update_status メソッド

を使用します。

#スクリプトを書く
```python:tweet_multiple_image.py
import tweepy

#トークンを入れる
CK= ''
CS= ''
AT= ''
AS= ''

auth= tweepy.OAuthHandler(CK,CS)
auth.set_access_token(AT,AS)

api= tweepy.API(auth)

#ツイートしたい文章
status= ''

#ツイートに付加したい画像をimagesリストに入れる
#media_idsは投稿した画像のidを入れるためのリスト
images= []
media_ids= []

#画像は4枚までしか投稿できないので4回ループする
for i in range(4):
    img= api.media_upload(images[i])
    media_ids.append(img.media_id_string)

    #リスト内包記で書く場合
    #media_ids= [api.media_upload(images[i]).media_id_string for i in range(4)]

    media_ids= ','.join(media_ids)

#ツイートとして投稿しているのはここ
api.update_status(status=status,media=[media_ids])
```

画像付きのツイートは上のスクリプトで動きます。投稿した画像のサイズが極端に小さいと下の画像のようにURL表示されます。
![IMG_E8285.JPG](https://qiita-image-store.s3.amazonaws.com/0/346540/2f0c7071-9734-5003-49a8-c77fa668f81f.jpeg)
一応、ツイートをクリックすれば、表示されます。
「VirtualBoxで64bitが選択できない場合の対応方法」レビュー

## 概要

VirtualBoxで64bit環境が作れない（セレクトボックスに出てこない）
「VirtualBoxで64bitが選択できない場合の対応方法 https://qiita.com/ustakr/items/63530ae3425e62e4e44b 」を参考に対応した

## 解決まで

* Docker for Windowsが入ってる　⇒　アンインストール
* Vagrantが入ってる　⇒　アンインストール　（関係なかったかも…？）
* VirtualBoxも一応アンインストールして、再度インストール
* Ubunts64bitが選択できるようになる
* 新規作成して設定を変更しようとするが、下記の英語のアラートメッセージが表示され設定変更が適用できない

```
the hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system.
```

* スタートメニューを右クリック＞アプリと機能＞関連設定－プログラムと機能＞Windowsの機能の有効化または無効化で「Hyper-V」のチェックを外す。自動で再起動される。
* 自動で再起動されたが、まだ同様の英語のアラートメッセージが表示されるため、もう一度スタートメニューから再起動。
* 英語のアラートメッセージは出てこなくなり、仮想環境の設定変更が適用でき、環境の起動も行えた。

## 他、参考文献

* Hyper-Vの使い方 Windows 10にWindows 7インストール | パソコン工房 NEXMAG https://www.pc-koubou.jp/magazine/2372

## 雑

「Hyper-V」って何を悪さをしてるんだろ？と思ったけど、この記事の投稿後に関連記事で下記記事がでてきてへぇってなった。というかこの記事に最初に当たりたかったですね。
技術系アウトプットしてこなかったプログラマだけど書いてみるとそんな発見がされる機能いいですね。

 * VirtualBoxで64bitVMを作れるようにする(Hyper-V有効なWindows 8.1 Pro編) https://qiita.com/alaif-net@github/items/57a10b6e6d4de3b4583f #Qiita
Macの起動ディスクをAPFSフォーマットのUSB外付けSSDにするとハマる罠

# はじめに

この罠は執筆時点での最新、macOS Mojave 10.14.2で確認しています。

# 前提条件

* macOS High Sierra以上
* USB外付けSSD（もしくはUSB接続のSSDケース）を使用
* 上記のディスクをAPFSでフォーマット

# 発生する罠

## OS起動が異常に遅くなる

macOSの起動時、リンゴマークが表示されるまでに非常に時間がかかる現象が発生します。
かかる時間にはばらつきがありますが最大で5分超かかる時もありました。
リンゴマークが表示されたあとは通常通り動作します。

こちらに関しては現状APFSでフォーマットしている以上回避策はないようです。

## スワップ領域がマウントされない（危険）

この罠が発動すると物理メモリを使い切ってもスワップが作成されなくなります。

つまり、メモリを使い切った瞬間完全にMacがハングアップすることになります:skull:

これは手動でスワップ領域をマウントすればとりあえず解決します。

以下のコマンドでマウントすべきボリュームを確認しましょう。

```
 diskutil list
```

このリスト上で、APFS Volume VMと表示されているものが本来マウントされるべきスワップ領域です。

```
 diskutil info disk2s4(ボリュームのIDENTIFIERを指定)
```

diskutil infoでマウント状態を確認し、MountedがNoであればマウントされていない状態です。

このボリュームをdiskutil mountでマウントを行えば正しくスワップが作成されるようになります。

```
 sudo diskutil mount -mountPoint /private/var/vm disk2s4
```

ただし、これは再起動した際に解除されてしまいますので、起動時にログインスクリプト等で自動実行する必要があります。
（他に自動マウントする方法があればお教えください）

# 最後に

最近のmacOSは標準でAPFSフォーマットを選択したり復元時にAPFSに変換したりととにかくAPFSを推しているため、この罠にハマる危険性も高くなっています。
完全に回避するためにはTime Machine等を用いずにHFS+でまっさらにフォーマットする必要があります。

# 参考資料

[スワップ領域が確保されない - Apple コミュニティ](https://discussionsjapan.apple.com/thread/110201665)
[MacOS 10.14 Mojave で外付けSSDを起動ディスクにしたら起動が遅い時の対処法](https://www.secret-base.org/entry/mojave-SSD)
初めてのチュートリアル

#初めてのチュートリアル
-急にAWSを習得しなければならなくなってしまいました。
記録用に残していきたいと思います。
![コミュニティガイドライン](https://qiita.com/longtime1116/items/0b8f9a2fc5d64b525177)
こちらを参考にさせていいただきながら進めていきたいと思います

#1. IAM : 認証
-AWS アカウントには 1 つ以上の IAM ユーザーを作成できます
コンソールを使用してIAMユーザーの作成
ユーザの追加は簡単、ロールは仕様に合わせてアクセス、操作許可権限を付与する
細かいロールについてはまた、使いながら習得していこう

AWS　CLIによるユーザ作成
ここで初めてAWS CLIに触れます

結果　　Pythonのインストールまで行ったがCLIからみたパスの設定が不適切だったためか、途中で断念しました。
#2. EC2 : 仮想サーバー

-QwikLabで何度か起動したことがあるので割愛

#3. VPC
-QwikLabで使った経験はあるがここではセキュリティ面を考慮して見ていきます。


3 つの機能を使用して、仮想プライベートクラウド (VPC) のセキュリティを強化
*セキュリティグループ
関連付けられた Amazon EC2 <font color="Red">インスタンス</font>のファイアウォールとして動作し、インバウンドトラフィックとアウトバウンドトラフィックの両方をインスタンスレベルでコントロールする

*ネットワークアクセスコントロールリスト (ACL)
関連付けられた<font color="Red">サブネット</font>のファイアウォールとして動作し、インバウンドトラフィックとアウトバウンドトラフィックの両方をサブネットレベルでコントロールする

*フローフラグ
VPC のネットワークインターフェイスに出入りする IP トラフィックに関する情報をキャプチャする

![alt](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/images/security-diagram.png)

VPC
VPC 内に起動するインスタンスが VPC 外のリソースにどのようにアクセスするかをコントロールします。
デフォルト VPC にはインターネットゲートウェイが含まれ、各デフォルトサブネットはパブリックサブネットです。
デフォルトサブネット内に起動するインスタンスにはそれぞれ、プライベート IPv4 アドレスとパブリック IPv4 アドレスが割り当てられています。
これらのインスタンスは、このインターネットゲートウェイを介してインターネットと通信できます。インターネットゲートウェイを使用すると、
インスタンスは Amazon EC2 ネットワークエッジを介してインターネットに接続できます。
![alt](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/images/default-vpc-diagram.png)

<font color="Red">AWS PrivateLink </font>は、他の AWS アカウントでホストされているサービス (VPC エンドポイントサービス) VPC をプライベートに接続できる！？
![alt](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/images/vpc-endpoint-privatelink-diagram.png)

|![Amazon Virtual Private Cloud Connectivity Options]
(https://docs.aws.amazon.com/aws-technical-content/latest/aws-vpc-connectivity-options/)         
　　|ネットワーク接続のオプションの概要が記載されています。                              |
|![Amazon VPC forum]
(https://forums.aws.amazon.com/forum.jspa?forumID=58)           
　　|Amazon VPC に関する技術的な疑問について話し合うコミュニティフォーラムです。          |
|![AWS の開発者用リソース]
(http://aws.amazon.com/resources/)             
　　|ドキュメンテーション、コードサンプル、リリースノートをはじめとする、AWS ベースの革新的なアプリケーション開発に役立つさまざまな情報が収められた、中心的起点となるリソースセンターです。                               |
|![AWS サポートセンター]
(https://console.aws.amazon.com/support/home#/)|
　　AWS サポートのホームページです。                                  　　　　　　　   |
|![お問い合わせ]
(http://aws.amazon.com/contact-us/)            
　　|AWS の請求、アカウント、イベントに関するお問い合わせの受付窓口です。                 |

#4. RDS
-簡単にデータベースのプロビジョンができた！

MySQL Workbench から初めて操作してみた
SQLコマンドをほとんど使用したことないので練習が必要だ

#5. S3：ストレージ
-
バケットごとのパブリックアクセス設定
-パブリックアクセスコントロールリスト (ACL) を管理するのチェックを外すと
オブジェクトをアップロードすることができる
-パブリック ACL を通じて付与されたパブリックアクセスを削除する (推奨)のチェックを外すと
インターネット経由でバケット内のオブジェクトにアクセスすることができるようになる


オブジェクトごとのパブリックアクセス設定で
オブジェクトごとにインターネットからのアクセス設定ができる

このチュートリアルで学んだのはこのぐらいです。

#6. DynamoDB：NoSQLデータベース
-



![]()
![alt]()
<font color="Red"></font>