OmniAICreator/Qiita-1.07M huggingface dataset:
(自分は)ノンプログラミングでMovableType形式のファイルをHexoのマークダウン形式ファイルに変換した話

# ノンセキュア接続のブログサービスはもういや

## 俺はライブドアブログをやめるぞジョジョォォォォ

はい、言ってみたかっただけです。ジョジョはネタしか知りませんのでここまで。

というわけで、ブログのお引っ越しです。いままで使ったことのある、はてなブログ、FC2ブログ、Seesaaブログ、アメーバブログとかに戻ろうかと思いましたが、どれもこれも中途半端なサービス状況で、はてなブログで「httpsを有効にする」って設定があって、「これかー」と思って押してみたら画像がhttpのままでアカン状態に…。新しく始めるのならばこれでいいんでしょうけどねぇ(きっとメディアもhttpsになってくれる)…。

吟味に吟味を重ね、HugoではなくHexoでGithub Pagesに移行しましょうと言う形なりました。なんでHexoかって言うと「1回使ったことがある」、それだけです。言うてどっちもマークダウンで書いていくし変わんないだろーとフラグを立てるわたくし。

## だいたいのブログサービスのエクスポートはMT形式

そう、MovableType形式なのです。これを機に全部のいままでの全部の作ったブログサービスからエクスポートしてマージしようとして、はてなブログもライブドアブログもFC2ブログもSeesaaブログもMT形式。CMSマーケットシェアがワードプレスで6割いくらしいこのご時世にそろいもそろってMovableType！まあ、ブログシステムの先駆者でしたからね、MovableType。

## さあて、Hexo形式に変換するぞってあれ…

MT形式→Hugo形式のプログラムはあったが、Hexoに変換してくれる物がない…。同じだろーって変換を掛ける。無事Hugo形式のマークダウンファイルが多数できました。Hexoのホームディレクトリにズガンとぶち込み`$ hexo deploy -g`！！！！！いえーい！！もう終わり！……と思ったが甘かった。表示がなんか変。

## HugoとHexoではタイトル周りの書き方が違った

Hugoだと

```
+++
title = hogehoge
date = YYYYMMDD
あとはタグみたいないろいろメタデータ
+++
```

みたいになるんです。ですが、Hexoだと

```
---
title: hogehoge
date: YYYYMMDD
あとはタグみたいないろいろメタデータ
---
```

こうなるわけです。マークダウンにも方言があるとは聞いていたが…。諦めてHugoにするかと思いはしたがなんかここまで来て折れるのもイヤだなーと思い。

## 秀丸でGREPして置換

別に複数ファイルに対して一括置換できるならなんでもいいんでしょうけど、たまたま秀丸にそういう機能があったのでそれを使ってみました。

まずは`+++`を`---`に置換。そして`=`を`:`に置換。

こんどこそやったーと思って`hexo deploy -g`！！！！

あ…。

## AタグのHREF、IMGタグのSRCの`=`まで`:`にしていた

もちろんリンクも機能しないし、画像もでない。一筋縄ではいかないなー。

`href:`を`href=`に、`src:`を`src=`に置換。

いえーす！`hexo deploy -g`！！！！！

## リソース泥棒になっていた

よくよくページを見ていると、画像の配置先がライブドアのままになっていました。これは良くない。imagesディレクトリに画像を保存し、IMGタグのソースをライブドアのサーバーからimagesディレクトリを見るように**手動で**変更。画像ファイル名がランダム文字列になっててディレクトリもランダムっぽく見えたので…。ああ、私が正規表現を扱うことができればもっと楽になったのに…。しかし画像を扱っている記事がそんなになくて助かった。

## 感想

Hugoを知らなかったのでHexoという感じだったのですが、これを機にHugo学べば良かったんじゃないかな、俺…。まあなんとかなったので良かったですけど。

あとは正規表現学んでおかなければと思いました。もっと楽に最後できたんじゃないかなーとおもいます。

## 参考にしたサイト

[はてなブログをHugo+AWSに移行しました](https://blog.stormcat.io/post/entry/hatenablog-to-hugo/)
Raspberry Pi Zero WをUSBマスストレージとして使ってみよう

メモ。

```
rpi-update
```

#files

```
root@raspberrypihani:/home/pi# ls
mountimg.sh  mountusb.sh  storage1.img  umountusb.sh
```

```"linux.yebisu.jp/memo/1160"
dd if=/dev/zero of=/home/pi/storage1.img bs=1M count=20480
losetup -o 1024k /dev/loop0 /home/pi/storage1.img
mkfs.vfat /dev/loop0
losetup -d /dev/loop0
sync
sync
sync
```

```
root@raspberrypihani:/home/pi# cat mountusb.sh
modprobe g_mass_storage file=/home/pi/storage1.img stall=0 removable=1 nofua=1  buflen=6553600
#キャッシュが足らないと、転送速度が0kb/sにdropする。
root@raspberrypihani:/home/pi# cat umountusb.sh
rmmod g_mass_storage

root@raspberrypihani:/home/pi# cat mountimg.sh
 mount -t vfat -o loop storage1.img /mnt
```

###cmdline.txt
```
root@raspberrypihani:/boot# cat cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=a262b738-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_mass_storage
```
###config.txt
```
・・・・追記
enable_uart=1
dtoverlay=dwc2
dr_mode=peripheral
```
#ベンチマーク
##MicroSD
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/925f038a-e651-0d5e-cddd-7544e5c026d2.png)

##USBOTG
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/9ce6fa4b-0888-d43c-859e-a1b4fc3ec200.png)

元のSDカードが悪い場合、USBOTGのほうがパフォーマンスがあがります。

#Chromeを動かす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/39bc545a-0bd1-a012-3b32-442a80fcca79.png)

#Todo
・Google driveやFTPとのsync (skicka  rclone　Grive2)
・ディスクの暗号化
・パスワードでの解除
・shellを見る
・共用パソコンでもcom接続

#Ref
https://qiita.com/mt08/items/838a2a0e42d4dbc9fba7
https://linux.yebisu.jp/memo/1160
https://www.raspberrypi.org/forums/viewtopic.php?t=154384
https://stackoverflow.com/questions/44053344/g-multi-mode-mass-storage-ethernet-not-working-on-raspberry-pi-zero-w
https://www.raspberrypi.org/forums/viewtopic.php?t=196628
https://raspberrypi.stackexchange.com/questions/79699/g-mass-storage-on-rpi-zerow-is-readonly-use-as-usb-stick
https://stackoverflow.com/questions/18606393/very-low-performance-of-g-mass-storage-virtual-usb-device
solutions architect受験者必須！AWS S3 (Simple Storage Service)とは？①

# 概要
aws solutions architect associate試験に必ず出てくるS3の概要・特徴をまとめました。


## S3とは？
高い耐久性と容量制限なしの**オブジェクトストレージ**

awsでは3つの形式のストレージサービスを提供しています。

- オブジェクトトレージ
- ブロックストレージ
- ファイルストレージ

それぞれ特徴があり、オブジェクトストレージは簡単にデータの取り出しができ、分散保存が容易です。
しかしデータの更新は不得意です。

## S3用語説明

### オブジェクト
- S3に保存するデータそのもの(写真・動画・ログなど)
- 1つのオブジェクトサイズは最大5TBまで

### バケット

- オブジェクトを保存する場所
- 重複するバケット名は指定することができない
- オブジェクト保存数の制限なし

## S3のストレージクラス
**solutions architect試験にはコストに関する問題が多数出題されます！！**
保存するデータによってどのストレージクラスを使用するかイメージを持てるようにしましょう！

### STANDARD

- データ保存時少なくとも3つのAZ（アベイラビリティーゾーン）に保存される
- 耐久性99.999999999%
- 可用性99.99%


### STANDARD-IA

- STANDARDに比べてデータ保存料金が安い
- 取り出し時の課金額がSTANDARDに比べて高い
- 耐久性99.999999999%
- 可用性99.9%

### One Zone-IA

- 1つのAZのみに保存される為、可用性が99.5%とストレージクラスの中で1番低い
- 高頻度ではないが、すぐに取り出す必要がある場合のデータを保存する
- 耐久性99.999999999%
- 可用性99.5%

### Glacier

- 保存料金が1番安い
- 1度保存するとほとんど取り出すことがないようなデータを保存する
- データを取り出す時に時間と料金が1番かかる
- 耐久性99.999999999%

**2018年11月にIntelligent-Tieringが追加されていますが、私が受験した時点(2019/5/18)では出題されなかった為、本記事では紹介しません。**


## S3のアクセス管理
### バケットポリシー

- S3バケットに対してアクセス権限を設定する

### ユーザーポリシー
- IAMユーザーに対してアクセス権限を設定する

### 署名付きURL
- 有効期間を設定できる
- 署名付きURLを知っている人のみがアクセスできる
- URLを知っている人全員がアクセス可能になる為、ユーザーを制限することができない

## ライフサイクル機能を利用してデータの保存コストを削減する

S3にはライフサイクル機能があり、以前に比べて使用されなくなったオブジェクトに対して、オブジェクトの削除・ストレージクラスの変更を行うことでコスト削減をすることができる

### ライフサイクルの例
1. STANDARDに保存 (30日後にSTANDARD-IAに移動させるライフサイクルを設定)
2. 30日後にSTANDARD-IAに移行される




