OmniAICreator/Qiita-1.07M huggingface dataset:
Docker for Macでnginx-ingress-controllerを使う方法

こんなingressを定義して


```yaml:ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend-for-frontend-ing
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  defaultBackend:
    service:
      name: bff-svc
      port:
        number: 3000
```

```bash
$ kubectl apply -f ingress.yaml
```

と、実行してもアクセスできない...

## 解決方法

Docker For Macにnginx-ingress-controllerはインストールされていないみたいです。

以下のコマンドを実行すると無事使えるようになりました。

```bash
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/cloud/deploy.yaml

```

一次リソースはちゃんと見ましょう。

備忘録でした。

### 参考
[https://kubernetes.github.io/ingress-nginx/deploy/#docker-for-mac](https://kubernetes.github.io/ingress-nginx/deploy/#docker-for-mac)
pythonで三重ループと条件分岐を一行で記述したい

#はじめに
[たかしくん問題](https://qiita.com/canonno/items/29eb369d32c030fea367)を実装してるときに出会った知見メモ。
pulpを使うときに多重のfor文を一文で記述する必要があり勉強しました。
まだまだ記述の力不足を感じます。。。

#メモ
##三重ループ

```py
for x in range(4):
    for y in range(3):
        for z in range(2):
            print(x,y,z)
>>0 0 0
>>0 0 1
>>0 1 0
>>0 1 1
>>0 2 0
>>0 2 1 ...
```
は

```py
[(x,y,z) for x in range(4) for y in range(3) for z in range(2)]
>>[(0, 0, 0),
>> (0, 0, 1),
>> (0, 1, 0),
>> (0, 1, 1),
>> (0, 2, 0),
>> (0, 2, 1), ...
```

##三重ループ＋条件分岐１つ
```py
for x in range(4):
    if x ==3:
        for y in range(3):
            for z in range(2):
                print(x,y,z)
>>3 0 0
>>3 0 1
>>3 1 0
>>3 1 1
>>3 2 0
>>3 2 1
```
は

```py
[(x,y,z) for x in range(4) if x == 3 for y in range(3) for z in range(2)]
>>[(3, 0, 0), (3, 0, 1), (3, 1, 0), (3, 1, 1), (3, 2, 0), (3, 2, 1)]
```

##三重ループ＋条件分岐２つ
```py
for x in range(4):
    if x ==3:
        for y in range(3):
            for z in range(2):
                if z == 1:
                    print(x,y,z)
>>3 0 1
>>3 1 1
>>3 2 1
```
は

```py
[(x,y,z) for x in range(4) if x == 3 for y in range(3) for z in range(2) if z == 1]
>>[(3, 0, 1), (3, 1, 1), (3, 2, 1)]
```

#さいごに
for文が回る順序がややこしいね
Automatorを使ってRのコードを自動で動かした話

# はじめに
`rtweet` を使ってツイートを取得してるんですが、無料版APIだと検索できる時期が限定されるので、定期的にツイートを取得できるようにしたら便利だなと思ったのでやってみました。

# Rスクリプト
今回動かしたのはこちらのコード

```R
fake_tag <- as.vector(read.table("/Users/tsujimurayuki/Documents/tw_collect/fake.txt", 
                                 fileEncoding="UTF-8")[,1]) # ハッシュタグを読み込み
```

本当はハッシュタグをスクリプト上で指定したいんですが日本語書いたらエラーはいたので指定したいハッシュタグをテキストファイルとして保存したものをエンコーディング指定して読み込んでいます。指定したタグは以下の通り。

```R
[1] "#トランプ大統領の再選を支持します"    
[2] "#トランプ大統領を支持します"          
[3] "#トランプ大統領の再選を断固支持します"
[4] "#バイデン不正"                        
[5] "#バイデンの不正を許すな"            
```

このタグを使っているツイートを検索して保存します。
＊なんでかよくわからんけどパッケージ同士でぶつかってエラーはいたのでパッケージを個別に指定して書いてます。（上手いやり方知ってる人いたら教えて欲しい）

```R
dat1 <- rtweet::search_tweets(paste(paste(fake_tag, collapse =  " OR "), 
                           "filter:retweets", paste0("since:", Sys.Date()-1),
                           paste0("until:", Sys.Date()),
                           sep = " "), 
                     n=18000, include_rts = TRUE, 
                     retryonratelimit = TRUE)
dat2 <- magrittr::`%>%`(dat1, 
                        dplyr::select(user_id, created_at, screen_name, 
                                      text, retweet_screen_name))
path <- paste("/Users/tsujimurayuki/Desktop/UTTData/code&data/twitter_analysis") # スクリプトの置き場所とデータの保存先が違うので指定
readr::write_rds(dat1, paste0(path, paste("/data/fake news/tweets/fake", 
                             Sys.Date()-1, sep = "_"), ".rds"))
readr::write_csv(dat2, paste0(path, paste("/data/fake news/tweets/fake", 
                            Sys.Date()-1, sep = "_"), ".csv"))
```

# シェルスクリプト
Automatorのカレンダーアラームを使って昼時に毎日定時にコードを実行するようにしたいので、設定した時間にシェルスクリプトでRスクリプトを動かすよう設定します。

```bash

cd Documents/tw_collect
/Library/Frameworks/R.framework/Versions/3.6/Resources/bin/Rscript --encoding=UTF-8 collect.R
```

シェルスクリプトの書き方とか初めてだったんですけど、この場合はそんなに複雑じゃなかったです。
1行目でディレクトリの設定、2行目でRスクリプトを動かしています。
シェルスクリプトの場合、cdでディレクトリ指定 (Rの `setwd()` 的な) ができます。今回は、RスクリプトをDocument内にある `tw_collect` フォルダにテキストファイルとRスクリプトを置いてあります。

2行目の部分で `Rscript` ファイルを呼び出しています。こいつをシェルスクリプトで動かすとRのコードを動かしてくれます。（パスは計算機の種類やRのバージョンとかによって違うぽいので自分でやるときは気をつけてください。）
これは2つの引数、エンコーディングと実行するファイルを取ります。今回はエンコーディングでUTF-8、実行するファイルとして上記のコードを `collect.R` として指定しています。

あとはAutomatorでシェルスクリプトを指定、このコードを書いてカレンダーでいつ実行するかを決めてやれば指定した時間に勝手に動いてくれる..はず。
![スクリーンショット 2021-01-18 20.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712546/e192fb62-3253-96db-0f18-cc10e3a34f56.png)
出来上がりはこんな感じ。
【Python】matplotlibでfont familyとfont

#答え

plt.rcParams['font.family'] = 'Times New Roman'

plt.rcParams['font.size'] = 14


これでfont familyをtimes new roman　とfont sizeを14pxに変更できる。

こうすれば、そうろんなどでそのままmatplotlibで描画したグラフを利用できる。
「大学入学共通テスト2021数学II第1問 配点30[1] 」（三角関数） をsympyとWolframAlphaでやってみたい(途中)

アドバイスをいただけると助かります。

(問題)大学入学共通テスト2021数学II第1問
https://cdn.mainichi.jp/item/jp/etc/kyotsu-2021/pdf/MT2P.pdf
解答
https://www.toshin.com/kyotsutest/answer_suugaku2b.html
設問別分析＞不慣れな受験生が多くいたと思われる。
https://www.toshin.com/kyotsutest/analysis_suugaku2.html

(参考)数学は共通テストをグラフで。
https://qiita.com/Snakeseed/items/47e5b5b4f3b55ee9d2df

##SymPyで
```python
# 数学Ⅱ第1問
# [1](1)
from sympy import *
var('t ka_A ka_I ka_U ka_E')
ans=solve(sin(pi/ka_A)-sqrt(3)/2,ka_A)
if(ans[0]<pi/2) :
   ka_A=ans[1]
else:
   ka_A = ans[0]
print("ア=",ka_A)

ans=solve(sin(t)+sqrt(3)*cos(t)-ka_I*sin(t+pi/ka_A),ka_I)
ka_I = ans[0]
print("イ=",ka_I)

ｙ=ka_I*sin(t+pi/ka_A)
print("  ｙ=",ｙ)
print(" ",0+pi/ka_A*180/pi,"から",(pi/2+pi/ka_A)*180/pi)
ans=solve(pi/ka_U+pi/ka_A-pi/2,ka_U)
ka_U = ans[0]
print("ウ=",ka_U)

ka_E=y.subs([(t,pi/ka_U)])
print("エ=",ka_E)

# 解答
# ア= 3
# イ= 2
#   ｙ= 2*sin(t + pi/3)
#   60 から 150
# ウ= 6
# エ= 2

#
# [1](2)
# 続く
```

##WolframAlphaで
```
数学Ⅱ第1問
[1](1)
```

入力:
sin x + sqrt(3) cos x,0<=x<=pi/2
https://www.wolframalpha.com/input/?i=sin+x+%2B+sqrt%283%29+cos+x%2C0%3C%3Dx%3C%3Dpi%2F2&lang=ja
プロット:
(省略)

入力:
y=sin x + sqrt(3) cos x,0<=x<=pi/2
https://www.wolframalpha.com/input/?i=y%3Dsin+x+%2B+sqrt%283%29+cos+x%2C0%3C%3Dx%3C%3Dpi%2F2&lang=ja
別の形:
{y = 2 cos(π/6 - x), 0<=x<=π/2}

[1](2)(i)
入力:
y=sin x + p cos x,p=0,0<=x<=pi/2
https://www.wolframalpha.com/input/?i=y%3Dsin+x+%2B+p+cos+x%2Cp%3D0%2C0%3C%3Dx%3C%3Dpi%2F2&lang=ja
解:
p = 0, 0<=x<=π/2, y = sin(x)

```
[1](2)(ii)
```
入力:
solve[ sin(0)+p*cos(0)=sqrt(k)*(cos(0)*x+sin(0)*y),sin(pi/2)+p*cos(pi/2)=sqrt(k)*(cos(pi/2)*x+sin(pi/2)*y),{x,y}]
https://www.wolframalpha.com/input/?i=solve%5B+sin%280%29%2Bp*cos%280%29%3Dsqrt%28k%29*%28cos%280%29*x%2Bsin%280%29*y%29%2Csin%28pi%2F2%29%2Bp*cos%28pi%2F2%29%3Dsqrt%28k%29*%28cos%28pi%2F2%29*x%2Bsin%28pi%2F2%29*y%29%2C%7Bx%2Cy%7D%5D&lang=ja
結果:
x = p/sqrt(k) , y = 1/sqrt(k) , k!=0 , p!=0

```
xxxxxx[1](2)(ii)
```

入力エラー:動くような気がしました。
solve[ s+p*c=sqrt(k)*(c*x+s*y) && c^2+s^2=1 && x^2+y^2=1 &&  x>0 && y>0 && p>0,{x,y}]
https://www.wolframalpha.com/input/?i=solve%5B+s%2Bp*c%3Dsqrt%28k%29*%28c*x%2Bs*y%29+%26%26+c%5E2%2Bs%5E2%3D1+%26%26+x%5E2%2By%5E2%3D1+%26%26++x%3E0+%26%26+y%3E0+%26%26+p%3E0%2C%7Bx%2Cy%7D%5D&lang=ja
結果:
次をお試しください：
```

続く
MPEG-2 TS, MPEG-2 Video, MPEG-4 AVC/H.264, HEVC/H.265の規格書のありか

# 初めに
最新のMPEG-2 TS, H.264の規格書について、記録として残しておきます。
記載の対象は、MPEG-2 Systems、MPEG-2 Video、MPEG-4 AVC/H.264、HEVC/H.265の2021年1月時点でのリンク先とします。
これらの規格は、同じ内容のものが、ISO/ITU両方の団体から出版されています。
どちらでも結構ですが、比較的ITUのほうが入手しやすいと思います。

#MPEG-2 Systems
ISO/IEC 1318-1 （購入が必要）
本編：https://www.iso.org/standard/75928.html
修正：https://www.iso.org/standard/76595.html

ITU-T H.222.0 （会員登録が必要）
本編：https://www.itu.int/rec/T-REC-H.222.0-201808-I
修正：https://www.itu.int/rec/T-REC-H.222.0-201911-I!Amd1

# MPEG-2 Video
ISO/IEC 13818-2（購入が必要）
https://www.iso.org/standard/61152.html

ITU-T H.262（会員登録が必要）
https://www.itu.int/rec/T-REC-H.262-201202-I

#MPEG-4 AVC/H.264
ISO/IEC 14496-10（購入が必要）
https://www.iso.org/standard/75400.html

ITU-T H.264（無料）
https://www.itu.int/rec/T-REC-H.264-201906-I

#HEVC(MPEG-H Part2)/H.265
ISO/IEC 23008-2（購入が必要）
https://www.iso.org/standard/75400.html

ITU-T H.265（無料）
https://www.itu.int/rec/T-REC-H.265-201911-I

#その他
これらのサイトじゃなくても、"(規格名) + PDF"で検索すると、他のサイトから規格書を入手できるケースが多いです。ただしその場合、なるべく最新の規格書を入手することをお勧めします。
特にMPEG-2 SystemはVideo/Audioのコーデックが追加されるたびに頻繁に更新されています。
pythonistaでScroll Viewの実装方法１

# はじめに
地図をスクロールしながら見ている時の様に、
大きな画像の一部を画面に表示して、スクロールさせる。
これは　uiライブラリのscroll View　を、使用すれば実装できます。


# 環境
ios + pythonista3

# 使用ライブラリ
ui　ライブラリのviewを使用します。
```
import ui
```

[pythonista ui ドキュメント](omz-software.com/pythonista/docs/ios/ui.html)

pythonistaのドキュメントは、それなりに丁寧に記載されているので　初心者でもある程度
分かります。
英語が優しいのか、自動翻訳様のお力を全面的にお借りしている身でも　なんとか理解できました。


# とりあえず実装してみる

```php:scrollview_image.py
#! python3
# 
# 20210118 ver001 scrollviewに大きな画像を見て表示してスクロールを実装。
# 

import ui #scrllviewやimageviewを表示するライブラリ


class epaint(ui.View):
	def __init__(self):
		w,h = ui.get_screen_size()#uiライブラリのメソッド。画面のサイズを取得して、ｗ、ｈに代入。
		
		#スロールする元の大きなが画像のViewを作成する。この段階では何も表示されない。
		self.bv = ui.ImageView()#bvってオブジェクトは、ui.ImageViewだよって宣言して作成した。
		self.bv.frame = (0, 0, 3264,2448)#ImageViewの枠サイズを宣言。中に入る画像はこのサイズに延ばされる。
		#　　　　　　　　　　　　　　ちなみに、frameの行は無くても可。無い場合は元の画像サイズでViewが作成される。
		self.bv.image = ui.Image.named('test:Peppers')#テスト画像を呼び出して表示(pythonista3内包)
		self.bv.bg_color = 'red'#背景色を設定。無くても可。

		#ScrollViewを作成。スクロールビューは、画面に表示する枠と理解する。
		self.sv = ui.ScrollView()#svってオブジェクトは、ui.ScrollViewだよって宣言。
		self.sv.width = w*0.8#画面の８割の幅に表示枠を設定。
		self.sv.height = h*0.75#画面の７５％の高さに枠を設定。
		self.sv.content_size = (3500,2500)#ScrollViewの元画像を入れる枠のサイズを設定する。
		#中に入れるViewのサイズと同じか大きくする。左上に配置される。ImageViewと違って引き延ばされない。
		self.sv.scroll_enabld = False # スクロールがTrue有効・False無効。デフォルトTrue
		
		self.sv.add_subview(self.bv)#svにbvを入れる事で　ScrollViewの元が画像をcontentsに代入した。
		self.add_subview(self.sv)#selfにsvを入れる事で表示させるViewはsvと宣言した。


v = epaint() # クラスを変数に代入。インスタンス化。
v.present('fullscreen')#フルスクリーンでui表示する。


```

# 説明
スクロールビューもイメージビューもuiライブラリのViewオブジェクトの一種。
viewオブジェクトは、レタッチソフトとかのレイヤみたいなイメージです。
（ちゃんと順番もあります。）

ここが難しいところですが、ScrollViewの元画像は　Viewなら何でもOK。
イメージ意外にButtonも配置できます。何個でも配置できます。
ScrollViewのcontentsで元画像の枠のサイズを決めて、ScrollViewを作成してから
Viewを代入するとcontentsの所に配置されます。
配置座標を指定しないと原点の左上になります。
（座標指定の仕方も、そのうちアップします）

uiライブラリの座標系は　左上が（０，０）ｘ方向は右方向に増加しますが、
ｙ方向は下が増加方向です。普通の座標系とちょっと違うので　最初は戸惑うかも。

最後に、Viewは宣言しただけでは、表示されないのでaddで表示しています。

# 注意点
・uiオブジェクトの座標系は、左上が原点で右下に向かって増加する。
・Viewには順番がある。タッチイベントの競合。
　これは、ScrollView以外にもタッチイベントを使うViewが混在すると
　一番上のタッチイベントを使うViewだけが　タッチイベントを受け取ります。
　具体的には　手書きのパスを取得するviewとScrollViewを両方同時には
　使えない。
・Viewには順番がある。順番を入れ替えるメソッドもある。これを利用して
　画面を切り替える事もできます。
・元画像のcontentsには　画像の他にボタンとかも入れられます。
　ボタンを入れると　画面に入りきらないボタンをスクロールして、押す様な
　uiを作る事が出来ます。

# 最後に
最終的に　拙記事「[写真を読み込んで手書きスケッチ。zoom機能付。作ってみた。](https://qiita.com/pepopotanius/items/ac12be109fa3a8fec12f)」の
機能を分解して　紹介していこうと思います。
このツールを作っていて　pythonistaでScrollViewについての記事が無くて
本当に苦労したので　最初に紹介しました。
内容的には　swiftとかと一緒だったようで、イメージを理解するには
そちらの記事も参考なると思います。

[[iPhone] 大きい画像を UIScrollView でスクロールする](https://i-app-tec.com/ios/uiscrollview.html)
threeでshadertoy その2

#概要

three.jsでshadertoyのスクリプトを動かす。
ソースをコンパイルしてみた。

#参考にしたページ

https://qiita.com/Hirai0827/items/e17d70d2e65e3d68a46a

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ab3e9021-d2b6-7dc6-7e2b-c4b7397c8afa.jpeg)


#投入したソース

```
twist  y  4.0
  donut  z  0.5  0.1
  sphere  0.25
```

#生成したglsl

```
precision mediump float;
uniform vec3 iResolution;
uniform float iGlobalTime;
uniform int iFrame;
#define time iGlobalTime;
float map(vec3 P_AAAA) {
	float d_aaaa = 10000000.0;
	vec3 P_BAAA = P_AAAA;
	P_BAAA.zx = P_AAAA.zx * mat2(cos(P_AAAA.y * 4.000), -sin(P_AAAA.y * 4.000), sin(P_AAAA.y * 4.000), cos(P_AAAA.y * 4.000));
	d_aaaa = min(d_aaaa, length(vec2(length(P_BAAA.xy) - (0.500), P_BAAA.z)) - (0.100));
	d_aaaa = min(d_aaaa, length(P_BAAA) - 0.250);
	return d_aaaa;
}
vec3 getNormal(vec3 p) {
    float d = map(p);
    vec2 e = vec2(.01, 0);
    vec3 n = d - vec3(map(p - e.xyy), map(p - e.yxy), map(p - e.yyx));
    return normalize(n);
}
vec4 trace(vec3 c, vec3 r) {
    float t = 0.0;
    for (int i = 0; i < 128; i++)
    {
       vec3 p = c + r * t;
       t += map(p) * (0.5);
    }
    vec4 q = vec4(getNormal(c + r * t), t);
    return q;
}
void main() {
    vec2 uv = (gl_FragCoord.xy * 2.0 - iResolution.xy) / min(iResolution.x, iResolution.y);
    vec3 c = vec3(0.0, 0.0, -1.5);
    vec3 r = normalize(vec3(uv, 1.5));
    vec4 t = trace(c, r);
    float d = t.w;
    vec3 n = t.xyz;
    float v = 1.0 / (1.0 + t.w * t.w * 0.2);
    gl_FragColor = vec4(vec3(1.0 - dot(n, r) * dot(n, r)) / (1.0 + d * d * 0.1), 1.0);
    gl_FragColor.x = gl_FragColor.x;
    gl_FragColor.y = gl_FragColor.y;
    gl_FragColor.z = gl_FragColor.z;
    gl_FragColor.w = 1.0;
}

```

#成果物

https://embed.plnkr.co/plunk/jOpjdS22zaYBUwmU


以上。
Webpack5 + TypeScript + Babel(core-js)でCan't resolveエラーが出た場合の対処法

### 環境

    "@babel/cli": "^7.12.10",
    "@babel/core": "^7.12.10",
    "@babel/preset-env": "^7.12.11",
    "@babel/preset-typescript": "^7.12.7",
    "babel-loader": "^8.2.2",
    "ts-loader": "^8.0.14",
    "typescript": "^4.1.3",
    "webpack": "^5.14.0"
    "core-js": "^3.8.2"

### 概要
WebpackとBabelでpolyfilをいい感じに使おうとしたら以下のエラーが延々と…

```cmd
ERROR in ./node_modules/core-js/modules/es.array.for-each.js 2:8-38
Module not found: Error: Can't resolve '../internals/export' in '/Users/s01212/workspace/glasgow-dpa-sdk/node_modules/core-js/modules'
 @ ./src/scripts/Params.ts 1:0-46
 @ ./src/scripts/AmebaDpa.ts 1:0-34 25:4-15 27:8-24 30:6-23
 @ ./src/scripts/index.ts 1:0-38 10:26-34

ERROR in ./node_modules/core-js/modules/es.array.for-each.js 3:14-52
Module not found: Error: Can't resolve '../internals/array-for-each' in '/Users/s01212/workspace/glasgow-dpa-sdk/node_modules/core-js/modules'
 @ ./src/scripts/Params.ts 1:0-46
 @ ./src/scripts/AmebaDpa.ts 1:0-34 25:4-15 27:8-24 30:6-23
 @ ./src/scripts/index.ts 1:0-38 10:26-34

ERROR in ./node_modules/core-js/modules/es.array.iterator.js 2:22-63
Module not found: Error: Can't resolve '../internals/to-indexed-object' in '/Users/s01212/workspace/glasgow-dpa-sdk/node_modules/core-js/modules'
 @ ./src/scripts/Params.ts 2:0-46
 @ ./src/scripts/AmebaDpa.ts 1:0-34 25:4-15 27:8-24 30:6-23
 @ ./src/scripts/index.ts 1:0-38 10:26-34
```

### ✨解決
```js:webpack.config.js
  resolve: {
    extensions: [
      '.ts'
    ]
  }
```

上記に `'.js'` を追加することで解消！
python xlwings: 最終行のセルを求める

pythonのxlwingsで特定の列から要素のある最終行の値を取得・代入する方法です。
途中要素のない行が挟まっても求められます。

Book1.xlsx

|行/列| A | B |C|
|:-:|:-:|:-:|:-:|
|1|品名|数|
|2|りんご| 2  |
|3||   |
|4|みかん| 0  |
|5|いちご| 5  |

```fun.py
def lastExcelRow(sheet, col):
       lwr_r_cell = sheet.cells.last_cell      # lower right cell
       lwr_row = lwr_r_cell.row             # row of the lower right cell
       lwr_cell = sheet.range((lwr_row, col))  # change to your specified column

       if lwr_cell.value is None:
           lwr_cell = lwr_cell.end('up')    # go up untill you hit a non-empty cell

       return lwr_cell.row
def lastExcelCell(sheet, col):#colはアルファベットでも数値でもどちらも可
    return sheet.range(( lastExcelRow(sheet, col), col ))
```

```main.py
import xlwings as xw
import fun

bk = xw.Book("Book1.xlsx")
targetSheet = bk.sheets("Sheet1")

# A列の要素のある最終行の値を求める
print( fun.lastExcelCell(targetSheet , "A").value ) # range("A5") -> いちご
# 1列目(=B列)の要素のある最終行を求める
print( fun.lastExcelCell(targetSheet , 2).value ) # range("B5") -> 5

# A列の要素のある最終行の1行下に代入
fun.lastExcelCell(targetSheet, "A").offset(1, 0).value = "めろん" # -> いちごの下行に"めろん"を代入
```


### 参考
[xlwings.Range 簡易リファレンス](https://qiita.com/m5knt/items/a71faf6ff256f1d1ae5f)
[xlwings function to find the last row with data (stackoverrun)](https://stackoverrun.com/ja/q/9208907)
Mutation Surveyorを使わずに無料でヘテロ接合Indelを解析したい

#サマリー
オープンソースのPoly Peak Parserを使い、サンガー法の出力ファイル（`.ab1`または`.scf`）とリファレンス配列から、ヘテロ接合Indel（挿入・欠失）やヘテロ接合SNVを確認します。CRISPRやTALENでも活躍します。

オンラインにファイルを流せる場合は[こちら](http://yosttools.genetics.utah.edu/PolyPeakParser/)で利用可能です。使用感が確認できます。

#Mutation Surveyorとは
サンガー法の結果解析として用いられている変異解析ソフトウェアです。独自のアルゴリズムにより、高精度でヘテロ接合Indelやヘテロ接合SNVを検出できます。ただし、破茶滅茶にお高い（数十〜数百万円）です。

#Poly Peak Parserとは
その名の通り、クロマトグラムに複数のピークが重複して存在するサンガー法の結果を解析できるRパッケージです。2014年にユタ大学のJonathon T. Hillらによって発表されました*。Mutation Surveyorが手元にない...ヘテロ接合のIndelを確認するのが面倒...そんなときに役立ちます。

*Hill, Jonathon T., et al. "Poly peak parser: Method and software for identification of unknown indels using sanger sequencing of polymerase chain reaction products." Developmental Dynamics 243.12 (2014): 1632-1636.

#環境
Version 4.0 以降のR環境があれば使えます。プラットフォームはWindowsでも、Macでも、Linuxでも大丈夫です。

```bash
$ R --version
  R version 4.0.3 (2020-10-10) -- "Bunny-Wunnies Freak Out"
  Copyright (C) 2020 The R Foundation for Statistical Computing
  Platform: x86_64-apple-darwin17.0 (64-bit)
```

#導入
びっくりするほど簡単。公式のインストール方法に沿っていくだけです。Rのコンソールを開いて以下のコマンドを打っていきます。確認画面が出てきたら問題がないことを確認し、`All`か`Yes`を選択します。

```R:BioManagerのインストール
> if (!requireNamespace("BiocManager", quietly = TRUE))
      install.packages("BiocManager")

> BiocManager::install("sangerseqR")
> browseVignettes("sangerseqR")
```

これで完了です。

#使ってみる
まずはライブラリーを読み込み、PolyPeakParserを起動します。

```R
> library(sangerseqR)
> PolyPeakParser()
```

ゴニョゴニョといろいろなものが読み込まれていきます。しばらくすると自動でブラウザが立ち上がり、以下のような画面が出てきます。
![polypeakparser_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190760/12e6d47f-ea84-0ced-4ae2-afe6f575249e.png)
左上のボタン`Browse`から解析対象のファイルを選択すると、自動的に処理が始まります。処理が終わると自動的にクロマトグラム表示になります。今回は[こちら](https://github.com/labsquare/CutePeaks/tree/master/examples)で公開されている無料のab1ファイル`A_forward.ab1`を例に解説します。
![polypeakparser_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190760/73dfe84d-4569-0c98-cd82-33af08375110.png)
画面左部のペインでかんたんな表示設定や解析設定ができます。
`Approx. number of bases per row` : クロマトグラム１行あたりの塩基数
`5' Trim` : 5末端のトリミング長
`3' Trim` : 3末端のトリミング長
`Show Trimmed Region` : トリミングされた配列を赤斜線で潰すかどうか
`Signal Ratio Cutoff` : いちばん大きい波形に対してどれほどの比率の大きさの2nd Peakを拾ってくるか

また、`Enter Reference Sequence`に[Ensembl](https://asia.ensembl.org/index.html)などで拾ってきたリファレンス配列を入れてあげれば、2nd Peak（２番めに高い波形）との比較ができます。2nd Peakがない場合、1st Peakが採用されます。
![polypeakparser_3a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190760/2291abca-604c-8f75-7b07-446d8ce8f093.png)
リファレンス配列と合致する場所には`|`が表示されます。今回の例では１箇所だけヘテロ接合と思われる変異が発見されました。

| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190760/9245410f-d28a-c8d4-b60c-5fd84e4818aa.png" width="450px">|
|:-----------------|

こんな感じで、もう少し長く連続したヘテロ接合のIndelがあるサンプルのab1ファイルを見てみると、これまでは手作業で行っていたであろう「野生型でない方の配列をリファレンス配列と比べてIndel長を検討する」という作業が数秒で行えるようになります。（そういったファイルは持っているのですが、大人の事情でここではお示しできません...すみません）

#まとめ
有料ソフトほどではないですが、ヘテロ接合mutationの検出にかかる時間を短縮することに成功しました。他にも機能があるライブラリーなので、詳しくは[Bioconductorのページ](https://www.bioconductor.org/packages/release/bioc/html/sangerseqR.html)からReference Manualをご覧ください。
Error while saving. Could not save because the file has been modified since the start of editing.

# 事象 : Tomcatの設定を保存したら怒られた
- 環境
    - Windows10 Pro バージョン1909
    - Eclipse IDE for Enterprise Java Developers Version: 2020-09 (4.17.0)
    - Apache Tomcat 8.5.61

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/3a522f61-2817-bb1e-a42e-e35015df8664.png)

```text:メッセージ
Error while saving. Could not save because the file has been modified since the start of editing.
```

## 原因 : 違うとこで更新したから

```text:メッセージの訳
保存中にエラーが発生しました。編集を開始してからファイルが変更されているため、保存できませんでした。
```

### 対応 : 一回閉じてまた開く
1. 設定した内容は諦めて設定を閉じる![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/6665b437-f888-d69c-fd5c-1b304f77378a.png)
1. [Servers]タブ > Tomcatダブルクリック > 設定を開く
2. 今一度設定して保存する
AndroidTV9にadbでapkインストールし開くメモ

#はじめに
某中国電機メーカーのスティックAndroidTV買った。
自分はお初AndroidTVでは無いが、最近のAndroidTVに野良apkをadbで入れても自動的にAndroidTV HOME Launcherに登録はされないことを思い出した。
検索しても日本語の記事が無かったようなので、今更ではあるがそれの開き方のメモである。

#adbでアプリインストール
分からない場合はここを参照。
https://developer.android.com/studio/command-line/adb?hl=ja

※AndroidTVは基本的にUSBでadb接続できない機種が多い。そのためTCP/IPで接続を行う。

**インストールしてもadbからの指示で起動はできるが、Launcher自体に登録されない。**

#開き方

今回はその某中国電機メーカーのスティックAndroidTVでやっていく。
サンプルとして今回はCPU-Zを開いてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/2f83d677-97c3-1f66-1cfd-5fac7ca6d0cf.png)

上の画像のようにインストールしてもアプリ一覧には追加されないため開けない。

**設定**を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/72192cdd-522e-7fac-68f6-d424cbc238d4.png)

**アプリ**を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/86654341-40b1-53d8-ab58-2ea25f3975f5.png)

