OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerの中にPostgres+Sequelize+Express+Next.JSの構築

#はじめに
この記事は、Dockerの中のExpressにSequelizeを使ってPostgresを接続する記事である。
調べても、記事ごとに構築の仕方の差が激しかったので、自分にとってやりやすいやり方を編み出し、まとめる。
#注意
これはメモ
基本的な解説はしない。DBとExpressのコネクションについてがメイン
Dockerについて全く理解していないので、ディレクトリ構造やDockerfileの書き方がよくないかもしれない。
#環境
- Docker
- Node.js
- Express
- PostgreSQL
- Next.js(APIでやり取りするのでサーバー立てて終わり)

##ディレクトリ構造

```
product-docker-express-Dockerfile//マウント用
              -next-Dockerfile//マウント用
       -express　//expressを直接インストール
       -next　//Nextを直接インストール
       -docker-compose
```
#product/expressにsequelizeをインストール

```
npm install --save sequelize pg sequelize-cli
```


#Docker-composeでの設定

```dockerfile:docker-compose
version: '3'
services:

  backend:
    build:
      context: ./docker/express
      dockerfile: Dockerfile
    image: back
    container_name: back
    ports:
      - 3000:3000
    environment:
      DATABASE_URL: postgres://postgres:postgres@db:5432/postgres 
    volumes:
      - ./express:/src
    command: [sh, -c, npm install && npm start]

  frontend:
    build: 
      context: ./docker/next 
      dockerfile: Dockerfile
    image: front
    container_name: front
    ports:
      - 3001:3000
    volumes: 
      - ./next:/src
    command: [sh, -c, npm install && npm run dev]

  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"
```

