OmniAICreator/Qiita-1.07M huggingface dataset:
大量のExcelファイルから文字だけ抽出して１つのテキストファイルにするPowerShell

私の職場はExcelで書かれた仕様書が飛び交っていて、しかも機能単位でファイルが分かれていたりするので、あの値はどこで使われるんだっけ？といったことを調べるために、いちいちExcelを開くのが面倒でしょうがない。

というわけでPowerShellで特定のフォルダに保存したExcelを片っ端からスキャンして、１つのテキストファイルにするPowerShellを書いた。類似のVBAマクロやツールはあるが、私としては、どこに書かれてるかを検索できるインデックスが欲しかったので、これぐらいの機能がちょうどいい。

```powershell
$path = (Convert-Path .) + "\target\*.xls*"
$outFname = (Convert-Path .) + "\out.txt"

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

Get-ChildItem -Path $path | ForEach-Object {
    $book = $excel.Workbooks.open($_.FullName)
    $bookname = $_.FullName
    echo $bookname
    $book.Worksheets | ForEach-Object{
        $temp = ""
        $sheetname = $_.Name
        echo $sheetname
        $range = $_.UsedRange
        $range | ForEach-Object {
            if ( -not [string]::IsNullOrEmpty($_.text)){
                $temp = $temp + " " + $_.text
            }
        }
        $temp = $temp -replace "`r`n"," "
        $temp = $temp -replace "`n"," "
        $temp = $temp -replace "`t"," "
        while($temp.Contains("  ")){
            $temp = $temp -replace "  "," "
        }
        $excel.Workbooks.Close()
        Add-Content -LiteralPath $outFname -Value ($bookname+",",$sheetname+","+$temp)
    }
}
$excel.Quit()
$excel = $null
[System.GC]::Collect()
```

~~実行してみるとわかるが、なかなか時間がかかる。ソースコード中で`Range("A1","Z1000")`と書いている個所を書き換えることで調整できるが、もうちょっと工夫できるかもしれない。~~

`Range("A1","Z1000")`と書いていた個所を`UsedRange`に書き換えました。
【Vue.js】vue-scrolltを使ってイージングスクロールを実装


#vue-scrolltoとは

「vue-scrollto」は、クリックイベントによって要素までイージングスクロールを実装するライブラリです。

window.requestAnimationFrameを使用してアニメーションを実行するため、最高のパフォーマンスが得られます。
イージングはbezier-easingを使って行われます。

#vue-scrolltoの導入方法

以下のnpm、yarn、CDNを使ってインストールします。

- npm
 
```
npm install --save vue-scrollto
```

- yarn

```
yarn add vue-scrollto
```

- CDN

```html:CDN
<script src="https://cdn.jsdelivr.net/npm/vue-scrollto"></script>
```


#導入手順

###1.ライブラリの取り込み

```javascript
var VueScrollTo = require('vue-scrollto');
Vue.use(VueScrollTo)
```

###2.イージングスクロールのメソッドを設定

```
export default {
  data() {
    return {
      postTop: "#top",
    };
  },
```

###3. テンプレートを準備


```html
<paginate name="paginate-log" tag="ol" :list="allData" :per="12">
   <List v-for="(list, index) in paginated('paginate-log')" :index="index" :list="list" :userDatas="userDatas" :key="list.id"/>
</paginate>
<paginate-links for="paginate-log" class="pagination flex" v-scroll-to="postTop" :show-step-links="true"></paginate-links>
```

###4.オプション
「vue-scrollto」のオプション一覧は以下になります。


|Name|Default|Description|
|:--|:--:|:--|
|el / element||必須。スクロールしたい要素。|
|container|body|スクロールする必要があるコンテナー。|
|duration|500|スクロールアニメーションの長さ（ミリ秒）。|
|easing|ease|アニメーション化するときに使われるイージング。イージングのセクションでもっと読んでください。|
|offset|0|スクロール時に適用されるべきオフセット。このオプションはv2.8.0からコールバック関数を受け付けます。|
|force|true|スクロールターゲットがすでに表示されている場合でも、スクロールを実行する必要があるかどうかを示します。|
|cancelable|true|ユーザーがスクロールをキャンセルできるかどうかを示します。|
|onStart|noop|スクロールが始まったときに呼ばれるべきコールバック関数。ターゲット要素をパラメータとして受け取ります。|
|onDone|noop|スクロールが終了したときに呼び出されるべきコールバック関数。ターゲット要素をパラメータとして受け取ります。|
|onCancel|noop|スクロールがユーザーによって中止されたときに呼び出されるコールバック関数（ユーザーがスクロールした、クリックしたなど）。パラメータとして|abort|イベントとターゲット要素を受け取ります。|
|x|false|X軸上でスクロールするかどうか|
|y|true|y軸上でスクロールするかどうか|
TeraTermの代わりにSeristerを使ったら結構良い感じだった話

# はじめに
Windowsでのターミナルソフトといえばご存じTeraTermがありますが，PCからマイコンへ複数バイトの情報を送る場合はTeraTermだとできないんですよね...
（もしかしたら設定次第では出来るのかもしれんが）

じゃあ他の方法としてArduinoIDEを使うといった方法もあるけど，私みたいにArduinoが嫌いでそれ以外のソフトを使いたいという人も少なくないはず...

そこでご紹介したいのが，「シリアル通信テスタ Serister」です．
https://www.vector.co.jp/soft/win95/hardware/se423507.html

# Seristerについて
特徴としては
・受信データをテキストファイルに出力可能
・制御コードを直接送信可能
・複数バイトを一気に送信可能（ここ大事）
があります．

# 使用例
NUCLEO-F303K8とPCを接続してエコーバックしてみた．

「通信設定」欄で各種設定を行う．
ポートはデバイスマネージャーから確認可能．
（デバイスマネージャーはWindowsアイコンを右クリックして選択可能）

「COM3」の場合，ポートは「3」を選択．
![スクリーンショット 2021-06-02 210914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320997/7c539ed9-68dd-38ed-bbb6-c49a7d04efaa.png)

下の方に送信する文字を入力する画面があるのでそれに入力して送信ボタンで送信．
ちゃんと送信できた．
![スクリーンショット 2021-06-02 211305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320997/15f218a3-02bd-e4f5-e89b-a0708a934ee4.png)

TeraTermよりこっちを使お．
【Vue.js】vue-burger-menを使ってハンバーガーメニューを実装


#vue-burger-menuとは

vue-burger-menuは、サイドバーハンバーガーメニュー実装できるコンポーネントライブラリです。

CSS transitionsとSVGパスアニメーションを使用したエフェクトとスタイルを10種類備えてあります。

#vue-burger-menuの導入方法

以下のnpm、yarn、CDNを使ってインストールします。

- npm
 
```
npm install vue-burger-menu --save
```

- yarn

```
yarn add vue-burger-menu
```

- CDN

```html:CDN
<script src="https://cdn.jsdelivr.net/npm/vue-burger-menu@2.0.3/dist/vue-burger-menu.umd.js"></script>
```


#導入手順

###1.ライブラリの取り込み

```javascript
import { Slide } from "vue-burger-menu";
Vue.component("slide", Slide);
```


###2. テンプレートを準備

<Slide> を設置します。

<Slide> は以下のプロパティを設定できます。

```html
<slide right disableOutsideClick width="200">
        <router-link to="/" class="header-link neon3 flash">HOME</router-link>
        <router-link to="/about" class="header-link neon3 flash"
          >ABOUT</router-link
        >
        <router-link :to="`/board/${this.uid}`" class="header-link neon3 flash"
          >POST</router-link
        >
        <router-link
          to="/signup"
          class="header-link neon3 flash"
          v-if="!authenticatedUser"
          >SINGUP</router-link
        >
        <router-link
          to="/signin"
          class="header-link neon3 flash"
          v-if="!authenticatedUser"
          >SINGIN</router-link
        >
        <router-link :to="`/mypage/${this.uid}`" class="header-link neon3 flash"
          >MYPAGE</router-link
        >
      </slide>
```

|||
|:--|:--:|--:|
|right|バーガーアイコンを左右のどちらに表示するか|
|width|メニューの幅を指定できます。|
|isOpen|サイドバーを開くか閉じるかを制御できます。|
|disableOutsideClick|外部クリックがトリガーされたときにメニューを閉じることをオフにすることができます。|
|disableEsc|Escキーを押すとメニューが閉じます。|
|noOverlay|オーバーレイをオフにできます。|
|burgerIcon|バーガーアイコンを無効にできます。|
|crossIcon|展開アイコンを無効にできます。|

###3.アニメーションの設定

アニメーション詳細につきましては[Github](https://github.com/mbj36/vue-burger-menu?ref=kabanoki.net)をご参照下さい。

10種類のアニメーションを実装することができます。

以下が設定可能なプロパティです。

- Slide
- ScaleDown
- ScaleRotate
- Reveal
- Push
- PushRotate
- FallDown
- Stack
- Elastic
- Bubble
 

アニメーションによっては、メインコンテンツのコンポーネントに id="page-wrap" を設定する必要があります。
以下のアニメーションを使用する場合は必ず設定しましょう。

- Push
- PushRotate
- ScaleDown
- ScaleRotate
- Reveal
gpu-burn で GPU のストレステストをするメモ

http://wili.cc/blog/gpu-burn.html

ぶっそうな名前がついていますが, 中身は cuBlas で gemm/dgemm 計算してストレステストするツールです.
ストレスかけるのには他にマイニングソフト使う手もありますが, gpu-burn は FPU も使うのでよりストレスかけるテストに使えます.

ビルドは CUDA SDK あれば特に問題なくいけるはずです.

## GPU を指定する

プログラム自体では指定できません.

`CUDA_VISIBLE_DEVICES=1 ./gpu_burn` などとして, `CUDA_VISIBLE_DEVICES` 環境変数を使いましょう.

ただ, GPU 温度表示は nvidia-smi でクエリしているため, 齟齬が生じておかしくなってしまいますので注意です!

## TODO

* [ ] OpenCL で似たのがあるかしらべる(AMD GPU でストレステストしたいときとか用)
【Vue × Firebase】親コンポーネントから子コンポーネントへpropsで渡す場合

#親コンポーネントから子コンポーネントへpropsで渡す場合


###親コンポーネント(board.vue)


今回は固定値ではなく変数の値を渡したいので子コンポーネントであるListに「:userDatas="userDatas"」のようにv-bindを使用して記述します。

```html
<List v-for="(list, index) in paginated('paginate-log')" :index="index" :list="list" :userDatas="userDatas"  :key="list.id"/>
```

data()内にuserDatas[]という空配列を用意して、Firestoreのusersコレクションを参照して、userDatas(配列)にpushする。

```javascript
export default {
  data() {
    return {
      userDatas: [],
    };
  },
  components: {
    Header,
    Post,
    List,
  },
  created() {
 
    firebase
      .firestore()
      .collection("users")
      .get()
      .then((snapshot) => {
        snapshot.forEach((doc) => {
          this.userDatas.push(JSON.parse(JSON.stringify(doc.data())));
        });
      });
  },
};
```

###子コンポーネント(list.vue)

```html
<img class="profile-icon" width="50" height="50" :src=" returnUserData() ? returnUserData().uploadedImage.fileUrl : preview"/>
```

```javascript
export default {
  data() {
    return {
      preview: require("../assets/デフォルト画像.jpg"),
    };
  },
  props: {
    userDatas:{
      type: Array,
      //親コンポーネント(board.vue)のuserDatasをpropsで渡している。
    }
  },
```

親コンポーネントからpropsで今回はArray(配列)でデータを受ける。

あとは、this.userDataという形でデータを使うことが出来る。
ShopifyでTOPページとそれ以外のページで出し分けする方法


TOPページと下層ページで表示を出し分けするときに少しつまったので備忘録として。

## 問題解決するために書いたコード

```liquid
    {% if template == 'index' %}
      <main class="main-content js-focus-hidden" id="MainContent" role="main" tabindex="-1">
        {{ content_for_layout }}
      </main>
    {% endif %}

    {% if template != 'index' %}
      <main class="main-content sub-content js-focus-hidden" id="MainContent" role="main" tabindex="-1">
        {{ content_for_layout }}
      </main>
    {% endif %}
```

`template == 'index` を書くことでindexページを読み込めるようです。
`!=` で`index`ページ以外と指定。

■参考記事
https://community.shopify.com/c/Shopify-Design/Handle-for-index-home-frontpage/td-p/274044

ページごとに出し分け
https://shopify-labo.com/shopify-conditional-branch/
Tips: ローカルで保存しているSQLファイルを一括で formatterにかける

## これは何
3000文字Tipsイベントの参加記事です。

https://qiita.com/official-events/d523df99d6479293ffa7

ローカルで保存しているSQLを、eslintと同じようにフォーマットにかけたいと思っていました。
これを実現する方法を紹介します。

## sql-formatterをinstallする
[sql-formatter](https://github.com/zeroturnaround/sql-formatter)は特定のSQLファイルをフォーマットできるツールです。しかしこれだけでは複数ファイルを一括でフォーマットにかけることはできません。
まずはsql-formatterをinstallだけしておきます。

```
yarn add -D sql-formatter
```

## 複数のファイルに一気にフォーマットをかけるスクリプトを用意する
複数のファイルをフォーマットにかけるようにするために、シェルスクリプトを用います。
以下のようなスクリプトファイルを用意してください。

```sh:format.sh
files=($(ls path/to/files/**/*.sql))
for file in ${files[@]}; do
  echo ${file}
  yarn run sql-formatter ${file} -o ${file} -u
done
```

これで複数のSQLファイルを一気にフォーマットにかけることができます。
Firebaseにdeployする際、沼ったのでメモ

# reactをFirebaseにdeployする際エラーで沼った

エラー内容

```
Reduce of empty array with no initial value
```

```
    at Array.reduce (<anonymous>)
    at release (/Users/ユーザネーム/.nodebrew/node/v14.6.0/lib/node_modules/firebase-tools/lib/deploy/functions/release.js:47:10)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
```

エラーの箇所を確認してもさっぱりわからず、、、

functionのデプロイ時でエラーが出ていることは分かったので,functionを避け

```
firebase deploy --only hosting
```
これで一応deployはできた。
解決はできていないので原因が気になります。。

##追記 (6/7)

firebase.jsonのこの部分がおかしかったみたいです。

```
"functions": {
 　"predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
   ]
},
```

こちらに変更すると上手く行きました！！


```
  "functions": {
    "predeploy": "npm --prefix functions run build"  
  },
```

functionsでエラーが出ていたからしっかりfunctionsを見直すべきでした。
恐らく `` firebase init`` の段階で間違ったのかな？

ちゃんとdeployできて良かったです。
phpMyAdminにログインした際のエラーについて

さくらvps内にララベルのプロジェクトを配置するために、mysqlをブラウザで管理したいと思い、phpMyAdmin
をcentOS内にインストールしました。その際、ログインした後に以下の画像のようなエラーが出てしまい、エラー文言を検索するなどしましたが、確信を得られる記事は見つかりませんでした。何か少しでも手掛かりがあることを教えていただければ幸いです。

###phpMyAdminをインストールした流れ

1.php関連のモジュールをインストール

```
dnf install php-pdo php-json php-xml php-mysqlnd php-gd php-mbstring
```

2.ドキュメントルートに移動してphpMyAdminをインストール

```
cd /var/www/html

wget https://files.phpmyadmin.net/phpMyAdmin/4.9.1/phpMyAdmin-4.9.1-all-languages.zip
unzip phpMyAdmin-4.9.1-all-languages.zip
mv phpMyAdmin-4.9.1-all-languages myadmin

```

※参考にした記事
https://qiita.com/lixwork/items/7b4cabd169803138b03f

![スクリーンショット 2021-06-02 20.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826735/b9d0506b-b511-a968-e2a9-e685e4d9f26f.png)
![スクリーンショット 2021-06-02 20.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826735/391dd41b-9d40-35dc-c314-501a5f9ef8b4.png)



###動作環境
CentOS Linux release 8.3.2011
PHP 8.0.7
mysql  Ver 8.0.25 for Linux on x86_64 (MySQL Community Server - GPL)
phpMyAdmin:version:5.1.0

試したこと
エラー箇所のphpファイルを確認するなどするも原因わからず、、
【AWS】S3の整合性モデルとアクセス管理

#プログラミング勉強日記
2021年6月2日

#S3の整合性モデル
　S3は高い可用性を実現するために、強い整合性は持っていない。同時書き込み時はタイムスタンプ処理を実施している。データ更新・削除には結果整合性モデルを採用している。そのため、データ操作をしている途中はデータの矛盾が発生する可能性がある。

| データ処理 | 整合性モデル |
|:--:|:--:|
| 新規登録 | Consistency Read 登録後即時にデータが反映される |
| 更新 | Eventual Consistency Read 更新直後はデータ反映に時間がかかる |
| 削除 | Eventual Consistency Read 削除直後はデータ反映に時間がかかる |

#S3のアクセス管理
　S3のアクセス管理は用途に応じで方式を使い分ける。他のストレージと違ってS3はインターネットから誰でもアクセスできるように使える。これを設定するにはパブリックアクセスを設定する。(パブリックアクセスを許可すると誰でもS3バケットのオブジェクトの読み込みができる)

##IAMユーザーポリシー
　IAMユーザやサービスに対してS3サービスへのアクセス権限を設定できる。一元的にユーザ権限を管理する。

##バケットポリシー
　バケットへのアクセス権をJSONで設定する。他のアカウントへの許可も可能。バケット単位の高度なアクセス管理向け。(IPアドレスの限定もできる。)

##ACL
　バケットと個々のオブジェクトへのアクセス権限をXMLで設定する。他アカウントへの許可も可能。簡易的にアクセス管理う向け。

##署名付きURL
　AWS SDKで生成した署名付きURLでS3のオブジェクトへの一定時間アクセスを許可する。一時的なアクセス権限を外部のユーザ(IAMユーザ以外)に渡したいときなどに使用する。
Ubuntu 18.04 で python の venv をインストールしたメモ

取りあえず、インストールしようとしたが失敗しました。
ensurepip が利用できないらしい。

```
$ python3 -m venv myvenv
The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

    apt-get install python3-venv

You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.

Failing command: ['/home/mh/djangogirls/myvenv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']
```

pip なしで venv をインストールします。

```
python3 -m venv --without-pip myvenv
cd myvenv
```

仮想環境を有効化します。‘

```
$ source bin/activate
```

仮想環境下において、get-pip をダウンロードします。

````
(myvenv) mh@my-local-dev-2:~/djangogirls/myvenv$ wget https://bootstrap.pypa.io/get-pip.py
--2021-mm-dd 19:56:57--  https://bootstrap.pypa.io/get-pip.py
Resolving bootstrap.pypa.io (bootstrap.pypa.io)... 151.101.88.175, 2a04:4e42:15::175
Connecting to bootstrap.pypa.io (bootstrap.pypa.io)|151.101.88.175|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1937800 (1.8M) [text/x-python]
Saving to: ‘get-pip.py’

get-pip.py                            100%[======================================================================>]   1.85M  4.88MB/s    in 0.4s    

2021-mm-dd 19:56:57 (4.88 MB/s) - ‘get-pip.py’ saved [1937800/1937800]
```

get-pip を使って、pip をダウンロード、インストールします。

```
$ python get-pip.py
Collecting pip
  Downloading pip-21.1.2-py3-none-any.whl (1.5 MB)
     |████████████████████████████████| 1.5 MB 3.2 MB/s 
Collecting setuptools
  Downloading setuptools-57.0.0-py3-none-any.whl (821 kB)
     |████████████████████████████████| 821 kB 11.9 MB/s 
Collecting wheel
  Downloading wheel-0.36.2-py2.py3-none-any.whl (35 kB)
Installing collected packages: wheel, setuptools, pip
Successfully installed pip-21.1.2 setuptools-57.0.0 wheel-0.36.2
```
残人生のためのプログラミング　第-1回

# LINENotifyでタスクの通知

前回(第21915回)のプログラムにTaskクラスを追加しました．
Routineクラスを少し変えたものですね．


~~~TaskNotify.py
import requests
import datetime

class Task:
	def __init__(self, name, date):
		self.name = name
		self.date = datetime.date(year=2021, month=date[0], day=date[1])
		self.sentence = "{}まで残り{}日\n".format(name, abs(self.date-today).days)
		tasks.append(self)


def create_send(tasks):
	sentences = "\n"
	for s in tasks:
		if s.date >= today:
			sentences += s.sentence

	return sentences


if __name__ == '__main__':
	today = datetime.date.today()

	tasks = []
	write_qiita = Task("Qiitaに記事を投稿する", (6, 2))
	submit_homework = Task("課題を提出する", (6, 3))
	toeic = Task("Toeicを受ける", (6, 20))

	send_dict = {'message': create_send(tasks)}

	TOKEN = 'hoge'
	url = 'https://notify-api.line.me/api/notify'
	TOKEN_dict = {'Authorization': 'Bearer ' + TOKEN}

	requests.post(url, headers=TOKEN_dict, data=send_dict)
~~~

![TaskNotify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578927/3cf0a253-d922-d4ee-0c70-9f3fff5bf2eb.png)


# 明日,第21913回は

タスクの管理をcsvで行えるように実装していきます．
pandasとかで出来るらしいすね．触ったことないや...
Ruby 問題⑨ クラスとインスタンスの概念を用いたコードの作成

#はじめに

6月になりました。
スクールを卒業してもまだまだ学習熱は冷めません！

本日もアウトプットしていきます。

クラスとインスタンスについてです。
プログラミング学習1ヶ月目の頃は理解するのに本当に時間がかかりました。

#問題

```.rb
class Profile

  def initialize(name, position, nationality, club)
    @name = name
    @position = position
    @nationality = nationality
    @club = club
  end

end

#上記のコードに追加を行い、以下の出力結果をにしてください。クラスとインスタンスを使用すること。

# 名前: カンテ
# ポジション: DMF
# 国籍: フランス
# クラブ: チェルシー 

```

#解答

```.rb
class Profile

  def initialize(name, position, nationality, club)
    @name = name
    @position = position
    @nationality = nationality
    @club = club
  end

  def name
    @name 
  end

  def position
    @position
  end

  def nationality
    @nationality
  end

  def club
    @club
  end

end

player = Profile.new("カンテ", "DMF", "フランス", "チェルシー")

puts "名前: #{player.name}"
puts "ポジション: #{player.position}"
puts "国籍: #{player.nationality}"
puts "クラブ: #{player.club}"
```


サッカー選手のプロフィールを知りたいという程でProfileクラスを作ります。

Profile.newでインスタンスを生成し、変数player（サッカー選手）に代入します。その際に、名前、DMF、フランス、チェルシーの3つ実引数を指定します。

initializeメソッドを定義し、インスタンス変数を宣言します。
実引数の値を、仮引数である、（position, nationality, club）に渡します。

```
name => 'カンテ'

position => 'DMF'

nationality => 'フランス'

club => 'チェルシー'
```

そして、それぞれのインスタンス変数の値を返すために専用のメソッドを定義し、最後4行で定義付けたメソッドを呼び出しています。

#自分で考えた解答

先ほどの解答は模範解答にありましたが、私なりに考えた解答が以下になります。

```.rb
# プロフィールの設計図作成
class Profile

  #インスタンス作成時に実行される
  def initialize(name, position, nationality, club)
    @name = name
    @position = position
    @nationality = nationality
    @club = club
  end

  #作成したインスタンスのよって値が異なる
  def info
      puts "名前:#{@name}"
      puts "ポジション:#{@position}"
      puts "国籍:#{@nationality}"
      puts "クラブ:#{@club}"
  end

end

playler = Profile.new("カンテ", "DMF", "フランス", "チェルシー")

playler.info

#名前:カンテ
#ポジション:DMF
#国籍:フランス
#クラブ:チェルシー

```
ssh: connect to host github.com port 22: Operation timed outエラー

公開鍵をGitHubにアップする際に表題のエラーが発生しました。

```
ssh: connect to host github.com port 22: Operation timed out
fatal: Could not read from remote repository.
```

この場合、22番ポートに接続できないことを表しています。
GitHubのssh接続は443のポート番号も許可している為、接続先を変更することで解決することがあります。
(公式のヘルプページ:https://docs.github.com/en/github/authenticating-to-github/troubleshooting-ssh/using-ssh-over-the-https-port)

以下で443ポートに接続するための設定ファイルを作成して、記述します。

```
$ vi ~/.ssh/config
```

```:~/.ssh/config
Host github.com
    User git
    Hostname ssh.github.com
    Port 443
    IdentityFile ~/.ssh/id_rsa  #鍵のあるパスを指定する
```


Proxy環境下ではポート番号22が使えないことがあるみたいなので、これが原因かもしれないしれないのですが、真相は不明です…。
Kotlin、SpringBootのプロジェクトで指定パスに画像を保存する

<!-- タイトル：Kotlin、SpringBootのプロジェクトで指定パスに画像を保存する -->
# はじめに
### 以前、入力フォームから投稿した画像ファイルをDBに直接保存する方法を実装したときに、DBには画像のパスだけを保存し、取得時にそのパスに存在する画像ファイルを参照するという保存方法もあるということを知り、今回はその方法で実装をしてみた。
<br>

# 実現したいこと
### 指定したパスにアップロードした画像ファイルを保存し、DBにはパス名のみを保存する。
<br>

# 調査
### java.io.Fileとorg.springframework.web.multipart.MultipartFileのtransferToメソッドを使用することでファイルの操作が実現できそう。
<br>
【Fileについて】

> Fileクラスで用意されているコンストラクタを紹介します。ファイルやディレクトリが存在しないFileオブジェクトを生成しても特に例外は発生しません。また、ファイルやディレクトリが作られることもありません。

|      コンストラクタ      |説明|
| ---------------------  | ---- |
|  File(String, String)  |  第1引数にPATH名を表す文字列を第2引数にファイルもしくはディレクトリ名を指定し、該当するFileオブジェクトを生成します。  |
<br>

【MultipartFileについて】
>default void	transferTo(PathSE dest)
<br>
受信したファイルを指定された宛先ファイルに転送します。

<br>

# 実装
### 今回は、パスに絶対パスを指定した実装を行う。
```kotlin
val postDate: Date = Date()
val sdf: SimpleDateFormat = SimpleDateFormat("yyyyMMddHHmmssSS")
val dateStr = sdf.format(postDate)
//第一引数のパスに第二引数で指定したファイル名で保存することを定義
val file = File("/Users/test/src/main/resources/images", "${dateStr}_${testForm.image?.originalFilename}")
try {
    //画像データをFileオブジェクトで指定したパスに指定したファイル名・拡張子で配置
    testForm.image?.transferTo(file)
} catch (e: IllegalStateException) {
    e.printStackTrace()
} catch (e: IOException) {
    e.printStackTrace()
}
```

<br>

# まとめ
### ファイルの配置場所及びファイル名まで、比較的柔軟に実装できることがわかった。DBにはFileの第一引数と第二引数を足した値を格納することでパス名のみを保存できる。
<br>

## 参考記事
https://www.javaroad.jp/java_io8.htm
<br>
https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html
DNNの学習に関するテクニック＠ゼロつく１

#重みの初期値
重みの初期値によってNNの学習の成否が分かれることがある。

理想：重みの値を小さくし、その分布もできるだけ均等にする。
→アクティベーションの偏りが小さくなり表現力が向上
→結果的に、過学習を抑えられ、汎化性能が向上する

「アクティベーション」　＝　「活性化関数の後の出力データ」


##なぜアクティベーションが偏るとまずいか？
例えば、Sigmoid関数
<img width="400" alt="ファイル名" src="https://upload.wikimedia.org/wikipedia/commons/b/b5/SigmoidFunction.png">

アクティベーションは活性化関数後の値である。
この値がもし０や１に偏っていた場合、その勾配はほとんど０であることが分かる。
この勾配が０になることが非常にまずい。なぜかというと逆伝搬の際、勾配の値が出力層から降りてくるにつれてどんどん小さくなってしまうからである。これが**勾配消失(gradient vanishing)**と呼ばれる問題。

##活性化関数ごとの推奨初期値
| 活性化関数 | 初期値 |
|:-:|:-:|
|Sigmoid, tanh(中法付近が線形関数)   | **"Xavierの初期値"**  |
| ReLU  | **"Heの初期値"**  |


###Xavierの初期値
目的：各層のアクティベーションを同じ広がりのある分布にすること
アルゴリズム：前層のノードの数を $n$ とした場合、$\frac{1}{\sqrt{n}}$ の標準偏差を持つガウス分布で重みを初期化する

※活性化関数に用いる関数は、原点対称であることが望ましい性質とされている。

###Heの初期値
アルゴリズム：前層のノードの数を $n$ とした場合、$\frac{2}{\sqrt{n}}$ の標準偏差を持つガウス分布で重みを初期化する


#Batch Normalization
ポイント：**強制的にアクティベーションの分布を調整する**

###Batch Normの利点

- 学習を早く進行させることができる
- 初期値にそれほど依存しない
- 過学習を抑制する
ディープラーニング学んでてよく見るけど毎回意味を忘れてしまう単語

#エポック
１エポック＝学習において訓練データをすべて使い切った時の回数

ex) １００００個の訓練データに対して１００個のミニバッチで学習する場合、SGDを１００回繰り返したら、すべてのデータを”見た”ことになる。この場合、１００回＝１エポックである。

つまり、全訓練データをどれだけ繰り返して見たかということを表す指標なのだと思う。
上の例でいうと、SGDを１００回ではなく２００回繰り返したら２エポックとなる。これはつまり、ある一つのデータを２回見たことと等しい。
したがって、エポック数が多いほど一つのデータを見た回数が多い＝しっかり見ているということになる。
EUによるAI規制案の説明Part4

前回からの続き

#1.　特殊なリスクAI
　　以下、ハイリスクAIでなくても、特殊なリスクが認められるために透明性に関する義務を課せられているAIについて解説します。なお、ここの規制は、ハイリスクAIであってもローリスクAIであっても適用されます（前文（70））。つまり、ハイリスクAIであってもチャットボットなどは、52条によるAIであることの明示が求められますし、ローリスクAIであっても同じです。その意味で、ハイリスクAIやローリスクAIとは別の類型という形で整理するのは適切ではないとも言えます。ただ、記載の便宜上、第3の類型として記載いたします。

　・第52条
　　　プロバイダーは、人間と相互交流することを意図しているAIについては、AIシステムと相互交流していることを通知するような方法で設計及び開発する必要があります。まあ、つまりは、人間ではなくAIと交流していると明示せよということかと思います。ただし、犯罪の検出、防止、捜査及び訴追のためのものとして法律で認められている場合は、講習が犯罪の発生を報告することを可能とするものに限り、上記の義務は発生しません。
　　　また、感情認識システム又は生体分類システムのユーザ（ユーザの定義が要注意であることについては前回の記事を参照。）は、分析対象となる人間にシステムの動作を通知する必要があります（2項）。ただし、犯罪を検出、防止又は捜査するために認められている生体分類システムには、そのような義務は生じません。
　　　さらに、見たところ実在の人間、物体、場所又はその他の存在又は事件と見分けがつかない、及び本物又は真実と誤って見えてしまう画像、音声又は動画コンテンツを生成又は操作するAIシステムのユーザ（ユーザの定義は要注意で、前回の記事を参照。）は、コンテンツが人工的に生成又は操作されたものと開示する必要があります（3項）。

#2.　特殊なリスクAIの解説
###　⑴　相互交流AI
　　　まあ、いわゆるチャットボットなどを念頭に置いた規定になります。つまり、人間のように回答してもらうとAIに親近感を持ち精神的に依存したりすることがリスクとして警戒されています。ただ、AIと伝えるという手段が、この問題に対して有効な手段となって言うのかは疑問の余地があろうかと思います。AIとわかっていても、親切な言葉をかけられたりして親近感を持って依存することの方が多いかと思います。「AIって気づかなかった！」ってほとんどないと思うんですよね・・・
###　⑵　感情認識等
　　　感情認識システムと生体分類システムですが、何を説明すればよいのですかね？原文は「the operation of the system」になっており、前文（70）の内容なども考えると、システムを利用して感情推定を行っていることを通知すればよいのかと思います。つまり「AIが顔の表情や体の動きから感情を推測しています」程度でよいのかと思います。
###　　⑶　生成モデル
　　　　最後の3項は、いわゆる生成モデルについての規定になります。具体的な示し方としては、動画等のコンテンツに一定の表示を入れるなどのようです（実は以前法律雑誌に載せた論文で、この手法を提案しており、同様の手法をその後の他の論文等で見かけなかったので、残念だったのですが、この規制案で再会できて、うれしく思っています。）。ただ、結構難しくて、歯の画像から入れ歯の設計図を作成する生成モデルなんかもあるわけです（画像の捜査に該当するかと思います。）。これにAI生成の表示って必要なのですかね？

#3.　ローリスクAI
　　ローリスクAIについては、規定はありません。なるべく頑張ってハイリスクAIの要求水準を満たしてほしいそうです。69条に行動指針を作るよう欧州委員会は支援するとあります。
　　個人的にはちょっと極端な気がしておりまして、ローリスクAIでも、判断理由がわかりにくいときは透明性を確保しましょうだとか、透明性としてAIを事業の中心にしている場合はAIポリシーを作って公表しましょうということもありえたと思います。

#4.　その他の規定
本規制案には、例えば制裁に関する規制などもあり、弁護士はこの手のテーマが好きなので解説したがる人が多いかと思いますが、本解説では止めておきます。やはり重要なのは何を行う必要が生じるかだと思いますので。
また本規制案の適用範囲（どのような場合に日本企業に適用されるか）についても、重要なのですが、やや法技術的なため割愛します。前文（11）に説明があります。機会があれば、Annexの和訳とともに記事にできればと思います。






やっと終わりました。規制案が発表された次の週のゴールデンウイーク直前くらいから、規制案を読み始めて、何か書こうと思っていましたが、全然読み進まず、当初の計画ではゴールデンウイーク前半に読み終わり、後半でほぼ書き終わっているという仮想戦記だったのですが、（ちょうどイマイチ体調もよくなく・・・）ゴールデンウイーク中に読み終わりもせず、仕事が始まって作業が進まないという苦悶の状況で、やっと読み終わってからも書き始めるのに時間がかかるという状況でしたが、「流石に発表されてから1か月くらいのところで何か出さないとまずいだろ・・・」ということで書き始め、やっと終えました。
前回記載したようにAnnexの内容を和訳できたらと思っています。Annexの内容って結構重要なんですよね。
vega

# 可視化ツールVega

```
$ cd my_libs_3
$ mv ~/Downloads/vega-master.zip .

$ [extract]

$ cd ~/my_libs_3/vega-master

# $ yarn
#
# Command 'yarn' not found, but can be installed with:
# sudo apt install cmdtest
#
#このように言われると、そのまま従いそうになるが、調べてみるとこれではだめらしい。

$  sudo npm install --global yarn

$ yarn  
```

```shell
$ cd my_libs_3

$ cp ~/Downloads/editor-master.zip .

$ [extract]

$ cd editor-master/

$ ls -l

$ yarn

[以下が自動的に走る]

yarn install v1.22.10
warning ../../package.json: No license field
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > react-split-pane@0.1.92" has incorrect peer dependency "react@^16.0.0-0".
warning " > react-split-pane@0.1.92" has incorrect peer dependency "react-dom@^16.0.0-0".
warning " > vega-embed@6.17.0" has unmet peer dependency "vega@^5.13.0".
warning " > vega-themes@2.10.0" has unmet peer dependency "vega@*".
warning " > vega-lite@5.0.0" has unmet peer dependency "vega@^5.19.1".
[4/4] Building fresh packages...
$ husky install && npx patch-package
husky - not a Git repository, skipping hooks installation
npx: installed 50 in 3.137s
patch-package 6.4.7
Applying patches...
resize-observer-polyfill@1.5.1 ✔
$ yarn vendor && beemo create-config
yarn run v1.22.10
warning ../../package.json: No license field
$ scripts/vendor.sh
Copying data to 'public/data'.
Copy examples to 'public/spec'.
/tmp ~/my_libs_3/editor-master
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   118  100   118    0     0    519      0 --:--:-- --:--:-- --:--:--   517
100 17.2M    0 17.2M    0     0  5439k      0 --:--:--  0:00:03 --:--:-- 6849k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   122  100   122    0     0    595      0 --:--:-- --:--:-- --:--:--   595
100 23.2M    0 23.2M    0     0  8572k      0 --:--:--  0:00:02 --:--:-- 10.4M
~/my_libs_3/editor-master
Done in 10.60s.
Done in 33.10s.

```

```shell
$ yarn start
yarn run v1.22.10
warning ../../package.json: No license field
$ webpack serve --mode development
ℹ ｢wds｣: Project is running at http://localhost:8080/
ℹ ｢wds｣: webpack output is served from /
ℹ ｢wds｣: Content not from webpack is served from /home/nemo_kohei/my_libs_3/editor-master/public
ℹ ｢wdm｣: Compiled successfully.

[これで画面がブラウザで開ける。]
```


## json in Python

```shell
## vega 環境に移動する
$ source activate vega 

$ conda install -c jmcmurray json
```
Android Studioのエミュレーターに画像をアップロードする方法

Android Studioのエミュレーターに画像をアップロードする方法の調査した結果をシェア。
簡単すぎて簡単過ぎて記事が見つからなかったので書き残します。

デバイス：Mac

やり方は簡単。

エミュレーターにアップロードしたい画像をドラッグ&ドロップするだけ。
あとは、エミュレーターのDownLoadsフォルダを確認すれば、ドラッグ&ドロップした画像が表示される。
Python3とOpenCV3でAIに画像認識させるための学習データを増やす

画像認識をするために大量の教師データが欲しかったので、1枚の画像から増やす方法が無いかと思い調べてみた。

##環境の構築
Python3とOpenCVの環境を構築します。
Anacondaを使ったPython環境の構築には以下の記事を参考にさせていただきました。

https://qiita.com/sakkaonline/items/4d30fff24a1752c3977a

Python環境が構築できたらOpenCVをインストールします。

Anacondaのコマンドラインから以下のコマンドを実行

```
$ pip install opencv-python
```

これで環境準備はOK

##画像を増やすプログラム
こちらの記事を参考にしました。

https://qiita.com/bohemian916/items/9630661cd5292240f8c7

記事中のリンクからincrease_picture.pyをダウンロードして、適当なフォルダに展開。
増やしたい画像ファイルを同じフォルダに入れたら、Anacondaのコマンドラインで展開したフォルダまで移動して。

```
python increase_picture.py 増やしたい画像ファイル
```

これでフォルダ内に「trans_images」というフォルダが作成され、元画像に色々な処理を加えた画像ファイルが入っています。

ただ、これだとファイルを指定しながら都度プログラムを起動しなければならないのが少々面倒です。
なので、ある程度まとまった画像ファイルを一度に処理できるようにしていきます。

##バッチファイルを使って自動化
先ず、先ほどから作業をしているフォルダ内に、**「image」**という名前のフォルダを作ります。
作ったら処理させたい画像ファイルをここに入れておきます。

次に、作業フォルダ内にバッチファイルを一つ作ります。
名前は何でも良いです。新規テキストファイルを作成して、「好きな名前.bat」としてください。
作成したらファイルをメモ帳で開いて、以下の通り書き換えます。

```
cd /d　%~dp0
 
for %%f in (image\*) do (
    python increase_picture.py %%f
    )
```

後はAnacondaのコマンドライン上で先ほど作成したバッチファイルを起動すると、
imageフォルダ内の画像が順番に処理されてtrans_imagesファルダ内に入っていきます。
Kotlinで書いたSpringBootのバッチを異常終了させたい

# はじめに
Kotlinで、となると絶妙に情報が少ないので書いてみました。

# 前提
- spring-boot-starter 2.4.x
- Kotlin 1.4.x

```SampleRunner.kt(ベースとなる起動クラス)
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.stereotype.Component

@Component
@ConditionalOnProperty(value = ["exec"], havingValue = "sample")
class SampleRunner : ApplicationRunner {
    override fun run(args: ApplicationArguments?) {
        // 何かしらの処理をする
    }
}
```

# 正常終了(万事うまくいったケース)
そのまま終了したら終了コード 0(正常)です。

# 異常終了(もう続行不能なので処理中断するケース１)
処理ロジック中でお好みのExceptionをThrowして異常終了させれば終了コード 1(異常終了)です。
ログにExceptionのStackTraceが出るので、どこでエラーが出たか分かります。

# 異常終了(もう続行不能なので処理中断するケース２)
終了コードのバリエーションが1だけじゃ足りない！という場合は、
特定の終了コードを返してくれるExceptionを自作しましょう。
（例：データの処理エラーは1で出社対応するけど、外部アクセスエラーでリトライしたい場合は2を返して、10分後にリトライしたい）

```AbcException.kt
import org.springframework.boot.ExitCodeGenerator

class AbcException(message: String) : Exception(message), ExitCodeGenerator {
    override fun getExitCode(): Int {
        return 2
    }
}
```
こちらも、ログにExceptionのStackTraceが出るので、どこでエラーが出たか分かります。

# 警告終了(とりあえず全データ処理したんだけど一部失敗しちゃったケース）
SampleRunnerまで返ってきたけど、処理結果が万事OKというわけではない。。終了コードは0以外にしたい場合です。

```SampleRunner.kt(上述)
class SampleRunner : ApplicationRunner {
    override fun run(args: ApplicationArguments?) {
        // 何かしらの処理をする
        val sampleStatus = "warning" // 実際は処理結果で判定してください！
        if( sampleStatus != "warning") {
            exitProcess(3)
        }
    }
}
```
こちらは、ログにStackTraceは出ません。なぜ異常終了したかは別途ログ出力しましょう。

# おわり
夏は気づいたらすごい(遅い)時間になっていてこわいですね。

上記のRunnerはたぶん `-Dexec=sample` で動きます。
さくらレンタルサーバーにLaravelインストール

## ①さくらレンタルサーバーにSSH接続する

```console:コンソール
ssh [初期アカウント名]@[初期アカウント名].sakura.ne.jp
```

パスワードを聞かれるので、サーバーパスワードを入れて接続。
（もしかしたら最初だけfingerprintきかれるかもなんでyesで）

phpのバージョンを php -v で調べたら７.4とかだったので最新のlaravelが入れられるみたいだった。

あとは該当のディレクトリに移動しておく

```console:コンソール
cd www
cd 〇〇〇←該当のディレクトリ名
```


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

Laravelをインストールする前に管理ツールのcomposerをインストールする。

```console:コンソール
curl -sS https://getcomposer.org/installer | php
（Use it: php composer.pharと出たら↓）
php composer.phar
```


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

今回は該当のディレクトリ直下にインストールしたかったんですけど、
やり方がわからなかったのでlaravelというディレクトリを作ってそこに入れました。


```console:コンソール
php composer.phar create-project laravel/laravel laravel --prefer-dist
```

## ファイルをディレクトリ直下に移動する

ディレクトリ直下に入れたかったので移動しました。


```console:コンソール
cd laravel
mv * ../
mv .[^\.]* ../
```

これで
http://[初期アカウント名].sakura.ne.jp/〇〇〇/public/
でみれますが、最後のpublicも取りたいので

publicディレクトリの中身も同様に一つ上の階層に移動させて

```console:コンソール
cd ../
cd public
mv * ../
mv .[^\.]* ../
```

移動したindex.phpのパスを書き換えます。
/../ってなってるところを/に変更。

```console:コンソール
if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {…

```

これで
http://[初期アカウント名].sakura.ne.jp/〇〇〇/
でみれるようになった！
Material Design Icons を Vue で JavaScript 的に使う

# はじめに
Vuetify で Material Design Icons を使っている例はよく見かけるけど、 Vuetify 無しでの例がなかなか見当たらないので自分用にメモ（と言っても[公式ドキュメント](https://dev.materialdesignicons.com/getting-started/vuejs)にほとんど書いてある）

# 前提
単一ファイルコンポーネントでの例を記載します

# 使ってみた
## 基本的な使い方
1. 導入する

    ```shell
    npm install @mdi/js @jamescoyle/vue-icon
    ```

1. インポートして使えるようにする

    ```vue
    <script>
    import SvgIcon from '@jamescoyle/vue-icon'
    import { mdiAccount } from '@mdi/js'

    export default {
      components: { SvgIcon },
      computed: {
        account () {
          return mdiAccount
        }
      }
    }
    </script>
    ```
（公式ドキュメントでは `data` 使ってるけど、特に状態として持たせたいわけではないので `computed` を使った）

1. 使う

    ```vue
    <template>
      <svg-icon type="mdi" :path="account"></svg-icon>
      account
    </template>
    ```

1. こうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16478/bdfad6fa-52d2-782b-521a-4dc35bc89b85.png)

## サイズや色を変える
これはどっちかというと @jamescoyle/vue-icon の使い方だが、サイズ指定やスタイリングも可能

```vue
<svg-icon type="mdi" :path="path" :size="16" style="color: gray; vertical-align: middle">
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16478/35c51ad4-7349-010e-b72e-b77053a888fc.png)
AtCoder Beginner Contest 203（Sponsored by Panasonic）備忘録

https://atcoder.jp/contests/abc203

当日不参加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/a703f2d9-c115-77b0-5a26-0c104b023cd5.png)
スマートに考えず、大した量じゃないので場合分けして記述する。
ミスしない。

```php
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <iostream>
using namespace std;

int main(void){
  int a,b,c;
  cin>>a>>b>>c;
  if(a==b && b==c){
    cout<<a<<endl;
  }
  else{
	if(a==b){
		cout<<c<<endl;
 	}
  	else if(b==c){
    	cout<<a<<endl;
  	}  
 	 else if(a==c){
    	cout<<b<<endl;
  	}
    else{
      cout<<"0"<<endl;
    }
  }
 }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/97266c30-ddc9-42b3-d8c7-46a92a562792.png)

N,K＜9なので何も考えずに２重ループで計算するだけ。
妙に簡単。

```php
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <iostream>
using namespace std;

int main(void){
    int N,K;
    cin>>N>>K;
    long long ans=0;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=K;j++){
            ans=ans+i*100+j;
        }
    }
    cout<<ans<<endl;
 }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/1e7a95bd-df48-a2b1-ac20-4e7b66c5823a.png)