インストールしたアプリが出てくる。

今回**インストールしたアプリ**を開く
この場合CPU-Zを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/1b5ae372-84f2-79ee-a9d3-78ca32fd71a9.png)

アプリの情報が出るため、**開く**でアプリが立ち上がる。

これでadbでインストールしたアプリが開ける。

#最後に

昔のAndroidTVだったら「インストール済みのアプリ」という項目があり、アプリが簡単に開けたが今のLauncherだとアプリ一覧には追加されないようなので、開くのが一苦労。

標準のLauncherでインストールしたアプリを一覧についかされる方法を探りたいと思う。
LaravelのキューでSQSを使う設定

## 設定方法
`.envファイル`の以下を環境変数を指定する。

```PHP:.env
QUEUE_DRIVER=sqs

AWS_ACCESS_KEY_ID=AAAAAAAAAAAAAAAAAAAA
AWS_SECRET_ACCESS_KEY=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
AWS_SQS_PREFIX=https://sqs.ap-northeast-1.amazonaws.com/000000000000
AWS_SQS_QUEUE=QueueName
AWS_SQS_REGION=ap-northeast-1
```
`AWS_SQS_PREFIX`は作成したキューのPrefixを指定。
`AWS_SQS_QUEUE`は作成したキューの名前を指定。
`AWS_SQS_REGION`は自分のリージョン名を指定。

