OmniAICreator/Qiita-1.07M huggingface dataset:
使用 Travis CI 发布软件版本

> ![Travis](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/b4960af5-5a43-bd67-5bae-7aea9aef21dd.png)
 

先说说 CI——Continuous integration，持续集成，是一种软件工程流程。持续集成是指在一个项目中，任何人对代码库的任何改动，都会触发 CI 服务器自动对项目进行构建，自动运行测试，自动编译，甚至自动部署到测试环境。

这样做的好处就是，随时发现问题，随时修复。因为修复问题的成本随着时间的推移而增长，越早发现，修复成本越低。

[Travis CI](https://travis-ci.org/)  是在线托管的 CI 服务，用 Travis 来进行持续集成，不需要自己搭服务器，在网页上点几下就好，用起来更方便。

最重要的是，Travis CI 对 Github 友好，这也是很多程序员喜欢 Travis CI 的理由。写完代码，提交，让 Traivs CI 跑自动化测试。

Travis CI 对开源项目免费，如果是私有项目，人家可是要收费的。

## 如何在开源项目中引入 Travis CI

首先注册 Travis CI，让 travis ci 能够访问你的 github 项目。
然后在根目录下添加一个名为 `.travis.yml`的配置文件即可。

[Synapse](https://github.com/rebase-network/synapse-extension/releases) 是一个基于浏览器的插件钱包，是一个典型的 Nodejs 项目，travisCI 配置如下：

```yml
language: node_js #语言
dist: xenial # 操作系统 ubuntu xenial
node_js:
  - 12.16.2 #版本

cache: # 保存缓存，加快测试速度
  - npm
  - yarn

before_install: #运行项目之前的操作
  - npm install -g yarn
  - yarn install

script:  #主要的代码
  - yarn test  #运行测试
  - yarn build #打包，代码在 dist 文件夹
```

这样你每次 push 代码到 github，就会自动触发 Travis CI 运行测试。
运行成功如下：

> ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/83f96b5d-ecf1-acee-2896-41414ba36d07.png)


你还可以配置通知，在测试失败的时候发送信息：

```yml
notifications:
  email:
    recipients:
      - shooter@qq.com
      - hammer@163.com
    on_success: never # default: change
    on_failure: always # default: always
```

## 发布版本

对于开源项目来说，在打上新 tag，集成测试成功后，需要对外发布一个可用的版本，如果每次都是人工操作，很不美好。

>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/2adf7df8-f7ec-5aee-6a1c-57908764b947.png)


这些脏活累活，就可以交给 Travis CI 来做了，配置如下：

```yml
before_deploy: # deploy 之前的工作
  - mv dist synapse-extension  #在之前 yarn build 之后的代码放在了 dist 文件夹
  - zip -q -r synapse-extension.zip synapse-extension  # 打包压缩
  - shasum -a 256 synapse-extension.zip | tee synapse-extension.asc # 校验值并输出结果到 console

deploy:
  provider: releases # 操作 repo 的 releases 页面
  token: $GITHUB_TOKEN # 使用 github token 验证身份，进行操作
  file:
    - synapse-extension.zip # 上传的文件
    - synapse-extension.asc #上传的文件
  skip_cleanup: true # 要上传文件到 release，所以不能自动清除
  on:
    tags: true #  只有打 tag 时才运行
```

## 申请 Github Access Token

这里有个 `$GITHUB_TOKEN`，让 Travis CI 取得发布版本的权限

去 [Personal access tokens](https://github.com/settings/tokens) 申请 token，
>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/eaa966ce-bb1b-d82b-224e-38f56860f026.png)


选择 `public_repo`
>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/2924b84e-56c4-567b-66d8-7f20c20b0eec.png)

得到 token
> ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/3c90dc05-842e-615c-f039-6ec2058426aa.png)


回到 Travis CI 设定頁面，加一个新的 `Environment Variables`。
key 就是 GITHUB_TOKEN，value 就是上一步生成的 token。

>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/e077617b-b7a0-a5d5-c296-45d00597004c.png)


大功告成，奥利给！

---

参考：

http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html

https://lingxiankong.github.io/2018-06-28-travis-ci-integration.html

https://www.slmt.tw/blog/2019/04/26/hexo-auto-deploy/

https://github.com/rebase-network/synapse-extension/blob/master/.travis.yml
Bash 脚本——提示确认