10^100とみて、ナニコレ文字列で扱うのかなとか思いつつ、
よくよく見るとN～2E5, B~10^9だからどんだけ行っても10^15までなので、関係ない。
稼いだお金＝たどり着ける村。
Aを昇順に並べて、Bを足していき、都度A<moneyの比較式を繰り返して、Fになったところが到達村。
最初mapでAA[A[i]]=B[i]としたが、これだと探索する際にA[i]のmax値まで探索が必要。
A~10^18なのでメモリオーバー＆タイムアウトでTLE。
pair関数を使う。
pairで入力した後、昇順ソートして、要素数Nだけ比較式をぶち込む。

```php
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <iostream>
using namespace std;

int main(void){
    long long N,K;
    vector<pair<long long, long long>>AA;
  	cin>>N>>K;
    long long A;
    long long B;
    long long money=K;
    for(int i=0;i<N;i++){
        cin>>A>>B;
      AA.push_back({ A,B });
    }

    sort(AA.begin(), AA.end());//first 村の位置Aを昇順並べ替え
    for(int i=0;i<N;i++){//要素数はN個
            if(money>=AA[i].first){//所持金がAi以上なら、Ai村までたどり着ける
                money=money+AA[i].second;//Ai村でお金Biをもらう
            }
            else{
                break;//所持金Ai以下ならそこで旅終了。所持金=たどりついた村
            }
    }
   cout<<money<<endl;
}
```
AWS CLIのバージョンを1から2へとアップデートする