`AWS_ACCESS_KEY_ID`と`AWS_SECRET_ACCESS_KEY`についてはTOPの右上の`セキュリティ認証情報`から`アクセスキー`の`新しいアクセスキーの作成`から作成する。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646313/317ee570-3c3d-f326-3998-761e32ebd6ff.png">
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646313/a29ece68-7791-ccd3-b39a-bb6c37e34179.png">
これらの環境変数はこのファイルで使用されています。
一時的にsyncからSQSに変更したい場合はこちらを直接変更しても良いかと思います。

```PHP:config/queue.php
'sqs' => [
    'driver' => 'sqs',
    'key' => getenv('AWS_ACCESS_KEY_ID'),
    'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
    'prefix' => env('AWS_SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
    'queue' => env('AWS_SQS_QUEUE', 'your-queue-name'),
    'region' => env('AWS_SQS_REGION', 'us-east-1'),
],
```

## その他
syncと違ってSQSの場合は以下のコマンドでワーカーを動かす必要があります。

```
php artisan queue:work
```
テーブルにカラムを追加する方法

今回はmigrateファイルの記述をして追加する方法を実行します。

#migrateファイルを編集
まず、README.mdを参考にmigrateファイルを編集します。

```README.md
## items テーブル

| Column            | Type       | Options           |
| ----------------- | ---------- | ----------------- |
| name              | string     | null: false       |
| explanation       | text       | null: false       |
| category_id       | integer    | null: false       |
| state_id          | integer    | null: false       |
| delivery_price_id | integer    | null: false       |
| prefectures_id    | integer    | null: false       |
| delivery_time_id  | integer    | null: false       |
| price             | integer    | null: false       |
| user              | references | foreign_key: true |

### Association

- belongs_to :user
- has_one :purchase
```