>![](https://upload-images.jianshu.io/upload_images/47789-02e9a7b067e25f55.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

```shell
#!/bin/bash
 
while true
do
 read -r -p "Are You Sure? [Y/n] " input
 
 case $input in
     [yY][eE][sS]|[yY])
 echo "Yes"
 break
 ;;
     [nN][oO]|[nN])
 echo "No"
 break
        ;;
     *)
 echo "Invalid input..."
 ;;
 esac
done

```
---

参考：

https://tecadmin.net/bash-script-prompt-to-confirm-yes-no
为 git 同时添加两个远程仓库

>![](https://upload-images.jianshu.io/upload_images/47789-5ed116b5f073c234.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
转自：http://giaogiaocat.github.io/tool/git-origin/

一直使用GitHub托管代码，但最近觉得下载速度太慢了。所以打算把仓库同步到 https://codeup.aliyun.com/ 上，下载的时候可以提高速度。

## 之前的操作

设定不同的remote，分别推送，感觉很麻烦

```bash
git remote add origin https://github.com/USERNAME/REPO1.git
git remote add gitee https://gitee.com/USERNAME/REPO2.git

git push origin master
git push gitee master
```

## 多地址的 remote repo

一般来说最佳方法是给 origin 设两个地址：

```bash
git remote set-url origin --add https://github.com/USERNAME/REPO1.git
git remote set-url origin --add https://github.com/USERNAME/REPO2.git
```

在 .git/config 里得到

```yaml
...
[remote "origin"]
    url = https://USERNAME@github.com/USERNAME/REPO1.git
    url = https://USERNAME@github.com/USERNAME/REPO2.git
...
[branch "master"]
    remote = origin
...
```

然后 `git push origin master` 就会同时推送到两个 repo，而 `git pull origin master` 会从两个 repo 里取得更新。

当然 URL 和 repo 不一定非要是 GitHub 上的，具有两个 url 的 remote 也不一定要是 origin，比如可以设置成 all。

## 只用于 push 的备份 repo

你想从 repo1 pull，但是 push 的时候要推送到 repo1 和 repo2。

```bash
git remote set-url origin --add https://github.com/USERNAME/REPO1.git
git remote set-url origin --push --add https://example.com/USERNAME/REPO2.git
```

在 .git/config 里得到

```yaml
...
[remote "origin"]
    url = https://USERNAME@github.com/USERNAME/REPO1.git
    pushurl = https://USERNAME@example.com/USERNAME/REPO2.git
...
[branch "master"]
    remote = origin
...
```

然后 `git push origin master` 就会同时提交到两个 repo，而 `git pull origin master` 只会从repo1 里取得更新。

## 码云 https://gitee.com/

如果码云导入的是github项目，会10分钟左右同步一次，你也可以点击同步按钮手动同步。

>![](https://upload-images.jianshu.io/upload_images/47789-2e97a8635c3993ac.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

>![](https://upload-images.jianshu.io/upload_images/47789-cdaae85c8631eda2.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

---

参考：

https://www.cnblogs.com/huipengly/articles/8306855.html

https://blog.gitee.com/2018/06/05/github_to_gitee/

http://code.aliyun.com/

https://codeup.aliyun.com/
GAS（Google Apps Script）活用メモ

シートなどのコンテンツは、簡単にWEBで公開できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365273/d5bfca73-3afe-abff-224d-799f081c918b.png)

こちら様のドキュメントが分かりやすい
https://review-of-my-life.blogspot.com/2018/02/google-apps-scriptweb.html

シートの扱い方の超基礎はこちら様のドキュメント
https://admin-it.xyz/gas/spreadsheet-eventtriger-mail/
apt-get install 的参数

`sudo apt-get install -y xx`
-y：yes，在命令行交互提示中，直接输入 yes

```
sudo add-apt-repository ppa:ubuntu-elisp/ppa
sudo apt-get update
sudo apt-get install emacs-snapshot emacs-snapshot-el
```

-f：解决包依赖的问题
`sudo apt-get -f install xx`

`--no-install-recommends`参数来避免安装非必须的文件，从而减小镜像的体积

`sudo apt-get -y install --no-install-recommends openresty`

---

参考：

https://www.cnblogs.com/pswzone/archive/2012/04/09/2438885.html

https://blog.csdn.net/lanchunhui/article/details/57086547
国内外公共DNS

> ![](https://upload-images.jianshu.io/upload_images/47789-bb196ddc6b72611a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
转自 https://zhuanlan.zhihu.com/p/53958870

## 国内优秀公共 DNS 服务

### 腾讯

https://www.dnspod.cn/Products/Public.DNS
119.29.29.29
182.254.118.118

### 阿里

http://alidns.com/
223.5.5.5
223.6.6.6

### 百度

http://dudns.baidu.com/intro/publicdns
180.76.76.76

### 114DNS

http://www.114dns.com/
114.114.114.114
114.114.115.115

### CNNIC

http://www.sdns.cn/
1.2.4.8
210.2.4.8

## 国外优秀的 DNS 服务器

### Cloudflare DNS

DNS： 1.1.1.1

### 谷歌

主 DNS：8.8.8.8
辅 DNS：8.8.4.4

### Norton ConnectSafe

主 DNS： 199.85.126.10
辅 DNS： 199.85.127.10

诺顿以其出色的防病毒，互联网安全服务和产品而闻名。他们的 DNS 服务器也不会令人失望。

### OpenDNS

主 DNS： 208.67.222.222
辅 DNS： 208.67.220.220

### DNS Watch

主 DNS： 84.200.69.80
辅 DNS： 84.200.70.40

### Comodo 安全 DNS

主 DNS： 8.26.56.26
辅 DNS： 8.20.247.20

### 威瑞信

主 DNS： 64.6.64.6
辅 DNS： 64.6.65.6

Verisign 的服务基于两个主题：作为匿名 DNS 服务器，并提供恶意软件和恶意网站的保护。他们不会向第三方出售他们的信息，也不会向用户提供任何广告。

### OpenNIC

主 DNS： 192.95.54.3
辅 DNS： 192.95.54.1

### GreenTeamDNS

主 DNS： 81.218.119.11
辅 DNS： 209.88.198.133
Aws 扩展硬盘

>![](https://upload-images.jianshu.io/upload_images/47789-f267863ac89ad038.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html


```shell
sudo file -s /dev/nvme?n*

lsblk

sudo growpart /dev/nvme0n1 1

df -h

sudo resize2fs /dev/nvme0n1p1

df -h
```

aws 的镜像提前装好了这2个工具，很方便，而且是扩展卷，不是再加1块硬盘。

阿里云扩展硬盘只能再加1块硬盘，需要格式化，还要挂载，非常麻烦。

---

参考：

https://www.jianshu.com/p/767ba652b6e2
mkcert：本地https快速解决方案

https://github.com/FiloSottile/mkcert
 
mkcert是由Filippo Valsorda 使用Golang开发的生成本地自签证书的开源工具，具有跨平台，使用简单，支持多域名，自动信任CA等一系列方便的特性，可供本地开发时快速创建https环境使用。
Nginx 转发websocket

>![](https://upload-images.jianshu.io/upload_images/47789-d69fccf05074cfbc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

```
### wsproxy.conf
client_max_body_size 10m;
client_body_buffer_size 128k;

#Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Advanced Proxy Config
send_timeout 5m;
proxy_read_timeout 240;
proxy_send_timeout 240;
proxy_connect_timeout 240;

# Basic Proxy Config
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto https;
#proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Frame-Options SAMEORIGIN;
#proxy_redirect  http://  $scheme://;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
proxy_buffers 32 4k;
```

```
server {
  listen 9944;

  location / {
    include  /etc/nginx/sites-enabled/wsproxy.conf;

    proxy_pass         "http://127.0.0.1:9004";

    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection "upgrade";
  }
}
```

---

参考：

https://aiopsclub.com/nginx/nginx_websocket_proxy/
禁用 Microsoft Edge 自动更新

> ![](https://upload-images.jianshu.io/upload_images/47789-e384986816377c5c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Edge 一周三次的更新提示太频繁，很烦人，可以关闭自动更新下载，但提示关闭不了，遂强攻。

在 macOS 中 Edge 使用 Microsoft AutoUpdate app 进行自动更新，只需要取消加载项和移除该 app 的执行权限（或者删除）即可。

```
launchctl unload /Library/LaunchAgents/com.microsoft.update.agent.plist
sudo chmod -R 644 /Library/Application\ Support/Microsoft/MAU2.0/Microsoft\ AutoUpdate.app
```

效果如下：

> ![](https://upload-images.jianshu.io/upload_images/47789-a1fd9a3da0d48029.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

还有更直接的方式 _删除更新程序_，本人不太推荐。

```
sudo rm -rf /Library/Application\ Support/Microsoft/MAU2.0/
```

## 还原

```
launchctl load /Library/LaunchAgents/com.microsoft.update.agent.plist
sudo chmod -R 655 /Library/Application\ Support/Microsoft/MAU2.0/Microsoft\ AutoUpdate.app
```

## 其他

关于在 Windows 上关闭 Edge 通知，请看 https://sysin.org/article/Disable-Edge-Auto-update/ 。

---

参考：

https://sysin.org/article/Disable-Edge-Auto-update/

https://answers.microsoft.com/zh-hans/microsoftedge/forum/msedge_upgrade-msedge_macos/mac%E7%89%88%E6%9C%AC%E7%9A%84edge%E6%9B%B4/045dd963-8a89-4302-82e5-ab63ce98a52a
error:0909006C:PEM routines:get_name:no start line の解決

## 問題

TeraTerm で発生する
`error:0909006C:PEM routines:get_name:no start line`
の解消

## 解決策

秘密鍵の `-----END OPENSSH PRIVATE KEY-----` の後に改行を入れる
改行が入っていないとエラーが出るみたいです。
問題解決の参考になれば幸いです。
M1 Mac で MeCab の configure に失敗する (cannot guess build type; you must specify one)

## 事象

M1 Mac 上の Docker で MeCab 含む DockerFile のビルドを行なってきたところ `configure: error: cannot guess build type; you must specify one` と怒られてしまった。

> configure: error: cannot guess build type; you must specify one


## 解決策

configure さんが `aarch64` なにそれ？おいしいの？っていってるから、 `arm` さんだよ〜。って教えてあげる


```bash
## --build=arm を追加する ("--build=arm" だけではその後の mecab-python3 の python setup.py install でコケた(後述))
# ./configure --enable-utf8-only --with-charset=utf8 --build=arm

# アーキテクチャを指定する
./configure --enable-utf8-only --with-charset=utf8 --build=arm-unknown-linux-gnu --host=arm-unknown-linux-gnu --target=arm-unknown-linux-gnu
```

AppleSilicon や ARM 版 Windows が普及してくると開発メンバで複数のアーキテクチャが混在する状況も増えてくると思う。

少なくともベストプラクティスではないと思っているが、 `aarch64` とそれ以外 ( `amd64` ) に対応した、 Dockerfile の一例を載せておく。

```Dockerfile:Dockerfile
FROM python:3.9.5-alpine3.13

ARG _ARM_ARCH="arm-unknown-linux-gnu"

RUN apk add --update bash git curl swig gfortran openssl perl
RUN apk add gcc g++ build-base linux-headers

RUN git clone --depth 1 https://github.com/taku910/mecab.git \
    && cd ./mecab/mecab \
    && if [ `uname -m` =  "aarch64" ]; then \
        ./configure --enable-utf8-only --with-charset=utf8 --build=${_ARM_ARCH} --host=${_ARM_ARCH} --target=${_ARM_ARCH}; \
    else \
        ./configure --enable-utf8-only --with-charset=utf8; \
    fi \
    && make \
    && make install
...
```

長くなるので、全体は GitHub で公開します。

https://github.com/babarohe/docker-mecab-neologd-python3

## setup.py がコケる原因について

`--build=arm` で MeCab のビルドが通って安心していたが、  `pip install mecab-python3` でビルドエラーが発生した。

```shell:stderr
g++ -pthread -shared build/temp.linux-aarch64-3.9/src/MeCab/MeCab_wrap.o -L/usr/local/lib -lmecab -lstdc++ -o build/lib.linux-aarch64-3.9/MeCab/_MeCab.cpython-39-aarch64-linux-gnu.so
/usr/bin/ld: /usr/local/lib/libmecab.a(char_property.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `_ZSt4cerr@@GLIBCXX_3.4' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libmecab.a(char_property.o)(.text+0x3b0): unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol `_ZSt4cerr@@GLIBCXX_3.4'
/usr/bin/ld: final link failed: Bad value
```

mecab-python3 側のコードを確認したが、原因となりそうな箇所は見当たらなかったので、 mecab 本体のビルドオプションにアタリをつけて調査。

結果、動かせたわけだが、正直、何が作用して動いたのかはわからない(爆) :bomb::collision:

恐らく、 "arm" と指定するだけでは古い ARM 用のファイルが吐かれて、それをリンクしようとしてエラーになったものと推測される。

詳しく書くと、動的リンクを行う際には、メモリアドレスのオフセットを行う。 (「ぼた餅は上から５番目の棚にあるよ」と指定するところを、「ぼた餅は上から3番目の棚の2つ下の棚にあるよ」と相対的に指定するイメージ。棚ぼたを期待して間違った棚を手をかけると後ろに死神が立っていることになるのだが、この話は別の記事でします。) 
これを実現する仕組みを [GOT (Global Offset Table) ](https://en.wikipedia.org/wiki/Global_Offset_Table) と呼ぶ。

x86/x64 では GOT のサイズ制限が無制限らしい(らしい)が、 単に "arm" と指定された場合、 GOT の制限に引っかかるタイプの [ELF](https://ja.wikipedia.org/wiki/Executable_and_Linkable_Format) が吐き出されるんだと思う(適当)

> recompile with -fPIC

エラー内で `-fPIC` を指定しろと言っているように `--build` `--host` `--target` のいずれかに `arm-unknown-linux-gnu` が指定されたことで、 新しめの ARM に対応した ELF が吐かれたか `-fPIC` オプションが適用されたかのいずれかの理由でうまく動いたんだと思う。


## さいごに

`arm64` と `amd64` 見分けづらいよね。
Unity 入力されたキー名を取得する方法

##0.0 はじめに
方向キーなどキーボード上のキーによってゲームを進行させたいときがあります。
その際に有効となる、入力されたキーの情報を取得する方法を紹介します。






##1.0 Inputクラスをからキー情報を取得する方法
Input.inputStringにて現在のフレームで入力されたキーの名前を取得できます。
アルファベットや数字を取得するにはこれが一番簡単な方法ですが、スペースキーや特殊なキーの情報は取得できません。

```C#:KeyTest.cs
    // 何かキーが押された場合
    if (Input.anyKeyDown) {
        string keyStr = Input.inputString; // 入力されたキーの名前を取得
        Debug.Log(keyStr + " のボタンが押されたよ！！"); // コンソールに表示
    }
```
        








##2.0 KeyCodeからキー情報を取得する方法
KeyCodeに登録されているキーから検索して情報を確認する方法です。
Ctrlキーなどでは左側、右側の区別もあります。より細かく取得したい場合に使用できます。
foreachで入力されたキーのコードとすべてのキーコードを比較して一致したものをcodeに取り出しています。

```C#:KeyTest.cs
    // 何かキーが押された場合
    if (Input.anyKeyDown) {
        foreach(KeyCode code in Enum.GetValues(typeof(KeyCode))) { // 検索
            if (Input.GetKeyDown(code)) { // 入力されたキーの名前と一致した場合
                Debug.Log(code.ToString() + " のボタンが押されたよ！！"); // コンソールに表示
            }
        }
    }
```
obnizで取得したデータを活用するための超基礎メモ（IFTTTとか）

obniz公式のサンプル
obnizで取得したデータをGoogleのスプレッドシートに記録する。
その際IFTTTをつかうことで超お気楽にデータ保存できるところが良い。DBでなくシートなところが良い。

https://blog.obniz.com/make/obniz-sht31-spredsheet


obnizの定期実行まで含めたサンプル
obnizでセンシングしてそれをどうこうするという際に使えるサンプル。これは超絶便利

https://qiita.com/y-hira/items/de7e8d5c2e8e4c1c4acd

obnizサーバレスイベントの設定イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365273/cc4f2606-9228-425d-6efa-9f551e70adef.png)
40代でAWS実務経験なしからSAPを取得

##はじめに

AWSの実務経験なし、40台のおじさんエンジニアが2か月勉強し、[AWS認定ソリューションアーキテクト プロフェッショナル（SAP-C01）](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)を取得することができました。

他のおじさま達の参考になればと思い、記事を投稿します。
（もちろん、おじさま以外も参考にしてください）

##経験
- オンプレのインフラ経験は10年以上
- 資格は色々と取得（PMP、情報処理（ネスペ、プロマネ等）、MCSE、SCNA、LPIC Lv2、TOEIC 900点、など）
- AWS認定ソリューションアーキテクト アソシエイト（SAA-C02）は取得済み
- AWSは提案のみで実務経験なし。自分でアカウントを作成して、ハンズオンで色々と勉強している程度

##勉強方法
2020年12月にSAA-C02に合格した後、続けてSAP-C01の勉強に入りました。

####勉強時間：160時間
平日1～2時間、週末7～10時間は勉強しました。以下を中心に勉強しました。あとは日本語、英語問わず、合格した人の勉強方法も参考にさせていただきました。

1. 関連する[Blackbelt Online](https://www.youtube.com/playlist?list=PLzWGOASvSx6FIwIC2X1nObr1KcMCBBlqY)を視聴して理解を深める
2. AWSの個人アカウントを開設し、ハンズオンを色々と実施する
3. この時点で唯一の日本語対策本である[AWS認定ソリューションアーキテクト
－プロフェッショナル～試験特性から導き出した演習問題と詳細解説～](http://www.ric.co.jp/book/contents/book_1248.html)を購入。通勤電車で読み進める。
4. Tutorial DOJOの[AWS Certified Solutions Architect Professional Practice Exams 2021](https://portal.tutorialsdojo.com/courses/aws-certified-solutions-architect-professional-practice-exams/)の問題を繰り返す。英語なのでChromeの日本語翻訳を活用する。Udemyにも同じ問題集が存在するが、Udemyとは異なりTutorial DOJOにはレビューモードという１問ずつ問題を進めるモードがあるため、短い時間で勉強する場合はおすすめ。
5. 間違った点を中心にAWSホワイトペーパとAWS blog等で詳細を確認し、実機で設定を行う。個人メモを作成しつつ、理解ができるまで時間をかける。
6. （１回目の不合格後）Udemyで評判が良い[Ultimate AWS Certified Solutions Architect Professional 2021](https://www.udemy.com/course/aws-solutions-architect-professional/)を購入。実機で確認しつつ、合計２回実施した。かなり良い教材だと思うが、英語の講義で字幕も英語、しかも自動字幕なので色々と間違っているため、英語が聞き取れないと効果は薄いと思われる。
7. １回目の受験で弱いことが判明した点（CloudFormationやOpsWorks、Code3兄弟）を中心に、上記１～２を実施。

##結果
####１回目（不合格）
2021年1月初旬に受験して、730点で不合格でした。
やや開発者よりなCloudFormationやOpsWorks、Code3兄弟のあたりが弱いことが分かりました。

####２回目（合格）
その後、3週間勉強し、2021年1月下旬に945点で合格しました。あまり自信がなかった割には高得点だったので、勘が冴えていたのかも。

##試験の感想
受験しての感想ですが、時間が全く足りません。TOEICのように、1問に時間をかけすぎると時間切れになるので、模擬試験は時間を意識して実施した方がいいと思います。

##メモ
以下、受験のメモです。参考になれば。

- 転送速度の目安：1Gbpsで10TB転送に1日
- 10PB以上はSnowmobile、10PB未満はSnowball
- Snowファミリーを使ってAWSにデータを取り込むには、1週間かかる
- Lambda同時実行数：リージョンあたり1,000。AWSサポートセンタに申請すれば数十万まで上げられる
- Lambda最大ENI数：VPCあたり250。同様の申請で数百まで上限を上げられる
- Lambdaタイムアウト：最大15分
- SQSは冪等性（Idempotency）をアプリ側で担保する必要あり。最大数は制限なし。
- FIFO キューはバッチ処理では 1 秒あたり最大 3,000 件、バッチ処理なしでは最大 300 件のメッセージ （送信、受信または削除) を処理可能
- gp2の2TBボリュームは6,000IOPSがあり、1TBを追加すると、+3000IOPS分増加する
- HTTPステータスコードメモ
    - 1xx：Information 情報
    - 2xx：Success 成功
    - 3xx：Redirection リダイレクション
    - 4xx：Webブラウザからのリクエストに誤りがあって、レスポンスを返せなかった
        - （400 (Bad Request)、401 (Unauthorized)、403(Forbidden)、404(Not Found)）
    - 　5xx：サーバーがブラウザからのリクエストの処理に失敗した状態
        - （500(Internal Server Error)、503(Service Unavailable)）
- DRシナリオのオプション

|手法|RPO|RTO|
|----|----|----|
|バックアップと復元|数時間以内|24 時間以内|
|パイロットライト|数分以内|数時間以内|
|ウォームスタンバイ|数秒以内|数分以内|
|マルチサイト|無 or 数秒|数秒以内|

##今後の受験
その後、2021年2月に専門知識-セキュリティを取得し、2021年5月にDevOpsエンジニアプロフェッショナルを取得しました。
現在のIT業界の方向性、顧客ニーズがデータ分析、AI/MLに向かっているのを感じているため、専門試験-データアナリティクスと、機械学習を受験しようと思っています。

AWSにしろ、Azureにしろ、自宅から実機が触れるのがいいですね。昔は会社に出社するか、自分でサーバを購入するしかスキルアップの手段がなかったのですが、良い時代になったものです。

それでわ。
備忘録　javascript URLでの条件分岐



location.pathname …… 現在ページURLのパス名を参照する

matchメソッドの使い方
-

matchとは、文字列を扱うStringオブジェクトで標準に用意されているメソッド。
matchは、一般的に文字列に含まれている特定の文字を検索したいときに活用します。基本的な使い方は以下の通りです。

```js
const str = 文字列
 
str.match( 検索条件 )
```
```rb
if (location.pathname.match("tweets/new)
```
[Laravel] カラムの追加・リネーム/型の変更のやり方をまとめてみた 

# はじめに
またLaravelです。新人研修にて開発途中からタイトルにある操作が必要になったのでまとめました。

# 検証環境
- macOS Catalina ver 10.15.7
- Docker ver 20.10.5
- docker-compose ver 1.29.0
- Laravel ver 7.30.4
- MySQL ver 8.20.3

# 内容
##マイグレーションの作成
- 基本的な作成の仕方
  - [ドキュメント(Laravel 7.x)](https://readouble.com/laravel/7.x/ja/migrations.html)を参照してください。
- モデルと同時に作成したい
  - php artisan make:model Test --migration
  - Testモデルの作成と"create_tests_table"マイグレーションファイルの生成が行われる。

## カラムの追加
- カラムを追加する時に忘れてはならないのが、「どのカラムの後に対象のカラムを追加するか」(これを考慮しないと見づらくて、気持ちが悪いと思います。)
  - $table->カラムタイプ(カラム名)->after(カラム名);
  - 意図した並び順になっているか、SQLでテーブル構造を確認する
        - desc テーブル名;

## カラム名の変更(リネーム)
- 「composer require doctrine/dbal」が必要
  - [ドキュメント(Laravel 7.x)](https://readouble.com/laravel/7.x/ja/migrations.html)を参照してください。

## 型の変更
- リネームと同様に「composer require doctrine/dbal」が必要
  - [ドキュメント(Laravel 7.x)](https://readouble.com/laravel/7.x/ja/migrations.html)を参照してください。

# さいごに
わからないことに遭遇した時、よくドキュメント以外の記事を読んでしまっているので、ドキュメントを最初に読むことをこれから心がけたいと思います。

# 参考サイト
- 「Laravel 7.x リリースノート」
  - https://readouble.com/laravel/7.x/ja/releases.html
- 「Laravel：カラムを追加する」
  - https://qiita.com/usaginooheso/items/6f307a15b5f7d5dd981f
- 「Laravel マイグレーションでカラム追加後の列順序が気持ち悪い」
  - https://qiita.com/miyamotok0105/items/8b7e1d3e9e7f3e70f19b
備忘録　正規表現


```rb:コントローラー使い方
モデル名.where("カラム名 LIKE?", "検索したい文字列")
```

```rb
# 例　nameカラムに「あ」という文字が入っているレコードを全て取得
User.where("name LIKE?", "%あ%")
```


ワイルドカード文字
-
|%|0文字以上の任意の文字列|
|-|-|
|_|任意の1文字|
Raspberry Pi OS 2021-05-07 Release-note 翻訳

(追記: 2021/11/8にRaspbian OS 2021-10-30がリリースされています)
https://qiita.com/utaani/items/0a09b5c8a2f52c2ead63

https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt

2021-10-30：

 - Debian バージョン11 (bullseye) ベースに
 - デスクトップコンポーネンツ (lxpanel とすべてのプラグイン, libfm, pcmanfm) がGTK+3向けにビルド
 - アプリケーション (piwiz, pipanel, rc_gui, lxinput) がGTK+3向けにビルド
 - PiXflat GTK+3 のテーマが更新され、そのサポートのためにたくさんの変更が追加
 - GTK+3 : ツールバーのアイコンサイズ設定が追加
 - GTK+3 : ウインドウ上にクライアントサイドのデコレーションをリクエストする機能が追加
 - GTK+3 : カスタムスタイルのフレームラベルにインデントの設定が追加
 - 2GB以上のRAMを搭載したデバイス上ではopenboxの代わりにmutterウインドウマネージャーが使われるように
 - mutter : タイトルバーアイコンの動作と外観がopenboxにマッチするように修正
 - mutter : 追加のキーボードショートカットが追加
 - mutter : さまざまなパフォーマンス強化
 - スクリーン拡大鏡にmutter互換機能が追加
 - Appearance SettingアプリにGTK+3とmutterをサポートするためのたくさんの修正が追加
 - ソフトウェアアップデートを検知してインストールするためにUpdaterプラグインがlxpanelに追加
 - ファイルマネージャーの表示オプションがリストかアイコンに単純化され、サムネイル表示用のメニューオプションが追加
 - ファイルマネージャーのツールバーアイコンが新しく
 - KMSがデフォルトのディスプレイドライバーに
 - 上記をサポートするためのHDMIオーディオ出力の更新
 - openboxがKMS下で動作しているときはxcompmgrが有効となる
 - libcameraをベースとした新しいデフォルトカメラサブシステム
 - 新しいカメラでもアプリケーション (libcamera-still and libcamera-vid) がraspistillとraspividと入れ替え
 - 古いカメラサブシステムが64-bit RPi OSから削除 (32-bit版ではまだ有効)
 - Chromiumがバージョン92.0.4515.98に更新
 - VLC media player がバージョン3.0.16に更新
 - SD card copierが動作した後のまぎらわしい取り外し警告を削除
 - BookshelfアプリケーションがCustom PC magazineに含まれるように
 - さまざまな翻訳の更新 - イタリア語, 韓国語, ポーランド語, ドイツ語, アルメニア語
 - スタートアップウィザードが必要に応じて日本語フォントをインストールするようになった
 - lxpanel プラグインの進行状況と情報ダイアログが個々のプラグインでなく共通のプラグインになった
 - lxpanelプラグイン向けのアイコンハンドリング処理コードがlxpanal共通のものになった
 - 4KバージョンのRaspberry Piの壁紙パッケージをRecomended Softwareに追加
 - Python GamesとMinecraftがRecommended Softwareから除外に - どちらもbullseyeと互換性がない
 - Bluetooth ペアリングと接続ダイアログがたくさんのデバイスとの互換性を持つように更新
 - Bluetooth デバイスが取り外し手順の高速化のために、取り外したら常に切断されるように
 - Bluetooth ペアリングダイアログがPiで使えるサービスを提供するデバイスのみが表示されるように
 - 個別のBluetooth ペアリング解除ダイアログが削除 - 個々のデバイスごとにオプション設定に
 - バグ修正 - mutter : テーマ変更時にヘッダーバーの色が更新されない
 - バグ修正 - GTK+3 : ツールチップが画面の下部に正しく表示されない
 - バグ修正 - lxpanel : スクリーン拡大鏡がインストールされてないときにキーボードショートカットで拡大鏡を有効にしたときにクラッシュ
 - バグ修正 - lxpanel : 特定のデバイスに接続する際にBluetoothプラグインがロックアップする
 - バグ修正 - lxpanel : 検出可能モードアイコンがBluetoothシステムの状態と同期しなくなる
 - バグ修正 - piwiz : タイムゾーンのリストに失われた都市があった
 - バグ修正 - piwiz : 国特有の言語パッケージがインストールされていない
 - バグ修正 - bookshelf : パケットがタイムアウトする前により長く待つように
 - バグ修正 - 国際化ダイアログでアクセント付きの文字が正しく表示されるように
 - Raspberry Pi ファームウェア e2bab29767e51c683a312df20014e3277275b8a6
 - Linux kernel 5.10.63
非同期通信　XMLHttpRequest

このようにXMLHttpRequestの基本的な使い方は，次の4ステップからなります。

new XMLHttpRequestでオブジェクトを作る
openメソッドで送信時のメソッド，送信先URL，非同期通信か同期通信か真偽値で設定
onreadystatechangeで読み込み時の動作を指定
sendメソッドでリクエストを送信，引数はGETの場合nullを，POSTの場合はデータを&で繋げた文字列にして渡す。
openメソッドの第3引数で同期通信にすることも可能ですが，同期通信はsendしてからサーバーのレスポンスがあるまでJavaScriptの処理をすべて止めてしまうため，ユーザーを待たせてしまいます。省略時は非同期通信になるので，省略してもかまいません。
discord.pyでステータス(視聴中)をする方法

こんにちは
前回discord.pyでステータス(プレイ中)をする方法を投稿しました
[discord.pyでステータス(プレイ中)の記事はこちらから](https://qiita.com/gx1285JP/items/841555966522b3e7a1a3)
# 動作環境
Python 3.8以上
discord.py 1.5以上
# コード
```watching.py
import discord

client = discord.Client(intents=discord.Intents.all())

# or, for watching:# neme='内容',
activity = discord.Activity(name='TEST', type=discord.ActivityType.watching)
client = discord.Client(activity=activity)
# Discordに接続
client.run("TOKEN")
```
それでBotを起動してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462118/a1a39fe3-c9e8-1d19-4b85-d773c1f0d0d6.png)
こうなると成功です!
良いBot作成ライフを
「パスワードが推測されて不正アクセスされた場合の責任について」の回答

Teratailの以下の質問に回答しました。

> Webサービスに安易なパスワードを設定している場合、パスワードクラックなどでパスワードが割り出され不正アクセスされる可能性があります。
この場合、簡易なパスワードを設定しているユーザにも責任があると思うのですが、Webサービス側にも責任は問われるのでしょうか？
[セキュリティー - パスワードが推測されて不正アクセスされた場合の責任について｜teratail](https://teratail.com/questions/341037) より引用

以下、徳丸の回答です。備忘のため、こちらに転載します。

---
結論から言うと、サービスの性質により変わります。

一般的にパスワード認証は、認証の責任を利用者とサービスがわけあっていると考えられます。
パスワード認証というのは、「利用者しか知らない文字列」を使うことで認証しているわけですから、利用者には「他の人が知らないはずの文字列」をパスワードとして設定する責務があります。
一方、「別のパスワードでもログインできてしまった」とか、「安全なパスワードをつけたいのに4文字数字のパスワードしかつけられない」場合はサービス側の責任になります。そのような例は過去にありました。

- [JALの不正ログイン事件について徳丸さんに聞いてみた](https://blog.tokumaru.org/2014/02/jal.html)
- [ANAの不正ログイン事件について徳丸さんに聞いてみた](https://blog.tokumaru.org/2014/03/ana.html)

当時、JALは数字6桁、ANAは数字4桁の「パスワード」の設定になっていたため、それでは不正ログインされるだろうとサービス側が批判されました。

一方、よく芸能人が安易なパスワードをつけていてプライベートな記事や画像を閲覧されてしまったという事件が報道されますが、サービス側（Instagram等）に責任を問う声はあまり聞かれません。

- [益若つばささんらの私的画像のぞき見容疑　「楽しくて」：朝日新聞デジタル](https://digital.asahi.com/articles/ASKC14CJ8KC1TIPE018.html)

以下はパスワードを盗み見された事件ですが、これはどんなに複雑なパスワードをつけていても駄目ですね。

- [副署長のパスワードで人事盗み見　消防士６人処分：朝日新聞デジタル](https://digital.asahi.com/articles/ASKCS54R8KCSTPJB00V.html)

これは盗み見したやつが悪いことは間違いないですが、「盗み見されるような管理をする利用者にも問題がある」と思う人が多いと思います。

ここまでは、「伝統的なパスワード認証の考え方」です。

しかし、さまざまなサービス、とくにお金が絡むサービスを多くの人が使うようになってきて、「安易なパスワードをつける方が悪い」とは言いにくくなってきました。この線で私が注目するのは、SBI証券の事件です。

- [SBI証券の6口座に不正ログイン　9864万円被害：朝日新聞デジタル](https://digital.asahi.com/articles/ASN9J6T8YN9JULFA041.html)

> 　ネット証券最大手のSBI証券は16日、顧客6人の証券口座から9864万円が不正に流出したと発表した。第三者が口座に不正にログインし、ゆうちょ銀行と三菱UFJ銀行に開設されていた本人名義の偽の口座に送金していたという。SBI証券は警察に被害を届け出ており、**顧客の損害は全額補償する方針**。
> 　発表によると、何者かがパスワードを含む顧客情報を何らかの方法で入手。7～9月上旬に証券口座に不正アクセスし、口座内の有価証券を売却して、銀行口座へ送金していた。送金先は、ゆうちょ銀の5口座と三菱UFJ銀の1口座で、いずれも証券口座の顧客と同一名義だが、第三者が不正に開いたものだった。お金はすでに引き出されていた。口座開設時は、偽造した保険証などの本人確認書類が使われていたという。
> 　顧客から7日、「身に覚えのない取引があった」と通報があり、発覚。証券口座の不正アクセスについて、SBI証券は社内システムに侵入された形跡はないとし、「リスト型アカウントハッキング」と呼ばれる手口だったとみている。
>　この手口は、**別のサイトなどから過去に流出したIDやパスワードで様々なサイトへのログインを試みるもの。同じIDやパスワードを使っている人が被害に遭いやすい**。SBI証券のIDは、利用者が自由に設定できたため、狙われた可能性がある。

他のサイトから流出したパスワードが使われていて、すなわち利用者は「パスワードの使い回し」をしていたと推測されています。伝統的なパスワード認証の考え方だとSBI証券に非はないのですが、それでも1億円近い被害を補償するとのことで、私は驚きました。

一方で、現在でも、芸能人等がパスワードを推測され不正ログインされても、「安易なパスワードをつけるのが悪い」となります。

すなわち、サービスの扱う情報や資産に応じて、「安易なパスワードに対する責任」の分担度合いが変わることになります。現在、まさに、その変化が起こっている最中であると私は思います。
実務未経験が３週間でJavaSilverの資格を取った話

#JavaSilverとは？
オラクル公認の`Java技術レベル認定資格`です。
中級者向けであるJavaSilverの他に、入門者向けの資格であるJavaBronzeと、上級者向けのJavaGoldがあります。
Javaアプリケーションの開発に必要な`基本的な知識は一通り網羅`できます。

#試験の概要
試験名　　 ：1Z0-808-JPN Java SE 8 Programmer I (JPNを受講する様に気をつけましょう)
試験時間　 ：150分
問題数　　 ：77問
合格ライン ：65%
試験方式　 ：CBTによる選択式
試験料　　 ：26600円（税抜き)
試験会場　 ：ピアソンVUE社のテストセンター・オンライン受講

問われるのはJavaの基本的な技術であるためJavaプログラミングに触れたことのある人なら、早い人で`2、３週間`、遅くとも`2ヶ月`の勉強で合格ラインに到達することができます。
プログラミング入門者が独学で勉強して合格を目指す場合、`半年`ほどの勉強で合格ラインに達することができるでしょう。
受験には¥26,600が必要です。税込で$30,000前後かかりますので安くはないですね。
オラクルの公式ページから受験チケットの購入手続きを行う or 試験予約と同時にクレジットカードで支払うことが可能です。
個人的には受験チケットの購入は手間になるので、試験予約時に一緒に購入で良いと思います！
申し込み方法はやや複雑なので、分かりやすく解説されている他の記事を参照ください！


#試験内容
具体的な試験内容についてですが、実際に私が試験を受けたときの記憶になります。

全77問中の内訳としては

`15問`　黒本と全く同じ問題
`52問`　黒本の数値を変えた問題
`10問`　仕組みをしっかり理解してないと難しい問題

大体こんな問題配分だったと思います。

# 勉強開始時のスキル
前提として、当時の私のスペックの紹介をします。
・会社で2ヶ月のJava研修を受けた
・基礎を理解しているくらい(オブジェクト指向などはあまり理解できてない状態)
・プログラミング実務経験無し

注意として、この記事は私と同じくらいのスキル感の方に向けた勉強法になります！

#勉強方法

では本題の勉強法になります。

参考書としては以下を使用します。
`徹底攻略 Java SE 8 Silver 問題集`
通称「黒本」と呼ばれるjavasilver合格のための参考書です。

ある程度基礎知識がある場合は`この一冊以外必要ありません`。
解説でも分からないことや、忘れてしまっていることはググって復習したのでOKです。
この黒本を網羅することができれば合格ラインの65%を超えることは可能です。

`黒本のロードマップ`
まずは黒本の１章〜９章までを1周してみる。
１周目は全体感を掴むくらいの気持ちで大丈夫です！全然解けなくても悲観的にならずに、最終的に解けるようになれば問題ないのです！
ちなみに僕は１周目は分からなすぎて基礎力の無さを痛感しました笑
2周目は解説をじっくり読みながら解き進めてましょう！
3周目になってくると解ける問題にはチェックマークを付けて、解けない問題に注力しましょう！
１章〜９章を３周を終えた時点で10章、11章の模擬問題を解いていきます。
これまでよりやや難しくなっており自分は全然解けなくてヘコみました。。。
この辺も周回を重ねれば確実に理解できるようになってくるので全然気にしなくて大丈夫です！
10章、11章も３周くらいします。
その後は試験まで１章〜１１章までのチェックマークが付いていない問題をひたすら解きます！

`黒本の進め方`
１章〜９章１周目
⬇️
１章〜９章２周目
⬇️
１章〜９章３周目
⬇️
１０章〜１１章１周目
⬇️
１０章〜１１章２周目
⬇️
１０章〜１１章３周目
⬇️
１章〜１１章

このロードマップを３週間で実行すれば合格ラインに届きます！

#勉強時間
毎日通勤時間の行き帰り1時間で黒本を周回してました。私の場合はほとんど通勤時間で完結させました。
`合計で30時間程度`だと思います！
自分は覚えも悪いですし、理解に時間がかかってしまうタイプなので
ある程度の基礎力があり、`センスの良い人だと２０時間`あれば十分ではないかと思っています。
`完全初学者だと、５０時間以上`はかかると思います！
ユーザー作成時にアバター画像を登録させる

## 結論

```ruby:app/models/user.rb
class User < ApplicationRecord
   before_save { self.email = email.downcase }
+  before_create do
+    avatar.attach(io: File.open("#{Settings.default_image[:avatar_path]}"), filename: "#{Settings.default_image[:avatar]}")
+  end
   has_one_attached :avatar
   :
```

```yml:config/settings.yml
	:
default_image:
 avatar: "avatar.png"
 avatar_path: "app/assets/images/avatar.png"
```

## 解説

ユーザー作成時に自動的にアバター画像を登録させるプログラムを作成しました。
方法としては、モデルのコールバックメソッドを用いて(今回は `before_create` )、ユーザーオブジェクトが保存される前に、画像を添付しています。

2つ目の`config/settings.yml`ファイルに関しては、定数管理を扱うファイルであり、ファイル名のハードコーディングを防止する目的で利用しています。

以上です！記事に目を通して頂きありがとうございました！！
mysqlにてテーブルを削除できない ERROR 1451 (23000)

##はじめに
mysqlにてテーブル削除をしようとした際に、「ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails ~」エラーが発生したので、その解決法を記しておきます。

結論としては、外部キー制約を一時的に無効にすることで削除できるようになりました。

mysqlのバージョン5.7.34

##対処法
エラーに遭遇して、解決までの流れを記載していきます。

まずはmysqlにアクセス。

```
$ mysql -u root -p
```

次に接続するデータベースを参照して、切り替え。

```
mysql> show databases;
mysql> use データベース名;
```

そしてテーブルを参照して、中身を見る。

```
mysql> show tables;
select * from テーブル名;
```
次にテーブルを削除しようとすると、表題のエラーが…。

```
mysql> delete from テーブル名;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`データベース名`.`posts`, CONSTRAINT `fk_rails_5b5ddfd518` FOREIGN KEY (`user_id`) REFERENCES `テーブル名` (`id`))
```

このエラーは、親行を削除もしくは更新できず外部キー制約に失敗しているという内容です。
このエラーに対して、以下コマンドにて外部キー制約を一時的に無効にします。

```
mysql> SET FOREIGN_KEY_CHECKS = 0;
```

このコマンドにてOKが出れば、もう一度削除のコマンドを実行します。

```
mysql> delete from テーブル名;
Query OK, 3 rows affected (0.00 sec)
```

無事削除できたみたいなので、先ほど無効にした外部キー制約を戻しておきます。

```
mysql> SET FOREIGN_KEY_CHECKS = 1
```

あとは「exit;」にてmysqlを抜けて完了です。
【Java Spring】 mybatisのSpring bootでの設定

# mybatisのSpring bootでの設定

###application.ymlへの設定の記述
mybatisを使用して、Javaのオブジェクトと、DBの項目の紐付け(マッピング)を行うために、
Javaではキャメルケース(objectExampleのような書き方)で記述をし、
DBの項目はスネークケースを使用している場合に、下記の設定を行う事で、
自動的にmybatis側で変換を行い、マッピングをしてくれる。


```bash:application.yml
mybatis:
    mapper-locations: classpath*:/mapper/**/*.xml
    type-aliases-package:
      紐付けを行うJavaオブジェクトのパス
    configuration:
      map-underscore-to-camel-case: true

```
再帰リレーションシップをObject Browser ERで表現するやり方のメモ

この記事では、Object Brower ER 8.０（以下、OBER）を使っています。
過去にER Studioを使っていたけれども現在Object Browser ERを使い始めたため、慣れるまでに気づいたことをメモしています。

# はじめに
今回、再帰リレーションシップをうまく描くためにググってみたけれど見つからず、やり方を見つけるのに少し迷ったのでメモします。
なお、データモデルの記述方法はIDEF1xです。

# 再帰リレーションシップとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/886850/ed139ca4-b3eb-94dc-a823-d9fa133ee3a5.png)

例えば、新型コロナのような感染症の患者を管理するエンティティ上で感染元の患者番号を持たせるときに、
・ある１人の患者（元患者）が、複数の患者に感染を広げている
・元患者がいないこともある（NULLになる）
場合の表現が上記のようになります。

# OBERでうまくいかなかったこと
OBERで再帰リレーションシップを表現しようと、以下の依存型リレーションシップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/886850/0d0c3458-91b9-104e-3e9f-79adc7b7bd79.png)
を指定して当該エンティティをクリックすると、「依存型リレーションシップの参照が循環しています」というエラーが表示されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/886850/952ba5d5-5721-c1cd-4ff3-92f904914205.png)

ER Studioの場合は（記憶が確かなら）当該エンティティを2回クリックすることで実現できた（リレーションを引くときの親と子に同じエンティティを指定する）のですが、OBERでは手順がリレーションの引き方も違うのでやり方を見つけるのに少し時間がかかってしまいました。

# OBERで実現する方法
以下、実現することができた手順です。
（私の場合見た目で実現することが目的なのですが、見た目以外の機能に影響が出る場合はご指摘いただければ幸いです）

(1)「多対多型リレーションシップ」を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/886850/2fc87e54-046d-7c1e-089a-071ffa02c715.png)

(2)再帰させたいエンティティをクリックすると、多対多のリレーションが追加される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/886850/9d0a4a3b-00ee-4667-fb5b-dc13ac958508.png)

(3)追加されたリレーションをダブルクリックで選択し、「リレーションタイプ」を「非依存」に変更し、「親の存在は必須」のチェックボックスを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/886850/b423d0fc-fdd9-b624-c87b-4fcc69607c95.png)

これで、欲しい形のリレーションが追加されたので、レイアウトを整えれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/886850/ed139ca4-b3eb-94dc-a823-d9fa133ee3a5.png)

# ちなみに・・・OBERでのリレーション位置の初期化対策をご存知の方いらしたら・・・
ちなみに本文とは関係ありませんが、OBERで何らかの変更（エンティティを移動したり、オブジェクトサイズ最適化をしたり etc.）を加えた瞬間、リレーションの位置がデフォルトの位置に戻るのですが（以下）、これを発生させない方法をご存知の方いらっしゃったらぜひ教えてください:bow_tone1:
（レイアウトが命のデータモデルで、この修正作業が大変で大変で・・・TT）
Among us用のDiscordボットを作った話

# 概要
最近Among usを友達とやるようになり、[AutoMuteUs](https://github.com/denverquane/automuteus)というとても便利なボットの存在を知りました。
しかし、このボットはWindows PCにSteam版のAmong usを入れないと使えないものでした。
Macしか持っていなくても、せめて会議ごとに全員のミュート状態を操作できるようにしたい！と思いました。
絶対誰か作ってるでしょと思って検索してもなかなか出てこなかったので作ってみました！
開発時間は3時間ほどでした。

最終的なコードはこちらです：https://glitch.com/edit/#!/amongus-mute

# ボットの使い方
<!--
まず、ボットをサーバーに追加します：
https://discord.com/api/oauth2/authorize?client_id=848135911937671178&permissions=12584960&scope=bot
-->

**AmongUsMuteBotの使い方**
0. もしbotがオフラインだったらglitchのプロジェクトに一回アクセス
1. 全員ボイスチャンネルに入った状態で`!start`
2. タスクやる時間の時に`!ship`（生きてる人がマイクとスピーカーがオフされて死人はオンになる）
3. 会議の時に`!meeting`（生きてる人のマイクとスピーカーがオンになり死人のマイクがオフになる）
4. 会議の時、新たに死人が発見されたら`!dead @メンション`（その人のマイクがオフになる。このコマンドは1人づつやってください）
5. ゲーム終了時に`!end`

# 作業の概要
1. https://note.com/bami55/n/ncc3a68652697 を参考にボットの作成とGlitchのプロジェクトのセットアップをしました。
2.  その後ボット用のコードを追加していきました。

# コード
いくつかコードを紹介していきます。

まず、生存者と死者を格納する配列を作りました：

```javascript
var alives = [];
var deads = [];
```

次にメッセージを受け取った時にコマンドかどうかを判断し、コマンドと引数を格納します：

```javascript
  const prefix = "!"
  if (!message.content.startsWith(prefix) || message.author.bot) return;
  
  const args = message.content.slice(prefix.length).trim().split(/ +/);
  const command = args.shift().toLowerCase();
```
その後コマンドの名前によって呼び出す関数を変えていきました。
例えば、Discordで`!meeting`とメッセージを送ると、`command == "meeting"`となります。
その場合、生存者のマイクとスピーカーをオンにして、死者のマイクをオフにする関数を呼び出します。

`!dead @メンション`では、メンションされた人を`deads`配列に追加し`alives`配列から削除します：

```javascript
      if (args[0]) {
        const user = getUserFromMention(message, args[0]);
        setDeads(user);
      }
      muteDeads();
      return;
```
`getUserFromMention()`は[Discordのドキュメント](https://discordjs.guide/miscellaneous/parsing-mention-arguments.html#how-discord-mentions-work)を参考にしました。
ドキュメントから変更したのは、最後の`return`のところです：

```javascript
function getUserFromMention(message, mention) {
    ...
    // return client.users.cache.get(mention); ここを以下に変更
    return message.guild.members.cache.find(member => member.user === client.users.cache.get(mention));
	}
}
```
元のコードでは`User`を返していましたが、`GuildMember`を返すようにしました。
ここで躓いて1時間ほど溶かしました...

マイクとスピーカーののオンオフはそれぞれ`setMute`と`setDeaf`でできます：

```javascript
  alives.forEach((x) => {
    x.voice.setMute(false).catch(err => console.log(err));
    x.voice.setDeaf(false).catch(err => console.log(err));
  });
```
`true`を`false`にするとオンになります。

```javascript
function getUserFromMention(message, mention) {
	if (!mention) return;

	if (mention.startsWith('<@') && mention.endsWith('>')) {
		mention = mention.slice(2, -1);

		if (mention.startsWith('!')) {
			mention = mention.slice(1);
		}

    return message.guild.members.cache.find(member => member.user === client.users.cache.get(mention));
	}
}
```

# 終わりに
ゲーム中にコマンドを打たなくちゃいけないのは若干めんどくさいかもしれませんが、死者がボイスチャットを移動することなく会話できるのは便利かなと思っています。
Javascriptに詳しくないことを言い訳にあまり綺麗なコードはかけていないので、時間があればリファクタリングしていきたいです。
Google Apps Script（GAS）の初心者あるある

自分が費やした時間を「GASのうまくいかない」初心者あるあるとして供養します。

#あるある１：「保存」だけして、「デプロイ」してないから実処理に反映されていない

ZapierからWebhookでGoogle Apps Script（GAS）のスプレッドシートに書き込むプログラムを作っていたのですが、どうにもうまくいかない。
状況としては以下のとおり。
1. 2列に書き込む元プログラムを書き換えて5列に書き込もうとしているのに2列にしか書き込まれない。
2. 処理が滑ったときのデフォルト値を書き換えたはずなのに、書き換え前のデフォルト値がスプレッドシートに書き込まれる。

2の時点で気づけって話なんですが、「保存」だけして「デプロイ」してませんでした。
「デプロイ」しないと実処理に反映されません。
ちゃんと授業で注意点として教えていただいていたのに手癖で進めてました。反省です。

![0530-GAS-1143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289676/c0b8702b-5e42-6a52-fd5f-8fd18999a792.png)

#あるある２：「保存」しないで「デプロイ」すると保存前のコードがデプロイされる

前項のミスを修正してこれで大丈夫、と思って処理を回したら「これって修正前のコードじゃね？」と気づきました。
**「保存」ボタンを押さなくても「デプロイ」できちゃう**んですね。ただし保存前のコードでデプロイされます。
やさしく「保存されないけどいい？」とか聞いてくれないです。

![0530-GAS-1135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289676/d36730c0-2d60-1044-c308-e266b89a1a66.png)

#ちょっと宣伝

7月までに

「ガジェットレビュー動画をもっと効率的に見れたらなぁ」
「イマイチ動画はサマリして、プロ目線の解説動画だけ見たいなぁ」

を叶えるソフトを作ろうと思っています。
ただ目的がニッチなので、

「ソシャゲの最適武器紹介動画をサマリして、多数派のおすすめを知りたい」
「投資・仮想通貨の今後の見通しはどっち派が多いのか知りたい」

などの他の利用用途もありかな、とアンケートを取っています。
拡散力が低くて悩んでおりますので、気になった方、投票＆リツイートのお力添えをお願いします！

https://twitter.com/ShinsukeSutou/status/1398606146135490569


https://twitter.com/ShinsukeSutou/status/1398606775679471620
MediaPipeやーる（Python3.6、Windows10）


# はじめに
MediaPipeやっていきます。

https://www.youtube.com/watch?v=nPYjyZQsIdQ

https://github.com/Kazuhito00/mediapipe-python-sample

Pythonは以下に対応している
- Face Detection
- Face Mesh
- Hands
- Pose
- Holistic
- Objectron

# 開発環境
- Windows 10
- Python 3.6
- anaconda 

# 導入

~~~console
pip install mediapipe
~~~

## FaceDetection 
~~~python
import cv2
import numpy as np
import mediapipe as mp
import time

def draw(image, detection):
    h, w = image.shape[:2]

    left = int(detection.location_data.relative_bounding_box.xmin * w)
    top = int(detection.location_data.relative_bounding_box.ymin * h)
    right = int(left + detection.location_data.relative_bounding_box.width * w)
    bottom = int(top + detection.location_data.relative_bounding_box.height * h)

    cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 1)
    cv2.putText(image, str(detection.label_id[0]) + ":" + str(round(detection.score[0], 3)), (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 1, cv2.LINE_AA)

    # 右目, 左目, 鼻, 口, 右耳, 左耳
    for keypoint in detection.location_data.relative_keypoints:
        cv2.circle(image, (int(keypoint.x * w), int(keypoint.y * h)), 2, (0, 255, 0), -1)

    return image

cap = cv2.VideoCapture(0)
min_detection_confidence = 0.7
face_detection = mp.solutions.face_detection.FaceDetection(min_detection_confidence=min_detection_confidence)

while True:
    start = time.time()
    ret, image = cap.read()
    if not ret:
        break

    draw_image = image.copy()
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = face_detection.process(image)

    if results.detections is not None:
        for detection in results.detections:
            draw_image = draw(draw_image, detection)

    fps = round(1.0 / (time.time() - start))
    cv2.putText(draw_image, str(fps), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 1, cv2.LINE_AA)
    cv2.imshow("draw_image", draw_image)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
~~~

# 実行動画

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">FaceDetection <a href="https://twitter.com/hashtag/MediaPipe?src=hash&amp;ref_src=twsrc%5Etfw">#MediaPipe</a> <a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw">#Python</a> <a href="https://t.co/of2ZbffDi6">pic.twitter.com/of2ZbffDi6</a></p>&mdash; がちもとさん@熊本 (@sotongshi) <a href="https://twitter.com/sotongshi/status/1398837637998280705?ref_src=twsrc%5Etfw">May 30, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

お疲れ様でした
RealityKitとSceneKit、どちらのメモリ使用量がすくないか

###メモリ使用量をへらしたい
ARKitでリッチなUSDZファイルを表示すると、**すごくメモリを食う**。
ファイルサイズが数十MBの３Dでも、レンダリングによるメモリ消費は**数百MB**になり、複数表示しようものなら落ちてしまう。

普段SceneKitをつかっているのだが、**新しい方のRealityKitなら、レンダリングが最適化されてメモリ使用が劇的に少なかったりするんじゃないか**、と思い、フレームワークによって、メモリ使用量が変わるか、調べてみた。
####（左）RealityKit　（右）SceneKit　（ネットで拾ってきたRobot　35MBのUSDZ）
![IMG_4987.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/32d251e9-992e-db78-b3df-24168dc4a6fb.png) ![IMG_4988.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0d69550f-1ffc-cd62-46b9-982998f971a3.png)

###＜結果＞

|フレームワーク  |CPU使用量  |メモリ使用量  |
|---|---|---|
|**RealityKit**|100% |715MB|
|**SceneKit**|73%  |645MB  |

  
Σ(ﾟ∀´ ﾌｴﾄﾙﾔﾝｯ

RealityKitは「驚くほど滑らかな映像や物理シミュレーションを実現」しているせいか、メモリ使用量が１０％ちょい多いようでした。
どっちがappleのサポート手厚いか、どちらがARがきれいかなど、どちらをつかうか悩む昨今です。季節はすっかり夏ですね。

ちなみに、USDZをロードしたコードは以下。

```swift:RealityKit
let anchor = AnchorEntity()
arView.scene.anchors.append(anchor)
let robot = try! Entity.loadModel(named: "robot")
anchor.addChild(robot)
```

```swift:SceneKit
let localURL = Bundle.main.url(forResource: "robot", withExtension: "usdz", subdirectory: "art.scnassets")!
let scene = try! SCNScene(url: localURL, options: [.checkConsistency: true])
let robotNode = scene.rootNode
sceneView.scene.rootNode.addChildNode(robotNode)
```

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

LGTMついてないか毎日チェックしています。嬉しいもんです。

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
SQLを使ってデータを操作する方法

### ログインおよび「sqltest」のデータベースを使用できる状態にします
---

```
% mysql -u root

mysql> USE sqltest;
```
### データを登録する

---

INSERT文はテーブルにデータを登録するSQL文です。INTOという句と組み合わせて使用します。

``` 
mysql> INSERT INTO goods VALUES(1, "ペン", 120); # 全てのカラムに値を入れる場合

mysql> INSERT INTO goods(id, name) VALUES(2, "消しゴム"); # 特定のカラムにのみ値を入れる場合
```

### データを確認してみます
---

SELECT文はデータを取得する際に使用するSQL文です。＊（アスタリスク）は「全てのパターンに一致するもの」という意味を持ち、今回は「全てのカラム」という意味です。以下のコマンドを実行。

```
mysql> SELECT * FROM goods; # SELECT 《カラム名》 FROM 《テーブル名》
```

### データを更新する
---

UPDATE文はデータを更新するためのSQL文です。 UPDATE 《テーブル名》 SET 《変更内容》 WHERE 《条件》;下記コマンドを実行。

```
mysql> UPDATE goods SET price = 100 WHERE id = 2;
```

### データを削除する
---

DELETE文はデータを削除するためのSQL文です。DELETE FROM 《テーブル名》 WHERE 《条件》;
下記コマンドを実行。

```
mysql> DELETE FROM goods WHERE id = 2;
```

以上です。
Qase（テスト管理ツール）を使ってみる

## はじめに

テスト管理ツールは何を使っていますか？

私はTestLinkを使ったり、エクセルを使ったりしていました。

エクセルの場合は行やシートが増えすぎたり、テストに必要なファイルを手順に添付するのが大変だったり、、、
あとで結果を見直すのも大変だったりしました。

TestLinkはエクセルより、マシな気がしましたが、それでもUI操作が微妙に辛かったり、、、

そこでUIもそこそこ今風で使いやすいのないかな〜って思って探してみつけたのが「Qase」

https://qase.io/

## Qaseでのテスト管理

操作は直感的で

「Suite」からテストシート作成

![スクリーンショット 2021-05-30 10.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/aa4bfbb7-0741-83e8-bef6-0d9c881731bd.png)

「Case」からテストケース作成し、テストシートに紐づける
![スクリーンショット 2021-05-30 11.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/0a81cb50-b568-4c4b-9ad5-2c41f6abd19d.png)

テストケース毎に手順を設定。Attachmentからテストに必要なファイルを添付もできます。
![スクリーンショット 2021-05-30 11.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/997fd749-1c1d-46ec-8a5d-58682cf83c76.png)

テストケースができたらテスト計画を作成。実施するテストケースを紐づける
![スクリーンショット 2021-05-30 11.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/bd3276ee-88d0-63e3-136e-9ec213e21fc2.png)

![スクリーンショット 2021-05-30 11.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/2283c5ec-8bbf-768e-58df-c19213cf2210.png)

テスト実行に実施するテスト計画を紐づける

![スクリーンショット 2021-05-30 11.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/f597216c-0984-7584-396a-3d0e5dcc8612.png)

テスト実行でテストケースを選択し、PassedやFailedをつける
![スクリーンショット 2021-05-30 11.19.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/79c4c1a4-5b52-8b6e-f4b4-163c39de4202.png)

TestLinkと同じような操作でTestLinkより直感的でした。
テストケースのCloneもあるので同じようなテストもサクッと作れるのも良い感じです。

## Qaseと他のツールと連携

現時点でQaseが連携可能なツール
>Supported integrations:
>✔Jira integration　　　　 ✔Gitlab integration
>✔Redmine integration　　 ✔Bamboo integration
>✔YouTrack integration　  ✔Trello integration
>✔Slack integration　　　  ✔Clickup integration
>✔Github integration　　  ✔Easyredmine integration

試しにGitLab連携をしてみました。

「Settings」 > 「integrations」 > 「GitLab」 をインストール

![スクリーンショット 2021-05-30 11.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/febd2b71-b3ff-7da5-ce43-325dfd308956.png)

GitLabのURLとAPI Tokenを入力
![スクリーンショット 2021-05-30 11.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/32c6d1c0-c71f-22ef-9f16-585701c5ab76.png)

テスト対象のリポジトリを選択します。
![スクリーンショット 2021-05-30 11.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/8b8a4c88-be9e-254c-e99a-f7f05ca8f687.png)

テスト実行時、Failedした時にGitLabのチェックボックをオンにしておけば、自動で対象のリポジトリにIssueが作成されます。
![スクリーンショット 2021-05-30 11.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690302/cfb14cf1-0005-5df3-a1dc-83ac93b9c923.png)


## おわりに

TestLink使っていたからかもしれませんが、Qase結構操作しやすく、画面もわかりやすいかな〜って感じでした。
今回使用したのがFree版ですが、お金をかければ他の便利機能が使えそうな感じですね。
あと、ツールのインストール作業とかがないのも楽でしたね。アカウント登録くらい。
もっと便利なテスト管理ツールあれば教えてください。👋
6つのサイコロを10000回投げたときの5の目がでる確率をPythonでもとめる

```python
"""
6つのサイコロを10000回投げたときの5の目がでる確率をもとめる
"""

import random

def sai_no_me():
    return random.randint(1,6)

count5_total=0
for i in range(1,10001):
    saikoro1 = sai_no_me()
    saikoro2 = sai_no_me()
    saikoro3 = sai_no_me()
    saikoro4 = sai_no_me()
    saikoro5 = sai_no_me()
    saikoro6 = sai_no_me()
    result = [saikoro1, saikoro2, saikoro3, saikoro4, saikoro5, saikoro6]
    count5 = result.count(5)
    is_exist='☓'
    if count5 > 0:
        is_exist = '○'
    count5_total += count5
    kakuritsu = count5_total/i
    print('{} {}: {} {} {} {} {} {} 確率{}'.format(is_exist, i, saikoro1,saikoro2,saikoro3,saikoro4,saikoro5,saikoro6,kakuritsu))
```
```
.
..
...
○ 9951: 5 3 5 5 1 1 確率1.0048236358154958
☓ 9952: 6 4 2 2 6 4 確率1.0047226688102895
○ 9953: 1 2 2 5 5 3 確率1.0048226665327038
○ 9954: 4 4 2 5 5 3 確率1.0049226441631505
○ 9955: 4 5 6 5 4 4 確率1.0050226017076846
○ 9956: 5 2 1 1 3 3 確率1.0050220972278023
○ 9957: 4 4 2 5 1 2 確率1.0050215928492519
○ 9958: 5 3 6 3 3 1 確率1.0050210885720023
○ 9959: 6 5 1 5 5 1 確率1.0052214077718646
○ 9960: 1 6 5 6 4 6 確率1.0052208835341365
☓ 9961: 4 3 1 2 2 4 確率1.0051199678747114
○ 9962: 5 4 3 2 1 1 確率1.0051194539249146
○ 9963: 1 5 6 2 1 3 確率1.0051189400782896
○ 9964: 2 6 4 2 2 5 確率1.0051184263348052
○ 9965: 6 5 6 6 6 5 確率1.005218263923733
○ 9966: 6 6 5 5 6 4 確率1.005318081477022
○ 9967: 2 1 5 1 4 2 確率1.0053175479080967
○ 9968: 6 6 2 4 5 6 確率1.005317014446228
☓ 9969: 6 2 4 3 2 3 確率1.005216170127395
○ 9970: 6 2 4 4 6 5 確率1.0052156469408224
○ 9971: 5 5 4 1 4 4 確率1.0053154147026377
☓ 9972: 1 3 4 2 1 2 確率1.005214600882471
☓ 9973: 2 1 6 2 6 3 確率1.005113807279655
☓ 9974: 4 3 4 1 2 1 確率1.0050130338881091
○ 9975: 1 2 6 6 5 4 確率1.005012531328321
○ 9976: 2 5 3 3 3 2 確率1.0050120288692863
○ 9977: 2 6 5 2 4 3 確率1.0050115265109751
☓ 9978: 1 2 1 4 3 4 確率1.0049108037682903
○ 9979: 1 5 3 5 4 3 確率1.0050105220964025
☓ 9980: 3 1 2 2 6 6 確率1.0049098196392785
☓ 9981: 4 3 6 2 1 6 確率1.004809137360986
☓ 9982: 3 6 6 6 1 1 確率1.0047084752554598
☓ 9983: 3 3 4 6 1 3 確率1.0046078333166384
○ 9984: 5 5 5 3 5 4 確率1.0049078525641026
○ 9985: 1 2 1 6 6 5 確率1.0049073610415624
☓ 9986: 2 3 4 2 4 6 確率1.0048067294211898
○ 9987: 4 4 2 5 5 2 確率1.0049063782917793
○ 9988: 5 5 2 3 5 2 確率1.0051061273528235
○ 9989: 2 6 6 5 2 1 確率1.0051056161777956
○ 9990: 6 6 5 3 4 6 確率1.0051051051051052
○ 9991: 2 5 1 2 4 2 確率1.0051045941347212
☓ 9992: 1 6 2 1 1 4 確率1.005004003202562
○ 9993: 1 1 6 1 5 1 確率1.005003502451716
○ 9994: 5 6 1 3 1 3 確率1.0050030018010807
○ 9995: 5 4 6 5 3 4 確率1.0051025512756377
☓ 9996: 3 6 2 3 2 3 確率1.0050020008003202
○ 9997: 5 3 6 4 2 4 確率1.0050015004501351
☓ 9998: 4 3 1 2 3 6 確率1.0049009801960391
○ 9999: 4 4 3 1 2 5 確率1.0049004900490048
○ 10000: 5 6 2 6 6 1 確率1.0049
```
簿記仕訳　為替手形

下記の問題はどうやって仕訳しますか。
１．猫商店は犬商店への掛代金￥５０の支払いのため、同店受取り得意先馬商店引き受けの為替手形を振出した。

２．東京商店に対する買掛金￥２００の支払いのため、同店振出し、千葉県商店受取の為替手形を呈示され、これを引き受けた。

答え：
１．（買掛金）　５０　　（売掛金）　５０

２．（買掛金）　２００　（支払手形）　２００

これ見ると最初は変だな思うかもしれません。同じ為替手形のに、何で仕訳の項目は時々売掛金、時々支払手形になりますか。

まずは為替手形は何ですか。
関わる登場人物を分かれば理解が難しくないです。
Aさんは先週Bさんから1000円を借りました。今日AさんとBさんは一緒に買い物に行きました。Bさんは1000円の漫画を買いました。その代金をAさん支払いました。AさんとBさんの間の借金もなくなりました。
この例のように、為替手形で登場人物は売り手、買い手、支払人三つです。

１＞振出人（手形作成者、差出人）ー＞　買い手、手形を作成した人、
２＞支払人（名宛人、引受人）ー＞　手形の支払いを行う人
３＞受取人（指図人）ー＞　売り手、支払いを受け取る人

問題１は何で馬商店が猫商店が振出した為替手形を引き受けましたか。必ずこの前猫商店が馬商店に掛けで売りました。
その時の仕訳
（売掛金）　５０　　（売上）　５０
今回犬商店を支払いうために馬商店対する売掛金を相殺して馬商店支払人の為替手形を振り出した。

問題２は東京商店が振出人、千葉県商店がお金をもらう人。この前必ず東京商店は掛けで千葉県商店から仕入れしました。自社はこの為替手形の支払人なので、仕訳の貸方は支払手形です。

### 仕訳の項目は為替手形の支払人よって決まります。自社の場合は仕訳項目は”支払手形”、自社振出し、得意先支払いの場合は”売掛金”です。

下記の問題はどうやって仕訳しますか。
３. 得意先東京商店に商品￥１００を売り上げ、代金は自己振出しの為替手形を裏書譲渡された。
４. 千葉県商店に商品￥３００を売上げ、代金として￥１００は自己振出しの約束手形を裏書譲渡され、残額は掛とした。

答え：
３．（受取手形）　１００　　　（売上）　１００
４．（支払手形）　１００　　　（売上）　３００　
　　（売掛金）　　２００　　　

どちらも自己振出た手形を裏書譲渡されたのに、何で為替手形の場合借方は「受取手形」、約束手形の場合は「支払手形」ですか。

自己が振り出した為替手形は自分が支払う義務はないです。それをもらう時、自分としてそれは受取手形です。
自己が振り出した約束手形は自分が支払う義務はあります。それはこの前の頃自分が振り出た「支払手形」です。今自分の手に入りましたので、別の人に対する支払う義務はなくなりました。