## 終わりに

今回は用語説明、ストレージクラス、アクセス管理、ライフサイクルを解説しました。
次回はデータの暗号化、データの整合性、バージョニングを解説します！

### 参考
- [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け20時間完全コース）](https://www.udemy.com/aws-associate/)
- [Amazon S3](https://aws.amazon.com/jp/s3/)
- [【AWS Black Belt Online Seminar】Amazon S3/Glacier](https://www.youtube.com/watch?v=oFG5kMZjKtc)
Turbolinksでさらに発展系へ～data-turbolinks-permanent～

Turbolinks 5で使えるオプション機能として、`data-turbolinks-permanent`というものがあります。

## 気になった動機

Rails+Turbolinks+Reactでシステムを組んでいて、Turbolinksでページごとのアセット読み込みは回避できるようになったのですが、Reactがページごとにマウント・アンマウントされるので、「同じものを再生成するコストが無駄」、また「Ajaxでロードするデータを何度も取ってくる必要がある」などの非効率な点があったので、そちらを改善したくなってきました。

そうしたところ、Turbolinksで対応できるとわかったので、取り入れてみた次第です。

## `data-turbolinks-permanent`とは

Turbolinksで読み込むページ内に、`<div id="some-id" data-turbolinks-permanent></div>`のように`data-turbolinks-permanent`属性を指定したエレメントがあると、Turbolinksによるページ遷移の後も同じエレメントを再利用するようになります。なお、「`id`が同じ」ものだけ引き継がれますので、`id`の付与は必須となります。

### JavaScriptの世界から見た挙動

もちろん、単なるHTMLを持ち越してもそこまで魅力があるわけではないので、主戦場はJavaScriptウィジェット、ということになります。ということで、イベント段階での挙動を見てみると、次のようになっていました。

* `turbolinks:before-render`時点：永続する要素はまだ`document.body`の中にあって、イベントで取ってこられる`e.data.newBody`には上書きされる予定の`data-turbolinks-permanent`つきエレメントが残っている
* `turbolinks:load`時点：永続する要素も新しい`body`内部へ移動が完了して、それが`document.body`になっている

実際に何かしらのウィジェットを渡り歩かせるには、JavaScriptでイベントを拾って、以下のような流れで動かすことになると思います。

* `turbolinks:before-render`の段階で新規マウントしようとしたときには、すでに永続的なマウントが行われていればスルーする
* すでに永続的にセットされたものについては、
 * `turbolinks:before-render`で`e.data.newBody`もチェックして、新しいHTMLに存在しなければアンマウントする
 * ウィジェットから`<body>`を読み取ってなにか処理を行うような場合、`turbolinks:render`で正しい`<body>`に入ったところで処理を行わせる
 *
#python で配列を持ったディクショナリのキーがある場合は for ループを回して、逆にない場合は何もしない例

get の第二引数に初期値の配列を渡しておく 

 ( `some_dict.get('some_key', [])` )

```
people = {'family': ['alice','bob','carol']}

for person in people.get('family', []):
  print(person)

# alice
# bob
# carol

for person in people.get('workers', []):
  print(person)

# (nothing)

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1925








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rails5.1以降のrequest specの引数

# これまで

第１引数にパス、第２引数にパラメーター、第3引数にリクエストヘッダーを指定していた。

```
get '/users', {}, { HTTP_USER_AGENT: 'user_agent' }
get '/users', { id: 1 }
```

# rails5.1以降のrequest specの引数
`params`, `headers`などの引数はキーワード引数で指定する。

```
get '/users', headers: { HTTP_USER_AGENT: 'user_agent' }
get '/users', params: { id: 1 }
```

## 使用できる引数

* params
* headers
* env
* xhr
* format
rsyncのオプション

rsyncコマンドを使ったファイル転送スクリプトを作った時のメモ

# 文法

いくつかパターンがありますが、基本的にはコピー元(SRC)とコピー先(DEST)を指定すればファイルを転送してくれます。リモートホストに送ったり、リモートホストから取得することも可能です。

```
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST::SRC [DEST]
```

# オプション

いくつか使ったものだけピックアップ。

| オプション | 意味 | 原文 |
|:------:|:-----:|:-----:|
| -r | 再帰的に転送 | recurse into directories |
| -n | 実際には転送せず情報だけ出力 | show what would have been transferred |
| -c | 最終更新日とファイルサイズではなく、checksumを見て更新する | skip based on checksum, not mod-time & size |
| -b | バックアップを作成 | make backups (see --suffix & --backup-dir) |
| --backup-dir | バックアップ先を指定 | make backups into hierarchy based in DIR |
| -v | 出力内容を増やす | increase verbosity |

## 補足

### --backup-dir
下記のような説明があります。

```
In combination with the --backup option, this tells rsync to store all backups in the specified directory on the receiving side.
```

つまり、-bと組み合わせて使うと特定のディレクトリにコピーが可能です。bオプションが付いてないと何も起きません。

--backup-dirを付けた時のバックアップ先は保存先のディレクトリを基準とした相対パスか、絶対パスの2種類が指定できます。

### -c(--checksum)

更新時間とファイルサイズではなく、checksumを用いて差分判定を行います。

```
 Without this option, rsync uses a "quick check" that (by default) checks if each file’s size and time of last modification match between the sender and receiver.
```

と書いてあることから、処理コストは高くなるようです。

また、checksumはrsyncのプロトコルバージョンによって判定に用いるアルゴリズムが変わるようです。気にすることはないと思いますが。

MD5かMD4によりハッシュ化された値を用いて比較されるため、ファイルの内容によって差分があるかを判定することができます。


```
For protocol 30 and beyond (first supported in 3.0.0), the checksum used is MD5.  For older protocols, the checksum used is MD4.
```

### -n

これをつけるとドライランになります。
実際にファイル転送を行わずに対象ファイルなどの情報を出力できます。
デプロイスクリプトで使う時は確認に使えるので便利です。
VirtualBoxで全画面にした時にディスプレイの解像度が変更されない

ほとんどメモです．あしからず．

## 状況

- VirtualBox 6.0.8 r130520 (Qt5.6.3)
- ホストOS： macOS 10.14.5 Mojave
- ゲストOS： Ubuntu Desktop 18.04.2 LTS (Bionic Beaver)
- [エクステンションパック](https://vboxmania.net/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%91%E3%83%83%E3%82%AF%E3%81%AE%E5%B0%8E%E5%85%A5/)は導入済み

下の画像の様に全画面にしてもディスプレイ解像度を認識せず，800x600の画面が中央にあり，そのまわりが黒く無駄になっている．使いづらいし，ちゃんと全画面で使いたい．

![スクリーンショット 2019-05-19 21.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47733/b9d45c70-cfe3-63e4-dee8-8ae29e3f172a.png)


[xrandrを用いて変更](http://ubuntuhandbook.org/index.php/2017/04/custom-screen-resolution-ubuntu-desktop/)しても，一度シャットダウンすると変更が元に戻っている．

## 解決策

VMをシャットダウン後，VirtualBoxの `設定 > ディスプレイ > グラフィックコントローラー` を `VBoxSVGA` にして再起動する．
`VBoxVGA` でも解決できたが，どうやらゲストOSがLinuxならば `VBoxSVGA` の方が[推奨のようだ](https://vboxmania.net/%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E8%A8%AD%E5%AE%9A/)．

## 参考文献

- [エクステンションパックの導入 | VirtualBox Mania](https://vboxmania.net/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%91%E3%83%83%E3%82%AF%E3%81%AE%E5%B0%8E%E5%85%A5/)
- [How to Set A Custom Screen Resolution in Ubuntu Desktop | UbuntuHandbook](http://ubuntuhandbook.org/index.php/2017/04/custom-screen-resolution-ubuntu-desktop/)
- [ディスプレイ設定 | VirtualBox Mania](https://vboxmania.net/%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E8%A8%AD%E5%AE%9A/)
pythonでwebスクレイピング

#はじめに
今回はwebスクレイピングについて紹介していきます. ちなみにwebスクレイピングはwebサイトから情報を獲得することです. 

#環境
python3.6.3
macOS version10.14.2

#準備
まずはライブラリをインストールしましょう. 
beautifulsoup4は, htmlからデータを取り出すライブラリです. 
requestsは, httpでデータの通信を行うためのライブラリです. 

```
$ pip install beautifulsoup4
$ pip install requests
```

#簡単な使い方
###ページ情報の取得
まずはwebページの情報を取得しましょう. 
今回は, [Sportsnavi](https://baseball.yahoo.co.jp/npb/stats/batter?series=1&type=1)から情報を取得します. 
下記コードのURL部分を変更すれば, 異なるwebページでも利用できます. 

```python
# URL指定
url = "https://baseball.yahoo.co.jp/npb/stats/batter?series=1&type=1"
# Responseオブジェクト生成
response = requests.get(url)
# 文字化け防止
response.encoding = response.apparent_encoding 
# BeautifulSoupオブジェクト生成
soup = BeautifulSoup(response.text, "html.parser") 
```

###タグの取得
次はwebページからタグを取得しましょう. 
タグの取得方法は様々あるので,いくつかを紹介します. 

```python
soup.find_all('a')  # HTMLから全てのaタグを取り出す. リストのように扱える. 
soup.find('a')  # 先頭の一つだけ取り出す.
soup.a  # soup.find('a')と同様
```
###条件を絞ったタグの取得
クラスや属性で条件を絞ってタグを取得することも可能です. 

```python
soup.find('div', id='main')  # divタグでidがmainのものを取得
soup.find_all("a", class_="link", href="/link")  # aタグでclassがlink, hrefが/linkのものを取得
```

タグを指定しなくてもオッケー. 

```python
soup.find(id='main')  # divタグでidがmainのものを取得
soup.find_all(class_="link", href="/link")  # aタグでclassがlink, hrefが/linkのものを取得
```

###タグの情報
取得したタグの情報は以下のように取得します. 

```python
soup.a.get('href')  # href属性を取得する
soup.a.text  # aタグの中身を取得する
```

###webページのHTMLを確認
任意の情報を取得するためには, webページのHTMLの情報が必要だと思います. 
Chromeを使用している場合は, webページで右クリックを押すと「検証」とあるのでクリックしてください. 
以下のように, そのwebページのHTMLが表示されます. 
<img width="551" alt="スクリーンショット 2019-05-19 21.01.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/5e9accb7-c309-692d-0de3-c4ce791319e9.png">

#実践
今回は, [Sportsnavi](https://baseball.yahoo.co.jp/npb/stats/batter?series=1&type=1)からプロ野球セリーグの打率上位10人についての情報を取得します. 

```python
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

# URL指定
url = "https://baseball.yahoo.co.jp/npb/stats/batter?series=1&type=1"
# Responseオブジェクト生成
response = requests.get(url)
# 文字化け防止
response.encoding = response.apparent_encoding
# BeautifulSoupオブジェクト生成
soup = BeautifulSoup(response.text, "html.parser")

# 取得した情報を書き込む用のファイル
f = open('grade.txt', 'w')
# タグを取得
elems = soup.find_all("div", id='main')
# 順にファイルへ書き込み
for i in elems:
    f.write(i.text)
f.close()

### 以下, 取得した情報を整理しているのみ
grade = [[] for i in range(10)]
f = open('grade.txt', 'r')
lines = f.readlines()
flag =False
f.close()
num = 0
grade[0].append('1')
for line in lines:
    line = line.strip()
    if line == '':
        continue
    elif num > 9:
        break
    elif flag == True:
        grade[num].append(line)
        if len(grade[num]) == 27:
            num = num+1
    elif line == str(1):
        flag = True

print('セリーグ打率順位')
for i in range(10):
    print(str(grade[i][0])+" "+str(grade[i][1])+str(grade[i][2])+" "+grade[i][3])
```
実行結果は, 以下のようになります. 
無事, webページから情報を取得できました. 

```
セリーグ打率順位
1 青木 宣親（ヤ） .3441
2 鈴木 誠也（広） .3435
3 坂本 勇人（巨） .325
4 丸 佳浩（巨） .322
5 高橋 周平（中） .315
6 梅野 隆太郎（神） .313
7 糸井 嘉男（神） .312
8 筒香 嘉智（デ） .307
9 平田 良介（中） .299
10 野間 峻祥（広） .2967
```
ターミナルで command not found が出た時の対処法

#ターミナルで command not found が出た時

AWSで環境構築を行い、本番環境にてsshでログインしようとした際...

```
$ ssh -i 秘密鍵.pem ec2-user@xxx.xxx.xx.xxx
-bash: ssh: command not found
```

と表示され、どんなコマンドを打っても効かない状態に....


##原因はbash_profileをいじってしまっていた事でした

どうやら環境変数を設定していた時に、元々の記述を削除してしまったようです。


調べたところ、同じような失敗をしている方は少なくはないようでした


色々な解決方法はありますが、自分はこのコマンドを打った後に、普段通りターミナルを使用できるようになりました。

```
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

しかし、bash_profileで消してしまったパス自体が復元されている訳ではないので、毎回このコマンドを打たなければなりません:disappointed_relieved::disappointed_relieved::disappointed_relieved:

応急処置的な処理なので、、、



参考：
https://teratail.com/questions/100827
Raspberry PiでI2Cする方法と注意点

# 概要
ラズパイでI2Cセンサモジュールとの通信をPythonでプログラミングする際に使うライブラリ2種類と，ハマってわかった注意点をログしておきます

## 環境

- Raspberry Pi 3B
- OS: Raspbian (Jessie)
- Python: 2.7.9

使ったI2Cモジュールは以下の通り

- ADT7410 (Analog Devices) 温度センサ
- AM2322 (Aosong) 温湿度センサ

# ライブラリ比較
## SMBus

webで調べるとこのライブラリを使っている例が多いですね．SMBusはSystem Management Busで，I2Cの一種とのことです．

関数の参考サイト: [Using the I2C Interface – Raspberry Pi Projects](https://raspberry-projects.com/pi/programming-in-python/i2c-programming-in-python/using-the-i2c-interface-2)
さらに関数詳細: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/i2c/smbus-protocol

### インストール

```bash
sudo apt install python-smbus
```

### 使い方
ADT7410を例に温度を読み取ってみます[^1]

```python
# ADT7410の温度読み取り
import smbus
i2c = smbus.SMBus(1) # 注:ラズパイのI2Cポート
address = 0x48
block = i2c.read_i2c_block_data(address,0x00,2) # 0x48のI2Cスレーブのレジスタ0x00から2バイト読み取る
temp = (block[0] << 8 | block[1]) >> 3
if(temp >= 4096):
        temp -= 8192
print("温度: "+temp/16.0)
```

## pigpio

I2Cに限らず，Raspberry PiのGPIO制御するのに便利な環境．バックでプログラム(pigpio)を走らせて，そこにアクセスすることでGPIOやらI2Cを使えるようにしています

Python関数参考: [pigpio library](http://abyz.me.uk/rpi/pigpio/python.html)

### インストールと準備

```
sudo apt install pigpio python-pigpio
sudo systemctl start pigpiod
```

再起動後も自動的にpigpiodを起動させるには，

```
sudo systemctl enable pigpiod
```

### 使い方
AM2322を例に温度と湿度を読み取ってみます

```python
import pigpio
import time
pi = pigpio.pi()
addr = 0x5c
h = pi.i2c_open(1,addr) # ハンドル取得
try:
    pi.i2c_write_quick(h, 0) # AM2322のスリープ解除
except:
    pass
pi.i2c_write_i2c_block_data(h,0x03,[0x00,0x04])
time.sleep(0.003)
(count, buf) = pi.i2c_read_device(h,0x08)
hum = (buf[2]*256 + buf[3])/10.0
temp = ((buf[4]&0x7f)*256 + buf[5])/10.0 * ( -1 if buf[4]&0x80 > 0 else 1 ) # tempの最上位ビット(7)が負数ビット
print("温度: {:.1f}, 湿度: {:.1f}".format(temp,hum))
pi.i2c_close(h)
```

### 注意点(ハマりどころ)
AM2322の温湿度をログするためにcronで定期的に実行させていたのですが，当初`i2c_close`を書いておらず，しばらくすると実行されなくなることがありました．
その時，単発で実行すると以下のエラーが出ます

```
pigpio.error: 'no handle available'
```
pigpioライブラリで取得しているi2c用のハンドル(上記の`h`)は32個までしか割り当てられないとのことで，ちゃんとcloseしないと枯渇することが原因だったようです．
しばらく動いてしまうので分かりにくいハマりポイントでした．

参考: https://www.raspberrypi.org/forums/viewtopic.php?t=88545


## I2Cの注意点
Raspberry Piに限りませんが，I2Cモジュールはものによって操作が結構異なるみたいなので，使うモジュールのデータシートをよく読まないとハマります（ハマりました）

### ADT7410の場合
データシートP19: http://akizukidenshi.com/download/ds/analog/ADT7410a.pdf

> Reading back from any register **first requires a single-byte write** operation to the address pointer register to set up the address of the register that is going to be read from. In the case of reading back from the 2-byte registers, the address pointer automatically increments from the MSB register address to the LSB register address.

読みたいレジスタのアドレスを1バイト書き込んだ後，2バイトの読み取り操作をします．SMBusでは複数バイトが読み取れる`read_i2c_block_data`を使いました．

### AM2322の場合
データシートP13 : http://akizukidenshi.com/download/ds/aosong/AM2321_e.pdf

ホストから "0x03" "開始アドレス" "読み取りレジスタ数" を書き込み，その後スレーブから "0x03" "レジスタ数" "実際のデータ" "CRC" が送られます．

アドレス0x00から順に湿度MSB・LSB，温度MSB・LSBの4バイトなので，"0x03, 0x00, 0x04" を書き込んだあと，8バイトの読み取りをする必要があります．
しかし，**SMBusでは書き込みと読み取り別々に行う関数が用意されていなかったため**，pigpioの`i2c_read_device`を使うことになりました．


[^1]: I2Cポートは`ls /dev/i2c*`で出てきた方の数字を使えばいいはず
2019 年コモディティ品で GPU 計算ノードを構築するメモ

## 背景

* 主にレイトレーシング(レンダリング), (画像, 音声系の)機械学習で利用
* 画面を出したりするので, 手元環境で動かす必要がある.
* アキバや ebay など, 市場調達性が高い部品で GPU 計算ノードを組みたい
* 4 GPUs(+ 1 network HBA) で考える
  * 4~8 nodes くらいでミニクラスタを組むくらいの規模

## GPU

As you wish. 

## 電源

8 pin x 2 な GPU x 4 だと, 基本 1000 W 以上の電源が必要. ケーブル数が足りるかどうか確認しましょう.
実際には powerlimit しての運用になるため, ハイエンド系 GPU も 150W くらいでの運用になるので, 実質消費電力は 750 W くらい? 

## マザーボード選定

x299 or x399 がメインストリームと考えます.

### x299

低価格帯の CPU だと 28 lanes しかないので注意. 44 lanes あるものを選びます.
しかしそれでも帯域は足りないため, 基本的には [x8, x8, x8, x8] となる(はず).

PLX スイッチで 7 lanes あるものは, PLX スイッチの出来がどうか調べる必要がある. 
x99 では問題があった https://qiita.com/syoyo/items/596355e6f285181038cb

### x399

Threadripper は CPU は 64 lanes サポートになっているが, 実質は 60 lanes + 4 lanes(チップセット用)になっている. したがって 4 GPU 挿しても x16 x 4 を実現することはできない.

こちらで試した感じでは, [x16, x8, x16, x8] となった.

## ネットワークを強化したい

オンボード 10 GbE では帯域がたりなさそうな場合を考えます.

InfiniBand QDR(40G. 一方向 3.2 GB/s) or FDR(56 G)
スイッチも HBA も ebay で安く買える.
メラノックスの場合は, HBA は Connect-X 3 以上を調達しましょう.
スイッチは InfiniScale IS5022 あたりなど(QDR 8 ports で 2 万円くらい). うるさいので注意しましょう > https://syoyo.wordpress.com/2013/05/09/silent-infiniband-qdr-switch/

IB QDR の場合, ケーブルは QSFP になります. 光は高いので銅線ケーブルになります(これも eBay で安く買える)

Gen3 x 8 だと最大一方向 8~9 GB/s ほど. 
Gen3 対応 x 2 port IB QDR HBA だと, ポートを二個管理しないといけないが 6 GB/s くらいは出るはず.
また, IB 100G(or 100 GbE) も wire rate には達しないがそれなりに速度を出せるかもしれない.


ただしネットワークを強化する場合, HBA を挿すために PCI-ex が必要になる.

x8 で 5 slots に対応するのは, PLX 非搭載では 2019 年 5 月 19 日時点では x299 OC Formula 一択である
(他はスロットがあったとしても gen2 動作だったりする). ただし x299 OC Formula はディスコンとなっている.
#python で正規表現置換の結果に変数を埋め込む例

特に気にすることなく string を扱えば ok

```
import re
some_var = "is"
```

```
re.sub(r"(Alice) (Liddell)","\\1 " + some_var  +  " \\2", 'Alice Liddell')
# 'Alice isLiddell'

```

```
re.sub(r"(Alice) (Liddell)","\\1 {is} \\2".format(**{"is":some_var}), 'Alice Liddell')
# 'Alice is Liddell'

```

```
re.sub(r"(Alice) (Liddell)", f"\\1 {some_var} \\2", 'Alice Liddell')
#  'Alice is Liddell'

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1924








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rosbagをC++で扱う

こんにちはKN_Appleです。

rosbagをC++で扱うときにはまったのでその時のメモです。
以下実行環境です。

- Ubuntu18.04
- ROS Melodic

## きっかけ
rosbagを扱うコードを検索すると出てくるのはだいたいPythonのコードでした。
確かにPythonは便利ですよね、catkin_makeなしで書いては実行ができますし。

しかし、[公式ページ](http://wiki.ros.org/rosbag/Code%20API)によると、C++のAPIも用意されているもよう。

「なるほど、やってみよう」と思い、コピペで動かしてみたけど動かず。
今回はそれを解決するところまでを残すため、記事にしました。

## 動かなかった原因
以下、動かなかった公式ページのコードです。

```bag_write.cpp
#include <rosbag/bag.h>
#include <std_msgs/Int32.h>
#include <std_msgs/String.h>

rosbag::Bag bag;
bag.open("test.bag", rosbag::bagmode::Write);

std_msgs::String str;
str.data = std::string("foo");

std_msgs::Int32 i;
i.data = 42;

bag.write("chatter", ros::Time::now(), str);
bag.write("numbers", ros::Time::now(), i);

bag.close();
```

```bag_read.cpp
#include <rosbag/bag.h>
#include <rosbag/view.h>
#include <std_msgs/Int32.h>
#include <std_msgs/String.h>

#include <boost/foreach.hpp>
#define foreach BOOST_FOREACH

rosbag::Bag bag;
bag.open("test.bag", rosbag::bagmode::Read);

std::vector<std::string> topics;
topics.push_back(std::string("chatter"));
topics.push_back(std::string("numbers"));

rosbag::View view(bag, rosbag::TopicQuery(topics));

foreach(rosbag::MessageInstance const m, view){
    std_msgs::String::ConstPtr s = m.instantiate<std_msgs::String>();
    if (s != NULL)
        std::cout << s->data << std::endl;

    std_msgs::Int32::ConstPtr i = m.instantiate<std_msgs::Int32>();
    if (i != NULL)
        std::cout << i->data << std::endl;
}

bag.close();
```

よく見ましょう。C++です。

...main関数ないやんけ！！！！
pythonに慣れすぎて気づかず１週間溶かしました。　（泣）

さらにもう一つ、bag_write.cppのコードですが、main関数で囲んでも動きません。
bag.write()の部分ですが、ros::Time::now()を使うには事前にNodeHandleを宣言するか、ros::start()を行う必要があるらしいです。（ここは詳しくないのでどなたか教えていただけるとありがたいです）

まあ、rosbagの書き込みに関してはPublisherかSubscriberのどちらかと一緒に書くのが良いでしょう。
これらを修正することで、無事C++でもrosbagの読み書きをすることができました。

## 結論

以上のの問題点を修正し、パッケージ化したものを以下のリポジトリに置きました。
使っていただけるとありがたいです。

https://github.com/nakano16180/roscpp_practice

また、間違いの指摘やPRなどあればお願いします。
DBFluteとSpring および DBFluteの記法

DBFluteがSpring上でどのように動くのか公式の記載を抜粋する。

### 公式リンク
http://dbflute.seasar.org/ja/manual/reference/diway/spring/index.html

### DIコンテナへの登録
DBFluteで自動生成されたクラスのDIについての設定が定義されたクラス。
自動生成クラスをConfigurationの対象としている。
自動生成されるパッケージのうちDIされるのはexbhvのみ。

```java:DBFluteBeansJavaConfig
@Configuration
@ComponentScan(value="com.xxx.dbflute.exbhv", lazyInit=true)
public class DBFluteBeansJavaConfig {
```

### データソースの利用

デフォルトはdataSourceというコンポーネント名で利用(Autowired?)される。
そうでない場合、プロパティ名「dbfluteBeansDataSourceName」を変更する。

```poperties:dependencyInjectionMap.dfprop
    # /- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    # o dbfluteBeansDataSourceName: (NotRequired - Default 'dataSource')
    #  The data source name that DBFlute(Behaviors) uses.
    #
    # @SpringOnly
    #; dbfluteBeansDataSourceName = exampleDataSource ★ここをいじる。
    # - - - - - - - - - -/
```
【C#】アクセス修飾子のPlantUMLでの表し方

言語はC#を想定しています。
PlantUMLでのアクセス修飾子をメモしました。

|   記号    |アクセス修飾子|
|:-------:|:----------:|
|`-`|`private`|
|`#`|`protected`|
|`# <<internal>>`|`protected internal`|
|`<<internal>>`|`internal`|
|`+`|`public`|


# 参考
- [アクセス修飾子 (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/access-modifiers)
- [pierre3のブログ](https://pierre3.hatenablog.com/entry/2015/09/11/234924#アクセス修飾子共通)
- [PlantUmlClassDiagramGenerator](https://github.com/pierre3/PlantUmlClassDiagramGenerator)
オフラインどう書く解(第一回)

問題はこちら
http://nabetani.sakura.ne.jp/hena/1/

勝ちの判定はたかだか八通りなので事実をそのまま書きました。
先手と後手の着手を別のリストに保存することにし、
新しい着手は既存の手との重複がないか調べます。
重複があれば反則負けです。
重複がなければ、勝ちパターンのリストの要素が着手のリストに含まれているか調べます。
含まれていれば、勝ちです。含まれていない場合次の着手に進みます。
九手終了後勝敗が決まっていなければ引き分けです。

```Prolog
%SWI-Prolog  version 7.4.2
%start.
%:-initialization(start). %ideone

win([1,2,3]).
win([4,5,6]).
win([7,8,9]).
win([1,4,7]).
win([2,5,8]).
win([3,6,9]).
win([1,5,9]).
win([3,5,7]).
 
solve(_,9,_,_,'Draw game.'):-!.
solve([H|_],N,W,B,R):-
     (member(H,W);member(H,B)),!,(N mod 2 =:= 0->Win='x';Win='o'),concat_atom(['Foul : ',Win,' won.'],R).
solve([H|T],N,W,B,R):-
     M is N mod 2,(M=:=0->(W1=[H|W],L1=W1,B1=B,Win='o');(B1=[H|B],L1=B1,W1=W,Win='x')),
     ((win(L2),subset(L2,L1))->concat_atom([Win,' won.'],R);(N1 is N+1,solve(T,N1,W1,B1,R))).
 
start:-str(S),split_string(S,"\n","",L),maplist(split,L,L1),pre(L1).

split(S,L):-atomics_to_string(L,",",S).
 
pre([]).
pre([[_,B,Q]|T]):-atom_chars(B,L),maplist(atom_number,L,L1),solve(L1,0,[],[],R),disp(R,Q),pre(T).
 
disp(R,A):-(R==A->Str=" pass ";Str=" fail "),write(Str),writeln(R).
 
str("1,79538246,x won.
2,35497162193,x won.
3,61978543,x won.
4,254961323121,x won.
5,6134278187,x won.
6,4319581,Foul : x won.
7,9625663381,Foul : x won.
8,7975662,Foul : x won.
9,2368799597,Foul : x won.
10,18652368566,Foul : x won.
11,965715,o won.
12,38745796,o won.
13,371929,o won.
14,758698769,o won.
15,42683953,o won.
16,618843927,Foul : o won.
17,36535224,Foul : o won.
18,882973,Foul : o won.
19,653675681,Foul : o won.
20,9729934662,Foul : o won.
21,972651483927,Draw game.
22,5439126787,Draw game.
23,142583697,Draw game.
24,42198637563,Draw game.
25,657391482,Draw game.").
```
phpspreadsheetは明示的に解放する必要がある

## 概要
* phpoffice/phpspreadsheetでは明示的に解放しないとメモリを確保しつづけるようで、特に複数のファイルを一括してバッチ処理するような場合にはメモリ使用量が急増する。
* 関数の中でローカル変数として生成したインスタンスでもメモリは解放されない。
* 解放は`disconnectWorksheets()`してから`garbageCollect()`

## 環境
* CentOS 7.6
* PHP 7.3.5
* phpoffice/phpspreadsheet 1.6.0
* テストに用いたExcelファイル https://www.mhlw.go.jp/topics/2018/04/tp20180401-01.html から、tp20180314-01_05.xls

## コードで比較
A列を全行読み出すだけの関数

```php:
function without_disconnect($xls_file) {
  $xreader = new PhpOffice\PhpSpreadsheet\Reader\Xls();
  $xls = $xreader->load($xls_file);
  $sheet = $xls->getSheet(0);
  foreach ($sheet->getRowIterator() as $row) {
    $val = $sheet->getCell("A".$row->getRowIndex())->getValue();
  }
}
```

読み出した後に解放する関数 (2行追加)

```php:
function with_disconnect($xls_file) {
  $xreader = new PhpOffice\PhpSpreadsheet\Reader\Xls();
  $xls = $xreader->load($xls_file);
  $sheet = $xls->getSheet(0);
  foreach ($sheet->getRowIterator() as $row) {
    $val = $sheet->getCell("A".$row->getRowIndex())->getValue();
  }
  $xls->disconnectWorksheets();// 追加
  $xls->garbageCollect();// 追加
}
```

## 実行して比較
上記の2つの関数を3回ずつ呼んで、メモリ使用量を出力する。

```php:メモリ使用量を出力する関数
function echo_mem($prefix='') {
  print($prefix.':');
  print(floor(memory_get_usage() / 1024).'KB'.PHP_EOL);
}
```

### 解放しない

```php:without_disconnect
$f = __DIR__.'/tp20180314-01_05.xls';
echo_mem('before');
for ($i = 0; $i < 3; $i++) {
  without_disconnect($f);
  echo_mem('without'.$i);
}
```

```text:結果
before:654KB
without0:53921KB
without1:103656KB
without2:156463KB
```

### 解放する

```php:with_disconnect
$f = __DIR__.'/tp20180314-01_05.xls';
echo_mem('before');
for ($i = 0; $i < 3; $i++) {
  with_disconnect($f);
  echo_mem('with'.$i);
}
```

```text:結果
before:654KB
with0:14973KB
with1:14973KB
with2:14973KB
```

## 追記2019-05-26 他のシートを開きたい時は解放してはいけない
`disconnectWorksheets()`した後で別のシートを開こうとしても`null`が返る。

```php
// 1つ目のシートを開く
$sheet = $xls->getSheet(0);
/* 何か処理 */
$xls->disconnectWorksheets();
// 2つ目のシートを開きたい
$sheet = $xls->getSheet(1);
var_dump($sheet); // NULL
```

## 参考
* https://gist.github.com/radityopw/4696048
AtCoder ABC125 D - Flipping Signs (400点)

#問題概要
[問題のリンク](https://atcoder.jp/contests/abc125/tasks/abc125_d)

$N$個の整数 $ A_1,A_2,...,A_N$が並んでいる。
この整数列に対して以下の操作を任意の回数行う。

操作:$1≤i≤N−1$ を満たす整数 $i$ を選ぶ。$A_i$ と $A_{i+1}$ に $−1$ を乗算する。

操作終了後の整数列を$B_1,B_2,...,B_N$とする。
$B_1+B_2+...+B_N$の最大値を求めよ。

#制約条件
- 入力は全て整数である。
- $2≤N≤10^5$
- $−10^9≤A_i≤10^9$


#考えたこと
整数列の総和を最大化したいので、正の数をできる限り増やし、負の数をできる限り減らしたい。

入力例で実験をしていく。

入力例1の場合

|初期状態 | -10 | 5 | -4 |
|:--|:-:|:-:|:-:|
| $i=1$を選ぶ | 10 | -5 | -4 |
| $i=2$を選ぶ | 10 | 5 | 4 |

この時配列の総和は $19$ となる。


入力例2の場合

|初期状態 | 10 | -4 | -8 | -11 | 3 |
|:--|:-:|:-:|:-:|:-:|:-:|
| $i=2$を選ぶ | 10 | 4 | 8 | -11 | 3 |
| $i=4$を選ぶ | 10 | 4 | 8 | 11 | -3 |

この時配列の総和は$30$でこれが最大値である。

上記の実験で以下のことが考えられる

1. 数の選び方が$i$と$i+1$であるから、左から$-1$を乗算していくのがよい。
- 1度の操作で正負を変換するのは2つの数であり、かつ$i=N-1$を選ぶことはできないため、負の数が偶数個の場合は全て正の数に変換可能で、奇数個の場合は一つだけ負の数が残る。

2番は以下のような整数列で考えるとわかりやすい。負の数は左から右に移動していく。

|初期状態 | -10 | 4 | 8 | 11 | 3 |
|:--|:-:|:-:|:-:|:-:|:-:|
| $i=1$を選ぶ | 10 | -4 | 8 | 11 | 3 |
| $i=2$を選ぶ | 10 | 4 | -8 | 11 | 3 |
| $i=3$を選ぶ | 10 | 4 | 8 | -11 | 3 |
| $i=4$を選ぶ | 10 | 4 | 8 | 11 | -3 |

さらに以下のようにどの負の数を残すかは選択可能である。

|初期状態 | -10 | 4 | 3 | -11 | -8 |
|:--|:-:|:-:|:-:|:-:|:-:|
| $i=1$を選ぶ | 10 | -4 | 3 | -11 | -8 |
| $i=2$を選ぶ | 10 | 4 | -3 | -11 | -8 |
| $i=4$を選ぶ | 10 | 4 | -3 | 11 | 8 |

よって、負の数が偶数個の場合と奇数個の場合で分けて考えるとよい。

#解答

```.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n; cin >> n;
    vector<int> a(n);
    int m = 0;
    for(int i = 0; i < n; i ++) {
        cin >> a[i];
        if(a[i]<0) {
            m ++;
            a[i] *= -1;
        }
    }
    long long sum;
    if(m%2==0) sum = accumulate(a.begin(), a.end(),0LL);
    else sum = accumulate(a.begin(), a.end(),0LL) - (*min_element(a.begin(), a.end()) * 2);
    cout << sum << endl;
    return 0;
}
```
Gitについてまとめてみた

## Gitとは
　ファイルの変更履歴を管理するためのシステムである。ちなみに、変更履歴を管理するシステムをバージョン管理システムという。


## Gitの特徴
・ファイルの変更履歴を保存できる
・過去のファイルに戻ることができる。

##GitHubとは
　GitHubとは、gitの仕組みを利用した、サービスの名前である。

## GITの基礎的な知識（用語）
####・リポジトリ
　リポジトリとは、変更履歴を保管しておく入れ物のようなもの。
　種類
　・ローカルリポジトリ
　　ローカルリポジトリとは、自分のPC上（オフライン上）にあるリポジトリで、個人で作業する際に使用。
　・リモートリポジトリ
　　リモートリポジトリとは、ネットワーク上に配置するリポジトリ、複数人で共有して作業ができる。

#### ・コミット
　ディレクトリやファイルなどの変更履歴を記録するための操作です。
　コミットでは、過去の履歴の変更履歴等や変更内容を知ることができる。

#### ・インデックス
　インデックスとは、コミットするファイルを登録しておく場所です。

#### ・クローン
　クローンとは、要はダウンロードと同じ意味で、詳しく説明すると、ローカルリポジトリを、リモートリポジトリとして保存しているということ。

#### ・プッシュ
　リモートリポジトリにローカルリポジトリを送信して、保存する。
　※この時、ローカルリポジトリで変更を記録（コミット）したあとは、プッシュをしないとリモートリポジトリに変更が反映されません。

#### ・プル
　プルとは、リモートリポジトリの中で、ローカルリポジトリに無いもの、または誰かが更新したものをダウンロードしていきます。

#### ・ブランチ
　ブランチとは、対象と全く同じフォルダやファイルを保存すること、簡単にいうと、コピーのことです。
また、最初にコミットされた際に自動で作成されるブランチは、マスターブランチといい、元締めのブランチになることが多いです。

#### ・マージ
　マージとはブランチ同士を結合することです。

##Gitで発生する問題点
#### ・競合（コンフリクト）
競合とは、複数人がそれぞれのブランチで同じ箇所を編集していた場合、Gitには、どちらのブランチの変更を優先すれば良いか判断がつかなくなります。このように、複数の人が、同じ箇所を編集してしまい、変更箇所を自動でマージ出来なくなることを競合といいます。
#####条件
・2つのブランチで同じ箇所のソースコードを編集している
・片方のブランチをマージし、もう片方のブランチを同じブランチにマージしている

上の2つの条件が重なった場合に競合が発生します。
Can't connect to local MySQL server through socket '/tmp/mysql.sock'への対処

先日デプロイした[こちら](https://tabelle.club)がいつの間にかエラーになってたので焦りました汗
ポートフォリオ用に作ったのに見れないのでは困る！

ログを確認したところ、

```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

と出ていたので/tmpを確認してみるとmysql.sockが何故か消えていたので、

```
sudo touch /tmp/mysql.sock
```

上記を実行。
これでいけるかなーと思っていたら、

```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
```

末尾の数字が変わりました。
ググると色々出てくるのであれやこれや試してみましたが、解決したのは下記の方法でした。

```
mysql_config --socket
/var/lib/mysql/mysql.sock
```

で出てきたパスを、

```config/database.yml
production:
  <<: *default
〜略〜
  socket: /var/lib/mysql/mysql.sock
```

このようにconfig/database.ymlに追記したらいけました！
ドットファイル達をGitHubにpushするスクリプト

みんな `.zshrc`とか、いったいどうやって、どこに保存しているの？

```shell:push_machine_settings
#!/bin/bash

REPOSITORY=/path/to/local/repository
FILES=(
    "/Users/ito_masakuni/.zshrc"
    "/Users/ito_masakuni/.vimrc"
)
DIRS=(
    "/Users/ito_masakuni/Desktop/misc/bin"
)

read -p "push ok? yes/[no]: " YN

if [ "${YN}" != "yes" ]; then
    exit 0
fi

mkdir -p ${REPOSITORY}/files
for f in ${FILES[@]}; do
    TARGET_DIR=$(echo ${f} | sed "s/[\/\.]/_/g")
    mkdir -p ${REPOSITORY}/files/$TARGET_DIR
    cp -v ${f} ${REPOSITORY}/files/$TARGET_DIR/$(basename ${f})
done

mkdir -p ${REPOSITORY}/dirs
for d in ${DIRS[@]}; do
    TARGET_DIR=$(echo ${d} | sed "s/[\/\.]/_/g")
    mkdir -p ${REPOSITORY}/dirs/$TARGET_DIR
    cp -vr ${d}/ ${REPOSITORY}/dirs/$TARGET_DIR
done

cd ${REPOSITORY}

read -p "commit message: " MESSAGE

git status
git add -A .
git commit -m ${MESSAGE}
git push origin master
```

1. GitHubなんかにリポジトリを作る。秘匿情報が入らないように気をつけてるけど、何となくprivateでリポジトリは作ってある。
2. 作ったGitHubのリポジトリを `/path/to/local/repository` にcloneしておく。
3. 上記のスクリプトにパスを通しておいて、`push_machine_settings` とかって名前にしておく。保存したいドットファイルやディレクトリを設定しておく。
4. `.zshrc` とか `.vimrc` とかを変更して気が向いたら、 `push_machine_settings` をたたく。
5. リポジトリが更新される。ファイルのパス中のスラッシュはアンダースコアに置換される。

---

もっとクールな方法がある気がしている。探してみたらあった。たぶんこれ。

「最強の dotfiles 駆動開発と GitHub で管理する運用方法」
https://qiita.com/b4b4r07/items/b70178e021bef12cd4a2

やってみよ。
五十嵐響子画伯AIを作る その2 ディープラーニングでオムライスを生成する

#はじめに
前回は五十嵐響子さんの絵のクラスを判別してみましたが、ちゃんとできてるのかよくわかりませんでした。今回は五十嵐響子さんの絵を生成してみようと思います。

#DCGANについて
DCGANはGANという生成ネットワークの一種です。

オリジナルのGANはDense層なのに対し、DCGANではConv層を使うことでよりよい画像が生成できるようになっています。

#実装
今回は前回用いた6つの画像をすべて使います。ラベルは無視して響子さんが描いたような絵を出すことができるようにすることを目的とします[^1]。

とはいえ、kerasでGANを実装したgithubリポジトリがあるので、それを使います。MNISTに合わせたデータに加工してそのまま使います。

[keras-GAN](https://github.com/eriklindernoren/Keras-GAN)

load_dataという関数を定義してMNISTの代わりに響子さんのサンプル画像を読ませます。

```python:追記箇所
def load_data():
    imgdir = "kyoko\\"

    xx = []
    for myimgfile in glob(imgdir + "*.png"):
        myimg = cv2.imread(myimgfile,0)
        # ret,myimg = cv2.threshold(myimg,170,255,cv2.THRESH_BINARY_INV)
        myimg = cv2.resize(myimg,(28,28))
        xx.append(myimg)
    xx = np.array(xx)

    return xx

```

[^1]: クラスラベルを指定して生成できるGANもあります（conditionalGAN）。

#結果
段々それっぽい画像が生成できるようになってきます。

10エポック
![mnist_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107045/4d50e34a-8c2c-be5a-4fdb-050085a4a147.png)


500エポック
![mnist_500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107045/306b935a-53af-ce8e-e109-311ac2ec904b.png)

1000エポック
![mnist_1000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107045/5228947f-429c-f0b7-6ba2-2cc7dda2e955.png)

1500エポック
![mnist_1500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107045/6cddb527-4101-2a58-03b6-b6c164e23b4d.png)

1990エポック
![mnist_1990.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107045/5057da04-1e04-117e-36b8-1978b5dc0861.png)

それっぽいというより**ほぼ元データ**みたいなのが多いです。データが少ないので仕方がないです。

## 損失関数
上がGenerator、下がDiscriminatorです。
![loss_1990.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107045/de0071dd-ab2d-8dbc-95e6-cb7d5ae9942b.png)

# おまけ
ケチャップオムライス風の色にしてみました。

![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107045/08057746-b70e-4b38-939a-67ff5a86a263.png)

響子さんならこんな絵を描きそうな気がする。
VB基本まとめ~列挙型・構造体・クラス編~

#列挙型(Enum)
列挙型は主に特定の値を指定して処理を分岐したり、引数の値を明確したりする場合に使用します。
型の宣言にはEnumを使用し、格納できるのは整数(Byte,Short,Integer,Long)のみで既定の型はIntegerです。
メンバに値を指定しない場合、0から順にインクリメントされて設定されます。
列挙型で宣言した変数へは通常 列挙型.メンバ を使用しますが、宣言した型の値なら直接セットすることも可能です。この場合、メンバに保有していない値でも格納できてしまうことに注意してください。

```VB
'*** 列挙型の宣言
Enum DayOfTheWeek
    Sunday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
End Enum

'*** 列挙型の使用
Dim youbi As DayOfTheWeek
'*** 設定
youbi = DayOfTheWeek.Monday

'*** 直接値を設定できるが、範囲外の値も格納できてしまう
youbi = 8
```

#構造体
構造体はメンバ変数やプロパティ、メソッドを持つ値型の定義です。
宣言にはStructureを使用します。

```VB
'*** 構造体の宣言
Private Structure Data
    Public Property Value As Integer

    Public Sub Work()
        '*** 処理
    End Sub

    Public Function IsValue() As Boolean
        Return Me.Value >= 1
    End Function
End Structure

'*** 構造体の使用
Dim wk As New Data
wk.Value = 1
wk.Work()
Dim ret = wk.IsValue
```

#クラス
クラスはメンバ変数やプロパティ、メソッドを持つ参照型の定義です。
宣言にはClassを使用します。

```VB
'*** クラスの宣言
Private Class Data
    Public Property Value As Integer

    Public Sub Work()
        '*** 処理
    End Sub

    Public Function IsValue() As Boolean
        Return Me.Value >= 1
    End Function
End Class

'*** クラスの使用
Dim wk As New Data
wk.Value = 1
wk.Work()
Dim ret = wk.IsValue
```

#クラスと構造体の違い
クラスと構造体の違いは先に書いたように、参照型か値型かの違いになります。また、クラスは使用時にNewステートメントでインスタンスを作る必要がありますが、構造体ではNewステートメントは無くても使用できます。

#クラスと構造体の使い分け
構造体とクラスはどちらも同様の使い方が出来ますが、特製の違いから使い分けが必要です。
構造体は値型の為、インスタンスのサイズが大きいとインスタンスの代入やByVal渡し、メソッドの戻り値等で使用するとデータをコピーする作業に時間がかかります。その為、インスタンスのサイズが大きくなる場合、基本的にクラスを選択するべきです。

Microsoft Docsにて[指標](https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/choosing-between-class-and-struct)が出ておりますが、この指標に沿うとほぼ構造体の出番がなくなります。ですが、標準機能でもこの指標に沿っていないものも多々あり、レスポンスを重視するシステムでは、最終的にはベンチマークをとってどちらの方が良いか決めていくようにしてください。
BrainfuckでAtcoder(1)

# BrainfuckでAtCoderを解いてみたpart.1
　タイトル通りBrainfuckでAtCoderの問題を解いてみました。BrainfuckとAtCoderの説明は5000兆人がすでにしているのでそちらをご覧ください。(BrainfuckでのAtcoderの記事もn人が書いてるじゃないか!)
### まずは問題を"解いて"みよう
　今回解いてみた問題はこちらです。https://atcoder.jp/contests/abc073/tasks/abc073_a
ABC073のA問題ですね。問題文を引用します。

> 今、日本は9月9日です。二桁の整数Nが与えられるので、十進法でNに9が含まれるか答えてください。

　一目見て解法が頭に浮かぶと思います。試しにPython3で解法を書くとこんな感じですね。
    
    N=list(str(input()))
    if "9" in N:
      print("Yes")
    else:
      print("No")
　これを提出すると通ります。やったー。
　解説もクソもないですが要するに与えられた二桁の整数に9が含まれるかどうか判定する___だけ___ですね。ではこれをBrainfuckで実装してみます。
### Brainfuckで実装してみよう
　まず整数Nが一桁だとして考えます。
　入力を受け付けます。

    ,

　はい、入力を受け付けました。それではこの整数が"9であるかどうか"を判定します。9は一桁の整数の中で最も大きいので8より大きいかそうでないかを判別します。

    ,
    >++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++ 
    <
 
    >[
      <[->>+>+<<<]>
      >>[-<<<+>>>]<<
      >[[-]<<->>]<
      -
    ]<

　これで与えられた整数が8より大きいとき、つまり9のとき、最初のポインタは1を示します。それ以外のときは0を示します。
　次に与えられた整数が9のとき"Yes"を、それ以外のとき"No"を出力させます。

    >>>>>>>>+<<<<<<<<
 
    [[-]>
      +++++++++[
      >+++++++++
      +<-]>-.<+++
      [>++++<-]>
      .<+++++++[
      >++<-]>.
    >>>>>>-<<<<<<
    <<]
 
    >>>>>>>>
    [[-]>
      ++++++++++
      +[>+++++++
      <-]>+.<+++
      [>++++++++
      +++<-]>.
    <<]

　これで与えられた整数が一桁のときにそれが9であるかどうか判別することが出来ました。
　次はいよいよ二桁の整数Nについてですが実はこれは___先ほどの処理を"No"と出力する代わりにもう一度行う___ことで出来てしまいます。
　以下に全体のコードを示します。

    ,
    >++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++ 
    <

    >[
      <[->>+>+<<<]>
      >>[-<<<+>>>]<<
      >[[-]<<->>]<
      -
    ]<

    >>>>>>>>+<<<<<<<<

    [[-]>
      +++++++++[
      >+++++++++
      +<-]>-.<+++
      [>++++<-]>
      .<+++++++[
      >++<-]>.
      >>>>>>-<<<<<<
    <<]

    >>>>>>>>
    [[-]>

      ,
      >++++++++
      ++++++++++++++++++++++++++++++++++++++++++++++++ 
      <

      >[
        <[->>+>+<<<]>
        >>[-<<<+>>>]<<
        >[[-]<<->>]<
        -
      ]<

      >>>>>>>>+<<<<<<<<

      [[-]>
        +++++++++[
        >+++++++++
        +<-]>-.<+++
        [>++++<-]>
        .<+++++++[
        >++<-]>.
      >>>>>>-<<<<<<
      <<]

      >>>>>>>>
      [[-]>
        ++++++++++
        +[>+++++++
        <-]>+.<+++
        [>++++++++
        +++<-]>.
      <<]

    <<]

これを提出すると通ります。やったね！

### おわりに
　ご覧の通りAtCoderの問題をBrainfuckで少し苦労すると解くことが出来ました。これからもBrainfuckで解いた問題があればこういった形で残そうと思います。
　Brainfuckは実際に書いてみるとプログラミング言語のありがたさが分かるものです。僕と同じくプログラミング初心者の方はBrainfuckに触れてみることで普段使っている言語に感謝の気持ちが芽生えると思います。
　最後になりましたがこの問題のBrainfuckでのshortestcodeは126Byteでした。すごいですね。僕もshortest取れるように精進したいです。
Webアプリをスマホで簡単にデバックする方法

#ことの始まり
VueでWebアプリを作っていたのですが、カメラを使用する機能が有りその動作確認をしようと思いました。
スマホで開発しているPCの`IPアドレス:8080`にアクセスしたのですが動作がうまく行かない・・・
調べると使っているnpmライブラリーがlocalhostかSSL認証下でしか動作しないとのこと・・・
いつもみたいな`192.168.〇〇.〇〇：8080`は使えないのか！？と愕然としました。
どうにかカメラの動作を確認したかったので色々調べて出来たので記事を書くに至りました。
この記事を書くきっかけとなたWebページも公開しているので良かったら試してみてください。
>[本検索アプリ](https://verse-hara.ssl-lolipop.jp/)
>本の裏側にあるバーコード（ISBN）を読み込んで本の情報を検索するアプリです。iphoneだとうまく動かないそうです😅修正をそのうちします


#ChromeのRemote Devicesを使うのが良かった。
Chromeにはスマホを接続してデバックできる機能があったようです。
やり方は以下の流れです。

- 手順１「スマホのUSBデバックを有効にする」
- 手順２「開発しているPCのクロームでデベロッパーツールを開く」
- 手順３「Remote Devicesの設定をして開く」

だいたいこんな感じです。
早速詳しくやっていきます。

##手順１「スマホのUSBデバックを有効にする」
スマホによって違うと思いますが大体のAndroidなら以下の流れで行けると思います。
「設定」->「システム」->「開発者向けオプション」->「USBデバック」
開発者向けオプションがない場合ビルド番号を何度も激推しすれば出てくるはずです。
それでも出てこない場合は型番と共にググってください。
出来たらUSBケーブルでPCと繋いでください。

##手順２「開発しているPCのクロームでデベロッパーツールを開く」
続いて開発環境のあるPCでの作業です。
Chromeでデベロッパーツールを開いて、たたまれているメニューの中から「More Tools」->「Remote Devices」を選択します。（スマホのChromeを開いておいてください）
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323051/e4a71349-cdcb-4dd4-62b5-3c4eae750b43.png)
押すとRemote Devicesのタブが開きます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323051/34df7a21-898d-16a0-5c36-3ddd6d5e15f9.png)
左の「Settings」タブの「Discover USB Devices」にチェックが入っていることを確認してください。
接続しているスマホが正しく認識されていれば左側の「Devices」に接続名が出て緑色の丸ポチがついているはずです。
Remote Devicesが開けたので設定をして、デバックをしましょう！！

##手順３「Remote Devicesの設定をして開く」
今回はVueで作っているアプリのデバックをしたいのでPCで言う`localhost:8080`にアクセスしたいので少し設定をします。
左の「Settings」タブをクリックして「Port forwarding」にチェックを入れて下の「Add rule」をクリックしてください。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323051/64bd4bb7-60c1-0ea9-ad25-c3b65f51a741.png)
そうするポートに関する設定が出てくるので設定していきます。
左側のほうがデバイス側のポート、右がローカル（開発環境）のアドレスです。
`localhost:8080`にスマホからアクセスしたいので写真のように設定するといいと思います。
設定をしたら、接続しているデバイス名のタブを開いて「New tab」に`localhost:8080`と打ち「Open」を押しましょう。そうすると下に開いたタブが追加されています。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323051/702c922a-0b2a-c305-be4a-e4c5667c0d42.png)
そして「Inspect」を押すと下の画像のようにデバック画面が出てきます！
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323051/afe1550e-a040-95c8-1e55-4d16ce5b1868.png)
こうすればスマホで操作してもPCで操作しても同じ動作をしています！！
「The Tab is inactive」と出ている人はスマホの電源が落ちている状態だと思うので電源をつけてロックも解除してください。（スマホのChromeを開いておいてください）

#まとめ
Chrome神！

#参考にさせていただいたもの
[Android 端末のリモート デバッグを行う](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/)
処理時間の計測(C#)

### はじめに
C#で処理時間を計測する場合のメモ

### ソース
System.Diagnostics.Stopwatchクラスを使用する。

```C#:Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace StopwatchSample_CS
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void Measurement()
        {
            // Stopwatchインスタンスの作成
            Stopwatch sw = new Stopwatch();

            // スタート
            sw.Start();

            // 計測したい処理

            // ストップ
            sw.Stop();

            // 計測した時間の合計を取得
            TimeSpan ts = sw.Elapsed;
            var hours = ts.Hours; // 時
            var minutes = ts.Minutes; // 分
            var seconds = ts.Seconds; // 秒
            var millisec = ts.Milliseconds; // ミリ秒

            // 計測した時間の合計をミリ秒で取得
            var millisec2 = sw.ElapsedMilliseconds;
            // 続きから計測する場合は再度Start()を呼ぶ
            //sw.Start();

            // 0から再度計測する場合はReset()を呼んだあとにStart()を呼ぶ
            //sw.Reset();
            //sw.Start();
        }
    }
}
```
[ASP.NET MVC]自動作成したView上でJQuery.uiが動かない

#ASP.NET MVCで自動作成したViewで不具合が発生
自動作成したView上でjQuery.uiのdatepicker（カレンダーのやつ）を動かそうとするとエラーを吐きました。

##原因
端的に言うと基本のjQuery→jQuery.ui→それを使ったファイルの順でインポートができていませんでした。
ASP.NETのLayout.cshtmlにはViewを自動作成した時点で末尾に< script scr="~/..."> < /script>が記述されます。
つまりcshtmlにjQuery.uiを記述すると
「cshtml末尾のjQuery.ui」→「_LayoutのjQuery」といった順番になり、うまく動作しないようです。
多分…

##解決
_Layout.cshtmlにベタ書きしました。不細工ですが、ほかにあまり使うこともないので…
下記は_Layout.cshtmlの下の部分を書き換えたものです。jQuery.uiはNugetでインストールしました。
あとはテーマをいい感じに入れれば終わりです。

```html:_Layout.cshtml
    @Scripts.Render("~/bundles/jquery")
    <script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
    <script>
        $(function () {
            $(".datepicker").datepicker();
        });

    </script>
```

```html:tes.html
<input type="datetime" class="datepicker"/>
```
Uncaught ReferenceError: jQuery is not defined

Uncaught ReferenceError: jQuery is not defined
ってエラーが発生した。

原因は
 `<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> `
をbodyの中に書いていたからであった。

https://qiita.com/naomaru/items/34a381937e75723b07c8
ChromeでAjax使用可能なショートカットを作成する【Access-Control-Allow-Origin】

## Ajaxとは
 - Ajaxとは、「Asynchronous JavaScript + XML」の略で、ブラウザ内でJavaScriptの通信機能を使って、XML形式のデータを送受信する技術のこと。 Webアプリに利用される技術で、ページの遷移がない動的なサイトを作ることができる。(wiki より )

## Ajax のメリット
- APIの動作テストを簡単に行える
-  htmlファイル一枚で実装できる
    -  Rails やFlask といったサーバー不要
- インターフェースを簡単に作成できる

## ChromeではAjaxが無効化される問題
- Chromeを通常の状態開くと、Ajax が無効化される
    - クロスドメインにアクセスする権利がないなどと怒られ、Responseを受け取ることができない

```console:Chromeなどのコンソール画面
     No 'Access-Control-Allow-Origin' header is present on the requested resource
```
- 理由：セキュリティ対策のため
    - このエラーを回避するためには、リクエスト先のサーバーで、CORS設定をする必要がある
- 本項では、サーバーの設定などの面倒な手続きなしに、回避可能な方法を紹介する

## Ajax を Chrome で使用するための設定
- 以下の方法は、Windows OSを想定しています

#### １. クロームのショートカットアイコンを右クリックし、Chrome.exeファイルの保存場所を開く

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/8f5bf0f9-9eb9-d183-bf8e-c4037b2b0425.png" width="400px">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/e3f2a9e6-4e2f-948d-a56a-b391780eb1df.png" width="400px">

#### ２. chrome.exe ショートカットを新たに作る
- ショートカットを右クリックし、プロパティを選択
- [リンク先] の文字列のお尻に、以下のコマンドを追加
- `  --disable-web-security --user-data-dir `

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/415b1774-1d34-d025-0b79-80d91acd09aa.png" width="400px">


#### ３. ブラウザを開きなおして、下のような警告が出れば成功
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/c75fc36d-ba33-3460-1abc-41a69b27e7f5.png" width="600px">

## 注意点
#### セキュリティ対策の為、Ajax 用のショートカットと、通常のブラウジング用のショートカットを別々に作っておくこと
- 普段使いでAjaxを有効にしておくと、クロスサイトスクリプティングといった攻撃に対して脆弱になるため

## 参考文献
> 【解説付き】chromeでXMLHttpRequestをローカルのファイルで行う方法
> https://qiita.com/growsic/items/a919a7e2a665557d9cf4
CloudWatchログを別アカウントに直接出力する方法

#【AWS】"CloudWatchログを別アカウントに直接出力する方法"

初めまして。pon0000です。
今回紹介するのは、掲題の通り
「CloudWatchログを別アカウントに直接出力する方法」
です。

##【実現したいこと】
本アカウントを"アカウントA"、別アカウントを"アカウントB"としたとき
「Aアカウント内の[ロググループ]（"グループX"とする）に出力されているログを、Bアカウントの[同名ロググループ]（グループX）にログ出力したい

調べてみて意外と簡単だったので、方法は以下の通りです。

##【方法】
①対象インスタンスにCloudWatchAgentをインストールし、アカウントA内の「CloudWatch」で「グループX」にログが出力されていることをまずは確認する
（この箇所は他サイトでも多々紹介されているので、詳細は省略します。私はAmazonSSMを使用してCloudWatchAgentをインストールしていましたが、別にインストールできたら他の手段でもいいと思います）

②Bアカウント内にて「IAM」ユーザーを作成（"ユーザーY"とする）し、「アクセスキー 」「シークレットアクセスキー」のIdを取得。
また先に「CloudWatch」にて同名ロググループ「グループX」を作成しておく

③Aアカウント内でインスタンスに「CloudWatchAgent」をインストールした際"common-config.toml"という設定ファイルに編集をかける

※デフォルトだと、以下に配置されている
[Linux]:/opt/aws/amazon-cloudwatch-agent/etc
[Windows]:C:\ProgramData\Amazon\AmazonCloudWatchAgent

編集箇所としては

```ruby:common-config.toml

# [credentials]
#    shared_credential_profile = "{profile_name}"
#    shared_credential_file= "{file_name}"

```
の箇所を


```ruby:common-config.toml

[credentials]　←コメントアウト外す
    shared_credential_profile = "AmazonCloudWatchAgent"　←コメントアウトを外しCloudWatchAgentをインストール、設定する際に作成した"{profile_name}"を入力※例："AmazonCloudWatchAgent"を入力。
#    shared_credential_file= "{file_name}"　←そのまま

```

に変更し保存

④Aアカウント、ログ出力させたいインスタンス内にて以下のコマンドを実行し「profile」を作成する

```ruby:[Linux]AmazonCloudWatchAgent

 aws configure --profile AmazonCloudWatchAgent
```


```ruby:[Windows]AmazonCloudWatchAgent

 aws configure --profile AmazonCloudWatchAgent
※PowerShell使用
```

⑤作成後、これに編集をかける※viコマンドなど

```ruby:AmazonCloudWatchAgent
[AmazonCloudWatchAgent]
aws_access_key_id = "ユーザーYのアクセスキーId"
aws_secret_access_key = "ユーザーYのシークレットアクセスキーId"
region = XXXXX (アカウントBのリージョン)

```

⑤Aアカウントの対象インスタンスの「CloudWatchAgent」を再起動

これで、アカウントA内にあるインスタンスのログは、アカウントBの「CloudWatch」に作成してしている「グループX」に出力されます。

##最後に
CloudWatchAgentのインストール、CloudWatchのログの出力方法（自己アカウント内）を紹介している記事を多く見かけ、さらにログの参照方法として「スイッチロール」「S3を使用したクロスアカウントでのログ出力」は見つけたのですが、
今回のような「別アカウントにログを直接出力する方法」の記事/サイトなどは少なくとも当時は見かけなかったので紹介してみました！！
※ブログ記事書いていいのかどうかのレベルの者なので、表現や方法が少し違ったときはスルーして頂けると幸いです。

では、また！！！

【参考URL】
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-first-onprem.html
Rails Tutorial（2周目）-2-

#scaffoldの生成
`$rails g scaffold リソース名 データモデルの属性`
でscaffoldが生成される

リクエストされたURLをリソースで使うコントローラのアクションに割り当てるには、ルーティングファイルに
 `resources :リソース名`と記述する。
#マイグレーション
railsではSQL命令文を書かずに、マイグレーションファイルにrubyで命令文を書くことで、マイグレーションファイルがSQL文に自動翻訳される。
`$rails db:migrate`
でマイグレーションファイルに書かれたrubyの文がSQLに変換され、データベースに変更が適用される。

#RESTとは
>RESTは、インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築するためのアーキテクチャのスタイルの1つです。REST理論そのものはかなり抽象的ですが、RailsアプリケーションにおけるRESTとは、アプリケーションを構成するコンポーネント (ユーザーやマイクロポストなど) を「リソース」としてモデル化することを指します。これらのリソースは、リレーショナルデータベースの作成/取得/更新/削除 (Create/Read/Update/Delete: CRUD) 操作と、4つの基本的なHTTP requestメソッド (POST/GET/PATCH/DELETE) の両方に対応しています。

#モデルの関連付け
1人のユーザに対して複数のマイクロソフトがあるとき

```app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
end
```
一対多の一側には、 has_many　:多のモデル名

```app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 }
end
```
一対多の多側には、 belongls_to　:一のモデル名

#herokuのデータベースを動作させる
`$heorku run rails db:migrate`