```20210118070956_create_items.rb
class CreateItems < ActiveRecord::Migration[6.0]
  def change
    create_table :items do |t|
      t.string :name,                   null: false
      t.text :explanation,              null: false
      t.integer :category_id,           null: false
      t.integer :state_id,              null: false
      t.integer :delivery_price_id,     null: false
      t.integer :prefectures_id,        null: false
      t.integer :delivery_time_id,      null: false
      t.integer :price,                 null: false
      t.references :user,               foreign_key: true
      t.timestamps                      null: false
    end
  end
end
```
#rails db:rollback　rails db:migrateの実行  
記述が終わったら以下２点の実行
```Terminal
% rails db:rollback 
% rails db:migrate         
```
最後に
テーブルの確認
![60cd92386af9d46922673f58e4fc6d2d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026364/71a2e35a-fd45-a16a-5241-8335fe6484df.png)

これでテーブルの追加が完了です！
初回renderを無視するuseEffect

# はじめに
useEffectは特定の変数が更新された時だけ、中身を実行してくれる良いやつです。
ただ、初回のレンダー時はどんなことがあっても処理が走ってしまいます。
これを回避するのはなかなか面倒で、useRefを使ったりといろいろあるんですが、めっちゃ便利なライブラリ見つけたので紹介します。
# react-use
react-useは様々な便利系hooksが実装されていて、スター数も多くおすすめです。
https://github.com/streamich/react-use
この中で実装されているuseUpdateEffectが今回の目的のhooksです！
# 使い方
使い方は猛烈に簡単!
useEffectと全く同じです。hooks名をuseUpdateEffectに変えればおしまい。
これだけで、初回のレンダー時に中身は実行されません。