## ゴール
AWS CLIのバージョンを1から2にアップデートする
※使用しているOSはmac

## 手順
1. V1アンインストール
2. V2インストール

という手順で行う

## 現在のバージョン確認
```
$ aws --version
aws-cli/1.18.132 Python/2.7.16 Darwin/19.3.0 botocore/1.17.55
```
現在のバージョンは1.18.132である

## V1アンインストール
以下の2コマンドを実施

```
$ sudo rm -rf /usr/local/aws
$ sudo rm /usr/local/bin/aws
```

### 確認
```
$ aws --version
zsh: command not found: aws
```

## V2インストール
V2の最新バージョンをインストールする

### 1. pkgファイルをダウンロード
以下のリンクからDLできる
https://awscli.amazonaws.com/AWSCLIV2.pkg

### 2. インストーラを使用してインストール
ダウンロードしたファイルをダブルクリックして、インストーラを起動
インストーラーの指示に従いインストール
以下の場合を選択できる

- 全てのユーザー用にインストール
- 現在のユーザーのみにインストール

今回は「全てのユーザー用にインストール」を選択
ディレクトリはデフォルトで選択されているものを使用
「インストール」ボタンを押すことでインストールが開始される

### 確認
```
$ which aws
/usr/local/bin/aws
$ aws --version
aws-cli/2.2.8 Python/3.8.8 Darwin/19.3.0 exe/x86_64 prompt/off
```
V2がインストールされていることを確認