ここで重要なのは、DATABASE_URLである。
のちに、sequelizeのconfig.jsonにて環境変数として使用するため設定している。
``postgres://postgres:postgres@db:5432/postgres``
このURLは、
``postgres://username:password@host:port/dbname``
となっており、docker-composeで設定した通りに当てはめていく。
dbnameは、[postgres-Docker Hub](https://hub.docker.com/_/postgres)によると、POSTGRES_DBの記述がなければ、POSTGRES_USERの値が代わりに使用される。

#Sequelize

cliをインストールしたことによって、RailsのActiveRecordのように、modelやmigrationを生成することができる。

```
$ sequelize init
//modelやmigration、configなどのフォルダーを生成。
```
##やりたいひとはやろうなテスト

```
$ docker-compose up -d
```

```
$ docker-compose run backend npx sequelize model:create --name Test //モデルとマイグレーションファイルを生成
```

```
$ docker-compose run backend npx sequelize db:migrate --env development 
```
まだ、エラーがでるはず...

##config/config.jsonの設定
```
 "development": {
    "dialect": "postgres",
    "use_env_variable":"DATABASE_URL"
  }
```
``dialect``はDBの種類
``use_env_variable``は環境変数を参照する。つまり、dockercomposeで設定したURLが参照されている。

そして記事内の「やりたいひとはやろうなテスト」を行うと...
<img width="534" alt="スクリーンショット 2020-01-15 14.19.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396885/52f97072-1be9-204d-44da-3d76315dd4a4.png">
マイグレーションが反映される。

#まとめ
なにが正解かわからないが、他の記事などを見るとSQLスクリプトを書いていたり、自分でmodelを書いていたりしていたので調べるのが大変だった。
一番最初の環境構築でつまづいた初心者がまとめたものなので参考にならないかも。
なにかあれば...twitter@izszzz_
C# XMLコメント チートシート

## 内容

たまにC#のコメント細かく書きたいときにどんなタグがあった思い出すために作成。

|タグ|説明|
|:-:|:---|:---|
|`<summary>`|型やメンバー関する情報を記述||
|`<remarks>`|型やメンバーに関する情報を補足する。`<summary>`の補足情報を記載する||
|`<returns>`|メソッドの戻り値||
|`<value>`|プロパティに対して使用する。returnsと同じ||
|`<example>`|例を挿入する`<code>`を入れ子で使用する|`<example><code>...</code><example>`|
|`<para>`|書式設定タグ`<remarks>` や `<returns>`の内側で使用してテキストを段落に分割するときなど||
|`<c>`|書式設定タグテキストの一部をコードとしてマークする`<code>`のインライン用途||
|`<exception cref="Exception">`|メソッドでの例外されるスローを記述||
|`<see cref="Math.Add(int, int)">`|別のコード要素のドキュメント ページへのクリック可能なリンクを作成||
|`<seealso>`|`<see>` と同じように使用||
|`<param>`|メソッドのパラメーターを記述||
|`<typeparam>`|ジェネリック型またはメソッド宣言で、ジェネリック パラメーターを記述するために使用||

### `<remark>` の記述例

``` csharp
/// <summary>
/// チート例に関するクラス
/// </summary>
/// <remarks>
/// C#コメントタグに対する使用例を取得できます
/// </remarks>
public class CheatExample
{
    public CheatExample(string tag)
    {
        ...
    }
}
```

### `<example>`の記述例
``` csharp
/// <summary>
/// チート例に関するクラス
/// </summary>
/// <example>
/// <code>
/// {
///     var commentExample = new CheatExample("summary");
///     var sampleComment = commentExample.Get();    
///     Console.WriteLine(sampleComment);
/// }
/// </code>
///<example>
public class CheatExample
{
    public CheatExample(string tag)
    {
        ...
    }
    
    public string Get()
    {...}
}
```


各使用例は、参考URLが詳しいので以下を御覧ください。

---
## 参考URL
[XML コメントによるコードの文書化](https://docs.microsoft.com/ja-jp/dotnet/csharp/codedoc)
[XML ドキュメント コメント (C# プログラミング ガイド)](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/xmldoc/index)
AWS Certified Developer Associateに合格しました

##はじめに
AWS Certified Developer Associateを受験し、一発合格したので勉強方法をまとめます。

[AWS Certified Developer Associateとは]
(https://aws.amazon.com/jp/certification/certified-developer-associate/)

##筆者のバックグラウンド
実務でAWSのインフラ系のサービスは4年ほど触ってきました。
認定資格としては、去年までにCloud Practitioner、Solutions Architect Associate、Solutions Architest Professionalに合格しています。
開発系のサービスはチュートリアルレベルでしか触ったことがないため、1からガッツリ勉強しました。

##勉強方法
ざっくりと以下のような流れで勉強しました。

①書籍でDeveloper Associateに出題されそうなサービスの概要とポイントを勉強
②未経験サービスについてはチュートリアルをやってみる
③公式ドキュメントやBlackbeltの資料を読み込む
④模擬試験を受験
⑤Whizlabsで練習問題を解いて解説を読み込む

結果的に898/1000で合格できましたが、勉強の時間配分があまり効率的じゃなかったなぁと反省しています。
①～③に時間をかけましたが、①～③はさらっと済ませて④で実力確認、⑤の解説の読み込みと理解に時間をかければよかったです。

##書籍
以下の書籍で勉強しました。
Developer試験に出そうなサービスについて読み、未経験のサービスについては各章に記載されているチュートリアルを実施しました。

[AWS認定アソシエイト3資格対策~ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター~]
(https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%883%E8%B3%87%E6%A0%BC%E5%AF%BE%E7%AD%96-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%80%81%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%80%81SysOps%E3%82%A2%E3%83%89%E3%83%9F%E3%83%8B%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC-%E5%B9%B3%E5%B1%B1-%E6%AF%85/dp/4865941991)

##模擬試験
AWS試験の予約サイトからオンラインで模擬試験を受験しました。
本試験より問題文が短く簡単な問題が多かったと感じましたが、内容としては本試験に近いので、模擬試験受験後にしっかり復習することをお勧めします。

##Whizlabs
WhizlabsのAWS Certified Developer AssociateのPractice Testsを購入し、Google翻訳を使いつつ勉強しました。
練習問題の数が多く、解説が充実しているため、非常に役に立ちました。
問題によっては解説に公式ドキュメントのリンクが貼ってあるので、それをしっかり読み込んでおくといいです。
https://www.whizlabs.com/aws-developer-associate/

##受験の感想
割と余裕をもって合格できましたが、もっと手を動かしてサービスを触っておけばよかったと思いました。
実務でもチュートリアルでもマネジメントコンソールからリソースを操作することが多かったのですが、普段からCLIを使っておけばもっと心に余裕が持てたかもしれません。

反省点はありますが、これまで馴染みのなかったサービスのことが少し理解できたので、今後は開発系のプロジェクトにも積極的に関わっていきたいと思います！
AWS アカウントの解約とリソース残存問題 (2020.7.16 update)

AWSのアカウントを解約しても、作ったリソースはすぐには消えません。幸いなことに料金は発生しないので(請求書は来ないので）問題はないかと思ったら他の問題があることが最近分かりました。

### アカウントの解約とリソース残存問題

解約したアカウントのS3 Bucket名に特定の名称を使っていて、その名称を他のアカウントで作ろうとした時に問題が発生しました。ベストな対策は、アカウントを解約する前に、リソースを綺麗に削除することです。

今回はアカウント解約をしてしまって、webコンソルにログインも出来ず、そのBucketが残っているかどうかの確認すら出来ないので、s3apiを使ってBucketが残っていることを確認しました。


#### Bucketの残存確認コマンド
```
# aws s3api head-bucket --bucket [Bucket Name]
```

##### Bucketが存在しているため作れない : 403 Forbidden
```
# aws s3api head-bucket --bucket [Bucket Name]

An error occurred (403) when calling the HeadBucket operation: Forbidden
```
Bucketが（どこかに）存在しているので作れないという意味です。
今回、このエラーコードが返ってきました。

#### Bucketが存在していない: 404 Not Found 
```
# aws s3api head-bucket --bucket [Bucket Name]

An error occurred (404) when calling the HeadBucket operation: Not Found
```
Bucketが存在していない時のエラーコードです。
すなわち、この名前のBucketは作ることが出来る、という意味にもなります。

### じゃ、どうする？
解約したアカウントなので直接削除することも出来ないため、解決案としては以下の3つを上げられます。

- Bucketが消えるまで素直に待つ。(90日のアカウント復活可能期間が過ぎるまで？）
- 別のBucket名を使う。
- アカウント復活を申請して自分で削除する。

### 結論
アカウント解約する時は、必ず全リソースを削除してから解約しましょう。


### 追記 (2020.7.16)
SQSのキューとメッセージがある状態で、そのキューがリトライか何かで更新し続ける状況で解約した場合、リトライ中のキューに対しては料金が発生する可能性があります。
解約の前にSQSのキューも消しましょう。
raise で 意図的に例外を投げかける

```py
import sys, traceback

number1 = 100
number2 = 1

print('start')
try:
    print(1)
    raise NameError('意図的にネームエラーを発生させました。')
    print(2)
except NameError as e:
    print('未定義の変数を呼び出しました。')
    sys.stderr.write(traceback.format_exc())
finally:
    print('end')
```

```:実行結果
start
1
未定義の変数を呼び出しました。
end
```
tryブロックのraise NameError より後ろにある
print(2)は実行されないことに注意。

```:実行時エラー
Traceback (most recent call last):
  File "Main.py", line 9, in <module>
    raise NameError('意図的にネームエラーを発生させました。')
NameError: 意図的にネームエラーを発生させました。
```
あっさり読むrails③（クラス）

#はじめに
[前回の記事](https://qiita.com/Moon1126Snow/items/d7e942bdb9dcc2cf4f55)にて、
`もちろんこのままだと味気ないので、実際にはclassを設定したり、他のメソッドを使用することになります`と書きました。
本記事では、その`classを設定する`の部分を実行しようと思います。
#実行
前回使用したコードを改良しようと思います。今の所、コードは下記の通りです。

```haml
- @products.each do |product|
  = product.name
  = product.price
  = image_tag(product.image)
```

まずは、`name`,`price`,`image`をひとまとめにするクラスを作ります。

```haml:index.html.haml
- @products.each do |product|
  .product
    = product.name
    = product.price
    = image_tag(product.image)
```

これで、テーブルに登録してあるだけの、`name,price,image`の3要素を持った`product`classのオブジェクトが作られます。
この状態では、`name`と`price`でフォントを変えたり、`image`の大きさを変更したり、といったことが難しいので、要素毎にclassを設定します。

```haml:index.html.haml
- @products.each do |product|
  .product
    = product.name, class: "product__name"
    = product.price, class: "product__price"
    = image_tag(product.image, class: "product__image")
```
Xcodeでデバッグ中に変数の値が確認できなかったけど簡単に解決したメモ

#そこにある変数が見えない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45349/d580bfe0-a724-2bf3-87a6-3529b7a88536.png)
確かにそこにいるんだ。
folders という配列が…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45349/ad4ad6e6-bfea-9621-6f5a-d7f6de301639.png)
しかし、見えないんだ…

```
(lldb) po folders
error: <EXPR>:3:1: error: use of unresolved identifier 'folders'
folders
^~~~~~~

(lldb) po self.folders
error: <EXPR>:3:1: error: use of unresolved identifier 'self'
self.folders
^~~~

(lldb) p folders
error: <EXPR>:3:1: error: use of unresolved identifier 'folders'
folders
^~~~~~~
```

値がどこからも確認できないんだ…


#解決方法
ということで、SwiftとObjective-Cが混在しているプロジェクトで起きがちという噂の
「Xcodeでデバッグ中に変数の値が確認できない」
「lldbデバッグで変数の中身を見ようと、poしても見れない」
とお困りの方に朗報
こんなとき、コードにprint関数を埋め込んだりしてましたが、


> po print(対象の変数)

```
(lldb) po print(folders)
["新しいフォルダ", "新しいフォルダ1", "新しいフォルダ2"]
```

lldbコマンドで、`print関数`の戻り値を `print object` するという方法で、コードを汚さず値を確認することができます。(できる場合があります。くらいにしておこうかな)
OneNote (UWP版) でグリッドに合わせずに図形を配置する方法

# 概要
MicrosoftのノートアプリであるOneNoteは、従来のOneNote 2016からUWP版のOneNoteへの移行を推奨されています。しかし、OneNote 2016では実装されていたのに、UWP版のOneNoteでは実装されていない機能もあり実際の移行の障害となっています。

その一つとして、OneNote 2016では図形や文字列をグリッドに合わせずにフリーで移動させることが可能でした。
以下のように「描画」タブの図形の部分を展開して、「グリッドに合わせる」のチェックを外すことで実現できます。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431069/13183de9-87bc-2e69-7a0e-98c9029ffd32.png)


しかし、UWP版のOneNoteでは同様の設定項目がなくなってしまいました。UWP版のOneNoteではフリーに図形や文字列を配置することはできないのでしょうか？

# UWP版OneNoteでフリーに図形を配置する方法
UWP版のOneNoteでは「alt」キーを押しながら図形や文字列を配置・移動することでグリッドに合わせずにフリーに配置することが可能になります。

※ 大した内容ではありませんが、調べた範囲ではヘルプなどを見てもこのことは書かれていなかったので、ここにシェアさせて頂きました。
[WSL] VS Code上でChrome DebuggerのブレイクポイントがUnverified breakpointとなりヒットしない

#事象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89620/9f8f07d0-2eb1-8a23-46f2-6c7ea6f13fe3.png)

ブレイクポイントをセットしても、Unverified breakpoint（未検証のブレイクポイント）となり、セットしたポイントでデバッグが止まりません。

#TL;DR
この記事では、上記の事象を解消します。

#環境
- WSL Ubuntu 16.04.6 LT

#解決手順

`launch.json`内で、`sourceMapPathOverrides`でフォルダのマッピングを定義する必要があるようです。（こちらのオプションの詳細については調べていないため掘り下げません。）

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Launch Chrome against localhost",
            "url": "http://localhost:3000",
            "webRoot": "${workspaceFolder}",
            "trace": true,
            "sourceMapPathOverrides": {
                "/mnt/c/*": "C:\\*"
            }
        }
    ]
}
```

上記の例ではCドライブをマッピングしていますが、もしDドライブにWSLをマウントしているのであれば、 `"/mnt/d/*": "D:\\*"`となります。

# 参考文献
https://daniellewis.dev/2019/03/24/getting-chrome-debugger-to-work-in-vs-code-with-windows-subsystem-for-linux/
RailsでBootstrap4でのSass利用に必要となるインポートについて

Bootstrap4にてsassを使用する場合に、Railsチュートリアル5章に記載の以下の通りにカスタムCSSを作成、
（※Bootstrap4の事前準備については https://github.com/twbs/bootstrap-rubygem を参考ください）

「rails generateコマンドを実行することでコントローラーごとに分けられたCSSファイルが自動的に生成されますが、これらのファイルを正しい順序で読み込ませるのは至難の技なので、本チュートリアルでは (簡潔のために) すべてのCSSを1つにまとめる方針を採っています。カスタムCSSを動かすための最初の一歩は、カスタムCSSファイルを作ることです。」

「"app/assets/stylesheets/"は、Asset Pipelineの一部であり、このディレクトリに置かれたスタイルシートはapplication.cssの一部としてWebサイトのレイアウトに読み込まれます。さらに、ファイル名のcustom.scssには.scssという拡張子も含まれています。この拡張子は「Sass (Sassy CSS)」と呼ばれるCSSを拡張した言語で、アセットパイプラインはこのファイルの拡張子を見て、Sassを処理できるようにしています。」

上記内容では、反映しないため、以下内容が必要

"application.html.scss"に「@import "custom";」を追加（つまり、適用したいscssファイルを""内に記載し追記する）。
BigQuery Transferで楽ちんにインポート

BigQuery Transferが正式リリースされてからBigQueryへのインポートがめちゃくちゃ楽ちんになりました。

それまではCloud Functionsを使ってバッチを組んだり、更に昔に遡るとSDKを使って独自にバッチプログラムを組んだりとひと手間かかったんですが、BiqQuery TransferはすべてUIのみでできてしまうので、例えば営業や経理などのノンプログラマーの方が何らかのログを自動収集したい場合などにも活用できます。

日本語で解説しているページがほとんどないので使い方の流れを解説してみます。

#BigQuery Transferとは#
公式ページによると、
>BigQuery Data Transfer Service は、あらかじめ設定されたスケジュールに基づき、SaaS アプリケーションから Google BigQuery へのデータの移動を自動化するマネージド サービスです。そのため、1 行もコードを書くことなく分析用のデータ ウェアハウス基盤を構築できます。

とのこと。
https://cloud.google.com/bigquery/transfer/?hl=ja

対応しているデータソースは、Google広告、キャンペーンマネージャー、Googleアドマネージャー、YouTube、Amazon S3、Cloud Storageなど様々です。

#BigQuery Transferを設定してみる#
ここではCloud Storageのある特定のフォルダにあるCSVを定期的にインポートする処理を例に取ります。
##準備##
「APIサービス」にてBig Query APIを有効にしてください。

更にBigQueryでインポート先のデータセット、テーブルを作成しておきます。
今回のケースでは大変シンプルに↓こんな感じでデータセットbqt、テーブルbqtを作成しスキーマを定義しておいてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539192/edc8ce7b-1da6-35c4-1dca-4003082b7462.png" width="300">


またインポート元としてCloud Storageにバケットとフォルダを作成しておいてください。
この例では「bqt-test」というバケット、更にその中に「import」というフォルダを作成し、「yyyymmdd.csv」というファイルが毎日決まった時間にフォルダ内に保存されるケースを想定します。

##転送の基本設定##
そもそもどこからアクセスするのかと言うと、
https://console.cloud.google.com/bigquery

プロジェクトが適切に選択されている状態で上記の管理画面にアクセスすると、ここに「転送」と日本語でメニューが登場しますのでクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539192/97744fe0-0c8c-dfc1-1703-0b5c7fe2e5b8.png" width="300">

次ページで「転送を作成」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539192/a71b9afd-bfcc-7d98-48a1-a9af5a5c073f.png" width="300">

次のページではデータソースを選択します。
（今回はGoogle Cloud Storage）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539192/037f4590-f2a3-d2e6-80eb-62d36c559827.png" width="300">

##転送の詳細設定##
次のページで転送の詳細設定を行います。
必須のもの、使いそうなパラメータのみ以下説明します。

|設定値|説明|
|:---|:---|
|表示名|わかりやすい名前を適当に|
|繰り返しの頻度|毎日、毎週、毎月、カスタム、オンデマンドの中からお好みのものを|
|開始日と実行時間|一番最初に実行したい日時を設定してください。ここを起点にして↑の頻度で処理されます。BigQuery TransferはCloud Storageに保存してから６０分以上経過しているファイルしか処理してくれないのでこの点だけご注意を。|
|データセットID|インポート先のBigQueryのデータセットIDを入力してください。|
|Destination Table|インポート先のBigQueryのテーブル名を入力してください。|
|Delete source files after transfer|インポートが終わったらファイルを削除するかどうかです。バッチ処理の場合は毎回消してしまってよいかと思います。|
|File Format|CSV, JSON, AVRO, PARQUET, ORCからファイル形式が選択できます。|
|Header rows to skip|CSVなどでは1行目にヘッダー行がある場合がほとんどだと思います。ここで先頭から何行スキップするかが設定できます。|

これで「保存」をクリックして完了。
めっちゃ簡単＼(^o^)／

#おまけ - 定期実行以外のタイミングで実行したい場合#
transferのトップページ右上の「さらに表示」から「今すぐ転送を実行」でいつでも実行ができます。
![実行の詳細 – BigQuery – dev-watanabe – Google Cloud Platform (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539192/dd5725b4-e526-fe83-3969-865222685f5a.png)
CSSだけで画像などの要素を上下にふわふわ動かす

#はじめに
CSSとHTMLだけで、要素（画像など）を縦にフワフワと動かしてみます。
下記参考ページの「一番上のスマートフォン」のような動きが可能です。
【参考】
https://www.ana.co.jp/ja/jp/amc/promo/app-service/


#方法


動かしたい要素のclassに任意の文字列を設定します。
この場合は「img scr="○○○"」に対して、classを設定します。
###HTML

```HTML:index.html
<img scr="○○○" class="####">
```
その任意の文字列に以下のコードを設定
###CSS

``` CSS:style.css
.#### {
    animation-name: ▲▲▲▲;
    animation-timing-function: ease-in-out;
    animation-iteration-count: infinite;
    animation-direction: alternate;
    animation-duration: 1.5s;
}
```

「####」に対して設定した「animation-name」内の「▲▲▲▲」に対して、以下をCSSに記入
###CSS

``` CSS:style.css
@keyframes ▲▲▲▲ {
    0% {
        transform: translate(0,0px);
    }

    100% {
        transform: translate(0,-15px)
    }
}
```

以上で要素「img scr="○○○" class="####"」が上下にフワフワ動きます。


ぜひお試しください！

#参考リンク

以下の記事もご参考にどうぞ。

・cssのkeyframesで要素に動きや変化をアニメーションでつけるサンプル
http://mugen00.moo.jp/web/css/keyframes-sample
VScodeで拡大、縮小コマンド一覧

VScodeを使用している時適当にどこか押してしまい、vscodeがどんどん小さくなる現象に陥りました。
当時は解決方法が分からずアンインストールからのインストールをしており大変な思いをしましたが、拡大、縮小のやり方がわかったので共有させて頂きます。





#拡大
shift+command+ +マーク

#縮小
command+l


#他にも便利だと感じたコマンド
shift+command+l→同じ単語一括編集

他にも便利と感じたコマンドは随時追加していきます。

#１つ前に進む
ctrl+y(windows)
【正規表現】先頭を除く、文字列中の記号を置換する

#お題

__+12 345(6789)0123__のような電話番号を拾った時に、先頭の`+`はそのままに、数字だけを拾いたい、みたいなことを考えたがググっても出なかったので記事にします。

Perl使いなので文中のコードはPerlですが、他の言語でも一緒でしょう。知らんけど。

#実装に必要な知識

##「数字以外の文字」にマッチする`\D`

`\d`は皆さんご存知だと思います。その否定が`\D`。要するに`[^\d]`。
とりあえず電話番号の区切りを半角スペースに統一したい場合は大雑把にやるとこう。

`$phone =~ s/\D/ /g;`

しかしこれだと文字列の先頭に`(`や`+`がある時にそれも空白に変えてしまう。

##否定の先読みの表現`(?!)`

[この辺](https://abicky.net/2010/05/30/135112/)と[この辺](http://www-creators.com/archives/1827#i-3)が詳しいので熟読のこと。

以下は私なりの理解。

要するに、__肯定のパターン`(?=)`の否定が`(?!)`__と理解するのが一番混乱が少ない。
「特定の文字列（パターンから）__始まず__」かつ「そのあとに__続く何か__」を拾うには、`(?!\A)(\w+)`などとする。

##文字列の先頭`\A`および行の先頭`^`

これに関する[違いを解説した記事](https://qiita.com/jnchito/items/ea7832df6f64a9034872)を見つけました。どうやら、__`\A`の方がマッチするパターンが狭い__らしい。

~~通常、先頭にマッチするには`^`で用が足りるけど、今回のような案件にはこのメタ文字への理解が必須。~~
今回のお題では別に`^`で構わないようです。[^1]

[^1]: [akajiro](https://twitter.com/akajiro/status/1222903130074955777?s=20)さんからTwitterでご指摘いただきました。

`\a`はベル文字が先に定義されているため、`\A`を否定するには`(?!\A)`または`(?!^)`となる。
「先頭ではなく、数字でもない文字」にマッチさせるには`(?!\A)(\D+)`または`(?!^)(\D+)`と、「先頭の否定」と「それに連なる数字の否定」を表現する。

#実装

``` regexp.pl
use feature qw(say);
use strict;
use warnings;

my $phone = optimize('  +81 0120(893)893  ');
say $phone;                                 # +81 0120 893 893

use Unicode::Japanese;
my $value = Unicode::Japanese->new('  ＋８１　０１２０（８９３）８９３  ')->z2h->get;
$phone = optimize($value);
say $phone;                                 # +81 0120 893 893

exit;

sub optimize {
    my $phone = shift;
    $phone =~ s/^ //s;                      # まずは冒頭のスペースを取り除く
    $phone =~ s/(?:(?!\A)\D|\()+/ /sg;
    #↑ 「先頭ではなく、数字でもない文字」または単純に`(`が先頭にある場合スペースに置換。
    $phone =~ s/^ //s;                      # 再び冒頭のスペースを取り除く
    $phone =~ s/ $//s;                      # 末尾のスペースを取り除く
    return $phone;
}
```

#募集

「それ一行でできるぜ？」って猛者がおりましたらコメントや編集リクエストをお願いいたします。

#募集結果

## @indometacin さんのアプローチ(JavaScript)

「数字直後の数字ではないキャラクタを削除」すれば良いので`\A`を使う必要がそもそもない、ということが判明。目から鱗のコードでした。

```javascript
console.log('+81 123(456)789'.replace(/(\d)\D+/g, '$1'));
//+81123456789
```

だけど誰かが`\A`や`(?!\A)`について調べたいと思った時のためにこの記事はそのままにしておきます。

##@earthdiver1 さんのアプローチ(Perl)

###`(?|pattern)`([branch resetパターン](https://perldoc.jp/docs/perl/5.16.1/perlre.pod#Extended32Patterns))を使うワンライナー

```perl
$phone =~ s/(?|^\s*(\+?)\D*|())(\d+)\D+/$1$2 /g;
```

末尾に半角スペースがついちゃう以外は完璧。

```perl
$phone =~ s/ $//s;                      # 末尾のスペースを取り除く
```

ま、簡単に取れますのでこれでいいような。

###(?\<NAME\>pattern)（名前付きキャプチャ）を使うワンライナー

前述のbranch resetパターンが使えない環境でもこうは書ける

```
$phone =~ s/(?:^\s*(?<p>\+?)\D*|(?<p>))(\d+)\D+/$+{p}$3 /g;
```

これもやっぱり末尾にスペースがあった場合残る。
触れたらプレイヤーの重力を反転する

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    Rigidbody2D rigid2D;
    bool gravity;

    void Start()
    {
        this.rigid2D = GetComponent<Rigidbody2D>();
        gravity = false;
    }

    void Update()
    {
    }

　　void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("gravity"))//オブジェクトにgravityタグ
        {
            if (gravity == false)
                gravity = true;
            else
                gravity = false;
            rigid2D.gravityScale *= -1;
        }
    }
}
```
【Unity】Canvasを使ったUIを複数の解像度に対応させる方法

## はじめに
このアカウントは、プログラムについて勉強し始めて1年立たずの専門学校生によるものです。
新たに学んだ技術や知識をなるべくわかりやすくまとめておこうと思います。
アドバイス・ご指摘などありましたら、どうぞご遠慮無く。

##解像度について
Unityに限らず、アプリケーションの開発、特にスマートフォン向けのものである場合には必ず直面する問題だと思います。
同じ規格、同じ解像度の端末をすべてのユーザーが使用していることは、基本的には存在しません。
したがって、複数の解像度に対応したアプリケーションの開発が必要になります。
ここで紹介するのはその方法の1つです。
処理速度などは考慮していませんのでご了承ください。

#####では早速…

##Canvasの設定
UnityのUIは”Canvas”によって作ることができます。
まずはCanvasの設定から始めましょう。

今回は3Dのプロジェクトで説明します。
まずは、Canvasを出しましょう。
タスクバーから”GameObject/UI/Canvas”でCancasを出します。
![Unity Canvas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556108/0996b71e-fe38-5d8f-1ef4-22b7cdf2861a.png)
続いて、Canvasの設定をしていきます。
CanvasのInspectorを見ます。画面はこんな感じ。
![Unity Canvas Inspector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556108/4616dbbf-057d-0b3e-40ed-68fc1a8462a6.png)
設定するのは、”Canvas Scaler”の”UI Scale Mode”です。（下記画像の赤枠）
デフォルトでは”Constant Pixel Size”になっているので、”Scale with Screen Size”に変更します。
![Unity Canvas Inspector2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556108/9c79d12b-abd1-28be-3ea0-21ce580b02d1.png)
これで、Canvasの大きさが起動時の画面サイズと同じ大きさになります。

##UIオブジェクトの大きさ
Canvasの大きさが画面サイズに対応してもCanvas上のオブジェクトが対応しなければ意味がありません。
今回はオブジェクトにスクリプトをアタッチすることで対応させてみました。

使用したスクリプトはこちら

```C#:SizeOptimise.rb
using UnityEngine;

public class SizeOptimise : MonoBehaviour
{
    public GameObject canvas;
    public bool       horizontal = true;
    public bool       vertical   = true;

    void Start()
    {
        float width  = gameObject.GetComponent<RectTransform>().sizeDelta.x;
        float height = gameObject.GetComponent<RectTransform>().sizeDelta.y;
        if (horizontal)
        {
            width = canvas.GetComponent<RectTransform>().sizeDelta.x;
        }
        if (vertical)
        {
            height = canvas.GetComponent<RectTransform>().sizeDelta.y;
        }

        gameObject.GetComponent<RectTransform>().sizeDelta     = new Vector2(width, height);
        gameObject.GetComponent<RectTransform>().localPosition = new Vector3(0, 0, 0);
    }
}

```

bool型の変数を二つ用意して、縦と横のサイズ変更が別々にできるようにしました。
使い方は以下の通りです。
![Unity SizeOptimise.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556108/3de92d1f-46aa-3d48-acae-ea41cf0fa7a9.png)
※public変数について
Canvas：このスクリプトをアタッチしたCanvasを選択。そのCanvasサイズがオブジェクトのサイズに対応します。
Horizontal：縦（垂直）方向のサイズを合わせるかどうか
Vertical：横（水平）方向のサイズを合わせるかどうか

##まとめ
かかった時間や手間はかなり少ないですが、しっかりと複数の解像度に対応させることができました。
困っていた人がいれば参考にしていただければ幸いです。
また、改善点などありましたらコメントにてご教授いただけると、私のスキルアップにつながります。
ぜひよろしくお願いいたします。
Identifier (識別子)とは

## はじめに
Javascriptの勉強を進めるうちに、コンソールに
「**Identifier '変数名' has already been declared**」と出力されることが増えた。

上記のエラーが出てくるときは、
２度変数を定義してしまった時である。

（例）

```javascript
let a = 123;
let a = 456;
```

```console
Identifier 'a' has already been declared
```

上記を読み解くと、エラーメッセージには
「識別子aはすでに宣言されている」と出力される。

識別子って何？？という疑問が生まれ、
調べた結果をここに残す。

## Identifier (識別子)とは
まず、識別子について説明する。
識別子とは、**<font color="FireBrick">様々な対象から特定の一つを識別するのに用いられる名前や符号、数字</font>**を指している。（参考：e-Words）

プログラミングの場合、**関数名や変数名、プロパティ名**が
識別子に当たる。

重要なのは識別子aで、
const a = 1
で定義されたのか、
const a = () => {}
で定義されたのか、
それは重要ではない。

重要なのは、すでにaが定義されているということ。



今回の例の場合、Identifier '変数名' has already been declaredはすでに識別子「変数名」は宣言されていますよーと教えてくれている。
flutter 備忘録

# 自分用の備忘録

## channel一覧表示
<code>flutter channel</code>

## stableを選択
<code>flutter channel stable</code>

## stableの最新版に更新
<code>flutter upgrade</code>

## 選択可能なversion一覧を確認する
<code>flutter version</code>

## 特定のversionを利用する
<code>flutter version v1.9.1+hotfix.6</code>
errorがでて取得できないときは・・・

<code>git checkout v1.9.1+hotfix.6
flutter doctor</code>

## 自分のversionを確認する
<code>flutter --version</code>
【VBA】OpenRecordsetをまとめる(個人用)

# 初めに
OpenRecordset をよく使うのによく忘れるので個人用にまとめます

[・OpenRecordset についてのリファレンス](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao)
[・BOF,EOF プロパティについてのリファレンス](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/bof-eof-properties-ado)
[参考にするサイトまとめ]
https://tsware.jp/study/vol16/vbabegin_37.htm
http://www7b.biglobe.ne.jp/~cbcnet/DAO/database.html
http://www.accessclub.jp/dao/OpenRecordset.html

# OpenRecordset とは
OpenRecordsetメソッドとは、新しいRecordsetオブジェクトを作成し、
Recordsetsコレクションに追加するメソッドです。

```vb:構文.
Dim RS As Recordset
Set RS = CurrentDB.OpenRecordset(Name, Type, Options, LockEdit)
```


### 戻り値
Recordsetオブジェクト

## Recordesetオブジェクトとは?
Recordset オブジェクトは、ベース テーブルからのレコード、またはコマンドの実行の結果得られたレコードの集合全体を表すオブジェクトです。
Recordset オブジェクトは、レコードセット内部の単一のレコードだけをカレント レコードとして常に参照します。


## 引数パラメータ
```vb
Set RS = CurrentDB.OpenRecordset(Name, Type, Options, LockEdit)
```
###name(必須)
Recordset のレコードの取得元。
テーブル名、クエリ名、またはレコードを返す SQL ステートメントを指定できます

```vb
Set RS = CurrentDB.OpenRecordset("テーブル名")
Set RS = CurrentDB.OpenRecordset("クエリ名")
Set RS = CurrentDB.OpenRecordset("SELECT * FROM テーブル名")
```
###Type(省略可)

[わかりやすいからこちら参照](http://www.accessclub.jp/dao/OpenRecordset.html)
### Options(省略可)
[わかりやすいからこちら参照](http://www.accessclub.jp/dao/OpenRecordset.html)
### LockEdit(省略可)
[わかりやすいからこちら参照](http://www.accessclub.jp/dao/OpenRecordset.html)
## レコードの追加・編集
###追加
```vb:追加.
Set RS = CurrentDB.OpenRecordset("テーブル名")
RS.AddNew '新しいレコードを作りますよ
RS("カラム名") = "データ"
RS.update '確定
```

###便利な追加方法
```.vb
DRS.AddNew
For i = 0 To DRS.Fields.Count - 1
　DRS(i) = SRS(DRS(i).NAME)
Next i
DRS.Update
```
###編集
```vb:編集.
Set RS = CurrentDB.OpenRecordset("テーブル名")
Do Until RS.BOF Or RS.EOF 'カレントレコードがあるか
  RS.Edit '今から編集しますよ 
  RS("カラム名") = "データ"
  RS.update '確定
  RS.MoveNext '次のレコードに行くよ
Loop
RS.close
```
## BOF,EOFプロパティ
カレントレコードがあるか確認することができる
BOF プロパティと EOF プロパティのいずれかが True になっている場合は、
カレント レコードが存在しません。
・ある時はFalse
・ない時はTrue

## オブジェクトの解放
recordsetオブジェクトを使わくなった時に開放する。

```vb
RS.close
もしくは
Set RS = Nothing
```
メモリ的にはどちらも変わらないらいしので
どちらでもいい。
FuelPHPで発行したSQLを確認する方法

FuelPHPの実際に発行したSQLクエリを確認する方法を２種類記載します。

## 最後に実行したクエリを確認する方法

１つ目は``DB::last_query()``を使用する方法です。

```
// クエリを実行する
$user = DB::select()->from('users')->where('id', 1)->execute();

echo DB::last_query();
// SELECT * FROM `users` WHERE `id` = 1
```

参照：http://fuelphp.jp/docs/1.9/classes/database/db.html#/method_last_query

## FuelのDatabase_QueryクラスにSQL出力処理を仕込む方法

2つ目はクエリを発行した時に発行したクエリを直接ログや標準出力で見れるように仕込む方法です。

SQLの発行はDatabase_Queryのcompile()で行なっているのでそこに出力をいれれば最後の実行SQLだけでなく
全ての発行クエリが確認できます。

```
class Database_Query
{
 .
 .
 {省略}
 .
 .
 // Compile the SQL query
 $sql = $this->compile($db);
 var_dump($sql);
```

参照：https://fuelphp.com/api/classes/Fuel.Core.Database_Query.html#compile
20分でWebアプリを作ろう

この記事はIBM Cloudで初めてアプリケーションを作成する方を対象に記述しています。
#<事前準備>
IBM CLOUD CLIのインストール
 
##IBM Cloud ブラウザの操作
###1.IBM CloudにLogin

###2.Cloud Foundry の立ち上げ
カタログメニューからCLOUD Foundory を選択、パブリック・アプリケーションを”作成”します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/abd9a40c-b5a2-124c-8b53-3ac5067de365.png)

プランを指定し、言語を選択（例：SDK for Node.js）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/00ea5e3c-a625-d142-edd9-c1852ce4d782.png)

アプリ名を記入します。（例：GetStartedNode）
ホスト名はアプリ名が自動入力されます。
＊地域はダラス推奨、ドメイン名の初期値のままにしてください。

”作成”ボタンを押し、アプリケーションの開始を待ちます。

アプリURLにアクセスメニューより、Hello World！が表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/31a9cb44-2c91-9a3d-3985-ec8e782580d9.png)


##<ここからはターミナルの操作>
###3.Gitをクローンする（ローカルにディレクトリ毎コピーを作成）
ここをコピー：git clone https://github.com/IBM-Cloud/get-started-node

###4.コピーしたget-started-nodeディレクトリに移動
ここをコピー：　cd get-started-node

###5.ローカル環境にアプリを入れて、スタート
ここをコピー：　npm install
ここをコピー：　npm start

###6.ローカル環境での動作を確認
URL: http://localhost:3000
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/0a39c6d6-3baa-28e2-39dd-af20f7ccb30d.png)

##ここからはymlファイルの編集
###7.ローカルにコピーされた”get-started-node”以下のmainfest.ymlをメモ帳などで編集、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/ef25a8cb-d3a9-411d-479f-de38a4641d79.png)

applications:
- name: GetStartedNode
  random-route: true
  memory: 128M

name:２で指定したアプリ名に変更
memory: 2で指定した容量に変更
ymlファイルを上書き保存する

##<ここからはターミナルの操作>
###8.IBM Cloudにログインし、Cloud Foundryをターゲット指定しプッシュ
ここをコピー：　ibmcloud login
ここをコピー：　ibmcloud target --cf
ここをコピー：　ibmcloud cf push

##IBM Cloud ブラウザの操作
###9.結果の確認
アプリURLにアクセスメニューより、「ようこそ、お名前を教えてください」が表示されることを確認します。
Visual Studio Codeを使用してPHPのデバッグを行う方法(備忘録)

visual studio codeを使用して、phpのデバッグを行う事にしたが、数日間試行の上、やっと解決したので備忘録として記載します。

phpを使用する目的として、webサーバー用に組み込む事を前提に記載します。
Xampは、用いず、Apache24をインストールし、binにて、httpdで立ち上げる方法を取ります。
Visual Studio Code, php74はインストール済との前提で記載します。

```php
<?php
$a = "abcd";
$b = "efgh";

$c = $a.$b;

echo $c;

?>
```
上記の様な簡単なプログラムに、ブレークポイントを付け、Step Inが出来る事を目的とします。
このコードは、Apachee24のhtdocsに、hello.phpとして保存して置きます。

下記の図で、PHP Debug等をインストールします。
![php1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/1ae6053c-3f19-cbb0-101b-bf575a4e6d4f.png)

この様なステップイン出来る状態にするためは、[このサイト](https://blog.kannart.co.jp/programming/1803/)にある様に、下記の作業が必要です。

![php2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/dcc9625c-5b29-0caf-bc83-f336ddd305e3.png)
scriptを修正するためには、歯車を押します。「launch.json」が表示あれます。

```php
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "extensionHost",
            "request": "launch",
            "name": "Launch Extension",
            "runtimeExecutable": "${execPath}",
            "args": [
                "--extensionDevelopmentPath=${workspaceFolder}"
            ],
            "outFiles": [
                "${workspaceFolder}/out/**/*.js"
            ],
            "preLaunchTask": "npm"
        },
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        },
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "stopOnEntry": true,
            "pathMappings": {
                "C:\\Apache24\\htdocs": "${workspaceRoot}"
            }
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
        }
    ]
}
```
私は、pythonもデバッグするので、上記、コードには、pythonのjsonコードも含まれています。
[このサイト](https://blog.kannart.co.jp/programming/1803/)では、xampでを指定していますが、下記の通り修正しています。
注意事項として、 "C:\\Apache24\\htdocs": とする必要があります。￥と￥を2回続けて記載する取り決めになっています。

```php
            "stopOnEntry": true,
            "pathMappings": {
                "C:\\Apache24\\htdocs": "${workspaceRoot}"
```
さらに、php.iniの追記も必要です。

```php
[xdebug]
zend_extension = C:\php74\ext\php_xdebug-2.9.0-7.4-vc15-x86_64.dll
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
```
ここで、虫の絵を押し「Launch currently open script」を選択し、ブレイクポイントを設定し、緑色の三角矢印を押すとデバッグが始まります。

以上です。
修正のご要望があれば、ご連絡下さい。
【Eclipse】DBViewerのインストール

# はじめに

[MergeDoc Project](https://mergedoc.osdn.jp/)からダウンロードした新しいEclipse（Eclipse 2019-09）をインストールしたところ、デフォルトでDBViewerがインストールされていませんでした。
今となっては少し古臭いプラグインなのかもしれませんが、DBViewerをインストールする方法をまとめてみました。

※[MergeDoc Project](https://mergedoc.osdn.jp/)で提供されている少し古いEclipse（eclipse-4.6系など）には、DBViewerがデフォルトでインストールされているようです。

# インストール手順

## インストール画面の起動

* ツールバーから［ヘルプ］>［新規ソフトウェアのインストール...］と進み、［
インストール］画面を開きます。

## リポジトリの追加

* 画面右側の［追加(A)...］ボタンをクリックして、リポジトリを追加します。リポジトリ名は識別さえ出来れば何でも大丈夫だと思います。
 * リポジトリ名：DBViewer UpdateSite
 * ロケーション：http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/

![apache_derby_eclipse_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/f889ae88-8e47-74f8-1336-3ecaec181c3a.png)

## インストール項目の確認

* リポジトリの追加が完了すると、追加したリポジトリの検索が自動的に開始されます。
* 表示された2つのソフトウェア（プラグイン）のチェックボックスを選択して、［次へ］をクリックします。
* 次の画面でインストール項目を確認した上で、［次へ］をクリックします。

![apache_derby_eclipse_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/fe1e8d13-77b1-d123-69ae-7151a264bedf.png)

# ライセンスのレビュー

* ［使用条件の条項に同意します(A)］にチェックを入れて、［完了］をクリックします。

![apache_derby_eclipse_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/06efa140-f7a4-0498-6d24-a4e01199a4a2.png)

# インストール

* 以下のようなセキュリティの警告が出ますが、［インストール］をクリックして処理を続行します。

![apache_derby_eclipse_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/e7cf309d-0f7c-5d55-16bb-1ec05619d82a.png)

# インストール後の確認

* ツールバーから［ウィンドウ］>［パースペクティブ］>［パースペクティブを開く(O)］>［その他(O)...］と進みます。
* 正常にインストールが完了していれば、開いたウィンドウに［DBViewer］というパースペクティブがあるはずです。

![apache_derby_eclipse_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/57e16798-a045-970a-15c0-2b3faafb55ab.png)


# 参考URL

* [DBViewer Plugin for Eclipseのインストール](https://symfoware.blog.fc2.com/blog-entry-808.html)
Rails6 のちょい足しな新機能を試す 116（MySQL データベース存在チェック編)

# はじめに

Rails 6 に追加された新機能を試す第116段。 今回は、`MySQL データベース存在チェック` 編です。
Rails 6 では、MySQLのデータベースを存在するかどうかをチェックする方法が少し変わりました。
データベースが存在しないときに、 `bin/rails db:migrate` を実行した場合、 MySQLのエラーメッセージが英語以外でも、 `ActiveRecord::NoDatabaseError` が発生するようになりました。

Ruby 2.6.5, Rails 6.0.2.1, Rails 5.2.4.1 MySQL 8.0.16 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

```shell
$ rails --version
Rails 6.0.2.1
```

今回は、MySQL のエラーメッセージを ja_JP にして起動して、 `bin/rails db:migrate` コマンドを使って Rails 6.0.2.1 と Rails 5.2.4.1 の違いを確認してみます。

今回、MySQL のエラーメッセージを日本語に切り変えるために mysqld コマンドに `--lc_messages_dir=/usr/share/mysql-8.0 --lc_messages=ja_JP` オプションを追加しています。

# MySQL 側で直接、データベースが存在しないことを確認する

mysql コマンドでデータベースが存在しないことを確認します。
ここで、メッセージの先頭が 1049 となっていることに注意してください。

```shell
$ mysql -u root app_development
ERROR 1049 (42000): 'app_development' は不明なデータベースです。
```

# db:migrate を実行する

エラーを確認するために、 `db:create` しないで `db:migrate` を実行すると `ActiveRecord::NoDatabaseError` が発生します。

```shell
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: 'app_development' は不明なデータベースです。
/usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:28:in `rescue in mysql2_connection'
```

ちなみに MySQL のエラーメッセージが英語の場合も `ActiveRecord::NoDatabaseError` となります。

```shell
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: Unknown database 'app_development'
/usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:28:in `rescue in mysql2_connection'
```

# Rails 5 では

MySQL のエラーメッセージが日本語の場合は、 `Mysql2::Error` となります。 英語の場合は、 `ActiveRecord::NoDatabaseError` になります。

日本語の場合：

```shell
$ bin/rails db:migrate
rails aborted!
Mysql2::Error: 'app_development' は不明なデータベースです。
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect'
```

英語の場合

```shell
$ bin/rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: Unknown database 'app_development'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:26:in `rescue in mysql2_connection'
```

# 何が変わったのか

Rails 5 までは、 エラーメッセージに `Unknown database` が含まれた場合に `ActiveRecord::NoDatabaseError` を発生させていました。
Rails 6 では、 エラーメッセージではなく、エラーの番号が 1049 (最初に mysqlコマンドでデータベースが存在しないことを確認したときの値)であるときに、 `ActiveRecord::NoDatabaseError` を発生させるようにしています。

# 試したソース

https://github.com/suketa/rails_sandbox/tree/try116_mysql_locale

# 参考情報

* [MySQL: Check error number instead of a message](https://github.com/rails/rails/pull/36653)
* [MySQL 10.12 Setting the Error Message Language](https://dev.mysql.com/doc/refman/8.0/en/error-message-language.html)
この単語で、検索に引っかからなかった結果

# あることをすると、どうなるか知りたかったんです

で、この単語を使って検索してみました

~~~
linux 実行結果 リダイレクト
~~~

```
linux シェル　実行結果 リダイレクト
```

```
linux スクリプト リダイレクト
```

```
シェル リダイレクト 実行結果
```

```
linux スクリプトファイル リダイレクト
```


# どんなことをしたかったかわかりますか？

ははーん
こういう系だろ、と
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/a7202dab-9118-ec7c-ca80-0fcd18c388b9.png)

[これはこれで参考になりました！
ありがとうございました！](https://shellscript.sunone.me/input_output.html)

# ちょっと違うんです、こういう系です

```bash:redirect.sh

#!/bin/bash

echo 作成したシェルファイルを実行し
echo そのファイルの実行結果をリダイレクトしたら

```

```bash:つまりこういうことです（上で作った.shファイル）

$ ./redirect.sh > redirect_redirect.txt
```

意外にこういう内容が検索結果に出てこないものですね
すぐ出てくるだろうと思ってたんですが

- [ ] 　`調べが足りなかったのかな？`
- [x] 　`いやいや、結構調べたって`

なので勝手にやってみました
`ファイルを実行するって怖かったんです`

# ではどんな単語で検索すればよかったのか

私にはわかりませんでした
そのうち、わかるようになるのかな

```bash:ちなみに上の結果はこうでした（まあそうですよね）
$ cat redirect_redirect.txt
作成したシェルファイルを実行し
その実行結果をリダイレクトしたら

```

# …で、本当に試したかったこと

本当にしてみたかったことはこれです

```bash:redirect_test.sh
#!/bin/bash

echo 作成したシェルファイルを実行し
echo そのファイルの実行結果をリダイレクトしたら
echo どうなるかの検証はできたが
echo cp などでファイルを扱うシェルを
echo 実行してリダイレクトしたら…


# さらにこういうことしたらどうなるのか
cp redirect_test.sh redirect_test_cp.sh

```

```bash:上のファイルの実行結果をredirect_redirect_test.txtにリダイレクト
$ ./redirect_test.sh > redirect_redirect_test.txt
```

どうなると思います？
こうなる↓と思いました？

```bash:redirect_redirect_test.txt
作成したシェルファイルを実行し
そのファイルの実行結果をリダイレクトしたら
どうなるかの検証はできたが
cp などでファイルを扱うシェルを
実行してリダイレクトしたら…

redirect_test_cp.sh
```

こうなりました↓

```
Vim: Warning: Output is not to a terminal
```

|まったく|何の反応も|しなくなりました…|
|:-----------------:|:------------------:|:------------------:|
|ぴえん|ぴえん|ぴえん|



# 思わぬ副産物

`Vim: Warning: Output is not to a terminal`

[調べました、まさにベストアンサー！気持ちいい](https://qa.itmedia.co.jp/qa8376576.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/80a2af9f-5204-5701-9dd1-82cc4308a5cd.png)


# 最後に、自分で検索用単語を作って置いておきます

### `linux sh シェル ファイル 実行 リダイレクト`

これで気になる人の`気になり`が解決しますように
deviseで認証メールのリンククリック時に認証しログイン画面に飛ばす

deviseで認証処理を実装時、confirmableのデフォルトだと、認証メールクリック時に`ActionController::UnknownFormat`エラーが出た。

`confirmations/show`のviewが無い。
認証成功時にログイン画面に飛ばしつつ、認証失敗時に`confirmations/show`をエラー画面として表示する。

versionは以下。

```
ruby: 2.6.5
rails: 6.0.1
devise: 4.7.1
```

### confirmations_controllerのshowメソッドをoverride
```ruby:controllers/users/confirmations_controller.rb
class Users::ConfirmationsController < Devise::ConfirmationsController
  ...

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    self.resource = resource_class.find_by_confirmation_token(params[:confirmation_token])

    if resource.nil? || resource.confirmed?
      # トークンが不正な場合、アカウント登録(パスワード登録)が済んでいる場合
      self.resource = resource_class.confirm_by_token(params[:confirmation_token])
      render :show
    elsif resource.is_confirmation_period_expired?
      # アカウント登録メールの期限が切れた場合
      resource.errors.add(:email, :confirmation_period_expired,
        period: Devise::TimeInflector.time_ago_in_words(resource_class.confirm_within.ago))
      render :show
    else
      # activate
      self.resource = resource_class.confirm_by_token(params[:confirmation_token])
      redirect_to new_user_session_path, notice: 'メールアドレスを確認しました。'
    end
  end
  ...
end
```
### メソッド追加
```rb:models/users.rb
  def is_confirmation_period_expired?
    # メールアドレス確認メール有効期限チェック(期限はconfig/initializers/devise.rbのconfirm_withinで設定)
    self.confirmation_period_expired?
  end
```

### controllers/show のviewを作成
```erb:views/users/confirmations/show.html.erb
<h2>エラー画面</h2>
<% if resource.errors.any? %>
  <article class="message is-danger">
    <div class="message-header">
      <p><%= pluralize(resource.errors.count, "error") %> prohibited this service from being saved:</p>
      <button class="delete" aria-label="delete"></button>
    </div>
    <div class="message-body">
      <ul>
      <% resource.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  </article>
<% end %>
```

### routesも忘れずに
```rb:config/routes.rb
...
  devise_for :users,
    controllers: {
      ...
      confirmations: 'users/confirmations',
      ...
    },
...
  devise_scope :user do
    put 'confirmation', to: 'users/confirmations#show', as: :back_confirmation
...
```
接続していたcyberdockが急に接続できなくなった時の対処

macの不調により突然シャットダウンが行われることが何回もありその度に
cyberdockが時々接続できなくなるという事態が発生して、やっと解消したので共有させて頂きます。


#解決方法
1.vagrant up 
2.vagrant ssh
3.cyberdock接続

今、考えると当たり前だなと感じる部分も当初はインフラ系の設定がチンプンカンプンだったので苦戦していました。
Oracle Cloud Infrastructure Computeでシェイプを変更できるようになったよ

# 新機能：Computeシェイプの変更

**今さらという気もするが、2020/01/14からComputeインスタンスのシェイプを変更できるようになった。**

手順や制限事項の詳細は次のページを見てほしい。

* [Release Notes: Changing the shape of a Compute instance](https://docs.cloud.oracle.com/iaas/releasenotes/changes/22dfb8e4-3d2e-4fec-b9ad-2505cf7fc30b/)
* [Changing the Shape of an Instance](https://docs.cloud.oracle.com/en-us/iaas/Content/Compute/Tasks/resizinginstances.htm)
* [OCI Blog: Right-Size Your VM Instances to Support Your Workload](https://blogs.oracle.com/cloud-infrastructure/right-size-your-vm-instances-to-support-your-workload)

実際に試してみると、1回の再起動は発生するが、コンソールやCLI等でシェイプ変更を指示してから、約3分から5分で変更が完了した。

変更可能なシェイプは以下のとおり。オペレーティングシステムによって少し違いはあるが、Intel同士もしくはAMD同士の変更が可能になる。

* VM.Standard
* VM.Standard.E2（AMD EPYC）
* VM.GPU3

<font color="red">**重要**
シェイプを変更する前には必ずブートボリュームのバックアップを取得すること。DBaaSも同じだが、シェイプ変更に数倍の時間がかかることや失敗することがあった。追加のブロック・ボリュームをアタッチしているときは事前にデタッチしたがいいかもしれない。またセカンダリVNICは再構成が必要になる可能性がある。
</font>


# 新機能のメリット

実際のところ、以前も以下の手順を踏めばシェイプは変更できた。

1. ブート・ボリュームを残したままComputeインスタンス削除
2. ブート・ボリュームを元にComputeインスタンス作成

それでもメリットをあげると次のようになるだろう。

* 簡単な手順で変更できる
* パブリックIPにエフェメラル（Ephemeral）IPを使用しているときでも、変更の前後で変わらない。従来はリザーブドIPが必要
* 追加のブロック・ボリュームやセカンダリVNICを使用しているときでも再設定が不要

<font color="blue">今後求められるのはOracle Cloud Infrastructure Database（VM）のシェイプ変更だ。対応策が「バックアップから再作成」に限られるので現状は極めて負荷が高い。</font>

Oracle Cloud Infrastructure Database（BM）は**再起動しないで変更できる素晴らしさ**はある。しかしDenseIO限定なので課金が止まらない、可用性について追加の考慮が必要など、スモールに使えない課題がある。

となるとAutonomous Databaseなのだけれど、コンサバなシステムでは使いづらいんだよなあ。
laravelでPHPのPDO接続を使用してmysqlに接続する方法


laravelの設定ではSQliteを使用していますが、別途PDOを使用してmysqlからデータを引っ張りたいと思った時にDBの接続って2つ使えるの？という疑問があったので解消してみました。

 
#やったこと
blade.phpにphpタグを使いPDO接続

#それに必要なもの
* サーバーの立ち上げ
* DB作成または既存のDB
* 上記のDBにテーブル作成


##laravelサーバー立ち上げ

```
＄pwd
/home/vagrant/laravel_lessons_copy/プロジェクト名
```

その後、

```
$ php artisan serve --host 192.168.33.10 --port 8000
```


でサーバー立ち上げで接続
　


 


#DBを確認

※現在のプロジェクト名の位置でmysql -u rootでログイン

###mysql> show databases;
![スクリーンショット 2020-01-01 18.18.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/f2b7f71b-c228-14ca-e26a-67ccbc40af27.png)

からuse DB名でDBを選択

```
use mysql
```

その後、table作成



##index.blade.phpにPDO接続

```index.blade.php


<?PHP
$pdo=new PDO('mysql:host=localhost;dbname=mysql;charset=utf8', 'root', '');

foreach ($pdo->query('select * from user') as $row){
  echo $row['id'];
  echo $row['name'];
  echo $row['address'];
}
?>

```


.envとdatabase.phpは何も触ってないけど一応添付しておきます。
今回PDOでmysql接続したいが、.envの設定はsqliteになっていても大丈夫です。

```php:.env


DB_CONNECTION=sqlite

#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=dotinstall_todo_app  //laravel上でのmysqlのDB
#DB_USERNAME=root　 //mysql -u rootでログインしたから
#DB_PASSWORD=      //上記のログインに際passwordは設定してないから空白　
```





```database.php


'default' => env('DB_CONNECTION', 'mysql'),

'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
```
aws cli 複数アカウント切り替え(MAC)

複数アカウントで aws cli を使うとき、--profileを指定してコマンドを実行するなどの方法がある。
direnvを使ってディレクトリ単位で付けないようにしてみた。

## 参考

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html

## 手順概要

1. プロファイルを作成する。
2. direnvでAWS_PROFILE環境変数をディレクトリごとに設定する

## 手順詳細

### 1. プロファイルを作成する

personalってプロファイルを作成する想定だと aws configureで下記の入力をする。
各値は、自分のものを入力する。

```shell
~ $ aws configure --profile personal
AWS Access Key ID [None]: XXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

### 2. direnvでAWS_PROFILE環境変数をディレクトリごとに設定する

各ディレクトリに .envrc ファイルを作成して、下記の内容を記載する。

```shell
export AWS_PROFILE=personal
```
ホテルやスタバ などの Guest WiFi に、Windows 10 から接続できなくなった時に試す手順

外でお仕事できるようになってきて、電源カフェを利用する機会も増えました。
ホテル、新幹線、飛行機、そして、カフェ側。あるいはお仕事での、相手先が用意してくれている Guest WiFi 。つながらない時がありますよね。
その Trouble Shooting Guide です。

逐次、増やしていきます:smiley:

# 現象#1 Proxy 認証用ブラウザーが自動起動しない

WiFi から SSID を選択。その後、ブラウザーが自動的に起動して、認証処理 (場合によってはボタンを押すだけ) をする必要がある場合です。
その際に:

- ブラウザーが起動しない
- ブラウザーを手動で起動させても、ブラウザー内が真っ白で、エラー的なメッセージが出ている。

## 対策

1. ブラウザー起動
2. **http**://microsoft.com へ移動
    - ポイントは http **s** ではない事です。
MVCとは？

###モデル
データとデータに関わるビジネルロジック（アプリケーション特有の処理）をオブジェクトとして実装したもの
###ビュー
ブラウザに表示する画面、HTMLなどのHTTPレスポンスの中身を組み立てる部分。
必要に応じてコントローラからモデルのオブジェクトを受け取り、画面表示に利用する
###コントローラ
ユーザが操作するブラウザなどのクライアントからの入力を受け、適切な出力を作成するための制御を行う部分。必要に応じてモデルを利用したり、ビューを呼び出したりして、レスポンスを作り上げます。
Rails MySQLでthis is incompatible with sql_mode=only_full_group_by

## Group Byしたらエラーになった

```rb:akb_controller.rb
class AkbController < ApplicationController
  def index
    @idol = Akb.group(:area)
  end
end
```

```
# 実行されたSQL
SELECT `akb`.* FROM `akbs` GROUP BY `akbs`.`area`

# コンソールに出力されたエラー
Mysql2::Error: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'akimoto.akb.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
```

## 原因はMySQL5.7からデフォルトになったONLY_FULL_GROUP_BY

`GROUP BY`で使うカラムは`SELECT`でちゃんと指定しましょうよ。ということらしい。
参考：[MySQL5.7にアップデートしたらonly_full_group_byでエラーになった
](https://www.p-nt.com/s/technicblog/archives/204)

## ということで修正。

```rb:hoge.rb
class AkbController < ApplicationController
  def index
    # .select(:area)を追加
    @idol = Akb.group(:area).select(:area) 
  end
end
```

なんだか冗長だ。
Ruby 行と列を入れ替えて配列の配列を作成する方法

paizaのスキルチェックで使った内容を投稿しました

```
array = [[1 ,2, 3], [4,5,6], [7,8,9]]
p array.transpose
>> [[1,4,7],[2,5,8],[3,6,9]]
```
変数展開

## 変数展開とは
変数の値を文字列の中に含める方法

"#{変数}"

####注意
シングルクオーテーションはそのまま文字列として出力される

変数の良いところ

・同じ要素を繰り返し使える
・変更に対応しやすい
・なんの要素かわかりやすい
配列から複数の要素を取り出す方法

paizaのスキルチェックに使った内容を投稿しました。

```
array.each_cons(引数)　{|arr| block }
```

引数で指定した数の要素を繰り返し取り出して、ブロックを実行

ブロック引数には取り出した要素が配列で入る
Laravel-Enum 導入２

## はじめに
- [Laravel-Enum 導入](https://qiita.com/MochiMochiChip/items/090b48d679e85b3ced54) の続き。
- 主に メソッド などの使い方を記述する

## 前提
### Enum ファイルの中身
```app/Enum/TestText.php
<?php

namespace App\Enums;

final class TestText extends Enum
{
    const TEST = "test";
    const TEXT = "text";
}
```
### 日本語ファイルの中身
```app/resources/lang/ja/enums.php
<?php
// php artisan で作成したクラス
use App\Enums\TestText;

return [

    TestText::class=> [
        TestText::TEST => 'テスト',
        TestText::TEXT => 'テキスト',
    ],
];
```

## 使ってみる
### インスタンスを生成して key/ value を取得

```php
// 全体の インスタンスを取得
$testText = TestText::getInstances();

// 以下のように値が取得できる
$testText[TestText::TEST]->key;   // TEST 
$testText[TestText::TEST]->value; // test
$testText[TestText::TEST]->description; // テスト
```

```php
// 指定したキーのインスタンスを取得する
TestText::TEST()->key;    // TEST
TestText::TEST()->value;  // test
TestText::TEST()->description // テスト
```

### key の一覧を取得する
```php
TestText::getKeys(); // return['TEST', 'TEXT'];
```

### value の一覧を取得する
```php
TestText::getValues(); // return['test', 'text'];
```
AWS  EC2インスタンスの複製をしてみた。その１（備忘録）

AWSを勉強しています。

EC2インスタンスのSnapshotをとり、バックアップの複製に挑戦しました。
その備忘録となります。

全7編です。
その１https://qiita.com/Bikeiken-IT/items/b0762a293e231898066f
その２https://qiita.com/Bikeiken-IT/items/5cf4bb3203ce27faf567
その３https://qiita.com/Bikeiken-IT/items/d8b1f731334c4f179447
その４https://qiita.com/Bikeiken-IT/items/5b6d1e3ab5573c081ba8
その５https://qiita.com/Bikeiken-IT/items/6c885d40fd92b1a6dee9
その６https://qiita.com/Bikeiken-IT/items/e1b80cc6cf2cbced5440
その７https://qiita.com/Bikeiken-IT/items/baac8bd1e4cfdfe3af51

まず、AWSのマネージメントコンソールを開き、AWSサービスからEC2を選択。
![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/a9417fdc-6fc4-bf12-23ca-d4ee92036c3b.png)
これからベースとなるEC2インスタンスを作成します。
〇で囲まれた”インスタンスの作成”のボタンを押して、インスタンスの作成を開始します。
![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/1251d373-9a43-f96b-d588-ba115e3b2e5e.png)
インスタンスの作成を開始すると、初めにインスタンスの基礎となるOSのマシンイメージを選択します。
今回は無料枠のLinuxのAMI(Amazon Machine Image)を選択します。
![step3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/e95d5be4-86b6-4394-a8b5-1f8186e94c6f.png)
インスタンスタイプの選択では、先ほど選択したAMIの中身の詳細仕様を設定します。
CPUやストレージなど、あらかじめ決められた仕様のインスタンスタイプから選択します。
今回はt2.microを選択します。
![step4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/d4db8f55-4556-ab42-f103-5b56c29bbf07.png)
インスタンスの詳細設定では、インスタンスの周りの詳細設定となります。
ここではIAM(Identity and Access Management)のようなインスタンスに対するアクセス制限や、EC2インスタンスが置かれるVPCおよびVPC内のサブネットの設定など、様々な設定が出来ます。
今回はデフォルトのままにしておきます。

その２に続きます。https://qiita.com/Bikeiken-IT/items/5cf4bb3203ce27faf567