```useUpdateEffect.ts
useUpdateEffect(() => {
  console.log(hoge) //初回は実行されない
}, [hoge]);
```
めっちゃ便利なのでぜひ使ってみてください〜。
macOS BigSur に yarn をインストールしてみた

# はじめに

yarnのインストールメモです

## 環境

* macOS Big Sur バージョン 11.1 (20C69)
* Homebrew インストール済

## yarn のインストール

brew でインストールしてみると失敗

```
% brew install yarn 
Updating Homebrew...
```

エラー内容は下のとおり

```
Error: Your CLT does not support macOS 11.
It is either outdated or was modified.
Please update your CLT or delete it if no updates are available.
Update them from Software Update in System Preferences or run:
  softwareupdate --all --install --force

If that doesn't show you an update run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/more/.
``` 

表示に従って、 softwareupdate --all --install --force と実行しても何もアップデートされなかった。なので次の対応を実行

```
% sudo rm -rf /Library/Developer/CommandLineTools
% sudo xcode-select --install
```

ポップアップウィンドウに従ってインストールしたあと再度インストール。

```
% brew install yarn 
[snip]
% ｙarn -v
1.22.10
```

以上で完了

## yarnの実行

依存対象をインストールしてからdev環境を動かす場合：

```
yarn install
yarn dev
```

# あとがき

エラーが出たから記事として書き始めたが、メッセージ通りにすれば問題なく完了と言うあまり価値がない内容となってしまった。。
【SVN】database disk image is malformed 発生時の対応


# 概要
SVNクリーンアップを行った際などに下記エラーが発生した際の対処方法


```
次のパスを処理する際にクリーンアップに失敗しました。
C:\xxxxxx
sqlite[s11]: database disk image is malformed
Additional errors:
sqlite[s11]: database disk image is malformed
```
# 発生要因
・外付けSSDへのチェックアウト中にPCをスリーブモードにした。
・svn update 中に外付けSSDとPCとの物理的な接続が切れた。(USB差し込みが甘かった?)
・svn update 中にPCがブルースクリーンになった。

などなどある模様

# 環境
Windows10
TortoiseSVN 1.13.1

# 対応方法
1.
SQLite公式サイトからWindowsコマンドラインツールをダウンロードする。
https://www.sqlite.org/download.html

Precompiled Binaries for Windows
sqlite-tools-win32-x86-3340000.zip (投稿時点の最新版はこちら)

2.
ダウンロードしたファイルの中の「sqlite3.exe」を、エラーが発生する「.svnファイルがある階層」にコピーする。

3.
その階層でコマンドラインを実行して、下記コマンドを4つ入力する

``` cmd.exe
sqlite3 .svn/wc.db "pragma integrity_check"
sqlite3 .svn/wc.db "reindex nodes"
sqlite3 .svn/wc.db "reindex pristine"
sqlite3 .svn/wc.db "pragma integrity_check"
```
最後のコマンドを入力した後、コマンドラインに「ok」と表示されていればOK。

# 他の対処方法

手元の環境ではどれも効果がありませんでしたが、もし上記方法でも対応できなければ試してみてください。

https://qiita.com/nac731/items/897478db7fa3f17c72f4
https://qiita.com/tsunet111/items/2c21706fd67f5ecb047d
https://ugarailog.blogspot.com/2017/09/tortoisesvn.html
http://taichino.com/engineer-life/database/4123

# この記事を見て直ったら LGTM よろしくです:v:
( LGTM=直った数...?)
数学は共通テストをグラフで。

#実行環境
- Mac OS Catanalina
- バージョン 10.15.6
- 言語 : Python
- Spyder

#きっかけ
グラフとPythonを使って身近なものに触れたかった。

#実際にやってみる
##数学Ⅱ・数学B　大1問〔1〕(1)問題A
>問題
関数 y = sin θ+√3 cos(θ) (0 <= θ <= π/2)の最大値を求めよ。


[matplotlibの基本的なグラフ設定を列挙〜散布図と連続曲線〜
](https://qiita.com/ground0state/items/f415d771fd1062f81830)を参考にして、考えます。ここでは、問題通りに考えるのではなく、微分を利用してグラフにして考えようと思います。

>```math
sin x+√{3}*cos(x)を微分すると......
```
```Python
import sympy
x = sympy.Symbol('x')
print(sympy.diff(sympy.sin(x)+sympy.sqrt(3)*sympy.cos(x)))
```

本当はθなのですが、ここでは、次にグラフにしたいため、xにしています。

**出力結果**

```Python
-sqrt(3)*sin(x) + cos(x)
```
数学らしく書くと、

```math
-√{3} *sin(x)+cos(x)
```
です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916734/b300edb9-c160-43f1-f651-fc07d65c0be9.png)
**プログラム**

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


x = np.linspace(0, 90, 900)
y = -np.sqrt(3)*np.sin(x)+np.cos(x)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-', label='-√3 sin(θ)+cos(θ)')
# plt.plot(x, y, label='first', linestyle='-') # でも同じ

plt.title('Answer') # タイトル
plt.xlabel('x') # x軸のラベル
plt.ylabel('tilt') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
```
上のプログラムを実行すると、こんな感じになるはずです。明らかに極地が多いですね。では、元の問題のグラフを書きましょう（方向転換）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916734/852b2d5a-a5f1-569c-cd34-33e4e9f50672.png)
下のプログラムを実行した結果です。

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


x = np.linspace(0, 90, 900)
y = np.sqrt(3)*np.cos(x)+np.sin(x)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-', label='sin(θ)+√3 cos(θ)')
# plt.plot(x, y, label='first', linestyle='-') # でも同じ

plt.title('Answer') # タイトル
plt.xlabel('x') # x軸のラベル
plt.ylabel('tilt') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
```


答えは見た目で2という感じがします。（実際、答えもそうです。）少し最後が感覚的（曖昧）になってしまいましたが、答えをグラフ・Pythonで得られました。


#拡大版
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916734/134a70cf-1347-aedc-5ad9-53ec0642ac47.png)

こんな感じです。
```
**プログラム**

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


x = np.linspace(0, 10, 100)
y = np.sqrt(3)*np.cos(x)+np.sin(x)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-', label='sin(θ)+√3 cos(θ)')
# plt.plot(x, y, label='first', linestyle='-') # でも同じ

plt.title('Answer') # タイトル
plt.xlabel('x') # x軸のラベル
plt.ylabel('tilt') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
```

