OmniAICreator/Qiita-1.07M huggingface dataset:
Cloudinary gemで  .jpeg を画像ファイルとして認識させる


# ハマったこと

https://github.com/0sc/activestorage-cloudinary-service を使って、 `.jpeg` のファイルをアップロードをしようとしたが 404 が返ってきました。

ただし、Cloudinary自体には対象のファイルはアップロードされているという状況でした。

# TL;DR

[v1.12.0 でこの問題は修正されました](https://github.com/cloudinary/cloudinary_gem/commit/d529213d93780d990048edab76fbe203838b153a)

画像を定義している `Cloudinary::Utils::IMAGE_FORMATS` に `jpeg` を追加します。

今回はRailsを使っていたので、

```ruby:config/initializers/cloudinary.rb
Cloudinary::Utils::IMAGE_FORMATS.append('jpeg')
```

と initializersに置いて対応しました。

:thought_balloon: ただ定数を上書きするので、あまり良い方法だとは思っていません... :sweat: 

# 原因

[このIssueにあるように](https://github.com/cloudinary/cloudinary_gem/issues/280)、[Cloudinary::Utils::IMAGE_FOMATSに jpeg が含まれていなかった](https://github.com/cloudinary/cloudinary_gem/blob/004980f8e6e685222bc8f32ec64f0e50c89a3344/lib/cloudinary/utils.rb#L816)ことが原因でした。

そのため、[Cloudinary gem側でAPIを叩くときのパラメータ resource_type を `image` でなく `raw` として呼び出してしまいます](https://github.com/cloudinary/cloudinary_gem/blob/004980f8e6e685222bc8f32ec64f0e50c89a3344/lib/cloudinary/utils.rb#L832-L843)。

# 余談

<del>`jpeg` を `Cloudinary::Utils::IMAGE_FORMATS` に追加する[Pull Requestを投げた](https://github.com/cloudinary/cloudinary_gem/pull/342)んですが、マージされる気配はなさそうです :cry: </del>

v1.12.0でマージされてました！
Node.jsのExpressフレームワークを使ってみる

## Expressとは
Node.jsのMVCのWebアプリケーションフレームワーク。
ここでは、そのインストール方法と、簡単なアプリケーションの作成方法を説明する。

## npmのインストール
以下を参考にnpmとnodejsをインストールする。

- [npmのインストール手順](https://qiita.com/Esfahan/items/067fc366d6a6e7b8690d)

## Expressのインストール
任意のディレクトリに移動して、以降のコマンドを実行。

### npmの初期化

```
$ npm init
```

入力項目はこちらを参照
[npmのインストール手順#npm init](https://qiita.com/Esfahan/items/067fc366d6a6e7b8690d#npm-init)


### Expressの雛形を作成
以下のコマンドで雛形を作成する。
今回はejsというテンプレートエンジンを使う。

```console
$ npm install express-generator
$ ./node_modules/.bin/express --view=ejs
destination is not empty, continue? [y/N] y

   create : public/
   create : public/javascripts/
   create : public/images/
   create : public/stylesheets/
   create : public/stylesheets/style.css
   create : routes/
   create : routes/index.js
   create : routes/users.js
   create : views/
   create : views/error.ejs
   create : views/index.ejs
   create : app.js
   create : package.json
   create : bin/
   create : bin/www

   install dependencies:
     $ npm install

   run the app:
     $ DEBUG=sample-app:* npm start
```

### npm installを実行

```console
$ npm install
```

### ブラウザからアクセス
アプリケーションを起動してブラウザからアクセスしてみる。

```console
$ npm start
```

http://localhost:3000
defaultで用意されているindex.jsにアクセスする。
以下が表示されればOK。

<img width="245" alt="Screen Shot 2019-08-06 at 17.27.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/0f4a944d-ea9f-026f-a272-844e1d538281.png">

## アプリケーションを作成してみる
### hello.jsを作成
routes/hello.js

```js:routes/hello.js
var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
  res.render('hello', { title: 'Hello World!', text: 'This is a sample page.' });
});

module.exports = router;
```

### テンプレートを作成
views/hello.ejs

```js:views/hello.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p><%= text %></p>
  </body>
</html>
```

### app.jsに以下を追記
app.js

```js:app.js
diff --git a/app.js b/app.js
index 62dff0d..68acca8 100644
--- a/app.js
+++ b/app.js
@@ -6,6 +6,7 @@ var logger = require('morgan');

 var indexRouter = require('./routes/index');
 var usersRouter = require('./routes/users');
+var helloRouter = require('./routes/hello');

 var app = express();

@@ -21,6 +22,7 @@ app.use(express.static(path.join(__dirname, 'public')));

 app.use('/', indexRouter);
 app.use('/users', usersRouter);
+app.use('/hello', helloRouter);

 // catch 404 and forward to error handler
 app.use(function(req, res, next) {
```

### アプリケーションを起動

```console
$ npm start
```

### ブラウザからアクセス
http://localhost:3000/hello
以下が表示されればOK。

<img width="289" alt="Screen Shot 2019-08-06 at 17.41.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/7a7fc060-2621-c1f9-7a6b-6f9e71e3f99e.png">


## 参考
- [Express Generator を使った Node.js + Express.js の環境構築手順](https://qiita.com/tsuyoshioshima/items/7a553c25f222333b9503)
- [基礎的なWebアプリを作りながら、Node.jsの使い方を学ぶ(3)](https://yuap.jp/blog/674)
- [Node.jsのフレームワーク「Express」とは【初心者向け】](https://techacademy.jp/magazine/16119)
AtCoderのサンプルケースを自動でテストさせてみる(Win10&C++)

# はじめに
AtCoderで自分の書いたコードが正しいかどうかを与えられたサンプルケースで毎回試すわけだが、正直面倒くさい。
かといって、面倒くさがって一部しか試さず提出してしまうと**WA**になってしまうことがある。

そこで有志が開発した[online-judge-tools](https://github.com/kmyk/online-judge-tools)を使わせてもらい、テストケースを自動化する方法を備忘録的にまとめる。

#環境
・Windows10
・（C++）

#準備編
[online-judge-tools](https://github.com/kmyk/online-judge-tools)を使用するにあたり、Bashを扱える環境を準備する。
今回は**Windows Subsystem for Linux**でUbuntuをインストールする。
インストールは[Windows Subsystem for Linuxインストール手順](https://qiita.com/okcoder/items/65a4e8226c3789ce0078)を参考にした。


Ubuntuのインストールと更新を終えたら、次に`g++ `と`pip3`をインストールする。

```
sudo apt install g++
```

```
sudo apt install python3-pip
```
私の環境ではインストールに30分ほどかかった。

次に、先ほど導入した`pip3`を使って[online-judge-tools](https://github.com/kmyk/online-judge-tools)をインストールする。

```
sudo pip3 install online-judge-tools
```
`oj --version`でバージョンが最新のものかを確認する。これで準備は完了である。

#online-judge-toolsを使ってみる
テストケースをスクレイピングできるか確かめる。
まずは、ファイルの保存先をわかりやすいところにするため`cd`コマンドでディレクトリを移動する。
ex)

```
cd /mnt/c/users/{username}/desktop
```

次に`oj`コマンドで適当な問題のサンプルケースをdlする。
ex)

```
oj dl https://atcoder.jp/contests/abc136/tasks/abc136_a
```

デスクトップに`test`というフォルダが生成されていて、中に.in .out形式のファイルがあれば動作確認は成功である。

#実践編
テストケースを実行したい`.cpp`ファイルがある場所まで`cd`する。
ex)

```
cd /mnt/c/users/{username}/desktop/AtCoder
```

次に、`g++`を使ってコンパイルする。

```
g++ {file}.cpp
```


その後、提出する問題のサンプルケースを取得する。

```
oj dl https://atcoder.jp/contests/abc***/tasks/abc***_*
```


サンプルケースをテストする。

```
oj test
```

#最後に
導入はそこそこ大変だが、実際に[online-judge-tools](https://github.com/kmyk/online-judge-tools)を使ってみると非常にはかどる。

さらにシェルスクリプトを組み合わせるとさらに効率化できる（時間があれば別記事で紹介する）。
指定ウェブページの経由を条件に表示したい

#条件
商品説明（WordPress）表示は契約ページを経由する条件にしたい

```bash
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://entry\.site\.com/contract.*  <- 経由したいページ
RewriteCond %{HTTP_REFERER} !^https://faq\.site\.com.* [OR]
RewriteCond %{HTTP_REFERER} ^https://faq\.site\.com/error/  <- 終着エラーページにリダイレクト
RewriteCond %{HTTP:X-Forwarded-For} !^101.102.103.104  <- 社内IPからは制限しない
RewriteCond %{REQUEST_URI} !^/wp-login\.php.*
RewriteCond %{REQUEST_URI} !\.css$
RewriteCond %{REQUEST_URI} !\.gif$
RewriteCond %{REQUEST_URI} !\.png$
RewriteCond %{REQUEST_URI} !\.pdf$
RewriteRule .* https://entry.site.com/error/error.html [R,END]
</IfModule>
```

#参考
緩く限定したイベントページに使える
【備忘録・まとめ】AWS CloudTrail ユーザーガイド

## 出典

[AWS CloudTrail ユーザーガイド](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)

## まとめ

* AWSの各種リソースに対する操作のログが全部残せるサービス
* 大きく2つの粒度のイベントに分かれる
    * 管理イベント：AWSリソースへの操作
    * データイベント:リソース内で実行されたリソースオペレーションについてのイベント
    * データイベントのログは必要なところだけ残す
        * ログの量が大変なことになる
* 基本的に90日間分のログが見られたり検索できたりする
    * それ以上はS3にログを配信する
* CloudWatch Logsでイベントをモニタリングもできる

## 要点

### 概念

#### CloudTrailイベント

* AWSアカウントのアクティビティのレコード
* 2種類の記録可能なイベント (管理イベント、データイベント) 
* デフォルトでは、証跡にはすべての管理イベントが記録され、データイベントは記録されない
* 管理イベントとデータイベントはいずれも、同じCloudTrail JSONログ形式
    * [CloudTrail ログファイルの例](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-log-file-examples.html)

#### CloudTrailイベント履歴

* 過去90日間のCloudTrailイベントの表示、検索、およびダウンロードが可能な記録

#### 証跡

* Amazon S3バケット、CloudWatch Logs、およびCloudWatchイベント へのCloudTrailイベントの配信を可能にする設定
    * イベントのフィルタリング
    * イベントログファイルの暗号化
    * Amazon SNS 通知の設定・・・等が可能になる

### モニタリング

* CloudWatch Logsのロググループに、イベントログを配信できる
    * [Amazon CloudWatch Logs を使用して CloudTrail のログファイルをモニタリングする](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/monitor-cloudtrail-log-files-with-cloudwatch-logs.html)
* CloudWatch Eventsで、CloudTrailによって記録されたイベントから別のイベントをトリガーできる
    * [AWS CloudTrail を使用して AWS API コールでトリガーされる CloudWatch イベント ルールの作成](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-CloudTrail-Rule.html)

### ログの分析

[Athena](https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html)を使うと捗る模様

### ログファイルの出力

* CloudTrailは、ログファイルをgzipアーカイブでS3バケットに出力する
* [パス、オブジェクト名などのフォーマット](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-find-log-files.html)は予め決まっている
FTTxネットワークリンクモニタリング用の光ファイバーリフレクター

光ファイバーリフレクターは、特定の反射波長範囲内にない他の通信帯域を通常は通過しながら、特定の反射波長を反射するためにFBGファイバー格子またはフィルターを使用して、特定の帯域のみを通過させる光学受動デバイスです。

![03-英12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/fdb7819f-8859-6b39-5ece-32b117e4e589.jpeg)


光ファイバリフレクタは、伝送波長範囲での挿入損失が低く、反射波長範囲での高い反射率を持ちます。FTTxネットワークリンクモニタリングに最適な光端末であり、ポイントツーポイント（PTP）およびポイントツーマルチポイント（PTMP）ネットワークに適しています。 通常、ユーザーの家に設置され、テスト信号の反射によってOTDRトレースでこれらの場所を強調表示します。
![未标题-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/110a9f69-2eb4-39b0-9d14-85bf477b34a0.jpeg)
OTDRは、上図に示すように、ONU側に設置できます。OTDRは、反射器によって反射された光信号の強度を検出し、正常回線と障害リンク間のリターンロスを比較して、リンクを決定します。 繊維が損傷しているか破損しているか。 ただし、通常のパッシブ光ネットワーク（PON）システムの動作波長は反射器の条件を満たさず、その後ほとんど減衰せずに反射器を通過し、反射器は流れを乱したり損失したりすることなく監視機能を実現します。

一般的なリフレクタタイプは、特別なピグテールまたはアダプタタイプで利用できます。 YiyuantongのSCリフレクターは、SCコネクタパッケージに基づくリフレクターで、コネクターインターフェイスはSC / APC、SC / PCです。

![未标题-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/a9b240b9-d168-0c20-a70d-250db0586949.jpeg)
光ファイバーリフレクターは、シンプルな構造、低コスト、製造が容易、安定性が良いという特徴を持っています。主な参照パラメータは、小さな挿入損失、高いリターン損失、および高い反射率です。 追加またはトラブルシューティングの際にユーザーの光学的連続性を確認すると、リフレクターのサイズが小さいため、ユーザーの最後に簡単に直列に配置できます。

Fiber-to-the-home（FTTH）プロジェクトの実装により、光ネットワークのカバレッジはますます拡大し、より多くのユーザーが関与しています。したがって、光ネットワーク全体の障害を迅速かつ正確に検出および維持することが特に重要です。 光ファイバーリフレクターは、FTTxネットワーク、PON OTDRテスト、中央室の反射率テスト、通信システムリンク検出で広く使用されます。

HYC Companyは、受動通信の基本コンポーネントのR＆D、製造、販売、およびサービスを専門とする国立ハイテク企業です。 同社の主な製品は、光ファイバーコネクター（データセンターの高密度光コネクター）、波長分割マルチプレクサー、光スプリッター、その他の3コアの光パッシブ基本コンポーネントで、ファイバーツーザホーム、4Gモバイル通信、 インターネットデータセンター、防衛通信、その他の分野。 ウェブサイト http://www.hyc-system.com へのさらなる訪問
ローカルではbundle installできてるのにcapistranoデプロイ時にbundle:installタスクでコケる

タイトル通りで自戒を込めて。
エラーはこんな感じ

```
SSHKit::Command::Failed: bundle exit status: 16
bundle stdout: Nothing written
bundle stderr: You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

The list of sources changed

You have added to the Gemfile:
* source: https://github.com/bartoszkopinski/aws-s3.git (at master)
* source: https://github.com/cowboyd/therubyracer.git (at master)
* source: https://github.com/rails/sprockets-rails.git (at master)

You have deleted from the Gemfile:
* source: git://github.com/bartoszkopinski/aws-s3.git (at master@6d8525e)
* source: git://github.com/cowboyd/therubyracer.git (at master@466a1f0)
* source: git://github.com/rails/sprockets-rails.git (at master@6fa795a)
```
どういうことだよ…gemの追加も削除もしてないよ…

## 環境
- ruby 2.3.3
- rails 5.0.2

ちょい古めのrubyを使ってる時点で気づくべきでしたね
原因はローカルとサーバのbundlerのバージョン違いでした

```bash:bundler@local
$ bundle -v
Bundler version 1.16.2
```

```bash:bundler@server
$ bundler -v
Bundler version 2.0.2
```

## 解決
2系からruby2.6.xとの兼ね合いとかでbundlerのバージョン下げること多いなぁ〜〜😣

```bash:bash@server
$ gem install bundler -v 1.16.2
$ gem uninstall bundler -v 2.0.2
$ gem list bundler

*** LOCAL GEMS ***

bundler (1.16.2)
```
これでcapistranoは走り切る
めでたしめでたし👏

## 参考
https://codeday.me/jp/qa/20190621/1061872.html
bashでの複数の変数の格納方法


お世話になっております。
グーグルさんで調査したのですが
HITしなかったので質問失礼します。

```bash
	cash=`psql -d $1 -t -A << '_SQL'
		SELECT body_results.doc_id 
		FROM body_results
		WHERE doc_id = body_results.doc_id;
_SQL`

	echo "koko made >>>$cash<<<";
```
で
と複数あった場合
どうやっていれるのでしょうか？

と思ってけどBashだったら
上記cash一つでいいじゃん……

```bash
koko made >>>kkk003
kkk02<<<
```
って返ってきたので…… 焦って投稿しなくて良かった(^^♪
Pyxel 1.2.0 の紹介

## pyxelって？

python でレトロゲームが簡単に作れるゲームエンジンです。手前味噌ですがこんなのが簡単に作れます（[dannyso16/pynasour (GitHub)](<https://github.com/dannyso16/pynasour>)）

![readme.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/839c7e74-b57b-06ee-bb62-ac0120514515.gif)


pyxel について詳しくは以下の記事が参考になります。

[レトロゲームエンジンPyxelでプログラミングを始めよう！](<http://tkitao.hatenablog.com/entry/2018/11/24/185346>)
[kitao/pyxel (GitHub)](<https://github.com/kitao/pyxel/blob/master/README.ja.md>)



## 1.1.0から変わった点

1. `show`と`flip` の追加

2. 旧フォーマット`.pyxel`が廃止され、`pyxres`になった

3. 色の定数の追加

4. 画面サイズの上限がなくなった

5. 実行ファイルの生成

6. ショートカットいろいろ

   

## `show`と`flip` の追加

これの追加で一気に processing みたいにかけるようになりました。

- `show`関数：画面を表示し、`ESC`キーが押されるまで待機
- `flip`関数：画面を一度だけ更新

クラスでラップしなくても以下のような簡単な書き方ができます！！

```python
import pyxel

pyxel.init(120, 80) # 画面サイズ 120x80 で初期化

while True:
    pyxel.cls(pyxel.COLOR_GREEN) # 緑の画面
    # 座標 (x, y) で大きさ w × h の長方形
    pyxel.rectb(x=pyxel.frame_count % 160 - 40, y=20, w=40, h=40, 
                col=pyxel.COLOR_WHITE)
    pyxel.flip() # 画面を更新
```

![pyxel-190805-204953.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/52183972-7004-f515-3c77-063754016504.gif)



## 旧フォーマット`.pyxel`が廃止され、`.pyxres`になった

旧拡張子が使えなくなり、`pyxeleditor hoge.pyxel`としても編集できなくなりました。（`hoge.pyxel.pyxres`が開く…）

`.pyxel`アセットを使用した過去のゲームでは`load`時にエラーが出てしまうので、旧バージョンの`pyxel`をインストールするとよいです。

```
pip install pyxel==1.1.8
```

また`.pyxel`を`.pyxres`に変換したい場合は、
旧versionをインストールし、`pyxeleditor hoge.pyxel`で読み込み、`.pyxres`で保存しなおすといいです。



## 色の定数の追加

いろいろ定数値が定義されているので知っておくと便利かもしれません。詳しくは`pyxel/pyxel/__init__.py`を見るといいです。

0 - 15 の数字で色を指定する時、いちいち表を見るのは面倒でしたが、`pyxel.COLOR_BLACK`のように使用できます。

色の対応は以下。

![color_palette.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/f21b8d53-c5fa-a49a-345e-4ddd40b59a53.png)



## 画面サイズの下限がなくなった

~~`CHANGELOG`ではversion 1.1.6 で上限がなくなったようだけど、~~
~~`pyxel.init(256, 256)` までしかできないっぽい？~~
なくなったのは下限でした！


## （実行ファイルの生成）

> 単体実行ファイルを作成するには、次のように`pyxelpackager`コマンドでアプリケーションの起動に使用するPythonファイルを指定します。
>
> ```
> pyxelpackager Pythonファイル
> ```
>
> 処理に成功すると、distフォルダに単体実行可能なファイルが作成されます。
>
> .pyxresファイルや.pngファイル等のリソースも同梱する必要がある場合は、`assets`フォルダ以下に置くと取り込まれます。

とのことです！！
が、自分の環境(Windows10)ではうまく行きませんでした…



## ショートカットいろいろ

実行中に以下のことができます。

- `Esc`：終了
- `Alt(Option) + 1`：スクリーンショット撮影
- `Alt(Option) + 2`：動画キャプチャの開始時間をリセット
- `Alt(Option) + 3`：動画キャプチャ（gif）を保存（最大30秒）
- `Alt(Option) + 4`：パフォーマンスモニタ
- `Alt(Option) + Enter`：フルスクリーンモードに切り替え

注意点としてスクリーンショットとキャプチャはデスクトップに保存されます。

動画の保存は動画開始タイミングで`Alt+2`を押し、終わりのタイミングで`Alt+3`を押せば保存されます。
また動画キャプチャの開始時間はデフォルトでは実行時のようで、動画の終点のタイミングで`Alt+3`を一度押せば実行開始から保存されます。



## 最後に

この記事は自分のプルリクがマージされてうれしかったので書きました（半分本当）。
pyxel は version 1.1.5 辺りから、さらに簡単に書けるようになっていてほんと楽しいです！

内容の間違いなどありましたら、指摘していただけると助かります
m(__)m



## 参考

[kitao/pyxel](<https://github.com/kitao/pyxel/blob/master/README.ja.md>)

[Pyxel 1.0 から 1.1 への移行方法](http://tkitao.hatenablog.com/entry/2019/07/13/184448)

[レトロゲームエンジンPyxelでプログラミングを始めよう！](<http://tkitao.hatenablog.com/entry/2018/11/24/185346>)
Vuexの勉強記録

Vuexについて初めて勉強したため、その勉強記録。

### Vuexのインストール
[公式ガイド](https://vuex.vuejs.org/ja/installation.html)より引用

npm

```
npm install vuex --save
```

yarn

```
yarn add vuex
```


## コアコンセプト

ストアを作成する。

```src/store.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    message: 'hogehoge'
  },
})
export default store
```

`state`はコンポーネントでいう`data`

```src/main.js
import store from '@/store.js'

new Vue({
  el: '#app',
  store,
  render: h => h(App)
})
```

これで全てのコンポーネントから使用可能

```js:コンポーネント
export default {
    this.$store.state.message
}
```


### getters
`state`を取得するための算出データ

```js:src/store.js
const store = new Vuex.Store({
  state: {
    list: [
      { id: 1, name: 'Taro', age: 10 },
      { id: 2, name: 'Jiro', age: 12 },
      { id: 3, name: 'Emi', age: 15 }
    ]
  },
  getters: {
    person: state => {
      return id => state.list.find(el => el.id === id)
    }
  }
})
export default store
```

```js:コンポーネント
export default {
    console.log(this.$store.getters.person(2));
};
// listからidが2の要素を返す
```


### mutations
`state`の値を変更するメソッド。コンポーネントでいう`methods`。
`mutations`内の関数はストアの`commit`で発火させることができる。
Vuexの状態`(state)`を第１引数として持ち、`payload`（コミットからの引数）を第２引数として持つことができる。

### commit
登録されている`mutations`を呼び出す。コンポーネントでいう`$emit`的な存在。
ミューテーションを起動するためには、ミューテーションのタイプを指定し、`store.commit`で呼び出す必要がある。
`commit`も追加の引数`(payload)`を持つことができる。`payload`にはオブジェクトを持たせることができる。

### actions
非同期処理を含めることができ、ミューテーションをコミットする。

```src/store.js

const store = new Vuex.Store({ 

  state: {
    counter: 0
  },
  getters: {
    counter(state) {
      return state.counter
    }
  },
  mutations: {
    countUp(state, payload) {
      state.counter += payload.amount
    }
  },
  actions: {
    countUp({ commit }) {
      commit('countUp', { amount: 10 })
    }
  }
})
export default store
```

コンポーネントからアクションを呼び出すときは`dispatch`を用いる

```js:コンポーネント
methods: {
    countUp() {
      this.$store.dispatch("countUp");
    }
  }
```

アクションの第１引数は次のようなオブジェクトになっており、上記の`{ commit }`のように分割代入を使えば、任意のプロパティを受け取ることができる。

```js
{
  state,  // store.stateと同じ
  rootState, //store.stateと同じ（モジュール内に限る）
  commit,  // store.commitと同じ
  dispatch,  // store.dispatchと同じ
  getters,  // store.gettersと同じ
  rootGetters //store.gettersと同じ（モジュール内に限る）
}
```

ここまでを図で表すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421468/d9951582-05bb-db96-f881-bdd7abab23c0.png)




### マッピングヘルパー
ゲッターやミューテーションを複数使用するとき、全てを記述すると冗長になるため、ヘルパーが用意されている。先ほど記載したコードは下記のようにコンポーネントから呼び出すことができる。

```js:コンポーネント
import { mapGetters, mapActions } from "vuex";

export default {
  computed: mapGetters(["counter"]),
  // counter() {
  //   return this.$store.getters.counter;
  // }　と同じ

  methods: mapActions(["countUp"])
  // countUp() {
  //   this.$store.dispatch("countUp");
  // }  と同じ
  }
```


#　参考文献
[公式ガイド](https://vuex.vuejs.org/ja/)
[基礎から学ぶVue.js](https://www.amazon.co.jp/dp/4863542453/ref=cm_sw_r_tw_dp_U_x_x4rsDbGJVVWST via @amazonJP)
Wi-Fiが利用できなかった場所　無線網（Wi-Fi）空中線(antenna)(203) 

Wi-Fiがうまく利用できなかった場所を記録し、
なんらかの方法で、Wi-Fiが利用できるようにする手段を検討するための資料

# 愛知県
## 名古屋市
### 中区
住所, 店名, 階数, 無料Wi-Fi有無, Wimax
金山,　かもん,　地下１F, 無料Wi-Fi見当たらず, Wimax圏外
栄,　飲み屋,　地上3F, 無料Wi-Fi見当たらず, Wimax圏外
栄, あるビル, 地上5F, 無料Wi-Fi見当たらず, Wimax圏外

### 中村区
名駅, あるビル, 地上20F, 無料Wi-Fi見当たらず, Wimax圏外

## 春日井市　

しゃぶしゃぶ太郎
Green Table(落合公園)

# 東京都 

## 新宿区
JR 新宿駅　

## 品川区　

JR 品川駅

## 小平市　

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

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

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

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

Please press the like icon 💚　and follow me for your happy life.
【初級編】よく使うメゾットの種類

#メゾットってなに？

メソッドとはプログラミングにおける何らかの処理をする命令群のことです。
メソッド名をプログラム中に記述することで、そのメソッドの処理を行うことができます。

今回は覚えておきたいメゾットを紹介します。

##putsメソッド

puts(プッツ)というメソッドに対して文字列などのオブジェクトを右に記述すると、
そのオブジェクトが文字としてターミナル上に出力されます。

```ruby:filename.rb
puts "こんにちは"
```

##.to_sメソッド

数値オブジェクトを文字列に変換してくれます。

※文字列と数値は別のオブジェクトなので、連結することができないです.
例
```ruby:filename.rb
number = 14
puts number + "個のりんご"　     #エラーになる
puts number.to_s + "個のりんご"
```

##to_iメソッド
文字列オブジェクトに対してto_iメソッドを使うとその文字列を
数値オブジェクトに変換することができます。

※数字以外の文字列オブジェクトは全て0に変換されるので注意してください。

```ruby:filename.rb
number = "３"
puts number + 7      #エラーになる
puts number.to_i + 7 #OK
```


##getsメソッド

getsメソッドはユーザーからターミナルへ入力できるようにするメソッドです。
ユーザーが入力した値を文字列オブジェクトとしてプログラムに渡します。

getsメソッドが呼ばれるとターミナル画面は入力待ちの状態になります。
そこでキーボードから値を入力してエンターを押すと、getsメソッドは入力した文字をプログラムに返します。


```ruby:filename.rb
input = gets
puts "入力した値は#{input}です"

```
##lengthメソッド
length(レングス)メソッドは文字列が利用できるメソッドで、文字列の
文字の数を数えてくれます。
メソッドを利用するには、オブジェクトに対してメソッド名(length)を.(ドット)で繋ぎます。

```ruby:filename.rb
puts "Hello".length
```

##lengthメソッド応用

最初は「ペン、消しゴム、定規」という3つの要素が入っているので、3がlengthメソッドで
返ってきます。その後「メモ帳、付箋」を追加したので5が返ってきます。このように
lengthメソッドを使えば配列の要素の個数がすぐにわかります。


```ruby:filename.rb
pencil_case = ["ペン", "消しゴム", "定規"]
  puts pencil_case.length

  pencil_case << "メモ帳"
  pencil_case << "付箋"
  puts pencil_case.length

#結果
#3
#5
```



each(イーチ)メソッド
配列オブジェクトに対してeachメソッドを実行すると、配列に含まれる要素を順に取り出して
繰り返し処理が行われます。すなわち、配列の要素の数だけ処理が行われます。
【ポイント】
eachメソッドは配列オブジェクトや範囲オブジェクトにしか使用できません。


```ruby:filename.rb
food = ["apple", "orange", "Lemon"]
 
food.each do |a|
    puts a
end

#結果
#apple
#orange
#Lemon
```
#まとめ
メゾットについては「クラスメソッド」「インスタンスメソッド」「initializeメソッド」
など、まだまだたくさんの種類があります。

続きは次回！！
Updating Homebrew で止まってしまう現象の解決法

# 解決策

* `export HOMEBREW_NO_AUTO_UPDATE=1`でupdateさせないようにする
    * 解決策としてそこそこ挙げられていたが、根本的な解決策ではなかったので試していない
* `brew update-reset`でリモートリポジトリをリセットする
    * これで今回は解決した。ただこれでもダメな人はいるっぽい

# 起こった現象
つい最近初めてMacを買った。
その環境構築中にhomebrewでいろいろ落としていたのだが、Macを触ったことが無い自分でも一目で異常と分かるレベルでhomebrewが遅かった。

よく見てみると、`Updating Homebrew`で止まっているようだった。

# 調査
調べてみるとHomebrewはいろいろあって勝手にupdateが走るようになっているらしい。
それを無効化すると一旦の解決策になりそうだったが、その場しのぎにしかならないので却下。
ちなみに無効化コマンドは以下
`export HOMEBREW_NO_AUTO_UPDATE=1`

そしてたどり着いたのが以下のcommunity
[Fetching homebrew repos is slow](https://discourse.brew.sh/t/fetching-homebrew-repos-is-slow/5374)

ここによると、リモートリポジトリとのやりとりで不具合が発生しているから遅くなっているらしい。
なのでスレッド内にあった以下のコマンドでリモートを再設定してみると直った。

```shell

brew update-reset
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
/usr/bin/git fetch --all
/usr/bin/git
brew update
```

ただ、これでも直らない人はいるらしい…そうなるともう自分にはお手上げ(このコミュニティを探すのもそこそこしんどかった)


# 蛇足
初めてのmacの環境構築中にこういう理不尽な不具合を踏むとすごく悲しくなる。
ただ、mac自体は良い感じなのが救い。
MacOSXにredmineを入れた後、Mac再起動したらMySQLも再度起動させる



すぐに忘れて起動されないことにパニクってしまうので、MacをサーバーにしてRedmineを立てた自分宛てのメッセージとして..w


# Mac再起動したらMySQLも再起動!!

```
mysql.server start
```

Apacheは電源が入れば自動的に起動されるようにされているから多分大丈夫だ!! でも、心配だから一応再起動コマンドのせとくね!!!

```
sudo apachectl start
```




よし、これできっと大丈夫!
fluentdのプラグインを公式DockerイメージでインストールするときはRootユーザーで実行しよう


# 結論
- Gemインストール時は、ユーザーをrootに切り替えれば良い
- https://hub.docker.com/r/fluent/fluentd/ の **3. Customize Dockerfile to install plugins (optional)** の節に書いてある

# はじめに
あなたは、DockerHubで公開されているfluentdのイメージに新しくプラグインを入れたいとします。ここではGCSプラグインを例とします。

# 失敗例
何も考えずに以下のDockerfileを作りました。これではいけません。

```Dockerfile
FROM fluentd:v1.6-1
RUN gem install fluent-plugin-gcs
```

```
$ docker build -t fluentd-gcs .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM fluentd:v1.6-1
 ---> 4d4d1e466958
Step 2/2 : RUN gem install fluent-plugin-gcs
 ---> Running in fb98c78f3610
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/lib/ruby/gems/2.5.0 directory.
```

## パーミッションエラー
権限が足りずにプラグインインストールに失敗してしまいます。

```
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/lib/ruby/gems/2.5.0 directory.
```

# なぜそうなるか
fluentdの実行ユーザーが `fluent` になっているため起こります。 https://hub.docker.com/r/fluent/fluentd/dockerfile の中に `USER fluent` と書いてあるからです。
fluentユーザーでは、 `/usr/lib/ruby/gems/2.5.0` への書き込み権限がありません。

# 成功例
DockerのUSERインストラクションでユーザーをrootへ変更して実行します。無事完了します。

```Dockerfile
FROM fluentd:v1.6-1
USER root
RUN gem install fluent-plugin-gcs
USER fluent
```

```
$ docker build -t fluentd-gcs .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM fluentd:v1.6-1
 ---> 4d4d1e466958
Step 2/4 : USER root
 ---> Running in 524cdb350bbd
Removing intermediate container 524cdb350bbd
 ---> 06ae39860fc1
Step 3/4 : RUN gem install fluent-plugin-gcs
 ---> Running in 98c82c8d168d
Successfully installed multipart-post-2.1.1
Successfully installed faraday-0.15.4
Successfully installed google-cloud-env-1.2.0
Successfully installed google-cloud-core-1.3.0
Successfully installed declarative-option-0.1.0
Successfully installed declarative-0.0.10
Successfully installed uber-0.1.0
Successfully installed representable-3.0.4
Successfully installed retriable-3.1.2
Successfully installed public_suffix-3.1.1
Successfully installed addressable-2.6.0
Successfully installed mini_mime-1.0.2
Successfully installed jwt-2.2.1
Successfully installed multi_json-1.13.1
Successfully installed signet-0.11.0
Successfully installed memoist-0.16.0
Successfully installed os-1.0.1
Successfully installed googleauth-0.9.0
Successfully installed httpclient-2.8.3
Successfully installed google-api-client-0.30.8
Successfully installed digest-crc-0.4.1
Successfully installed mime-types-data-3.2019.0331
Successfully installed mime-types-3.2.2
Successfully installed google-cloud-storage-1.19.0
Successfully installed fluent-plugin-gcs-0.4.0
25 gems installed
Removing intermediate container 98c82c8d168d
 ---> 21cef68e5ac6
Step 4/4 : USER fluent
 ---> Running in d8c63dbf5184
Removing intermediate container d8c63dbf5184
 ---> 0cecffaf0aae
Successfully built 0cecffaf0aae
Successfully tagged fluentd-gcs:latest
```


# まとめ
- Gemインストール時は、ユーザーをrootに切り替えれば良い
- https://hub.docker.com/r/fluent/fluentd/ の **3. Customize Dockerfile to install plugins (optional)** の節に書いてある
JAWS 初心者支部勉強会(2019/08/05)はじめての参加

AWS JAWS-UG初心者支部の勉強会に参加してきました。
私は、AWSを2019年4月に使い始めた本当の初心者です。

# 開始前
会場は、目黒セントラルスクエア21F。AWSの本社です。
AWSの本社に入れてちょっとテンション上がりました。
21FエレベーターのドアがAMAZONのダンボールのデザインを見てさらにテンション上がります。

# 会場
200人？程度入る部屋です。
Wi-Fiの情報が画面に出ているので、ネットに接続できます。

# セッション①：AWSはじめの一歩と学びのススメ
通称ゆっきーさん。
「はじめの一歩」ということで、初心者に向けての内容でした。
初心者向けと言いつつ、初心者向けの内容でなかったらどうしよう・・・と思っていたのでよかったです。
饒舌なトーク生で聞けたのもよかったです。
アウトプットすることが大切。必ず手を動かして勉強しないとだめ。
まだまだAWSエンジニア足りないし、この勉強会に来るぐらいのモチベーションがあるなら今日からみなさん最前線！！！
モチベーションぶち上げてくれました！

# セッション②：こわくないW-Aレビューのすすめ
日本で数少ないアンバサダーの大竹さん。
W-Aレビューしましょうよ、人がいなくても教育・成長させるためにまずはやってみましょうと。
「本当に安全か？」など自分に問いかけて何度も見直そう・考えてみましょうのメッセージが印象に残りました。

# セッション③ ：AWS で学ぶ IoT の初歩
AWSを趣味で触ることの方が多い、AWS・コンピューター好きな大口さん。
IoTは目の前のものを動かすので、楽しそう！
Youtuberで動画も上げているとのこと。
私は、アプリ開発しかやってこなかったのでインフラ系の知識が希薄です。
参考図書で紹介された表紙がかわいい「ポートとソケットがわかればインターネットがわかる」を読んでみようと思いました。

# セッション④：コミュニティで人生が変わった話
田尻さん、小深田さんのペア。
コミュニティに参加して転職までした2人。
本当に人生変わってました。コミュニティに参加して、関わる人を増やすチャンスがあるのに増やさないのはもったいないなぁと思わされました。
同じことに興味を持ってる人が集まって、活動するのは何より楽しそう！

# 懇親会
1人で参加しました！
参加者は、20人程度でした。
緊張して行ききましたが、やさしく気軽に話してくれる人ばかりなので楽しめました。(お酒も入ってますし)
もし、迷って参加をためらってるぐらいの人だったら参加した方がいいと思います。

# 最後に
AWS勉強会・懇親会にはじめて参加しましたが、参加してよかったです。
モチベーションあがりますし、普段出会えない人と会える機会なのでまた参加してみようと思いました。

# おまけ
1人で参加したので、心細くなにかはしようと思いツイートをたくさんしまくりました。
多々ふざけた内容も送っていたので、次の日に少し怒られました。。。
ふざけるのはほどほどに・・・
CircleCI で puppeteer のテストを実行する

# はじめに
CircleCI で puppeteer のテストを実行する準備・設定について、検索してもあまり見当たらなかったため、備忘録として投稿させていただきます。

# テストスクリプト

CircleCIでPuppeteerを実行する場合は、`puppeteer.launch`にパラメータを追加する必要があります。

```js
// ローカル環境などでPuppeteerを利用する場合、
// const browser = await puppeteer.launch();

// CircleCIでPuppeteerを利用する場合、
const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });
    
// ...(略)
```

パラメータを追加せずにテストスクリプトを実行した場合、以下のようなエラーが発生します。

```shell-session
====>> run test
  #!/bin/bash -eo pipefail
node xxx.js

(node:67) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome!
[0806/065833.390539:FATAL:zygote_host_impl_linux.cc(116)] No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live dangerously and need an immediate workaround, you can try using --no-sandbox.
...
```


# .circleci/config.yml

以下のコンフィグでは**puppeteerのインストール**、**テストスクリプトの実行**を実行しています。

```yml
version: 2
jobs:
  test:
    docker:
      - image: circleci/node:latest-browsers
    steps:
      - checkout
      - run: 
          name: install puppeteer
          command: yarn add puppeteer
      - run: 
          name: run test
          command: node response.js

workflows:
  Puppeteer Test:
    jobs:
    - test
  version: 2
```

# 補足

ローカルのCircleCIで実行する場合は以下のコマンドを実行します。

```shell-session
$ circleci local execute --job test
```

> 参考：[CircleCI のローカル CLI の使用 \- CircleCI](https://circleci.com/docs/ja/2.0/local-cli/#%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)


# 参考
本投稿にあたって以下のサイトを参考にさせていただきました。

- [Quramy/puppeteer\-example](https://github.com/Quramy/puppeteer-example)
- [Puppeteer fails on CircleCI \- Build Environment \- CircleCI Discuss](https://discuss.circleci.com/t/puppeteer-fails-on-circleci/22650/3)
【備忘録・まとめ】AWS Config 開発者ガイド

## 出典

[AWS Config 開発者ガイド](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/WhatIsConfig.html)

## まとめ

* AWSリソースレベルでのエンティティ設定および変更の記録、監視、通知を行うサービス
    * CloudTrailで言うところの管理イベントあたりの粒度
* Webコンソールから各種リソースのCloudTrailログも確認できる
    * 作成とか変更の履歴も見られる
* 監視しているリソースについては、コンプライアンスチェック等も自動でやってくれる
    * ただし、お値段ちょっと高い
    * 使ってないサービスのルールや、チェックの必要性が低いルールについては積極的に外しておかないと辛い
    * 逆に、目視やコード管理でも見過ごしそうなものを網羅的にチェックしてもらうのには便利
    * うまく使いたいところ

## 要点

### 概念

#### AWS Config

* AWSリソース
    * ARNとかがつく、各種サービスのインスタンス、エンティティ類
* 設定履歴
    * 特定期間の特定リソースに関する設定項目のコレクション
    * AWS Config は、記録しているリソースタイプ別の設定履歴ファイルを、ユーザーが指定した Amazon S3 バケットに自動的に配信
* 設定項目
    * AWSリソースのさまざまな属性を特定の時点で反映したビュー
    * 設定項目のコンポーネントは、メタデータ、属性、関係、現在の設定、関連イベントなど
    * WS Config は、記録対象のリソースタイプで変更を検出するたびに、設定項目を作成
* 設定レコーダー
    * 設定レコーダーは、サポートされるリソースの設定を設定項目としてアカウントに保存
    * 記録を開始する前に、設定レコーダーを作成して起動する
    * デフォルトではAWS Configが実行されているリージョンのすべてのサポートされているリソースを記録
    * 指定したリソースタイプのみを記録することも可
* 設定スナップショット
    * 設定項目のコレクション
    * 記録対象のリソースとその設定の全体像
    * 設定を検証するのに役立つ
* 設定ストリーム
    * AWS Config で記録しているリソースに関するすべての設定項目の自動更新リスト
    * リソースが作成、変更、または削除されるたびに、AWS Config は設定項目を作成して設定ストリームに追加
    * 設定ストリームではAmazon SNSトピックを使用
    * 特定のリソースが変更された場合に通知を生成したり、[SQSに通知を積んだり](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/monitor-resource-changes.html)できる
* リソース関係
    * アカウント内の AWS リソースを検出し、AWS リソース間の関係のマップを作成

#### マネージドルールとカスタムルール

* AWS Config ルールは、特定の AWS リソースまたは AWS アカウント全体の望ましい設定を表す
* 簡単に開始できるようにカスタマイズ可能な定義済みのルールが用意されている（マネージドルール）
* カスタムルールを作成することもできる
* ルールを有効化すると、AWS Config はリソースをルールの条件と比較
    * この初期評価後は、評価がトリガーされるたびに AWS Config で評価が実行される
    * 評価のトリガーは、ルールの一部として定義される
        * 設定変更時に評価
        * 定期で評価

#### マルチアカウント・リージョンのデータ集約

* マルチアカウント、マルチリージョンのデータ集約を使用すると、複数のアカウントとリージョンのAWS Config設定データやコンプライアンスデータを1つのアカウントに集約できる
* ソースアカウント
    * リソース設定およびコンプライアンスデータの集約元となるAWSアカウント
* 送信元リージョン
    * 設定データおよびコンプライアンスデータの集約元となるAWSリージョン
* アグリゲータ
    * 複数のソースアカウントとリージョンからAWS Config設定データとコンプライアンスデータを収集するリソースタイプ
    * AWS Config 設定データとコンプライアンスデータを表示させるリージョンでアグリゲータを作成
* アグリゲータアカウント
    * アグリゲータアカウントは、アグリゲータを作成するアカウント
* 承認
    * ソースアカウントの所有者として、アグリゲータアカウントとリージョンに付与するアクセス許可のこと

### 設定項目の配信

#### S3

* AWS ConfigはAWSリソースの設定変更を追跡し、更新された設定詳細を、指定されたS3バケットに定期的に送信する
* 記録するリソースタイプごとに、設定履歴ファイルを6時間ごとに送信
* 設定変更が発生しなかった場合、ファイルは送信されない

#### SNSトピック

* AWS Configは、指定された Amazon SNSトピックを使用して通知を送信する
* 通知のメッセージタイプについては、[ここ](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/how-does-config-work.html)を参照
PHPerがPythonの正規表現ライブラリにやられた話

## はじめに

僕は普段からPHPを使っているネットワークエンジニア（の卵）なのですが、大学の研究室の方針と勉強を兼ねてPythonを使ってみました。



## 環境

- CentOS 6.10
- PHP 5.3.3
- Python 3.4.10

(大学のサーバ、全然アプデされてない...)



## 前提

- DBに以下のような約14,000件のデータが入っている。
- 全てのURLへアクセスし、そのサイトが生きているか調べたい。
- 基本的には`xxx.onion`というデータが入っているが、稀に`yyy.org zzz.onion`というようなデータが紛れ込んでいる。
- プログラムが出来たら`crontab`で3分に1回実行（全部終わるのに29日かかるとか突っ込まないで!!）

| id | url | status |
|----|----|----|
|  1 | uel3b54t4iszmpq6.onion | xxx |
|  2 | tochka3rmabu4p46.onion | xxx |
|  3 | qwzxd7r5pbrn7cqv.onion | xxx |
| 4238 | hiddenwikitor.org hekpblat56lmmnfi.onion | xxx |



## じゃあ書いてみよう

まずPHPだとどうなるかというと、まあこんな感じ。

```php:php
preg_match("/[a-zA-Z0-9]+\.onion/", $row["url"], $matches);
print_r($matches[0]);
```

じゃあ次。多少Pythonの知識があったので、とりあえず適当に書いてみる。

```python:python
m = re.match(r"[a-zA-Z0-9]+\.onion", row[1])
print(m.group(0))
```

動くね、じゃあ`crontab`で。



## そのときは訪れた

初めは問題なく動いていたのに、先程のデータの4238行目で止まってる。なんでや。

色々調べてみると[リファレンス](https://docs.python.org/ja/3/library/re.html)にも書いてある通り、`re.match`は**先頭からのみ**見ていく。取り出したいURLはTLDが`onion`のものなので`yyy.onion　zzz.org`のようなデータであれば正常に動作するが、今回入っているデータは逆。つまり、`re.search`を使えと。便利なんだが紛らわしい。

>re.match(pattern, string, flags=0)
string の先頭で 0 個以上の文字が正規表現 pattern にマッチすれば、対応する マッチオブジェクト を返します。文字列がパターンにマッチしなければ None を返します。これは長さ 0 のマッチとは異なることに注意して下さい。

>MULTILINE モードにおいても、re.match() は各行の先頭でマッチするのではなく、文字列の先頭でのみマッチすることに注意してください。

>string 中のどこででもマッチさせたいなら、代わりに search() を使ってください (search() vs. match() も参照してください)。"

書き直すと以下のようになります。

```python:python
m = re.search(r"[a-zA-Z0-9]+\.onion", row[1])
print(m.group(0))
```



## まとめ

`re.match`は文字列の先頭からのみ探し出す。文字列の途中からも探したいなら`re.search`を使おう。(こいつ`^`使えばええやん...)

使い分けてる人がいるのかは分からないけど、僕はアップデートでどちらかが無くなることを祈ってます。

てか、リファレンスちゃんと読もうね！！！
RDS(MySQL) の最大接続数 (Alibaba Cloud)

こんにちは。

RDSはデータベースのマネージドサービスの最大接続数についてのφ(..)メモメモ。

MySQLでいえばmy.cnfで実施するようなパラメーターの変更は、RDSの[パラメータ変更](https://jp.alibabacloud.com/help/doc-detail/26179.html)で実施することが出来ます。

ただ、ココにはmax_connectionsがありませんでした。最大接続数の設定です。

調べてみると、[インスタンスタイプによって固定だと分かりました。](https://jp.alibabacloud.com/help/doc-detail/26312.htm)

まあ、接続数でメモリ上限が決まってくるので当然かな。

しかし、日本でリリースされていないBasic Edition（冗長化していないタイプ）のほうが何倍も上限が高いのでテスト用にはこっちが良いなあ。早く来ないかな。
Ruby Hashにデータをマージする

```ruby
h1 = {a: "aaa"}
h2 = {b: "bbb"}
h3 = {a: "update", c: "ccc"}
h1.merge(h2) # => {a=>"aaa", b=>"bbb"}
h1.merge(h3) # => {a=>"update", c=>"ccc"}
```
video要素メモ

MP4がほとんどのブラウザ対応しているためvideo要素は大活躍中。
ただ、スマホ端末によっては自動再生できないので自分用メモ。
のちJSで対応したら追加するかも。

# video要素について
`<video src="movie.mp4"></video>`
これだと、動画ファイルを読み込んだだけなので再生もされないし、コントロールパネルもない。

# video属性一覧
## controls コントロールパネルを表示
`<video src="movie.mp4" controls></video>`
再生ボタンやボリューム調整ができるコントロールパネルを表示される。

## autoplay 自動再生
`<video src="movie.mp4" autoplay muted></video>`
chromeやsafariでは<strong>muted属性</strong>で音をミュートにしないと動きません。

## loop 繰り返し再生
`<video src="movie.mp4" loop autoplay muted></video>`

## poster 開始画面の画像設定
`<video src="movie.mp4" poster="thumb.jpg" controls></video>`
動画再生する前に静止画を表示することができる。

## playinline インライン再生
`<video src="movie.mp4" autoplay muted playsinline></video>`
スマホのsafariなどで動画を再生しようとすると、デフォルトだと全画面表示になってしまうため、その動画を貼ってある範囲のまま再生させることができる。必ず、autoplay muted playinlineの３つが揃ってないとインライン再生ができない。3つはセット:hamburger::fries::beer:

## preload 動画読み込み設定
`<video src="movie.mp4" preload="none"></video>`
サイトを読み込むときに動画ファイルをダウンロードするか指定できる。

||説明|
|:--:|:--|
|auto|初期値。動画ファイル全体をダウンロードする|
|none|事前のファイルダウンロード禁止にする<br>（動画再生されたらダウンロード）|
|metadata|長さやファイルサイズなどメタ情報だけをダウンロード|

# 旧ブラウザで対応していないケースは、source要素を使う。

```
<video src="movie.mp4" playsinline muted autoplay>
　<source src="movie.mp4" type="video/mp4">
　<source src="movie.webm" type="video/webm">
  ※【エラーメッセージ】現在の環境は動画再生に対応してないよ。
</video>
```

# スマホでのインライン再生・自動再生・ループ再生
PCは大丈夫。問題はスマホ。
クライアントから自動再生にしてほしいという要望はわりとありがちだが、
端末によってできないものもあるので注意。

iphone safari IOS9以下、Anfroid chrome 52以下だと使えない。
ただ、そのバージョン以上だとインライン再生と自動再生はmutedにしておけば使える。
（Android 標準ブラウザではインライン再生ができる。自動再生とループ再生が使えない。）
【Unity】GoogleDriveからVRMファイルをインポートする

#概要
VRoidHubに頼りたくないとき用
#こんなかんじ
こんなかんじ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">関係ないけど猫になりたい <a href="https://t.co/Iyx2bu6yJ3">pic.twitter.com/Iyx2bu6yJ3</a></p>&mdash; ほたて猫魔人 (@HhotateA_xR) <a href="https://twitter.com/HhotateA_xR/status/1158605196080979968?ref_src=twsrc%5Etfw">August 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#コード

```c#:VRMDownloader.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using VRM;

public class VRMDownloader : MonoBehaviour {
    [SerializeField] private string _URL {get;set;}
    [SerializeField] private GameObject _LoadingIcon;
    [SerializeField] private GameObject _MissingIcon;
    public GameObject VRMRoot;
    void Start(){
        if(_LoadingIcon==null) _LoadingIcon = new GameObject();
        if(_MissingIcon==null) _MissingIcon = new GameObject();
    }

    public void LoadVRMfromInput(){
        string url = _URL;
        StartCoroutine(URL2VRM(GoogleUrl(url)));
    }
    public void LoadVRMfromURL(string url){
        StartCoroutine(URL2VRM(GoogleUrl(url)));
    }
    public string GoogleUrl(string url)
    {
        if (url == null || url == "") return url;
        if (url.StartsWith("https://drive.google.com/open?id="))
        {
            url = url.Remove(0, 33);
        }
        else if (url.StartsWith("https://drive.google.com/file/d/"))
        {
            url = url.Remove(0, 32);
            if (url.EndsWith("/view?usp=sharing")){
                url = url.Remove(url.Length - 17);
            }else if(url.EndsWith("/view?usp=drivesdk")){
                url = url.Remove(url.Length - 18);
            }else if(url.EndsWith("/view")){
                url = url.Remove(url.Length - 5);
            }
        }
        else if (url.StartsWith("https://drive.google.com/uc?id="))
        {
            url = url.Remove(0, 31);
        }
        else
        {
            return url;
        }
        return "https://drive.google.com/uc?id=" + url;
    }
    private IEnumerator URL2VRM(string url){
        missingIcon.SetActive(false);
        loadingIcon.SetActive(true);

        UnityWebRequest www = UnityWebRequest.Get(url);
        www.timeout = 10;
        yield return www.Send();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log(www.downloadHandler.text);
        }
        Destroy(VRMRoot);
        try{
            VRMRoot = VRMImporter.LoadFromBytes(www.downloadHandler.data);
        }catch{
            Debug.Log("MissingURL");
            missingIcon.SetActive(true);
        }
        loadingIcon.SetActive(false);
    }
}
```
#使いかた
 LoadVRMfromURL(string url)を呼び出す。
#工夫したとこ
googleのURLを変換した。
[Swift 5]共有ボタンを押した際に表示される可能性のある機能

##概要
共有ボタンを押した時の機能実装で、どんな機能があるか調べた時の備忘録です。

##一覧
| Property|機能
|:--|:--|
|addToReadingList|リーディングリスト
|airDrop|AirDrop
|assignToContact|連絡先
|copyToPasteboard|クリップボードにコピー
|mail|メール
|message|メッセージ
|openInIBooks|iBooksで開く
|postToFacebook|Facebookで投稿
|postToFlickr|Flickrで投稿
|postToTencentWeibo|TencentWeiboで投稿
|postToTwitter|Twitterで投稿
|postToVimeo|Vimeoで投稿
|postToWeibo|Weiboで投稿
|print|プリントする
|saveToCameraRoll|カメラロールに保存
|markupAsPDF|PDFでマークアップ
Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

#問題
CNNで遊ぼうとしたところ、下記のエラーが発生。
*Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.*

参考にしてと言われてもUnknown Errorとしか出てこないので対処がわからん。調べてみるとNVIDIAのGPUのうち、RTXシリーズを使用し、OSがUbuntuの場合にKerasでCNNを実行すると、例外なく発生する問題のようだ。

#環境
・ソフトウェア
Ubuntu 18.04
CUDA 10.0
cuDNN 7.6.2
tensorflow-gpu 1.14.1
Python 3.6.9
・ハードウェア
GPU：RTX 2070

#解決策
下記コードを挿入する。根本的解決にはcuDNNまわりが改善されるのを待つことしかできない模様。

```python
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
tf.keras.backend.set_session(tf.Session(config=config))
```

なお下記コードの挿入によりさらに使用するGPUを指定できる

```python
from keras import backend as K

if 'tensorflow' == K.backend():
    import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.gpu_options.visible_device_list = "0"
set_session(tf.Session(config=config))
```

こちらを参考にした。
https://github.com/tensorflow/tensorflow/issues/24496
システム運用自動化プラットフォーム"Kompira Enterprise"のジョブフロー作成の超基本！

# はじめに

みなさん、こんにちは。
Kompiraエバンジェリストの冨です。

本記事は「運用自動化プラットフォーム Kompira Enterprise」で、既存の作業手順をジョブフロー言語で記述して実行するまでの手順を解説します。

※インストールがまだの方は以前の記事を参照ください。
システム運用自動化プラットフォーム"Kompira Enterprise"のインストール手順
https://qiita.com/tomiyoichi/items/ef454c918e57ece81591

# 「ジョブフロー」とは？
Kompira Enterpriseでサーバー機やネットワーク機器の操作を行う手順を記載したプログラムです。いわゆる”バッチ処理”をイメージしていただいても良いかと思います。
Kompira Enterpriseでは、専用のジョブフロー言語を用いてジョブフローを記載していきます。

# ジョブフローの作成

ログイン後の画面で、名称にジョブフローの名前、型を「ジョブフロー」を選んで、真ん中の＋ボタンをクリックします。

![2019-08-06_14h35_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94326/84caceac-0a65-7b01-683b-75536105993e.png)

ジョブフローの編集画面に遷移します。この「ソース」の枠にジョブフロー言語で処理を記載し、「保存」ボタンをクリックします。
![2019-08-06_14h37_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94326/b7c1d4c9-0272-93ef-d03b-7130ece0909a.png)

# 処理記載の基本

大きく3つのルールがあります。

1. リモート機器のコマンドは ["コマンド文字列"]　のように、[ ] で囲う。
2. kompiraの標準関数は[　]で囲わず、そのまま記載する。
3. 上記1, 2で記載した処理は、矢印（主に -> ）で結ぶ

## 1. リモートコマンドは[ ] で囲う
例えば、ファイル一覧を取得したい場合は、次のように書きます。

```
["ls -l"]  # Linux機の場合
["dir"]    # Windows機の場合
```

## 2. Kompira標準関数は直接書く

文字をコンソールに表示する関数print()の場合には、次のように書きます。

```
print("Hello, world")   
```

## 3. 処理間を矢印で結ぶ

原則として、リモートコマンドの[] や標準関数などの処理は、矢印 "->" で繋いでいきます。この際に改行をいれても構いません。
 
```
["ls -l"] 
-> print($RESULT) 
-> sleep(5)
```

上記の例の2行目の"$RESULT"は直前のリモート処理[ ] の標準出力が格納されている特別な変数です。このため、上記の例はリモートサーバーでlsコマンドでファイル一覧を取得し、それをKompiraコンソールに表示した後、5秒間処理を止めるといった流れになります。


このようにして、上から下に順にコマンドを実行してお終いとするような作業手順書の場合は、指定されたコマンドをひたすら
["..."] -> ["..."] -> ["..."] -> ["..."] 
のように書いていけば、スクリプトは完成です。

# ジョブフローの実行

一連の処理をジョブフロー言語で「ソース」欄に書き終えた後は、保存ボタンをクリックします。
そして左上の「実行」ボタンをクリックすると、記載された処理を実行していきます。

コンソールへの出力がある場合には、実行画面のコンソール枠に表示されます。


![2019-08-06_15h20_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94326/9a077a80-254d-11c4-95f2-2fd225fa358b.png)


このようにして、作業手順書をジョブフロー言語に記載していきます。本記事では一直線にひたすら処理をつないでいますが、もちろん条件分岐や繰り返し処理を記載する構文もありますので、詳細はマニュアルなどをご参照ください。

# Kompira Enterpriseの製品情報

https://www.kompira.jp/
サーバーやネットワーク機器などの運用を自動化するための連携処理基盤ソフトウェアです。
運用手順書の操作作業の自動化、監視ツールやメールなどをトリガーにした保守作業の自動実行など、独自のKompiraジョブフロー言語を用いたスクリプトを用意する事で、個々の機器やワークフローにきめ細かく対応する事が可能です。
MacTeXの始め方

＊＊＊　備忘録です。間違い等があればご指摘ください。　＊＊＊

### 概要
- [MacTeX](http://www.tug.org/mactex/)をインストールする。
- インストールにはHomeBrewを使用する。
- macOS付属のヒラギノフォントを使用する（MacTeXで作成したpdfファイルに埋め込む）。
- 統合環境としては[TeXShop](https://pages.uoregon.edu/koch/texshop/)を使用する。

### MacTeXをインストールする

```
$ brew update  <-- Homebrew本体およびformulaを最新版に更新
$ brew upgrade  <-- インストール済みのパッケージを最新版にアップグレード
$ brew cask install mactex  <-- MacTeXをインストール
$ sudo tlmgr update --self --all  <-- TeX Liveを最新版にアップデート
$ sudo tlmgr paper a4  <-- 用紙サイズをA4に設定
```

### ヒラギノフォントを使用する

```
$ sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
$ sudo tlmgr pinning add tlcontrib '*'
  <-- 必要なパッケージが入っているTLContribを登録
$ sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree ptex-fontmaps-macos cjk-gs-integrate-macos
  <-- 必要なパッケージをインストール
$ sudo cjk-gs-integrate-macos --link-texmf --force
$ sudo mktexlsr
  <-- フォントのmapファイルを更新
$ sudo kanji-config-updmap-sys --jis2004 hiragino-highsierra-pron
  <-- ヒラギノフォントを埋め込むためのmapファイルを設定
```

### TeXShopを設定する

TeXShopを起動（アプリケーション/TeX/内にある）>「TeXShop」メニュー >「環境設定...」> 「書類」タブ >「設定プロファイル」>「pTeX (ptex2pdf)」

### 補足
- TeX LiveはTeXのティストリビューション。ただし、書籍等に付録できるフリーのもののみをパッケージしている。それ以外のものはTLContrib（TeX Liveにcontributeする）で配布。
- japanese-otf-nonfreeとjapanese-otf-uptex-nonfreeは日本語のOpenTypeフォント。
- 以下のコマンドでフォントのmapファイルを確認できる。

```
$ kanji-config-updmap-sys status
```
WebDAVを使ってファイル一覧を取得する

# はじめに

[WebDAV](https://ja.wikipedia.org/wiki/WebDAV)はhttpを利用したWebコンテンツにアクセスするプロトコルです。
npmのWebDAVを利用して、某有名企業のファイルストレージにアップロード済みのファイル一覧を取得するサンプルを作成したのでアップします。
npm WebDAVのサンプルコードが説明不足といいサンプルがないので参考までに。

# 前提
* OS : Windows7以上
* PoweShellのターミナルで実行
* VSCodeでコード編集
* node.js環境構築済み

# npm WebDAVのインストール

```Shell
npm install webdav --save 
```
# サンプル

- □と■は伏字。
- npmのサンプルでは、

```JavaScript
// Get directory contents
const directoryItems = await client.getDirectoryContents("/");
```
  の例しかなく、awaitの使用方法については、asyncと組合せのfunctionで定義する。  
  定義しなければ、下記のような実行時エラー。  

```Shell
PS C:\Users\~> node webdavgetfiles.js
C:\Users\~\webdavgetfiles.js:17
    const directoryItems = await client.getDirectoryContents(path, { deep: true });
                                 ^^^^^^

SyntaxError: Unexpected identifier
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:607:28)
    at Object.Module._extensions..js (module.js:654:10)
    at Module.load (module.js:556:32)
    at tryModuleLoad (module.js:499:12)
    at Function.Module._load (module.js:491:3)
    at Function.Module.runMain (module.js:684:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3
```
- {deep: true}を追加して、指定ディレクトリのサブディレクトリのファイルも取得します。
- typeが'file'を選択します。

## webdavgetfiles.js
```JavaScript
const { createClient } = require("webdav");
 
const client = createClient(
    "https://kfs.□□□□.ne.jp/",
    {
        username: "□□□□□□□□□□□□□",
        password: "■■■■■■■■■■■■■"
    }
);

const path = "/■■■■■■■■/■■■■■■■■■■/■■■■■■■■■■■/■■■■■■■■■■■■/";
/**
 *  webdevGetfile
 *   async ~　await
 */
async function webdevGetfile () {
    const directoryItems = await client.getDirectoryContents(path, { deep: true });

    for ( var i = 0; i < directoryItems.length ; i++ ) {
        if ( directoryItems[i].type == 'file') {
            console.log(directoryItems[i].filename);
        }
    }

}

webdevGetfile();

```
# 実行結果
※□は伏字、みずらいですが本番データなのでご容赦ください。

```Shell
PS C:\Users\~> node webdavgetfiles.js
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
/□□□□□□□□□□□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/□□□□□□□□/□□□/□□□□□□□□.zip
```

# まとめ
WebDAVを利用すれば、httpプロトコルでwebサーバからファイルを自動取得したり、自動アップロードができます。
色々な業務で応用可能と思います。ぜひ活用してみてください。
Serverlessとは

# はじめに
当たり前の様に使われていたので知ったかぶってたのですが、
いい加減恥ずかしくなって来たので調査

# Serverlessに対する誤った理解
クラウド展示会やクラウド関係のサービスで頻出している単語だった為、
「サーバが必要ないんだなぁ」程度の認識でしかありませんでした。

実態は全然違いました。

# Serverlessの個人的な理解
サーバ無いんじゃなくて、サーバの管理が不用なアーキテクチャでした。
AWSLambdaとかGAEはserverlessな実行環境なのかな。

もう少し突っ込むと
開発者はコードの管理だけで、実行環境の管理が不用、実行環境も選ばないアーキテクチャまで含まれるのかもしれない。
LambdaもGAEも共通した言語に対応してるので方言さえ気を付ければ使い回しが効くと思われます。
時間があったら試してみます
コンテナもserverlessの時代になってきてる

# 誤解してた所
サーバが無いのではなく、実行環境の管理が不用なアーキテクチャ

# 結論
「Write once, run anywhere」ってJavaの思想が実現したっぽい
gh-pages -d buildが出来ない(キレそう)

#キレそう(キレた)

github pagesで作業中のReactプロジェクトを動かしてみるか〜と思い早速色々整えて以下のコマンドを実行した.

```terminal.
gh-pages -d build
```

すると以下のようなエラーが出てしまった.

```terminal.
The "file" argument must be of type string. Received type undefined
```

# 解決法

どうやらgithub-pagesのバージョン2.1系で出るエラーのよう(すぐ修正されそう).
[stack overflow](https://github.com/tschaub/gh-pages/issues/308)にて同様の記述を発見しました.

以下のようにオプションをつけて実行するか

```terminal.
gh-pages -d build --git git
```

以下のように作業をして

```
-Delete node_modules
-Delete package-lock file
-In package.json -> dependencies -> delete gh-pages line
```
以下のコマンドを実行するといいみたい.

```terminal.
run npm i gh-pages@2.0.1
run npm i
```

# まとめ
割と大きめのバグの気がしますが,なぜリリースが通ったんだろう...?
ORACLE MASTER Bronze DBA 12c : OracleDBの管理者ユーザと管理者権限について

OracleDBではデフォルトで作られている管理者ユーザがあり、それらの名前が管理者権限や管理者ロールと似ていてめちゃくちゃややこしいので、整理した。

##1. 管理者ユーザ

| ユーザ＼権限・ロール | SYSDBA | SYSOPER | DBAロール |
|:-:|:-:|:-:|:-:|
| SYS | 〇 | 〇 | 〇 |
| SYSTEM | × | × | 〇 |

##2. 管理者権限・ロール
		
| 権限・ロール | 特徴 |
|:-:|:-:|
| SYSOPER | インスタンスの起動・停止ができる |
| SYSDBA | あらゆる権限を持つ |
| SYSBACKUP | バックアップ・リカバリの権限を持つ |
| SYSDG | Data Guard操作の権限を持つ |
| SYSKM | 透過的データ暗号化キーストア操作の権限を持つ |
| DBAロール（権限ではない） | 全てのシステム権限を持つが、インスタンスの起動・停止はできない |

##3. 管理者権限SYSOPERとSYSDBAの対照表

| 操作 | SYSOPER | SYSDBA |
|:-:|:-:|:-:|
| 起動・停止 | 〇 | 〇 |
| ALTER DATABASE（Open, Mount, Backup) | 〇 | 〇 |
| ALTER DATABASE（キャラクタセットの変更） | × | 〇 |
| CREATE SPFILE	| 〇 | 〇 |
| ALTER DATABASE ARCHIVELOG | 〇 | 〇 |
| ALTER DATABASE RECOVER | 完全リカバリのみ | 〇 |
| RESTRICTED SESSION権限を含む | 〇 | 〇 |
| CREATE DATABASE | × | 〇 |
| DROP DATABASE | × | 〇|
pyenv: dot: command not found The `dot' command exists in these Python versions:

#問題
こちらを参考にさせていただきUbuntuにML環境を構築した。
https://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

dl_4usで遊んでいたところ、下記の問題に遭遇。
pyenv: dot: command not found The `dot' command exists in these Python versions:「anacondaの常用仮想環境」

#解決方法
pyenv globalでanacondaの常用仮想環境を指定して解決。
原因は自分がpyenvを全く理解していないため。