## 参考
- AWS CLI のバージョンについて
    - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/welcome-versions.html
- macOS での AWS CLI バージョン 1 のインストール、更新、およびアンインストール
    - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html
- macOS での AWS CLI バージョン 2 のインストール、更新、およびアンインストール
    - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html
ColaboratoryでS3を読みこむ

今年頭から仙台市場のデータをAWS lambdaを利用してS3に溜め込んでいる。
ある程度溜まったので、確認してみる。

#読み込み等

```python:s3_read.ipynb
# the AWS SDK for Python (Boto3) の読み込み
!pip install boto3 -q
import pandas as pd
import boto3
# ERRORがでるけどあまり気にしない。

# S3アクセス準備
# KEY, SECRETは　準備して、変数に入れておく。
s3 = boto3.resource('s3',
                       region_name="us-east-1",
                       aws_access_key_id=KEY,
                       aws_secret_access_key=SECRET
                   )

bucket=s3.Bucket('sendaimarket')

# file一覧の取得
files=[obj_summary.key for obj_summary in bucket.objects.all()]

# すべてのファイルを結合したデータフレームの作成
import io

mdf=[]

for i in files:
    response = s3.Object('sendaimarket',i)
    body_in = response.get()['Body'].read()

    buffer_in = io.BytesIO(body_in)

    df_in = pd.read_csv(
        buffer_in
    )
    mdf.append(df_in)

appended_data = pd.concat(mdf)

# データの加工
appended_data['date']=pd.to_datetime(appended_data['date'])
appended_data.set_index('date',inplace=True)
## lambdaでつくったCSVだと、重複部分がかなりあったので、削除
df=appended_data.drop_duplicates()

# グラフの表示
miyagi_hourensou=df[(df['area']=='宮城') & (df['product_name'].str.contains('ほうれん草')) ]

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

fig, ax = plt.subplots(figsize=(10,10))
ax.plot(miyagi_hourensou.index,miyagi_hourensou.high_price.astype(int))
ax.plot(miyagi_hourensou.index,miyagi_hourensou.low_price.astype(int))
fmt_half_year = mdates.MonthLocator(interval=1)
ax.xaxis.set_major_locator(fmt_half_year)
```

