OmniAICreator/Qiita-1.07M huggingface dataset:
応用情報技術者試験（AP）おすすめの勉強方針

#前書き
2019年4月に受験し，合格することができました．
その際の勉強方針とおすすめの参考書を紹介します．

#結論
先に結論を述べます．めんどくさい人はここを読んでいただければ私は満足です．
##勉強方針
###午前
過去問道場をひたすら解く．
一日10問を30日かければ300問解くことになります．これくらいやればおそらく大丈夫です．
不安な人は一日に解く問題数を上げるか，日数を増やすと良いと思います．
###午後
得意または難易度が（相対的に）低めのもの**3分野を選択**．
すべて満点を取るくらいの意識で集中的に勉強します．
そうは言っても８割程度（つまり48点）が限界のはずです．
残りの12点を勉強をほとんどしていない2分野で6点ずつ取ります．
#なぜ3分野のみ？？
5分野すべてを網羅しようとすると時間的なコストが大きくかかります．
時間を勉強に集中的にかけられる環境なら良いですが社会人の方の多くはそうではありません．分野を3つに絞ることで各分野の理解度を集中的に向上させます．幸い，情報処理試験は出題形式や範囲はある程度限られていますし，同じ分野を解くほうが理解の整理もしやすいです．
#残りは勉強しなくてもよいのか？
これは人によりけりですが，午前の過去問道場を解いている・基本情報の資格は持っているという前提であれば，不要だと思います．それよりも3分野にコストを投じることが優先されます．3分野すべて大丈夫という自信がついた段階で余裕があれば取り組む程度でよいでしょう．
#どの分野を選べばよいか
**おすすめはセキュリティ・DB・アルゴリズム**です．
セキュリティ・DBは覚える範囲が比較的少ない印象です．過去問題を十分に取り組んでいれば高得点が期待できます．特にDBは出題形式・範囲はかなり限られるので，苦手だと思っている人も取り組んでみると意外と簡単だったという人が多いです．
アルゴリズムは覚えるというより思考力が求められます．問題形式に慣れるとすんなり解けるようになります．
ただし，分野は各人の経歴などに大きく依存するため，学んできたことや将来取り組みたいことなどを考慮して選択すると良いでしょう．
#おすすめの参考書
[応用情報技術者午後問題の重点対策 (重点対策シリーズ) ](https://www.amazon.co.jp/2019%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E5%8F%A3%E9%81%94%E5%A4%AB/dp/4865751556/ref=pd_sbs_14_1/355-6431475-6432031?_encoding=UTF8&pd_rd_i=4865751556&pd_rd_r=f08c3fa9-0391-435c-8cbe-e52a4ab51625&pd_rd_w=8wBvz&pd_rd_wg=dRWNu&pf_rd_p=ad2ea29d-ea11-483c-9db2-6b5875bb9b73&pf_rd_r=1994N76Z473P3TJDG8E8&psc=1&refRID=1994N76Z473P3TJDG8E8)です．
分野別に過去問が収録されており，非常に勉強しやすいです．
色々手を出すよりもこの本一冊で徹底的に勉強すれば十分です．

#まとめ
合格した際の勉強方針を紹介しました．様々な効率的な勉強方法がありますが，友達や同僚と一緒に頑張ることが何よりも大事です（これは本当）．お互い高めあって勉強できる環境を見つけてください．皆さんの吉報お待ちしてます！！
Vimで定型文の補完を行う簡易な方法（２）

# 問題

以前の投稿 [Vimで定型文の補完を行う簡易な方法](https://qiita.com/thino-rma/items/98826309371fa21bb5a3) にて、任意のテキストファイルから補完するスクリプトを紹介した。
紹介したスクリプトは単純であるが、候補表示してからタグのような ```<``` を入力するとポップアップメニューが消えてしまい、不便であった。
そこで、カーソル位置の直前にある文字列（空白またはタブ区切り）で絞り込むように修正したので、紹介しておく。

# 対処
以下を、~/.vimrcに追加する。

```console
function! s:CompleteFrom(files)
  let pos = col('.') - 1
  let line = getline('.')
  let start = pos
  while start > 0 && line[start - 1] !~ '[ \t]'
    let start -= 1
  endwhile
  let word = strpart(line, start, pos - start)
  let lines = []
  for f in a:files
    let inputfile = expand(f)
    for line in readfile(inputfile)
      if line =~ '^'.word
        call add(lines, line)
      endif
    endfor
  endfor
  call complete(start + 1, lines)
  return ''
endfunction

inoremap <F10> <C-R>=<SID>CompleteFrom(["$HOME/mydict.txt"])<CR><C-P>
nnoremap <F10> i<C-R>=<SID>CompleteFrom(["$HOME/mydict.txt"])<CR><C-P>
inoremap <F11> <C-R>=<SID>CompleteFrom(["$HOME/mydict2.txt", "$HOME/mydict3.txt"])<CR><C-P>
nnoremap <F11> i<C-R>=<SID>CompleteFrom(["$HOME/mydict2.txt", "$HOME/mydict3.txt"])<CR><C-P>
```

仕様については、以前の [投稿](https://qiita.com/thino-rma/items/98826309371fa21bb5a3) を参照してください。
Jupyter学習ノート_007

## google colabにpytestを試して見る

下記の手順で実施する

- ソースコードを用意する
  - ネーミングルール
     - 「test」で始まるメソッドにする
     - 結果がOKかNGかはassert条件式の結果より判断する

```pytest01.py
def add(a, b):
    return a + b

def sub(a, b):
    return a - b
```

```test_pytest01.py
from pytest01 import add, sub

def test_add():
    assert add(1, 2) == 4 # NGになる

def test1_sub():
    assert sub(3, 1) == 2 # OKになる

def atest_sub():
    assert sub(3, 1) == 2 # pytestが認識できない
```

- 実施した結果
![実施結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/73274a71-e508-db1a-08e6-3be28093f949.png)
【初心者向け】超簡単ドリンク注文アプリケーション（ドリンクに値段をつけるver）

#超簡単ドリンク注文アプリケーションに値段をつけてみる

こちらは前回の続きです。
前回のアプリケーションはこちら
https://qiita.com/pontarou194/items/708452b47464bfcad122

条件
　・実行時、どのようなドリンクがあるかを表示させる
　・ドリンクには番号をつける
　・選ばれた番号と同じドリンク名を表示させる
　・ドリンクに値段をつける
　・ドリンクの注文数を訪ねて、入力された値に対して合計額を表示させる

#擬似コード

```ruby

def 
お茶が選ばれた場合、値段を表示
注文数を入力
合計額を表示
end

def 
コーヒーが選ばれた場合、値段を表示
注文数を入力
合計額を表示
end

def 
ビールが選ばれた場合、値段を表示
注文数を入力
合計額を表示
end

def
サイダーが選ばれた場合、値段を表示
注文数を入力
合計額を表示
end

#それぞれのドリンクメニューの値段を残す
otya = 100
coffee = 200
beer = 300
saida = 400

#ここから先、変数をつけたの以外は前回と一緒なので、そのまま記述します
  puts "何を飲みたいですか？"
    drink_menu = ["お茶","コーヒー","ビール","三ツ矢サイダー"]
    drink_menu.each.with_index(1) do |drink_name, number|
      puts "#{number}:#{drink_name}"
    end

  case gets.to_i
    when 1
      otya(otya)
    when 2
      coffee(coffee)
    when 3
      beer(beer)
    when 4
      saida(saida)
    else
      puts "無効な入力値です"
    end

```

#実際にコーディングしてみる

```rb
def otya(otya)
  puts "あなたが選んだのはお茶"
  puts "お茶の値段は100円です"
  puts "いくつ注文しますか？"
  order_quantity = gets.to_i
  total_price = order_quantity * otya
  puts "合計#{total_price}円です"
end

def coffee(coffee)
  puts "あなたが選んだのはコーヒー"
  puts "コーヒーの値段は200円です"
  puts "いくつ注文しますか？"
  order_quantity = gets.to_i
  total_price = order_quantity * coffee
  puts "合計#{total_price}円です"

end

def beer(beer)
  puts "あなたが選んだのはビール"
  puts "ビールの値段は300円です"
  puts "いくつ注文しますか？"
  order_quantity = gets.to_i
  total_price = order_quantity * beer
  puts "合計#{total_price}円です"
end

def saida(saida)
  puts "あなたが選んだのは三ツ矢サイダー"
  puts "サイダーの値段は300円です"
  puts "いくつ注文しますか？"
  order_quantity = gets.to_i
  total_price = order_quantity * saida
  puts "合計#{total_price}円です"
end

otya = 100
coffee = 200
beer = 300
saida = 400

  puts "何を飲みたいですか？"
    drink_menu = ["お茶","コーヒー","ビール","三ツ矢サイダー"]
    drink_menu.each.with_index(1) do |drink_name, number|
      puts "#{number}:#{drink_name}"
    end

  case gets.to_i
    when 1
      otya(otya)
    when 2
      coffee(coffee)
    when 3
      beer(beer)
    when 4
      saida(saida)
    else
      puts "無効な入力値です"
    end
```

変数及び、引数の勉強になるかと思って使ってみました。
otya(otya)が呼び出された際に、otya(otya)メソッドに飛んで、otya(otya)メソッドではotyaの値段を参照しているため、
otyaの値段と入力された数をかけた合計額が表示される。

#動作確認

```
何を飲みたいですか？
1:お茶
2:コーヒー
3:ビール
4:三ツ矢サイダー
3
あなたが選んだのはビール
ビールの値段は300円です
いくつ注文しますか？
4
合計1200円です
```

今回は以上となります。
引数便利ですよね。

ここは違う、このようにしたほうがセンスが良い等ございましたら、ご指摘いただけますと幸いです。

最後までみていただきありがとうございます。


※@scivola さんからアドバイス頂いた、リファクタリングverを下記に記述しました。
https://qiita.com/pontarou194/items/c7e35b6eed6fce78e999
CloudWatch Eventsで別のアカウントをイベントターゲットに出来る「Event Bus」

https://dev.classmethod.jp/cloud/aws/cloudwatch-events-event-bus/
アカウントBでEvent Busへの権限設定
↓
アカウントAでEvent Bus（アカウントB）をターゲットにしたルールを作成
↓
アカウントBでルールを作成（ソースでアカウントAのみに絞るなどできる）
rails sが起動しない　rails5.2.2

rails 5.2.2をインストールしたときのエラー

```
Please check your Rails app for 'config.i18n.fallbacks = true'.
If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be
'config.i18n.fallbacks = [I18n.default_locale]'.
If not, fallbacks will be broken in your app by I18n 1.1.x.
```
警告文の第２段落によると、

I18n(>= 1.1.0) かつ Rails (< 5.2.2) において fallback 機能を有効にしたい場合、

または、

警告文の第３段落で紹介されているgithubのページによると、

I18n 1.1.x 系において fallback 機能を有効にしたい場合、

```/config/environments/production.rb
config.i18n.fallbacks = [I18n.default_locale]
```
rails newの度に毎回これをやらないといけないのか

```
If you're using I18n (>= 1.1.0) and Rails (< 5.2.2)
```
と書かれていることから5.2.2では治るのかどうなのか
【第2回】pythonでCPUとメモリの使用率を取得する

# CPUとメモリの使用率を取得する第2回です。

## 前回からの違いは、ボタンを押した分だけログが取れること

## 動くこと優先してます。
- ソース的にキレイにできそうなところもあるけどとりあえず動くことを優先してます。

## ファイルの存在確認入れてるんだけど？
- なんかうまく動いてないっぽい。
- logファイルを先に作っておくとうまくいく。

## 動作確認
- windows10 1909
- mac catalina

```python3
#!/usr/bin/env python
import psutil as psu
import tkinter as tk
import sys
import os
import datetime

# tkinterでwindowの作成とタイトルを作る
# windowサイズの指定
root = tk.Tk()
root.title(u"CPU&メモリ使用率")
root.geometry("600x300")

# cpu用ラベル
Static1 = tk.Label(text=u'CPU:')
Static1.pack()
# CPUの取得した値を表示する
txtcpu = tk.Entry(width=20)
txtcpu.pack()

# memory用ラベル
Static2 = tk.Label(text=u'memory:')
Static2.pack()

# memoryの取得した値を表示する
txtmem = tk.Entry(width=20)
txtmem.pack()


log = './cpumem.log'


def btn_click():
    # テキストボックスをクリア
    txtcpu.delete(0, tk.END)
    txtmem.delete(0, tk.END)
    if(os.path.exists(log)):
        with open(log, mode='a', encoding="utf-8") as f:
            # 時間の取得
            dt_now = datetime.datetime.now()
            # 日時のフォーマット修正
            dt = dt_now.strftime('%Y/%m/%d %H:%M:%S')
            # メモリの利用情報を取得
            memory = psu.virtual_memory()
            txtcpu.insert(0, memory.percent)
            cpu_percent = psu.cpu_percent(interval=1)
            txtmem.insert(0, cpu_percent)
            cpulog = txtcpu.get()
            memorylog = txtmem.get()
            f.write(dt + " " + cpulog + " , " + memorylog + "\n")
    else:
        with open(log, mode='w', encoding="utf-8") as f:
            # 時間の取得
            dt_now = datetime.datetime.now()
            # 日時のフォーマット修正
            dt = dt_now.strftime('%Y/%m/%d %H:%M:%S')
            # メモリの利用情報を取得
            memory = psu.virtual_memory()
            txtcpu.insert(0, memory.percent)
            cpu_percent = psu.cpu_percent(interval=1)
            txtmem.insert(0, cpu_percent)
            cpulog = txtcpu.get()
            memorylog = txtmem.get()
            f.write(dt + " " + cpulog + " , " + memorylog + "\n")


# ボタンの生成
Button = tk.Button(root, text='使用率取得', command=btn_click)
Button.pack()

root.mainloop()
```
## 実は、まだ次回があります。
アルキメデスの円周率計算手法の正確さについて

#はじめに
アルキメデスは円に外接する正６角形、正12角形、正24角形、正48角形、正96角形と順に周囲の長さを計算することで、円周率の近似値を求めたとのことです。
[tsujimotterさんノートブック　"アルキメデスと円周率"](http://tsujimotter.hatenablog.com/entry/archimedes-circle)
当時、小数点は未だ発明されておらず、整数の比で表現していたとのことです。
こんな制限があってもアルキメデスは、3と1/7より小さく、3と10/71より大きいことを求めていました。（小数点で表現すると、3.1428571428571429と3.1408450704225352の間）
アルキメデスの手法をそのまま進めると何所まで正確に円周率を計算できるかプログラミングの力を借りてをやってみました。

#アルキメデスの手法
アルキメデスの手法そのものは、先のtujimotterさんのノートブックに正確に記載されていますので、興味のある方はそちらをご覧ください。ここでは、プログラム作りにあたって、必要な証明のみ記載します。
正n角形の周囲の長さをL、外接する円の半径を1とすると、円周は２πなので、正n角形を元にした円周率の近似値は L÷２となります。
![証明.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/3fda3cc8-f040-704d-6adb-c2de3ae31941.jpeg)

###【正6角形の場合】
L＝F(0)B×2×6
F(0)B ＝1/√3　※　∠F(0)OBが30°なので（△OF(0)Cは正三角形）
正6角形を元にした円周率の近似値は 
L÷2＝1/√3×2×6÷2＝2×√3 ≒ 3.464 となる。
###【正12角形の場合】
L＝F(1)B×2×12
F(1)B ＝ OB× F(0)B ÷（OB＋F(0)O）= F(0)B ÷（1＋√(1＋F(0)B× F(0)B))
正12角形をもとにした円周率の近似値は、
L÷2＝F(1)B×2×12÷2 ≒ 3.215　となる。
**証明**
F(1)Oと平行なF(0)を通る直線を引き、OBの延長線との交点をＡとする。
△OBF(1) と △ABF(0) は相似であるから、以下が成り立つ。
F(1)B：OB = F(0)B：（OB＋OA）
更に、△OF(0)Aは二等辺三角形であることから、F(0)O ＝ OA
F(0)Oはピタゴラスの定理を使って、√(OB×OB＋ F(0)B× F(0)B) より求められる。
###【正ｎ角形の場合】
同様にして、正n角形を元にした円周率の近似値は以下のようになる。
L÷2＝F(n)B×2×n÷2 ＝ F(n-1)B÷(1＋√(1＋F(n-1)B× F(n-1)B))×ｎ
#Pythonによる実装
以上の結果をPythonで実装すると下記のようになる。

```Python
import math
import itertools
def f(n):
  if n == 0: return math.sqrt(3)/3
  return f(n-1)/(1+math.sqrt(1+f(n-1)**2))

N = int(input())
for n in range(N):
  print(f(n)*6*2**n)
```
ただし、正ｎ角形を正確に入力するのはメンドウなので、入力値Nは以下のようにしている。
0 … 正６角形を計算
1 … 正12角形まで計算
2 … 正24角形まで計算
以下同様。
上記のアルゴリズムではＯ(2**n）の計算量が必要になるため、次のようにDPで書き直してみました。また、２進数では小数点以下を正確に表現できない（※）ので、15桁ほど大きな数字にして、出力の際に整形するプログラムとしました。
※[プログラミングで小数はヤバイんだぜ？という話。](　https://qiita.com/ukiuni@github/items/3349b313da229abb029b)

```Python
import math
import itertools

def pi2s(pi):
  return str(pi)[0] + "." + str(pi)[1:]

def regN(n):
  return format(n, '10d') + ": "

R = 1732050807568877
B = 1000000000000000
pi = "3.14159265358979323846264338327950288"

N = int(input())
F = [0.0 for n in range(N)]
F[0] = B
for n in range(1, N):
  F[n] = F[n-1]*R/(R+math.sqrt(F[n-1]**2+R**2))

for n, v in enumerate(F):
  print(regN(6*2**n) + pi2s(int(v*6*2**n*B/R)))
print(format("pi: ", '>12') + pi[:17])
```

**正3145728角形**まで計算した結果です。
![実行結果.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/05caadc1-4234-dac7-1fde-7eb032c70402.jpeg)
最後の行にπを出力しています。結構正確な値が計算できていることが分かります。
#さいごに
アルキメデスの手法をプログラミングでなぞってみました。勝手な予想に反して結構早い段階(48角形)で既に3.14に近似できていて驚きでした。
これを、手でしかも整数の比（分数）で計算したアルキメデスには、ひたすら脱帽です。
デプロイグループのメモ

アプリ作成
デプロイグループ作成
デプロイコンフィグ作成
リビジョンのアップロード
デプロイ
チェック
リデプロイ


> CodeDeploy アプリケーション用に 1 つ以上のデプロイグループを指定できます。

> デプロイグループには、デプロイ中に使用される設定と構成が含まれています。ほとんどのデプロイグループ設定は、アプリケーションで使用される compute platform によって異なります。ロールバック、トリガー、アラームなどの一部の設定は、どの compute platform 用のデプロイグループでも設定できます。

> デプロイグループでは、新しいバージョンの Lambda 関数にトラフィックをルーティングする方法を指定します。また、アラームとロールバックを指定する場合もあります。
pandasのgroupbyで文字列の操作

## 概要

pandasで数値の平均や、最小値、最大値を取得する例はよく見つかりますが、
グループを作ってそこに対して処理することも多かったので自分の備忘録がわりにまとめ。
~~何番煎じだと突っ込まれそうな気もしますが・・・~~

## 必要なもの

* python 3.7.2
* pandas
* numpy

動作確認にはJupyterNotebookを使っています。

## 処理内容

使用データは[JADER](https://www.pmda.go.jp/safety/info-services/drugs/adr-info/suspected-adr/0003.html)の有害事象のデータを使用しています。

```python

import pandas as pd
import numpy as np
reacs=pd.read_csv('reac.csv',dtype='str',encoding='shift-jisx0213')
```

まずは症例ごとにユニークになるように **識別番号**でグルーピング

```python
groupCaseNo=reacs.groupby('識別番号')
```

識別番号ごとにグルーピングされているので、以下のように`groups`を使用すればグルーピングしているキーを取得できる。

```python
groupCaseNo.groups.keys()
```

以下のようにすることでそれぞれのキー単位で処理ができる。
`get_group`はグルーピングのキーを使うことで中身を取得することができます。

```python
for case in groupCaseNo.groups.keys():
    print(groupCaseNo.get_group(case))
```
以下のように`apply`を使用することで関数を使って文字列を結合したりすることが可能です。
lambdaを使って無名関数も可能ですが、込み入ったことをするときは別途関数を作成することになるかと思います。

```python
def getRecordAe(data):
    return data.有害事象連番+':'+data.有害事象

groupCaseNo.apply(getRecordAe)
```
【A-frame】A-frameの最新バージョンを確認する

下記のページで、aframeの最新バージョンを確認する

https://github.com/aframevr/aframe/releases

2020.01.13時点の、A-frameの最新バージョンは「1.0.3」
<img width="1239" alt="スクリーンショット 2020-01-13 20.17.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b2de8293-b2a5-ecba-faf2-09da98f52053.png">


iOS12.2以降、ジャイロセンサーが効かない！という問題がありましたが、
A-frame「1.0.0」以降、ジャイロセンサーが効くようになりました。

<img width="627" alt="スクリーンショット 2020-01-13 20.33.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/84b85813-70b0-e62e-9ea0-e9260e772fc7.png">


<img width="505" alt="スクリーンショット 2020-01-13 20.33.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/f3c4deb0-adce-9212-a3c9-e424e4188d4e.png">
sshの踏み台サーバ経由でのアクセス方法

#はじめに
業務にて、計算機サーバにアクセスするために、踏み台サーバ経由で対象サーバーにアクセスする方法を探したのでまとめる。

#踏み台サーバ経由でのアクセスコマンド
sshのオプションの一つになる-oProxyCommandオプションが重要。

```
ssh -oProxyCommand='ssh -W %h:%p [踏み台サーバのアドレス]' -l [Username] [対象サーバーのIPアドレス]
```

#終わりに
踏み台サーバのアドレスの指定方法などは別途まとめたい。
git pushで403エラーが返された話

# はじめに
* Gitの勉強をしていて、push時に403エラーが返された

## エラー内容
```
$ git push origin master
remote: Permission to アカウント1/リポジトリ名.git denied to アカウント2.
fatal: unable to access 'https://アカウント1＠github.com/アカウント1/リポジトリ名.git' : The requested URL returned error: 403
```
* アカウント1が、アカウント2にアクセスしようとしていた
* 当たり前だけどアカウント1にはアカウント2にアクセスする権限がないので、アカウント2にアクセスが拒否されて403エラーが返されたっぽい

## 解決方法
* アカウント1にアクセスするようにリモートURLを以下のように変更する

```
$ git remote set-url origin https://アカウント1＠github.com/アカウント1/リポジトリ名.git
```

* 以下のコマンドを実行して、リモートURLが変更されていることを確認する

```
$ git remote -v
origin: https://アカウント1＠github.com/アカウント1/リポジトリ名.git (fetch)
origin: https://アカウント1＠github.com/アカウント1/リポジトリ名.git (push)
```

* 再度git push origin masterを実行しエラーが出ないことを確認する

```
$ git push origin master
  ~一部省略~
To https://github.com/アカウント1/リポジトリ名.git
 * [new branch]      master -> master
```

成功！

## 解決するまでにやったこと
1. エラー内容の解析
2. 現在のリモートURLの確認
3. 1、2からエラーを解決する方法を検索

 2.で使用したコマンド

```
$ git remote -v
origin: github.com/アカウント/リポジトリ名.git (fetch)
origin: github.com/アカウント/リポジトリ名.git (push)
```

3.で参考にさせていただいた記事
[GitHub ヘルプ](https://help.github.com/ja/github/using-git/changing-a-remotes-url):リモートの URL の変更
[https時代のgitアカウントを使い分ける方法](https://qiita.com/1natsu172/items/a4a3357a0481440ec6a5)：@1natsu172さん


## まとめ
* 今回のエラーは、現在使用しているアカウントが別のアカウントにアクセスしようとしたため発生したものだと分かった
* 疑問なのは、なぜ別のアカウントにアクセスしようとしたのか。
 * 追記 1/16)上記疑問について調べた結果、「どのアカウントでアクセスするか指定していない状態だったため、アカウントの切り替えが出来ていなかった」ということがわかった。そのため、上記作業でアカウントを指定してあげたということになる
【入門】open3dの使い方

# 1.はじめに
## 1-1.記事を書くきっかけ
仕事でopen3dを使うことになったが、初期導入から基本的な機能の把握に
時間がかかったので、把握内容をまとめたい。

## 1-2.対象読者
・Open3Dを仕事で使うことになったが、何から手をつければいいかわからない人
・RGBだけではなくDepthも取り扱いたいが、まず何をしたらいいかわからない人
・上記に加えて、英語が苦手な人

# 2.関連サイト
読んだサイトは以下の通り。
https://blog.negativemind.com/2018/10/17/open3d/
http://robonchu.hatenablog.com/entry/2018/02/24/200635
https://qiita.com/n_chiba_/items/fc9605cde5c19a8c7dad

# 3.Tutorial
## 3-1.一番大事なこと。
他のライブラリ、フレームワークと同様に、公式サイトのチュートリアルが一番詳しく、正しく、最新の情報が載っている。
まずは公式サイトを読もう。

## 3-2.公式ドキュメント
URL: http://www.open3d.org/docs/release/index.html

Get startedを読むと手順が記載されている。
http://www.open3d.org/docs/release/getting_started.html

## 3-3.動作確認
red-woodのテストプログラム

http://redwood-data.org/indoor_lidar_rgbd/download.html

# 4 Point Cloudの注意点
Point cloud のままだとデータ量が莫大。
3d surfaceに変換して使うことが多い。

点のデータだけでは分析には使いにくいため、
・segmentationによるクラス、インスタンス分類
・surface化による表面形状の設定
などを行うことが多い。

# 5 次のアクション
・以下のプロジェクトに、3Dデータのリンクを貼り付けていくと、3Dデータのコミュニティに貢献できるので、やっていきたい。
https://github.com/awesomedata/awesome-public-datasets/tree/master
PythonGUI（テキストボックス）で行列を作成

GUI（tkinterテキストボックス）で行列の要素の値を入力し２次元配列型のデータを取得するソースです。行列は、変数により任意のサイズに変更可能。

```ruby:qiita.rb
from tkinter import *
from tkinter import ttk
import numpy as np

#入力用のGUI
def GUI_Input(n,m):

    root = Tk()
    root.title('Table Input')

    #入力用フレーム
    frame = ttk.Frame(root)
    frame.grid(row=0, column=0)


    list_Items = [0]*(n*m)
    N = n
    M = m
    k=0
    for i in range(0, n):
        for j in range(0, m):


            list_Items[k] = ttk.Entry(frame,width=2)
            list_Items[k].grid(row=i+1, column=j+1)
            k+=1


    #テキストボックスからデータを取得し２次元配列としてprint出力
    def ButtonClicked_Run():
        B = [0]*(N*M)

        for i in range(N*M):
            B[i] = list_Items[i].get()

        A= np.reshape(B, (N,M))
        print(A)




    #実行ボタンの設置
    button_Run = ttk.Button(root,
                            text='実行',
                            padding=5,
                            command=ButtonClicked_Run)
    button_Run.grid(row=1, column=0)

    root.mainloop()


#n,mの数を変えて、表の行数を変える

m = 9
n = 9
GUI_Input(m,n)
```
結果
　　　　　　　　　　　<img width="253" alt="スクリーンショット 2020-01-13 23.27.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527324/1be97ce3-f9c4-f17e-4c8c-d128a6cb620c.png">

　　　　　　　　　　　　　　　　　　　↓
　　　　　　　　　　　　<img width="220" alt="スクリーンショット 2020-01-13 23.28.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527324/809048e7-1716-f174-f464-a55431ddba8e.png">
CentOSからUbuntuへお引っ越し

# CentOsからUbuntuへお引っ越し

いま使っているCentOsをUbuntuに入れ替えようと悪戦苦闘中。

LiveUSBの作成をしているが失敗が続く。
ISOイメージを書き込んだUSBを差し込んで再起動をしてもUbuntuが起動してくれない。
Bootをして起動順位を確認するとUSBからの起動が選択肢に含まれていない。
いま原因を究明中。
プログラムはなぜ動くのか

# プログラムはなぜ動くのか

エンジニアの中にはプログラムが動くまでに何が起こっているのか理解できていない人が多いと思います。
私自身もその一人です。

そこで、少し出版は古くなっていますが、有名で今もなお読まれている本を題材に説明していこうと思います。
[プログラムはなぜ動くのか　第２版　知っておきたいプログラムの基礎知識](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2%E4%B9%85%E9%9B%84/dp/4822283151/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=TRGBTI2D63C0&keywords=%E3%81%AA%E3%81%9C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B&qid=1578906161&sprefix=%E3%81%AA%E3%81%9C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%2Caps%2C141&sr=8-1)

1. [プログラマにとってCPUとはなにか](https://qiita.com/mergit/items/da2bdb85e6a7aaae2f70)
2. [メモリーとディスクの親密な関係](https://qiita.com/mergit/items/98b0753288d8b1422479)
プログラマにとってCPUとはなにか

# プログラマにとってCPUとはなにか

皆さんは以下のような質問に端的に答えることはできるでしょうか

```text
1. プログラムとは何ですか
2. マシン語とは何ですか
3. 実行時のプログラムはどこに格納されていますか
4. メモリーのアドレスとは何ですか
5. コンピュータの構成要素の中で、プログラムを解釈/実行する装置は何ですか
```

答えは以下です。

```text
1. プログラムとは何ですか
→ コンピュータに実行させる処理の順番を示す

2. マシン語とは何ですか
→ CPUが直接解釈できる言語

3. 実行時のプログラムはどこに格納されていますか
→ メモリー

4. メモリーのアドレスとは何ですか
→ メモリー上で命令やデータが格納されている場所を示す値

5. コンピュータの構成要素の中で、プログラムを解釈/実行する装置は何ですか
→ CPU
```

我々プログラマはコードを書きますが、コードはCPUに解釈され命令が実行されます。
ではCPUとは一体どんなものなのでしょうか

## CPU

CPUとは、先ほども述べたように、「マシン語となったプログラムを解釈/実行する装置」です。
CPUは主に次の４つの要素から成り立っています。

- レジスタ
- 制御装置
- 演算装置
- クロック

CPUを理解するためには４つの中でも、特にレジスタの理解が必須です。
レジスタは命令やデータを格納する領域のことです。レジスタがなぜ重要かについては、プログラムが実際に実行されるまでの流れを説明した後に解説します。


### プログラム実行までの流れ

プログラムが動くまでには以下のような流れを踏みます

1. プログラムを書く
2. プログラムをコンパイルしてマシン語のEXEファイルへと変換する
3. プログラム実行時に、2.で変換したEXEファイルをメモリー上に作成する
4. CPUがプログラムの中身を解釈・実行する

### CPUはレジスタの集合体である

CPUを理解するためにはレジスタが重要と言いましたが、それはなぜかと言うと、
プログラマが考慮しなければならないのは、「レジスタ・制御装置・演算装置・クロック」のなかでレジスタだけだからです。

レジスタに命令やデータを格納する記憶装置ですが、プログラムはそれらの命令やデータを宣言することでレジスタに格納できるようにします。

一つのCPUの内部には数十から数千のレジスタが存在していて、制御装置が命令やデータをレジスタに読み出して、演算装置はレジスタに読み出されたデータを演算する役割を担っています。

### CPUにできること

CPUにできることはとてもシンプルです
以下の４つしかありません

1. データ転送命令…レジスタとメモリー、メモリーとメモリー、レジスタと周辺装置の間のデータの読み書き
2. 演算命令…算術演算、論理演算、比較演算、シフト演算を行う
3. ジャンプ命令…条件分岐、繰り返し処理
4. コール/リターン命令…関数を呼び出し、呼び出し元へと戻る

我々が、複雑な設計や、複雑なロジックを記述しても、CPUではそれらを分解して上記の内容へと落とし込み高速に読み書きします。


## 参考

[プログラムはなぜ動くのか　第２版　知っておきたいプログラムの基礎知識](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2%E4%B9%85%E9%9B%84/dp/4822283151/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=TRGBTI2D63C0&keywords=%E3%81%AA%E3%81%9C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B&qid=1578906161&sprefix=%E3%81%AA%E3%81%9C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%2Caps%2C141&sr=8-1)

### シリーズ
[プログラムはなぜ動くのか](https://qiita.com/mergit/items/2e594e2da8456a64f3da)
JavaScriptでスムーススクロールを実装する

# こんなやつ
[![Image from Gyazo](https://i.gyazo.com/fa945a03aa31708c738ee82d7156ca86.gif)](https://gyazo.com/fa945a03aa31708c738ee82d7156ca86)
**動作デモ → [https://jsfiddle.net/zr36gcpb/](https://jsfiddle.net/zr36gcpb/)**

# コード
```html:HTML
<div class="scroll">
  <a class="scroll__button" href=".contents__1">Scroll</a>
  <a class="scroll__button" href=".contents__2">Scroll</a>
  <a class="scroll__button" href=".contents__3">Scroll</a>
  <a class="scroll__button" href=".contents__4">Scroll</a>
</div>

<div class="contents">
  <div class="contents__1">Contents1</div>
  <div class="contents__2">Contents2</div>
  <div class="contents__3">Contents3</div>
  <div class="contents__4">Contents4</div>
</div>
```
```JavaScript:JavaScript
const smoothScroll = e => {
  const target = document.querySelector(e.target.getAttribute('href'));
  const position = target.getBoundingClientRect().top + window.scrollY;

  e.preventDefault();

  window.scrollTo({
    top: position,
    behavior: 'smooth'
  });
  //window.scrollToの引数のtopは「ドキュメントの左上を基準にした目標の要素のY座標のピクセル値」で、
  //behaviorにはsmoothを指定する事で挙動がスムーススクロールになります。
}

const buttons = document.querySelectorAll('.scroll__button');

buttons.forEach(button => {
  button.addEventListener('click', smoothScroll);
})
```
上記の関数`smoothScroll`を任意の`aタグ`に走らせることで、擬似的に`href`で指定した要素にスムーススクロールするボタンになります。

やっている事は単純で、`aタグ`に指定されている`href`の値を取得して、変数`position`にその指定された要素の「ビューポートの左上からのY座標のピクセル数」と「現在スクロールしているY座標のピクセル数」を足したもの（=対象の要素の絶対位置）を格納しています。
その`position`の値を使用して、`window.scrollTo`で目標の位置までスクロールしています。
そして、もちろん`aタグ`のデフォルトの動作をキャンセルする`preventDefault`も指定します。

もし`aタグ`以外で使用したい場合は、`href`の代わりに`data属性`を指定してそれを`getAttribute`すれば良いと思います。
<br>
出来ました。(*ﾟ▽ﾟﾉﾉﾞ☆ﾊﾟﾁﾊﾟﾁﾊﾟﾁ

[![Image from Gyazo](https://i.gyazo.com/fa945a03aa31708c738ee82d7156ca86.gif)](https://gyazo.com/fa945a03aa31708c738ee82d7156ca86)

**※注意点**
一部のブラウザでパラメーター部分が非対応なため、普通のスクロールになってしまう事がある。
[ブラウザの実装状況（MDN）](https://developer.mozilla.org/ja/docs/Web/API/Window/scrollTo#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E5%AE%9F%E8%A3%85%E7%8A%B6%E6%B3%81)
初心者による DOM 属性値の取得/設定

#概要
getElementById()等で要素ノードにアクセスできたら、次は、その要素ノードに何らかの処理をしたい。

#特定の属性の取得
多くの属性は「要素ノードの同名のプロパティ」としてアクセスできるからです。たとえば、

```javascript:sample.js
//取得
let url = link.href
//設定
link.href = 'https://google.com'
```
ただし、classに関してはclassNameになることが注意点です。この「属性とプロパティは一致しない場合がある」ことを意識したくないのであれば、次の方法がある。

```javascript:sample.js
elem.getAttribute(name)
elem.setAttribute(name, value)
 //elem : 要素オブジェクト name : 属性名 value : 属性値
```

これを用いて書き直すと、

```javascript:sample.js
let url = link.getAttribute('href')
link.setAttribute('href', 'https://yahoo.com')
```

getAttributeとsetAttributeを使うメリットとしては、
1. HTMLとjavascriptとで名前の相違を意識する必要はない。
2. (文字列として指定できるため)取得/設定する属性名を、スクリプトから動的に変更できる。
が挙げられる。

#不特定の属性の所得
一つ一つ属性を取得するのではなく、ある特定の要素ノードに属する属性値をすべて取得したい場合はAttributesをつかう。例えば、

```html:sample.html
<img id="logo" src="https://sample.to/image/1.png" height="57" width="10" alt="image" />
```

```javascript:sample.js
document.addEventListener('DOMContentLoaded', function(){
 let logo = document.getElementById('logo')
 let attrs = logo.attributes
 for(let i = 0, let len = attrs.length: i < len; i++){
  let attr = attrs.item(i)
  //nameとvalueプロパティでアクセス。
  console.log(attr.name + ',' + attr.value)
 }
}, false)

//出力
id:logo
src:https://sample.to/image/1.png
height:57
width:10
alt:image
```
取り出した属性ノードの名前や値にアクセスするには、name/valueプロパティを使う。この例で使われている attrs はNamedNodeMapオブジェクトと呼ばれ、この属性値のマップを操作することも可能。次のように、

```javascript:samplejs
//title属性を作成
let title = document.createAttribute('tilte')
title.value = 'ロゴ画像'
//マップに追加と削除
attrs.setNamedItem(title)
attrs.removeNamedItem(title)
```

#テキストの取得/設定
要素配下のテキストを取得/設定するには、innerHTML / textContentというプロパティを利用する。

```html:sample.html
<div id="result_text">
 <p style="color: red;">設定されていません！</p>
</div>
<div id="result_html">
 <p style="color: red;">設定されていません！</p>
</div>
```

```javascript:sample.js
document.addEventListener('DOMContentLoaded', function() {
 documentGetElementById('result_text').textContent = 
  '<a href="https://google.com">Google</a>'
 documentGetElementById('result_html').innerHTML = 
  '<a href="https://yahoo.com">yahoo</a>'
}, false)
```

これで重要なことは、「配下の子要素/テキストを完全に書き換えている」ということです。しかし、決定的に違うところは、「与えられたテキストをHTMLとして認識するかどうか」である。一般的には、textContentプロパティを優先して利用することで、高速かつ安全に運用できる。
また、console.log()ではinnerHTMLプロパティはHTML文字列すべてを返すが、textContentはその中のテキストだけを取り出して出力することに注意する。

##innerHTMLの注意点
innerHTMLプロパティを利用する場合、ユーザからの入力値をはじめ、外部からの入力値をそのまま渡さないようにしなければならない。

```html:sample.html
<form>
 <label for="name">名前：</label>
 <input id="name" name="name" type="text" />
 <input id="btn" type="button" value="送信" />
</form>
<div id="result"></div>
```

```javascript:sample.js
document.addEventListener('DOMContentLoaded', function() {
 let name = document.getElementById('name')
 let result = document.getElementById('result')
 //この文が問題の文！
 result.innerHTML = 'こんにちは、' + name.value + 'さん！'
})
```

result.innerHTMLの文が好ましくないところである。なぜならば、innerNTMLはHTML認識可能な文を第三者が入力可能であるため、製作者が意図しないコードを入力してくる可能性がある。しかもそれを不特定多数の人がブラウザー上で実行することができるのである。このような脆弱性をクロスサイトスクリプティング(XSS)脆弱性という。innerHTMLではなくtextContentにすることが望ましい。

#参考資料
山田祥寛様　「javascript本格入門」
nuxt.js でcreate-nuxt-appからデフォルトで入れちゃったEsLintを外したい場合の対応

# 結論

[プロジェクトルート]/nuxt.config.js にあるEsLintのモジュール指定をコメントアウト

```js:[プロジェクトルート]/nuxt.config.js
  // ...
  /*
   ** Nuxt.js dev-modules
   */
  buildModules: [
    // Doc: https://github.com/nuxt-community/eslint-module
    // '@nuxtjs/eslint-module', // ←コレ
    // Doc: https://github.com/nuxt-community/stylelint-module
    '@nuxtjs/stylelint-module'
  ],
  // ...
```


# 記事の背景

nuxt.js初学者ですが、勉強のためにいろいろやっているなか `create-nuxt-app` で「どのLintツールつかう？」って訊かれて、選択しないこともできたのですが、やる気が無駄に暴走し「全部つかう」って選択。
しかし各所からコピペして動かしてみたサンプルソース（ありがとうございます）において、 **動く動かない以前にフォーマットが規定と違うってEsLintが言ってますよキリリってエラーが出まくり** まして、 **うるせえよコードの書き方がどうだろうがこっちはとりあえず動かしてえんだよ** と **自分で有効にしたくせに理不尽に逆ギレ** し、Lint処理を外す方法探したら意外と見つからず、しかし分かれば意外と簡単にできたので備忘録です。

# 参考

 - [How can I remove ESLint from an existing Nuxt app?](https://github.com/nuxt/nuxt.js/issues/2097)

※上記記事はナナメ読みで参考にしましたが解決方法が違います。上記のほうが参考になるようでしたら是非。
クラウドアーキテクチャ構築指針 まとめのまとめ 

以前書いたクラウド環境構築の指針に関する記事を整理しました。


#### AWS Well-Architedted フレームワーク ホワイトペーパー
AWS ソリューションアーキテクトのための設計方針。
試験でもベースラインの知識として問われます。

[AWS Well-Architected Framework ホワイトペーパーまとめ 1 【導入編】](https://qiita.com/Catetin0310/items/6e5bd6cb573aa38f0fc0)
[AWS Well-Architected Framework ホワイトペーパーまとめ 2 【運用上の優秀性】](https://qiita.com/Catetin0310/items/179f9c587a6b8b540a8a)
[AWS Well-Architected Framework ホワイトペーパーまとめ 3 【セキュリティ】](https://qiita.com/Catetin0310/items/08e1c4843cc5571cd3a5)
[AWS Well-Architected Framework ホワイトペーパーまとめ 4 【信頼性】](https://qiita.com/Catetin0310/items/c973552de5098fdda795)
[AWS Well-Architected Framework ホワイトペーパーまとめ 5 【パフォーマンス効率】](https://qiita.com/Catetin0310/items/12837377ab2d1c8f6c77)
[AWS Well-Architected Framework ホワイトペーパーまとめ 6 【コスト最適化】](https://qiita.com/Catetin0310/items/cc57d8018a3392dd9f73)



#### Azure アーキテクチャガイド
Azure での Well-Architected フレームワークに相当するようなガイドライン。
一読すると AWS との設計哲学の違いみたいなものを感じられます。
そもそもクラウドのアーキテクチャってなんぞ、という方にもおすすめ。


[Azureアーキテクチャガイドまとめ 1 【はじめに】](https://qiita.com/Catetin0310/items/74249f333d9fbfccd543)
[Azureアーキテクチャガイドまとめ 2【N層】](https://qiita.com/Catetin0310/items/1ab0ae1130f767d770d3)
[Azureアーキテクチャガイドまとめ 3 【Webキューワーカー】](https://qiita.com/Catetin0310/items/fe0729549faeee843e8a)
[Azureアーキテクチャガイドまとめ 4 【マイクロサービス】](https://qiita.com/Catetin0310/items/06ab890a04baa161cac6)
[Azureアーキテクチャガイドまとめ 5 【CQRS】](https://qiita.com/Catetin0310/items/d0e8b489f6501e4da90b)
[Azureアーキテクチャガイドまとめ 6 【イベントドリブンアーキテクチャ】](https://qiita.com/Catetin0310/items/58f65242a7b71620825b)
[Azureアーキテクチャガイドまとめ 7 【ビッグデータアーキテクチャ】](https://qiita.com/Catetin0310/items/d515fc3fdff68b54f408)
[Azureアーキテクチャガイドまとめ 8 【ビッグコンピューティングアーキテクチャ】](https://qiita.com/Catetin0310/items/eebd754637dcda8ad14d)


#### 参考リンク
[AWS Well-Architedted フレームワーク 公式ドキュメント](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf)
[Azure アーキテクチャガイド 公式ドキュメント](https://azure.microsoft.com/ja-jp/campaigns/cloud-application-architecture-guide/)
Svelteで使えるUIコンポーネントライブラリをまとめてみた

# はじめに
Svelteで使えるUIコンポーネントライブラリを調べたのでまとめます。
新しく出てきたライブラリを追加したり、1年以上メンテナンスされていないライブラリは削除していきます。

# Svelte Material UI
サイト：https://sveltematerialui.com/
GitHub：https://github.com/hperrin/svelte-material-ui
![GitHub Stars](https://img.shields.io/github/stars/hperrin/svelte-material-ui?style=social)

# Skeleton
サイト：https://www.skeleton.dev
GitHub：https://github.com/Brain-Bones/skeleton
![GitHub Stars](https://img.shields.io/github/stars/Brain-Bones/skeleton?style=social)

# Melt UI
サイト：https://www.melt-ui.com/
GitHub：https://github.com/melt-ui/melt-ui
![GitHub Stars](https://img.shields.io/github/stars/melt-ui/melt-ui?style=social)

# Flowbite Svelte
サイト： https://flowbite-svelte.com/
GitHub： https://github.com/themesberg/flowbite-svelte
![GitHub Stars](https://img.shields.io/github/stars/themesberg/flowbite-svelte?style=social)

# carbon-components-svelte
サイト：https://carbon-components-svelte.onrender.com/
GitHub：https://github.com/IBM/carbon-components-svelte
![GitHub Stars](https://img.shields.io/github/stars/IBM/carbon-components-svelte?style=social)

# Svelte Headless UI
サイト：https://svelte-headlessui.goss.io/
GitHub：https://github.com/rgossiaux/svelte-headlessui
![GitHub Stars](https://img.shields.io/github/stars/rgossiaux/svelte-headlessui?style=social)

# sveltestrap
サイト：https://bestguy.github.io/sveltestrap/
GitHub：https://github.com/bestguy/sveltestrap
![GitHub Stars](https://img.shields.io/github/stars/bestguy/sveltestrap?style=social)

# Sara UI
サイト：https://www.saraui.com/
GitHub：https://github.com/r4rmas/saraui
![GitHub Stars](https://img.shields.io/github/stars/r4rmas/saraui?style=social)

# おわりに
これも使えるよとかありましたらコメントで教えてください！
スマホ用VRに6DoF機能やハンドトラッキング機能を実装してみた

（Unityアセットやコードは[こちら](https://github.com/NON906/HandVR)）

---

皆さんこんにちは。

早速ですが、VR（バーチャルリアリティー）は勿論ご存じですよね？
ゴーグルを付けてやる、あれです。

今では、ゴーグルやコントローラーの位置を認識して、自由に動き回れる6DoFという機能があります。
また、最近ではOculus Questがハンドトラッキングに対応した、ということも聞きます。

しかし、このようなVRは、OculusやViveといった、専用のゴーグルが必要で、そのために手軽に試せない、という印象があると思います。
私も実は持っていません。

しかし、スマホをはめるだけで出来る簡易的なゴーグルも存在します。
今では100均でも売っているそうです。
これであれば、安い出費で手軽にVRが体験できる、ということです。
ただ、現状では6DoFやハンドトラッキングに対応したものがほとんどありません。

ということで、実際に作ってみました。
といっても、一から作るのは私には無理なので、既存の技術を流用します。
開発環境はUnityで、現在はAndroidのスマホのみに対応しています。

まず、AndroidスマホにはARCoreという機能があります。
その名の通り、ARに使われるもので、これを使えばスマホのカメラの内容から、ゴーグルの位置を認識することができるようになります。
これによって、6DoFのように、自由に動き回れるようになります。
これは[実は過去にやった](https://qiita.com/NON906/items/9ce03e2640c3e16eb4f6)ことがありますが、新しいバージョンのUnityには対応できていなかったので、[AR Foundation](https://github.com/Unity-Technologies/arfoundation-samples)を使う形で実装し直しました。

次に、ハンドトラッキングを実装するために[MediaPipe](https://github.com/google/mediapipe)というものを使いました。
これは機械学習のモデルを利用するのに使うライブラリだとのことですが、そのサンプルの1つにハンドトラッキングがあるので、それを使いました。
ただ、Unityではそのままでは使えないので、それで実行できるように一部変更しました。
ゴリ押し気味に実装したので、性能が若干落ちたような気もしますが、なんとかなってます。

この2つを使うことで、
![Qiita_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427156/ab91373a-388f-6ef6-cc0a-ef0d9c11ffe2.gif)

このように自由に動き回ったり、

![Qiita_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427156/f01eb2be-5914-0148-7412-2103f2d1434d.gif)

手を認識させて動かしたりすることが出来るようになりました。

前述の通り、ARCoreに対応したAndroidスマホと、スマホVR用のゴーグルがあれば、高価なゴーグルが無くとも試すことができます。

~~ちなみに、このハンドトラッキングで、女の子のおっぱいを触れたり、スカートをめくったりすることが出来るアプリを開発しましたが、見事にリジェクトされました。~~
~~公開できればネタとして最高だと思っておりましたが、仕方がないですね。~~

また、[Githubでアセットやコードを公開している](https://github.com/NON906/HandVR)ので、6DoFやハンドトラッキングといったこれらの機能を使いたいという方は、ぜひ使ってみてください。

以上です。
soxの使い方まとめ


## 音声ファイルの結合
```sh
$ sox inputA.wav inputB.wav inputC.wav output.wav
```

## 無音区間のカット

```sh

# デジタル信号は0%でいい
sox input.wav output.wav silence 1 0.1 0% reverse silence 1 0.1 0% reverse
```

## 先頭末尾のフレーム処理
```sh
# 190フレーム無音ファイル作成
$ sox -n -b 16 silence.wav rate 16k channels 1 trim 0.0 0.19
# 先頭へ190フレーム無音区間追加
$ sox silence.wav input.wav outputH190.wav

# 80フレームトリム
$ sox input.wav outputT-80.wav trim 0.0 0.87
```


## ホワイトノイズの重畳
```
# ホワイトノイズ作成
$ sox -t null /dev/null whitenoise_raw.wav synth 0.87 whitenoise 10000 gain -20
$ sox whitenoise_raw.wav -b 16 whitenoise.wav channels 1 rate 16k
# ホワイトノイズ重畳
$ sox -m input.wav whitenoise.wav output.wav
```
BerkeleyDB 5.xをインストールする（ソースからコンパイル） for CentOS8 

また、PostfixやBINDでも利用されるBerkeleyDB。
CentOS8においては、BereleyDB5.3.28が利用されている。
角に新しいバージョンを入れると、RPMの管理データーベースの読み取りなどに影響が出るため、なるべくOSのバージョンと合わせることが望ましい。


あらかじめブラウザーで以下のバイナリをダウンロードする

```
https://download.oracle.com/otn/berkeley-db/db-5.3.28.tar.gz
```

/usr/local/srcにファイルをコピーします。
その後コンパオイルとインストール作業を行います。

```bash:
cd /usr/local/src
tar xvzf db-5.3.28.tar.gz
cd db-5.3.28/build\unix
../dist/configure
make
make install
```

以上で、完了です。
GoogleCloudAPIのライブラリが競合するから競合しないバージョンを貼っとく [備忘]

# 備忘
ローカルの仮想環境でポコポコいろんなGCPのライブラリを`pip install`してるとライブラリの競合が起こることがあるので、競合がおきないversionを指定してrequirementsを書いておく 

# pip用にversion指定してrequirements置いておく
特に何も考えずにbigguqey(`google-cloud-bigquery`)とGCS(`google-cloud-storage`)を`pip install`で最新版をインストールするとライブラリ内でコンフリクトが起きたので競合が起きないようなrequirements.txtを置いておく

```text:requirements.txt
google-api-core==1.14.3
google-api-python-client==1.7.11
google-auth==1.8.2
google-auth-httplib2==0.0.3
google-auth-oauthlib==0.4.1
google-cloud-bigquery==1.23.0
google-cloud-core==1.1.0
google-cloud-storage==1.23.0
google-resumable-media==0.5.0
googleapis-common-protos==1.6.0
grpc-google-iam-v1==0.12.3
```

おしまい
必要コマンド

● pwd
現在のフォルダ（ディレクトリ）を調べるためのコマンド「Print Working Directory」の略。

● mkdir
フォルダを作るためのコマンド「Make Directory」の略。

＄　mkdir 作成したディレクトリ名

● cd
ディレクトリ間を移動するためのコマンド「Change Directory」の略。

$ cd 移動したいディレクトリ名

また

＄ cd ..
１つ上（親）のディレクトリに戻ることができる。

また

$ cd ~
または
$ cd
ホームディレクトリに移動が可能。そのターミナルを実行しているユーザーの「ホームディレクトリ」を意味している。

●Is
ディレクトリの中身を表示するためのコマンドで「LiSt directory contents」の略。

＄ mkdir space
$ Is
で、mkdir作成したspaceというディレクトリが、現在のディレクトリに存在することを確認できる。
PostgreSQLにおけるユーザの生成、またパスワード変更の行い方

PostgreSQL内でユーザ名やパスワードの生成、変更の仕方をまとめたいと思います。

#postgres ユーザーにログイン
まず、postgres ユーザーにログインします。
コマンドに`psql -U postgres`と入力するとpostgres のパスワードを求められますのでパスワードを入れましょう。

```
>psql -U postgres
ユーザ postgres のパスワード:
psql (12.1)
"help"でヘルプを表示します。

postgres=#
```

#ユーザーを生成、ログインする
ユーザーを生成する際には`CREATE ROLE`を用います。今回はユーザー:user01,パスワード:pass01と設定してみます。コードは`CREATE ROLE {ユーザー名} WITH PASSWORD '{パスワード}';`となります。#内では最後に`;`をつけるのを忘れないようにします。

```
postgres=# CREATE ROLE user01 WITH PASSWORD 'pass01';
CREATE ROLE
postgres=#
```
*`CREATE ROLE`だけではログイン権限を持ちません。

#ログイン権限
そして生成したユーザーはデーターベースに接続できるようにログイン権限を持たせます。`ALTER ROLE`を用います。コードは`ALTER ROLE {ユーザー名} LOGIN;`となります。

```
postgres=# ALTER ROLE user01 LOGIN;
ALTER ROLE
postgres=#
```

#ユーザー一覧を表示する
ユーザー一覧を表示するには`/du`を入力します。そうすると一覧を表示することができます。

```
postgres-# /du
                                             ロール一覧
 ロール名 |                                   属性                                   | 所属グループ
----------+--------------------------------------------------------------------------+--------------
postgres | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス      | {}
 user01  |                                                                          | {}
```

#パスワードの変更
パスワードの変更も`ALTER ROLE `を用います。コードは`ALTER ROLE {ユーザー名} WITH PASSWORD '{新しいパスワード}';となります。今回は先ほど作ったユーザ名:user01のパスワードをword01に変えてみます。

```
postgres=# ALTER ROLE user01 WITH PASSWORD 'word01';
ALTER ROLE
postgres=#
```
これで変更することができました。
初期ユーザーであるpostgresに対しても、同様に `ALTER ROLE`を用いてパスワードを変更することができます。

#まとめ
PostgreSQLにおけるユーザの生成、またパスワード変更の行い方についてまとめました。参考になればいいなと思います。
react にて、画像リンク切れの際、imgタグを非表示にする


通常のhtmlにおいては、onerrorハンドラにてリンク切れのimgタグを非表示にできます。

```html
<img src="original.png" alt="title" onerror="this.style.display='none'"/>
```

reactではこれができないため、以下のように`onError`ハンドラを作成します。

```Javascript
<img src={`${process.env.PUBLIC_URL}/logo192_.png`} onError={e => e.target.style.display = 'none'} />
```

# サンプル
🚀以下のサンプルは、`create-react-app`直後の`App.js`を編集したものです。

```Javascript:App.js
import React from 'react';

function App() {
  return (
    <div className="App">
      <img border="1" src={`${process.env.PUBLIC_URL}/logo192.png`} />
      <img border="1" src={`${process.env.PUBLIC_URL}/logo192_.png`} />
      <img border="1" src={`${process.env.PUBLIC_URL}/logo192_.png`} onerror="this.style.display='none'" />
      <img border="1" src={`${process.env.PUBLIC_URL}/logo192_.png`} onError={e => e.target.style.display = 'none'} />
    </div>
  );
}

export default App;
```

# 参考
📖[Hide broken image link in Semantic UI React](https://stackoverflow.com/questions/49997068/hide-broken-image-link-in-semantic-ui-react)
📖リンク切れの時に代替画像を表示したいときは[こちら](https://qiita.com/m3816/items/56b9b6b6f340265cbfab)。
Sageを使用したWordpressテーマ開発

今まで[_s（アンダースコアーズ）](https://underscores.me/)でgulpなどでsassをコンパイルしてWordpressテーマ開発をしていたが、webpackを使用して開発出来る[Sage](https://roots.io/sage/)というスターターテーマがある事を知ったので使ってみました。

# インストール

wordpressのテーマディレクトリでcomposerを使用してsageをインストール。

```bash

# @ wp-content/themes/
$ composer create-project roots/sage theme-name
```

インストールが終わると何やら色々と聞かれるので入力。
今回は以下のように入力した。

```shell-session


// テーマ名
 Theme Name [Sage Starter Theme]:
 > ikadatic

// テーマURI
 Theme URI [https://roots.io/sage/]:
 > https://ikadatic.com

// テーマの説明
 Theme Description [Sage is a WordPress starter theme.]:
 > themes of ikadatic.com

// バージョン
 Theme Version [9.0.9]:
 >     

// 作成者
 Theme Author [Roots]:
 > ikadatic

// 作成者URI
 Theme Author URI [https://roots.io/]:
 > https://ikadatic.com

// ローカル開発環境のホスト
 Local development URL of WP site [http://example.test]:
 > localhost:10080

// テーマのディレクトリ
 Path to theme directory (e.g., /wp-content/themes/ikadatic) [/app/themes/sage]:
 > /wp-content/themes/ikadatic

// cssフレームワーク
 Which framework would you like to load? [Bootstrap]:
  [0] None
  [1] Bootstrap
  [2] Bulma
  [3] Foundation
  [4] Tachyons
  [5] Tailwind
 > 0

// 下記sassファイルを上書きしていいか
 Are you sure you want to overwrite the following files?
 - styles/common/_variables.scss
 - styles/components/_comments.scss
 - styles/components/_forms.scss
 - styles/components/_wp-classes.scss
 - styles/layouts/_header.scss

 (yes/no) [no]:
 > yes

 Done.

// 匿名の使用状況データを送信するを入力するか
 Send anonymous usage data? 
 We are only sending your framework selection and OS

 (yes/no) [no]:
 > 

```

終わるとthemeディレクトリが作成されているので、テーマディレクトリ内で`yarn & yarn build`でjavascriptのパッケージをインストール。

```bash

$ cd theme-name
$ yarn & yarn build
```

wordpressの管理画面にログインして、作成したテーマを選択。

![スクリーンショット 2020-01-13 18.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558877/a7a46d66-42fa-1529-ff4b-0ecb40daebc5.png)

`yarn start`コマンドでbrowsersyncとオートコンパイルが立ち上がる。

```bash

$ yarn start
```

![スクリーンショット 2020-01-13 18.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558877/bf496823-07ce-9c4a-d20f-867080c7f662.png)

# エラー

自分の環境ではコンパイルエラーが発生した。

```shell-session

 ERROR  Failed to compile with 1 errors                            18:20:41

 error  in ./resources/assets/styles/main.scss

Module build failed: Error: Node Sass does not yet support your current env
ironment: OS X 64-bit with Unsupported runtime (67)
```

下記サイトを参考に`node-sass`をインストールしなおしたところ正常にコンパイルできた。
[Nodeのバージョンを上げたらnode-sassがエラーを吐いたのでコードリーディングしてみた](https://dev.classmethod.jp/node-js/node-sass-could-not-find-a-binding/)

```
$ yarn add --force node-sass
```
pythonの組み込み例外一覧を取得する方法

ステップ1: 次のようなpythonファイルを作成する。

```print_exc_tree.py
from __future__ import print_function
import platform


def classtree(cls, depth=0):
    if depth == 0:
        prefix = ''
    else:
        prefix = '.' * (depth * 3) + ' '
    if cls.__name__.lower() == 'error':
        print('{0}{1} ({2})'.format(prefix, cls.__name__, cls))
    else:
        print('{0}{1}'.format(prefix, cls.__name__))
    for subcls in sorted(cls.__subclasses__(), key=lambda c: c.__name__):
        classtree(subcls, depth+1)


if __name__ == '__main__':
    print('Python Version: {0}'.format(platform.python_version()))
    print()
    classtree(BaseException)
```


ステップ2: 
上記のpythonファイルを作成したら、コマンドプロンプトに次のコードを入力する。

```
python  print_exc_tree.py
```

ステップ3: 
次のようにpythonの組み込み例外の一覧を取得することができる。

```
Python Version: 3.7.4

BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... EOFError
...... Error (<class 'locale.Error'>)
...... ImportError
......... ModuleNotFoundError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... OSError
......... BlockingIOError
......... ChildProcessError
......... ConnectionError
............ BrokenPipeError
............ ConnectionAbortedError
............ ConnectionRefusedError
............ ConnectionResetError
......... FileExistsError
......... FileNotFoundError
......... InterruptedError
......... IsADirectoryError
......... NotADirectoryError
......... PermissionError
......... ProcessLookupError
......... TimeoutError
......... UnsupportedOperation
...... ReferenceError
...... RuntimeError
......... BrokenBarrierError
......... NotImplementedError
......... RecursionError
......... _DeadlockError
...... StopAsyncIteration
...... StopIteration
...... StopTokenizing
...... SubprocessError
......... CalledProcessError
......... TimeoutExpired
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TokenError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Verbose
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... ResourceWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... _OptionError
...... error (<class 're.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
```
Go言語でロックファイルを利用した多重起動防止サンプル

Go言語のバッチ等で、ロックファイルを利用した多重起動防止のサンプル実装です。

アプリケーションルートのディレクトリ配下の`/util`ディレクトリに置かれる想定で、`~/go/src/`と`/util/`を除いたディレクトリ名のハイフン区切りをロックファイル名にしています。

ex.) `~/go/src/example/lockfile/util/lockfile.go`の場合
ロックファイルは `~/go/src/example/lockfile/example-lockfile.lock`

## 利用例

```golang:main.go
package main

import (
	"lockfile/util"
	"os"
)

func main() {
	os.Exit(execute())
}

func execute() int {
	util.Setlock()
	defer util.Unlock()

	// do process

	return 0
}
```

## ソースコード

```golang:util/lockfile.go
package util

import (
	"errors"
	"io/ioutil"
	"os"
	"path/filepath"
	"runtime"
	"strings"
	"sync"
)

const separator string = string(filepath.Separator)
const srcDir string = "src" + separator

var lockfile string
var once = new(sync.Once)

// Setlock lock by creating lockfile
func Setlock() (string, error) {
	once.Do(func() {
		lockfile = lockfilePath()
	})
	return lockfile, lock(lockfile)
}

// Unlock unlock by removing lockfile
func Unlock() error {
	if !exists(lockfile) {
		return errors.New("not running about: " + lockfile)
	}
	return os.Remove(lockfile)
}

func lockfilePath() string {
	_, filename, _, _ := runtime.Caller(0)
	rootDir := filepath.Dir(filename)[:strings.Index(filename, separator+"util")]
	packageName := rootDir[strings.Index(rootDir, srcDir)+len(srcDir):]
	lockfileName := strings.ReplaceAll(packageName, separator, "-") + ".lock"
	return filepath.Join(rootDir, lockfileName)
}

func exists(filepath string) bool {
	_, err := os.Stat(filepath)
	return !os.IsNotExist(err)
}

func lock(lockfile string) error {
	if exists(lockfile) {
		return errors.New("already running with: " + lockfile)
	}
	return ioutil.WriteFile(lockfile, []byte(""), 0644)
}
```

## 簡易テスト

```golang:util/lockfile_test.go
package util

import (
	"io/ioutil"
	"os"
	"path/filepath"
	"runtime"
	"strings"
	"testing"
)

func TestFilename(t *testing.T) {
	lockfilePath := lockfilePath()
	if filepath.Base(lockfilePath) != "lockfile.lock" {
		t.Errorf("lockfilePath() = %s; want basename=lockfile.lock", lockfilePath)
	}
	_, filename, _, _ := runtime.Caller(0)
	rootDir := filepath.Dir(filename)[:strings.Index(filename, "/util")]
	if filepath.Dir(lockfilePath) != rootDir {
		t.Errorf("lockfilePath() = %s; want dirpath=$GOPATH/src/path/to/lockfile", lockfilePath)
	}
}

func TestSetlock(t *testing.T) {
	if lockfilePath, err := Setlock(); err != nil {
		t.Errorf("cannot lock by creating lockfile: %s", lockfilePath)
	}
	_, err := Setlock()
	if err == nil {
		t.Errorf("error shoud occurs with existing lockfile")
	}
	os.Remove(lockfilePath())
}

func TestUnlock(t *testing.T) {
	lockfilePath := lockfilePath()
	ioutil.WriteFile(lockfilePath, []byte(""), 0644)
	if err := Unlock(); err != nil {
		t.Errorf("cannot unlock by removing lockfile: %s", lockfilePath)
	}
	err := Unlock()
	if err == nil {
		t.Errorf("error shoud occurs with no lockfile")
	}
}
```
Dockerで立ち上げたDjangoの内蔵サーバに同LAN上の別PCからアクセス

#背景
LAN内PC上のDjangoサイト（Django内蔵サーバ）に同LAN内別PCからアクセスしたい。

#環境
・Windows 10 Enterprise
・Docker for Windows 2.1.0.1
・Django 3.0（Dockerコンテナ）
・MySQL 5.7（Dockerコンテナ）
・プロキシあり


#参考
こちらの記事の内容で行けました↓
[Docker for Windowsのコンテナに同一ネットワークのスマホからアクセス](https://gakuya.work/docker-for-windows-smartphone-access/)

ファイアウォール設定が阻んでいた様です。

ポートフォワードはdocker-composeファイルで設定しているので無視。

上記設定後、サイトにアクセスするとエラー。
**「Invalid HTTP_HOST header～」**

これを調べると、setting.py中の「ALLOWED_HOSTS」が空白になっている事が原因だった。
「= ['*']」に変更する事でアクセス出来た。

参考：[Django: 解決法 Invalid HTTP_HOST header](https://yukun.info/django-invalid-http_host-header/)
GitHubActionsでタグを作成する

公式であって良さそうだけれどなさげなので書いておきます。[Marketplace](https://github.com/marketplace?utf8=%E2%9C%93&type=actions&query=tag)には色々ありますが、`GITHUB_TOKEN`を渡した先で何をしているか確認するのが面倒なので。

# やり方

```yml
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - run: |
        git tag hoge
        PUSHURL="https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}"
        git push ${PUSHURL} hoge
```

`hoge` タグが作れます。
タグ名は色々都合があると思うので、別でなんとかしてください。

# メモ

- `actions/checkout@1`で取得したもの。
    - これで取得したリポジトリは`git`コマンドは使えるけれど`push`とかはできない。
    - 書いてるURLで`clone`したら`push`とかできるわけではあるが。
- `origin`を`git remote set-url`で書き換えてもいいけど、他への影響を減らしたかった。
- `.netrc`に書いてもいいけど、他への影響を減らしたかった。
- GitHub APIを叩いてもいいけど、面倒だった。
- 見ての通り軽量タグ。
PandasでPayPayデータ処理。groupbyを学ぶ

Qiita初投稿。

PayPay販売側です。

レジに連動していないPayPayスキャン支払は不安です。レジは打ったけど、PayPay支払いの手続きが終わっていない、PayPay支払い手続きは済んだけど、レジ通っていないとか。

日々レジとPayPayの取扱額が合致していることを確認するのに、Jupyter-notebookでPayPayから取得した取引データを処理しましょう。

まずはpandasのインポート

```
import pandas as pd
```

PayPayデータを見てみましょう。
parse_datesで選択したcolumnをdatetime型で読み込めます。

```
df = pd.read_csv("データ名.csv",encoding='cp932',header=0,parse_dates=['取引日時'])
df.head()
```



PayPayの取引データはこのようなもの。csvでダウンロードできます。
<img width="1186" alt="スクリーンショット 2020-01-13 17.35.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203826/87f8e685-d237-b2a7-e938-b9d61b5fe43e.png">
日毎に取引金額を集計しましょう。
取引日時カラムには時間、分、秒まで入っています。Series.dt.dateで日時までのデータにしましょう。


```
df.groupby(df['取引日時'].dt.date).agg({'取引日時':'count','取引金額':'sum'})
```

このように集計できます。
<img width="263" alt="スクリーンショット 2020-01-13 17.54.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203826/c25db952-b51c-1757-8208-43d1542db13b.png">
これで毎日レジと照合できますね。