#参考文献
- [matplotlibの基本的なグラフ設定を列挙〜散布図と連続曲線〜
](https://qiita.com/ground0state/items/f415d771fd1062f81830)
- [入試問題としての著作物利用の留意点](https://www.jcea.info/nyushi1.html)
- [中日進学ナビ　2021年度大学入学共通テスト　問題・解答速報
](https://edu.chunichi.co.jp/pages/kyotsu2021/?oshirase)
- [Python, SymPyの使い方（因数分解、方程式、微分積分など）](https://note.nkmk.me/python-sympy-factorization-solve-equation/)
- [令和３年度大学入学共通テストの問題冊子の表紙(参考イメージ)](https://www.dnc.ac.jp/kyotsu/shiken_jouhou/sasshi_image.html)
初心者が1から始めるJava開発-Vol.1- eclipseセットアップ編 

今回はJava開発を1から始める初心者向けの投稿をしたいと思います。

Javaの記事はいつか書きます（自学のために）。


---------------------------------
**Javaの初心者向けおすすめ本**

<a href="https://hb.afl.rakuten.co.jp/ichiba/0fe6b456.5ebf4c8d.0fe6b457.c2862225/?pc=https%3A%2F%2Fproduct.rakuten.co.jp%2Fproduct%2F-%2Fee5cedff9e577d428e946d99101a96af%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjEyOHgxMjgiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjEsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/1e8530d6.19a113c9.1e8530d7.fe2e9cd6/?me_id=1213310&item_id=19815844&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F7807%2F9784295007807.jpg%3F_ex%3D128x128&s=128x128&t=pict" border="0" style="margin:2px" alt="" title=""></a>
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4295007803/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4295007803&linkCode=as2&tag=soepy-22&linkId=12b14c188a12d530f71bda0cf5a2d3c7">スッキリわかるJava入門 第3版 (スッキリシリーズ)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=soepy-22&l=am2&o=9&a=4295007803" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

------------------------------------------

#総合開発環境(IDE)の用意

今回はeclipseを使っていきます。

使用PC：Windows10

##インストール
※2021年1月18日時点の情報です。

###ダウンロード
以下のページから最新版をダウンロードしてください。

https://www.eclipse.org/downloads/


![ダウンロード.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/bb5f9398-e455-e566-a999-0336d3fe235e.jpeg)

###インストーラー起動

ダウンロードが終了したら、インストーラーを起動します。

ダウンロードしたexeファイルをダブルクリックして起動します。

![インストーラー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/32203b5a-9739-d96a-6cd1-e66037785046.jpeg)

**Eclipse IDE for Enterprise Java Developers** を選択します。

そのまま**INSTALL**を押してください。

![インストール.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/21de9949-440d-7ad3-ce57-2d5132f35dfd.jpeg)

Agreementの画面が出てきますが、AcceptNowでOKです。

しばらくすると「Unsigned Content」というダイアログが出るので「Accept」をおします。

![Unsigned.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/eaa8e142-e666-8486-2d5b-04848a20d91a.jpeg)

完了したら**Launch**ボタンを押下しましょう。eclipseが起動します。

![launch.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/03a21e6b-a7f9-7a87-b249-d3760ab5c17d.jpeg)

###起動
workspaceディレクトリを指定する画面が出ますが、そのままLaunchします。

![workspace-select.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/9bba534f-27a5-0af9-e1c2-91ab7b67f53e.jpeg)

Welcomeの画面が出ますがタブの✖を押して閉じちゃいましょう。

これでひとまず準備は完了です。

次回以降、Javaで開発を進めていきます。
Swift5 Date Picker の初使用


#はじめに
Date Pickerを今までに使った事がなかったので、使ってみました。

#環境
Xcode12.3
Swift5.3.2
macOS Catalina 10.15.4

#Date Pickerを選ぶ
![スクリーンショット 2021-01-17 15.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/88b28873-5d3e-2ee0-a953-41d0f7724ef7.png)

#ViewControllerに設置する
![スクリーンショット 2021-01-17 21.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/fc8bc6eb-15d5-76c6-fcd0-17d79d9fdf85.png)



#Date Pickerとswiftファイルを接続する

```DatePickerViewController.swift
 @IBOutlet weak var datePicker: UIDatePicker!
```

ここまでで、Date Pickerは動くようになります。

#追記
Date Picker の　Preferred StyleのModeで「Time」「Date」「Date and Time」「Count Down Timer」が選べます。

#値の取り方の例(Count Down Timerの場合)

```DatePickerViewController.swift
 @IBAction func hogeButton(_ sender: UIButton) {
        
        hogeLabel.text = String(datePicker.countDownDuration)
        
    }
```
↓画像のように値をとる事ができます。
![スクリーンショット 2021-01-18 18.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/18330c24-f12f-cd3d-dacb-25253b11b5e2.png)

#全コード

```DatePickerViewContlloer.swift
import UIKit

class DatePickerViewController: UIViewController {
    
    @IBOutlet weak var datePicker: UIDatePicker!
    @IBOutlet weak var hogeLabel: UILabel!
 
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    
    @IBAction func hogeButton(_ sender: UIButton) {
        
        hogeLabel.text = String(datePicker.countDownDuration)
        
    }
}
```

#終わりに
もし、間違っているところがあれば優しく教えていただけると嬉しいです。

[Twitter](https://twitter.com/koara1237)
Vagrant初心者・入門者のためのVagrantとは？インストールから基本的な使い方・便利な使い方のまとめ

###Vagrantとは

Vagrantは、VirtualBoxのような仮想化ソフトが作った仮想マシンを操作、管理できるツールです。

###Vagrantを使うことのメリット

VirtualBoxを使えば、自分が使っているPC(MacやWindows)上にLinuxなどの仮想マシンを作ることができますが、VagrantはVirtualBoxの仮想マシンをコマンド操作できるのが最大のメリットだと思います。

Vagrantは以下のようなコマンド操作が簡単にできます。

１、VirtualBoxなどの仮想マシンのテンプレート（Box）を簡単にダウンロードできる
２、ダウンロードしたBoxから仮想マシンを何個でも起動できる
３、仮想マシンの停止やシャットダウンや破棄もコマンド１発でできる
４、使っている仮想マシンのコピーも簡単にできるので、バックアップを取り、バックアップからいくつも複製できる

上で書いたような事が簡単にコマンド操作できるので、Linuxサーバの学習用やテスト環境として使えます。

例えば自分のパソコン上に、CentOSやUbuntuなどのLinux仮想マシンを起動して、そこにWebサーバやDBサーバを作り、ウェブサイトを試しに作ってみることができるので、サーバやウェブプログラミングの勉強や開発環境用に使えます。

また、仮想マシンを複数台稼働することで仮想的なネットワークも構築できるので、ネットワークの勉強にもなります。

###VirtualBoxのダウンロード＆インストール

まずはVirtualBoxをダウンロードする。VitualBoxは公式からダウンロードできます。
[VirtualBox Downloads](https://www.virtualbox.org/wiki/Downloads)
*2021/1/18時点の最新版は、VirtualBox6.1.16

VirtualBoxのダウンロードからインストールまでを丁寧に説明しているサイト

mac環境
[OracleVM VirtualBoxのインストール手順＜macOS向け＞](https://sukkiri.jp/technologies/virtualizers/virtualbox/virtualbox-mac_install.html)

windows環境
[OracleVM VirtualBoxのインストール手順＜Windows向け＞](https://sukkiri.jp/technologies/virtualizers/virtualbox/virtualbox-win_install.html)

###Vagrantのダウンロード＆インストール

VirtualBoxをインストールできたら、Vagrantをインストールします。
Vagrantも公式からダウンロードできます。
[Download Vagrant](https://www.vagrantup.com/downloads)
*2021/1/18時点の最新版は、Vagrant2.2.14

Vagrantの導入は、インストーラの手順に従えば簡単にインストールできる。
ただWindows環境では、環境によって少し設定が必要な場合がある。

Vagrantのダウンロードからインストールまでを丁寧に説明しているサイト

mac環境
[Vagrant を macOS にインストールする手順](https://weblabo.oscasierra.net/install-vagrant-onto-macosx/)

windows環境
[Vagrantのインストール手順](https://sukkiri.jp/technologies/orchestration_tools/vagrant/vagrant_install.html)

###Vagrantの基本的な使い方

[Vagrantの基本コマンドについて](https://www.kdkwakaba.com/archives/1271)

###Vagrantのその他の便利な機能の使い方

仮想マシンのバックアップとか
[ (Vagrant)仮想マシンのバックアップ(Box)を取得し、そのBoxを複製(コピー)して新規に仮想マシンを作る](https://it-jog.com/khow/vag/vagpackage)
[ (Vagrant)saharaで仮想マシンをサンドボックス化(sandbox)し、作業前に戻せるようにする](https://it-jog.com/khow/vag/vagsaharasandbox)

複数台の仮想マシンを作り、仮想ネットワークを作る
[1つのVagrantfileで複数台の仮想マシンを作り、仮想的なネットワークを構築する](https://it-jog.com/khow/vag/vagmulti)

仮想マシンのディスク容量を節約したり、仮想マシン作成（vagrant up）時間を早くしたり、メモリ設定をしてPCを軽くしたり
[VagrantのLinked Clones(linked_clone)を有効にし、仮想マシンのディスク使用量を減らし、仮想マシンの作成時間を早くする](https://it-jog.com/khow/vag/vaglinkedclone)
[(Vagrant)仮想マシンを起動するとPCの動作が重く(遅く)なるので、仮想マシンのメモリ使用量を設定して軽くする](https://it-jog.com/khow/vag/lightenvagmem)
WSLがネットワークにつながらないときにやること

WSL2を起動してもネットワークに接続できないことがあります。

備忘録として記します。

## WSL2がネットワークに繋がらない時の対処法
Powershellを管理者権限で実行し、以下のコマンドを順に実行します。
・LxssManagerの再起動

```powershell

Restart-Service LxssManager

```

・Host Network Serviceの再起動

``` powershell

Stop-Service -name "hns" 
Start-Service -name "hns"

```

・Hyper-Vアダプタの再起動

```PowerShell

Get-NetAdapter -IncludeHidden | Where-Object `
{$_.InterfaceDescription.StartsWith('Hyper-V Virtual Switch Extension Adapter')} `
| Disable-NetAdapter -Confirm:$False

Get-NetAdapter -IncludeHidden | Where-Object `
{$_.InterfaceDescription.StartsWith('Hyper-V Virtual Switch Extension Adapter')} `
| Enable-NetAdapter -Confirm:$False

```

再起動は不要
WSLで通信ができるようになっているはずです。

## 参考
https://github.com/microsoft/WSL/issues/5805
ActiveRecord_RelationとCouldn't find Item without an IDのエラーについて

# まず、ActiveRecord_Relation:とは

例えばコントローラーで

```ruby

def index
  User.all
end
```
と定義した場合
Use.allで持ってきたもののことを言います。
この時、allはレコードとカラムの情報のみを持ってきます。

# Couldn't find Item without an IDとは

要約するとIDが取得できませんよ。という意味

例えばコントローラーで

```ruby

def index
  User.find(params[:id])
end

```

と定義したとします。

この時paramsの[:id]の部分が取得できません。ということになります。

# 状況

- このようなエラーが出る場合はどんな時か？

それはルーティングにネストをしていて、親になっているものから情報を取得しようとした場合である。

- なぜか？

シークエルプロなどでテーブルを確認すれば一目瞭然。
子要素に親要素の情報は入っていないから。

この時、allはレコードとカラムからとってくるという記述の意味がわかります。

# 解決策

- paramsの後に親要素となるidの指定をしよう

```ruby


親.find(params(:親_id)

```

具体的には

親にusers,子にcommentsなんていうネストをしていた場合

commentsコントローラーに

```ruby


@user = User.find(params(:user_id)

```


#終わりに
このエラーの解決に結構時間がかかりましたが、解決してみれば単純なことでした。
まだまだ理解していないことが多いことがよくわかりました。
未熟故に間違ったことを記述している可能性や抜けていること、誤字脱字などがあるかもしれません。
初めての投稿ということで読みにくいが、それも少しずつ改善していければと思いつつ終了とさせていただきたいです。
LaravelでAuthモデルを呼び出す時って、なんでuse App/Authじゃないの?

## Q. LaravelのAuthってなんでApp/Authじゃないの?
`Laravel`でモデルを呼び出すとき`use App/User;`とか`use App/〇〇`なのに、なんで**`Auth`だけ`use Auth;`で使えるの?**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/09d92e1d-cf4e-e74a-7d65-e56db3c32561.png)

## A. Authに関する色々な機能はLaravelが作ってるからじゃない?
`use Auth;`で使える直接の理由は、`(プロジェクト名)/routes/web.app`で、こう(↓)書かれているから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/bc58f0c3-6aa1-81e2-d91c-a70ea92e15ab.png)

認証機能を有効化した段階、ターミナルで`$ php artisan ui vue --auth`を実行した際に記入される。

『なんでそれができるか』という問いに対する個人的な認識、仮定としては、
**`Laravel`で他のモデルはエンジニアが作るけど、`Auth`は`Laravel`側が作成するから`use Auth;`で使えるようになっている**

…としか言いようがなくない?
PHPのopenssl_encrypt関数で暗号化したものをopensslコマンドで複合化

# PHPのopenssl_encryptとopenssl
phpのopenssl_encrypt()で暗号化した文字列をopensslコマンドで複合化しないといけない案件があったのでメモ

## エンコード条件
ivを指定してエンコードするのが定石だが、今回はivの指定がなかった。

```php
$enc_key = "abcedfg";
$enc_method = "aes-256-cbc";
$text = "some encode text";

openssl_encrypt($text, $enc_method, $enc_key);
```

## opensslで復号
openssl_encrypt()はIVの指定をしていない場合、key文字列と同じものが指定されるもよう

ポイント
- key文字列を16進数にしたものを-Kオプションに指定する
- ivは-Kオプションに指定した文字の先頭数文字が対応するみたい（文字数はmethod依存？）


```php
/**
 * 文字列を16進数に変換
 * @param $x
 * @return string
 */
function strtohex($x)
{
    $s='';
    foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
    return($s);
}


$key = strtohex($enc_key);
$iv = substr($key, 0, 32);  //$keyの先頭32文字で複合化できた

$cmd = sprintf('echo -n "%s" | openssl enc -d -%s -base64 -A -K %s -iv %s',
  $custom_data, $key, $iv, $iv);

exec($cmd, $out);
echo $out;
```
Raspberry piでBluetoothテザリングを使う

## 内容
タイトルの通り，Bluetooth PANができるようにRaspberry piと携帯電話を接続する。
他の方の記事を参考にして実行した際出たエラーに自分が行った解決を書く。

## 環境

- iOS
- Raspberry pi 4 Model B
    - Ubuntu desktop (20.04)

## 作業内容

[この記事](https://qiita.com/c60evaporator/items/114c4fe6fab042da1b25)を参考にして行った。

### Bluetoothが有効であることの確認

特に詰まるところはなかった。

### 必要なパッケージのインストール
```
sudo apt install curl wget python-dbus pulseaudio-module-bluetooth
```

とあるのだが，

```
$ sudo apt update
$ sudo apt install curl wget python-dbus pulseaudio-module-bluetooth
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
パッケージ python-dbus は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。

E: パッケージ 'python-dbus' にはインストール候補がありません
```

上のように，python-dbusがない。

```
$ apt search python-dbus
ソート中... 完了
全文検索... 完了  
python-dbus-dev/groovy 1.2.16-3 all
  main loop integration development files for python3-dbus

python-dbus-doc/groovy 1.2.16-3 all
  Documentation for the D-Bus Python interface

python3-dbusmock/groovy 0.19-1 all
  mock D-Bus objects for tests
```

どうやらpython3-dbusがあるようなので，python-dbusはpython2が終わると共に廃止されてしまったのだろうか。

```
$ apt search python3-dbus
ソート中... 完了
全文検索... 完了  
python-dbus-dev/groovy 1.2.16-3 all
  main loop integration development files for python3-dbus

python-dbus-doc/groovy 1.2.16-3 all
  Documentation for the D-Bus Python interface

python3-dbus/groovy,now 1.2.16-3 arm64 [インストール済み、自動]
  simple interprocess messaging system (Python 3 interface)

---以下略---
```

python3-dbusを調べてみると，インストール済みらしい。（もし違ったら`sudo apt install python3-dbus`すれば良いと思う）
なので，先ほどのものからpython-dbusを抜いて実行。

```
sudo apt install curl wget pulseaudio-module-bluetooth
```
インストールができた。

bt-panをダウンロードし（これは**python2のスクリプト**）実行権限を付与，/usr/bin/ 下に移動する（元の記事通り）。

```
wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan
chmod +x bt-pan
sudo chown root: bt-pan
sudo mv bt-pan /usr/bin/
```

### スマートフォン側の設定

### bluetoothctlを使ってペアリング

[先程と同じ記事を参照](https://qiita.com/c60evaporator/items/114c4fe6fab042da1b25#スマホ側でbluetoothの設定)。

### bt-panでPAN接続
詰まった。

結論から言うと，bt-panの先頭の`#!/usr/bin/env python2`のpython2をpython3に書き換えて，`sudo 2to3-2.7 -w /usr/bin/bt-pan`した。


頭が悪い解決ではあるが，動作させることができた。
もっと良い方法があるはずなので，もし見つけた方がいらっしゃったら教えてくださると嬉しく思う。

あとは元の記事通りに行い，ubuntuのネットワーク設定からインターネット共有に接続すればよい。（これってもしかして元からできたりする？もしそうだったら泣く）

---

有益であろう情報は以上だが，一応下に顛末を書いておく。

```
$ sudo bt-pan client アドレス
/usr/bin/env: ‘python2’: No such file or directory
```

仕方がないのでpython2をインストール。

```
$ sudo apt install python2
$ sudo bt-pan client アドレス
Traceback (most recent call last):
  File "/usr/bin/bt-pan", line 6, in <module>
    import dbus
ImportError: No module named dbus
```

それはそう。

前の手順で確認したpython3-dbusはpython3のためのもので，bt-panが依存しているのはpython-dbusなので当然。

pipをインストールし，pipからpython-dbusが入れられないか確かめた。
しかしエラーを吐いたので，いっそpython3で実行できないものかと思ったらうまく行ってしまった。

bt-panが何もエラーや途中経過を吐かなくて不安だったが， debugオプションを付ければ処理が進行しているのを知ることができる。

---

## 参考にしたもの

スマホからRaspberry PiをBluetooth経由で操作 - Qiita
https://qiita.com/c60evaporator/items/114c4fe6fab042da1b25 （最終閲覧日：2020年1月18日）

2to3 - Python 2 から 3 への自動コード変換 — Python 3.9.1 ドキュメント
https://docs.python.org/ja/3/library/2to3.html （最終閲覧日：2020年1月18日）
Matrix Factorization（MF）をざっくり理解する

# はじめに
レコメンドシステムでよく用いられる次元削減の手法であるMatrix Factorizationに関してざっくりまとめます。MFは派生アルゴリズムが多かったり損失関数の最適化手法もいくつかあるのですが、今回の記事はMFの概念を理解するために書きました。

# 協調フィルタリング
まずは協調フィルタリングのおさらいです。協調フィルタリングは複数のユーザーの評価を元に推薦するアイテムを決定するものです。具体的には以下のようなアイテムを推薦します。

①嗜好の似ているユーザーが評価しているアイテム
②過去に高評価をつけたアイテムと似ているアイテム

簡単な例を考えてみます。
（ユーザーベースの協調フィルタリングの場合）

|     |Movie1|Movie2|Movie3|
|-----|------|------|------|
|User1|1     |?     |5     |
|User2|?     |?     |3     |
|User3|1     |3     |5     |
|User4|3     |3     |4     |

これは4人のユーザーが3つの映画を評価したデータ（？の箇所は空欄、まだ見ていない映画）です。この時User1のMovie2に対する評価が空欄ですが、User1とUser3を見てみると映画の好みが似ていそうなことが分かります。なのでUser1のMovie2に対する評価は"3"であると予測できます。今は目視で確認しましたが、実際はコサイン類似度やピアソンの相関係数を用いて推薦するべきアイテムを決定します。


# なぜ次元削減が必要なのか
ここで本題の次元削減がなぜ必要かということを考えてみます。上で示したような協調フィルタリングではアイテムとユーザーの評価値行列を作成して類似度を計算しますが、実際にサービスとして扱われるデータで作成するとサイズがとても大きくなります。例えば、Amazonではユーザー数が5000万人以上、アイテム数が3億以上あるので計算コストも大きくなります。さらに、それだけユーザーやアイテムを抱えていても各ユーザーが購入、評価するアイテムは限られているので、スパース行列（ほとんど0の行列）になってしまいます。レコメンドでは未評価の場合、ユーザーが興味がなくてスルーしたのか、そもそもアイテムに気付いていないのか区別できないため結果が有効かどうか怪しくなります。

そこで、膨大な全体行列から特徴を取り出して、より小さい行列に近似することで成果を出せるようにします。


# Matrix Factorizaion(MF)とは
Matrix Factorizationはレコメンドシステムでよく用いられる低ランク近似の手法です。この手法は、Netflix Prize（Netflixが主催したレコメンドアルゴリズムのコンペ）で結果を残したSimon Funkがはじめに発表したもので、Funk SVDとも呼ばれています。また、MFに関して書いた<a href="https://sifter.org/~simon/journal/20061211.html">Simon Funkのブログ</a>は今も多くの記事で参照されています。

具体的に見ていきます。

|     |Movie1|Movie2|Movie3|
|-----|------|------|------|
|User1|1     |?     |5     |
|User2|?     |?     |3     |
|User3|1     |3     |5     |
|User4|3     |3     |4     |
（上で使った例）

レコメンドの目的は、今空欄（？）になっている箇所の評価値を予測し、ユーザーにとってより評価値の高そうな（気に入りそうな）アイテムを推薦することです。

下の図のようにユーザーインデックスu、アイテムインデックスiの評価値行列R(u×i)があるとすると、MFではこれをユーザの特徴を持つ列ベクトルP(u×k)とアイテムの特徴を持つ列ベクトルQ(k×i)に分解します。このときkはi,uよりも小さいです。
![スクリーンショット 2021-01-18 14.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795393/533358c0-fabe-bacc-7d3d-1e5ee25579ae.png)

ここで評価の予測値は以下のように表せます。
$$\hat{r_{ui}} = q_{i}^Tp_{u}$$

そして、この予測値が当たるように実際の評価値$r_{ui}$と予測値$\hat{r_{ui}}$の差を小さくしていくという流れになります。オーバーフィッティングを防ぐためにL2正則化項を加えます。

**【近似の精度を測定する損失関数】**
$$min_{P,Q} \sum_{(u,i) \in R}(r_{ui} - q_{i}^Tp_{u})^2 + \lambda(||q_{i}||^2 + ||p_{u}||^2)  　　　(1)$$
この関数を最適化するために以下のような手法が用いられます。

- ALS（交互最小二乗法）
- SGD（確率的勾配降下法）
- WALS（加重交互最小二乗法）

# 特徴
- 精度がいい
- 計算時間が速い
- モデルの柔軟性が高い
- 並列処理が苦手

# 最後に
データ数が多くスパースな評価値行列に対しては、このような流れで次元削減を行ってから評価値を予測すると効果的です。今回は基本的なMFに関して書きましたが、バイアス項を加えたものなど派生アルゴリズムがいくつかあるので参照に記載した記事も見てみてください。


# 参照
Simon Funkのブログ：https://sifter.org/~simon/journal/20061211.html
MF派生アルゴリズムまとめ：https://qiita.com/kondo-k/items/7a67881520da23229ce5
NotesデータベースをMicroSoft Accessで作ってみる（誕生日の検出）

HCL Notesの「自動的に、今日の日付と生年月日を突き合せて年齢の更新を行う」エージェントをAceess VBAでの再現に挑戦……と思ったのですが、Accessの作法に手間取って完成には至りませんでした……。

#Notes側のコード
Note側はデータベースから誕生日が一致する社員情報フォームを抽出して、更新をするエージェントを書くだけです。

````VB
Sub Initialize
	Dim ss As New NotesSession
	Dim db As NotesDatabase
	Set db = ss.Currentdatabase
	
'実行日が誕生日と一致する社員情報をCollection	
	Dim Query As String
	Query = "Form = ""Main"" &"
	Query = Query & "@Text(@Month(Birthday))+@Text(@Day(Birthday))="
	Query = Query & "@Text(@Month(@Today))+@Text(@Day(@Today))"
	
	Dim col As NotesDocumentCollection
	Dim doc As NotesDocument
	
	Set col = db.Search(Query, Nothing, 0)

'文書がなければ終了	
	If col.Count = 0 Then 
		Exit Sub
	End If
	
'一致する文書に再計算を実行	
	Set doc = col.GetFirstDocument
	Do Until ( doc Is Nothing )
		Call AgeUpdate(doc)
		Call doc.Save( False, False )
		Set doc = col.GetNextDocument( doc )
	Loop
End Sub

REM
	Sub AgeUpdate
	Description: "前回作成したコードを使いまわし"
END REM
Sub AgeUpdate(doc As NotesDocument)	
'誕生日と今日の日付を取得
	Dim birthday As New NotesDateTime(doc.BirthDay(0))
	Dim nowday As New NotesDateTime( "Today" )	
	
'今日と誕生日の差分を計算
	Dim y ,m As Integer	
	Dim age As Integer
	y = Year(nowday.LSLocalTime) - Year(birthday.LSLocalTime)
	m = Month(nowday.LSLocalTime) - Month(birthday.LSLocalTime)
	
	If m < 0 Or (m = 0 And Day(nowday.LSLocalTime) < Day(birthday.LSLocalTime)) Then
		age = y - 1
	Else
		age = y
	End If
	
	'年齢に計算結果をセット
	doc.age = CStr( age )
End Sub
````
#Access側のコード
年齢計算のコードは[MicroSoftのドキュメント](https://docs.microsoft.com/ja-jp/office/vba/access/concepts/date-time/calculate-age)にあったので、これを流用しようと思ったのですが…。色々な作法を知らないといけないようで。

#Accessの作法
コードを書きながらなので、箇条書きで。

* Access VBAを読み込ませるときは、[作成] - [マクロ] - [プロシージャの実行]でプロシージャ(VBA)を指定する。指定できるのはFunctionのみでSubは利用できない。なお、Functionは引数なしでも問題ない。
* Notesの Dim db As New NotesDatabase は、Dim db As DAO.Database という記述になる。オブジェクトはDAO(Aceess)/ADO(外部データベース)の2種類がある。
* テーブル操作は [.OpenRecordset メソッド](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao)で行う。
* 「ビューを開く」は CurrentDB.OpenRecordset("テーブル名")
* 「コレクションを集める」は CurrentDB.OpenRecordset("SELECT * FROM テーブル名")
* Notesのデバッグモードと類似した画面は、VBAでは[表示]-[ローカルモード]で表示させることができる。

Notesのデバッグモード
![notes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/76bea606-384e-de98-b600-223915b51e9f.png)
VBAのローカルモード
![VBA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/63bf451a-207d-4092-d9cb-b206a56d7b96.png)