![miyagi_spinach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/44e1143d-af39-a989-bc5e-958cea7266f3.png)

三月安いな〜:sweat:

#解説
- IAMできちんとユーザを作って、`KEY`と`SECRET`は控えておく
    - これらは実際いったんファイルに書き出して読み出しています。セキュリティ上の問題で割愛
- `io.ByteIO()`なのは`get()`で読み出したデータはバイナリーデータ
    - [The file object must be opened in binary mode, not text mode.](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-example-download-file.html)
- データフレームをリストに入れておけば`pd.concat()`で一つになる。もちろん列は一緒にしておく必要がある。
- `str.contins()`で_ほうれん草_を選択しているのは_ほうれん草　L_があるから
- _matploblib_の例をそのまま使って月ごとの表示に加工している。

#まとめ
９０ものファイルの読み込みに１０秒程度かかったので、１年溜まったら一つのファイルにしてもいいかもしれないなと思いました。

https://vegetan.alic.go.jp/seiiku27/s_13_04.html

でみる、出荷最盛期と値段の波が一緒なのはしかたないんでしょうね。
【備忘録】Railsで作るアプリでグラフを描画する方法 Chartkick



# Chartkick
グラフ描画することができるぷろじぇくと 
いろんな言語で実装されているらしい

### 利点
* RubyとJavascript間のデータの受け渡しの意識が不要
    * データを並列にしてRubyのメソッドへ渡すだけ(Ruby側で実装が完結する)
