OmniAICreator/Qiita-1.07M huggingface dataset:
Cloud Composer(Airflow version1.10.2)で BigQueryをいじるシンプルなDAGサンプル

# サンプル

tableA のクエリ結果を tableB に入れるサンプル

```py:sample.py
import airflow
from datetime import datetime, timedelta, timezone
from airflow import DAG
from airflow.contrib.operators.bigquery_operator import BigQueryOperator

jst = timezone(timedelta(hours=+9))

default_args = {
    "owner": "airflow",
    "depends_on_past": False,
    "start_date": airflow.utils.dates.days_ago(1),
    "email": ["hoge@example.com"],
    "email_on_failure": True,
    "email_on_retry": False,
    "retries": 3,
    "retry_delay": timedelta(minutes=5)
}

dag = DAG("bq_sample_dag", default_args=default_args, catchup=False, schedule_interval=timedelta(1))

BigQueryOperator(
    task_id="bq_sample_task",
    sql="SELECT column1, column2 FROM pj_name.dataset_name.original_table_name",
    use_legacy_sql=False,
    destination_dataset_table="pj_name.dataset_name.new_table_name",
    write_disposition="WRITE_TRUNCATE",
    allow_large_results=True,
    dag=dag
)
```

Cloud ComposerでBigQuery使う場合は、`airflow.contrib.operators.bigquery_operator` のオペレーターを使います。
クエリ実行などのシンプルな処理の場合は、 `BigQueryOperator` クラスを使います。
parameterなどはAirflow1.10.2であれば [このdoc](https://airflow.apache.org/docs/1.10.2/integration.html?highlight=bigquery#airflow.contrib.operators.bigquery_operator.BigQueryOperator) を参照。

[※注意] 現在のCloud ComposerのイメージのAirflow versionは1.10.3までなので、 [`airflow.gcp.operators`](https://airflow.readthedocs.io/en/latest/_api/airflow/gcp/operators/index.html) などはデフォルトでは使えません。
CloudFunctionsでfirebase-adminを用いているのにpermission_deniedが表示される

Typescriptでcloudfuntionsのコードを書いている時、firebase-adminを用いているのにも関わらず**PERMISSION_DENIED**が表示される。

### index.tsの中身
```typescript
import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
admin.initializeApp(functions.config().firebase);
```

### 実行したコード
`firebase emulators:start`

### エラー
```shell
Error: 7 PERMISSION_DENIED: Missing or insufficient permissions. at callErrorFromStatus
```

### 解決方法
1. サービスアカウントのキーを作成する
2. そのキーを環境変数に設定する  
`export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"`

## 参考
[ローカルでの関数の実行](https://firebase.google.com/docs/functions/local-emulator?hl=ja)
Angularヒーローチュートリアル4

# さらに細かくコンポーネントに分割

## 詳細のコンポーネント
詳細部分を他のコンポーネントに分けることで開発しやすくします。

```terminal:ターミナル
$ cd src/app
$ ng generate component hero-detail
```
## htmlを変更

まず、最初に作ったheroesコンポーネントのHTMLを以下のように変更します。

```html:heroes.component.html
<h2>My Heroes</h2>
<ul class="heroes">
  <li *ngFor="let hero of heroes" [class.selected]="hero === selectedHero" (click)="onSelect(hero)">
    <span class="badge">{{hero.id}}</span> {{hero.name}}
  </li>
</ul>

<app-hero-detail [hero]='selectedHero'></app-hero-detail>
```
詳細部分の記述を消し、代わりにコンポーネントタグを書きます。
`[hero]='selectedHero'`と書くと、hero-detailコンポーネントにheroというプロパティを値つきで渡すことができます。
しかし、hero-detailコンポーネントで使用するにはtsファイルで処理をする必要があります。

## tsでプロパティを受け取る準備

```ts:hero-detail.component.ts
import { Component, OnInit, Input } from '@angular/core';
//Inputを追加でimport(@Input()を使うため)
import {Hero} from '../hero';

@Component({
  selector: 'app-hero-detail',
  templateUrl: './hero-detail.component.html',
  styleUrls: ['./hero-detail.component.css']
})
export class HeroDetailComponent implements OnInit {

  @Input() hero : Hero;//ここでプロパティを宣言している

  constructor() { }

  ngOnInit() {
  }

}

```
`@Input`をimport使用することで、プロパティを受け取り同じコンポーネントのhtmlで使用することができるようになります。

```html:hero-details.component.html
<div *ngIf="hero">

    <h2>{{hero.name | uppercase}} Details</h2>
    <div><span>id: </span>{{hero.id}}</div>
    <div>
      <label>name:
        <input [(ngModel)]="hero.name" placeholder="name"/>
      </label>
    </div>
  
</div>
```
<img width="430" alt="スクリーンショット 2020-02-04 18.17.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519379/67b74a0c-cb49-cbbe-16d0-9e02ad5e5882.png">

分割する前と同じようになったら、うまくコンポーネントに分割できています。
PlatformIOでMbedに書き込み出来なかった時の対処

<img width="738" alt="PIO.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/beb80e7e-06d4-8e81-2f5f-fe2a59c0d187.png">

# はじめに
自分用メモです．
VSCode上でPlatformIOを用いてマイコン開発をしようとしています．
ですが，マイコンへの書き込みがうまくいかなかったので対処を知見のために書き残しておきます．

# 状況
- VSCode上で動作する**PlatformIO**を使って開発．
- コンパイルは通った．
- 書き込みができない．
- `libusb_open() failed`と出て失敗している．

# 環境
- PlatformIO: `Core 4.1.0`
- マイコン: `Mbed(nucleo_f303k8)`
- OS: `Windows10`

# 対策
コンパイルは通っていたので，USB周りに問題があるのかなーとアタリを付けました．
なのでドライバを入れてみたら解決したので，手順を残しておきます．

# 手順
`Zadig`を使ってUSBドライバーを導入します．
まずは[https://zadig.akeo.ie/](https://zadig.akeo.ie/)からソフトをダウンロードします．
起動すると以下のような画面になります(僕のキャプチャはもろもろの操作をした後に撮ったものなので少し違う部分があると思います)．
<img width="431" alt="Zadig.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/93e56bae-4944-08d9-a4d5-86ec0d7e7cfe.png">
Zadigでは`ST-Link Debug`を選択した状態で`Install Driver`を押します．

これで終了です．
nvidia, cuda, cudnn 現状確認してから全部消す！！！！

# GPU環境がぐちゃぐちゃ、全部消す！

なんか色々変なのを入れてしまった！
全部消してリセットするんだ！そんな人向け

## この記事ですること
ubuntuマシンが対象です。

* 今何入っているのか確認
* 全部消す！！！

## 今何入っているのか確認
```bash
#nvidiaと名前のついた物リスト
dpkg -l |grep nvidia*
#nvidia-driverのバージョン確認
nvidia-smi

#cudaと名前のついたものリスト
dpkg -l |grep cuda*

#cudaのバージョン確認
nvcc -V

#cudaと名前のついたものリスト
dpkg -l |grep cudnn*
```
## 全部消す

ここから虐殺パーティーになります。
全部消していきます

```bash
#nvidiaと名前のついたものを消す
#driver, docker等消えるので注意
sudo apt-get --purge remove nvidia-*


#cuda消す
sudo apt-get --purge remove cuda-*

#cuda系のゴミを消す
sudo apt purge cuda*
sudo apt purge nvidia-cuda-*
sudo apt purge libcuda*
sudo rm -rf /usr/local/cuda*

#bashrcに書いた下の内容も消す
sudo gedit ~/.bashrc
#export PATH=/usr/local/cuda-x.x/bin:${PATH}
#export LD_LIBRARY_PATH=/usr/local/cuda-x.x/lib64:${LD_LIBRARY_PATH}

sudo apt-get --purge remove cudnn-*

#cudnn消す
sudo apt-get --purge remove cudnn*

sudo rm -r /usr/local/cuda-xxx/lib64/libcudnn*
#一例:sudo rm -r /usr/local/cuda-7.5/lib64/libcudnn*

```

## 全部消したら

好きな環境を入れましょう。
むしゃくしゃが止まらないなら、一回寝て心機一転、環境構築しましょう。
Amazon Transcribeでmedia formatが一致しないと言われる

AWSの文字起こしサービスであるTranscribeが日本語対応したので使い始めたが、下記のような「media formatが指定したのと違うよー」と言われて困った。

```
Failure reason
The media format that you specified doesn't match the detected media format. Check the media format and try your request again.
```

拡張子を変えたり、ffmpegでメディア情報を確認したりした結果、どうやらAmazon Transcribeでジョブをコピーすると、前に指定したメディアのメディア情報が引き継がれるらしいことが判明。

私の場合では、下図のように「Input file format」がwavを入れても「mp4」から変わらずでした。

<img width="1022" alt="スクリーンショット 2020-02-03 14.25.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118515/827ecc56-e7f3-eb29-972d-6a696f370929.png">

解決策は単純でコピーせずに別のジョブとして作り直せばOKでした。
Docker for windows環境にてPowershellでCtrl+zが使用できない問題の解決法（仮）

Docker for windows環境にてPowershellを使ってDocker上のLinuxをCUI操作している場合、Ctrl+zでLinuxにシグナルを送ろうとしても上手く動作しない。
Ctrl+zがPowershellの操作に割り当てられている様子。Linuxを抜けてPowershellの操作に戻ってしまう。
簡単な解決法として、Powershellで「レガシーコンソール」を使用することで解決した。


##プロパティから「レガシーコンソール」を選択するだけ
PowerShellのバー上で右クリック　→　プロパティを選択
![クリップボード一時ファイル01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374646/3c8398fe-85f8-c4ae-463c-e4aa3333207b.png)

「レガシーコンソールを使用する」にチェックを入れる
![クリップボード一時ファイル02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374646/9e33ea6a-6bfd-7d9d-31fe-6a0ef6c9c35f.png)

これ以外のもっとエレガントな解決方法がきっとあるはずである。

参考：Windows PowerShell, Control-Z, and Kitematic 
https://alankent.me/2017/07/04/windows-powershell-control-z-and-kitemati/
[Flutter]数字を三桁ごとにカンマ区切りで表示する

## はじめに
金額の単位を表示したい時などに使うやつです。

今回はNumberFormatを利用しました
[NumberFormat class - intl library - Dart API](https://api.flutter.dev/flutter/intl/NumberFormat-class.html)

### import
```
import 'package:intl/intl.dart';
```

### 3桁ごとにカンマ区切り
``` dart
final formatter = NumberFormat("#,###.0");
var result = formatter.format(50101214);
print(result); // 50,101,214
```

### 3桁区切り小数点1桁まで
金額の単位を表示したい時など

``` dart
final formatter = NumberFormat("#,###.0");
var value = (50101214 / 10000);
var result = formatter.format(value);
print(result+'万円'); //5,010.1万円
```

### 3桁区切り小数点2桁まで
``` dart
final formatter = NumberFormat("#,###.0#");
var value = (50101214 / 10000);
var result = formatter.format(value);
print(result+'万円'); //5,010.12万円
```

他にも書き方等ある場合はコメントいただけると助かります。

### 2020/02/10追記 Stringにも対応
こちらの記事を参考にさせていただきました。
https://stackoverflow.com/questions/31931257/dart-how-to-add-commas-to-a-string-number

``` dart
Function mathFunc = (Match match) => '${match[1]},';
RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))');
String result = '20000円'.replaceAllMapped(reg, mathFunc);
print('$result');//20,000円
```
Terraform で特定のキュー（AmazonSQS）にしかアクセスできないポリシーを作成する

特定のキュー（AmazonSQS）にしかアクセスできないポリシーを Terraform で作成したメモです。

```
$ aws sqs get-queue-url --queue-name accessible-queue
{
    "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/${AccountID}/accessible-queue"
}
$ aws sqs get-queue-url --queue-name inaccessible-queue
An error occurred (AWS.SimpleQueueService.NonExistentQueue) when calling the GetQueueUrl operation: The specified queue does not exist or you do not have access to it.
```

```tf:main.tf
########################
## AWS Provider
########################
provider "aws" {
  access_key = local.access_key
  secret_key = local.secret_key
  region     = "ap-northeast-1"
}

##############################################
# SQS
##############################################
resource "aws_sqs_queue" "accessible_queue" {
  name = "accessible-queue"
}

resource "aws_sqs_queue" "inaccessible_queue" {
  name = "inaccessible-queue"
}

##############################################
# IAM User
##############################################
resource "aws_iam_user" "user" {
  name = "user"
}

##############################################
# IAM Policy
##############################################
resource "aws_iam_policy" "policy" {
  name   = "sqs-policy"
  policy = data.aws_iam_policy_document.policy_document.json
}

data "aws_iam_policy_document" "policy_document" {
  statement {
    sid = "Sid"

    actions = [
      "sqs:*",
    ]

    resources = [
      "${aws_sqs_queue.accessible_queue.arn}",
    ]
  }
}

resource "aws_iam_user_policy_attachment" "policy_attachment" {
  user       = aws_iam_user.user.name
  policy_arn = aws_iam_policy.policy.arn
}
```
blenderからアニメーションが全てエクスポートされない

blender2.81aを使用していまして、そこでアニメーションを複数作り
エクスポートしてUnityで使おうとしてたら
何度やっても一つのオブジェクトに6パターン以上のアニメーションをエクスポート
できませんでした。

いろいろやってみたところ
エクスポートする画面でトランスフォーム適用にチェックを入れたところ
うまく行きました。

解決しましたが
これをチェックしないでもいくつかのアクションがエクスポートできたのは
何故なのでしょうか？
わかる方がいれば教えていただければと思います。
とりあえずは、解決しましたが、、、、
![blenderExport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560721/d8e9aea2-41ee-c236-5dfd-dddb496e96ff.png)
【Rails】Action Mailerのメール送信に失敗する

#症状
Action Mailerを利用したメール送信処理で、以下のエラーを吐いてしまう。
なお以前は正常に送信することができていた。

`Net::SMTPAuthenticationError (530 Authentication required):`

`ArgumentError (SMTP To address may not be blank: []):`

#原因
環境変数を正常に読み込めていなかった。
SMTP認証情報やお問い合わせ宛先メールアドレスを環境変数に入れていたため、それらの情報を利用することができず、送信に失敗した。


#根本原因
Circle CIからSSHでデプロイ先のサーバに接続し、シェルスクリプトを実行していた。
この場合は環境変数が読み込まれない。

【参考】[[FreeBSD][Linux] ssh経由でコマンド実行すると環境変数を読まないでござる](http://april.fool.jp/blogs/2013/07/25/freebsdlinux-ssh%E7%B5%8C%E7%94%B1%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%AA%AD%E3%81%BE%E3%81%AA/)

#対処
Circle CIの設定を変更し、.bash_profileを読み込むように変更。

```sh:
- run:
  name: Start SSH & Deploy
  command: ssh foo@bar "source ~/.bash_profile; bash ~/deploy.sh"
```
proxy下でのnpmの設定

Angularwをインストールする際にエラー：407が出て困った話。
### 設定されている値を確認
```bash
$npm config ls
```

### proxy周りの値をset
```bash
npm -g config set proxy http://プロキシサーバアドレス:ポート
npm -g config set https-proxy http://プロキシサーバアドレス:ポート
npm -g config set registry http://registry.npmjs.org/
```

このとき、proxyサーバにIDとパスワードが設定されている場合は以下のようにsetする。ここで詰まった。

```bash
npm -g config set proxy http://ID:パスワード@プロキシサーバアドレス:ポート
npm -g config set https-proxy http://ID:パスワード@プロキシサーバアドレス:ポート
npm -g config set registry http://registry.npmjs.org/
```

### 参考
[プロキシサーバーを使う際に役立つ！npm proxyの使い方【初心者向け】](https://techacademy.jp/magazine/16379)
【swift】まず簡単なリファクタリングをしよう【初心者向け】

#なぜ簡単なリファクタリングをするのか🤔

1.簡単なリファクタリングだけでも、コードの可読性が激増する。
2.難しい文法でリファクタリングをしようとすると、挫折する。
3.すぐ終わる。

#大事なこと😇

###たまにリファクタリングをしたほうがいい。

リファクタリングで

- 開発のしやすさ。
- 説明のしやすさ。
- コード修正のしやすさ。

を手に入れましょう✨

>- 説明のしやすさ。

これは、特に大事です。
誰かにアドバイスをもらうためコードを添付する際、
自分ですら読めないコードを誰が読めるのでしょう。

#リファクタリングしないと？🤔

初心者の方は初めてのアプリ（ポートフォリオなど）を作成する際、
『文法とかコードの可読性とかどうでもいいからとりあえず完成させたい！』という気持ちがあると思います。

しかし、コードが増えれば増えるほど

- 以前書いたコードが理解できない
- 変数名、メソッド名がパッと見わからない

などの問題が発生します。

#簡単なリファクタリング集
###わかりやすい命名をする
- [codic](https://codic.jp/)を使って命名する。
- 命名規則を学んでみる→
[参考](https://qiita.com/aomathwift/items/addd2dd5fa9e714b78ea)

###三項演算子を使う
```swift
let hoge = true

if hoge {
    print("true")
} else {
    print("false")
}
// ↓三項演算子を使った表現。
hoge ? print("true") : print("false")
```

###使用しないコードは削除する
コメントアウトして、放置しているコードはありがちですよね。
思い切って削除しましょう。

###コメントは分かりやすく
パッと見で理解できるコメントを残しましょう。
[参考](https://qiita.com/y-some/items/8bc06567eee18dfeafbb#%E7%89%B9%E6%AE%8A%E3%82%BF%E3%82%B0)

###`self`は省略可能
省略できる箇所は、するべきでしょう。
[参考](https://qiita.com/taketomato/items/d5630fe5df45f4093720#31-%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AF-self-%E3%82%92%E7%9C%81%E7%95%A5%E3%81%99%E3%82%8B)


#参考文献

- https://qiita.com/aomathwift/items/addd2dd5fa9e714b78ea
- https://codic.jp/
- https://qiita.com/y-some/items/8bc06567eee18dfeafbb#%E7%89%B9%E6%AE%8A%E3%82%BF%E3%82%B0
- https://qiita.com/taketomato/items/d5630fe5df45f4093720#31-%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AF-self-%E3%82%92%E7%9C%81%E7%95%A5%E3%81%99%E3%82%8B
Google Coral 2020年1月の更新

> Edge TPUランタイムがMacおよびWindowsで利用可能になりました

本日、Edge TPUランタイムおよびコンパイラのさまざまなバグ修正を含むアップデートをリリースします。 しかし、大きなニュースは、Edge TPUランタイムとPythonライブラリがMacとWindowsで利用可能になったことです！

つまり、Debian Linux、macOS、またはWindows 10を実行しているコンピューターに接続したときに、Coral USB Acceleratorを使用できるようになりました。


USBアクセラレータでMacまたはWindowsを使用する場合は、更新されたガイドに従ってUSBアクセラレータを使い始めてください。

既存のLinuxコンピューターまたは開発ボードを最新のツールで更新する場合は、次のようにDebianパッケージを更新するだけです:

```
sudo apt-get update

sudo apt-get install edgetpu python3-edgetpu
```
TensorFlow Lite APIを使用している場合は、TensorFlow Lite Pythonクイックスタートに従って、`tflite_runtime`モジュールも更新する必要があります。 たとえば、Coral Dev BoardでTensorFlow Liteを更新する方法は次のとおりです:

```
pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0-cp37-cp37m-linux_aarch64.whl
```

#### このリリースの更新
- Edge TPUランタイムは`v13`になりました
- Edge TPUコンパイラは`2.0.291256449`になりました
- Edge TPU Pythonライブラリ（edgetpuモジュール）は`2.13.0`
- TensorFlow Liteランタイム（`tflite_runtime`モジュール）は現在、`TF 2.1`に基づいています

Edge TPUランタイムを更新する場合、推論の実行に使用するAPIに応じて、edgetpuまたはtflite_runtimeモジュールのいずれかを更新する必要があります。


Google Coral Edge TPU 海外代理店Gravitylink!
https://store.gravitylink.com/global
Cloud Composer から実行する Cloud Dataflow のリージョンが他のものを指定しても us-east1 になってしまう問題

## 問題

2020-01 時点で発生。

Cloud Composer から実行する Cloud Dataflow はその実行リージョンを指定することができるのだが、
https://airflow.apache.org/docs/stable/_modules/airflow/contrib/operators/dataflow_operator.html

```python:example.py
default_args = {
    'owner': 'example',
    'start_date': datetime(2020, 1, 1),
    'dataflow_default_options': {
        'project': 'example-project-id',
        'region': 'asia-northeast1'
    }
}

with DAG(
    'example_dag',
    default_args=default_args,
    schedule_interval=None
)as dag:

    taskImport = DataflowTemplateOperator(
        task_id='dataflow',
        template='gs://example-templates/templates/hoge',
        dag=dag
    )
```

実際に実行すると、ここで指定したリージョンではなく `us-east1` になってしまう。

## 解決法

Airflow のバグなのでバージョンを上げる必要あり。
https://issues.apache.org/jira/browse/AIRFLOW-2715

2019-05-16 に GCP 上でバックポート修正版がリリースされている。
GCP 版 Airflow のバージョンが 1.10.2 以降で対応。
https://cloud.google.com/composer/docs/release-notes#May_16_2019

2020-01 現在、Terraform でバージョン指定なしで Cloud Composer 環境を作成したときには GCP 版 Airflow のバージョンが 1.10.2 より低いものになっているので注意。

```hcl:example.tf
resource "google_composer_environment" "example" {
  name    = "example-composer"
  config {
    software_config {
      image_version  = "composer-latest-airflow-1.10"
    }
}
```
AWSのRDSからdumpをとる方法

## やりたいこと
ローカルのデータベースを本番のもので置き換えて動作検証がしたい。
そのためにRDSで作成している本番DBからdumpをとりたい！

## やりかた
本番DBとローカルでsshトンネルを開通させる→dumpをとるコマンドを実行。

### ポートフォワーディング(トンネル開通)とは？
https://www.clear-code.com/blog/2014/9/12.html
今回はローカルのポートから踏み台サーバーを経由してDBに接続する。

## 実行コマンド
### ポートフォワーディング
必要な情報の取得方法は後述します。

```
ssh -N (実行ユーザーのuser name)@踏み台のIPアドレス -L ローカルのポート番号:DBのエンドポイント:DBのポート番号
```
必要によって以下のオプションを指定
`-i: 秘密鍵の指定`
`-f: バックグラウンドで実行`

#### DBのエンドポイント・ポート番号
<img width="1381" alt="Screen Shot 2020-02-04 at 17.01.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356480/0aaf12d4-cd5c-2166-4c5c-7023b94e761e.png">

RDS→Databases→該当DBの `Endpoint name` と `Port` をコピペ

#### 踏み台のIPアドレス
EC2→Instances→該当インスタンスをチェックしたときに下に出てくる

<img width="1267" alt="Screen Shot 2020-02-04 at 17.11.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356480/6ad25ab9-7dff-d2e4-1b13-3bf77b294996.png">

このタブ内にある `IPv4 Public IP` をコピペ

#### ローカルのポート番号
現在使っていない番号だったら何でもOK。例えば今回は既に `3316` を使っていたので `3317` にした。

### dumpをとるコマンド
これでコンソールからコマンドを打ってdumpが取れる状態になったので、以下でdumpをとる。

```
mysqldump -u <ユーザー名> -p -h 127.0.0.1 -P 3317 <DB名> > 20200204.dump
```
パスワードを求められるので入力。このユーザー名とパスワードはRDSのDBのもの。
mysqlの場合は `localhost` ではなく `127.0.0.1` とする必要があります。
これでdumpが取れました！🎉

## 補足
`mysqldump: Couldn't execute 'SELECT COLUMN_NAME,`
こんな感じで怒られる場合は、dumpのコマンドに `--skip-column-statistics` オプションを追加して以下のようにして下さい。

```
mysqldump --skip-column-statistics -u <ユーザー名> -p -h 127.0.0.1 -P 3317 <DB名> > 20200204.dump
```
Aws::Sigv4::Errors::MissingCredentialsError 本番環境へのアップロード

初めての投稿で緊張しておりますが、ようやくエラー解除できたので、共有します！:raised_hand:

rails5.2で作成したアプリケーションをHerokuへアップロードする際に出たエラーです。
エラーの主な原因としてAWSのS3機能とRails5.2以上から登場したCredentialの機能をHerokuに上手く設定できなかったことが原因みたい。:cry:

(具体的な内容)
Herokuにアップロードし、heroku openをすると
![84308945cc9dcd981c2d383e42478eb7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/f1b4a0f2-e21d-3b72-1844-5f9e6bb8678f.png)
こちらのエラーが出てきてなかなか開けません。

ですので、heroku run rails cでエラーの内容を確認すると、以下のエラー内容が表示されます。(Aws::Sigv4::Errors::MissingCredentialsError)
![スクリーンショット (311).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/c8a13e88-2b8a-c96d-de3f-3d1ac4a46e1a.png)


```terminal.
missing credentials, provide credentials with one of the following options:
  - :access_key_id and :secret_access_key
  - :credentials
  - :credentials_provider
```
- access_key_id and secret_access_key
- credentials
- credentials_provider
のうちいずれかが上手く設定できていないみたい。

```
$ rails c
irb(main):001:0> Rails.application.credentials.secret_key_base
=>nil
```

ここが設定できていないのが原因のようだ
ここで同じような原因で悩む記事を発見しました！
rails エラー
[(Aws::Sigv4::Errors::MissingCredentialsError)がわかりません。](https://teratail.com/questions/199552)
こちらの方はHerokuのssettingからConfig Varsに
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
・AWS_DEFAULT_REGION
を設定したところ解決できたようです。

エラーが起こっているherokuに上げているアプリケーションのSetting(鍵マーク)→Config Varsを選択します。
![スクリーンショット (312).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/c762122f-e452-a76b-1db7-a39401f03984.png)

こちらを参考に、
Config Varsのより
KEYにそれぞれ
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
・AWS_DEFAULT_REGIONを設定し、VALUEにIAMから作成したシークレットキーとシークレットアクセスキー、リージョン(たぶん東京の人が多いはず)を入力していきます。
その後、

```
$ heroku run rails c 
Running rails c on ⬢ herokuapplication2020... up, run.3100 (Free)
Loading production environment (Rails 5.2.4.1)
irb(main):001:0> 
```
エラーが出ない！嬉しい限りです。:relaxed:
そして、、、

```
$ heroku open
 ▸    Error opening web browser.
 ▸    Error: Exited with code 3
 ▸    
 ▸    Manually visit https://herokuapplication.herokuapp.com/ in your
 ▸    browser.
```
Herokuにアクセスできるようになった！
以上より解決👏👏👏


Herokuに上げた後に直接環境変数を記述するのは初めてだったので、戸惑いましたが、なんとか完了！ターミナルからも本来はできると思うので、ここらへんの知識をもっと勉強しなくてはなりません。💦
vimで全選択をCtrl+aでする！

# はじめに
vimでは様々な便利なコマンドが用意されていてるが全選択するには一部例外を覗いて４回キーボードを叩く必要がある(`ggVG`）
さらにこれはノーマルモードに限定した話で、他のモードの場合は１回多くなる。
そこで我々が使い慣れたキーバインドを考えた。

# 方法

```vim:.vimrc
" すべて選択
inoremap <C-a> <NOP>
inoremap <C-a> <ESC>ggVG
nnoremap <C-a> ggVG
vnoremap <C-a> ggVG

```

これで３つのモードで`ctrl+a`で全選択ができるようになる。

# おまけ

#### すべてコピー

```vim:.vimrc
" すべてコピー
nnoremap <C-c> <Nop>
inoremap <C-c> 
nnoremap <C-c> ggVGy
vnoremap <C-c> ggVGy
```

#### すべて削除

```vim.vimrc
" すべてを削除
inoremap <C-x> <ESC>:%d<CR>
nnoremap <C-x> :%d<CR>
vnoremap <C-x> <ESC>:%d<CR>
```


# まとめ

```vim:.vimrc

" すべてを選択
inoremap <C-a> <Nop>
inoremap <C-a> <ESC>ggVG
nnoremap <C-a> ggVG
vnoremap <C-a> ggVG
" すべてコピー
nnoremap <C-c> <Nop>
inoremap <C-c> <ESC>ggVGy
nnoremap <C-c> ggVGy
vnoremap <C-c> ggVGy
" すべてを削除
inoremap <C-x> <ESC>:%d<CR>
nnoremap <C-x> :%d<CR>
vnoremap <C-x> <ESC>:%d<CR>

```
【Nuxt.js】dayjs応用編：カウントダウンをしてみよう！

# 前置き

基礎編に続き応用編です。
2つの日時の差分を出していきます🕰
**基礎編はこちら
【Nuxt.js】dayjs導入編：リアルタイムな日時を表示してみよう**
https://qiita.com/aLiz/items/8de5727e274f1a9a1efe




# 復習

・dayjs() =パース
・format() =表示形式の指定

```index.vue
<p v-text="$dayjs().format('dddd、MMMM D、YYYY h：mm A')" />
```

表示結果

```index.vue
Tuesday、February 4、2020 1：33 PM
```

dddd MMMM D ……長い！😒笑
省略したい場合はLLLLで同じ表記に。
この辺りも基礎編で解説済みです。
https://github.com/iamkun/dayjs/blob/dev/docs/en/I18n.md

・locale('ja')を指定で日本語表記

```index.vue
<p v-text="$dayjs().locale('ja').format('dddd、MMMM D、YYYY h：mm A')" />
```

表示結果

```index.vue
2020年2月4日 火曜日 13:33
```

❓ではこれは
※グローバルでlocale('ja')指定済み

```index.vue
<p v-text="$dayjs('February 4, 2020').add(1, 'year').format('YYYY')" />
```

表示結果

```index.vue
2021
```

ですね💡
dayjsで2020年2月4日をパース(解析)
そこに1年追加し2021年2月4日とし
表示形式を年数字のみにしているためですね🧸

# カウントダウン

では基礎編を踏まえて
2つの日時の差分を出しましょう！
あと何ヶ月、とかあと何日！
差分はditt()を使用します。

```index.vue
<p v-text="$dayjs('2020-02-04').diff('2020-01-01')" />
```

結果はミリ秒で表示

```index.vue
2937600000
```

ミリ秒で見てもパッとしないので
月の差分を見てみましょう〜🌟🌝

```index.vue
<p v-text="$dayjs('2020-02-04').diff('2020-01-01', 'month') + '月'" />
```

結果は1ヶ月ですね。
diffの第二引数がformatのような役割です。

```index.vue
1月
```

日付

```index.vue
<p v-text="$dayjs('2020-02-04').diff('2020-02-01', 'day') + '日'" />
```

結果

```index.vue
3日
```

時間

```index.vue
<p v-text="$dayjs('2020-02-04T12:30:00').diff('2020-02-04T10:30:00', 'h') + '時間'" />
```


結果

```index.vue
2時間
```

基礎が分かれば簡単ですね🤗

**記事が公開したときにわかる様に、
note・Twitterフォローをお願いします😀**
https://twitter.com/aLizlab
【IBM Cloud】ダッシュボードまたはIBM Cloud CLIから自分のアカウント種類を確認する方法

皆さん、こんにちは。戸倉彩です。

今回は、IBM Cloudの登録後に自分が何のプランでサービスを利用しているのか確認したい場合の、IBM Coudダッシュボードの操作方法について紹介いたします。アカウントタイプによって利用できるサービスが異なるため、操作する際にアカウント内容を理解しておくと良いでしょう。
更新日:2020年12月22日

## IBM Cloudダッシュボードから確認する方法
1. Webブラウザから**[IBM Cloud ダッシュボード](https://cloud.ibm.com/login)**へアクセスし、ログインする。
<img src="https://by3302files.storage.live.com/y4mDsKxQm2FS52L31qV5pSfhEqb50JUVCUCSJ4syBpX0M6AmDxzqXpixACrHbU_Ars_sjwGPSScCXhaWfdGGL5XTHtIr3GkuymF0hXV6wvYwWnLzg3mbppZZXyic1phw2zFsC9rmfuVV34ULyeaPFQXFHNRsgwcMjgmZrZ3CtrRdnPmXB4v7CtKlmMqDbwn83WG?width=1539&height=906&cropmode=none" width="600">
2. IBM Cloudダッシュボード画面の右上メニューの**[管理]**→**[アカウント]**の順にクリックする。
<img src="https://by3302files.storage.live.com/y4mow_q2JoDKhzlC9lIFCFvpQXjlDVVsdZW3UjNj1tKSFojP1f9QyvWYnuAtNFjMykVu56NdgPxBPBgbcKcNuKz3sMKzAdsZkgwoc_AvWTEAIuEiCcK2Ai4nXTaSu3GLS0gKVWgWx_9aVfdC8BOHFTgnwVleo4OFGUZmSD6RQhYUHrpF4u9U3Fc0AG8LF_72Bsx?width=1774&height=797&cropmode=none" width="600">
3. **[アカウント]**サイトに画面が切り替わったら、左メニュー**[アカウント設定]**メニューをクリックする。
4. **[アカウント設定]サイト**の中の**[アカウント・タイプ]**を確認する。
<img src="https://by3302files.storage.live.com/y4maClfaH_ZhzpnWsg_VbGJ9-6dDgLmFD8CK8wcKLCiXlDAKMUGd5QispSgMfsVZTlPbiWFuJmR7vANNsLCJe1H4Dt9OO5q1YO7_6EVVObzbowqHANzqF3GgqFh23NNAHe3fsjYE1T-REHPbfqbwUYfnDQXJzBWicIxS9T63ADCxAuLJnzMMPvspdUIMyqhqj-V?width=1652&height=979&cropmode=none" width="600">  

**[表示されるアカウント・タイプの例]**
 - **ライトアカウントの場合**: ライト(無料)
 - **従量課金アカウントの場合**: 従量課金

## IBM Cloud CLIから確認する方法
1. ターミナルから次のIBM Cloudコマンドを使ってログインを行う。

```
$ ibmcloud login
```
2.ログイン後、IBM Cloudアカウント情報を取得する。 ※下記のコマンド実行後の取得内容はサンプルです。

```
$ ibmcloud account show
ayatokura@xxxx のアカウント Aya Tokura's Account を取得しています...
OK
                                            
アカウント名:                       Aya Tokura's Account   
アカウント ID:                      xxxxxxxxxx   
アカウント所有者:                    ayatokura@xxxx   
アカウント・タイプ:                    PAYG   
アカウント状況:                      ACTIVE   
リンクされている SoftLayer アカウント:   xxxxx   
VRF が有効:                       false   
サービス・エンドポイントが有効:           false   
EU サポートあり                      false   
PoC (商用 PoC (概念検証))          false   
HIPAA サポートあり                   false   

```
3.**[アカウント・タイプ]** の表示内容を確認する。

**[表示されるアカウント・タイプの例]**
 - **ライトアカウントの場合**: STANDARD
 - **従量課金アカウントの場合**: PAYG

## 参考
・IBM Cloud アカウント・タイプに関して詳しく知りたい方は、[こちら](https://cloud.ibm.com/docs/account)のIBM Cloud公式サイトをご確認ください。
・アカウント登録方法について学びたい方は、過去に公開した[「IBM Cloudをはじめました」無料ではじめられるライト・アカウント登録方法](https://qiita.com/ayatokura/items/42d4bc728112c733c80d) 記事も合わせて参考にしていただければと思います。

以上です。

Have a nice Geek Life♪
※Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)
RailsのActionCableを使ってリアルタイムチャット機能を試してみた。

RailsのActionCableの機能を使って、リアルタイムチャットを作ってみた。

しかし、ActionCableの全容をつかむことが出来ず、わかる範囲での記述となります。
間違ったことを書いてある場合は、コメント欄で指摘していただきますと大変助かります。



・目的
HTTP通信では、クライアントがホストに対してリクエストを申請して、初めてデータを取得することができる。
しかし、それでは複数のクライアントがホストにアクセスするような場合に、随時ホストにリクエストしなければデータが取得できない。そのため、ホストとクライアントが相互に監視し、データの変化に即座に反応するウェブページを作る。

・実践
まず、事前準備としてRailsプロジェクトを生成します。
続いて、以下のコマンドでchannelを生成します。channel名はsend_msgです。

```terminal
rails g channel send_msg
```

次に、ActionCable.serverをmountするための記述です。

```routes.rb
mount ActionCable.server => "/cable"
```

chat_channel.rbでは、クライアント側のデータをホストに引き渡すための記述となります。
＊ざっくり過ぎる表現
subscribedメソッド内でホストにストリームするための値として"room"を定め、send_msgメソッドのActionCable.server.broadcastの後ろにも共通の値が記述されています。

これは、クライアントとホスト間の通信について、あらかじめコネクションのためのインスタンスが生成されており、これをsubscribed（購読と訳されていたが、予約的な意味合い？）して、サーバーにbroadcast(引き渡す的な）する。その具体的な内容はmessage:data['message']ですよ！と素直に読み取りました。
＊勝手な解釈なので、お気をつけ下さい。

```chat_channel.rb
class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "room"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end

  def send_msg(data)
    ActionCable.server.broadcast "room", message:data['message']
  end
end
```

続いてchat.coffeeファイルについてです。
先ほどのchat_channel.rbのsend_msgメソッド内の処理で、サーバに引き渡すmessage:data['message']についてsend_msg:(data)の中に記述してあります。


```chat.coffee
App.chat = App.cable.subscriptions.create "ChatChannel",
  connected: ->
    console.log("WEBSOCKET CLIANT CONNECTED")

  disconnected: ->
    # Called when the subscription has been terminated by the server

  received: (data) ->
    console.log(data['message'])

  send_msg:(data) ->
    @perform 'send_msg', message:data
```

chat.coffeeにてApp.cableクラスのサブスクリプションが作られ、それがApp.chatに格納されています。
このApp.chatというインスタンスを用いてindex.html.erbからデータの送受信ができるようになります。

```index.html
<h1>チャットルーム</h1><br>
<p id="chat"></p><br>
<p>メッセージ:</p>
<br>
<textarea id="msg" style="width:300px; height:80px;"></textarea>
<hr>
<button id="send">送信</button>
<script>
    $(document).ready(function(){
        /* メッセージ受信 */
        App.chat.received = function(data){
            $("#chat").append(data['message'] + "<br>")
        }
        
        $("#send").click(function(){
            msg = $("#msg").val()
            /* メッセージ送信 */
            App.chat.send_msg(msg)
        })
    })
</script>
```
ブラウザを二つ立ち上げて動作を確認できました。
![actioncable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/5ddfe1f9-cb0c-b6a5-7344-47aa8b3b9ad2.png)

・まとめ
Railsの機能や基礎技術に対する不理解が露呈する場面が多く、よくわからないけど動いているという状況だと思います。ホストとクライアント間の通信をリアルタイムにする機能について、あらためて向き合う必要があるようです。以上です。


参考
Action Cable の概要　：　https://railsguides.jp/action_cable_overview.html
Rails WebSocket Chat Real Time　：　https://www.youtube.com/watch?v=kJbuZecN1c8
Oracle Management Cloud まとめ

Oracle Management Cloudは、運用データセット全体に対して機械学習と大規模データ技術を活用する、次世代の統合モニタリング、管理、アナリティクス・クラウド・サービスです。
以下に具体的な設定方法や使い方についてまとめました。
<追記> ※OMCは、2024年1月末でサービス終了の予定です。

[Oracle Management Cloudとは？](https://www.oracle.com/jp/cloud/systems-management/cloud-services.html)
[Oracle Management Cloud ドキュメント](https://docs.oracle.com/cd/E83857_01/paas/management-cloud/index.html)


| No | Title |
|:--|:-----------------------|
|1|[OMCインスタンス作成手順](https://qiita.com/western24/items/d835cb947ae54ee8f241)
|2|[OMC Cloud Agentのインストール - Linux編 -](https://qiita.com/western24/items/29df71fe0cfd6a0677d1)
|3|[OMC Cloud Agentのインストール - Windows編 -](https://qiita.com/western24/items/ae2b462d256e604bdcd3)
|4|[OMC APM Agentのインストール - JAVA編 -](https://qiita.com/western24/items/716cc5d6934612b46cc5)
|5|[OMC APM Agentのインストール - .NET編 -](https://qiita.com/western24/items/855cee9d2c0a93b8cf79)
|6|[OMC Log Analyticsの設定方法と使い方 - Linux編 -](https://qiita.com/western24/items/715f221c4ebd5bebad12)
|7|[OMC Log Analyticsの設定方法と使い方 - Windows編 -](https://qiita.com/western24/items/ba6c6f5a95b0d7c9ebbf)
|8|[OMC Log Analytics ログ手動アップロード](https://qiita.com/western24/items/1d00475d0f0b8c2bb0f9)
|9|[OMC Log Analyticsで未対応のログをカスタム・パーサで取り込む](https://qiita.com/western24/items/fdfb2ab5d83ad5d8a28f)
|10|[さくっとJAVAのWebアプリを作成してOMC APMを試す](https://qiita.com/western24/items/cf6ed0578dd4709107f3)
|11|[Oracle CloudのユーザーにOMCへのアクセス権限を付与する①](https://qiita.com/western24/items/66b7672cf0bbcbb69e38)
|12|[Oracle CloudのユーザーにOMCへのアクセス権限を付与する②](https://qiita.com/western24/items/1b8d15e657d2d0890735)
|13|[Oracle Cloud Infrastructureの監査ログをOMCで分析する](https://qiita.com/western24/items/ab2d84c2882a0baac5b4)
|14|[Identity Cloud Serviceの監査ログをOMCで分析する](https://qiita.com/western24/items/fbe08651232dc4f0b641)
|15|[OMCにOracle Databaseの監視を追加する](https://qiita.com/western24/items/e520bba2cd304ea0ec99)
|16|[OMCでOracle Databaseを監視する①](https://qiita.com/western24/items/8b97cb9cf6126031b284)
|17|[OMCでOracle Databaseを監視する②](https://qiita.com/western24/items/aea534e1570f06620396)
|18|[Service Gatewayを経由したOMCへのプライベート接続](https://qiita.com/western24/items/2ec80185693f0d6de604)
|19|[OMCでWordPressを監視する](https://qiita.com/western24/items/8b2a2368bc05f206507e)
|20|[Oracle Autonomous DatabaseをOMCの監視対象に追加する](https://qiita.com/western24/items/2d191e041429c26f96b9)
|21|[OMCのセキュリティを強化する](https://qiita.com/western24/items/296ba22fd5cc27d895c5)
MVC

MVCというものを耳にしたので調べてみた。

##MVCとは
GUIを伴うソフトウェアの設計モデル
アルファベットはそれぞれ以下を表している。
・M　Model
・V　View
・C　Controller

この3つに従って、作るプログラムを分けなさいという意味。

##Model
ビジネスロジックを実行する

##View
ユーザからの入力、結果の出力、Moedelの表示

##Controller
Viewから入力情報を受け取り、Modelを起動
司令塔、橋渡し役

##MVCの例
例えばAndroidであれば以下のように分けられる。
・M　データベース操作など内部処理を行うクラス
・V　レイアウトXMLファイル
・C　Activity・Service・Handler

##問題点
AndroidではよくControllerが肥大するという問題が発生する。ViewとControllerの差がつかなかったり、Controllerの定義が広いなどが理由である。

##感想
フレームワークとしてはとても分かりやすいが、問題点をいかに克服するかが重要そうだ。


##参考URL
・「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 
https://wa3.i-3-i.info/word11584.html

・MVC、本当にわかってますか？
https://qiita.com/tshinsay/items/5b1724baf32b8b5113c2

・MVC とは何かを 1 から学ぶ
https://qiita.com/tentom/items/de95f63bc9e2da2bd0bf

・Android開発におけるMVC 
https://blog.nkzn.info/entry/20100117/1263752972
Flutterでパッケージ名がcom.exampleになっているのをiOS/Androidで修正する箇所まとめ

# はじめに
flutterでプロジェクトを新しく作成するとき、

```
flutter create my_app_name
```

とすると、Package Name/Bundle Identifier は自動的に `com.example.my_app_name` のように指定されてしまいます。リリースに向けて開発を進めるのであればパッケージ名を正しく修正する必要があるので、その修正箇所をまとめておきます。

# Android

### 1. android/app/src/main/AndroidManifest.xml

- 3行目: package
- 8行目: android:label

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.orgname.my_app_name">

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="My App Name">
```

### 2. android/app/src/debug/AndroidManifest.xml

- 2行目: package

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.orgname.my_app_name">
```

### 3. android/app/src/profile/AndroidManifest.xml

- 2行目: package

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.orgname.my_app_name">
```

### 4. android/app/build.gradle

- 41行目付近: applicationId

```gradle
    defaultConfig {
        applicationId "com.your.orgname.my_app_name"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
```

### 5. MainActivity.kt

- 1行目: package

```
package com.your.orgname.my_app_name
```

### 6. ディレクトリ変更

```:変更前
android/app/src/main/java/com/example/my_app_name
```

↓ packageに合わせたディレクトリに変更

```:変更後
android/app/src/main/java/com/your/orgname/my_app_name
```


# iOS

XcodeでBundle Identifierを修正するだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24308/f742e25b-ff4b-6293-5874-34e6ce380128.png)

（※アンダースコアが勝手にハイフンに自動変換がかかりました。Xcodeの仕様のようです。）


# 最初からorg名を指定するには

```
flutter create --org com.your.orgname my_app_name
```
今度からはこのようにcreateしましょう。
githubのREADME.mdに綺麗なツリーを描きたい


 1 . まずローカルでtree構造を出力するパッケージをインストールする．

```
$brew install tree
```

 2 . treeコマンド任意のディレクトリで実行する．

```
$ tree
```


3 . GitHubのREADME.mdの中で，以下のようにpreで囲んで記入する．以上✌️

```
<pre>
.
├── xxx
├── xxx
└── README.md
</pre>

```
IBMi上のDBをJayDeBeApi使ってpython+JDBCでつついてみる

# IBM i上のデータをPythonで取り出せないか

ひょんなことから、IBM i (AS400とも呼ばれたOSです) のデータを取り出す必要に迫られました。

## やりたいこと

IBM i上のデータを取り出して、LinuxとかWindowsで使いたい
システム内のデータを使って、機械学習だったり分析だったりをしたいと思うことがあります。
単純にPythonを使うだけなら、IBM i上で処理することもできます。

が、今回はGPU使ってDLだったりMLしたいので、Linux上にデータを持ってくる必要があります。
そのために、JDBC+Pythonでデータを引っ張ってこようと思います。

もちろん、Javaを使ってデータを取ってきてもよいです。
今回はPythonの方が得意という理由でPythonからJDBCを使うことにしました。
(DLやMLはPythonで書くことが多いので、その処理にも入れやすかも)

# JayDeBeApiを使ってみる

今回は、JDBCのAPIを叩くためのPythonライブラリとして、`JayDeBeApi` を使います。
https://github.com/baztian/jaydebeapi

結構いろんな種類のDBに対応しています。
DB2もありますね！

> Supported databases
> 
> In theory every database with a suitable JDBC driver should work. It is confirmed to work with the following databases:
> 
> SQLite
>     Hypersonic SQL (HSQLDB)
>     IBM DB2
>     IBM DB2 for mainframes
>     Oracle
>     Teradata DB
>     Netezza
>     Mimer DB
>     Microsoft SQL Server
>     MySQL
>     PostgreSQL
>     many more...


## 準備

今回は、Python3.6で動かします。

各ソフトウェアのバージョンは以下の通り

- Python == 3.6
- JayDeBeApi == 1.1.1
- JPype1 == 0.6.3

### インストール
pipでインストールできます。

```bash
pip install JayDeBeApi
```

JPypeのバージョンが最新だと、実行時にエラーが発生したので、0.6.3で再インストールしました。

```bash
pip install JPype1==0.6.3 --force-reinstall
```

### JDBCドライバーの準備
今回はIBM iに標準で用意されているJarファイルを利用します。
`jt400.jar` が下記のディレクトリに格納されているので、IBM iから利用するLinux環境にコピーします。

```bash
/QIBM/ProdData/HTTP/Public/jt400/lib/jt400.jar
```

## 簡単なデータ取得
`<hostname>`, `<user>`, `<password>`はお使いの環境に合わせて設定してください。

```python
import jaydebeapi

conn = jaydebeapi.connect("com.ibm.as400.access.AS400JDBCDriver", "jdbc:as400://<hostname>", ["<user>", "<password>"], "/home/IBMi/jt400.jar",)

cur = conn.cursor()
cur.execute("select * from TSLIB.WORKDAY")
cur.fetchall()

curs.close()
conn.close()
```

このPythonスクリプトを実行することで、IBM iからデータを取得できました。
`execute`のSQL文を変更することで、DBに対する操作も変えられます。
vuexエラー

Error: [vuex] Do not mutate vuex store state outside mutation handlers 


##ストリクトモード解除
store/index.js

```
+ export const strict = false
export const state = () => ({
```


storeを分割して、フォルダ分けした場合でもindex.jsを見に行くっぽいので

store/index.jsのファイルは残して

```
export const strict = false
```

だけ記述する


## これだとだめだった

```
computed: {
	...mapGetters({ requestData: 'usergroup/usergroup'})
},

↓↓↓↓

computed: {
	requestData: {
		get() {
			return this.$store.getters['usergroup/usergroup']
		},
		set(value) {
			console.log(value)
			return
			this.$store.dispatch("usergroup/setValue", value)
		},
	}
},

```
AWS EC2 Amazon Linux 2 + Docker + Jenkins

## 概要

AWSのEC2(Amazon Linux2)でDockerでJenkins環境を構築する

### Dockerのインストール

```bash
$ sudo yum install -y docker
$ sudo service docker start
```

### 自動起動を有効にする

```bash
$ sudo systemctl enable docker
```


### docker imageのダウンロード

```bash
$ sudo docker pull jenkins/jenkins:lts
```

### docker imageの起動

```bash
$ sudo docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
```


### 初期パスワード

先ほどのコマンド実行すると↓みたいなのが出力されるのでメモしておく


```bash
*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

{パスワードがここに表示される}

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
```

### ブラウザアクセス

http://{IP}:8080/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133737/05204a7a-ec93-2fc3-c334-efd138afc838.png)

### ログイン

**Administrator password**に先ほどメモっといたパスワードを入力すれば完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133737/4760eeab-fba1-b99c-4687-b1d07dc20d0d.png)


以降の作業は参考資料を見てもらえればと思います。

### おわり


## 参考資料
[Amazon Linux2にDockerをインストールする
](https://qiita.com/reoring/items/0d1f556064d363f0ccb8)

[Jenkinsをdocker上に構築
](https://qiita.com/legitwhiz/items/e6ac1f5a94f09ff2bb1d)
WebStormをバージョンアップしたときに、GitへのPushに失敗したときの対処方法

# 概要

**WebStorm**を2018.xを2019.xにバージョンアップしたら、いままでGitHubにPushできていたプロジェクトがPushできなくなった

## 現象
以下のようなエラーメッセージが表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/7c1353ea-9ea9-50c1-7277-001474417fe8.png)


```
15:53	Push failed
		Invocation failed Server returned invalid Response.
		java.lang.RuntimeException: Invocation failed Server returned invalid Response.
		at org.jetbrains.git4idea.http.GitAskPassXmlRpcClient.askUsername(GitAskPassXmlRpcClient.java:50)
		at org.jetbrains.git4idea.http.GitAskPassApp.main(GitAskPassApp.java:64)
		Caused by: java.io.IOException: Server returned invalid Response.
		at org.apache.xmlrpc.LiteXmlRpcTransport.sendRequest(LiteXmlRpcTransport.java:242)
		at org.apache.xmlrpc.LiteXmlRpcTransport.sendXmlRpc(LiteXmlRpcTransport.java:90)
		at org.apache.xmlrpc.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:72)
		at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:194)
		at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:185)
		at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:178)
		at org.jetbrains.git4idea.http.GitAskPassXmlRpcClient.askUsername(GitAskPassXmlRpcClient.java:47)
		... 1 more
		remote: Repository not found.
		Authentication failed for 'https:/... (show balloon)
```

## 対処法

アップロード後になぜか接続設定(internal)が引き継がれずエラーになるので**GitHubへの接続設定をやりなおす**

**File->Settings->Version Contorl->Github**を選択して、
auth情報を再設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/c316963d-8181-8120-460e-228f5762e97f.png)

再設定したらうまく動くようになった。
JavaScriptで文字が全て半角数字かどうか判定する


JavaScriptで渡した文字が全て半角数字かどうか判定する方法です。


```js
e1xport default class AsciiNumberTester {
  static containsOnlyHalfWidthNumber(str) {
    return /^[0-9]+$/.test(str);
  }
}
```

```js
import AsciiNumberTester from 'path/to/class_file';

AsciiNumberTester.containsOnlyHalfWidthNumber(this.value)
```



-----------以下解説----------------

* `[0-9]+` は 0~9のどれかが1回以上繰り返し
* 正規表現においては（ざっくり解説だと） `^`は先頭、`$`は行の終わり
* `.test()` は正規表現と与えられた文字列が一致するかチェック
    * https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
Docker 環境で nodemon が watch してくれない問題と対処方法

Web アプリの開発環境を Docker で作っていたところ、nodemon がうまくファイル変更を検出してくれなくて困ったので、そのときのメモ。

## マウントしたボリュームだと nodemon が watch してくれない問題
問題を再現するために、以下の3つのファイルを用意する。

ポイントとしては、ホストのディレクトリをコンテナ内にマウントしてそれをコンテナ内の nodemon が watch しているということ。

``` Dockerfile:Dockerfile
FROM node:12

ADD . /app
WORKDIR /app

CMD ["node", "."]
```

``` javascript:index.js
const http = require('http')

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' })
  res.end('ok')
}).listen(80)
```

``` yaml:docker-compose.yml
version: '3'

services:
  app:
    build: .
    ports:
      - 8080:80
    volumes:
      - .:/app
    command: npx nodemon
```

`docker-compose up` でコンテナを起動し、Web ブラウザから `http://localhost:8080/` にアクセスすると `ok` と表示されるはず。

この開発用コンテナは nodemon から node プロセスを起動しているので、 `index.js` が編集された場合には自動で restart してほしい。

しかしこの場合、いくら `index.js` を編集しても nodemon はその変更を検出してくれない。

## Chokidar が Polling するように設定する
nodemon はファイル監視のために内部で [Chokidar](https://github.com/paulmillr/chokidar) を利用しており、そのドキュメントにはこのように書いてある。

> usePolling (default: false). Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU utilization, consider setting this to false. It is typically necessary to set this to true to successfully watch files over a network, and it may be necessary to successfully watch files in other non-standard situations. Setting to true explicitly on MacOS overrides the useFsEvents default. You may also set the CHOKIDAR_USEPOLLING env variable to true (1) or false (0) in order to override this option.

ネットワーク経由でファイルを監視する場合にはポーリングするように設定する必要があるらしい。

``` diff:docker-compose.yml
+    environment:
+      CHOKIDAR_USEPOLLING: 1
```

というわけで環境変数 `CHOKIDAR_USEPOLLING=1` を設定した上で再試行したところ、無事にファイル変更を検出してくれるようになった。

めでたしめでたし。
Javaの名前を変更するExcelシートとセットTabの色

この記事では、Spire.XLS  for javaを使用して、ワークシートの名前を変更し、Javaアプリケーションのシートのタブカラーを設定する方法を紹介します。
使用ツール：[Free Spire.XLS for Java （無料版）](https://www.e-iceblue.com/Introduce/free-xls-for-java.html)
Jarファイルの取得と導入：

Method 1：ホームページを通じてjarファイルのカバンをダウンロードします。ダウンロード後、ファイルを解凍して、libフォルダの下の[Spire.xls.jar](https://www.e-iceblue.com/Download/xls-for-java-free.html)ファイルをJavaプログラムに導入します。

Method 2：[maven倉庫](https://www.e-iceblue.com/Tutorials/Licensing/How-to-install-Spire.PDF-for-Java-from-Maven-Repository.html)設置による導入。

```java

import com.spire.xls.*;
import java.awt.*;

public class RenameSheetandSetTabColor {
    public static void main(String[] args) {

        // Excelドキュメントを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Sample.xlsx");

        //最初のワークシートの新しいワークシート名とタブの色を設定する
        Worksheet worksheet = workbook.getWorksheets().get(0);
        worksheet.setName("Rename1");
        worksheet.setTabColor(Color.red);

        //番目のシートの名前とタブの色を設定する
        worksheet = workbook.getWorksheets().get(1);
        worksheet.setName("Rename2");
        worksheet.setTabColor(Color.green);

        //サードシートの名前とタブの色を設定する
        worksheet = workbook.getWorksheets().get(2);
        worksheet.setName("Rename3");
        worksheet.setTabColor(Color.blue);

        // ドキュメントをファイルに保存する
        workbook.saveToFile("output/Result.xlsx", ExcelVersion.Version2010);
    }
}
```

効果図:
![Rename the worksheet and set tab color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/8341ace1-0775-8bb9-04bd-21ee275a3b9c.png)
Guest OS が使える状態になったか調べる

* VM使えるか確認する  
  このpropertyが見えるまで待つ。  
  ```vboxmanage guestproperty wait $vm "/VirtualBox/GuestInfo/OS/NoLoggedInUsers"```

* 値の取り方  
  ```vboxmanage guestproperty get $vm "/VirtualBox/GuestInfo/OS/NoLoggedInUsers"```

* propertyの一覧  
  ```vboxmanage guestproperty enumerate $vm```
amazonlinux2のコンテナでAnsibleのsystemdモジュールがエラーになるのでserviceで回避する手順

注意事項:これはワークアラウンドな手順です。systemctlを使っていく方が正しい道だと思います。

`amazonlinux:2` のコンテナでAnsibleのsystemdモジュールがエラーになるのでserviceで回避する手順です。
具体的には以下のようなタスクを実行したところ、

```yaml
- name: start jenkins
  systemd:
    name: jenkins
    state: started
```

以下のようなエラーが出ました。

> TASK [start jenkins] ***********************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "cmd": "/usr/bin/systemctl", "msg": "Failed to get D-Bus connection: Operation not permitted", "rc": 1, "stderr": "Failed to get D-Bus connection: Operation not permitted\n", "stderr_lines": ["Failed to get D-Bus connection: Operation not permitted"], "stdout": "", "stdout_lines": []}


## 対策
systemdではなくて、serviceを使用します。
serviceを使用するために、`initscripts` をインストールします。

```yaml
- name: Install yum packages
  yum:
    name:
      - initscripts

- name: start jenkins
  service:
    name: jenkins
    state: started
```


### おまけ: VSCでamazonlinux2のイメージでAnsibleをテストできるようにするまでの手順
なぜこんなことをやったのかと言うと、VSC(Visual Studio Code)のAnsible Extentionを使うと、
手元でDockerを利用しながらサクサクとAnsibleを動かしながら書けるためです。

具体的には以下の様なdockerfileを書きます。(デプロイとかしないので小さくする努力を放棄してます)

```dockerfile
FROM amazonlinux:2
RUN  yum -y install python-pip && pip install ansible
```

ローカル用にbuildします。タグ名は任意です。
```bash
docker build -t localhost/amazonlinux2-ansible .
```

VSCを立ち上げて、AnsibleのExtentionを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120707/d0ad8ed4-f7c6-811f-bfcd-0941851fe523.png)

Extentionの右下の歯車(Setting)をクリックしてExtentionの設定メニューを出します。

検索画面に `docker` と入れると、 `Custom docker image when running playbook in Docker.` の項目が出るので、自分が作成したコンテナイメージのタグ名を設定します。特に保存するボタンなどはなくて、即反映でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120707/e8f163e0-b98b-9bc9-d251-ab52c67c0c70.png)


この後は、playbookをダブルタップ(右クリック)して `Run Ansible Playbook in Docker` を実行すると、上述したコンテナイメージを利用してPlaybookの実行が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120707/f2e8c6bf-0d23-445b-e712-c5b2d637fdcb.png)
ハッキング・ラボのつくりかた実践 - 0 -

###■目的
IPUSIRON (著) 「ハッキング・ラボのつくりかた: 仮想環境におけるハッカー体験学習」を読んで、自分でもやってみたくなったため、備忘録として書き溜めながらつまづきそうなポイントを共有するための記事です。実際にこの本が出版されてからもKali Linuxのリリースは続いており、「新しいバージョンでは同じコマンドが使えない！」、「手順通りにやっているのに動かない！」などがあるようなので、その辺りの解決方法も試行錯誤して見つけてみようと思います。
基本は仮想環境を使用することでリモートでの作業も楽に行えるようにしました。

###■環境
- VMware ESXi 6.7 --> Kali LinuxとMetasploit、Windowsなどのマシンを動かす
- Macbook Air --> 作業端末。リモートデスクトップ等でKaliを操作する。

私の場合はVMWareをサーバーで動かして環境を構築する予定ですが、基本的には他の方が書いておられるように、VirtualBOXでも問題なく稼働すると思います。

###■最後に
今回は記事のご紹介ページということで、本編は無しです。
次回の記事から、区切りの良いところまでの進捗を記録してご紹介していきたいと思います。


**ハッキング・ラボのつくりかた実践 - 1 - はこちら**
https://qiita.com/YTO-s3k/items/bb35a6e987992e9ca922
vboxmanage で共有フォルダのホスト側のパスを取得する

```
lookingfor="certainsharedfolder"
vboxmanage showvminfo $vm | grep "$lookingfor" | sed -e "s/Name: '$lookingfor', Host path: '//" | sed -e "s/' (machine mapping), writable//"
```

設定によって書き換えること。
paizaでSランクを取るまでにやったこと

プログラミング学習サイトのpaizaのスキルチェックでぎりぎりSランクが取れたので、そこまでの経緯を書いてみます。
[Sランクが取れた問題の結果](https://paiza.jp/challenges/share/e9Na8-My3UFAafDn6GpEJn_SQfHK3gmR5sey3Aqmtxg?source=social)
# paizaスキルチェックとは
paizaのスキルチェックとは競技プログラミングのように指定の問題に対して、入力値を元に処理を実装し、凡そ10個くらいのテストケースで正しい結果が出るプログラムを作成するものです。
また回答までの時間も点数にかかわってきます。
# どうやってランクを上げるの？
解答時の点数に応じてどのランクに該当するかが決まります。
低いランクだと100点満点でなくともランクアップできますが、Sランクは100点じゃないとランクアップしないようでした。
筆者は一度Sランク問題で結果が99点だったためランクが上がると思ってましたが、上がりませんでした。
# 私の経歴
下記に経歴を書いていますが、歴の長い経験者です。
## 高校
情報処理科でCOBOLを学ぶ。
## 専門学校
ゲームプログラミングを専攻。
C言語、C++、VBを学び、独学でC#を学習。
入学と同時に基本情報を取得し、2年目の春に現在の応用情報を取得する。
## 社会人
主に派遣やSESを行っている会社を3社ほど経験。
言語は主にJavaやPHPを使用してWebアプリケーションを作成。
途中ブランクはありますが、凡そ10年くらいはIT業界でプログラミングを行っています。
# paizaでやったこと
仕事での経験はJavaやPHPでのWebプログラミングが多かったですが、これからの時代AIのプログラミングスキルがないと厳しいと感じ、完全無料だったこともありPythonの文法を学習しました。
そのため、スキルチェックもすべてPython3で解きました。
#スキルチェックの感想
よく書かれていますが私なりの各ランクの所感は以下の通りです。
### Dランク
入力値を四則演算、またはその応用をすればすぐ解ける感じ。<br>凡そ1分台で解ける問題がほとんど
### Cランク
入力値に対してif文、またはfor分で値を加工できれば簡単に解ける。
### Bランク
ちょっと考えて処理を書く必要がある。
### Aランク
このあたりからif文、for分、配列などを使って、かなり考えて処理を組まないといけない印象。
変なバグにはまると時間がどんどんなくなっていき、テストはすべてOKでも時間切れでランクアップしないこともあった。
### Sランク
巷では簡単との評判もあるが、まず問題を読んでどんな結果が欲しいのか考えるまでの時間が結構かかる。
問題によって難しさの差が激しすぎるため、簡単な問題に当たればクリアできることもあるが、大体の問題が計算量の意識がないとタイムオーバーで失敗に終わることが多い。
# なんでスキルチェックを行ったのか？
12月上旬終わりごろから諸事情により長期のお休みをしているため、休みの間に自分のプログラミング力に自信をつけるため取り組みました。
自信をつけるために始めたはずがSランクの問題は難しすぎて心が折れそうな場面がありました。
# Sランクを取るまでにやったこと
Bランクまでは特に詰まることなく解答することができました。
Aランクは最初の問題がテストはすべて通ったのですが、時間が大幅に規定時間をオーバーしてしまい、ランクを取ることができませんでした。
次のAランク問題では計算量に悩まされタイムオーバーしてしまうコードを最初書いてしまったため、強引に計算量を減らしランクを取ることができました。
そのままの勢いでSランクの問題に望みましたが、選んだ問題が悪かったのか全く処理の糸口が見えず、挫折しました。
そこからアルゴリズム力を鍛えないとSランクは取れないと感じたため、たまたま以前別の目的で購入していた[プログラミングコンテストチャレンジブック [第2版]](https://book.mynavi.jp/ec/products/detail/id=22672)の2章の基礎編までを読みながら、途中のソースコードをpythonに置き換えてコーディングしました。
その後Sランクの問題に再度挑戦し、一度目は惜しくも99点でSランクが取れませんでしたが、上記のSランクが取れた問題で100点を取ることでSランクになることができました。
正直『プログラミングコンテストチャレンジブック [第2版]』の内容のほうは基礎編でもかなり難しく、ここまでを完全に理解できればすぐにSランクが取れると思います。
逆に完全に理解していなくても競技プログラミングとしてのコードを書く力は養われます。
ただ私が挑戦したSランクの問題は定番のアルゴリズムを使わなくても考えて解ける問題が多かったため、必ずしも定番のアルゴリズムを身につけなくてもSランクを取るだけであれば可能かと思います。
# この先どうするか
paizaでのSランク獲得を目標にしており、達成したため次の目標を少し迷っていますが、候補としては以下のような物を考えています。

- AtCoderのレーティングを上げる
- Kaggleに挑戦してみる

# まとめ
IT業界で活躍するプログラマーであればそこまで苦労せずAランクくらいまでは上がれると思います。
Sランクは問題の難易度に差があり、相性もあるので失敗した問題の分析をちゃんと行い、挫折せずにチャレンジし続ければSランク獲得できると思うので頑張ってください。
Google Play Console アーティファクトライブラリに残っているものを消す

# はじめに
WebviewのSSLに関する警告などが来て対応したが、
テストトラックとして過去バージョンがアーティファクトライブラリに残っており、警告が残り続けてしまい精神衛生上良くありませんでした。
少し調べてみましたが「リリース時点でapk選択時に削除ボタンがある」といった情報も、情報自体が古いためかボタン自体存在せず。。。問い合わせを行った結果をこちらに記載させていただきます。

もしかしたら公式リファレンスなどにも説明が記載されているかもしれません。その場合は申し訳ございませんが、該当箇所をご教示いただけると幸いです。

# 結論
テストトラックにあるリリースを「空リリース」にすれば、既存のAPKを削除することができます。
テストトラックの「空リリース」は下記手順

```
①「リリース管理」＞「アプリのリリース」＞「ベータ版/アルファ版」＞「管理」＞「リリースを作成」
②「追加する Android App Bundle と APK」にAPKを追加せずに、
　「無効にする Android App Bundle と APK」に
　現在公開中のAPKが設定されていることを確認
③リリース名を作成し、
　画面下の「保存」＞「確認」＞「ベータ/アルファテスト版として公開を開始」
　をクリック
```

無事消えました。