OmniAICreator/Qiita-1.07M huggingface dataset:
闇のQiitaを作ってみた｡

##闇のQiita
:[GitHub README](https://github.com/koumaza/Qiita-Darkness/blob/master/README.md):
<br>
`Requires "Stylus"`
[![install](https://img.shields.io/badge/install-v1.x.x-green)](https://raw.githubusercontent.com/koumaza/Qiita-Darkness/master/qiita-darkness.user.css)
##Gallery
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387170/a05d7105-a1a6-f329-5f52-fafff977c078.png)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387170/a4d93732-b0e0-897c-cefa-3686e0f894f0.png)](https://pornhub.com)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387170/bc535045-bf77-4170-8b22-8026509e884b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387170/89ec5658-fac0-a9c4-b39d-f894868131bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387170/7747ce3d-3184-e6fd-0300-84afe9d76ce9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387170/44353c8d-6757-5b24-5448-d4917811fb85.png)

##test
(link)
[pornhub.com](https://github.com)
[github.com](https://pornhub.com)
# [.com](https://play.casinosecret.com/ja/register)
# H₁
## H₂
### H₃
#### H₄
##### H₅
###### H₆
####### H₇()
\######## H₈(())
> blockquote: Hi
>>blockquotechan: ❤

- A
    - 1

1. A
    1. X
    2. Z
2. B

| ◯ | vs | ☓ |
|:-:|:-:|:-:|
| ◯  | ◯  | ☓  |
| ☓  | ◯  | ☓  |
| ☓  | ◯  |   |

**BOLD remove** ***BOLDITALIC cache***~~:~~ ~~`rm -rf --no-preserve-root /`~~

```shell:shell
#Warn
rm -rf /tmp/{.*,*}
chmod -R 000 /etc
```
Ubuntu18.04 イメージを取得〜USBメモリにイメージ書込み

何度やっても更新に手間取るのでメモ..

# Ubuntu18.04 イメージを取得
> [Ubuntu日本ミラーサイト](https://qiita.com/seigot/items/a88c47d52a4ad3ea351d)
> [Ubuntu 18.04.4 LTS (Bionic Beaver)](http://ftp.riken.go.jp/Linux/ubuntu-releases/bionic/)

# イメージ書込み

USBメモリを接続
diskutilで確認（今回はdisk3に割り当てられている）

```
$ diskutil list
...
/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.5 GB    disk3
   1:                 DOS_FAT_32 UNTITLED                15.5 GB    disk3s1
```

unmountする

```
$ diskutil unMountDisk /dev/disk3
Unmount of all volumes on disk3 was successful
```

ddで更新

```
$ sudo dd if=ubuntu-18.04.4-desktop-amd64.iso of=/dev/rdisk3 bs=1m
```

ejectする

```
$  diskutil eject /dev/disk3
```

# 参考
[Mac で Ubuntu 18.04 のインストールUSBメモリスティックの作成](https://qiita.com/sei1tani/items/d731d1a7165a42c0df65)
[Ubuntu 18.04 LTS (Bionic Beaver)](http://old-releases.ubuntu.com/releases/18.04.2/)
【個人開発】Vue.jsで糖質制限の情報をまとめたサイトを作った

# はじめに
こんなサイトを作りました。
https://lowcarb-recommend.com/
![toppage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296013/4a23169c-4fd6-0a69-b3c6-38d7327b9c5b.png)

3月中旬くらいにそろそろ手を出すか～とVue.jsのお勉強を始め、ゴールデンウィーク終わりごろにそろそろ何か作りたいなーと思っていた時、ちょうど自粛生活で太り気味で糖質制限ダイエットを始めていたので、それに関する情報をまとめたサイトを作ろうと思い作成を始めました。

# どんな機能があるの？
機能としては下記3点です。

1. 糖質制限食をランキングで閲覧
2. 糖質制限レシピの閲覧
3. 糖質制限に関するニュースの閲覧

1.の糖質制限食に関しては楽天市場系APIより情報を取得し、ショップごと、もしくはジャンルごと(パンや麺類など)で検索をかけられるようにしました

2.の糖質制限レシピについては、これも楽天レシピ系APIより情報を取得しています。

3.のニュースに関してはGoogle NewsよりRSSを取得しています。

# 環境
* Java
* Spring Boot
* Vue.js(Vue Router、Vuex、Vuetify)
* Swiper.js
* Heroku
* Mongo DB
* Netlify

もともとはVue.jsを使いたかったためフロントエンドは確定として、バックエンドはどうしようかなーと思ってたのですが、全部が慣れていないものだと作るのに時間がかかる→最後まで作り切れなさそうと少しビビっていたので業務で使っているJavaを選びました。

# 製作期間
* 2か月

バックエンドは、仕事で使っているJavaということもあり、2週間足らずで終わらせることができました。
フロントエンドについては、学び始めたばかりのVue.jsということもあり、1か月半かけて調べながら完成させました。

# 苦労したところ
下記に、苦労した点と参考にさせていただいたものをまとめます。

## ニュース情報をどう集めるか
当初はニュース関連のサービスでよく使われているであろう[News API](https://newsapi.org/)を使おうと思ってました。
しかし、9割9分自分の使い方がまずかったと思うのですが、うまく糖質制限に関する情報を取得できず、代替案を考えていたところ、Google NewsよりRSSを取得する方法を見つけたので、それに切り替えました。

Google News RSSを取得する方法は下記を参考にさせていただきました。
https://qiita.com/KMD/items/872d8f4eed5d6ebf5df1
http://mogakana.blogspot.com/2011/05/javarss.html


## Swiper.jsの使い方
「TOPページになにか動くの導入してやろ～」と思いいろいろ調べてみると、当ライブラリに出会いました。
トップページに写真の上にキャプションをうまく載せられなかったり、うまくレスポンシブにできなかったりといろいろ思考錯誤しました。

Swiper.jsに関しては下記を参考にさせていただきました。
https://qiita.com/whike_chan/items/c68e094f412b04b1afc2
https://github.surmon.me/vue-awesome-swiper/
https://www.kabanoki.net/4783/

## PWA化
開発も終盤にかかってきたところ、せっかくだしPWA化して「ホーム画面に追加」って出るとかっこいいなと思いいろいろ試したがなかなかLighthouseでOKにならない。
コンソールを見てみると下記エラーが出てました。

```console:console
Site cannot be installed: no matching service worker detected. You may need to reload the page, or check that the service worker for the current page also controls the start URL from the manifest
```
さらに「bad-precaching-response」のようなエラーも出ていました。
Netlifyのデプロイ時に置いている_redirectsファイルのキャッシュを更新しようとする→そんなファイル無いぞと怒られるのが原因みたいだったため、下記サイトを参考にキャッシュ対象から除外しました。

vue.config.jsに下記を書くことで解決しました。

```vuejs:vue.config.js
module.exports = {
  //省略
  pwa: {
    workboxPluginMode: 'GenerateSW',
    workboxOptions: {
      exclude: /_redirects/
    }
  }
}
```

下記サイトを参考にさせていただきました。
http://t-kuni.sub.jp/2020/06/12/pwa%e3%81%a7%e6%96%b0%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%97%e3%81%a6%e3%82%82%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%81%8c/#%E7%B5%90%E6%9E%9C

https://michimani.net/post/programming-build-pwa-with-vuejs/

# 教訓
開発中、大枠は1か月くらいでできた(つもりだった)ため、もうすぐ終わるだろうと思っていたら、結局2か月かかってしまいました。
細かいところで修正したいところがたくさん出てくるんですよね、、開発しながら下記故事成語があったな～と思いだしたので、今後開発するときはこれを頭に入れておいて、「9割終わったと思うけど多分まだ5割なんだよな～」と思っておくと気が楽になるかもしれません、、

> 百里を行く者は九十を半ばとす
https://imidas.jp/proverb/detail/X-02-C-27-8-0010.html

# おわりに
いろいろ書きましたが、ぜひ使ってみてください！
[ロカボのススメ](https://lowcarb-recommend.com/)
【PHP】DateIntervalクラスで、あさってが「１日差」になっちゃった！？

# 環境
CentOS 7.6
PHP 7.1.20

# 現象
ＰＨＰの [DateInterval クラス](https://www.php.net/manual/ja/class.dateinterval.php) は、
今日が 2020/01/01 とすると、2020/01/03 との日数差が
なぜか「１」で返る場合があります（２が欲しいのに。）

```php
$date1 = new DateTime();             //今日
$date2 = new DateTime('2020-01-03'); //あさって
$diff = $date1->diff( $date2 );

echo $diff->days;  // 1
```

# 原因

今日の `$date1 = new DateTime();` に現在時刻が含まれているからです。
その分、日数差が２日に届かず、１日となっているようです。

例えば 現在時刻をクリアすれば、期待する「２」が得られます。

```php
$date1 = new DateTime();
$date1->setTime(0,0,0);  //時刻クリア

$date2 = new DateTime('2020-01-03');
$diff = $date1->diff( $date2 );

echo $diff->days; // 2
```

余談ですが、[DateTime::diff](https://www.php.net/manual/ja/datetime.diff.php) のマニュアルには、
英語コメントに同様の記述がありました。

# 参考

[PHPのDateTimeで日付差分を得る時は、dではなくdaysを使う。](https://qiita.com/murapon/items/5c76a30b374237d96d2e)
MaixCubeでSdFatを使う

# はじめに

MaixシリーズのArduino開発環境MaixduinoにもSDカードドライバーは含まれていますが、ロングファイルネームに対応していないようです。SdFatライブラリーを使ってみましょう。

# SdFat

オリジナルは[Arduino SdFat Libary](https://github.com/greiman/SdFat)です。USE_STANDARD_SPI_LIBRARYの指定で動作しました。

```c++
USE_STANDARD_SPI_LIBRARY 1
```

# サンプル

```c++
#include <Arduino.h>
#include <SPI.h>
#include <SdFat.h>  // https://github.com/greiman/SdFat

SPIClass SPI_0(SPI0);
SdFat sd;

const uint8_t SD_CS = SS;   // chip select for sd

//------------------------------------------------------------------------------
// print error msg, any SD error codes, and halt.
// store messages in flash
#define errorExit(msg) errorHalt(F(msg))
#define initError(msg) initErrorHalt(F(msg))
//------------------------------------------------------------------------------

void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println("SdFat_ListDir");

  if (!sd.begin(SS, SPISettings(20000000U, MSBFIRST, SPI_MODE0))) {
    sd.initError("sd:");
  }

  sd.ls(LS_DATE | LS_SIZE | LS_R);

  //File read
  Serial.println("");
  Serial.println("SdFat_Reading...maixpy.bin");

  int size = 0;
  uint8_t buff[1024];
  File f = sd.open("maixpy.bin", O_READ);
  while (f.available() > 0) {
    int bytes = f.readBytes(buff, 1024);
    size += bytes;
  }
  f.close();
  Serial.printf("total = %d\n", size);
}

void loop() {
  sleep(1);
}

```

ロングファイルネームが使えました
Ubuntu日本ミラーサイト

公式サイトからだと1時間掛かるところ、ミラーサイトからだと10分未満でダウンロードできた

http://ftp.riken.go.jp/Linux/ubuntu-releases/ (理化学研究所)
http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/ (北陸先端科学技術大学院大学)
http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/ (KDDI研究所)
http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/releases/ (山形大学)

# 参考
[https://www.ubuntulinux.jp/community](https://www.ubuntulinux.jp/community)
[Ubuntu 18.04 LTSの「ヤバイ不具合」まとめ](https://linuxfan.info/ubuntu-18-04-issues)
Linuxのリダイレクト vol.2

この前の続き


###標準入力、標準出力、標準エラー
Linuxではデフォルトで以下のように割り振られている。
・標準入力→0
・標準出力に→1
・標準エラー出力→2

####実際にやってみよう

標準エラー 
①　標準エラー　aaaというファイルがないということ
`[root@taki ~]# ls aaa > test_File.txt
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません`

②　`ls aaa`の標準エラーを`Test_File.txt`に出力
[root@taki ~]# ls aaa 2> Test_File.txt

③　`Test_File.txt`を確認
`[root@taki ~]# cat Test_File.txt
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません`


おまけ
①testfile.txtディレクトリ作成→test.txtファイル作成
`[root@taki ~]# mkdir testfile.txt
[root@taki ~]# ll
drwxr-xr-x. 2 root root    6  6月 26 14:09 testfile.txt 
[root@taki ~]# cd testfile.txt
[root@taki testfile.txt]# ll
合計 0
[root@taki testfile.txt]# touch test.txt
[root@taki testfile.txt]# ll
合計 0
-rw-r--r--. 1 root root 0  6月 26 14:10 test.txt`

②test.txtにaaaa bbbb cccc test 書き込み→testのみ呼び出し
`[root@taki testfile.txt]# cat test.txt
[root@taki testfile.txt]# 
[root@taki testfile.txt]# vi ettest.txt
"test.txt" 0L, 0C~                                                                               ~                                                                                                                                                             ~                                                                               ~                                                                               ~                                                                               -- INSERT --aaaabbbbcccctest:wq"test.txt" 5L, 21C written
[root@taki testfile.txt]# cat test.txt
aaaa
bbbb
cccc
test
[root@taki testfile.txt]# grep "test" < test.txt
test`


③終了文字
「<<」の後の文字を入力すると、自動に入力が終わる
`[root@taki testfile.txt]# cat <<"E0F"> test.txt
testfiletesttext
testoutput
E0F`

④確認
`[root@taki testfile.txt]# cat test.txt
aaaa
bbbb
cccc
test
testfile
testtext
testoutput`

⑤sample呼び出し→error失敗
`[root@taki testfile.txt]# echo sample
sample
[root@taki testfile.txt]# ls error
ls: error にアクセスできません: そのようなファイルやディレクトリはありません`

⑥ `>& dev/null`を使うと呼び出せない
`[root@taki testfile.txt]# echo sample >& dev/null
-bash: dev/null: そのようなファイルやディレクトリはありません`


最後のまとめはまた今度にしよう。
コマンドは長いと見にくいから写真がいいな。
Google Apps Scriptで(自作の)LINE公式アカウントからメッセージ・画像を発出する

# きっかけ
自身で運用しているLINE公式アカウントについて、GoogleAppsScriptのプログラムコードからメッセージや画像を発信できれば、定期的にメッセージをつぶやいたり、プログラムで計算した値を含めたメッセージを出せたりして便利なので実装しました。

# 方法
LINE公式が公開しているMessaging APIの該当URLにJSONデータを送信します。（公式リファレンス → [Messaging API | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/) )
今回使ったのは、[ブロードキャストメッセージを送る](https://developers.line.biz/ja/reference/messaging-api/#send-broadcast-message) の記載の部分です。
ここで定められているAPI仕様に合わせてGoogleAppsScript側でHTTPリクエストを作成し送信します。

#作成したコード
以下、完成したコードです。

```javascript
//テキスト、画像のURLを受け取りLINE公式チャンネルから通知するメソッド
// @param { String } message 通知する文字列
// @param { String } image_url 画像のURL
// @param { String } token LINE公式チャンネルのアクセストークン(APIで発行できる)

function pushLineOfficialAccount(message, image_url, token) {
  //LINE APIへ送信する用のデータ形式を作成
  let text_data = (message ? { "type": "text", "text": message } : undefined);
  let img_data = (image_url ? { "type": "image", "originalContentUrl": image_url, "previewImageUrl": image_url } : undefined);
  let data = [text_data, img_data].filter(v => v);  //LINEで通知するデータの配列(空要素は除去)

  if (data.length == 0) return -1;//データが空なら送信せず終了

  let options = {
    "method": "post",
    "contentType": 'application/json',
    "headers": { "Authorization": "Bearer " + token },
    "payload": JSON.stringify({ "messages": data })//オブジェクトをJSONに変換
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/broadcast", options);//LINEのAPIにPOSTで送信
}
```
使用例はこんな感じです。

```javascript
//(1)文字列と画像を通知
pushLineOfficialAccount("通知されるテキストです", "https://.../hoge.jpg", "XXXチャンネルアクセストークンXXX");
//(2)文字列のみ通知
pushLineOfficialAccount("通知されるテキストです", null, "XXXチャンネルアクセストークンXXX");
//(3)画像のみ通知
pushLineOfficialAccount(null, "https://.../hoge.jpg", "XXXチャンネルアクセストークンXXX");
```
この自作メソッドは、メッセージテキストと画像URLの2個を引数にとっており、両方の引数に有効な値を渡した場合は「テキスト → 画像」の順に通知する仕様です。
ちなみに今回はテキストと画像で多くとも2個のデータを送信していますが、APIリファレンスによると一回のAPI送信で最大5個のデータを同時に送信できるとのことです。

#まとめ
GoogleAppsScriptは、スプレッドシート等と連携でき、スケジューラ設定による定期実行もできます。今回作ったメソッドで、GoogleAppsScript側で何かしら定期的な計算を行い、その結果を自動的にLINE公式アカウントから通知、というような応用アプリができると考えています。
今後もGoogleAppsScriptは色々試していき、Tipsを投稿していきたいと思います。
Macでzshをデフォルトで使えという警告を非表示にする

<!-- Macでzshをデフォルトで使えという警告を非表示にする -->

# 以前まで表示されなかった警告が発生

macOS Catalinaにアップデートしてから、bashを起動すると以下のメッセージが表示されるようになった。
(デフォルトでfishを使用しています)

```
ymmmtym@localhost ~> bash

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.

ymmmtym@localhost:~$
```

## 解決方法

結論からいうと、~/.bashrcに以下を追記することで解決できた。

```shell:~/.bashrc
export BASH_SILENCE_DEPRECATION_WARNING=1
```

## 警告メッセージについて

警告メッセージで素直に表示されたサイト(<https://support.apple.com/ja-jp/HT208050>)にアクセスしてみる。

> macOS Catalina から、Mac は zsh をデフォルトのログインシェルおよびインタラクティブシェルとして使うようになります。それ以前のバージョンの macOS でも、zsh をデフォルトにすることができます。

zsh以外を使用すると、警告メッセージが表示される仕様になっているらしい。

## おまけ

Macの場合だけ、bashのバイナリファイルが少し違うみたいです。

### Ubuntu16.04の場合

```
ymmmtym@ubuntu16.04:~$ strings /bin/bash |grep BASH_SILENCE_DEPRECATION_WARNING
ymmmtym@ubuntu16.04:~$
```

### Mac(macOS Catalina)の場合

```
ymmmtym@localhost:~$ strings /bin/bash |grep BASH_SILENCE_DEPRECATION_WARNING
BASH_SILENCE_DEPRECATION_WARNING
ymmmtym@localhost:~$
```
Laravel開発用のDockerイメージできたのでシェアします。

これからLaravelを使って開発とかしていく予定だったので、すぐにスタートできるようにDockerでイメージ作りました。
同じ環境で開発してる方など、よかったら持ってってください。

https://hub.docker.com/r/ryuki0529/webserver

##大まかなイメージ環境
- OS：CentOS 7.8
- サーバー：Apache 2.4.6
- PHP 7.4.7
- PHPMyAdmin 5.0.2
- Composer 1.10.7
- Laravel Installer 3.1.0
- Git 2.9.5
- データベース：mysql Ver 15.1 Distrib 10.4.13-MariaDB

##注意点
`docker run`でコンテナ作るときに、`--privileged`と起動時のコマンドで`/sbin/init`を指定しないと`systemctl`コマンド周りが使えないので注意です。これで３時間ほどハマってしまいました。

詳しくは下記の記事で説明されてます。
[CentOS7のコンテナでsystemctlを使うための方法](https://qiita.com/Targityen/items/6e80b855b79d521412f0)

ということで、最終的にコマンドは以下になります。

```docker
docker run -itd -p 80:80 --privileged webserver:1.0.2 /sbin/init
docker exec -it webserver /bin/bash
```
実際に開発とかやり始めるときはVS Codeとかでファイル編集しつつ、作業フォルダーマウントする感じだと思います。
なので基本的にはこっちかな。

```docker
docker run -v '{マウント元のフォルダー}:{マウント先のディレクトリー}' -itd -p 80:80 --privileged webdevs-main:latest /sbin/init
#自分の場合はこんな感じ。
#docker run -v 'K:/docker develop/mounts/webdevs-main:/var/www/html' -itd -p 80:80 --privileged webdevs-main:latest /sbin/init
```
[Rails] ヘルパーメソッドform_withについて[基礎]

学習中に理解が浅かったところなのでアウトプットしながら整理したいと思います。
基礎から丁寧に書いていきます。もし指摘あればお願いいたします。

##ヘルパーメソッドとは
そもそもrailsでは、viewでHTMLタグを出現させたりテキストを加工するためのメソッドが予め用意されています。これらをヘルパーメソッドといいます。
form_withはヘルパーメソッドの一種です。

＊ヘルパーメソッドの一例
ヘルパーメソッド	使用用途
form_tag	投稿ページなどにおけるフォームの実装
link_to	　　　　　リンクの実装
simple_format	投稿した文章を自動で見やすく整形する
submit_tag　　　 submit機能をつけたいときに使う。
text_field_tag
などなど、、
自作することも可能らしいです。
【参考記事】
https://qiita.com/Yukaaaah/items/19e524fd0c0e4a3451f1


##form_withについて
Rails 5.1というバージョンから推奨されているフォーム実装のためのヘルパーメソッドです。
form_tag/form_forは非推奨となっているらしいです。（この2つのメソッドについては説明を省略します。）

```.erb
<!-- form_tagを使用した例 -->
<%= form_tag('/posts', method: :post) do %>
  <input type="text" name="content">
  <input type="submit" value="投稿する">
<% end %>
```

```.erb
<!--form_withを使用した例-->
<%= form_with model: @post, local: true do |form| %>
  <%= form.text_field :content %>
  <%= form.submit '投稿する' %>
<% end %>
```

form_withの特徴としては、
①自動でパスを選択してくれて、HTTPメソッドを指定する必要が無いこと
②コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できること（上記では@postがそれに該当）

またこの場合は、
①新規投稿の場合
②既存の投稿を呼び出した場合
で処理が変わってきます。

##①新規投稿の場合
```posts_controller.rb
def new
  @post = Post.new
end
```

投稿ボタンをクリックしたらcreateアクションに送られます。

```new.html.erb
<%= form_with model: @post, class: :form, local: true do |form| %>
  <%= form.text_field :title, placeholder: :タイトル, class: :form__title %>
  <%= form.text_area :content, placeholder: :ブログ本文, class: :form__text %>
  <%= form.submit '投稿する', class: :form__btn %>
<% end %>
```

##②既存の投稿を呼び出した場合
```posts_controller.rb
def edit
  @post = Post.find(params[:id])
end
```

```edit.html.erb
<%= form_with model: @post, class: :form, local: true do |form| %>
  <%= form.text_field :title, placeholder: :タイトル, class: :form__title %>
  <%= form.text_area :content, placeholder: :ブログ本文, class: :form__text %>
  <%= form.submit '投稿する', class: :form__btn %>
<% end %>
```
投稿ボタンをクリックしたらupdateアクションに送られます。

##まとめ

比較してみるとnew.html.erbとedit.html.erbのフォーム部分は同じです！！！
そのためフォーム部分を部分テンプレート化できて記述量を減らせます。
モデルの@postの中身があるかどうかで自動で判断して送ってくれるのです。

このほかにも 
例えばform_with model: [@￰post, @￰comment]のように複数モデルを渡すことができます。
それは別記事で書ければと思います、、
IISサーバのlocalhostにディレクトリを追加する

#記事一覧
[Visual StudioのASP.NET Core MVC で Web アプリを作成してみた（記事一覧）](https://qiita.com/yuta-sasaki/items/31307b88f7234b92f728)

#localhostのルートディレクトリ
IISのルートディレクトリは、「C:\inetpub\wwwroot」となる。
そのため、http://localhost/ にアクセスした場合、ルートディレクトリ上の「iisstart.htm」が表示される。

#IISのlocalhostにディレクトリを追加する
IISのルートディレクトリに任意のディレクトリ「IIS_Page」を追加して、任意のHTML「index.htm」を追加する。
C:\inetpub\wwwroot\IIS_Page\index.htm

```html:index.htm
<html lang="ja">
<head>
<title>Tabに表示されるタイトル</title>
<meta charset="UTF-8" />
</head>

<center>
<h1>rainのページ </h1></center>
<hr>
</center> 
</body>

</html>
```

#追加したディレクトリにアクセスする
http://localhost/IIS_Page/ にアクセスすると、配置したHTMLが表示される。
<img width="599" alt="追加したディレクトリにアクセスする.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362635/ffd4a1c7-410a-9f69-b612-2f4c7f506750.png">
railsの命名規則（controller、model）

# controller

「コントローラの命名規則」
https://railsguides.jp/action_controller_overview.html#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%AE%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87

- controllerの命名はresourcesにするならそれに合わせて複数形にするとrouteを合わせやすい

# model

modelは基本単数形
App Center の User API token を準備する

#はじめに

App Center を Pipelines から利用するには『User API token』を準備する必要があります。

#User API tokens

User API token の発行は右上のアイコンの『Account Settings > User API tokens』から行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/acf23410-c080-d016-db19-e7678d3f8a36.png)

『User API tokens』の画面から『New API token』を選択してトークン作成画面を開きます。
Description にはトークン名を指定して、Access は『Full Access』を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/fee5b0fa-dc72-2d63-d47f-b6e51419fcde.png)

すぐにトークンは発行されますので、これをコピーして利用します。
ただし、この画面を閉じるとトークンは二度とコピーできませんので、忘れてしまった場合はもう一度トークンを作り直す必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/69b2e5a1-8dca-6f87-bdb2-37c92de7c9d3.png)


#注意点

この API トークンですが App Center には…

- App API token
- User API token

の二種類があります。
もちろん、それぞれ別のトークンですので、最初は『App API token』を利用して認証が通らなかったです。
すぐに『User API token』の存在に気づいたのでそこまで問題にはならなかったのですが、ちょっと引っ掛けですので注意してください。

#おわりに

トークン自体は特に問題なく作れると思います。
『App API token』と『User API token』さえ間違えなければ…。
Railsのdevise導入でdefault_url_optionsの設定でハマった

#deviseのユーザー認証設定
デフォルトの場合以下のように`config.action_mailer.default_url_options`で`{  host: 'localhost', port: 3000 }`と設定されると多います。

```development.rb
  # default url
  config.action_mailer.default_url_options = {  host: 'localhost', port: 3000 }
  # mail setting
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => 587,
    :user_name => Rails.application.credentials.gmail[:user_name],
    :password => Rails.application.credentials.gmail[:password],
    :authentication => :plain,
    :enable_starttls_auto => true
  }
```

その場合認証メールで送られてくるURLは`http://localhost:3000/users/confirmation?confirmation_token=-XiHyA_1xCxhk846ae9G`
みたいな形になる思います。

Dockerでrootディレクトリが3000ポートを付けない形で構築したのでポート番号がない形でURLを作成しなければいけないので以下のように設定を変更しました。

```development.rb
config.action_mailer.default_url_options = {  host: 'localhost' }
```
#URLが変更されない
本来であれば`http://localhost/users/confirmation?confirmation_token=-XiHyA_1xCxhk846ae9G`のような形でURLが生成されるはずがされず数時間ハマりました。

##結論
Dockerの再起動で反映された。

Web開発をしていると常にハマるポイントがありますが、再起動で動くことが多々あるので「ハマったら再起動してみる」ということをもっと心がけて行きたいです。
LINEBOTを使ってオーキド博士を作った話

# はじめに
LINEのMessagingAPIを使って何か作成したいなと考えていたところ、
友人がポケモンにハマっているという話を聞いて、ポケモンの検索やランダムでポケモンを取得し、種族値合計で他のユーザと対戦するようなものを作成しようと思いました。

作成したBOTは↓のURLから追加できます。ぜひお試しください！
[lin.ee/zmHQYl6](https://line.me/R/ti/p/%40655ntiqn)

# 環境

* サーバー（２台構成）
    * APサーバー（Nginx）
    * DBサーバー（PostgreSQL）
* 作成言語
    * Java（Spring Boot）
    * Messaging API（API）

# できること
* ポケモン検索
    * 図鑑番号検索
    * ポケモン名検索（LIKE検索）
* ランダム取得
    * ランダム取得（１体）
    * ランダム取得（６体）
* 種族値合計ランキング
    * 歴代ランキング
    * 月間ランキング
* すばやさ確認
    * 作成中

# 完成形
* ポケモン検索
    * 図鑑番号検索
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372052/a9a80619-cb47-0a08-842d-fc2808da8cf4.png)

    * ポケモン名検索（LIKE検索）
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372052/98ebe6dd-008a-f829-48d5-2f38f30f5dca.png)


* ランダム取得（１体）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372052/86f55b6a-eb5a-cf5b-176c-b74f8695d6ae.png)


* ランダム取得（６体） + ランキング
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372052/d88c2a02-ccd2-4a8b-50ef-af305972fa8d.png)

# 素晴らしい機能
**FlexMessage** という機能が素晴らしかったです。（今回の検索結果の表示等に使っている機能）
レイアウトについては[FLEX MESSAGE SIMULATOR](https://developers.line.biz/flex-simulator/)で簡単にそれっぽく作成できます。

# 最後に
Messaging APIをつかったLINEBOTの作成についてはLINEの公式ドキュメントが充実しているので特に詰まってしまうような箇所はありませんでした。
簡単にできるのぜひ皆さんお試しください。

# 参考にしたサイト
[Messaging APIリファレンス](https://developers.line.biz/ja/reference/messaging-api/#filler)
駆け込みAZ103

## はじめに
今更ながら、AZ-103を受験し合格しました。

新入社員依頼、あまり資格学習をしていなかったのですが、コロナ禍でできた時間を生かして、これまで興味はあったのですが、後回しにしていた学習をやってみました。

同じように、学習に励んでいる方も多いのではないでしょうか。そんな方に少しでも参考になればと思い、本記事を書いてみます。

ただ、試験の傾向や学習方法は、既に十分な情報があるかと思います。
今回はできるだけ楽をして資格だけ取りたいという私みたいな人向けに以下のポイントを書きます。
- 最小コストを意識して事前調査した内容
- 受験時に感じたこと、ポイント


## 最小コストを意識して事前調査した内容
普段、実業務ではシステムの実装よりも、上流の計画、設計、課題管理が主となります。
そのため、実装スキルよりもサービスの全体感の知識を体系的に習得することを目標としました。

- AZ104が提供されていますが、2020年6月27日現在では、英語のみのようでした。
- 取得する資格自体は変わらないし、デメリットを感じなかったのでAZ103を受けることとしました。
- MCP受験料、地味に高いです。2万円という額は20代のエンジニアにとっては地味にきついと思います。
- 今回、Build2020にタダで参加できて、いくつかの条件を満たすとバウチャーがもらえました。
- 私の会社と同じように、合格時のみ受験料を負担してくれる会社の場合、このような機会を活かすのもいいと思います。
- 入門のAZ900や、IoTとかでもちょいちょいバウチャー付きの無料セミナーを見かけます。
- 学習したこととしては、AZ103の受験ページの下部のMSlearnの内容を2割くらいやりました。

- 事前知識としては、
- 運用環境ではない環境に適当にVMたてたり、素人程度
- IaaS利用のリスク把握のために、IaaS VNETやNSG、AzureADとMFA周りはある程度使用を理解し、実装したこともあった。
- 上記、ある程度理解している自信がある部分は、MSlearnをざっと見、大項目、キーワードを拾いつつ、知らないワードはちゃんと読む。
- ラボ問題も似たような操作やったことあるのは飛ばしながら。
- 設問はちゃんと解く。わからないことは戻って調べる。

- あと、実運用をやってないので、サブスクリプションの管理やバックアップの知識がなかったので、この辺りは個別の設問もやりました。
- ただ、あまりコツコツ読んでても頭に入ってこないところもあり、結局ざっと見でやってたところも多いです。

## 受験時に感じたこと、ポイント
他の方も言ってますが、VNET、NSGは結構でます。ここちゃんと理解してないときついです。ただ知識量としては大したことないので、勉強時間はそんなにかからないと思います。

RecoveryService関連も結構でたのですが、全然わからなかったです。知識としてざっと見で読んでも、実運用の観点をもってない私にとっては見逃してしまうところなんだと思います。

あと、知識がなくてもちゃんと読めばわかる問題も多いです。
Azureのサービスは基本的にツリー構造にどうせなってて、ポリシーは下位に継承されるだろうとか、
最後2択で迷ったら、自分ならこういう操作するときこうできないと困るなぁとかで解いていきました。

試験時間は、3時間です。私の場合開始10分で腹痛に襲われました。我慢しながら進めることもできたのですが、一度係りの人にお願いして、トイレ退席をしました。試験時間は止められないですが、時間は十分あり、15分位ロスしても1時間くらいはあまりました。結果としては、その後落ち着いて設問を読めたことの利点の方が大きかったです。


## まとめ
結果としては、772点で割とギリギリなので、あまり参考にならないかもですが、以下のようにまとめます。

- VNET、NSGは大事。ちゃんと理解しよう。
- サービスの特徴を理解しよう。サービスはリソースを管理しやすいように作られてるので、管理する視点で特徴を捉えよう。
- 時間は十分あるので、読みづらい日本語にも負けずに落ち着いてしっかり読もう。
C++でCairoやろうぜ！Cairomm入門 (0) 環境構築/ビルド


Cairomm、やろうぜ！

**注意 : この記事は UNIX/Linux 系OSでのビルドを想定しています。**
Windowsではできないかもしれません。Macでは知りません(が、参考にはできるはずです)。

# 概要

C製描画ライブラリCairoのC++ラッパー、Cairommの日本語入門帳かつ個人的備忘録です。
Cairoは環境や用途に依存しない使い方ができて、実際画像/PDFビュワーやウインドウアプリケーション等、結構色んな所で採用されています。あなたにも是非触ってみてほしい！

では、まず環境構築/ビルドからやろうぜ。

# 環境構築

2つ方法があります。

### 1.makeを使う

ほやほやの最新版をインストールできます。

1.まず、cairo公式サイトにアクセスし、ダウンロード/解凍しましょう。
https://www.cairographics.org/cairomm/
(ダウンロードページは : https://www.cairographics.org/releases/ 上記URLから探してね)

2.コンソールで解凍ファイルにカレントディレクトリを移し、ディレクトリ内の`INSTALL`ファイルを参考にしながら作業をしていきます。
全文は長すぎるのでここでは省略しますが、簡単な流れとしては

```
$ ./configure
$ make
$ make install
```
となります。まあテンプレですかね...


### 2.パッケージマネージャからインストール

apt等のパッケージマネージャを使えば、いとも簡単にインストールできます(最新版ではないことがしばしばですが...)

例えばUbuntuなら...ほい！

```console
$ sudo apt install libcairomm-1.0-dev
```

# 早速やってみようぜ

とりあえず動作確認済だけでもしましょう。

下のコードをコピー&ペーストしましょう。

```cpp:cairomm_test.cpp

#include <cairomm/context.h>
#include <iostream>

int main(){
    Cairo::RefPtr<Cairo::ImageSurface> surface = 
        Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, 300, 300);

    Cairo::RefPtr<Cairo::Context> cr = 
        Cairo::Context::create(surface);

    surface->write_to_png("cairo.png");

    std::cout<<
        "Hello, World!"
            <<std::endl;
}
```

これを次のようにコンパイルします。

```console
$ [cc : g++,clang etc...] [source file] -o [executive file] `pkg-config --libs --cflags cairomm-1.0`
```

```console:例(文中の'`'を見落とさないで！)
$ g++ cairomm_test.cpp -o cairomm_test `pkg-config --libs --cflags cairomm-1.0`
```

多くのライブラリをリンクするために、本来はもっと長いコマンドを記述しなければならないところなのですが、`pkg-config`を使うことで上記のようにバッサリと省略することができます。便利。

では、コンパイルしてできた実行ファイルを実行しましょう。

```console:output
> Hello, World!
```

この時カレントディレクトリ内に、300x300の全ピクセル透明のPNG画像 `image.png`が保存されていれば成功です。

# ...終！(内容控えめだったかも)

では、次回からはCairommの描画関数の使い方を説明していきます。

次 : [C++でCairoやろうぜ！Cairomm入門 (1) 基礎的な関数](https://qiita.com/Perukii/items/5caf86ca5274e9f98e80)
IISサーバにドメインを設定する

#記事一覧
[Visual StudioのASP.NET Core MVC で Web アプリを作成してみた（記事一覧）](https://qiita.com/yuta-sasaki/items/31307b88f7234b92f728)

#ドメインを設定する
テキストエディタを管理者権限で開き、下記のファイルを編集する。
C:\Windows\System32\drivers\etc\hosts

```
# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost
192.168.**.*    rain.com #(ipadress) 192.168.**.*にrain.comというドメインを設定する
```

ドメインにアクセスしてみる。
<img width="599" alt="ドメインを設定する.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362635/73cb76d6-e32b-31a0-4a75-e073861f4833.png">

#急にドメインでアクセスできなくなったら
ブラウザのキャッシュの回覧の履歴を削除する。
「http://(ドメイン):81」など存在しないポート番号を指定してHTTP通信に失敗すると、ブラウザにキャッシュされてしまうため、それ以降に正しいドメインを設定してもURLにアクセスできなくなってしまう。
Xcode と Carthage でエラーが出たときの対処法

Xcode Swift で Eureka というライブラリを使っています。ある日突然エラーになりました。ビルドができなくなると先に進めないので困りますよね。そのときの対処法です。（Eurekaとは、Swiftで設定画面を作るライブラリです）

# Xcode のエラー内容
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/213bc05e-98a1-45e3-c0af-98560c4603b4.png)

```Xcodeのエラー
Module compiled with Swift 5.1 cannot be imported by the Swift 5.1.3 compiler: xxxxx 
```

Xcode のプロジェクトを開くとエラーが出ていました。
アップデートか何かが原因なのでしょうか。

# 1 Carthage をアップデート

Certfile ファイル内のライブラリのバージョンを上げます。 

```bash:Certfile
github "xmartlabs/Eureka" ~> 5.2.1
```
carthage 自体をアップデートします。

```bash
brew upgrade carthage
```

結果、治らず。

# 2 キャッシュを削除

```bash:carthage_update_--platform_iOSのエラー内容
*** Fetching Eureka
A shell task (/usr/bin/env git fetch --prune --quiet https://github.com/xmartlabs/Eureka.git refs/tags/*:refs/tags/* +refs/heads/*:refs/heads/* (launched in /Users/user/Library/Caches/org.carthage.CarthageKit/dependencies/Eureka)) failed with exit code 1
```

エラーメッセージ通りキャッシュを削除してみます（削除は怖いのでリネームします）
1. プロジェクト内の carthage フォルダーをリネーム
2.  /Users/user/Library/Caches/org.carthage.CarthageKit/dependencies/Eurek 以下をリネーム

結果、治らず。

# 3 Xcode の設定で Command Line Tools を指定する

```bash:carthage_update_--platform_iOSのエラー内容
*** Checking out Eureka at "5.2.1"
*** xcodebuild output can be found in /var/folders/57/j8cwyj1s3d1b1410pkjp67_w0000gp/T/carthage-xcodebuild.1jVVZW.log
A shell task (/usr/bin/xcrun xcodebuild -workspace /Users/user/xx/xx/Carthage/Checkouts/Eureka/Eureka.xcworkspace CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES -list) failed with exit code 72:
xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH
```

エラー内容から Xcode のコマンドがおかしいらしい。
<img width=80% src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/6019878a-a6a8-3c38-553d-588258f51b2e.png'> 
Xcode の Preferences で、Locations の Cimmand Line Tools を指定します（私の場合、空白になっていました）

結果、無事ビルドができました。

# まとめ

Carthage のエラーの対処法について記事にしました。久々にプロジェクトを起動してエラーになっていると、先に進めず困りますよね。この記事が役に立てば嬉しいです。
メソッドの定義場所 調べる方法まとめ　プロジェクト内とRails/Gem内で定義されている場合

# 動機
新しいプロジェクトに参加した時、もうメソッドだらけでどこに定義されているか調べることにかなり苦労しました。早くキャッチアップするためには、「早く調べて理解する力」が非常に重要と感じ、先輩エンジニアにも聞きながらまとめてみました。  
調べ方も一長一短あります。

## プロジェクト内で定義されているメソッドの場合
#### 1. `git grep -n <メソッド名>`
* エディタの全文検索より、ターミナルで色付きで表示されるので見やすいです
* -n オプションで行番号がつくので、コマンド + パスクリックでエディタで開きます！
* デメリット：あくまで文字列検索。かなり沢山ヒットしたりする。 "def メソッド名"とすると多少絞られる。

#### 2. ブラウザでGithubの検索窓に入力し、"in this repository"で検索
* この方法は1.と結果は同じなのですが、マッチした箇所の上下数行もまとめて表示されます。
* エディタを使いたくない時にいいです
* デメリット：あくまで文字列検索。かなり沢山ヒットしたりする。 "def メソッド名"とダブルクオーテーションをいれると絞られる

#### 3. pry-docsのshow-source機能を使う
* Railsコンソールで、`$ <メソッド名>` OR `show-source <メソッド名>`
* 定義箇所のdefからendまでを表示してくれます！
* パスも出るので、コマンド + クリックでエディタで表示できます。
* デメリット：user.method を調べたい時、Userインスタンスを作成してからでないと調べられないので手間。


#### 4. Pryの"step"機能を使う
* binding.pryで停止した時に、stepを実行すると、そのメソッド内に"入る"ことができます。
* 処理の流れと変数の定義も見ることができ、深い理解ができます。
* Rails/Gemなど深いところも見れます。
* デメリット：binding.pryの設置と、処理を走らせ止めることがめんどくさい。

[ピカワカ【Rails】Pryについて徹底解説！](https://pikawaka.com/rails/pry)


## Gemなどプロジェクト外で定義されている場合
#### 1. [Dashで検索する ](https://kapeli.com/dash)
* Dashとは、素のRuby、Rails, Gem、JavaScriptなど色んなドキュメントの横断検索ができるツールです。
* ソースコードに加えて、そのメソッドの説明付きなので理解も早くなります。
* VSCodeに拡張機能"Dash"をいれることで、コマンド + H でDash検索に飛べます
* デメリット：たまに調べたいGemがなかったりする

#### 2. `bundle show <gem名>`
* Gemのインストールされたディレクトリが表示されるので、VSCodeならコマンド + クリックで別ウィンドウで開くことができます。
* デメリット：gitやpryは使えないので、エディタの横断検索でメソッドを見つける必要があります。

#### 3. Pryの"step"機能を使う
* プロジェクト内で定義されているメソッドの場合と同じです。

#### 4. ブラウザでGithubの検索窓に入力し、"in this repository"で検索
* プロジェクト内で定義されているメソッドの場合と同じです。


## その他
#### 1. Rubymineの定義元ジャンプを使う
* VSCode使用者なので使ったことないです。が、RubyやRails、Gem内の定義ならDashでほぼまかなえる気がします。  
* デメリット：高い、遅い

#### 2. VSCodeの拡張機能　Solargraphを使う
* Rubyメソッドの上にカーソルを載せるだけで、そのドキュメントや使用例が表示されます。
* 補完機能もあり
* デメリット：Dockerを使用する場合は辛い。SolargraphはそのLanguage serverを起動させ続ける必要がある。Solargrapコンテナを立ち上げ、Portの設定をVSCodeにする必要がある。参考：[Docker環境でsolargraphを使う方法](https://qiita.com/belion_freee/items/9e7ea981653237072d1e)


### 最後に
* 皆様の「調べ方」が知りたいです。
* 他に良い方法があれば、コメントにて教えてくださいm(_ _)m
Android画面各部の名称

正しい呼び方を知らなかったので画面の各部の名称をまとめました。

出典は主に
[Androidデベロッパー|ユーザーインターフェースおよびナビゲーション](https://developer.android.com/guide/topics/ui)
[Material Design](https://material.io/design)
です。

# システムバー
通知の表示や、デバイスステータスの通信、デバイスの操作を行うための専用の画面領域。
システムバーはステータスバーとナビゲーションバーで構成される。
![alt](https://developer.android.com/images/training/system-ui.png?hl=ja)

## 1. ステータスバー
通知アイコンやシステムアイコンが表示される。

## 2. ナビゲーションバー
左から戻る、ホーム、タスクボタンが配置されている。
またAndroid9から2ボタンナビゲーション、Android10からジェスチャーナビゲーションが追加されたため3つボタンが表示されているとは限らない。

# トップアプリバー(アクションバー)
![alt](https://i.gyazo.com/f6669d83d75e11cc1d9b5f0a77da352c.png)
アプリの上部に現在の画面に基づく情報やアクションを表示する。

1. コンテナ
2. ナビゲーションアイコン
3. タイトル
4. アクションアイテム
5. オーバーフローメニュー

# ボトムナビゲーション
![alt](https://i.gyazo.com/a737cb1ba6e94acf0a19ee3c017651fe.png)

# ナビゲーションドロワー 
![alt](https://i.gyazo.com/e49228325192197ea99c1a32c793707f.png)
アプリのメインナビゲーションメニューを表示するUIパネル。

# フローティング操作ボタン(フローティングアクションボタン) FAB
![alt](https://developer.android.com/training/material/images/fab.png?hl=ja)
アプリの UI でメインとなる操作をトリガーする円形のボタン。

# トースト
![alt](https://developer.android.com/images/toast.png?hl=ja)
操作に関する簡単なフィードバックを表示する小さなポップアップ。

# スナックバー
![alt](https://developer.android.com/images/training/snackbar/snackbar_undo_action.png?hl=ja)
トーストに代わるより高機能なクラス。

# ダイアログ
![alt](https://developer.android.com/images/ui/dialogs_regions.png?hl=ja)
1. タイトル
2. コンテンツエリア
3. アクションボタン

# スピナー
![alt](https://developer.android.com/images/ui/spinner.png?hl=ja)

# タイムピッカー・デートピッカー
![alt](https://developer.android.com/images/ui/pickers.png?hl=ja)

# ボタン 
![alt](https://i.gyazo.com/abca8e8ff84d15a9bd8be21bcc9c538d.png)
1. テキストボタン
2. アウトラインボタン
3. ボタン
4. トグル(切り替え)ボタン

# スライダー
![alt](https://i.gyazo.com/e75a99ca5985917674dc82bb3431a642.png)

# 通知ドロワー
![alt](https://developer.android.com/images/ui/notifications/notification-drawer_2x.png?hl=ja0)
ステータスバーを下にスワイプして開くことができる画面。
通知の詳細な情報を確認し各通知をタップしてアクションを実行することができる。

# ヘッドアップ通知
![alt](https://developer.android.com/images/ui/notifications/heads-up_2x.png?hl=ja)

# ウィジェット
アプリの特に重要なデータや機能を「ひと目で」確認できるようにし、そうしたデータや機能にユーザーのホーム画面から直接アクセスできるようにするもの
![alt](https://developer.android.com/design/media/widgets_info.png?hl=ja)

# コントロールウィジェット
![alt](https://developer.android.com/design/media/widgets_control.png?hl=ja)
ユーザーがよく使う機能をアプリを開かなくてもホーム画面から直接起動・操作できるようにするもの。
[cx_Oracle入門](第8回) cx_Oracle8.0リリース

2020/6/26(日本時間)にcx_Oracleが7.3から8.0にバージョンアップされました。
以下、8.0の新機能、変更点のおおまかな解説です。メジャーバージョンアップだけあって、大きな(と筆者が感じる)変更が含まれています。以下、番号はcx_Oracleの[リリースノート](https://cx-oracle.readthedocs.io/en/latest/release_notes.html#version-8-0-june-2020)に対応しています。

### 1. Python2のサポート終了
サポートするPythonのバージョンが3.5以降となりました。Python2で利用したい場合は7.3を使用する必要があります。

### 2. ODPI-Cのバージョン変更
cx_OracleはODPI-CというOSSのC言語のOracleアクセスドライバを用いて作成されています。バージョン8.0は、ODPI-C 4.0.1をベースにビルドされています。

### 3. 型マネジメントの変更
以下の通り、大幅に見直されています。

- 型の定数の体系が以下の通りに整理されました。
 - [DB API Type](https://cx-oracle.readthedocs.io/en/latest/api_manual/module.html#db-api-types) : [DB API](https://www.python.org/dev/peps/pep-0249/)に準拠した型
 - [Database Type](https://cx-oracle.readthedocs.io/en/latest/api_manual/module.html#database-types) : Oracle Databaseのデータ型に対応した型。7.3と名称が異なる
 - [Database Type Synonym](https://cx-oracle.readthedocs.io/en/latest/api_manual/module.html#database-type-synonyms) : 7.3時代の型。8.0以降は非推奨で将来廃止予定
 - [Other Type](https://cx-oracle.readthedocs.io/en/latest/api_manual/module.html#other-types) : 上記に含まれない型
- 7.3では一部のOralce Databaseデータ型に対し、対応するcx_Oracleデータ型定数が存在しませんでした。8.0で不足していたデータ型への対応として、以下を追加しています。
 - cx_Oracle.DB_TYPE_BINARY_FLOAT
 - cx_Oracle.DB_TYPE_INTERVAL_YM
 - cx_Oracle.DB_TYPE_TIMESTAMP_LTZ
 - cx_Oracle.DB_TYPE_TIMESTAMP_TZ
- Variableオブジェクトのtype属性に対する変更
 - Oracle Databaseのオブジェクト型にバインドされていない場合、NoneではなくDatabase Typeを使用するように変更
 - LOBに対応
 - Oracle Databaseのオブジェクト型の属性を取得可能に
- Object Typeオブジェクトにelement_type属性を追加
- 同一セッションないしコネクションプール使用時において、Object Typeオブジェクトの名前やスキーマの比較が可能に
- すべての変数が同一クラスのインスタンスとなった
- 変数の文字列表現に、値に加えて型が追加

### 4. cx_Oracle.init_oracle_client()の追加
Oracle Clientライブラリの初期化を行う関数cx_Oracle.init_oracle_client()が追加されました。

### 5. デフォルトエンコーディングの変更
7.3ではNoneでしたが、8.0ではUTF-8になりました。NLS_LANG環境変数のキャラクタのセットの指定は無視されます。

### 6. Soda Documentクラスへのメソッド追加
SodaCollectionオブジェクトにsave(), saveAndGet(), truncate()メソッドが追加されました。これらの機能を利用するためには、Oracle Client 20以降が必要です。

### 7. SodaOperation.fetchArraySize()の追加
SODAドキュメントのフェッチ件数を設定するSodaOperation.fetchArraySize()が追加されました。この機能を利用するためには、Oracle Client 19.5以降が必要です。

### 8. Cursor.prefetchrowsの追加
結果セットのプリフェッチを行うCursor.prefetchrowsが追加されました。

### 9. Connection.versionの初回実行に伴うラウンドトリップの回避
データベースのバージョン番号を取得するConnection.versionの初回実行に伴うラウンドトリップを回避するために、新しいモードの追加行っています。この機能を利用するためには、Oracle Client 20以降が必要です。

### 10. PFILE対応
PFILEを使用したデータベースの起動に対応しました。7.3まではSPFILEのみの対応でした。

### 11. Cursor.getbatcherrors()のバッファオーバーフローの修正
オフセットが65536を超えた場合、Cursor.getbatcherrors()でバッファオーバーフローが発生する問題を修正しました。

### 12. Cursor.lastrowidの挙動の変更
INSERT ALL文を実行した後にCursor.lastrowidを実行した場合にエラーが発生しないように変更されました。

### 13. Alex Henrie氏のpull requestの受け入れ
主にコードの改善(冗長なコーディングの改善等)に関する6つのpull requestを取り込んでいます。

### 14. boolean変数にバインドされたPythonオブジェクトの挙動
boolean変数にバインドされたPythonオブジェクトは、Pythonのif文の中でTrueかFalseとみなされるかに従ってTrue/Falseに変換されるようになりました。従来はTrueのみTrueに変換され、それ以外はFalseに変換されていました。

### 15. 本体コード以外の改善
ドキュメント、サンプル、テストを改善しています。


# 変更履歴
- 2020/12/12 : 誤字修正
[Rails]本番環境(EC2)でエラーログを見る方法

## エラーログとは
エラーログとはエラーが発生した場合にその情報を記録している場所のことです。

## ローカル環境のエラーログ　確認方法
Railsではエラーが発生した場合、下記に添付している画像のようなエラー画面が発生する。
これはRailsの特徴の一つで、ローカル環境ではエラーログを探さなくても詳細を表示してくれます。

![aad9dc14644070bf4e4d9f438a126895.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/5f39e348-8cfc-0275-9ca4-df0894c0af48.jpeg)

## 本番環境のエラーログ　確認方法
一方、本番環境ではエラーが発生した場合、エラー情報を記録しているエラーログを確認しなければなりません。（マストではないが、エラーログを確認することは重要）

エラーログの確認方法は以下の通り▼

EC2サーバにログイン後、対象アプリのリポジトリに移動。
次に対象のリポジトリ直下のcurrentディレクトリに移動。

```
[ec2-user@****** [対象のリポジトリ]]$ cd curren
```

current直下のlogに移動▼

```
[ec2-user@****** current]$ cd log
```

logまで移動したら**lsコマンド**で直下のファイルを検索。すると以下のように表示される▼

```
[ec2-user@****** log]$ ls
production.log  unicorn.stderr.log  unicorn.stdout.log
```

production.log     ▶︎ 本番環境に関するエラー情報が記録されている。
unicorn.stderr.log ▶︎ unicornの起動時にエラーが発生した場合にエラー情報が記録される。

下記コードを実行すると対処のファイルへ移動し、エラーログを確認できる。

```
[ec2-user@****** log]$ tailf '対象のログ'
```
Windows10にIISサーバを設定する

#記事一覧
[Visual StudioのASP.NET Core MVC で Web アプリを作成してみた（記事一覧）](https://qiita.com/yuta-sasaki/items/31307b88f7234b92f728)

#IISを有効にする
「コントロール パネル\プログラム」→「Windowsの機能の有効化または無効化」を選択して、下記のWindowを表する。
<img width="348" alt="IISを有効にする.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362635/33f61694-c294-78ec-bc5a-54e90bf75eb9.png">
「インターネットインフォメーションサービス」と、「インターネットインフォメーションサービスのホスト可能なWebコア」を選択してOKを選択すると、インストールが開始する。

#IISが有効になったことを確認する
「コントロール パネル\システムとセキュリティ\管理ツール」→「インターネット インフォメーション サービス (IIS) マネージャー」が起動できることを確認する。
<img width="706" alt="IISを確認す.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362635/152af003-36f8-5f30-68aa-b12306727d52.png">

「localhost/」でIISのホームページが表示できることを確認する
<img width="601" alt="IISを確認する2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362635/e15874e7-f495-b3a7-d514-d79fb0534b93.png">

WiFiなどで同じネットワークに接続しているスマホなどの端末のブラウザから、「http://(ipadress※注1)/」にアクセスしてIISのホームページが表示できることを確認する。

* 注1：(ipadress)は、ipconfigで確認する。
macOS プログラミング学習　便利なショートカットキー

#プログラミング学習　便利なショートカットキー
自分が知っているものに限りますが、これまでのプログラミング学習で役立ったショートカットキーをqiitaにも書き残しておこうと思います。
参照する場合は、以下の環境構築と当てはまった上でご覧ください。

##環境構築
・使用PC：macOS
・Google Chrome（ブラウザ）
・Visual Studio Code（コードエディター）

##常時
これらはプログラミング学習だけでなくmacを使っているときに最も使用しているショートカットキー

###切り取り
`command + x`

###コピー
`command + c`

###貼り付け
`command + v`



##コードエディターを使用しているとき

###巻き戻し
`command + z`
操作する前の状態に戻せる
間違って消したりしたときに便利でよく使う。

###複製
複製したい文をドラッグして
`shift + option + 下矢印キー`
直下に複製される。
よく使う。

###移動
移動したい文をドラッグして
`option + 矢印キー`
よく使う。

###保存
`command + S`
すぐに保存したいときに使う。

###字下げ
`Tab`
字下げを戻すとき（字上げ）には
`Tab + shift`
よく使う。

###自動インテンド
`shift + option + F`
自動的にインテンド調整が入る機能
まとめてインテンドしたいときに使う。

###コメント切り替え
`command + /`
コメント機能のon/offを切り替えられる。
よく使う。

###まとめて書き換え（同じ文字のみ）
`command + D`
変更したい文字が複数ある場合に使用。

###カーソルの追加
`command + option + 矢印キー`
同じclassを追加したいときに使う。
li要素に使うことが多い。

##ブラウザ上を使用しているとき

###デベロッパーツールの起動
`command + option + i`
HTMLやCSSの編集、Javascriptのconsoleのチェックを行うとき。
よく使う。

今後もここに追加していく予定です。
【AWS】サーバレスで Hello, World! を実行するまでのチュートリアル


通常、プログラムのコードを実行するためには Linux などのサーバを立てて、初期設定して、実行環境をインストールして・・・と手間が多いです。
しかし、AWS には **Lambda** という、上のようなサーバ側の準備を意識することなくコードを実行でいるサービスがあります。

このチュートリアルでは、サーバレス ≒ サーバの構築なしでコードを実行し、 "Hello, Wolrd!" を返すまでの手順を学びます。

## Lambda コンソールを起動

[AWS マネジメントコンソール](https://console.aws.amazon.com/console/home)にアクセスし、AWS アカウントでまずはログインします。

ログインできたら「サービス」をクリックし、検索ボックスに「Lambda」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/3f4ddc36-85c4-c14f-838f-3f385290e1a9.png)

これで Lambda コンソールへアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/713b89ba-77a6-17f1-0fa6-2c6fa3d3efca.png)

## Lambda 関数を作成する

**関数の作成**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/3f797201-1592-2fda-6905-4751a2040cac.png)

関数名はなんでもよいですが、今回は python で Lambda 関数を作るのでわかりやすく**hello-world-py**と入力しましょう。
また、ランタイムは「Python 3.8」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/f70e3a15-e863-5030-2b2d-bb093b5adaae.png)

次に、この関数を実行するためのロールを作成していきます。

**実行ロールの選択または作成**を選択して展開したら、実行ロールでは**AWS ポリシーテンプレートから新しいロールを作成**を選択します。
ロール名には**lambda_basic_execusion**と入力します。
ポリシーテンプレートはオプションなので今回は使わず、このまま**関数の作成**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/3cac6bde-faae-5f76-0d71-df67fbf56f26.png)

少し待つと作成が完了し、このような画面に遷移するはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/03f595c1-4a94-479d-89bb-894e8911a571.png)

## 作成した Lambda 関数をテストする

先ほどの画面の右上の**テストイベントの選択**欄をクリックし、プルダウンで表示される**テストイベントの設定**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/44a13f0b-3544-7d1d-42a1-9a6d05fd6734.png)

選択すると、デフォルトではこのような画面が表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/df783fd8-7f32-a75e-1e28-743245e66d08.png)

イベント名には **helloWorldTest** と入力し、またコード内の value1 を **Hello, World!**
に変更します。
入力できたら、右下の**作成**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/90b8000c-9c92-099e-c412-691f239f7c14.png)

いよいよ、作成した helloWorldTest を実行します。
右上の**テスト**をクリックしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/1e47260b-82e5-75ac-8bc6-6a974bf5aba6.png)

成功すると、実行結果は成功となるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/5014c8fd-7e98-1541-ff1f-f8cbc98ecb58.png)

## テスト結果の確認

前の画面で **詳細** をクリックすると、テスト結果の詳細を確認できます。
ここでは、JSON 形式で value の一つとして Hello,World!と送信した結果に対する応答がステータスコード 200 と共に返ってきているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/d12b5e5c-ee5d-e4b8-dbf3-6c621456446d.png)

今回実行されたコード自体は Lambda コンソール内の下の方にあり、今回は helloWorld 用のテンプレートを使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/cfc76078-8517-daec-c7b0-c8fc216cf6cf.png)
Expo Clientアプリの読み込み中に発生した問題と解決

## 直面した問題
「There was a problem loading the requested app.」
と表示され、Expo Clientに画面を表示できなくなってしまった。
<img width="346" alt="スクリーンショット 2020-06-27 13.45.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403398/e8cdae14-2b71-cd68-e200-684d85b44c0e.png">
下段落を読むと、
「The experience you requested requires a newer version of the Expo Client app.」
どうやらExpo Clientの新しいバージョンが必要らしい。

## 解決方
###1. iOS simulatorの画面からExpo Clientのアプリを消去する
<img width="310" alt="スクリーンショット 2020-06-27 14.11.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403398/b20120e7-118c-3f96-6775-4d71c29eb423.png">
Expoを長押し→DeleteAppで消去します。

###2. ターミナルからもう一度iOS simulatorを起動して完了
iOS simulator内に自動でExpoがインストールされます。

## 後書き
reactnativeの学習中だったので、なかなか戸惑ってしまったが、Expo Clientのバージョンが更新されるたび起こるものらしい。期間を空けてプロジェクト作成するときは、とりあえずiOS simulator内アプリの削除をしておくといいかもしれない。
Terraformでセンシティブな値を確認したい

Terraformでデータベースのパスワードやシークレットキーなどのセンシティブな値を確認したい時、最新バージョンで `terraform show` を叩いてもマスクされた値しか表示されません。

そういう時は以下のように remote state の値を直接引っ張ってくれば確認できます。

```sh
$ terraform state pull
```
[GAS]Googleフォームの質問をスプレッドシートから追加する。



## やること

Googleフォームに質問を追加する際、選択肢（リストアイテム）が多い質問は手入力が大変なのでスプレッドシートから作成しました。


## 結果

下の画像のような質問を追加します。
このケースは、言語を選択してもらう質問です。選択肢として108言語用意しなければなりませんでしたので手入力では大変です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/131498bd-bbe1-0fb6-90e0-cdea03d9f714.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/1b4d2f60-ff2d-fd5d-95e5-8a5d9760ed76.png)


## 準備

リストアイテムのソースとなるスプレッドシートを用意します。
下図のシートを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/d87d99f7-07d4-bc23-ff4c-780350cecade.png)


## Google Apps Scriptコード

下記のようなコードを書きました。
今回は、スプレッドシートのコンテナバインドスクリプトとして作成していますが、フォームのコンテナバインドから作成しても良いかと思います。その場合、`SpreadsheetApp.getActive()`から取得するのではなく、`SpreadsheetApp.openById`から取得するようにしてください。


```javascript
function myFunction() {
  //activeなスプレッドシートの1枚目のシートを取得する。
  const srcst = SpreadsheetApp.getActive().getSheets()[0]; 
  //回答に使用するスプレッドシートのデータA列のみを取得する。
  let values = srcst.getRange(1, 1, srcst.getLastRow() , 1).getValues(); 

  //フォームをフォームIDから取得する。
  const fm = FormApp.openById(formId);

  //フォームにリストアイテム形式の質問を追加する。
  // question 1
  const q1 = fm.addListItem();
  q1.setTitle("翻訳前言語"); //質問のタイトル
  q1.setHelpText("翻訳前の言語を選択してください。"); //質問の説明文
  q1.setChoiceValues(values); //質問の選択肢
  q1.setRequired(true); //回答タイプが必須回答orオプショナル回答（true/false）

  // question 2
  const q2 = fm.addListItem();
  q2.setTitle("翻訳後言語");
  q2.setHelpText("翻訳後の言語を選択してください。");
  q2.setChoiceValues(values);         
  q2.setRequired(true);
}

```

## スクリプトを実行する。
上記のコードを実行してフォームを確認してみると、質問が追加されるのがわかるかと思います。


## 詳細の解説
▼より詳細な解説は下記の記事にまとめていますのでよかったら
https://www.teijitaisya.com/gas-create-multiform-from-sheet/
VBAでPicturesクラスのFormulaプロパティが変数を使って設定できない件(多分Excelのバグ)

shapeに設定された数式をVBAで変更したい時があり、試行錯誤した結果をメモとして残します。
## 自分としての結論
shapeのFormulaプロパティを設定する場合はハードコーディング(内容をコード内に直接記述すること)で記述する。変数での設定は不可。
**きっとExcelのバグでしょう。**
※2020/07/04 追記：コメント欄でのご指摘により、変数にFormulaを代入する際、末尾に半角スペースが入ってしまうバグが原因でした。代入後trim関数で半角スペースを除去することで解決しました。

## 環境
OS:Windows 10 Home
製品:Microsoft 365
※上記は自宅PCで、職場PC(Office 2016)でも同じ症状だったので環境起因ではないでしょう。
## 試したコード
仕事の素材は直接出せないので、状況を再現したもので説明します。
下図のように、Sheet1にあるオレンジ色の画像に数式(=Sheet3!A1:B2)が設定されています。
![vba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575325/3e0dbbcb-7823-56a5-c80a-040d617fad1f.png)

コードを示します。
10~12行目でShapeのFormulaを設定しています。
コード内コメントの通り、数式をハードコーディングした部分は問題なかったのですが、変数fmlに代入して設定するとエラー1004が発生しました。

```vb:testShapeFormula.bas
Sub testShapeFormula()
    Dim shp As Shape
    Dim fml As Variant
    Set ash = ActiveSheet
    'For Each shp In ash.Shapes
        'shpNm = shp.Name
        fml = ash.Shapes(1).DrawingObject.Formula       ' shapeの数式取得
        fml = "=" & Replace(fml, "Sheet2", "Sheet1")    ' 数式の編集
        With ash.Shapes(1).DrawingObject
            .Formula = "=Sheet3!A1:B2"   ' shapeに数式を設定(1) OK!
            .Formula = "=Sheet1!A1:B2"   ' shapeに数式を設定(2) OK!
            .Formula = fml               ' shapeに数式を設定(3) NG... エラー1004
        End With
    'Next
    
End Sub
```
![PictureクラスのFormulaプロパティを設定できません。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575325/3e50a1d7-b094-bf61-26ed-0dcb03100b16.png)

実際の仕事素材ではshapeが複数あるので、for eachも試しています。もしかしたらfor eachが悪い？！という観点でもデバッグしたので、コード内ではfor eachがコメントアウトされています。

幸い今回の改修では数式の参照範囲は変わらないのでハードコーディングでもギリギリ対応可能な内容ですが、範囲が可変的なものだとかなり厳しいのではないかと思います。
ShapeのFormulaをVBAで編集なんて普通に使っていたらほぼ遭遇しない事象だからバグが放置されてるのかな？お願いしますYO MSさん！
え、これでできるよ？？などツッコミありましたらお願いしますm(__)m
AbortController not defined 

Electronでwavesurfer.jsを使おうとしたら、AbortController not defined エラーが起こる。

#解決策

Electronのプロジェクトディレクトリにpolyfillをインストール


```linux
$ npm install --save abortcontroller-polyfill
```

wavesurfer.js の頭に以下の行を入れて、importする。

```wavesurfer.js
require('abortcontroller-polyfill/dist/polyfill-patch-fetch')

```

解決
ツクールMVで小数ライブラリを使ってみた(Numeral.js) && メソッドの追加

ツクールMVの開発で小数を計算したかったのですが、Javascriptでは小数を扱う計算で誤差が生まれてしまうんですね。

- 参考:[JavaScriptによる小数計算の誤差を無くす](https://blog.asial.co.jp/1191)

そこで、小数を誤差なく扱えるライブラリを導入しました。

今回は[numeral-js](http://numeraljs.com/)を使ってみました。
導入方法としては、GitHubの[numeral.js](https://github.com/adamwdraper/Numeral-js/blob/master/numeral.js)にアクセス => Raw => 名前を付けて保存 をして、ツクールMVにプラグインとして追加します。

```js:numeral.js
0.1 + 0.2 // => 0.30000000000000004
numeral(0.1).add(0.2).value()// => 0.3
```

元々の計算式より少々書き方が煩雑にはなりますが、誤差なく計算してくれるようになりました。

## メソッドを足してみる

numeral.jsには四則計算のためのメソッドとして、add, subtract, multiply, divideがそれぞれ用意されています。
足し算のadd以外は長いので、エイリアス(別名)としてメソッドを足してみました。
加えて、複数の引数を入れて一気に計算できるメソッドも追加してみました。

```js:numeral_hook.js
Object.assign(numeral.fn, {
    plus: function(value){ return this.add(value) },
    adds: function(...values){
        for(const value of values){
            this.add(value)
        }
        return this;
    },
    sub: function(value){ return this.subtract(value) },
    minus: function(value){ return this.subtract(value) },
    subs: function(...values){
        for(const value of values){
            this.subtract(value)
        }
        return this;
    },
    mult: function(value){ return this.multiply(value) },
    mults: function(...values){
        for(const value of values){
            this.multiply(value)
        }
        return this;
    },
    div: function(value){ return this.divide(value) },
    divs: function(...values){
        for(const value of values){
            this.divide(value)
        }
        return this;
    }
})
```
```js:numeral_hook.js-test
numeral(0.3).sub(0.1).value()// => 0.3
//== numeral(0.3).subtract(0.1).value()// => 0.3
numeral(0.1).adds(0.2, 0.3, 0.4, 0.5).value()// => 1.5
```

GitHubにて配布しましたので、numeral.jsを使われる際はご自由にどうぞ

[numeral_hook.js](https://github.com/asakayu/Mihil_RPGMakerMV_plugins/blob/master/numeral-js/numeral_hook.js)

Object.assign()で関数同士を結合してみましたが、Object.defineproperties()で新たにメソッドを書くのとどちらがいいんでしょう？

## 他のライブラリ

小数を扱えるようにするライブラリとしては、[bignumber.js](https://github.com/MikeMcl/bignumber.js/)や[decimal.js](https://github.com/MikeMcl/decimal.js/)のほうが有名そうですが、RPGツクールMV1.6.2ではプラグインとして読み込んでも、うまく動作しませんでした。

```js:decimal.js
    new Decimal(0.1).plus(0.2)// => {constructor: Decimal(v), d:[3000000], e:-1, s:1}
    //(値が返ってくるはずが、オブジェクトが返ってくる)
```

理由は謎です。