* Rails6でもOK


## install
```ruby:/Gemfile
  ・
  ・
  ・
  gem "chartkick"
```

Gemfileの内容を反映する

```:ターミナル
  $ bundle install
```

chart.jsをインストール
(ここから下はRails6の話です, Rails5の場合は[Chartkick 公式](https://chartkick.com)のページを参照ください)


```:ターミナル
  yarn add chartkick chart.js
```

jsでimport

```javascript:/app/javascript/packs/application.js
import "chartkick/chart.js"
```

## Ruby(例)
```Ruby:/app/controler/コントローラ名_controller.rb
  @data = ハッシュ なり 配列 なり
```

```Ruby:/app/views/コントローラ名/なんたら.html.erb
<%= pie_chart(@data, colors:["000000",...
])  %>
```

![スクリーンショット 2021-06-02 19.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285348/411cf4b5-13ba-ac3c-ed26-5daef2d39446.png)





#その他

### [Chart.js](https://www.chartjs.org/docs/latest/)のオプションを使う

`dataset:{}`

```ruby:/app/views/コントローラ/なんたら.html.erb
<%= line_chart(@xy, dataset:{pointRadius:0, borderWidth:10}, width:"500px", height:"500px")  %>
```

![スクリーンショット 2021-06-14 18.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285348/c3a3c707-92a2-94f4-d2b1-ed068060f936.png)


### 複数の線を引く

```ruby:コントローラ
@lines = [{name:"a", data:[[0,0],[1,3],[4,4]]}, {name:"b", data:[[0,2],[1,2],[4,2]]}, {name:"c", data:[[0,5],[1,0],[4,3]]}]
```

```ruby:/app/views/コントローラ/なんたら.html.erb
  <%= line_chart(@lines, dataset:{tension:0, pointRadius:0})%>
```

![スクリーンショット 2021-06-14 20.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285348/e5a94be1-dbcc-774d-2ab3-a2d2487b6c2f.png)


# トラブルシューティング

### 1. Error Loading Chart
![スクリーンショット 2021-06-02 17.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285348/aa2812a6-e94a-fd8e-4b1e-e6c93e6d4933.png)

うまくライブラリをインポートできてなかったようです
(僕の場合は import "chartkick/chart.js"し忘れてました)

### 2. Loadingのまま変わらない

```:ターミナル
yarn add chartkick chart.js
```
は, 始めの一回でいいと思って2個目のアプリではやってなかったけど, 毎回必要だった.

```
diff １個目のアプリ 2個目のアプリ
```
で`package.json`に`chartkick chart.js`がなかったので判明



#参考
[Chartkick 公式](https://chartkick.com)
[Chart.js公式](https://www.chartjs.org/docs/latest/)




# つくったアプリ
宣伝です. こんなことができるアプリです(誰が使うんだろう...)
[herokuのページ](https://petitetest2.herokuapp.com)
[gitのリポジトリ](https://github.com/petite-etoile/heroku_test)
Nimで文字列の並び替え

# 文字列をsequenceに変換して並び替え、文字列に戻す。


- sequenceにする時にtoSeqを使うパターン

```sort1.nim
import sequtils
import algorithm 
import strutils

let value = "54321"
let sortedChars = toSeq(value.items).sorted(cmp)
echo sortedChars.join()

```

- sequenceにする時に@を使うパターン

```sort2.nim
import algorithm 
import strutils

let value = "54321"
let sortedChars = @value.sorted(cmp)
echo sortedChars.join()

```
GitHub Issues と Pull request を使って一人でも疑似チーム開発する

# GitHub Issues と Pull request を使って疑似チーム開発を行う
私が個人でポートフォリオを作成していて、疑似チーム開発に慣れといた方がいいと思って開発の後半から導入。
※自分ためのメモ用と、まだやり方がわからない向け。

流れとしては、
Issues作成 → ローカルで作業用branch作成 → 作業をcommit → リモートにpush → Pull request作成 → main(master)ブランチにmerge

## Issues作成
1. New Issuesをクリック。
2. タイトルとコメントを記入。
 - タイトルは課題の内容(〜の機能が欲しい、〜という問題がある)を端的に表現して、コメントの部分で仕様やバグの再現手順などを詳細に書いていく。
3. [Submit new Issue]をクリックしてIssues作成。

## ローカル環境で作業用branchを作成
1. ```git branch```で現在のBranch確認。
2. ```git checkout -b feature/作業名(ブランチ名)#issue番号```で作業ブランチ作成。
 - checkout -b ブランチ名　とする事で、新ブランチの作成とブランチの変更を同時に行ってくれる。
3. ```git branch```でブランチが作成・変更されたか確認
4. ```git push origin HEAD```でリモートにpush
 - これによってチームがいたと仮定した場合、みんなが作業の開始を把握できる。
 - git push origin HEAD で現在のbranchにpushできる。

## 作業をadd、commit
1. Issuesにある作業をローカル環境で変更したら、```git status```で変更ファイルを確認。
2. ```git diff```で差分を確認し、```git add ファイル名```。
 - ```git add .```で全ての変更をaddできる。
3. ```git commit -m "コミットメッセージ"```でコミット。
 - 1機能ごとにコミットするといったように、コミットの間隔を狭めて変更点をわかりやすくする。
 - コミットメッセージも、メッセージから変更内容がわかるようにわかりやすく書く。

## リモートにpush
1. ```git push origin HEAD```。

## Pull request作成
1. GitHubで自分のリポジトリのページへいき、上に出ている緑色の[Compare & pull request]をクリック。
2. 修正点を一言で表すようなタイトルを付け、実装内容や補足をコメント欄に書いて、[Create pull Request]をクリック。
3. コメント欄の最後に```close #issue番号```と記載する事で、mergeされた時、自動的にその番号のissueがcloseする。
3. 緑色の[Merge pull request]をクリックし、[Confirm merge]をクリックで完了。

## 最後に
githubまだまだ私も勉強中ですが、一緒に頑張りましょう。


参考
[チーム開発を変える「GitHub」とは？〜Pull Requestの使い方〜【連載第2回】](https://seleck.cc/635)
[チーム開発を変える「GitHub」とは？〜Issuesの使い方〜【連載第3回】](https://seleck.cc/647)
PHP 記述と条件方法



#PHPの記述

```
<?php
この間いにプログラムを記述する
?>

例
<?php                
print('こんにちは');　最後に（;）セミコロンのをつける
?>
→こんにちは

上記は
print→関数
こんにちは→引数

```

| エスケープシーケンス | 意味 | 
|:-----------|:------------|
| \n    |  改行 |
| \r    |  キャリッジリターン |
| \t    |   タブ |
| \\    |   \ |
| \$    |   $ |
| \"    |   " |
| \'    |   ' |

#文字の連結
```
print('あ');
print('い');
print('う');
→あいう

print('あ'.'い'.'う');
→あいう　
結果は同じだけど、printの省略を行える！
```

#変数の扱い方
```
最初に$をつけることで変数として扱うことができる！
$日本　　変数は日本語でも可能！！！！！！！！
$123　　最初に数字など記号は変数にできない！！！！！！！

例
<?php $sum = 100+100+100; ?>　　　
合計金額は<?php print($sum); ?>円です　　　→合計金額は300円です
税込金額は<?php print($sum　*　1.1); ?>円です　→税込金額は３３０円です
```

#While,for 条件繰り返し
```
初期化処理
while (繰り返しの条件) {
　　繰り返したい処理
　　更新処理
}

例
<?php
$i = 1;
while ($i <= ５) {
  print($i. "\n");
  $i += 1;
}
?>
→１、２、３、４、５

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

for（初期化処理；　繰り返し条件；　更新処理；）{
　　繰り返したい処理；
}

例
<?php
for ($i=1; $i<=5; $i+=1) {
  print($i."\n");
}
?>
→１、２、３、４、５


```

#比較演算子

| 記号 | 意味 | 
|:-----------|:------------|
| A<B     | AがBより小さい |
| A>B     | AがBより大きい |
| A>=B    | AがB以上     |
| A<=B    | AがB以下     |
| A===B   | AとBが等しい   |
| A!==B   | AとBは等しくない |
| !A      | Aではない      |
PHPでHTMLで日本語の文章に自動でふりがなをふる方法

あまり使う機会はないと思いますが、日本語にネイティブむけ、子供向けwebサイトの構築に使えます。

# 必要なもの

 1.mecabなどの日本語形態素解析器ソフト

https://taku910.github.io/mecab/
https://igo.osdn.jp/#feature



rubyというタグを使っていきます。

< ruby > 〜<rp >( </rp > <rt >~</rt><rp >)</rp ></ruby >
これをつかっていきます。


classをインスタンス化するなどしてreadmeなどを参照にしながら、日本語の読みを取得します。
やり方はそれぞれですが、ひらがなだけやカタカナだけは除くなどの分岐をして漢字のみのルビを取得します。

rubyタグの内側に出力すれば完了です。

では。
PowreShellでyyyyMMdd_コンピュータ名のディレクトリを作成する

#はじめに

Windowsサーバで作業する際、作業フォルダに保存したエビデンスをまるっとコピーして別環境にまとめてもってくることが多々あります。
その際、フォルダに、作業日と日付が入っていると見分けやすくて便利です。

#コマンド

```PowerShell
New-Item -path C:\temp\ -name ($env:COMPUTERNAME + '_' + $(Get-Date).ToString("yyyyMMdd")) -type directory
```


C:\temp配下に、yyyyMMdd_コンピュータ名のフォルダが作成できました。
Raspberry PIにてSWAPファイルのリサイズ

#概要
最近Raspbery Pi 4の場合は、物理メモリが２GB、４GB、８GBまでの種類がありますが、
この状況でもシステムのメモリが足りない場合、SWAPメモリを使用します。
デフォルト的にはSWAPメモリは「100MB」しか指定されていないので、
今回に１GBに設定を変更します。

#参照した公式サイト
https://pimylifeup.com/raspberry-pi-swap-file/

#現在設定されているSWAPファイルのサイズを確認
次のコマンドで現在設定されているSWAPファイルのサイズが確認できます。

~~~bash
pi@raspberrypi:~ $ sudo swapon --show
NAME      TYPE SIZE USED PRIO
/var/swap file 100M   0B   -2
~~~

#SWAPファイルサイズを変更する前に実行するコマンド
現在システムで使用しているSWAPメモリを中止するコマンドになります。

~~~bash
pi@raspberrypi:~ $ sudo dphys-swapfile swapoff
~~~

#SWAPファイルのサイズ変更
次のコマンドでSWAPファイルのサイズ変更するため、以下のファイルを編集します。

■変更内容
CONF_SWAPSIZE=100
↓↓↓↓
CONF_SWAPSIZE=1024

~~~bash
pi@raspberrypi:~ $ sudo vi /etc/dphys-swapfile
~~~

編集した後、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/1b11d441-a81d-0951-385a-8dc8a2bdfd58.png)

#SWAPファイルを再作成
次のコマンドでSWAPファイルを再作成します。

~~~bash
pi@raspberrypi:~ $ sudo dphys-swapfile setup
want /var/swap=1024MByte, checking existing: deleting wrong size file (104857600), generating swapfile ... of 1024MBytes
~~~

#現在システムにSWAPシステムを反映
次のコマンドで停止したSWAPファイルを現在システムに反映するコマンドを実行します。

~~~bash
pi@raspberrypi:~ $ sudo dphys-swapfile swapon
~~~

#システム再起動
念のため、システムを再起動します。

~~~bash
pi@raspberrypi:~ $ sudo reboot
~~~

#SWAPメモリがサイズ確認
次のコマンドで確認ができます。
※再起動しなくても確認は可能でした。

~~~bash
pi@raspberrypi:~ $ sudo swapon --show
NAME      TYPE  SIZE USED PRIO
/var/swap file 1024M   0B   -2
pi@raspberrypi:~ $ 
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/c34c97d5-c9fb-38e4-ea75-717cb9d3019a.png)

#終わりに
今まで物理メモリのサイズに困ったことはなかったですが、
これからはSWAPメモリのサイズ変更でもっとスムーズに使うことができるかもしれないですね。
今回のRaspbery PiはDockerの環境を使用するため、８GBのRaspbery Piを購入しましたが、既存設定が「100MB」だったので、SWAPメモリを１GBに変更する内容のメモを残します。
Tera termでEC2へのssh接続を簡易化する方法（+ログ自動保存とフォント設定）

# 前置き
EC2へssh接続する際に、いちいちcmd上で`ssh -i xxxx.pem ec2-user@xxx.xxx.xxx.xxx`と打つのが手間になってきました。

同時に、そろそろcmdからつなぐのも味気ないなと思いつつ、ボタンぽちーでサクッとつながる or UIがかっこいい、といったイケてるターミナルを探してみたものの、やっぱりセキュリティ面を考慮するとTera termが手堅いらしい？（超ざっくり）

ということで、Tera termからEC2にパスワードの入力のみでssh接続する設定と、設定の保存方法を個人用メモとしてまとめました。
また、プラスでログの自動生成と、ちょっとイケてるフォントに変更する方法も記載しています。

# ssh設定（公開鍵方式）
タブの設定＞SSH認証から以下のとおり設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1563931/f426d5b2-9462-e858-f080-bf722a786020.png)
秘密鍵の部分は「...」のボタンを押下し、フォルダからローカルにあるEC2の秘密鍵を選択。
（`ssh -i xxxx.pem ec2-user@xxx.xxx.xxx.xxx`のxxxx.pemの部分）

設定が完了したら、OKを押下。

最後に、タブの設定＞設定の保存を押下し、以下の設定ファイルを選択して保存。
⇒★これで設定が保存される！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1563931/ac638ae9-a1fa-4e48-184b-bbf30cb30078.png)


# ログ自動生成
タブの設定＞その他の設定＞ログから、以下の通り設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1563931/da9c5217-e260-5ab3-14a5-5d5f365cf440.png)

・標準ログファイル名
⇒%Y%m%d_%H%M%S_&h.log

出力されるログファイル名は20210602_070120_xxx.xxx.xxx.xxx.logのようになる。
ファイル名に時刻が含まれるため、名前が重複しないので上書きの恐れがない。

・標準のログ保存先フォルダ
⇒任意のフォルダを指定。（画像はC直下にTeratermlogsというログ用のフォルダを作成した例。）

・オプション（必要に応じて）
タイムスタンプはあるとよいかも。

最後に、タブの設定＞設定の保存を押下し、設定ファイルを選択して保存。
⇒これで設定が保存される！（忘れないよう注意）

※参考：

https://itsakura.com/teraterm-log#:~:text=%E3%83%AD%E3%82%B0%E3%81%AE%E8%87%AA%E5%8B%95%E4%BF%9D%E5%AD%98%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86%E6%96%B9%E6%B3%95,-%E3%83%AD%E3%82%B0%E3%81%AE%E8%87%AA%E5%8B%95&text=%EF%BC%91%EF%BC%8E%E3%80%8C%E8%A8%AD%E5%AE%9A%E3%80%8D%E2%86%92%E3%80%8C,%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%82%92%E5%8F%82%E7%85%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82


# フォント

以下参考。良い感じです。

https://teraterm.jp/?p=1534

最後に、タブの設定＞設定の保存を押下し、設定ファイルを選択して保存。
⇒これで設定が保存される！（忘れないよう注意！！！！！！）

以上。
STM32 Timer

Encoder

https://garberas.com/archives/244

https://rt-net.jp/mobility/archives/10718

https://www.shujima.work/entry/2019/05/28/221629

Counter

https://depfields.com/timer/

http://embdlog.blogspot.com/2020/04/

https://base64.work/so/timer/3881355

https://community.st.com/s/question/0D50X00009XkiWwSAJ/stm32f4-timer-external-pulse-counting

https://stackoverflow.com/questions/47176441/using-a-timer-to-count-pulses-on-stm32f7

https://www.programmersought.com/article/8737950886/

https://letanphuc.net/2015/06/stm32f0-timer-tutorial-and-counter-tutorial/

https://www.fmf.uni-lj.si/~ponikvar/STM32F407%20project/Ch9%20-%20Counting%20pulses%20by%20Timer%202.pdf