OmniAICreator/Qiita-1.07M huggingface dataset:
DigDagのrequireに変数を渡す方法メモ

# 背景

DigDagには `require` という operatorがある。 -> [**DigDag:require**](https://docs.digdag.io/operators/require.html)
これは、主に別のワークフローに依存させたい場合などに使ったりする。
また、処理が失敗しても後続処理を続けたい場合などにも使える。 -> [**digdagでエラーを無視して後続タスクを進める**](https://qiita.com/fk8_jp/items/ef6871549d737ada7da2)
しかし、requireを使うと、[通常の変数の渡し方](https://docs.digdag.io/workflow_definition.html#defining-variables)では変数を渡せないので、渡し方をメモしておく。

# 方法
結論からいうと、paramsを使うようにする。以上。

[**require#params**](https://docs.digdag.io/operators/require.html)

コード例

```sh:parent.dig

_export:
  var_by_export: aaa # ←通常の渡し方

+task1:
  require>: child
  params:
    var_by_params: iii # ←requireでの渡し方
```

```sh:child.dig

+task2:
  echo>: read var_by_params -> ${var_by_params}
# 出力: read var_by_params -> iii
# params経由は参照できる

+task3:
  echo>: read var_by_export -> ${var_by_export}
# 出力: read var_by_export -> ${var_by_export} (ReferenceError: "var_by_export" is not defined
# _export経由は失敗
Ionic Angular データバインディングで表示させた文章を改行する方法

#はじめに
タイトルに堂々と**「Angularのデータバインディング」**　と書いてますが、これから書く内容がデータバインディングなのか私はわかりません。。

そこまで用語に対して詳しくないので、言葉が間違ってたら教えてください。

#本記事で見せるサンプルの環境
今回この記事で使うサンプルは、以下のような環境です。

・Ionic + Angularのアプリ
・Firebaseに保存された文字列を表示させている
・ページAで文字列を入力&保存、その文字列をページBで表示

こんな感じでーす。

#文字列が改行されない問題
以下の例を見て欲しい。

##ページA

```html:a.page.html
<ion-item>
            <ion-label position="floating">タイトル</ion-label>
            <ion-input type="text" [(ngModel)]="event.title" name="title">
            </ion-input>
          </ion-item>
          <ion-item>
            <ion-label position="floating">メモ</ion-label>
            <ion-textarea rows="7" [(ngModel)]="event.memo"  name="memo">
            </ion-textarea>
          </ion-item>
```

<img width="242" alt="スクリーンショット 2020-01-14 21.27.10.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/c172c5af-9ef3-0de2-49a3-5dcfb67623a6.jpeg">

こんな感じで保存したとする。

##ページB

```html:b.page.html
<ion-label *ngIf="event.title">
                 <ion-text color="dark">タイトル : </ion-text> {{ event.title }}
                 <hr>
                </ion-label>
                <div *ngIf="event.memo">
                    <ion-text color="dark">メモ : </ion-text> {{ event.memo }}
                  <hr>
                </div>
```

<img width="227" alt="スクリーンショット 2020-01-14 21.27.44.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/beb79180-7a9e-492e-9a91-5345af9c7f08.jpeg">

**そう、改行されないのだーーー！！！**

入力&保存をするページAではしっかり改行しておいたのに、データバインディングで表示させているページBでは改行されていない。

#cssだけで改行できました
ページBにcssクラスを追加

```html:b.page.html
<div *ngIf="event.memo" class="brake">
                    <ion-text color="dark">メモ : </ion-text> {{ event.memo }}
                  <hr>
                </div>
```

```css:b.page.scss
.brake {
white-space: pre-wrap;
}
```

<img width="225" alt="スクリーンショット 2020-01-14 21.26.57.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/e5dc3a67-c746-0532-1877-d028fd7461fc.jpeg">

#最後に
詳しいことはわかりません。しかし、改行できた！

こちらを参考にしました。
[【AngularJS】改行をとにかく簡単に有効にする方法](https://qiita.com/taiyoslime/items/3f1dccf96101155ffd4e)

CSSの`white-space`には`pre`、`wrap`、`nowrap`など、いろいろと種類があるようなので、気になる人は調べてみてくださいな〜。
無駄なEBSスナップショットをLambdaで定期削除する

「不要になったAMIを登録解除したけど、EBSスナップショットは消し忘れちゃって無駄なスナップショットがたくさん残っちゃってる...」ってこと結構あると思います。
こういう明らかに不要なスナップショットは、Lambdaの定期実行などを利用して自動的に削除されるようにしちゃいましょう。

無駄なスナップショットを残しておくと、スナップショットの管理が煩雑になるし、そのスナップショットにも費用がかかるので、消しちゃうに越したことはありません。

まずAMI登録解除時に消し忘れたスナップショットを一括削除するLambdaは以下のようになります。

```python

import boto3

ec2 = boto3.client("ec2")

def lambda_handler(event, context):
    #AMIと共に作られたsnapshotを抽出
    response = ec2.describe_snapshots(
            Filters=[
                {
                    'Name': 'description',
                    'Values': [
                        'Created by CreateImage*',
                    ]
                },
                {
                    'Name': 'owner-id',
                    'Values': ['************'] #AWSアカウントID
                }
            ]
        )
        
    
    is_unnecessary = {}
    for snapshot in response['Snapshots']:
        is_unnecessary[snapshot['SnapshotId']] = True
    
    #現在登録中のAMIを抽出
    response = ec2.describe_images(
        Filters=[
                {
                    'Name': 'owner-id',
                    'Values': ['************'] #AWSアカウントID
                }
            ]
    )

    #現在登録中のAMIで使われているsnapshotのみFalseにする
    for image in response['Images']:
        for bdm in image['BlockDeviceMappings']:
            try:
                is_unnecessary[bdm['Ebs']['SnapshotId']] = False
            except KeyError:
                continue

    
    i = 0
    for snapshot_id in is_unnecessary.keys():
        if is_unnecessary[snapshot_id]:
            ec2.delete_snapshot(SnapshotId=snapshot_id)
            i = i + 1
    
    print('Delete ' + str(i) + ' Snapshots')
```

これを`CloudWatch Events`を使って定期実行させます。
cron式を使えば簡単に定期実行させることができます。
[Schedule Expressions for Rules](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)
例えば月次実行とかにしたい場合は`0 0 1 * ? *`とかで大丈夫です。

これで定期的に無駄なEBSスナップショットが削除されるようになります。

**※注意: ここでいう「不要なスナップショット」はAMI登録解除時に消し忘れたスナップショットのことだけを指します。各々が手動で作成したスナップショットは、タグ付けなどをして自己で管理してください。**
手動で Flutter Android アプリに hot reload 命令を送るメモ(2020 年 1 月 14 日時点)

## 背景

Termux + Flutter + dart ffi で .so リロード対応し Android C/C++ + GUI アプリ開発を効率化するメモ
https://qiita.com/syoyo/items/21ba3174fe5a668f2960

などで, 特定のファイルで変更があったときに Flutter に hot reload 命令を送りたい.
(VSCode では, .dart ファイルが変更されたときだけ reload)

## 方法

`flutter run --machine`

で Flutter アプリを起動します.
これにより, stdin/stdout で JSON-RPC で通信できます.

https://github.com/flutter/flutter/blob/master/packages/flutter_tools/doc/daemon.md

`appId` は event message(stdout への出力)で取得できます.

```
[{"method":"app.restart", "id": 0, "params" : { "appId" : "e0c12cae-e4f3-47a9-8447-2b250bcc4af9", "fullRestart": true}}]
```

というメッセージを stdin(or `/proc/<pid>/fd/0`)に書き込むと hot reload できるはずです.

`id` は JSON-RPC の id なので, 任意の番号を指定します.


### 赤い画面になったら再度 flutter run が必要

赤い画面の致命的なエラーがでたら, `app.restart` 命令は `fullRestart` を true にしてもアプリは再起動しません. 再度 `flutter run --machine` する必要があります.

### flutter attach は使えない

たとえば VSCode で実行しておいて, 外部プログラムでリロードの命令を送りたいですよね.

しかし, flutter attach では, `app.restart` 命令が使えません. JSON-RPC で命令を送ると NoSuchMethodError が帰ってきます.

したがって, `flutter run` する以外に方法がありません.

### VSCode と連携したいが...

VSCode の dart extension では, pid や appId を出してくれません.
pid と appId がわかれば, 外部から `/proc/<pid>/fd/0` で命令を送れるはずですが... なんらかのオプションで情報だしてくれるかもですが, ソースコードの改変が必要になるかもです.

### 現状使いにくい...

flutter run では, stdin/stdout で入力と出力を受け付けます. http などはないっぽそうです.
(`--overvatory-port` は, デバッグやプロファイリング用で, `app.restart` メソッドは使えない)

python などスクリプトを使って, popen などと組み合わせないとめんどいです.
(Linux/macOS だったら socat でソケットと stdin/stdout を繋ぐというてもあるかも?)

いずれにせよ処理を自動化するには stdout をパースしたりとめんどいで, 使いにくいです.

### なんとか VSCode と連携したい...

ファイル変更があったときに vscode のコマンドを実行できる

https://github.com/BouKiCHi/vscode-watch-run

あたりと連携するか, VSCode Dart extension を拡張することになるでしょうか...

#### dart.previewHotReloadOnSaveWatcher

何かしらダミーの .dart ファイルを作っておき, Dart flutter extension v3.7.0 以降で `dart.previewHotReloadOnSaveWatcher` を true にする方法が考えられます.

https://github.com/Dart-Code/Dart-Code/issues/2074

このフラッグが true ですと, (VSCode の?)file watcher で変更を検知しますので, VSCode の外で .dart ファイルを編集した場合でも hot reload が実行されます!  :tada: :tada:
(2019 年 11 月 15 日とフラッグ追加は最近ですね)

最近の VSCode ですと File -> Preferences -> Setting -> Extensions で `Dart: Preview Hot Reload On Save Watcher` に GUI でチェックをいれるだけなので楽ですね.

### 参考

VSCode dart extension(Flutter の機能は dart plugin に入っていて, Flutter repo は実質空です).

https://github.com/Dart-Code/Dart-Code

### TODO

* [ ] VSCode dart extension を改造して, pid, appId を抜き出したり, 特定のフォルダ or file の watch ができるようにする.
  * .so など, 非 .dart ファイルが変更されたときは, カスタムの shell コマンドを実行できるようにする
Google Coral Dev Board Miniについてどう思いますか？

Googleは数週間前に、Coral Dev Board Miniが2020年前半に利用可能になると発表しました。

彼らが言ったように、Coral Dev Board Miniは、Coral Dev Boardに代わる、より小さなフォームファクター、低電力、低コストの代替品を提供できます。 Miniは、新しいCoral AcceleratorモジュールとMediaTek 8167s SoCを組み合わせて、720Pビデオエンコード/デコードおよびコンピュータービジョンのユースケースに優れたボードを作成します。

![微信截图_20200108165537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/59513cf4-0da8-0012-4111-b810b96a16e0.png)

さらに、Googleは、Edge TPU ASICをカプセル化する統合が容易なマルチチップパッケージであるCoral Accelerator Moduleも発表しました。このモジュールは、PCIeとUSBの両方のインターフェースを公開し、カスタムPCB設計に簡単に統合できます。

![微信截图_20200108164700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/f211ff9d-7c2d-2164-2981-1bd59a256454.png)

GoogleがCoral Dev Board、USB Accelerator、PCIe Acceleratorsを含むCoral edge tpuシリアルハードウェアを昨年リリースしたので。すべてのハードウェアは、Mouser、Gravitylink[Gravitylink](https://store.gravitylink.com/global)などのグローバルディストリビューターが提供する36か国で利用できます。


ヘルスケアから農業、スマートシティに至るまで、幅広い業界にわたって幅広いアプリケーションがCoral上にすでに構築されています。
TypeScriptで60進数から10進数へ変換する(緯度経度)

# やりたい事

`DMS(※1)形式` から `Degree形式` に変換したい

つまりタイトル通り `60進数 to 10進数` をしたい
[10進数 to 60進数も↓の方で実装してます](https://qiita.com/drafts/b0e47ea1bbb65dc88036/edit#%E9%80%86%E3%82%82%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F)


e.g.) 東京の緯度経度
DMS形式 [35度39分10.1952秒, 139度50分22.1208秒]
↓
Degree形式 [35.652832, 139.839478]

※1 Degree Minute Second の略

# 実装

```typescript
interface PointInDMS {
  lat: DMS;
  lng: DMS;
}

interface PointInDegree {
  lat: number;
  lng: number;
}

interface DMS {
  degree: number;
  minute: number;
  second: number;
}

const degreeMinuteSecond2Degree = (pointInDMS: PointInDMS): PointInDegree => {
  return {
    lat:
      pointInDMS.lat.degree +
      pointInDMS.lat.minute / 60 +
      pointInDMS.lat.second / 60 / 60,
    lng:
      pointInDMS.lng.degree +
      pointInDMS.lng.minute / 60 +
      pointInDMS.lng.second / 60 / 60
  };
};

export const main = () => {
  // 東京
  const tokyoPoint: PointInDMS = {
    lat: { degree: 35, minute: 39, second: 10.1952 },
    lng: { degree: 139, minute: 50, second: 22.1208 }
  };
  console.log({ tokyoPoint });

  const deg: PointInDegree = degreeMinuteSecond2Degree(tokyoPoint);
  console.log({ deg });
};

main();
```

# 実行結果

```shell
{
  tokyoPoint: {
    lat: { degree: 35, minute: 39, second: 10.1952 },
    lng: { degree: 139, minute: 50, second: 22.1208 }
  }
}
{ deg: { lat: 35.652832, lng: 139.839478 } }
```

# 逆もやってみた

`10進数 to 60進数`

一般的にDegree形式が使われてると思うので、こちらを使う事が多そう

```typescript
interface PointInDMS {
  lat: DMS;
  lng: DMS;
}

interface PointInDegree {
  lat: number;
  lng: number;
}

interface DMS {
  degree: number;
  minute: number;
  second: number;
}

const degreeMinuteSecond2Degree = (pointInDMS: PointInDMS): PointInDegree => {
  return {
    lat:
      pointInDMS.lat.degree +
      pointInDMS.lat.minute / 60 +
      pointInDMS.lat.second / 60 / 60,
    lng:
      pointInDMS.lng.degree +
      pointInDMS.lng.minute / 60 +
      pointInDMS.lng.second / 60 / 60
  };
};

const degree2DegreeMinuteSecond = (pointInDMS: PointInDegree): PointInDMS => {
  const d2dms = (degree: number): DMS => {
    const minuteSecond = parseFloat("0." + degree.toString().split(".")[1]) * 60;
    return {
      degree: Math.trunc(degree),
      minute: Math.trunc(minuteSecond),
      second: parseFloat("0." + minuteSecond.toString().split(".")[1]) * 60
    };
  };

  return {
    lat: d2dms(pointInDMS.lat),
    lng: d2dms(pointInDMS.lng)
  };
};

export const main = () => {
  // 東京
  const tokyoPoint: PointInDMS = {
    lat: { degree: 35, minute: 39, second: 10.1952 },
    lng: { degree: 139, minute: 50, second: 22.1208 }
  };
  console.log({ tokyoPoint });

  const deg: PointInDegree = degreeMinuteSecond2Degree(tokyoPoint);
  console.log({ deg });

  const dms: PointInDMS = degree2DegreeMinuteSecond(deg);
  console.log({ dms });
};

main();
```

実行結果

```shell
{
  tokyoPoint: {
    lat: { degree: 35, minute: 39, second: 10.1952 },
    lng: { degree: 139, minute: 50, second: 22.1208 }
  }
}
{ deg: { lat: 35.652832, lng: 139.839478 } }
{
  dms: {
    lat: { degree: 35, minute: 39, second: 10.1952 },
    lng: { degree: 139, minute: 50, second: 22.1208 }
  }
}
```
RailsのPrefix名がおかしくなった件

### 環境
Ruby 2.6.4
Rails 5.2.3

## 経緯
ライブ関係のアプリをつくろうとして、以下のようなルーティングを設定。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :lives
end
```
そして、ルーティングを確認したら、なぜか**life**になってしまった！
![スクリーンショット 2020-01-14 17.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159704/82a29a3b-0d73-4ff9-c185-5b0d607f9762.png)

## 原因
Railsで勝手に単数形のPrefixを割り振ってしまったため。
https://ejje.weblio.jp/content/life
![スクリーンショット 2020-01-14 17.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159704/19a452f9-139d-59e8-3ebf-ed820920cdae.png)


## 解決方法
ルーティングを以下のようにして解消しました。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :lives, only: :index
  resources :lives, as: :live, except: :index
end
```
![スクリーンショット 2020-01-14 17.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159704/66b7e368-ff26-779d-187b-c85f1d075b99.png)

**live_index**だけ気になりますね。。。
これについては[こちらの記事を一読ください。](https://qiita.com/inoue9951/items/1ea6bf75499c01fa4e1d)
PHPで配列の中身を文字列型として取り出したい時

#はじめに
業務でAPI連携をする際に遭遇した内容となります。
備忘録として残そうと思って今回、書きました。

#例えばこんな時に使う(実際に自分が遭遇した状況)

APIでリクエストを送った際、返ってきたレスポンスの中でidやnumberなどを配列として保存して、後で別のAPIのリクエストを送る際に使用する時・・・

#サンプルコード

```php5:test.php

public function main() {
	$idList = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
	foreach ($idList as $arrayId) {
	  createRequest($arrayid);
	}
}

public function createRequest($arrayid) {
	$strId = (int)$arrayId[0];
  $response = $this->httpClient->request(
		'GET', //method
		sprintf('/users/%s', $strId), //url
		[
			'headers' => 'Authorization' => アクセストークン, //headers
			'query' => 検索条件 //query parameter
	)
}
```

例えばこんな感じになります。

#軽い説明
①今回は省略してますが、`$idList`に設定されたidが前にAPIを叩いてリクエストを送って返ってきたレスポンスからidだけを配列として詰めたものと仮定します。
②id単位でforeach文を回して10回分、それぞれのidをurlに設定してリクエストを送ると言った形になります。
③createRequest()メソッドに引数として渡した`$arrayId`は名前の通り配列となってます。
④`$strId = $arrayId[0];`←ここで配列に設定されてる値をstr型にして別の変数に格納します。

#終わりに
なんか他にもっといいやり方あるって方はコメントなどで教えてくれると嬉しいです！
RSpecでActiveRecordに依存しているConcernのspecを書く。

例えばこのようなActiveRecordのschemaに依存しているConcernがある。

```ruby:app/models/concerns/printable.rb
module Printable
  extend ActiveSupport::Concern

  def print_id
    puts self.id
  end

  def print_name
    puts self.name
  end
end
```

そのような場合、どのようにspecを書くのが良いでしょうか。
何も考えずにやるなら既存のActiveRecordのModelを利用することでしょうか。

```ruby:app/models/user.rb
class User < ApplicationRecord
  include Printable
end
```

```ruby:spec/models/user_spec.rb
describe User, type: :model do
  before do
    record.save
  end

  describe '#print_id' do
    let(:record) { User.new }

    subject { record.print_id }

    it do
      expect { subject }.to output("#{nil}\n").to_stdout
    end
  end

  describe '#print_name' do
    let(:record) { User.new(name: 'hoge') }

    subject { record.print_name }

    it do
      expect { subject }.to output("hoge\n").to_stdout
    end
  end
end
```

が、これは`PrintableModule`のspecを書きたいのにUserModelに依存しており、責務が分けられておらず良くないです。
なので、RSpec上で仮のModelを作って`PrintableModule`だけをテストします。


```ruby:spec/models/concerns/printable.rb
describe Printable, type: :model do
  before(:all) do
    m = ActiveRecord::Migration.new
    m.verbose = false
    m.create_table :pritable_tests do |t|
      t.string :name
    end
  end

  after(:all) do
    m = ActiveRecord::Migration.new
    m.verbose = false
    m.drop_table :pritable_tests
  end

  class PrintableTest < ApplicationRecord
    include Printable
  end

  before do
    record.save
  end

  describe '#print_id' do
    let(:record) { PritableTest.new }

    subject { record.print_id }

    it do
      expect { subject }.to output("#{nil}\n").to_stdout
    end
  end

  describe '#print_name' do
    let(:record) { PritableTest.new(name: 'hoge') }

    subject { record.print_name }

    it do
      expect { subject }.to output("hoge\n").to_stdout
    end
  end
end
```

更にリファクタリングをしてみます。

```ruby:spec/spec_helper.rb
# ...
# ...
# ...
def create_spec_table(name, &block)
  before(:all) do
    m = ActiveRecord::Migration.new
    m.verbose = false
    m.create_table name, &block
  end

  after(:all) do
    m = ActiveRecord::Migration.new
    m.verbose = false
    m.drop_table name
  end
end
```

```ruby:spec/models/concerns/printable.rb
describe Printable, type: :model do
  create_spec_table :printable_tests do |t|
    t.string :name
  end

  class PrintableTest < ApplicationRecord
    include Printable
  end

  before do
    record.save
  end

  describe '#print_id' do
    let(:record) { PritableTest.new }

    subject { record.print_id }

    it do
      expect { subject }.to output("#{nil}\n").to_stdout
    end
  end

  describe '#print_name' do
    let(:record) { PritableTest.new(name: 'hoge') }

    subject { record.print_name }

    it do
      expect { subject }.to output("hoge\n").to_stdout
    end
  end
end
```

これで綺麗に書くことが出来ました。
WordPressからSMTPでメールを送る

Wordpressでメール送信を設定するとき、普段はプラグイン[WP Mail SMTP by WPForms](https://ja.wordpress.org/plugins/wp-mail-smtp/)を利用するのだが、office365のメールサーバーで設定しようとした際にPRO版が必要だったため、functions.phpに追記して対応したときの備忘録

```php:functions.php
add_action("phpmailer_init", "send_mail_smtp");
function send_mail_smtp($phpmailer)
{
	$phpmailer->isSMTP();                     //SMTP有効設定
	$phpmailer->Host = "smtp.office365.com";  //メールサーバーのホスト名
	$phpmailer->SMTPAuth = true;              //SMTP認証の有無（true OR false）
	$phpmailer->Port = "587";                 //SMTPポート番号(ssl:465 tls:587)
	$phpmailer->Username = "ユーザー名";        //ユーザー名
	$phpmailer->Password = "ユーザーパスワード";   //パスワード
	$phpmailer->SMTPSecure = "tls";           //SMTP暗号化方式（ssl OR tls）
	$phpmailer->From = "hoge@example.com";    //送信者メールアドレス
// 	$phpmailer->SMTPDebug = 2;                //デバッグ表示
}
```

上記をfunctions.phpに追記したら、あとはメール送信処理の部分でwp_mail関数を実行するだけ

```php:hoge.php
$to = "送信先メールアドレス";
$subject = "件名";
$body = "本文";
$headers[] = "Cc: cc@example.com";
wp_mail($to, $subject, $body, $headers);
```
wp_mail関数のパラメータについては下記参照
https://wpdocs.osdn.jp/関数リファレンス/wp_mail

送信者メールアドレスの部分を"noreply@example.com"等にしたかったのだが、
上記設定wp_mail関数を利用したところUsernameとFromの不一致でエラーとなり送信できなかったため、
今回は`$phpmailer->From`は`$phpmailer->Username`と同一のメールアドレスとした。
JupyterLabでKernel Restartingがポップアップし，止まる

## エラーメッセージ
Kernel Restarting

The kernel for hogehoge.ipynb appears to have died. It will restart automatically.

とポップアップが表示され，カーネルが再起動される．

## 自分の場合の原因
+ F2PYをつかい，PythonからFortranを呼び出していたのだが，Fortranでsegmentation fault起きていた
    + JupyterLabのコードをpythonコードにして実行したらわかった
    + JupyterLabではsegmentation faultは表示されないので，悩んだ

### 原因を調べていて見た他の原因
+ メモリ不足でも出るらしい
+ numpyを入れ直すと直る人もいるらしい &nbsp; など‥

## まとめ
+ Kernel Restartingの原因は色々あるらしい
    + だめな記事の手本みたいな結論だけど許して
+ **困っている人は面倒臭がらないで，JupyterのコードをPythonコードにして実行すればいいかも**
    + 原因を絞り込むことはできそう
atCoderの解説記事を始めます。

1.はじめに
初めてプログラミングをする人を想定してAtCoderの過去問を解説していきます。最近AtCoderを始めたので、自分の理解を深めるために簡単な解説記事を書いていこうを思います。
扱う過去問はdrkenさんの[「AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～」](https://qiita.com/drken/items/fd4e5e3630d0f5859067#11-%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)を参考に選んでいきます。

2.なぜ始める？
私は機械系の大学院生で、プログラミングの勉強はほぼ独学です。はじめたてと初心者の間の時に一番苦しかったです。書いてることはわかる気はするけどなぜかコードが回らない…　何が分からないのかもわからない…　みたいな。そんなレベルの人を対象にして、AtCoderの過去問の解説記事を書いていこうと思います。
読んでくれた人が
1.どんな操作をしているのか知る
2.実際に動く喜びを感じる
ことを目標に頑張ります。

3.参考文献
-[「AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～」](https://qiita.com/drken/items/fd4e5e3630d0f5859067#11-%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)(@drken さん)
-[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)(@shizuma さん)
基本情報技術者試験の勉強計画　第13週（1/13週）

## 目標と結果
### 目標
・朝に勉強する
・大学の試験勉強もあるので両立させる
・しばらく触れていない分野にも触れる
### 結果
・両立はできなかった。
・しばらく触れてない分野に触れてみたが間違いが目立った。
## 振り返り
### keep
・過去問道場をやりこむ
### prolem
・あせらない
### try
・12月の試験問題を完璧にする
git cloneできないとき（503error）

# git cloneできない！
下記のようなエラーがでて困っていました。

```
fatal: unable to access 'http://hoge/example.git/': The requested URL returned error: 503
```

#### 原因：プロキシを設定しているから
- プロキシを経由しないように、no_proxyを設定します

```
export no_proxy='hoge'
```
※`hoge`にはホスト名が入る

- `git clone`する
    - このとき認証があったら、clone元のサイトの認証情報を入力する
    - もし入力ミスをしてcloneできなかったら、windowsの資格情報マネージャーから該当する資格情報を削除する
[Android] MySQLに接続する（未完）

##JDBCダウンロード
AndroidからDBに直接接続できないので、JDBCドライバが必要になる。
MySQLインストール時にしなかった方は、こちらのConnecter/Jというリンクからダウンロード・インストールできる。
https://dev.mysql.com/downloads/


C:\Program Files (x86)\MySQL\Connector J 8.0の階層にmysql-connector-java-8.0.18.jarがあるので、これをビルドパスに追加する。

##ビルドパス設定
jarファイルをapp/libsの下に追加。
さらにbuild.gradleに以下を追加。

~~~gradle
dependencies {
    compile files('libs/mysql-connector-java-8.0.18.jar)
}
~~~
その後、おそらく同期ボタンが出てくるので同期する。

・参考URL
https://qiita.com/icchi_h/items/8ce738ce8511ef69c799

##パーミッション
ネットワークを使うのでパーミッションが必要。以下を追加。

~~~xml
<manifest>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>
~~~

##MySQLへの接続プログラム
MainActivity.java

~~~java
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        try {
            //データベースに接続
            Connection con = MySqlConnect.getConnection();
            //ステートメントオブジェクトを作成
            Statement stmt = (Statement) con.createStatement();

            //SQL
            String mySql = "select date from table;";
            ResultSet rs = stmt.executeQuery(mySql);

            while(rs.next()) {
                Toast.makeText(getApplicationContext(), rs.getString("date"), Toast.LENGTH_LONG).show();
            }

            //オブジェクトを解放
            rs.close();
            stmt.close();
            con.close();

        } catch (Exception e) {
        }
~~~

MySqlConnect.java

~~~java
class MySqlConnect{
  static Connection getConnection() throws Exception {
    //JDBCドライバのロード
    Class.forName("com.mysql.jdbc.Driver");
    //各設定
    String url = "jdbc:mysql://ホスト名/db名";
    String user = "user_name";
    String pass = "password";
    //データベースに接続
    Connection con = DriverManager.getConnection(url,user,pass);
    return con;
  }
}
~~~


・参考URL
https://qiita.com/ks_513/items/0b286c4932a8e36c672e

##困ったところ
現在以下のエラーが発生しており、未完状態である。
・**ClassLoader referenced unknown path**
・**java.lang.UnsupportedOperationException**

ビルドパスの設定、gradleファイルの見直しなど試してみたが突破できなかった。

##感想
簡単にできると思っていたが、意外と時間がかかる。
様々なサイトを見たが、非同期処理についてはほとんど書かれていなかったので関係ないとみている。
しかしhttps://qiita.com/ks_513/items/0b286c4932a8e36c672e
の一番下に非同期処理したほうが良いといった旨の記述がされているので、試す価値はありそうだ。
UFTでGoogleChromeが認識しない

UFTを使って、Chromeを操作しようとしても、初期状態では認識できないため、操作できません。
Chromeの拡張機能を有効にしてあげる必要があるので、有効にしましょう。

# 環境
- UFT Ver15.0(製品名が UFT One になったみたいです)
- GoogleChrome バージョン: 79.0.3945.117（Official Build）（64 ビット）

# 手順
1. Chromeを起動
2. 拡張機能のページを開く(chrome://extensions/)
3. 『UFT』で検索
4. 『Micro Focus UFT Agent』を有効にする
5. Chromeを再起動する


これで認識するようになるはずです。
UFTを起動する際に、｢Web Add-in｣の読み込みを忘れずに・・・

UFT Ver15.0のインストーラーでインストールした場合、拡張機能も一緒に追加してくれるようです。(追加した記憶が無いが、拡張機能の検索でヒットした)
もし、自前で追加が必要な場合は、｢[こちら](https://chrome.google.com/webstore/detail/micro-focus-functional-te/hkheagicnendeidmgfnaaocibkmiibbo)｣から追加してみてください。
Azure SQL Database 単一データベースの作成方法

こんにちは、kc-Dreamです。
今回は、SQL Databaseの単一（シングル）データベースをAzure Portalから構築する方法についてご紹介します。

# Azure SQL Databaseについて
Azure SQL Databaseは下図の種類があり、今回ご紹介するのはシングルデータベースとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/ca5813f7-c29e-f1ef-4a47-12984232da64.png)

- 単一データベースは、フル マネージドの分離されたデータベースを表します。 このオプションは、信頼性の高い 1 つのデータ ソースを必要とする最新のクラウド アプリケーションとマイクロサービスがある場合に使用できます。 単一データベースは Microsoft SQL Server データベース エンジンの包含データベースに似ています。
- マネージド（管理者常駐型）インスタンスは、Microsoft SQL Server データベース エンジンのフル マネージド インスタンスです。 これには、一緒に使用できる一連のデータベースが含まれています。 このオプションは、オンプレミスの SQL Server データベースを Azure クラウドに簡単に移行するため、および SQL Server データベース エンジンが提供するデータベース機能を使用する必要があるアプリケーションに使用します。
- エラスティックプールは、CPU やメモリなどのリソースの共有セットを含む単一データベースのコレクションです。 単一データベースはエラスティック プールの内外に移動できます。

[デプロイ モデル](https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-technical-overview#deployment-models)

##構築方法
Azure PortalからSQL Databaseを選択し、新規SQL Databaseを作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/e3776c7d-b78b-4b7e-ca74-2e112bc51f1a.png)

###基本
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/8df5a19b-9f31-d0ea-cedb-6d4ec5b909a3.png)

- サブスクリプションの選択
- リソースグループの選択
    - 新規リソースグループの作成も可能
- データベース名を入力
- サーバー
    - SQLデータベースがのるサーバを新規作成を行います。
    - 既存サーバを使用することも可能です。
    - 新規作成する場合、サーバ名、ログインユーザ名、パスワード、場所を入力し作成を進めます。※SQL DatabaseはPaaSサービスなのでサーバを直接設定するようなことはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/82520311-cd83-5bf3-8dde-ab83693bc798.png)

- エラスティックプールの使用有無
    - 本記事ではシングルデータベースの構築についてなので無を選択します。
- データベースの設定より使用するSQL データベースのスペック等を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/19fe40b6-31dd-e04a-069c-ae475a553b15.png)
 
###ネットワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/4032ea5c-0c24-fbc6-7b16-7620cc2facf3.png)

- ここではSQL Databaseへの接続方法について選択します。

###追加設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/b9cc3feb-bca9-223c-435d-32ece075fe58.png)


- データソース
    - 新規に作成し使用する場合、なしを選択
    - バックアップから復元の場合には、バックアップを選択

- データベース照合順序
    - 構築時にしか選択できません。変更したい場合、SQL Databaseを再作成する必要があります。
    - [照合順序と Unicode のサポート](https://docs.microsoft.com/ja-jp/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15)

###タグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/4517e4ae-295c-ab75-92e0-38af1fe0899b.png)

- タグ設定を行う場合、入力します。

###確認および作成
- 選択及び入力した設定項目を確認できます。また、SQL Databaseが起動できるかどうかの検証が行われます。
- 問題なければ作成を選択
- デプロイ後、バックアップ設定は変更することをオススメします。


##おわりに
今回はシングルデータベースの構築についてご紹介しました。
マネージドインスタンス、エラスティックプールについての構築方法についても今後ご紹介したいと思います。
TextViewのテキストに下線を引くExtension

よく忘れるのでメモ。個人的にはハイパーリンクっぽい表現をしたいとき以外に使ったことはないです。
`SpannableString`を使います。

```kotlin
fun TextView.drawUnderline() {
  text = SpannableString(text).apply {
    setSpan(UnderlineSpan(), 0, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
  }
}
```

※2020/1/15 追記
`HtmlCompat`を使った方が楽そう。

```kotlin
fun TextView.drawUnderline() {
  text = HtmlCompat.fromHtml("<u>$text</u>", HtmlCompat.FROM_HTML_MODE_COMPACT)
}
```

# 参考
- [スパン - Android Developers](https://developer.android.com/guide/topics/text/spans?hl=ja)
- [HtmlCompatを使ってみる - Qiita](https://qiita.com/ikemura23/items/d4546ace79bf1a204d94)
複数の種類の例外を捕捉する

```py:1
import sys, traceback

number1 = 100
number2 = 'a'

print('strat')

try:
    answer = number1 / number2
    print(answer)
except ZeroDivisionError as e:
    print('0では割れません。')
    sys.stderr.write(traceback.format_exc())
except NameError as e:
    print('未定義の変数を呼び出しています')
    sys.stderr.write(traceback.format_exc())
except Exception as e:
    print('予期せぬエラーが発生しました。')
    sys.stderr.write(traceback.format_exc())
finally:
    print('end')
```

```:1の実行結果
strat
予期せぬエラーが発生しました。
end
```

```:1の実行時エラー
Traceback (most recent call last):
  File "Main.py", line 9, in <module>
    answer = number1 / number2
TypeError: unsupported operand type(s) for /: 'int' and 'str'
```
number2 = 'a'となっているので、
TypeErrorが発生している。

TypeErrorは
except ZeroDivisionError、
except NameErrorでは捕捉出来ないが、
except Exceptionで捕捉できる。

Exceptionは ZeroDivisionErrorやNameErrorのスーパークラスである。
逆を言うと、
ZeroDivisionErrorやNameErrorのサブクラスである。

Exceptionは全ての例外を捕捉できるが、、
サブクラスの方がより具体的な例外になっている。

複数の例外を捕捉する場合、
上から順番に該当するexceptブロックがないかチェックされる。
その為、
より具体的なサブクラスから記述する必要がある。

さもないと、
全ての例外を捕捉するexcept Exceptionブロックが、
より具体的に例外を捕捉できるサブクラスが動く前に、
例外を捕捉してしまう。

```py:2
import sys,traceback

number1 = 100
number2 = 0

print('start')

try:
    answer = number1 / number2
    print(answer)
except Exception as e:
    print('予期せぬ例外が発生しました。')
    sys.stderr.write(traceback.format_exc())
except ZeroDivisionError as e:
    print('0では割れません。')
    sys.stderr.write(traceback.format_exc())
except NameError as e:
    print('定義されていない変数を呼び出しました。')
    sys.stderr.write(traceback.format_exc())
finally:
    print('end')
```

```:2の実行結果
strat
予期せぬエラーが発生しました。
end
```

```:2の実行時エラー
Traceback (most recent call last):
  File "Main.py", line 9, in <module>
    answer = number1 / number2
ZeroDivisionError: division by zero
```
「0では割れません。」と出力させたかったが、
スーパークラスであるExceptionがどんな例外でも捕捉しまうので、
except Exceptionブロックが例外を捕捉してしまった。
RSpecでCould not find Firefox binary (os=macosx)というエラーが発生した件

## RSpecでAjaxのコードのテストを実行したら、以下のエラーが発生しました。

```bash
Could not find Firefox binary (os=macosx). Make sure Firefox is installed or set the path manually with Selenium::WebDriver::Firefox::Binary.path=
```

### 環境
Ruby: 2.6.3
Rails: 5.2.3

## 解決策
以下のコマンドを実行。

```bash
$ brew cask install --appdir="/Applications" firefox
```
インストールに時間がかかりますが、最後に以下のメッセージが出たら完了です。

```bash
firefox was successfully installed!
```
これでエラーが解消されるはず。


[参考記事](https://stackoverflow.com/questions/28130038/selenium-webdriver-cant-find-firefox-when-installed-with-homebrew-cask)
利用規約を全て読んだ上でチェックをしたら、ボタンをクリックさせる

## したいこと
よくサービスにある利用規約。
こちらを以下の条件を満たさないとボタンをクリックさせないようにしたい。

（条件）
・利用規約を全て読むこと（規約を読んだ分のスクロール量を取得）
・同意するのチェックボタンの押下していること

今後よく使いそうなのでメモ。

## ソースコード

``` html
<div id="agreeContents" class="p-agree-block">
　　本文本文本文本文本文本文本文本文本文本文本文本文
    本文本文本文本文本文本文本文本文本文本文本文本文...
  <div id="agreeEnd"></div>
</div>
<div class="text-center">
<div class="m-t-35 m-b-15">
  <div class="agree-check">
    <div class="border-checkbox-section">
<div class="border-checkbox-group border-checkbox-group-primary">
  <input class="border-checkbox" type="checkbox" id="checkbox1">
  <label class="border-checkbox-label" for="checkbox1">利用規約に同意する</label>
</div>
</div>
</div>
</div>
<div class="col-md-8 offset-md-2">
  <button class="btn btn-disabled btn-block" disabled="disabled" id="agreeButton" onclick="location.href='finance-matterLists.html'">
    利用を開始する
  </button>
</div>
</div>
```


``` javascript
"use strict";

$(function(){
  let scrollHeight,scrollPosition;
  const $Contents = $("#agreeContents");
  const $Button = $("#agreeButton");
  const $checkbox = $("#checkbox1");
  let checkboxFlag;
  let scrollFlag;
  let judge = () => {
    if(checkboxFlag && scrollFlag) {
      $Button.removeAttr("disabled");
      $Button.removeClass("btn-disabled");
      $Button.addClass("btn-primary");
    }else{
      $Button.attr("disabled");
      $Button.addClass("btn-disabled");
      $Button.removeClass("btn-primary");
    }
  }
  $Contents.scroll(function() {
    scrollHeight = $(this).get(0).scrollHeight;
    scrollPosition = $Contents.get(0).offsetHeight + $(this).scrollTop();
    if (scrollHeight <= scrollPosition ) {
      scrollFlag = true;
    }
    judge();
  });
  $checkbox.click(function() {
    checkboxFlag = $checkbox.get(0).checked;
    judge();
  });
});

```
負荷掛け用ツール(stress)


#stressコマンド

LinuxサーバでCPUやメモリ等の負荷掛けを実施したい際にコマンドを発行するだけで、特定のワークロードをかけることができるツール。
性能検証等で重宝しそう。yumでrpmとしてインストールしてもよいが、バイナリとして下記からダウンロードしたtarballをサーバに持ってきてコンパイルするという手もあり。

- ダウンロード先：https://src.fedoraproject.org/repo/pkgs/stress/stress-1.0.4.tar.gz/a607afa695a511765b40993a64c6e2f4/

下記を見るだけで大体何ができるのかはイメージが付きそう。

```ruby:HELP
# stress
`stress' imposes certain types of compute stress on your system

Usage: stress [OPTION [ARG]] ...
 -?, --help         show this help statement
     --version      show version statement
 -v, --verbose      be verbose
 -q, --quiet        be quiet
 -n, --dry-run      show what would have been done
 -t, --timeout N    timeout after N seconds
     --backoff N    wait factor of N microseconds before work starts
 -c, --cpu N        spawn N workers spinning on sqrt()
 -i, --io N         spawn N workers spinning on sync()
 -m, --vm N         spawn N workers spinning on malloc()/free()
     --vm-bytes B   malloc B bytes per vm worker (default is 256MB)
     --vm-stride B  touch a byte every B bytes (default is 4096)
     --vm-hang N    sleep N secs before free (default none, 0 is inf)
     --vm-keep      redirty memory instead of freeing and reallocating
 -d, --hdd N        spawn N workers spinning on write()/unlink()
     --hdd-bytes B  write B bytes per hdd worker (default is 1GB)

Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

Note: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).

```

CPUに負荷をかけたい場合は下記のように実行する。ワーカープロセスの数=負荷をかけるコア数を指定すること。

```ruby:CPU
#3コアフルに負荷をかけるコマンド
stress --cpu 3
```

メモリに負荷をかけたい場合は下記のように実行する。
ワーカープロセスの数あたり、どれだけメモリを占有(malloc)するかを基本的には指定する。
デフォルトだとメモリ獲得＆解放を繰り返すので、獲得した状態を暫く保ちたい場合は--vm-hangで秒数を指定する、または--vm-keepを指定。

```ruby:メモリ
#1ワーカープロセスがメモリ2Gの獲得/解放を繰り返す。
stress --vm 1 --vm-bytes 2G

#1ワーカープロセスがメモリ2Gの獲得して300秒待機、その後メモリを解放する。この動きを繰り返す。
stress --vm 1 --vm-bytes 2G --vm-hang 300

#1ワーカープロセスがメモリ2Gの獲得して、その後ずっと待機する。
stress --vm 1 --vm-bytes 2G --vm-keep
```

各オプションは組合せで利用することも可能。またタイムアウトを指定したい場合は--timeoutオプションで負荷掛けの秒数を指定するとOK。
Appleのサブスクリプションのプロモーションコードを使ってみた

iOSのアプリでサブスクリプションを実装したので、テストもかねてプロモーションコードを使ってみました。

# プロモーションコードとは
限られたユーザーにアプリや課金コンテンツを提供するための機能です。
デベロッパーサイトからコードを発行して、ユーザがそのコードを入力することで使用できます。

# 条件など
* アプリが公開されたあとで(デベロッパーによる公開待ちでも可)、App Store Connectから発行できます。
* アプリのバージョン毎に100個まで発行できます。
* アプリとは別にアプリ内課金の各アイテムのコードも発行できます。
* コードは発行してから4週間有効です。
* 1つのコードは一度のみ使用できます。
* コードの使用数は1月1日と7月1日にリセットされます。
* などなど

これを使えば、アプリ公開前に本番環境での動作確認が行えたり、特定のお得意様にアプリをプレゼントしたりできます。

# サブスクリプションのプロモーションコード
アプリのほうのプロモーションコードについては結構情報があったのですが、サブスクリプションのプロモーションコードについてはあまり見つけることができなかったので、使ってみました。

## 分かったこと
* 発行されたコードを使用すると、AppleIDに対して課金した状態になる。
* 購入状態にはるが、自動継続はOFFになっている。
* レシートを見た限り、通常の購入と同じ。
* 購読中の状態で同じアイテムのプロモーションコードを使用すると、アップグレード？クロスグレード？扱いになる。(※)

※レシートには、同じアイテムでも「"is_upgraded": "true"」が追加されるので、アップグレードを同じ動きをすると思われる。
つまり、購入が即日反映され、有効期限が更新される。
(例)
有効期限が1か月のアイテムAがあった場合、
1. 1月1日にプロモーションコードを使用してアイテムAを購入→有効期限は2月2日
2. 1月10日にプロモーションコードを使用してアイテムAを購入→有効期限は2月11日
よって、プロモーションコードをまとめて使用することはお勧めしません。
なお、最初の購入が通常の購入だった場合、残りの20日分はおそらく返金されるのではないかと思われますが、未確認です。

課金まわりの本番環境での確認(特にサーバでのレシートの検証など)はリリースしたアプリでないとできないので、有効に使えそうです。
実引数と仮引数

![hair_long_man_73,jpeg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563190/57470fa1-659a-6fbf-8dd9-cec0fa52a6e2.png)
　　　　　　　ザッキーさん
# rubyおさらい
Rails入る前の確認をしました。


引数と仮引数の関係ですが、
これを理解するにはスコープという概念を知る必要がありました。


変数は同じメソッド内でしか機能しない、ということです。


Rubyのコード画面は
「設定」の部分と「実行」の部分に大きく分けることができます。


要は、
設定と実行を行き来するために
設定側の仮引数と実行側の本引数を定義している、という理解ができました。


見た目が違っても、同じ返り値をもつものなのですね。
何がどこに入っているのかを矢印などで確認しながら学習するといいようです。


もっと自分の言葉で噛み砕いて
どんな背景をもった方にも説明できるようになりたい。
VBAからADOで接続してFileMakerからデータを持ってくる


## 概要
VBAでFileMakerのデータを扱いたかったのですが
**ODBCでエクセルメニューのデータ→外部データの取り込み**　
あたりの情報しか出てこずADOで接続しSQLでデータを抽出したかったので同じ悩みを抱えている方がいたらこの説明で助けになれば嬉しいです。

## 前提
[@tyuma](https://qiita.com/tyuma)さんがFileMakerのODBC設定について詳しく説明して下さっている
[【FileMaker】もうエクスポートはしない。ExcelからFileMakerのデータを持ってくる！](https://qiita.com/tyuma/items/d532009e0aac445efcdf)
の**[ODBCデータソース(DSN)を作成する]**までの作業が終わっている前提でご説明します。

VBAコードは下記のサイトを参考にしました。
[データベース（Oracle）に接続する（ODBC を使用）](https://excelwork.info/excel/databaseoracleodbc/)

## サンプルVBAソース

```vb
	Sub Sample_ODBC_oracle()
	    
	    Dim oraCon As ADODB.Connection
	    Dim oraRs As ADODB.Recordset
	    Dim constr As String
	    Dim strSQL As String
	    Dim col As Long
	    Dim row As Long
	    
	    Const DSN = "ODBC For Fm"                     'データソース名
	    Const USERNAME = "test"                       '接続するデータベースのユーザー名
	    Const PASSWORD = "test"                       'パスワード
	    
	    Set oraCon = New ADODB.Connection
	    
	    'データソース名を指定する
	    constr = "DSN=" & DSN
	    constr = constr & ";UID=" & USERNAME
	    constr = constr & ";PWD=" & PASSWORD
	    
	    oraCon.ConnectionString = constr
	    oraCon.Open
        
	    
    　  '※テーブル名やカラム名が日本語の場合はダブルコーテーション(")で囲わないといけないです
        '1、テーブルから全てのカラムのデータを取得
	    strSQL = "SELECT * FROM ""テーブル1"""

	    '2、結合して全てのカラムのデータを取得
	    strSQL = "SELECT * FROM ""テーブル1"" INNER JOIN ""テーブル2"" ON ""テーブル1"".""カラム1"" = ""テーブル2"".""カラム2"""

	    
	    Set oraRs = New ADODB.Recordset
	    oraRs.Open strSQL, oraCon
	    
	    With Worksheets("Sheet1")
	    
	        .Cells.Clear
	    
	        'フィールド名
	        For col = 0 To oraRs.Fields.count - 1
	            .Cells(1, col + 1) = oraRs(col).Name
	        Next col
	    
	        'レコード
	        Do Until oraRs.EOF
	            For col = 0 To oraRs.Fields.count - 1
	                .Cells(row + 2, col + 1) = oraRs(col).Value
	            Next col
	            row = row + 1
	            oraRs.MoveNext
	        Loop
	    
	    End With
	    
	    oraRs.Close
	    oraCon.Close
	    Set oraCon = Nothing
	    
	End Sub
```

FileMakerで作成した仮想テーブルも１、や２、のSQLと同じような書き方でデータを取得できます。

##注意点
ただ残念なことが1つ。FileMakerからデータを取得するにはデータを取得したいFileMakerのファイルを起動していないと取得することができません。
なのでFileMakerのファイルを暗号化したとしてもファイルを開いてからでないとVBAで取得できないので暗号化してもこのコードで問題ありません。
備忘録：「cookie &　セッション」

webサーバーとブラウザ間には、物理的な接続状態は存在しない。
一回のみのデータのリクエスト・レスポンスしかHTTPには存在しない
[]https://ips.nekotype.com/2441/
1.Cookie　とセッションの違い
ID・パスワード等、別の画面に偏移しても必要なデータ、その場合に使用されるのが、
Cookieやセッション。

・Cookie=webサーバーが発行、ブラウザが保持するキーと値
ブラウザは同じサイトにアクセスする際にはそのCookieをWeb サーバーに送信
webサーバーはブラウザからのリクエスト毎にその値を参照する事が可能

・セッション=webサーバーで保持するキー
IDやパスワードなどを毎回ブラウザから送信してはセキュリティ的にも問題
ログインアクションにより、webサーバー側ではセッションとして値を保持し、
ブラウザへはCookieを送信する。

ブラウザから再度アクセスがあれば、送信されたCookie情報を元にwebサーバーは
対応するセッション情報があるかを判断。


重要：Cookie＝ブラウザに保存される　セッション＝webサーバーに保存される
キーと値を持つデータ（＝ファイル）

２．CookieとセッションCookieの違い

Cookie＝ファイルとして保存しているので容易に参照可能。
　
セッションCookie＝ブラウザに保存
　然し、ファイルではなく、メモリーに保持している。
　そのため、セッションCookieはブラウザを閉じれば破棄される。
Cookieも有効期限はあるが、ブラウザを閉じてもなくならない。

一度ブラウザを閉じれば再度ログイン画面に戻る、といった動きに使用できる。

３．確認方法
Cookie：
　XP:\Documents and Settings\(ユーザー名)\Cookies
　Vista：C:\Users\(ユーザー名)\AppData\Roaming\Microsoft\Windows\Cookies
　等…

セッションCookie：
　
````
 javascript:document.cookie;
````

と入力。
そのサイトでセッションCookieを使用していれば確認可能。
ただし、CookieかセッションCookieかの判別は簡単にはにできない。
Cookieファイルにない情報が送信されていれば、それがセッションCookie
... :x001:

セッション：
　サーバー側にあるので開発者しか分からない。
phpの場合、デフォルトで
/var/lib/php/session
にファイルとして保存されている。


４．その他

セッション情報はサーバーにファイルとして保存されてしまう。
〜複数のwebサーバーで負荷分散している場合、別のwebサーバーにアクセスすれば
セッションは無い。
ロードバランサーで負荷分散している場合、注意が必要。

いち解決策、それぞれのwebサーバーにセッション情報を保存するのでなく、
データベースにセッション情報をもつということが考えられる。

ブラウザを閉じた場合、再訴ログイン画面に戻すことはセッションCookieで実現可能。

戻るボタンを押下した場合、エラーや不正なページ偏移として処理するには
ブラウザのキャッシュをOFFにする

[][参考：](https://ips.nekotype.com/2441/)
【マネジメント】CSFについて

CSFは「重要成功要因」ということはいろんなページに書いてあるが、
以下のページが一番わかりやすい。

https://www.unisys.co.jp/club/hint/wits/no01.html

https://saleshacks.digima.com/analytical-methods-for-critical-success-factor/
【Nuxt.js】ローカル環境をhttpsで起動する方法

# なぜこれが必要なのか
位置情報などを取得するGeolocationなど、http通信では動作しないものを動作させたい場合など。

# どうやってやればいいか
nuxt.jsの設定でやる方法と、外部サービスを利用する２パターンがあります。

- Nuxt.jsの設定でやる方法
- 外部サービス（ngrok）を利用する方法

## Nuxt.jsの設定でやる方法
### 実行環境
- @nuxt/cli v2.8.1
- macOS Catalina(v10.15.2)
- パッケージ管理はyarn

### 自己署名入り証明書の作成
[mkcert](https://github.com/FiloSottile/mkcert)を使って、オレオレ証明書を作成します。（コマンド内容は割愛）

```
$ brew install mkcert
$ mkcert -install
$ mkcert localhost
```

上記手順で、以下の証明書が発行されます。

- localhost.pem
- localhost-key.pem

### 起動設定にhttpsの起動設定を追加

nuxt.config.jsに、先程作成した証明書を設定します。
Ref：[公式ドキュメント - serverプロパティ(HTTPS設定)](https://ja.nuxtjs.org/api/configuration-server/#https-%E8%A8%AD%E5%AE%9A%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E4%BE%8B)

- importの追加
- serverプロパティにhttpsのプロパティを追加して、発行した証明書を設定する

```js:nuxt.config.js
import path from 'path'
import fs from 'fs'

export default {
server: {
    port: 3000,
    host: "0.0.0.0",
    https: {
      key: fs.readFileSync(path.resolve(__dirname, "localhost-key.pem")),
      cert: fs.readFileSync(path.resolve(__dirname, "localhost.pem"))
    },
    // 以下その他設定...
}

```

### 起動
この状態で 

```
$ yarn run dev
```
とすればhttpsでローカル環境が起動します。

## 外部サービスを利用する方法

設定周りをいじらなくても、[ngrok](https://ngrok.com/)というサービスを使うと、ローカル環境をhttpsで公開してくれます。便利！

利用方法は以下のブログが詳しく説明されています（外部リンク）
[ngrokを使ってローカル開発中のVueアプリをHTTPSで公開する](https://dev.classmethod.jp/client-side/vue/ngrok-vue/)
高いバイオリンを買いました。

#少し高いバイオリンを買いました！！#
<img width=50% alt=IMG_20200114_152058.jpg src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371781/60e0134c-53c6-a3ff-ebbb-8112e1d91024.jpeg>

あ、右がちょっといいやつね。(7万円)
左の今まで使っていた1万円前後のやつです。

##高いバイオリンと安いバイオリンの違い##
+ 音の出やすさが違う
+ 各部がしっかり作られているのでチューニングがしやすい
+ 経年による音の劣化が少ない(らしい？)
+ <font color="red">なにより音の質が違う</font>

##音が違う。どれくらい違う？##

と、ここまでだと完全に音楽ポエムになるわけですが、実際のところどれくらい音が違うんですかね？
弾き比べた感じ、耳で感じる音はしっかり違いが確認できました。
というか、Dの開放弦の明るさと色合いに惚れて買ったので……
   
***
   
じゃあ、実際にFFT(高速フーリエ変換)で周波数を見て、2つの楽器の音を比較してみようと思うわけです。
   
プログラムは、昔に作った[T-falリアルタイム測定](https://qiita.com/ac-yasushi/items/19bab66abc13a1c2011b)からほとんどコピーして持ってこられる。
   
楽器はどちらもセットなので付属の弓と松脂を使用。3秒間、各開放弦を録音します。開放弦は低いほうからG→D→A→Eとなっています。
   
***
###結果###

以下のグラフでは青色が1万円、オレンジが7万のやつです。

まずはG弦の比較。(なんかチューニングズレてな～い？？？？)
![G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371781/20e94eea-739d-7f97-af34-602b63a25788.png)
D弦
![D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371781/2157292d-53e6-518f-554b-b0fd28efb9a8.png)
A弦
![A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371781/deba069a-f5d9-7c83-a433-560c9c39f00c.png)
E弦
![E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371781/b3c33481-0108-a11c-4f68-21b2d775b35b.png)

###考察###
傾向としては高いバイオリンの方が

+ 含まれる周波数が多い
+ 単一の周波数が突出せず、いくつかの周波数が混和している

よく楽器解説のHPで言われている響きの違いとか、音質の違いがこの周波数の分布の違いになるわけですね。
今回はD弦とA弦がとても明るい音質で気に入ったので購入したのですが、実際にその部分を見てみると低周波数から開放弦付近の周波数にかけて綺麗に強度が分配されていることが分かりますね。
一方で、安いほうは開放弦付近の周波数に突出して分布が見られます。よく言われている、バイオリンの音が出るだけの楽器と言われているのは事実だったのか……

購入店で試奏をした感じではもっと重たい/暗い音質のものもあったので、それだと低周波数域での分布が厚いのかもしれません。

##結論##
買ってよかった！！！！

###反省###
録音がクッソ掠れてしまった。賃貸で思い切り弾く度胸が起きなかった……
あと、マイクの位置もテキトーだったのはよくないですね。でも、これはポエムだからやり直しはしないよ！
ONNX RuntimeをJetson TX2にビルドしたメモ

# 概要
- [公式のビルドガイド](https://github.com/microsoft/onnxruntime/blob/master/BUILD.md)を見ながら導入しようとしたときにいろいろ躓いたのでメモ
- クロスコンパイルの方はどうにもうまくいかなかったので、Jetson TX2側でやる

## cmakeのインストール(>=3.13)、ついでにpip最新化

最近のLinux系なら、たいていパッケージマネージャーに登録されてる`python3-pip`が入ってるはず。
これはこれで便利なんだけど、自分自身が結構な確率でうっかり`sudo pip3 install -U pip`とかやらかして環境壊す残念なタイプという………
なので、`cmake`を入れ替えるついでに`pip`も入れ替えてしまう。

`cmake`内蔵の`curl`のバグ？で本体ビルド時に引っかかったので、OS側のを使うようにしておくのが無難っぽい。

``` bash
sudo apt remove python3-pip cmake -y
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 ./get-pip.py

sudo apt install -y libcurl4-openssl-dev libhdf5-dev

tar zxvf cmake-3.15.4.tar.gz
cd cmake-3.15.4

./bootstrap --system-curl
make -j$(nproc)
sudo make install

cmake --version
```

### 依存関係のインストール

入れていないとwheel作成時にエラー  

- scipyの最新は手持ちの環境だとエラー、1.2.1だと通った

```bash
sudo apt install libprotobuf-dev protobuf-compiler

sudo pip3 install -U cython codecov jinja2 numpy onnx onnxmltools packaging pandas protobuf pytest pytest-cov scikit-learn scipy==1.2.1 six sympy wheel sphinx sphinx_gallery sphinx_modern_theme
```

## ビルド

とりあえず最新バージョンを持ってくる。
うっかりrecursiveつけ忘れると、サードパーティが引っ張られないので哀しいことになる（なった

``` bash
git clone --recursive https://github.com/microsoft/onnxruntime.git -b v1.0.0 --depth 1
```

### ビルド設定の編集
  - L430付近にある`CMAKE_CXX_FLAGS`と`CMAKE_C_FLAGS`の`-Wall`を削除
  - L441近辺にある`HAS_UNUSED_PARAMETER`と`HAS_UNUSED_BUT_SET_VARIABLE`を含む行のコメントアウト
  - L595近辺の`CMAKE_CUDA_FLAGS`でM seriesの箇所をコメントアウトして以下の内容追加

```cmake
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -gencode=arch=compute_53,code=sm_53") # Jetson support
```

Warnでビルドエラーにされるの回避＋CUDA有効化するときのJetsonのモデル追加なので、2つめはいらないかもしれない

### ビルド実行

- まずは普通にビルド（そしてエラー

```bash
./build.sh --config MinSizeRel --parallel --cudnn_home /usr/lib/aarch64-linux-gnu/ --cuda_home /usr/local/cuda/ --use_tensorrt --tensorrt_home /usr/src/tensorrt/
```

- ここでしばらくエラーとくんずほぐれつしてた
- onnxruntimeでTensorRT使う場合は3～4が必要（？
  - チケットざっと見る限り、5系はサポートまだっぽい
  - <https://github.com/onnx/onnx-tensorrt/issues/197>

- 仕方ないのでTensorRTを外し、ついでにwheelまで作る

```bash
# ./build.sh --config MinSizeRel --parallel --build_wheel --cudnn_home /usr/lib/aarch64-linux-gnu/ --cuda_home /usr/local/cuda/ --use_tensorrt --tensorrt_home /usr/src/tensorrt/
./build.sh --config MinSizeRel --parallel --build_wheel --cudnn_home /usr/lib/aarch64-linux-gnu/ --cuda_home /usr/local/cuda/
```

- ここまで来るとwheelファイルができてるので、あとはpipでよしなにする
- python3上でお試しimportして、version確認できればOK
初心者による ファイルアップロードの扱い

#概要
ファイル選択ボックスから、指定されたファイルの情報を取得する。これにはfileプロパティをつかう。

```html:sample.html
<form>
 <label for="file">ファイル：</label>
 <input id="file" name="file" type="file" multiple />
</form>
```

```javascript:sample.js
//windowオブジェクトを使う
window.addEvenetListener('DOMContentLoaded', function() {
 //changeイベントはeを引数に入れる
 document.getElementById('file').addEvenetListener('change', function(e) {
  //filesプロパティ
  let inputs = document.getElementById('file').files
  for(let i = 0,len = inputs.length; i < len; i++){
   let input = inputs[i]
   console.log('ファイル名： ' + input.name)
   console.log('種類： ' + input.type)
   console.log('サイズ：'  + input.size / 1024 + 'KB')
   console.log('最終更新日：' + input.lastModifiedDate)
  }
 }, true)
})
```
fileプロパティはアップロードされたファイル群(fileListオブジェクト)を返します。
fileオブジェクトで利用できるプロパティは、

```
name : ファイル名
type : コンテンツタイプ
size : サイズ(バイト単位)
lastModifiedDtate : 最終更新日
```

#FileReaderオブジェクト
fileReaderオブジェクトを利用することで、取得したfileオブジェクトの内容を読み込みことができる。

```javascript:sample.js
reader.readAsText(file[, charset])
 //reader : fileReaderオブジェクト　file : 読み込むファイル charset : 文字コード
```

##テキストファイルの内容を取得する

```html:sample.html
<form>
 <label for="file">ファイル：</label>
 <input id="file" type="file" />
</form>
<hr />
<pre id="result"></pre>
```

```javascript:sample.js
window.addEventListener('DOMContentLoaded', function() {
 document.getElementById('file').addEvenetListener('change', function() {
  //実際は１つでも配列のように扱う
  let input = document.getElementById('file').files[0]
  //FileReaderオブジェクトを生成
  let reader = new FileReader()
  //定義
  reader.addEvenetListener('load', function() {
   document.getElementById('result').textContent = reader.result
  }, true)
  //呼び出し(ファイルの呼び出し)
  reader.readAsText(input, 'UTF-8')
 }, true)
})
```
読み込んだテキストはFileReader.resultプロパティでアクセスできます。なお、reader.readAsTextメソッドでファイルの読み込みを開始する。

##ファイル読み込みに失敗した場合
FileReaderオブジェクトでは、errorイベントリスナーを設定しておくことで、エラー処理をすることができる。エラー原因はreader.error.messageプロパティにアクセスすることで、確認することができる。

```javascript:sample.js
reader.addEventListener('error', function() {
 console.log(reader.error.message)
}, true)
```

##バイナリファイルの内容を取得する
バイナリファイルを読み込むには、readAsTextの代わりにreadAsDataURLメソッドを利用する。これによってバイナリファイルをData URLという形式で取得できます。Data URLとは、URLに直接、画像/音声等のデータを埋め込むための表現でい一般的には、

```
data:[コンテンツタイプ][;base64],データ本体
```

Data URL形式のデータは、img要素のsrc属性やa要素のhref属性にそのまま埋め込むことができるので、データをいちいちファイルとして保存する必要がありません。

```html:sample.html
<form>
 <label for="file">ファイル：</label>
 <input id="file" name="file" type="file" />
</form>
<hr />
<img id="result" />
```

```javascript:sample.js
window.addEvenetListener('DOMContentLoaded', function() {
 document.getElementById('file').addEvenetListener('change', function(e) {
  let input = document.getElementById('file').files[0]
  let reader = new FileReader()
  reader.addEvenetListener('load', function(e) {
   document.getElementById('result').src = reader.result
  }, true)
  reader.readAsDataURL(input)
 }, true)
})
```
これで読み込んだ画像ファイルを出力することができるようになった。またAjaxを用いることによって、データベースに保存することもできる。

#参考資料
山田祥寛様　「javascript本格入門」
Ruby｜クラスメソッド内の super について

# はじめに

本稿は `super` について書いています。普段はインスタンスメソッドで `super` を利用するシーンがあると思いますが、クラスメソッドだと混乱することがあったのでまとめになります。

# super is 何？

`super` をメソッドで呼び出すと、親クラスにある同名のメソッドを呼び出します。メソッドがなければ例外を起こします。

```ruby
class Parent
  def do(something)
    p something
  end
end

class Child < Parent
  def do
    super('something')
  end
end

c = Child.new
```

インスタンスメソッドだと、`ancestors` を使えばどのように探索をするかヒントになります。先の例だと `Child` クラスの継承関係に `Parent` クラスがあるので、そこからメソッドを探すことが出来ています。

もし、期待するメソッドが `Parent` クラスになければ更に親のクラスを探索します。さらに親の `Object` クラスを探索してなければ、`Kernel` クラスを探索します。最後は `BasicObject` クラスですね。

```ruby
p Child.ancestors
#=> [Child, Parent, Object, Kernel, BasicObject]
```

# ハマったこと

仕事で pundit の中を調査することがあり、次のような記述を見つけました。`included` はモジュールがインクルードされたときのコールバックで `base` クラスに対して更に拡張をする場合（クラスメソッドの追加など）によく使われます。

```ruby
module PolicyExampleGroup
  include Pundit::RSpec::Matchers

  def self.included(base)
    base.metadata[:type] = :policy
    base.extend Pundit::RSpec::DSL
    super # これ
  end
end
```

さて、この `super` はどのクラスで定義している `included` メソッドでしょうか。はじめは `ancestors` で調べればわかると思っていたのですがモジュールは親クラスを持たないのです。。。それでも例外にならない、なぜ？ :thinking: 

```ruby
p Pundit::RSpec::PolicyExampleGroup.ancestors
#=> [Pundit::RSpec::PolicyExampleGroup]
```

Ruby はクラスメソッドは特異クラスに定義されているので、クラスメソッドで `super` を使うと探索は特異クラスの継承関係で行われます。

:warning: 見つける対象になるメソッドはインスタンスメソッドであることに注意

```ruby
p Pundit::RSpec::PolicyExampleGroup.singleton_class.ancestors
#=> [#<Class:Pundit::RSpec::PolicyExampleGroup>, Module, ..., Kernel, BasicObject]
```

今回は `Module` クラスにあるインスタンスメソッドにマッチしたのでそれが実行されています。オーバーライドしなければ `nil` を返すだけのメソッドなので削除しても良さそうですね :thinking: 

ひとまず、拙い英語で pull request を作成しましたがどうなることやら。。。 :eyes:  

https://github.com/varvet/pundit/pull/635

2022/10/22 更新

Varvet の方からコメントをもらいました。`Module#included` が何もしないという共通認識は得られたんですが、リリースしてから長く時間がたったのでこの `super` に依存してるものがあるかもしれないということで PR はクローズになりました。

ちょっと残念でしたが、まあしょうがないですよね :wink: