OmniAICreator/Qiita-1.07M huggingface dataset:
<input type="file">で指定したファイルをAxiosを使ってS3の署名付きURLへファイルをアップロードする

## 概要

`<input type="file">`で指定したファイルをAxiosを使ってS3の署名付きURLへファイルをアップロードする。


## 実装

```javascript
var a = $('input[type="file"]')
var reader = new FileReader()
reader.readAsArrayBuffer(a.files[0])

// アップロード用の署名付きURL
var url = 'https://test-pre-signed-url-bucket.s3.amazonaws.com/put/update?...略...'
axios({
    method: 'PUT',
    url: url,
    headers: {
        'Content-Type': 'image/*', // アップロードしたいファイルに合わせる
    },
    data: reader.result // reader.readAsArrayBuffer(a.files[0]) した結果が取得できる
    })
```

## エラー時対応

### CORSのエラーになる場合

`S3 > バケット選択 > アクセス権限 > CORSの設定`

を行う必要がある。


### 403が返ってくる場合

S3の署名バージョンを4にする必要がある。

```python
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))

# Generate the URL to get 'key-name' from 'bucket-name'
url = s3.generate_presigned_url(
    ClientMethod='put_object',
    Params={
        'Bucket': 'bucket-name',
        'Key': 'key-name'
    }
)
```

参考

* [Node.jsで発行したS3の署名付きURLへアップロードすると403エラーになる](https://qiita.com/segur/items/7746ac352afb5152cf46)
* [Boto3公式](https://boto3.amazonaws.com/v1/documentation/api/1.9.42/guide/s3.html#generating-presigned-urls)
AHC task (1)　CSVファイルの読み込み

csvファイルで用意した刺激を読み込む際のコード


```python:encodecsv.py
import csv

f = open('stimuliSet1.csv', encoding = 'utf-8_sig')
reader = csv.reader(f)

for row in reader:
   print(row)

f.close()

```
Rails destroyすると意図しないidが最小のデータが消える

# 凡ミスの備忘録的に残す

## 発生したこと

agathaテーブル

| id | name |
|:-----------------|:-----------------|
|1| オーエン夫妻 |
|2| エミリー・キャロライン・ブレント |
|3| トマス・ロジャース |
|4| ジョン・ゴードン・マッカーサー |
|5| エセル・ロジャース |
|6| アンソニー・ジェームズ・マーストン |

このようなテーブルがあって、id=6の削除を行った。(つもり)

```rb

  christie = Agatha.find_by(6)
  christie.destroy
  // => id:1のオーエン夫妻が削除される。
```

思い通りの結果にならない。なぜ。。

## SQLみたら判明した

`christie = Agatha.find_by(6)`で実行されるSQLは以下だった。

```sql
SELECT `agathas`.* FROM `agathas` WHERE (6) LIMIT 1
```
WHERE句が意味を成さないので、これで取得できるのはid=6のデータではなく、なんか1件だけ取得する。
今回だとidが最小のデータだった。

## 間違いを修正

`find(6)`もしくは`find_by(id: 6)`すべきところをミスってた。

```rb

# christie = Agatha.find_by(6)
  christie = Agatha.find(6)
  christie.destroy
```

無事、id=1のアンソニー・ジェームズ・マーストンが消えた。
これで物語どおりである。
floatプロパティの理解度を上げる

#floatプロパティーとは！？
横並びにできるCSSに打ち込むもの
なので右寄せ、左寄せなど自分が指定した場所に移動ができる！！
#しかし、落とし穴あり😭
実際に使用すると指定した場所が「浮いて」しまい枠が小さくなり、要素が回り込むという事態に！
#その様な場合の対処法
clearfixを入れることにより解決！
↓こんな感じに！（このまま暗記してもいいとのこと！）
clearfix::after {
  content: "";
  clear: both;
  display: block;
}

#clearfixの使い方について
floatの副作用を解決したい部分の親要素にclearfixクラスを付けるだけ！
SAS言語備忘録_縦持ちから横持ちへ

#transposeを知らなかった自分
縦持ちデータを横持ちデータに変換したいニーズがあり当初はExcelVBAで実現したものの、組織の標準ソフトであるSASで実現した時の話です。
当時はproc transposeを知らずsortからのretainで追番振ってデータセットを追番の最大値の数だけ分割してひたすらマージという初心者ムーヴっぷり。
自戒のためにも晒しておきます。

```sample.sas
data WORK.NUMBERING;
	set WORK.DATA;
	by KEY;
	retain NO;
	if first.KEY then NO = 0;
	NO + 1;
run;

proc means data=WORK.NUMBERING max noprint;
	var NO;
	output out=WORK.MAX MAX=MAX;
run;

data _null_;
	length MAX 8;
	set WORK.MAX;
	call symputx("MAX",MAX);
run;

%macro test(num);
	data WORK.DATA&num.;
		set WORK.NUMBERING;
		if NO = &num. then output;
	run;
%mend test;

%macro test2(num);
	proc datasets library=WORK nolist;
		modify DATA&num.;
		rename KNJ = KNJ_&num. NO = NO_&num.;
	quit;
%mend test2;

%macro make_data;
	%do i=1 %to &MAX.;
		%test(&i.);
		%test2(&i.);
	%end;
%mend make_data;

%make_data;

data WORK.M_DATA1;
	merge WORK.DATA1
		  WORK.DATA2;
	by KEY;
run;

%macro merge_data;
	
	%do j=2 %to %eval(&MAX.-1);

		data WORK.M_DATA&j.;
			merge WORK.M_DATA%eval(&j.-1)
				  WORK.DATA%eval(&j.+1);
			by KEY;
		run;

	%end;

%mend;

%merge_data;

data WORK.COMP_DATA;

	set WORK.M_DATA%eval(&MAX.-1)(drop=NO_1);	

run;

%macro drop_no;

	%do k=2 %to &MAX.;

		data WORK.COMP_DATA;
			set WORK.COMP_DATA(drop=NO_&k.);
		run;

	%end;

%mend;

%drop_no;
```
docker/docker-compose：networkの接続方法備忘録

別々のdocker-compose.ymlで管理していてコンテナから別のコンテナに繋ぎたい場合、ネットワークを接続してあげる必要がある。その備忘録


# 手順

- `docker network ls`で入りたいネットワーク名を確認
- docker-compose.ymlにネットワーク名を指定する


```shell
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
91439b39824c        ネットワーク名          bridge              local
```



# サンプルコード
```yaml:docker-compose.yml
version: "3"
services:
省略
networks:
  default:
    external:
      name: ネットワーク名

```
Chrome DevToolsでconsole.log()が出ない場合

## 前提

- Google Chrome 79.0.3945.130
    - なお94.0.4606.71でも変わってなかった

## DevToolsで確認したかった

ちょっとした処理を実行する際、scriptタグ内や.jsファイル内に書いて実行するより心理的ハードルが低いDevToolsのConsoleで実行することがあると思います。
今回実行したのは以下のようなコードでした。

```javascript:Console
console.log('hello, world');
<- undefined
```

## あれ？undefinedだけ？

狙ってたのはこういう出力なのに、何故か表示されない。どうして？？

```javascript:Console
console.log('hello, world');
hello, world
<- undefined
```

小一時間頭を抱えたので原因をさらしときます。

## 原因1：左ペインがエラーのみになっている

![a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526492/c40aa38d-9908-e95b-1c4e-2af1ef028406.png)

入力する右ペインしか見ていないと気付きづらいですが、左ペインで表示するメッセージの種類を切り替え可能になってます。
エラーのみ表示の場合、infoレベルであるconsole.log()は出力されません。
「messages」「user messages」「info」のいずれかに切り替えると表示されます。
面倒ならmessagesにしておけばどのレベルのメッセージも表示されるのでOK。

## 原因2：Filterが有効になっている

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526492/c5897d31-7f38-faa5-de89-06a9a14aef9d.png)


切り替えても表示されない場合、表示欄の上にある「Filter」テキストボックスに何らかの値が入力されていないか確認しましょう。
一度Filterを使用すると、閉じて再度開こうが、別のページで開こうが、しつこく覚えています。
おまけにFilterを入力していないときは```Filter```と表示されているため、何か入力してあっても無意識のうちに無視しがち。
Filterは全てのログレベルで有効なので、原因1で切り替えても表示されないときはここを疑いましょう。
【AWS】【SAA対策】CloudFront

# Cloud Front
## サービス概要
ユーザーへの静的および動的ウェブコンテンツ (.html、.css、.js、イメージファイルなど) の配信を高速化するウェブサービスであり、CloudFront ではエッジロケーションと呼ばれるデータセンターの世界規模のネットワークを通じてコンテンツが配信される。
CloudFront を使用して提供されているコンテンツをユーザーがリクエストすると、そのユーザーはエッジロケーションにルーティングされ、最も低いレイテンシーが提供されるため、最高のパフォーマンスで配信が可能。

## 特徴
- コンテンツがエッジロケーション内に最も低いレイテンシーで既に存在している場合、CloudFront はそのコンテンツを即時に配信する。
- コンテンツがそのエッジロケーションに存在しない場合、CloudFrontは、コンテンツの最終バージョンのソースとしてAWSユーザーが特定したS3バケット、MediaPackageチャネル、HTTP サーバー (たとえば、ウェブサーバー) などの、AWSユーザーが定義したオリジンからコンテンツを取り込む。
- ファイルのコピーが世界中の複数のエッジロケーションに保持される (つまりキャッシュされる) ため、信頼性と可用性の向上も得られる。
- Lambda@Edge
 - Lambda の拡張機能で、CloudFront が配信するコンテンツをカスタマイズする関数を実行できるコンピューティングサービス。
 - 署名付きの URL や署名付きの Cookie を使用するオプションとして、独自のカスタムオリジンからプライベートコンテンツを供給する CloudFront ディストリビューションを設定するのに役立つ。
 - US-East-1 (バージニア北部) リージョンで作成した Node.js または Python 関数を、サーバーのプロビジョニングや管理の必要もなく、世界中のビューワーの最寄りの AWS のロケーションで実行可能。
 - Lambda@Edgeのトリガーをビューワーリクエストに設定すると、ビューワーからリクエストがある度にLambdaが起動。キャッシュがある場合に起動させたくない場合はトリガーをオリジンリクエストに設定。
- オンデマンドおよびライブストリーミングビデオの供給
 - オンデマンドストリーミングで CloudFront を使用して、MPEG DASH、Apple HLS、Microsoft Smooth Streaming、CMAF などの一般的な形式であらゆるデバイスにストリーミング可能。
 - ライブストリームをブロードキャストする場合は、フラグメントを正しい順序で配信するマニフェストファイルに対する複数のリクエストを結合して、オリジンサーバーの負荷を軽減できるように、メディアフラグメントをエッジにキャッシュすることができる。
- CloudFront を使用して HTTPS を設定する場合、既にオリジンサーバーへのセキュアなエンドツーエンド接続が存在します。フィールドレベルの暗号化を追加する場合、HTTPS セキュリティに加えて、システムの処理中に特定のデータにオリジンの特定のアプリケーションのみがアクセスできるように、そのデータを保護できる。
- 署名付きURL
 - 有効期限切れ日時など、追加の情報も含まれており、コンテンツへのアクセスをより詳細に制御できる。
 - 署名付きURLで制限を指定するJSON形式のポリシーステートメントを作成する。既定ポリシーまたはカスタムポリシーのいずれかを使用する。
 - カスタムポリシー・・・ユーザーがコンテンツへの①アクセスを開始できる日時②アクセスできなくなる日時③アクセスできるユーザーの IP アドレスまたは IP アドレス範囲を指定できる。URL が長くなる。
 - 規定ポリシー・・・ユーザーがコンテンツにアクセスできなくなる日時を指定できる。
- 暗号化
 - **ビューワーと CloudFront 間** ・・・ビューワーと CloudFront との間で HTTPS を必須にするかどうかを選択する場合、「ビューアープロトコルポリシー」で該当する値を指定。HTTPS 接続に使用するために必要な CloudFront の下記のセキュリティポリシーも選択。
 - 1.ビューワーと通信するために CloudFront が使用する最低限の SSL/TLS プロトコル。
 - 2.ビューワーに返すコンテンツを暗号化するために CloudFront で使用できる暗号。

 - **CloudFront とオリジン間** ・・・ CloudFront とオリジン間で HTTPS が必要な場合には、CloudFront とオリジンの通信に使用されるプロトコルも選択。選択したプロトコルは、CloudFront に返すコンテンツを暗号化するためにオリジンがしようできる暗号化方式を決定する。

## ベストプラクティス
- CloudFrontキャッシュに保持する時間はTTL値で制御が可能。期間を長くすると、その間はオリジンにファイルを取りに行かないため、パフォーマンス向上とオリジンの負荷軽減になる。もしTTLを0秒にした場合は常にオリジンからの最新コンテンツであることを確認するような動作となる。
- CloudFrontにおいて、S3バケットのコンテンツに対して、アクセスを制限するためには、Origin Access Identity(OAI)を作成し、S3バケット内のオブジェクトへのアクセスをそのOAIのみに許可する。=まずCloudFrontの署名付きURLまたは署名付きCookieを作成し、S3バケットのファイルへのアクセスを制限する。次にOrigin Access Identity(OAI)という特別なCloudFrontユーザーを作成して配布に関連付け、CloudFrontがOAIを使用することで、直接URLを使用してもファイルにアクセスできなくなる。
- http://example.com/index?language=en のようなHTTP領域区別の場合、クエリ文字列パラメーター値に基づき言語決定する構成とすることで、地域ごとに言語を変えたWEBサイトの構成が可能となる。

## 参考例
## 用語
Arduinoを用いたArduinoへのプログラム～Arduino as ISP

#概要
Arduino as ISP　のAVRへの書き方の説明はおおいですが、Arduinoへの使い方の説明が少なく、ちょっと試行錯誤してしまったのでメモを残します。

#いろいろやってうまく行かない人へ
私は全然うまくいかなくて悩んだ結果、
CTRL+Shift+U で書き込む（<font color="red">Shiftが大事！！</font>）
または、<font color="red">「スケッチ」リボン－＞「書き込み装置を使って書き込む」</font>で実行してみてください。

#書き込み装置
通常時　－＞[ AVRISP mkⅡ]　（忘れてしまうので一応）
Arduino as ISP使用時　－＞　[ Arduino as ISP ]

#配線
|Programmer |Target  |
|---|---|---|--- |
|5V  |5V  | 
|GND |GND  |
|10|RESET|
|13|13|
|12|12|
|11|11|

Programmerのpin9にLEDを繫ぐと光が、強くなったり弱くなったりハートビートしてます。
Errorで失敗すると、強いままで停止します。そのときはProgrammer側のRESETをした方が良いです。

#ボード
Targetのボードの種類にしてください

#エラー
```
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
```
このエラーが出る場合、CTRL+Shift+U で書き込むとうまくいくかも知れません

「ボードへの書き込みが完了しました」は出るが、うまくいかない
Programmer側に書き込まれている可能性が高いです。

```
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.


avrdude: Expected signature for ATmega328P is 1E 95 0F
         Double check chip, or use -F to override this check.
```
このエラーは配線が間違っているか、供給電源が足りていない時に起きました。
書き込みの10をターゲットのResetにつなぐべきなところを、逆にして失敗しました。
また、ACアダプターをつなぐとうまくいった場合がありました。

ターゲットに書き込まれているプログラムが邪魔をしている可能性があるので、「ブートローダーを書き込む」をやり直すとうまくいく場合がありました。
書き込み機に「ArduinoISP」を書き直すのもいいかもしれません
【Python】カラーマップの基準を調整

# まとめ

- `matplotlib.colors.DivergingNorm`
- ログスケール：`matplotlib.colors.LogNorm`
- symlog：`matplotlib.colors.SymLogNorm`
    - この場合vmin == vmaxにしないと基準点がズレる





# 問題

```Python
import numpy as np
import matplotlib.pyplot as plt

np.random.seed( 1 )
arr = np.random.uniform( -20.0, 100.0, (3,4) )
plt.imshow( arr, cmap='bwr' )
plt.colorbar()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270660/52b0bbf1-c6d6-90b9-7e24-02794a3b8dde.png)


の図で0と白（カラーマップの基準点）を一致させる



# 解決策

## `matplotlib.colors.DivergingNorm`の利用

[matplotlib: matplotlib.colors.DivergingNorm](https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.colors.DivergingNorm.html)

```Python
import matplotlib.colors as mcolors
norm = mcolors.DivergingNorm( vcenter=0.0, vmin=-20.0, vmax=100.0 )
plt.imshow( arr, cmap='bwr', norm=norm )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270660/0373b56b-3e3f-4240-19b5-0a273fb08d53.png)




## symlogには`matplotlib.colors.SymLogNorm`

[matplotlib: matplotlib.colors.SymLogNorm](https://matplotlib.org/3.1.3/api/_as_gen/matplotlib.colors.SymLogNorm.html)

```Python
import matplotlib.colors as mcolors
norm = mcolors.SymLogNorm( linthresh=1.0, linscale=1.0, vmin=-100.0, vmax=100.0 )
plt.imshow( arr, cmap='bwr', norm=norm )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270660/f8bf5d7e-9bb9-c4ee-e35e-6a30f1d74e6c.png)

但し，`vmin=-20.0`とすると白の位置が0からズレる（下図のカラーバーに注目）：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270660/32467dbf-8125-7e86-f26b-df046c1b4160.png)

→`vmin=-20.0`にこだわるのであれば，配列を＋と－の2回に分けて描画する必要がある？



# 参考

[stackoverflow: Defining the midpoint of a colormap in matplotlib](https://stackoverflow.com/questions/7404116/defining-the-midpoint-of-a-colormap-in-matplotlib/20528097)
TomcatでCould not publish server configuration for Tomcatとなった時の対応方法

# 事象 : Tomcatでデバックしようとしたらエラーメッセージが出て動かなかった

- 環境
    - CentOS Linux release 7.7.1908 (Core)
    - Tomcat 8.0.21
    - Eclipse IDE for Enterprise Java Developers.Version: 2018-12 (4.10.0)

```text
Could not publish server configuration for Tomcat v8.0 Server at localhost.
Multiple Contexts have a path of "/ponsuke-app".
```

## 原因 : server.xmlに同じ実行パスが重複して定義されているから

- 参考 : [Eclipse/エラー：Could not publish server configuration&nbsp;|&nbsp;Tipi](http://wikis.sakura.ne.jp/tipi/?Eclipse%2F%A5%A8%A5%E9%A1%BC%A1%A7Could%20not%20publish%20server%20configuration)
- server.xmlの場所 : {Eclipseのワークスペース}/Servers/Tomcat v8.0 Server at localhost-config/server.xml

まったく同じ`<Context>`2行ある・・・
デバックする前にうっかりデプロイされているアプリを削除しようとしてキャンセルした・・・からこうなった？

```xml
        <Context docBase="ponsuke-app" path="/ponsuke-app" reloadable="true" source="org.eclipse.jst.jee.server:ponsuke-app"/>
        <Context docBase="ponsuke-app" path="/ponsuke-app" reloadable="true" source="org.eclipse.jst.jee.server:ponsuke-app"/>
      </Host>
    </Engine>
  </Service>
```

### 対応 : 1つを削除する
1. 重複している片方をserver.xmlから削除して保存する
2. Eclipse上でTomcatをクリーン
3. 無事デバック実行
【Nuxt.js】vee-validate を使って、フォームのバリデーション実装をする

### 概要
- `vee-validate`ライブラリを使って、フォームのバリデーション実装をする
- `vee-validate`は以下を参照にインストール
    - [VeeValidate](https://logaretm.github.io/vee-validate/)


### 実際に書いたコード

- `vee-validate.js`に設定を記載

```javascript:vee-validate.js
import Vue from "vue"
// 使用する機能
import {
  ValidationProvider,
  ValidationObserver,
  localize,
  extend
} from "vee-validate"

// エラーメッセージの日本語化用
import ja from "vee-validate/dist/locale/ja.json"

// 使用するvalidate rule
import { required, max, email, numeric, regex } from "vee-validate/dist/rules"
extend("required", required)
extend("email", email)
extend("max", max)
extend("numeric", numeric)
extend("regex", regex)

Vue.component("ValidationProvider", ValidationProvider)
Vue.component("ValidationObserver", ValidationObserver)
localize("ja", ja)

```
- フォームの`input`タグを`validation-provider`タグで囲う
- `rules`プロパティを`required`とすると入力必須項目となる（`vee-validate.js`で設定）

```vuejs:components/Name.vue
<template>
  <section>
    <label>名前</label>
    <validation-provider
      v-slot="{ errors }"
      rules="required"
      name="名前"
    >
      <b-form-input type="text" v-model="name"></b-form-input>
      <p v-show="errors.length" class="error_message">
        {{ errors[0] }}
      </p>
    </validation-provider>
  </section>
</template>
```
- フォーム全体を`validation-observer`タグで囲う
- 設定した`rules`が全て満たされていないとボタンが無効化（disabled）のままとなる
- コンポーネント側で入力された値を親であるpagesに渡しています
    - [子Componentで変更されたv-modelの値を親に反映する](https://qiita.com/katu_/items/b66e5eba80b101be1d18) 参照

```vuejs:index.vue
<template>
  <b-container>
    <validation-observer v-slot="{ invalid }">
      <div class="form">
        <Name v-model="form_name"></Name>
        <NoticeEmail v-model="notice_email"></NoticeEmail>
      </div>
      <div class="btn">
        <button @click="submit" :disabled="invalid">送信</button>
        <p v-show="invalid">
          必須項目は全て入力してください
        </p>
      </div>
    </validation-observer>
  </b-container>
</template>

<script>
import Name from "~/components/Name.vue"
import Email from "~/components/Email.vue"
import axios from "axios"

export default {
  components: {
    Name,
    Email,
  },
  data() {
    return {
      name: "",
      email: ""
    }
  },
  methods: {
    submit() {
      const data = {
        name: this.name,
        email: this.email,
      }
      axios
        .post(api_path, data)
        .then(res => {
          // 処理
        })
        .catch(e => {
          // 処理
        })
    }
  }
}
</script>

### 参照
- [Nuxt.jsでバリデーションするためにVeeValidateを使う](https://www.virment.com/how-to-use-veevalidate-nuxtjs/)
AWSのSSH接続で少しつまづいた所　.pemファイルあたり

現在、ポートフォリオにAWSを導入するため『Amazon Web Services　基礎からのネットワー＆サーバー構築』で勉強中。その３章で少しつまづいた所の記録。

<h4>詳細</h4>
 EC2でインスタンス作成後、MacのターミナルからSSHを使いインターネット側からインスタンスに接続する。
__つまずきポイント__
1. 「.pem」の拡張子ファイルの扱い。
2. キーペアファイルが見つからない状態


<h2>1.「.pem」の拡張子ファイルの扱い</h2>

<h4>躓くまでの流れ</h4>
　1. インスタンス作成時に「.pem」と言う拡張子を持つキーペアファイルをダウンロード。
　2. ダウンロードしたので、とりあえず開いてみようとする。すると画像１が表示される。
　3. 躍起になって開こうと調べる。うまく見つからない。
　4. 落ち着いて、教科書見直す。すると、そもそもそんな必要がなかった。

<h4>結論</h4>　
キーペアファイルは後の、SSHでの接続に必要なファイルであり、現状開く必要はない。

<h4>備考</h4>
__pemファイルって何？__
調べてみたが、しっかりとは理解できなかった。現状わかった部分をまとめる。
* 鍵や証明書を格納するファイル
* Base６４でエンコードされている

図１
![スクリーンショット 2020-03-04 15.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593578/46847061-34a0-b175-6232-1bff1ccea9af.png)

<h2>2.キーペアファイルが見つからない状態</h2>

<h4>躓くまでの流れ</h4>
1. 　インスタンス作成終了
2. 　インスタンスにインターネットからアクセスするためパブリックIPアドレスとキーペアファイルを使いMacのターミナルからコマンド実行

```
$ ssh -i ******.pem ec2-user@[パブリックIPアドレス] 
``` 

３.　「＊＊＊＊＊.pem」という名前のファイルは存在しないよって言われる。

```
$ Warning: Identity file ＊＊＊＊＊.pem not accessible: No such file or directory.
```


４.  キーペアファイルをダウンロードから移動させてないことに気づく。ではどこに移動させればいいのか。これについては教科書に書いてない。なので調べると、隠しファイルの「.sshディレクトリ」に移動すれば良いらしい。
※隠しファイルの表示方法
ターミナルでコマンド実行

```
$ defaults write com.apple.finder AppleShowAllFiles TRUE　隠しファイル表示
$ killall Finder　Finderのを一度終了
$ defaults write com.apple.finder AppleShowAllFiles FALSE 隠しファイル非表示
```
５.  再度インターネットからアクセスするコマンド実行。(今回はファイルのルートも追加)

```
$ ssh -i ~/.ssh/＊＊＊＊＊.pem ec2-user@00.000.00.00
```
６.  また、「＊＊＊＊＊.pem」という名前のファイルはないと言われる。移動したのでないはずがない。また調べる。このサイトを見つける。https://dev.classmethod.jp/cloud/aws/aws-beginner-ec2-ssh/
どうやら権限の問題なのかもと仮説を立てる。

７. サイトにあった以下のコマンドを実行してみる。このコマンドを権限の範囲を操作するコマンド。

```
$ chmod 600 ~/.ssh/秘密鍵名.pem
```
※ 「chmod」というコマンドについて以下のページが参考になる。
https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95

８.  期待どうりの返答が帰ってきた！！成功！！

```
The authenticity of host 'パブリックIPアドレス' can't be established.
ECDSA key fingerprint is [見せていいのかわからないので隠します。].
Are you sure you want to continue connecting (yes/no)? yes
```

<h4>結論</h4>
1. キーペアファイルの置き場所の変更
2. キーペアファイルの権限の変更

以上を行えば良い。
iPadからEC2にSSH接続してみた

![IMG_3521.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456939/1428ded8-fdc1-9b98-f3fe-9ef7cf820b70.jpeg)

初投稿です！！！

iPadからSSH接続出来ると聞いて、とりあえずやってみるかーってノリで挑戦したら出来て

可能性を感じたので、書いていきたいと思います。

使ったのはAmazonLightsailですがEC2と大差ないので目をつぶってください（

# 使用したもの

iPadPro(2018)
<a href="https://apps.apple.com/jp/app/textastic-code-editor-9/id1049254261">Textastic Code Editor 9</a>
# 詰まった部分
<img width="936" alt="IMG_0310.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456939/ee8342ff-5cff-6a41-7c04-101dfa2e4a3f.jpeg">
Mac側からAirDropで暗号鍵を移してSSH接続したらエラー・・・
暗号鍵をiPadで開いてみたらめっちゃ文字化けしてた。
なのでTextasticでファイルを作り暗号鍵の中身をコピーして貼り付けしたら上手いこと接続することが出来ました！

<img width="683" alt="IMG_0309.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456939/e0d83859-0f85-1a28-d015-648128b53574.jpeg">
#　メリット
・Macを持ち運びしなくてもよくなる
・端末が壊れても環境が消えない
・かっこいい
・充電器がコンパクト

# デメリット
・暗号化キーをiPadにいれるからセキュリティが不安
・オンラインの実行環境が必要
・デザリング(Wi-Fi)orセルラーモデル必須
・自立しないからスタンドが必須

興味がある方が是非試してください！
A/Bテストの結果をカイ二乗検定で検証してみた

デジタルマーケティングの現場では、日々さまざまな施策のPDCAが回っています。こうしたプロセスにおいて、単純な数字の大小を比較するだけでは、施策の効果を正確に検証するのは難しいこともあるのではないでしょうか。統計学の知識をより良い分析や改善提案に生かすにはどうすればいいかという視点から、統計学的検定の手法を活用したケーススタディに取り組んでみました。

今回のトピックは、あるウェブサイトのA/Bテストの結果について、有意差の有無を検証するというものです（有意水準は0.05と仮定）。A/Bテストの効果検証によく用いられるカイ二乗検定（独立性の検定）を採用し、データはkaggleの「audacity ab testing」を参照しました。
https://www.kaggle.com/samtyagi/audacity-ab-testing

まずはライブラリをインポートし、データを読み込みます。

```
import math
import numpy as np
import pandas as pd
import scipy.stats
```
```
df=pd.read_csv("homepage_actions.csv")
df.head()
```
![Capture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/2e51622a-6123-e61b-1cf1-f9d24b1d50d7.png)

各カラムの説明は以下の通りです。
timestamp：アクセス日時
id：ユーザーID
group：コントロールグループがcontrol、テストグループがexperiment
action：クリックしたらclick、見ただけならview

次にデータを集計します。各グループの総数を出してみましょう。

```
group=df.groupby('group').count()
group
```
![Capture4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/9e566d6e-ff25-e521-34b0-5db984182f87.png)

さらにピボットテーブルで、グループ毎のクリック数を集計します。

```
pd.pivot_table(df,index='group',columns='action',values=['group','action'],aggfunc='count')
```
![Capture3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/f751e746-aa03-8ea6-a5b4-5f9b5814b4db.png)

それぞれのグループのクリック率は、
コントロールグループ：932÷4264=0.21857410881801126
テストグループ：928÷3924=0.23649337410805302
となり、クリック率自体はテストグループのほうが高いことが分かります。

果たして、テストグループのほうが有意にクリック率が高いと言えるのでしょうか？
カイ二乗検定で検証してみましょう。Pythonの場合、scipy.statsのchi2_contingency関数を使います。

```
data=np.matrix([[932,3332],[928,2996]])
chi2,p,ddof,expected=scipy.stats.chi2_contingency(data,correction=False)

print("カイ二乗値:", chi2)
print("p値:", p)
print("自由度:", ddof)
print("期待度数:", expected)
```
![Capture1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/c3a467f0-fe29-4b38-3a38-8a5324ef0c41.png)

出力結果をみると、有意確率であるp値は0.05より高い数値になりました。この場合、「2標本の間には有意差がない」とする帰無仮説は棄却されません。つまり、テストグループのほうが有意にクリック率が高いとは言えないということになります。単純な数字の大小だけでは判断できない、ということが分かりますね。

クリック率だけで施策の良し悪しを判断するのは適切でないケースもあるでしょうが、こうした手法による分析は、より効果的な施策を打つための判断材料として活用できそうです。
[android studio] INSTALL_FAILED_INSUFFICIENT_STORAGEの対処法

# はじめに

デバッグが実行できなかったので調べました。

# 参考

[こちらが参考になります！](https://amzn.to/3etqsg2)

# アンサー

単にAVDのストレージが増やせば良い

# 対処法①
AVD Manager >> advanced settings >> internal Strorage  4000MB ぐらいにしとく


# 対処法②
/home/username/.android/avd/mobilename/config.iniを編集する

```
AvdId=Nexus_6_API_28_2
PlayStore.enabled=false
abi.type=x86
avd.ini.displayname=Nexus 6 API 28 2
avd.ini.encoding=UTF-8

★　ここを変更する　★

disk.dataPartition.size=4000M

★　ここを変更する　★

fastboot.chosenSnapshotFile=
fastboot.forceChosenSnapshotBoot=no
```
GAS onOpenなどのシンプルトリガーの権限

ファイルのオープン時に、他のファイルの更新日時とかをとって表示しようとしてたらできなかった件

>2020/03/04 15:05:29	エラー
Exception: DriveApp.getFileById を呼び出す権限がありません。
必要な権限: (https://www.googleapis.com/auth/drive.readonly || https://www.googleapis.com/auth/drive)
    at onOpen(Main:107:11)

oauthScopesには記載済み

[リファレンス](https://developers.google.com/apps-script/guides/triggers)をみてみると、

>They cannot access services that require authorization. For example, a simple trigger cannot send an email because the Gmail service requires authorization, but a simple trigger can translate a phrase with the Language service, which is anonymous.

だめらしい。

自作イベントハンドラーならOKとのことで、トリガービルダーとやらを使ってみる
イベントがあるか確認する関数と

```javascript
/**
* @returns {boolean} ハンドラーが登録されてるか調べる
*/
function isEventHandlerEnable()
{
    let triggers = ScriptApp.getProjectTriggers(); //登録されてるトリガーの一覧
    let target = triggers.findIndex(trigger => trigger.getHandlerFunction() === 'checkUpdates');

    return target !== -1;
}
```  

イベントハンドラを追加する関数

```javascript
function registEventHandler()
{
    let spreadsheet = SpreadsheetApp.getActive();
    try{
        let targetBuilder = ScriptApp.newTrigger('checkUpdates').forSpreadsheet(spreadsheet);
        targetBuilder.onOpen().create();
        updateMenu();
    }
    catch(e){
        Browser.msgBox('イベントの追加に失敗しました');
        console.log(e);
    }

}
```

を作って、OnOpenで、登録されてなかったら、ハンドラ追加するようにした。

```javascript
function onOpen()
{
  if(!isEventHandlerEnable()){
    registEventHandler();
  }
}
```

これで、次回オープン時から自分で登録したイベントが実行される。
**OnOpenはファイルのオープン時にしかデバッグできないから、別関数にして実行したときと、OnOpenから呼び出したときで挙動がことなっちゃう。**


参考にしたクラスリファレンス
[トリガークラスリファレンス](https://developers.google.com/apps-script/reference/script/trigger)
[トリガービルダークラスリファレンス](https://developers.google.com/apps-script/reference/script/trigger-builder)
[スプレットシートトリガービルダークラスリファレンス](https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder)
About LoraWan simlator

## [ns-3](https://www.nsnam.org/)
ns-3 is a discrete-event network simulator for Internet systems

## [LoRaFREE](https://github.com/kqorany/FREE)

## [http://lora.tti.unipa.it/](http://lora.tti.unipa.it/)
PHY simulator

## [FLoRa](https://flora.aalto.fi/)

## [LoRaSim](https://www.lancaster.ac.uk/scc/sites/lora/lorasim.html)
clkng

Allwinnerなどのサポートでclockやresetの処理を抽象化するためにdev/extresというデバイスが作られました。

これはLinux方面でccuというデバイスが作られDTSに設定されるようになったものをそのまま使えるようにするために作られたようです。

もともとAllwinnerの実装は直にレジスタ(CCM)をアクセスするコード(a10_clk.c)でしたが書き換えられました。

これの動きを追ってみます。まずはallwinnerのa10のresetです。

dtsからリセットレジスタを拾い出します。

```
        error = hwreset_get_by_ofw_name(sc->dev, 0, "de_be", &rst);
```

dtsにはこうあります。

```
                reset-names = "de_be", "lcd";
                resets = <&ccu RST_DE_BE0>, <&ccu RST_DE_BE1>;
```

RST_DE_BE0がそれになります。

dtsとコードで同じ定義を利用するためにsys/gnu/dts/includeのファイルを共通で利用しています。

これがclkng/ccu_a10.cで、

```
static struct aw_ccung_reset a10_ccu_resets[] = {

        CCU_RESET(RST_DE_BE0, 0x104, 30)
};
```

と定義されているのでレジスタのオフセットが0x104で30ビット目がリセットになります。

hwreset_deassert()でリセットされます。

```
 error = hwreset_deassert(rst);
```

次はclockです。

コードでdtsからレジスタを拾い出します。

```
       error = clk_get_by_ofw_name(sc->dev, 0, "de_be", &clk_debe);
```

dtsにはこうあります。

```
                clocks = <&ccu CLK_AHB_DE_BE0>, <&ccu CLK_DE_BE0>,
                        <&ccu CLK_DRAM_DE_BE0>, <&ccu CLK_AHB_LCD0>,
                        <&ccu CLK_LCD0_CH1>, <&ccu CLK_PLL3>;
                clock-names = "ahb_de_be", "de_be", "dram_de_be", "ahb_lcd",
                        "lcd_ch1_sclk1", "lcd_ch1_sclk2";
```

CLK_DE_BE0がレジスタになります。

これがリセット同様にclkng/ccu_a10.cで定義れています。

```
NM_CLK(apb1_clk,
    CLK_APB1,                                   /* id */
    "apb1", apb1_parents,                       /* name, parents */
    0x58,                                       /* offset */
    16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,       /* n factor */
    0, 5, 0, 0,                                 /* m factor */
    24, 2,                                      /* mux */
    0,                                          /* gate */
    AW_CLK_HAS_MUX);                            /* flags */
```

この定義はこれを表しています。

![スクリーンショット 2020-03-02 9.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2dd9b8ae-4d97-b793-5bb3-7f20300f4195.png)

clockの場合は複雑で、設定項目ごとに定義があり、それに対応したコードがclkngに用意されています。

上の場合はclkng/aw_clk_nm.cになります。

そもそも一つこターゲットでもかなり複雑になり、抽象化してかえってコードの見通しが悪くなってる感じがします。

clkngが失敗だったと思うは以下の理由です。

* タイプごとの実装が9つもファイルがあり煩雑になっている
* Videoのような複雑にクロックを使う実装がちゃんと動かない
* リソース構造がdtsにあったりハードコードされていたりちぐはぐ
* device_tを持っていないのでdevice_printfが使えない
* 単純な処理でも動いてないものがある
* u-bootはccm直接のまま
* そこまでLinuxと同じにしたいんだったらLinuxつけばいいじゃん
* 必要以上に複雑かつコードが多くなりすぎ

2行で実装できていたものを200行以上かけて処理することになんの意味があるのでしょうか。
Django girls-2 Python入門（途中まで）

”文字列”.upper()
大文字に変換

upper()のように、特定のオブジェクトにのみ実行される関数は<b>メソッド</b>と呼ばれる。

#リスト
x.append()
()の値をリストに追加
x.pop(インデックス)
インデックスの値を削除

#ディクショナリ
x = {'name':'Ken', 'age':30, 'num':[1,5,9]}
キー：値
値にはリストも入れられる

x['birthday'] = '1990/1/17'
キーと値の追加

x.pop(キー)
キーと値の削除

x['name']='Kentaro'
値の上書き（変更）
現場でよく使うNumpy,Pandas Tips集

---
#### ここでは恐縮ですが細かい解説を省いております。アンチョコとして「あれってどうやって書くんだっけ？」くらいな感じのヒントにでもなりましたらと思います。随時、付加更新中です。
---
```python
import numpy as np
import pandas as pd
import sys
# encoding
print(sys.getdefaultencoding())
```
### データ取得
```python
# numpy
x = np.array([[1,2,3],[4,5,6]],dtype=np.float64)
# テキスト読込
y = np.loadtxt('text1',delimiter=',',skiprows=0,comments='#')
```
### スライス
```python
pandas.DataFrame
df=pd.read_csv('stock.csv',encoding='Shift_jis',names=('index','dekidaka','owarine'))
df.head() # 先頭５行
pd.DataFrame({'a':[1,2,3],'b':[4,5,6]}) 
df.loc[:,['index','owaine']]
df.loc[100:115,['index','dekidaka']]
df.iloc[1:22,1:3] # 1 ～ 3 index,dekidaka,owarine
df.iloc[:,[0,2]] # 0 and 2 index,owarine
df.iloc[::2]  # 偶数
df.iloc[1::2]  # 奇数
df['index'] < '1900' # False or True
df[(df['index'] == '1900')] # 171.0  1883,     49800     261
```
### データ管理
```python
# マージ
samp1 = pd.read_csv('sample1.csv',encoding='Shift_jis')
samp2 = pd.read_csv('sample2.csv',encoding='Shift_jis')
samp3 = pd.read_csv('sample3.csv',encoding='Shift_jis')
# concat(縦結合)
conc=pd.concat([samp1,samp2],ignore_index=True)
# merge(横結合)
merg=pd.merge(conc,samp3[["label1","label2"]],on="label1",how="left") # 
# データ抽出
merg["label2_y"] # only label2_y 1000 ～ 1003
merg[["label2_x","label2_y"]].iloc[:,0:2] # 
####################
# 要約統計量
merg["label1"].iloc[1:5].describe()
# 足算
merg["label1"] + merg["label2_y"] # 足算
# 合計
merg["label1"].sum()
# 欠損値
merg.isnull()
# 欠損情報
merg.isnull().sum()
# 最大値+最小値
print(merg.max() + merg.min())
# データ型確認
merg.dtype
# 型変換 float64 ⇒ numeric
merg["label1"]=pd.to_numeric(merg["label1"])
# float64 ⇒ datetime 
merg["label1"].dt.strftime("%Y%m")
# grouping
merg.groupby(["label1"]).sum()["label2_y"]
```
### データ補正
```python
# ユニーク件数
print(len(pd.unique(merg.label3))) # １８個、スペースが左端に入っただけで別物とみなされる
# 小文字を大文字に揃える
merg["label3"]=merg["label3"].str.upper() 
print(len(pd.unique(merg.label3)))　＃１７
merg["label3"]=merg["label3"].str.replace(" ","") 
print(len(pd.unique(merg.label3)))　＃１６
# ソート
merg.sort_values(by=["label1"],ascending=True)
```
【Nuxt.js】チェックボックスにチェックがある場合のみ送信可能なバリデーションの実装

### 概要
- 個人情報保護に関する項目を確認し、チェックボックスにチェックが入っていれば送信ボタンを押せるようにしたい
- もし、チェックボックスにチェックが入っていなければ、ボタンを無効化（disabled）したい
- チェックボックスは標準のものではなく、独自で用意したsvgを使用したい
    - `input type`が`checkbox`の時の値を取得したい

### 実際のコード

- `v-if`ディレクティブを使用してチェックが入っているか否かの判定をする

```vuejs:components/PrivacyProtection.vue
<template>
  <form name="form">
    <label for="checkbox">
      <input
        type="checkbox"
        name="checkbox"
        id="checkbox"
        v-model="privacy_protection"
        v-on:change="onChange"
      />
      <CheckOutSvg v-if="checkFlag" />
      <CheckInSvg v-else />
      <a href="/" class="link">
        個人情報保護に関して
      </a>
      に同意する（必須）
    </label>
  </form>
</template>
```

- `svg`を使用するため`nuxt-svg-loader`をインストール
- `svg`は`assets`配下に格納する
- `svg`を以下のように`import`する

```vuejs
<script>
import CheckOutSvg from "@/assets/check_out.svg"
import CheckInSvg from "@/assets/check_in.svg"

export default {
  components: {
    CheckOutSvg,
    CheckInSvg,
  },
  //省略
}
</script>
```
- `checkFlag`の初期値を設定
- 初期値は`CheckOutSvg`（チェックが外れたavg）を表示したいので、`true`を返す

```vuejs
<script>
  //省略
  data() {
    return {
      checkFlag: true
    }
  },
  // 省略
</script>
```

- `document.form.checkbox.checked`でチェックボックスの値を取得する
- 得た値が`checked`だったら`CheckInSvg`を表示

```vuejs
<script>
  //省略
  methods: {
    onChange() {
      if (document.form.checkbox.checked) {
        this.checkFlag = false  // CheckInSvgが表示される
      } else {
        this.checkFlag = true  // CheckOutSvgが表示される
      }
    }
  },
  // 省略
</script>
```
- 今回は`svg`を使用したので、チェックボックスの標準スタイルは非表示にしておく

```vuejs
<style>
input[type="checkbox"] {
  display: none;
}
</style>
```

- `v-model="privacy_protection"`の値を親に渡す
    - [子Componentで変更されたv-modelの値を親に反映する](https://qiita.com/katu_/items/b66e5eba80b101be1d18) を参照
- `{ name: 'url', params: { url: url } }`は名前付きルート
- ボタンもコンポーネントを呼び出してます

```vuejs:index.vue
<template>
  <section>
    <PrivacyProtection v-model="privacy_protection" />
    <div class="btn">
      <nuxt-link :to="{ name: 'url', params: { url: url } }">
        <Btn
          :text="btn"
          @click.native="submit"
          :disabled="isButtonDisabled"
        ></Btn>
      </nuxt-link>
    </div>
  </section>
</template>
```

- `v-model="privacy_protection"`の値が`true`だったら（チェックボックスにチェックが入っていたら）、`:disabled`を`false`にしたい（送信ボタンを押下できるようにしたい）ので、`"isButtonDisabled"`にfalseを返す

```vuejs
<script>
export default {
  // 省略
  computed: {
    isButtonDisabled() {
      // 個人情報保護に関して チェック有無の判定
      if (this.privacy_protection === true) {
        return false
      } else {
        return true  // :disabledがtrueの時、ボタンを無効化できる
      }
    }
  },
  //省略
}
</script>
```
unity 非同期でFLGが変わるまで待つ

毎回忘れるのでFLGの待ち方をメモっておく、
ついStartCoroutine使いたくなる。

全ループが終わった後にAfter Waitのログが出力されているので
ちゃんと待てていると思われる。

```
using System;
using System.Threading.Tasks;
using UnityEngine;

public class FlgWait : MonoBehaviour
{

    /// <summary>
    /// ボタンが押された
    /// </summary>
    public void OnClickButton()
    {
        WaitHoge();
    }

    private async Task WaitHoge()
    {
        bool doHoge = true;

        var _ = Task.Run(() =>
        {
            int i = 1;
            while (doHoge)
            {
                try
                {
                    i++;
                    Debug.LogError($"{i}");
                    if (i >= 10000)
                    {
                        doHoge = false;
                    }
                }
                catch (Exception e)
                {
                    Debug.LogWarning("[Server] " + e);
                    throw new Exception("Error");
                }
            }
        });

        Debug.LogError($"Before Wait");
        await _;
        Debug.LogError($"After Wait");

    }
}

```



参考URL
https://qiita.com/Alupaca1363Inew/items/0126270bca99883605de
【Rails】rack-attack gemでアクセス制限。CSSやJSなどの静的ファイルへのアクセスはカウントしない方法

## 概要
* rack-attack gemを使ってみた記事

## 前提
* [こちらの記事](https://qiita.com/junara/items/2562f3a80d6ed222d46e)を存分に参考にしています。  
（本記事の途中までほぼ写経ですorz）


## 背景
* CSSやJSなどの静的ファイルへのアクセスをカウントしない方法を探して時間がかかったので、記事にしました。

## rack-attackの設定の流れ

### gemインストール
Gemfileに下記を追加する

```ruby
# DoS攻撃対策
gem 'rack-attack'
```

bundle installを実施する

```
bundle install
```

### 設定

#### 起動時に読み込む
* developmentとproductionの両方で読み込む

```ruby
module YourApp
  class Application < Rails::Application
    省略
    # security
    config.middleware.use Rack::Attack
  end
end
```

### rack-attackの設定ファイル
`config/initializers/rack-attack.rb`ファイルを作成して編集します。
設定は、同一IPから`１分間`あたりに`60回`のリクエストがあった場合は、そのIPからのアクセスを制限するという設定です。

```ruby
class Rack::Attack
  throttle('req/ip', limit: 60, period: 1.minutes do |req|
    req.ip
  end
end
```

## 確認

```
rails dev:cache
```

こちらのコマンドを入力することで、`tmp/caching-dev.txt`が作成されます。

このファイルが存在すると、`config/environments/development.rb`の`config.action_controller.perform_caching = true`になり、キャッシュが有効になってリクエスト元のipが記録され、rack-attackが機能するようになります。

なお終了するときは、再度`rails dev:cache`を実行してください。

## 動作テスト
development環境でrailsアプリを起動して、任意のページで再読み込みを(command+r)を60回してください。
そうして、画面に`Retry later`と表示されると、rack-attackの設定は成功です。

## 静的ファイルをリクエスト制限に含めない方法

CSSやJS、画像などのassetsをリクエスト制限に含めないように設定しないと、rack-attackでアクセス数としてカウントされ、期待より早くthrottleの遮断が行われてしまいます。

設定自体は簡単で以下のように追記するだけで可能です。

```ruby
class Rack::Attack
  throttle('req/ip', limit: 60, period: 1.minutes) do |req|
    req.ip unless req.path.start_with?('/assets') # 追記
  end
end
```
php アップロードサイズを変更する

#以下のようにセット設定が必要です

```
ini_set()では変更できない。									
									
php.iniを変更する									
htaccessで設定する									
httpd.confで設定する									
									
									
/etc/php.ini									
memory_limit = 40M									
post_max_size = 32M									
upload_max_filesize = 8M									
									
									
/.htaccess					実行phpファイルと同じフォルダ				
php_value memory_limit "40M"									
php_value post_max_size "32M"									
php_value upload_max_filesize "8M"									
									
									
/httpd.conf									
php_value memory_limit "42M"									
php_value post_max_size "32M"									
php_value upload_max_filesize "8M"
hyclb:hyとCommon Lispの混合環境

hylangからcommon-lisp(sbcl)を呼びだして，common lispの機能を使えるようにした

https://github.com/niitsuma/hycl

これは，もともと

- [さらばpython、ようこそhylang](https://qiita.com/riktor/items/498a30d41f89d41ea168)

で公開されていた [hycl](https://github.com/riktor/hycl) というcommon-lispと似た環境をhy上に作るlibraryのフォークで，
これにcommon-lisp(sbcl)をpythonから呼びだす [cl4py](https://github.com/marcoheisig/cl4py) の機能を`clisp.eval_qexpr`という関数名にして導入した．

このlibraryの目玉はdefunマクロで，

```hy
(defmacro defun [name arg &rest code]
 `(defn ~name [~@arg]
     codeをsbcl上のmacroexpandで展開
     展開したcodeをhy上のcommon-lisp互換関数で実行
))
```

することで [optima](https://qiita.com/m2ym/items/a2e00c79984750958e8a) などをのマクロをhyから使えるようになっている．

defunの中でcommon-lispはマクロ展開の時のみに呼びだされるのでnumpyとの混合などもできる．


```hy
(clisp.eval_qexpr '(ql:quickload "anaphora"))
(clisp.eval_qexpr '(rename-package 'anaphora 'ap) )

(import numpy)
(defun test_alet2 (x y)
   (setq y (+ 10 y))
   (numpy.sin
      (* 
        (ap:alet (+ x y)  (+ 1 ap:it))
        (/ numpy.pi 180)))
    )

(test_alet2 49 30)
==>    1.0
```

clisp.eval_qexprでsbclを直接呼ぶこともできる．

# パターンマッチマクロをpython(hy)で使う．

common lispでパターンマッチマクロを実装した [optima](https://qiita.com/m2ym/items/a2e00c79984750958e8a) の主要な機能をhyから使えるようにした．pythonのパターンマッチマクロで [pampy](https://github.com/santinic/pampy) というのがあるようだが，それよりも強力．ただしsbclを利用している関係で大文字が小文字に全部変換される制限がある．

```hy
(import numpy)
(defun testom4 (u)
    (setq p numpy.pi)
    (om:match
      u
      (`(,x 5 ,z)  (list x y z))
      (`(,x ,p ,z) (list x 2 z)))
    )

(testom4 (list/cl  1 numpy.pi  3) )	
==> '(1 2 3)
```

classのプロパティのパターンマッチもできる

```hy
(clisp.eval_qexpr `(defstruct numpy.ndarray  shape ndim)) 
```
とすることでclassのプロパティをSBCLに認識させると，こんなこともできる

```hy
(defun testom6 (z)
    (om:match
      z
      ((numpy.ndarray shape ndim ) (list shape ndim )))
    )

(testom6 (numpy.array [1 2 3]))
==>    '( (, 3) 1)
```
`(dir  (numpy.array [1 2 3]))` で見れる全プロパティをSBCLに認識させる以下の関数も用意した

```hy
(cl_struct_import_obj (numpy.array [1 2 3 ]))
```
# 実装
この実装の肝はhyに付属している `hy-repr` 関数で

```hy
sbcl.stdin << (hy-repr code)
```
ということをするために，cl互換関数をhy上に用意したり, `hy-repr` 関数の出力を`hy-repr-register`でいじったりしている．




# 制限
- 大文字が全て小文字に変換されるので class MyClassみたいのは class myclassに強制変換される
- common-lisp互換関数で実装していない関数が多数 
- [optima](https://qiita.com/m2ym/items/a2e00c79984750958e8a)  は動かせたが [trivia](https://qiita.com/guicho271828/items/332433927ba2a6b543ac) はちゃんとテストしていないので，できるだけoptimaを使ってほしい．
- hyの評価順序の関係で (ql:quickload "optima") などをライブラリの中（hyclb.cl4hy.hyの真ん中あたり） で実行している．これをしないとtestで失敗する．しかしemacs hy-modeからだと後からql:quickload しても動く．謎な挙動
- pythonのlist => clのvector, pythonのtuple => clのlistとして扱っているが，hyのバグなのかtupleが途中でlistに変換されてしまうことがある．この関係でvectorとlistの区別がちゃんとされていない
- dict = consのlist の扱いが適当になってるので何か統一的な扱いができる方法がいるが思いつかない
- tagbodyの互換関数が変数のスコープの扱いに不安のある実装になっているので，om:matchの中で変数を新しく宣言するのはやめた方が良い．ちゃんとしたtagbodyのhyでの実装を誰か作ってくれないかなあ
AuvideaのJ120をセットアップする際の注意点

# はじめに
AuvideaのJ120をセットアップする上で公式ドキュメントに書かれていない注意点をまとめてみました．
J120以外では確認していませんが，他のAuvideaのキャリアボードでも同じことはいえると思います．

また，今後ファームウェアのバージョンによって注意点が追加される可能性があるので，このドキュメントは今後も追記され続けると思います．

# SDKマネージャーでCUDAやcuDNNなどをインストールする際の注意点
J120のファームウェアを適応後にJetPackでJetsonのセットアップをしていると，JetsonのOSのイメージを書き込んだあとにCUDAやcuDNNなどをインストールした際に，何故か失敗します．
それも，時たまCUDAだけがインストールできたり，CUDAやcuDNNがインストールできたがその他が失敗する場合があります．

原因はわかりませんが，**Jetson自体をネットにつなげられるように設定すると解決します．**
つまり，Jetson上でOSのインストールしてセットアップしたあとにネットの設定して，pingコマンドなどでネットへの接続ができるか確認したあとに，ホストPCでCUDAなどのソフトウェアをインストールを開始すればできます．

これは，Developer Kitを使用している場合はする必要がありませんが，何故かJ120のフォームウェアを適応させた際にこの問題が発生します．

# ファームウェアを適応できているか確認する方法
ファームウェアを適応させることでUSBや，SPIを使用できます．
なので，USBの接続確認や`/dev`にspidevがあるかどうか確認できれば，ファームウェアが適応できている証拠です．

# ファームウェアver2.2でのセットアップ方法
他のバージョンではドキュメントが付属していますが，このバージョンだけ付属しておりません．
なので，簡単にですがここに記録しておきます．

## 注意点

まず，AuvideaのHPにはファームウェアver2.2の対応しているJetPackは4.2と書かれていますが，正確にはJetPack4.2.2対応です．
（Auvideaのサポートに確認済みです）

また，`with SPI`と書かれている方でないとSPIに対応できていませんので注意してください．（/devにspidevがない）

## 手順
手順は基本的には前のバージョンのファームウェアver2.0/2.1に付属してるドキュメントに書かれている内容と大体同じです．

### 1. SDKマネージャーを準備
写真のが表示されるまでセットアップを続けてください．
セットアップの方法はNVIDIAの公式ドキュメントを参照してください．

* [Download and Run SDK Manager](https://docs.nvidia.com/sdk-manager/download-run-sdkm/index.html)
* [Install Jetson Software with SDK Manager](https://docs.nvidia.com/sdk-manager/install-with-sdkm-jetson/index.html)

![74586619-9feb4300-502c-11ea-91d1-8125db43ac60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212330/66790b45-756e-e4e2-1d3b-9cf8145e49af.png)
そしたら，スキップを押してSDKマネージャーを閉じてください．

### 2. ファームウェアのパケットをnvida_sdkフォルダーにコピー
ファームウェアver2.2のパケットをnvida_sdkフォルダーにコピーします．

```bash
$ sudo cp -r \
${ファームウェアを展開したディレクトリ}/Jetpack4_2_2_J90_including_fix_for_spidev/Linux_for_Tegra/* \
~/nvidia/nvidia_sdk/JetPack_4.2.2_Linux_P3310/Linux_for_Tegra/
```

### 3. ファームウェアをJetPackに適応させる
nvida_sdkフォルダーへ移動

```bash
$ cd ~/nvidia/nvidia_sdk/JetPack_4.2.2_Linux_P3310/Linux_for_Tegra/
```

以下のコマンドで適応させます．

```bash
$ sudo ./apply_binaries.sh
```

### 4. SDKマネージャーでJetsonをセットアップする．

残りは，NVIDIA公式ドキュメントにかかれている通りにJetPackでJetsonを1からセットアップすれば完了です．
ExcelVBAでCSVファイルをExcelファイル化

#CSVファイルをExcelファイルにして納品したい
は？と思う方もいるかもしれませんが、CSVファイルをそのまま開くと前0が落ちたりしますよね。
じゃあ全部文字列としてインポートすればいいじゃんと思ったら、財務的な部分は数字で欲しかったりします。
数項目くらいなら1つずつポチポチ設定すればいいけど100項目以上とかになるともう毎回やるのとか無理ってことでマクロの記録からツール化してみました。
UserFormで入出力ファイルの指定とかありますがそこは割愛します。

```CSVtoExcel.bas
Sub CSVtoExcel()
    Dim Sheet As Worksheet
    Dim Folder As String
    Dim inFilePath As String
    Dim outFilePath As String
    Dim inFile As String
    Dim outFile As String
    Dim ans As Integer
    
    On Error GoTo myError
    
    ' マクロが存在するフォルダのパス
    Folder = ThisWorkbook.Path
    Sheet = Folder.Sheets("貼り付け先")
    
    inFilePath = メニュー.入力ファイルラベル.Caption
    outFilePath = メニュー.出力ファイルラベル.Caption
       
    inFile = Dir(inFilePath)
    outFile = Dir(outFilePath)
    
    If outFile <> "" Then
        ans = MsgBox(outFile & "が存在しますが実行しますか？" & vbCrLf & "※ファイルは上書きされます", vbOKCancel, Sheet.Name)
    Else
        ans = MsgBox(Sheet.Name & "変換を実行しますか？", vbOKCancel, Sheet.Name)
    End If
    
    If ans = vbOK Then
        Sheet.Select
        With Sheet.QueryTables.Add(Connection:="TEXT;" & inFilePath, Destination:=Range("$A$2"))
             .AdjustColumnWidth = False
             .TextFileCommaDelimiter = True
             .TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
             1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
             2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
             1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
             .Refresh BackgroundQuery:=False
             .Delete
        End With
        
        Application.DisplayAlerts = False
        
        Sheet.Rows(2).Select
        ActiveWindow.FreezePanes = True
        Sheet.Range("A1").AutoFilter
        Sheet.Range("A1").Select
        Sheet.columns.AutoFit
        
        Sheet.Copy
        ActiveWorkbook.SaveAs FileName:=outFilePath, _
                                FileFormat:=xlWorkbookDefault, CreateBackup:=False
                     
        Application.DisplayAlerts = True
                                     
    Else
        Application.Quit
        ThisWorkbook.Close SaveChanges:=False
    End If
    
    Exit Sub
    
myError:
    MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & Err.Description, vbExclamation
    Application.ScreenUpdating = True
    Application.Visible = True

End Sub

```
DB.open の挙動 (Crystal lang)

**走り書きです。後からアップデート予定です**
**検証とか諸々足りていないので、的外れなことを書いている可能性がそこそこあります**

# 目的
意図せぬ `too many connections error` とか **処理落ち** を防ぎたい

# 動作環境

- AWS ECS (Serverless)
  - OS: Ubuntu // TODO
  - Memory: //TODO
  - CPU: // TODO
- DB
  - AWS RDS: MySQL (Serverless)

```bash
$ crystal -v
v0.32.1
```

# 挙動

## ブロックを大量生産する

```cr
DB.open DB_URL do |db|
  # db.exec
end
DB.open DB_URL do |db|
  # db.query
end
# and more
```

コネクションは割とすぐに開放される?ので、 `too many connections error` はあまり出ない。その代わり、使いすぎるとメモリ不足で止まる気がする。

## ブロックの中で処理を書く

```cr
DB.open DB_URL do |db|
  # db.exec
  # db.query
end
```

- 使用するコネクションは1つ
- `prepared statement` は保持され続ける？ので、この中に `?` を使用した SQL を書きすぎるとエラーで落ちる

// TODO: エラーメッセージを載せる

## DB::Database を別クラスに渡したりして使い回す

```cr
class Main
  def run
    DB.open DB_URL do |db|
      Looper.new(db).start
    end
  end
end
```

- コネクションを開きまくって閉じられもしない。 `too many connections` で怒られる可能性大

# 対策

## ソースを読んで解決策を探す

何かしら良い方法があるんじゃないかと思うので、ちゃんとソースを読んで、理解した上で DB まわりの処理を書けば、こんなことにはならないはず

(そろそろソースを読むってことをやらないとなぁ。と思う今日この頃。)

## 工夫して[ブロックの中で処理を書く](#ブロックの中で処理を書く)

`prepared statement` を使いすぎないように、いい感じにブロックを区切って処理を書いてあげると、一応動くようにはなりそうです。

# 最後に

**テキトーなこと書くなコノヤロー**
**ちゃんとソース読んで書けコノヤロー**
と、マサカリ飛ばしてやってください。
Bitbucket Wikiでのアンカーの付け方

# はじめに
- Bitbucket Wikiでドキュメントをまとめようとしていたところ，Markdownアンカーリンクがうまく設定できなかった
- 解決できたので，その方法

# 問題の事象
下記のようなマークダウンを書いた場合，どちらもアンカーリンクが動作しない

```markdown
(はじめに)[#はじめに]
(usage)[#usage]

# はじめに
．．．

# usage
．．．
```

# 調査

ヘッダー部分のHTMLを確認してみると以下のようになっていた

```html
<h1 id="markdown-header-_1">はじめに</h1>
<h1 id="markdown-header-usage">usage</h1>
```

# 解決方法
- リンクを指定する際に`#markdown-header-`をプレフィックスとして追加する
- 日本語の場合は通し番号が付与されるので，それを指定する

```markdown
(はじめに)[#markdown-header-_1]
(usage)[#markdown-header-usage]

# はじめに
．．．

# usage
．．．
```
Power Automateで2種以上の文字列で文字列分割を行う

# はじめに
Power Appsで、2つの文字列で、対象となる文字列を分割する方法を以前の投稿で紹介しました。([こちら](https://qiita.com/h-nagao/items/ae80f5f594de72e2d011))
今回はそのPower Automate版です。

全体としてはこのような形です。短く3ステップで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/16098718-c184-37ac-54f7-59217a525aa7.png)

# やってみる
## SplitしてSplit
最初のSelectアクションで、Split2回を一度に終わらせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/a2172e05-7556-46ae-4978-5a483b03eea5.png)
このアクションの結果、Power Appsで作ったときと同じような入れ子のjsonが生成されます。(Hello/World/!!の例)

```splitoutput.json
[
  {
    "value": [
      "Hell",
      ""
    ]
  },
  {
    "value": [
      "W",
      "rld"
    ]
  },
  {
    "value": [
      "!!"
    ]
  }
]
```
こっから、あとはvalueの中をすべて1つの配列に入れれば完成です。(ここがちょっと難しい)

## 深い階層の特定要素の一覧をつくる
こんな時はxpathによる値取得が最適です。
前のアクションの結果を、xml化できるようにroot要素を追加します。(ここはComposeアクション)

続いて、Selectアクションでは、xmlをつくり、xpathで値を取得します。

```xpath
'//*/value'
```
/text()を後ろにつけると、空白がそぎ落とされるので、ここではvalueで止めています。
こうすると、結果Selectアクションのitem()はバイナリになります。なので、Mapではjson()をつかって文字列に戻しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/63809876-d2f3-cf6d-712f-a8692c7105ef.png)

結果はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/79dcc0f0-afdb-8acd-379c-ac00ba5591cf.png)

もし結果得られる配列をkey:valueの形式にしたいのであれば、Mapの中を

```
json(item())?['value'] --> json(item())
```
と置き換えればよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/711131b9-8583-f88f-abf2-39780fbd6839.png)

# おわり
Power Appsのように1アクションですべてをまかなうような記述は見つけられませんでしたが、比較的少ないアクションで文字列を2つのdelimiterで分割できました。
毎回Power AutomateでSelectアクションの万能さに驚かされます。　ご質問があればTwitterまで!

サンプルはこちら
https://github.com/mofumofu-dance/PowerApps365/blob/master/Samples/SplitTextBy2Delimiters.zip
【PostgreSQL】PL/pgSQL(PlpgSQL)について調べてみた

##PL/pgSQLとの出会い
今現在PostgreSQLにてSQLコマンドを学習中。Functionの作成にて謎のLANGUAGE plpqsqlという指定に出会ったため、軽くPL/pgSQLについて調べてみた。

```SQL
CREATE OR REPLACE FUNCTION makeusername 
(firstname TEXT, lastname TEXT) 
RETURNS TEXT 
AS $$ 
BEGIN 
RETURN LOWER(SUBSTRING(firstname, 1,1) || lastname); 
END; 
$$ LANGUAGE plpgsql;
```

##参考元サイト
公式ドキュメント？
[https://www.postgresql.jp/document/7.2/programmer/plpgsql.html](https://www.postgresql.jp/document/7.2/programmer/plpgsql.html)

##SQL文との違い

- SQLの拡張版（SQL文がすべて使える）
- Ifによる制御が可能
- 初めて実行されたときに実行計画なるものが作成され、次回以降再利用できるようになり、時間短縮になる

##まとめ
関数定義にて複雑な計算を行わせる場合はplpgsqlを使おう
私事、よく使っている正規表現

# はじめに
コーディングやプログラミングを行っている中で、何となく何度も調べているなと思い、私事ではありますが、よく使う表現をここに書き記します。

# 環境
**エディタ** : Visual Studio Code

# 基本的なパターン
```
任意の1文字「.」
0回以上の繰り返し「*」
直前の文字の0～1回の繰り返し「?」
直前の文字の1回以上の繰り返し「+」
行頭「^」と行末「$」
どれかに一致「[]」
```

# 置換
置換前の文言を引用

```
(.*)\.html　==>　$1_local.html（変更したい名前）

e.g.
A.html ==> A_local.html
```
リンクの中身

```
href="(.*)/"

/":次に登場する"までということで、リンクのhref="aaa/bbb/ccc.html"の中身すべてが対象となる
e.g.
href="(.*)/"　==> href="https://$1"
href="aaa/bbb/ccc.html ==> href="https://aaa/bbb/ccc.html
```


# 検索
桁数の範囲検索

```
\d{2,5}（2桁～5桁の数値）
```
 

全角英数文字

```
[０-９ａ-ｚＡ-Ｚ]
````

以上
herokuでpythonのFlask触るための備忘録

取るに足らないapiを作るときに、Heroku × Flask(Python) が個人的に最速だけど、いつも初期設定で謎に時間を食うのでまとめとく。
##ローカルでの準備

まずHerokuでアプリ作るところ


```
mkdir "フォルダー名"
cd "フォルダー名"
git init 
heroku create -a "アプリ名"
```

作成したフォルダーに必要なファイルは3つ

- reqirements.txt
- Procfile
- hello.py(ファイル名はなんでもいい、とりあえずmain.py的ななにか)

まずrequirements.txtから(==の後ろのverは適当)


``` requirements.txt
Flask==1.1.0
gunicorn==19.9.0
psycopg2==2.7.6.1
```

psycopg2はpostgresqlをいじるためのライブラリだからpostgresqlいじらないときは不要
他はFlask使うなら必須

次はProcfile

``` text:Procfile
web: gunicorn hello:app --log-file -
```

最後はhello.py


``` python:hello.py
# -*- coding: utf-8 -*-
# -------------------------------------------------------------------
#
#   hello.py
#
#                       Mar/04/2020
# -------------------------------------------------------------------
import os
from flask import Flask,request

app = Flask(__name__)

@app.route("/")
def hello():
    str_out = ""
    str_out += "<h2>Hello from Python!</h2>"
    str_out += "<blockquote>"
    str_out += "こんにちは<p />"
    str_out += "</blockquote>"
    str_out += "Mar/04/2020 14:40<br />"
#
    return str_out

#localでテストするときに必要なだけでサーバーでは不要
if __name__ == "__main__":
    port = int(os.environ.get("PORT", 5000))
    app.run(host='0.0.0.0', port=port)

# -------------------------------------------------------------------
```

##デプロイ

```
git add .
git commit -m "First Commit"
git push heroku master
```


本来pythonをbuildpackとして設定してあげないといけないけど、pushした時点でherokuがPythonを認識して最新版のpythonをダウンロードしてくれるっぽい

上手く動いていれば下のコマンドで"Hello From Python"が表示されるはず

```
heroku open
```
終わり