OmniAICreator/Qiita-1.07M huggingface dataset:
Qiita Daily Survey memo 2021.02.23

# Qiita Daily Survey memo 2021.02.23
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [【初学者必見】 CNN の過去のモデルから紐解いて学ぶと理解が深まった話](https://qiita.com/kazuki_kkgk/items/4f90f149737b5c012038)
kazuki_kkgk さんの記事。
ILSVRC (ImageNet Large Scale Visual Recognition Challenge) の歴代優勝モデルを年代ごとに紹介してくださっている記事です。
図が多く、文章も読みやすく、綺麗にまとめられており参考になりました。
時代の転換期だったと思いますので、そこからの流れを時系列で追いかけるのは、とても面白いです。

他の紹介記事ですと、下記の記事は何回も読み返しました。ありがとうございます…。
[物体検出についての歴史まとめ(1)](https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9)


## [cassavaコンペの振り返り](https://qiita.com/Yuki_Kaggler/items/59d29c0942956c90eec6)
Yuki_Kaggler さんの記事。
Kaggle の cassava コンペに参加され、その振り返りの記事になります。
必読。
非常にためになった記事でした。
Kaggle 挑戦したいとずーーーっと考えていますが、どうやって手を付けていいのか…とまったくわかりませんでした。
実際にコンペに参加された方が、やったこと・苦戦したこと・戦略などを書いてくださっていて、イメージがわきました。
記事に貼られているリンクの『Kaggle日記という戦い方』の方も、とても読みやすくためになった記事なのでおすすめです。
こんなに綺麗にまとめてくださってありがとうございます。応援してます！


## [【GAS】推しのためにWeb人気投票リマインドLINEbotを作ってみた](https://qiita.com/Motchy_1204/items/788f5a61f2cdaada0da3)
Motchy_1204 さんの記事。
1日に1票（なのかな？）の投票ができる人気投票に、推しに投票するのを忘れないように Line bot でリマインドをする…という記事です。
「**あれbotでこういうの出来るんじゃ…
しかも投票URLとかも一緒にリマインドしたら便利じゃないか…**」という閃きに対して、やっちゃおう！ってできるのがすごいです。
勉強してきたことが役に立つシーン、良いですよね…！

2～3時間程度で作成されたとのことです。
私もタスクリマインダーを作成したことがありますが、先人の方たちの記事のおかげで本当にそれくらいで作れてしまいます。
感謝が絶えませんね…！
WealthNaviサイトにPythonとSeleniumを使ってログインする

WealthNaviのサイトにPythonとSelenium使ってログインする方法を解説します。

※2021/02/23時点の情報です

## 環境
- Windows 10
- Python 3.8
- Selenium 3.141.0

## 全体の処理の流れと注意点
全体の処理の流れについては、下記記事に詳しく書いたのでこちらもあわせて確認してみてください。楽天銀行の例になっていますが、処理の流れは同じです。

https://qiita.com/yoshi2045/items/2fff5bf5f0fa763f7104

また、下記記事では他サイトのサンプル一覧と注意点を解説しているのでこちらも参考にしてみてください。

https://qiita.com/yoshi2045/items/a58a7fbebcb9faad3e15

## WealthNaviでのポイント
全体の処理の流れについては上記記事を参考していただくとして、ここではWealthNaviサイトにおけるポイントを解説します。

### 二段階認証設定を有効にしている場合はログインできない
WealthNaviにはセキュリティ強化のため二段階認証を設定することができます。

>2段階認証とは、WealthNaviにログインする際、ログインIDとパスワードに加え、スマートフォンの2段階認証アプリ(※)で発行された6桁のコードによる認証を行うことで、セキュリティをより強化するための仕組みです。
>
>（WealthNavi公式HPより引用）

これはセキュリティ面を考慮するとぜひ設定を有効にしておきたいところですが、PythonとSeleniumを使って自動ログインしようとするとうまくいきません。

２段階認証アプリで発行される６桁のコードは毎回ランダムであり、そもそもスマホアプリで発行されるので捕捉しようがないんですね。

自動ログインしてそのあとスクレイピングしてデータ取得したい場合は、せめてパスワードを強固なものにしておきましょう。当然、他サイトと同じパスワードの使い回しはやめたほうがよいです。

## サンプルコード全文

```python
#
# WealthNaviサイトへログイン
#

import json
from selenium.webdriver import Firefox, FirefoxOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

# 設定ファイルを取得
login_info = json.load(open("login_info.json", "r", encoding="utf-8"))

# ログインサイト名
site_name = "sec_wn"

# ログイン画面URL
url_login = login_info[site_name]["url"]

# ユーザー名とパスワードの指定
USER = login_info[site_name]["id"]
PASS = login_info[site_name]["pass"]

# Firefoxのヘッドレスモードを有効にする
options = FirefoxOptions()
options.add_argument('--headless')

# Firefoxを起動する
browser = Firefox(options=options)

# ログイン画面取得
browser.get(url_login)

# 入力
e = browser.find_element_by_id("username")
e.clear()
e.send_keys(USER)
e = browser.find_element_by_id("password")
e.clear()
e.send_keys(PASS)

# ログイン
button = browser.find_element_by_id("login")
button.click()

# ページロード完了まで待機
WebDriverWait(browser, 10).until(
    ec.presence_of_element_located((By.CLASS_NAME, "evaluation"))
)

# ログインできたか確認（画面キャプチャ取る）
browser.save_screenshot("../screenshots/sec_wn/home.png")

browser.quit()
```


## ログイン情報設定ファイル
サイトURLやログイン情報（IDやパスワード）は、JSON形式のファイルに保持するようにしています。以下のサンプルでは楽天銀行とWealthNaviの2サイトの情報と設定しています。

"id", "pass"の値を書き換えればそのまま使えるはずです。

なお、このファイルだけは絶対に漏洩しないよう、管理方法に注意しましょう！

```json:login_info.json
{
  "bank_rakuten": {
    "id": "1234567890",
    "pass": "password",
    "url": "https://fes.rakuten-bank.co.jp/MS/main/RbS?CurrentPageID=START&&COMMAND=LOGIN"
  },
  "sec_wn": {
    "id": "1234567890",
    "pass": "password",
    "url": "https://invest.wealthnavi.com/"
  }
}
```
画像複数枚ポップアップ

やっぱりこっち使う。jQuery使わないから軽い

```index.html

<a href="[画像ファイル]" class="luminous"><img src="[画像ファイル]"></a>

<link rel="stylesheet" href="Luminous-basic.min.css">
<script src="Luminous.min.js"></script>
<script>
new LuminousGallery(document.querySelectorAll('.luminous'));
</script>
```
Luminousの配布ページ
https://github.com/imgix/luminous

ありがとうございます
https://web-roku.com/luminous
https://blog.ver001.com/javascript-luminous/



ーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーー


以下前の

```index.html

<head>
　<link href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/css/lightbox.css" rel="stylesheet">
　<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
　<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/js/lightbox.min.js" type="text/javascript"></script>
</head>

<body>
<a href="gazou1.jpg" data-lightbox="group"><img src="gazou1.jpg" width="300"></a>
</body>

```

>そして、この場合、「data-lightbox="group"」という形で、「data-lightbox」で指定する名前（ここでは group）を一緒にすることで、画像をグルーピングすることができます。


ありがとうございます！
https://toretama.jp/click-big-image-floaty.html
Pytorchで乱数生成状態の保存

例えば、一定時間でジョブが停止してしまうような計算サーバーで、
一定時間内に終わらない学習を行う場合、チェックポイントをとり、
新しいジョブを投げてチェックポイントから学習を再開することになる。

この時、例えは`DataLoader`で`shuffle=True`に設定している場合等は、
ジョブ再開時に乱数が初期化されてしまい学習の再現性が担保されなくなってしまう。

本記事には乱数の状態を保存することで学習再開時の再現性を担保する方法を記す。

# PytorchにおけるRandom Stateの保存

Pytorchにおいて乱数の生成状態は次のように一時保存と読み出しできる。
(Python標準モジュールの`random`を使用しない場合は削っても問題ないです。)

~~~python3
import random
import torch

def save_random_state(file_path):
    random_state = random.getstate()
    torch_random_state = torch.random.get_rng_state()
    # GPUを使用する場合 torch.cuda.get_rng_state() も保存&ロードする必要あり。
    torch.save({"random_state":random_state, "torch_random_state":torch_random_state}, file_path)

def load_random_state(file_path):
    state = torch.load(file_path)
    random.setstate(state["random_state"])
    torch.random.set_rng_state(state["torch_random_state"])
~~~

# 検証

これは以下のようなコードで検証できる。

~~~python3
import random
import torch

def save_random_state(file_path):
    random_state = random.getstate()
    torch_random_state = torch.random.get_rng_state()
    torch.save({"random_state":random_state, "torch_random_state":torch_random_state}, file_path)

def load_random_state(file_path):
    state = torch.load(file_path)
    random.setstate(state["random_state"])
    torch.random.set_rng_state(state["torch_random_state"])

class RandomIntDataset(torch.utils.data.Dataset):
    """
    選択されたインデックスとランダムな値を返すだけのデータセット
    """
    def __init__(self):
        self.length = 10

    def __len__(self):
        return self.length

    def __getitem__(self, i):
        return i, random.randint(0,9)

if __name__ == '__main__':
    print("ランダム生成状態の保存")
    save_random_state("random_state.pt")

    rand_dataset = RandomIntDataset()
    data_loader = torch.utils.data.DataLoader(rand_dataset, batch_size=4, shuffle=True, num_workers=4)
    for batch in data_loader:
        print(batch[0].tolist(), batch[1].tolist())

    for batch in data_loader:
        print(batch[0].tolist(), batch[1].tolist())

    print("ランダム生成状態の読み出し")
    load_random_state("random_state.pt")
    for batch in data_loader:
        print(batch[0].tolist(), batch[1].tolist())
~~~

出力は以下のようになる。

~~~
ランダム生成状態の保存
[9, 6, 0, 7] [1, 1, 2, 0]
[4, 8, 5, 1] [5, 2, 1, 5]
[2, 3] [5, 1]
[1, 0, 2, 4] [9, 4, 6, 9]
[7, 3, 6, 9] [7, 6, 4, 5]
[5, 8] [4, 1]
ランダム生成状態の読み出し
[9, 6, 0, 7] [1, 1, 2, 0]
[4, 8, 5, 1] [5, 2, 1, 5]
[2, 3] [5, 1]
~~~

左側の配列は、Datasetのインデックス, 右側の配列はDataset内部で生成された乱数である。
保存後と読出し後で、無事同じ乱数を生成できていることがわかる。
VisualStudioCode スニペットでDoxygenのテンプレを作ろう 

#DoxygenのコメントをVSコードのスニペットで楽しよう
##初めに
Doxygenを使うにあたって、コメントの全部を手打ちするのはだるいと思い、定型句を簡単に入力できないかと検討。
そしたらVSCODEのスニペットで簡単入力ができることがわかり、Doxygenの定型句をメモとして残そうと思った次第。

対象言語：C言語

##ファイルコメントヘッダ

	"CfileComment": {
		"prefix": "ficommheader",
		"body": "/**\n* @file $1ファイル名.c\n* @brief $2簡単な説明\n* @details $3詳細な説明\n*/",
		"description": "ファイルコメントヘッダ"
	}

##関数コメントヘッダ
	"Print to console": {
	 	"prefix": "funccomm",
	 	"body":[
			 	 "/**",
		 	 	  "* @brief $1簡単な説明（～する関数）",
		 	 	  "* @param[in] $2a(引数名) 引数の説明",
		 	 	  "* @param[out] $3b(引数名) 引数の説明",
		 	 	  "* @return bool $4戻り値の説明",
		 	 	  "* @details $5詳細な説",
		 	 	  "*/\n"
			],
	 	"description": "関数コメントヘッダ"
	}


##おまけ
コメント挿入のスニペット( ´∀｀ )

	"comment insert": {
		"prefix": "comm",
		"body": "/* $1 */",
		"description": "コメント挿入"
	},
Guzzle最初の一歩

ただのメモ。最初の最初の一歩を踏み出す

```php:GuzzleUtil.php
<?php


namespace App\Service;

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use Psr\Http\Message\ResponseInterface;

class GuzzleUtil
{
    private Client $client;

    public function __construct()
    {
        $this->client = new Client(['base_uri' => 'http://httpbin.org','timeout' => 2.0,]);
    }

    public function retrieveGetResponse(): ResponseInterface
    {
        return $this->client->get('/get');
    }

    public function getResponseAsync()
    {
        // Send an asynchronous request.
        $request = new Request('GET', 'http://httpbin.org');
        $promise = $this->client->sendAsync($request)->then(function ($response) {
            echo 'I completed! ' . $response->getStatusCode();
        });
        $promise->wait();
    }
}
```

```php:GuzzleUtilTest.php
<?php

namespace App\Service;

use PHPUnit\Framework\TestCase;

class GuzzleUtilTest extends TestCase
{
    public function testGetStatusCode()
    {
        $g = new GuzzleUtil();
        $res = $g->retrieveGetResponse();
        $this->assertEquals(200, $res->getStatusCode());

        $g->getResponseAsync();
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/3d44821d-f3f3-4337-68f3-500eb4460f35.png)
:thumbsup:
アプリ開発実践入門6 Modelとデータベース SQL編

今日の教科書

#データベースの設定
##database.yml
configの中のdatabase.ymlファイルがデータベースの設定ファイルです。
YAMLファイルはデータをテキストで表すフォーマットでインデントでデータを構造的に記述している。

```
default: &default
設定
development:
設定
test:
設定
production:
設定
```

`default`：全てに共通する設定
`development`：開発時の設定
`test`：テスト用の設定
`production`：リリース時の設定

###主な設定の項目

`adapter`：データベースアクセスに使われるプログラムの一種。それぞれのデータベースごとにある。名前を使いたいデータベース用のものに変更して使う。

`pool`：データベースにアクセスするためのもので5とすると最大５ユーザーが同時にデータベースにアクセスできる。

`timeout`：データベースの結果を受け取るまでの最大の待ち時間。サーバ型だと、サーバーに問い合わせてから結果を受け取る。その際どれくらい待たされても良いか指定する。デフォルトでは５０００。

`<<:*default`：defaultに用意した設定をそのまま読み込んで利用することを示している。修正せずそのままにしておく。

`database`：データベースファイルの保存場所とファイル名を指定する。

###ほかSQLite以外のデータベースを使う際の設定項目

`host`：サーバー型のデータベースを使う際にここでアクセスするデータベースサーバーのアドレスを指定

`username`：サーバー型の場合、アクセスするアカウント名を用意する

`password`：サーバー型の場合、アクセスに使うアカウントのパスワードを用意する

`encoding`：テキストのエンコーディング名を指定する

#テーブルの作成
データベースを使うためにテーブルを用意。データベース内のデータの保管場所。
何を保管するか定義し、データを保管する。

`.table`：テーブルの確認コマンド

`create table テーブル名 (項目名 タイプ, 項目名 タイプ,…);`テーブルを作成するコマンド。保管するものを定義するために名前とタイプを指定。以下に3つの名前とタイプ。

`id integer`：IDの項目、数字。
`name text`：名前の項目、テキスト。
`mail text`：メアドの項目、テキスト。

#データの保存
`insert into テーブル名 values (値, 値, …);`：保管先のテーブル名と値をまとめて記述する。値がテキストの場合、シングルクォートをつける。

#全データの表示
テーブルに保存しているデータを見る
`select * from テーブル名;`：テーブルにある全データを丸ごと取り出す

#データの検索
特定の条件で合うものをデータとして取り出す。

`select * from テーブル名 where 条件;`：検索条件を指定して特定のものをピックアップ。
cssを使って円の中に円を描く方法　〜レスポンシブ対応〜

cssを学び始めたので備忘録として
htmlとcssだけで円を作図し、中央に入れ子にしたい。

###html
```html:sample.html
<div class="circle1">
 <div class="circle2">
  <div class="circle3">
   <div class="circle4"></div>
  </div>
 </div> 
</div>
```

###css
```css:sample.css
.circle1 {
    margin: 0 auto;
    width: 30%;
}

.circle2 {
    position: relative;
    width: 100%;
    padding-top: 100%;
    border-radius: 50%;
    background-color: #f389da
}

.circle3 {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 75%;
    padding-top: 75%;
    border-radius: 100%;
    background-color: #14baed;
    transform: translate(-50%, -50%);
}

.circle4 {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 50%;
    padding-top: 50%;
    background-color: #faf82d;
    transform: translate(-50%, -50%);
}
```


##こんな感じ
![スクリーンショット 2021-02-23 3.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683664/4c2184a1-20bf-4c71-4c84-f498d63dc6d8.png)



border-radiusをなくすと正方形にできます。
positionとtransformで中心に合わせています。
最外のcircle1では円を描いてないけど、基準の幅（width: 30%)を設定しているので、これがないと中心に合わせられない。


##参考記事

[【CSS】子要素を親要素内で上下左右中央寄せさせる方法](https://takayamato.com/code/block-centering/)
[レスポンシブな正円の中央に文字を配置するCSS](https://vivo-log.com/work/css/responsive-perfectcircle-centering-text)
[サイズ可変の正方形や正円をCSSで描画したい](https://saruzie.com/knowledge/%E3%82%B5%E3%82%A4%E3%82%BA%E5%8F%AF%E5%A4%89%E3%81%AE%E6%AD%A3%E6%96%B9%E5%BD%A2%E3%82%84%E6%AD%A3%E5%86%86%E3%82%92css%E3%81%A7%E6%8F%8F%E7%94%BB%E3%81%97%E3%81%9F%E3%81%84/)
PlatformIOで.inoファイルを使う方法


# はじめに
ArduinoIDEを使ってるうちにに思うこと
・コンパイルが遅い！
・エディタが不親切！
・組み込みなのにデバッグできない！

Arduinoの開発にArduinoIDEを使うのはもうやめにして、PlatformIOというのを使いたい。
ただ、PlatformIOのソースファイルはC++(.cppファイル)で生成される。
会社でArduinoを使っており、他のユーザーと共有することを考えて.ino形式にしておきたい。
（ちなみによくあるArduinoライブラリは.inoと.cppが混合で書かれているが、PlatformIOでは.inoファイルは.cppファイルに変換してくれるらしい）

# 環境
Visual Studio Code（PlatformIOプラグイン導入済み）


# .inoの使い方
新規で作る場合と過去プロジェクトを開く場合があるが、今回は後者を記載。
## プロジェクトを開く
VSCodeからPIO HOMEを開き、Import Arduino Projectを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/12eae3ae-1a30-c42a-c41c-e1559dfbd615.png)
Boardは「Arduino Uno」などを適宜選択し、.inoファイルが格納されたフォルダを選択し、Importする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/be50d262-6fa6-bc64-cf7c-eb975f511657.png)
Importされるとプロジェクトが作成され、srcフォルダの下に.inoファイルが格納される。
ただ、pinMode()やdigitalWrite()みたいなArduino独自の関数で「定義されていません」とエラーが出てしまう。
Arduino独自の関数は全て「Arduino.h」にインクルードされているので、以下の文を追加する。

```blink.ino
#include <Arduino.h>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/d85b3159-6a37-fb42-4247-99bcf19dd62c.png)

左側の虫マークを選択し、「Upload」で書き込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/20acb2e4-ed85-76d5-13de-0f6cb36db329.png)

Arduino上でLチカが確認できたので成功！
MacにWindowsをインストールしようとしたら破損して詰んだ話( 解決法あり)

# 対象
Macにwindows10をインストール中に不具合がおきた



## 手順
Windows10のライセンスをダウンロードしBootcampで使ってWindows環境を構築する。
システムリリース直前でWindows環境でテストを実施するためにインストールを試みてていました。
そこで事件が起こりました、、、、、



## エラー内容
結論からいうとインストール中にWindowsファイルが破損しPCが動かなくなりました、、、

焦りすぎて写メすらとっていなかったのですが、
内容はこちら


```
回復
PCの電源を正しくキルことができませんでした
修復が必要です

エラーコード0xc0000001

回復ツールを使用する必要があります。
インストールメディア(ディスクやUSBデバイス)がない場合はPC管理者またはPCデバイス製造元に
お問い合わせください。

再実行するにはenter
回復するにはF1を推します
スタートアップ設定を表示するにはF8キーを押してください
```

とのことです、、、、
最初はなんか途中でエラーが出たのか〜くらいだったのでまず
enterで再実行→また同じ画面
あれ、、、、
F1とF8で回復を図ろうとすると、、、

ファンクションキーが押せない！！！！！！！
再起動してもずっと同じ画面で、まじで本当に詰んだと思いました笑

## 解決法
最初はこれ1日でどうこう治る話じゃないと思ったのですが、ググり倒していると簡単に解決法が見つかりました。

1. PCを強制シャットダウン
2. PCが立ち上がる瞬間に電源ボタン＋Optionキー
→このふたつを押すことによってこのPCでどのOSを扱うか選択できる画面に行きます

Macを起動するのでMacintosh HDを選択！！！

これでなんとかMacOSで修復することができました、、、、

いやー本当にこれは顔が青ざめるくらい焦ったので誰か同じ現象が起きた人の役に立って欲しいです笑

では！！！笑
Microsoft Remote DesktopでMacのCommandキーをWindows制御時にCtrlに割り当てる

## 目的

MacではCommandキーをそのまま動作させWindowsだとCtrlキーとして切り替えて動作させる
両環境共に同じキーでコピーや貼り付けができるようになるので楽

※Microsoft Remote Desktopとは・・・MacからWindows機をリモートでデスクトップ制御する際につかうもの
 
## 環境
+ MacBook Pro BigSur 11.1 (リモート制御する側)
+ Windows10 Professional (リモート制御される側)

## 使用ソフト
Microsoft Remote Desktop Version 10.5.1 (1852)
Karabiner-Elements (13.3.0)
※両方ともMacのアプリケーションです

## 手順

**1. [公式サイト](https://karabiner-elements.pqrs.org)からKarabinerをダウンロードしてインストールする**
**2. Karabiner-Elementsを起動してMiscタブからOpen config folder(右下)ボタンをクリック**
![スクリーンショット 2021-02-23 1.36.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/a227ebb5-f997-9af9-1183-c305b7c64e99.png)
**3. karabiner/assets/complex_modificationsフォルダを開き新しくjsonファイルを作成する**

(ここではms_rdp.jsonという名前で作成した)

![スクリーンショット 2021-02-23 1.39.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/ba79f310-f965-7231-c785-c9c7d9e8731a.png)

ファイルの内容を下記のようにする

```json:ms_rdp.json
{
  "title": "command to ctl in RDP",
  "rules": [
    {
      "description": "keybind in Microsoft RDP",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "left_command"
          },
          "to": [
            {
              "key_code": "left_control"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.microsoft\\.rdc\\.macos$"
              ]
            }
          ]
        }
      ]
    }
  ]
}
```
少しだけ解説
fromとtoで左コマンドキーを左コントロールに変更している
このままだと全てのアプリに適用されてしまうのでconditionsでMicrosoft RDPを使用中のみ有効にするように設定
bundle_identifersはKarabiner-EventViewerで確認したものを正規表現にしたもの


**4.Complex modificationsタブからAdd ruleボタン→先ほど作成したjson(keybind in Microsoft RDP)をEnableにする**
![スクリーンショット 2021-02-23 2.05.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/fa19b6ee-414e-677c-fe4e-6b192334501c.png)


**これでMicrosoft Remote Desktopを使用中のみ左コマンドキーが左コントロールキーとして動作するようになりました**
Docker-Laravelローカル環境を構築(Mac)

#どんな記事
Docker上でLaravel環境を構築するための記事

#こんな人向け
・とりあえずLaravelを使いたいけど、ローカル環境は汚したくないのでDockerを使いたい人
・「細けぇことはいいんだよ！とりあえずコード書かせてくれよ！」という人向け

#準備
DockerやDocker-composeなどのインストールは終わっている状態

#ディレクトリ構成
下記の構成に沿ってあらかじめフォルダを作成します
「sample_docker_laravel」の部分は作りたいアプリ名に変更してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/e5f81517-cd37-465d-8d13-28e13dcd69f2.png)

#docker-compose.ymlの作成
```docker-compose.yml
version: '3'

services:

 app:
   ports:
     - "80:80"
   build: ./docker/app
   container_name: laravel_app
   volumes:
     - ./src:/var/www/html

 db:
   image: mysql:5.7
   container_name: laravel_db
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laravel_db
     MYSQL_USER: laravel_user
     MYSQL_PASSWORD: laravel_pass
     TZ: 'Asia/Tokyo'

   command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
   volumes:
     - ./docker/db/data:/var/lib/mysql
     - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
   ports:
     - 3306:3306

```

#Dockerfileの作成

```Dockerfile
FROM php:7.4-apache

ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

```

#000-default.confの作成
app_nameの部分は作りたいアプリ名にしてください

```000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/app_name/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/app_name/public>
           AllowOverride All
       </Directory>
</VirtualHost>

```

#php.iniの作成

```php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

```

#my.cnfの作成

```my.cnf
[mysqld]
character-set-server=utf8

```

#ターミナルでアプリのディレクトリへ移動
```
$ cd app_name
```

#Dockerを起動状態しておく(忘れないように)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/79b7b0d7-233c-f1cb-1347-c36a94765583.png)

#Dockerイメージを作成する(ちょっと時間かかります)
```
$ docker-compose build
```

#Dockerをバックグランドで起動
```
$ docker-compose up -d
```

#コンテナに入る
```
$ docker exec -i -t laravel_app bash
```

#laravelアプリを作成
app_nameをアプリ名に変更して実行します

```
$ composer create-project --prefer-dist laravel/laravel app_name "6.18.*"
```

#アプリのディレクトリへ移動
```
$ cd app_name
```

#ストレージの権限を変更
```
$ chmod 777 -R storage/
$ php artisan key:generate
```

#ブラウザで起動確認
[Localhost](http://localhost/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/68eaec8c-5418-f77c-1071-28fd9d71ed39.png)

#Dockerの起動をストップする場合は
```
$ docker-compose stop
```

#参考

[Laravel学習帳](https://laraweb.net/environment/8652/)
非常に丁寧に説明されており、大変参考にさせて頂きました。
【2021 最新版】ノンデザイナーだからこそ知っておきたかった10のイラストサイト

みなさん、こんちには

【[watnowテックカレンダー](https://bit.ly/watnowTechCal2021_4)の23日目】
今日は[watnow](http://www.watnow.jp/)の[しゅい](https://twitter.com/shuidayotehehe)が担当します
よろしくお願いします

##はじめに
今回は普段私が資料作りなどの際に利用している
デザインの参考サイト,フリーのイラストサイト,配色のサイトを紹介します

今回**紹介するサイトは全て無料で利用**できます

##デザイン参考

###1,pinterest


![pinterest](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/11e52e75-7af9-0d4a-5cf7-8294875833ec.png)
URL:https://www.pinterest.jp

ピンタレストは画像のSNSのようなものでネット上の画像を自分の「ボード」に
「ピン」して集めたりできる**画像をブックマークとして集めるツール**です

パワポデザインなどと検索してデザインのアイデアを見つけたりして
マネして作ってみるのもありです

###2,dribbble


![スクリーンショット 2021-02-22 23.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/a8895d96-1ad3-851a-f7c9-d98a2add13fe.png)
URL:https://dribbble.com/

dribbbleはアメリカで生まれたサービスで、**招待された人しか画像の投稿ができないため
画像の質がとても高いのが特徴**です
こちらもアイデア出しの時に使うのがおすすめです

##イラスト・アイコン
たくさん紹介するので資料の世界観に合わせて使い分けてください

###3,ソコスト
![スクリーンショット 2021-02-22 23.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/ce1fd53c-0d34-ec0f-4d09-793b4c00e887.png)
URL:https://soco-st.com/

###4,ちょうどいいイラスト
![スクリーンショット 2021-02-22 23.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/71ffe13e-d2a2-82c3-c7c9-c0d5b7e2d8a5.png)
URL:https://tyoudoii-illust.com/

###5,unDraw
![スクリーンショット 2021-02-22 23.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/7d3b2455-60bc-71c8-1ad1-06474860d1fc.png)
URL:https://undraw.co/illustrations


###6,SHiGURENi

![スクリーンショット 2021-02-22 23.57.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/76c8e535-637d-ba3d-9656-6be6fcd47a69.png)
URL:https://shigureni.com/


###7,Tech Pic

![スクリーンショット 2021-02-23 0.00.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/77512fed-02b7-16b0-f6cb-248c43ab3c2a.png)
URL:http://tech-pic.com/

###8,vector Shelf

![スクリーンショット 2021-02-23 0.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/1ba07a79-736b-f0c2-0173-a36967c46aef.png)
URL:https://vectorshelf.com/

##配色

###9,COOLOrS
![スクリーンショット 2021-02-23 0.49.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/5dfca9df-cd32-cc7e-629b-1ccdcedb62d4.png)
URL:https://coolors.co/dd614a-381d2a-3e6990-aabd8c-e9e3b4

こちらのサイトは**ランダムで5色合うように選んでくれるサイト**です
そのうち一色だけ固定してもう一度残りの4色で再度ランダムに選ぶことも可能です
プレゼンなどの資料作る時は**この内の3色を使ってデザインするだけでとても見やすいデザイン**になります

##写真

写真は下記のサイトで検索するだけで複数サイトから検索してくれるし、
**フリーとは思えないくらい数も多い**です

###10,O-DAN

![スクリーンショット 2021-02-23 0.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360221/bca398c1-d31d-0116-11d2-5e6c44d06a33.png)
URL:https://o-dan.net/ja/

##おわりに


どうだったでしょうか。今回のまとめがみなさんの資料作りする際などに役立てたら幸いです
watnowでは、チャレンジ精神旺盛な仲間を募集しています
興味を持たれた方はぜひ[@watnows](http://bit.ly/watnow_twitter)にDMしてください

今回この記事が好評だったためフリーのイラストサイトに特化した記事を書いてみました！
よかったら[コチラ](https://qiita.com/bo_zu_/items/0c09f789c5804132f1ad)もぜひ覗いてみてください！
テーブルの作成　CREATE TABLE文

データベースの作成、テーブルの作成や登録は、SQLを使用してMySQLに命令する。

★テーブルの作成
※なお、ファイルからテーブル作成を行う方法もありファイルから実行できると何度も同じSQL文を毎回自動で実行できる。

CREATE TABLE文で行う。
テーブル名、列名。データ型、制約、テーブルオプションなどを記入。
例
```
CREATE TABLE book_logs(
    id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255),
    author VARCHAR(100),
    status VARCHAR(10),
    score INTEGER,
    impressions VARCHAR(1500),
    save_day TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARACTER SET=utf8mb4;
```


★テーブルの削除
DROP TABLE テーブル名;

★MySQLコマンドと接続・切断
　・MySQLサーバへの接続　mysql -h ホスト名 -u ユーザー名 -D データベース名 -p パスワード
　・MySQLサーバへの接続の切断・・・「quit」or「exit」コマンド。
　※SHOW TABLES;・・・テーブルの確認コマンド。
　※SHOW COLUMNS FROM テーブル名;・・・カラムの確認。
はじめまして

## 自己紹介
FileMakerでお仕事を楽にしようと、本業(事務)の傍ら社内開発をしています。
ちゃんとプログラミングを学んだことはなく、ほぼ独学です。

FileMakerを選んだ理由は、何故か会社にあったから。
そして、今まで続いている理由は、「小さくはじめて、大きく育てることができる」から。
ちょっとした帳票出力のために作ったら喜んでもらえたので、
少しずつ機能を追加して育てているところです。

開発の過程では、先人の皆様が残してくれたTipsにとても助けられました。
いつか私もそうなれたらいいなと思いながら少しずつ書いてみます。
先人の皆様、おかしなところがあればご指摘ください！

## これまで作ったもの
   - タスク管理
   - 顧客管理
   - 帳票出力   
OS: Windows 10 64bit / Claris FileMaker Pro 19

## 参考URL
学習動画
[FileMaker オンライン学習 初級編] (https://content.claris.com/ja-e-learning-b-index)
[FileMaker オンライン学習 中級編] (https://content.claris.com/ja-e-learning-index)
[株式会社ライジングサン・システムコンサルティング](https://www.youtube.com/channel/UComQCw9ejT82NAiMXttO9Pw)

コミュニティ
[Claris コミュニティ](https://community.claris.com/ja/s/)
[初心者のFileMaker pro Q&A](https://fm-aid.com/bbs2/viewforum.php?id=2)
CentOS8 に OpenJDK15 をインストールしたときのメモ

CentOS8 に OpenJDK15 をインストールしようとしたとき、yum では LTS Version しかインストール出来ませんでした。（2021/02/23 時点） 
インストール方法をググってもパッと出てこなかったので、手順をメモしておきます。

rpm をダウンロードしてインストールするのが簡単そうでした。
CentOS8 の rpm は pkgs.org よりダウンロード出来ます。

OpenJDK の rpm は下記からとってこれます。
https://pkgs.org/download/java-latest-openjdk

OpenJDK をインストールする前に依存ライブラリが必要そうで、下記から取得します。
https://pkgs.org/download/java-latest-openjdk-headless

wget で ダウンロードして dnf でインストールします。（2021/02/23 時点） 
（URLは変更になるので、上記ページの Binary Package のURLから最新を落としてください）

```
wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/j/java-latest-openjdk-headless-15.0.2.0.7-0.rolling.el8.x86_64.rpm
dnf -y localinstall java-latest-openjdk-headless-15.0.2.0.7-0.rolling.el8.x86_64.rpm

wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/j/java-latest-openjdk-15.0.2.0.7-0.rolling.el8.x86_64.rpm
dnf -y localinstall java-latest-openjdk-15.0.2.0.7-0.rolling.el8.x86_64.rpm
```
（注意）wget で ERROR 404: Not Found. になったらURLが古くなってます。

CentOS8 に Java15 がインストール出来ました。
 
```
java --version

openjdk 15.0.2 2021-01-19
OpenJDK Runtime Environment 20.9 (build 15.0.2+7)
OpenJDK 64-Bit Server VM 20.9 (build 15.0.2+7, mixed mode, sharing)
```

以上、簡単に手順をメモしておきました。
単一のプラグインコマンドで複数のコモンイベントを呼び出す


単一のプラグインコマン
ドで複数のイベントを呼び出します。
配列でコモンイベント番号のリストを渡し、その番号順で呼び出します。
使いたい方は以下のソースコードをコピペしてご自由にお使いください。
著作権は放棄しています。


```js:
/**
 * @param {Game_Interpreter} root 
 * @param {Number[]} eventIdList 
 */
function eventMultiCall(root,eventIdList){
    let target = root;
    for (let index = eventIdList.length-1; index >=0; index--) {
        const eventId = eventIdList[index];
        const newEvent = $dataCommonEvents[eventId];
        if(newEvent){
            target.setupChild(newEvent.list,target.eventId());
            target = target._childInterpreter;
        }
    }
}
PluginManager.registerCommand(PLUGIN_NAME,"multiCall" ,function(arg){
    const eventList = JSON.parse(arg.eventList)
    eventMultiCall(this,eventList);
});


```
##原理
配列で[1,2,3]を渡した場合で説明します。
上記の処理では「コモンイベントの呼び出し」に使われるsetupChild()を利用しています。
コモンイベントはスタックとして処理されるので、配列を逆順でループして呼び出し関係を作ります。

まず現在実行しているイベントでコモンイベント3を呼び出した場合と同じ動きをします。
その後、コモンイベント3が実行される前に3から2を呼び出したように設定します。
さらに2から1を呼び出したのと同様の動きをします。
プラグインコマンドの処理が終わり、インタプリタはイベントが予約済みであるため、処理を移します。
それが連鎖的に発生し、予約のない状態である1から順に解決が始まります。
Docker CMDとEntrypointの違い

# はじめに
Dockerfileを作る時に使うCMDとENTRYPOINTの使い分けについてよく忘れるのでメモとして残します。

## CMD
5秒スリープするコンテナーを作成するためのDockerfileあるとします。

```Dockerfile
From Ubuntu

# CMD command param1
CMD sleep 5
```

OR

```Dockerfile
From Ubuntu

# CMD ["command", "param1"]
CMD ["sleep", "5"]
# 最初の要素が実行可能ファイル・コマンド
# 引数をスペース空けて指定するのがダメ
```

上記のファイルをビルドし、コンテナーを作ります。

```bash
docker build -t sleeper .
```
そして、コンテナーを実行します。

```bash
docker run sleeper
```
※コンテナーが**実行**され、**5秒スリープ**し、**終了**します。

では、以下のコマンドを実行するとどうなりますでしょうか？

```bash
docker run sleeper sleep 10
```
※コンテナーが実行され、10秒スリープし、後終了します。
<font color="red">つまり、コマンドラインで指定したコマンドに上書きされます。</font>

## ENTRYPOINT
例えば、以下のように<font color="red">スリープ時間のみを引数と与えたい</font>時どうしたら良いでしょうか。

```bash
docker run sleeper 10
```
この時に出てくるのが*Entrypoint*。

```Dockerfile
From Ubuntu

# ENTRYPOINT ["command"]
ENTRYPOINT ["sleep"]
```
Docker runした時にコマンドラインで指定した引数が「sleep」の引数として追加されます。

※しかし、**引数なしでコマンドを実行したらどうなりますでしょうか？**

```bash
docker run sleeper
```
sleepに引数がなく<font color="red">エラー</font>になります。

## CMD & ENTRYPOINT
引数のデフォルト値を設定するにはどうしたらよいでしょうか？例えば、以下のどのコマンドを実行しても正しく動作するにはどうしたらよろしいでしょうか？

```bash
docker run sleeper
docker run sleeper 20
docker run sleeper 10
```
このような時にはCMDとENTRYPOINT両方使います。

```Dockerfile
From Ubuntu

# ENTRYPOINTの場合は末尾に引数として追加されるため、
# コマンドラインで指定したものがあれば追加される
ENTRYPOINT ["sleep"]

# CMDの場合はコマンドラインで指定したもので上書きされるため、
# 指定があればその値を採用、なければ下記の「5」を採用
CMD ["5"]
```

補足
コマンドラインでEntrypointを変更する事ができます。

```bash
docker run --entrypoint SleepVER2 sleeper 20
```
--entrypointについては以下のページを参考にしてください。
[https://docs.docker.com/engine/reference/run/#entrypoint-default-command-to-execute-at-runtime](https://docs.docker.com/engine/reference/run/#entrypoint-default-command-to-execute-at-runtime)
AtCoder Regular Contest 113

##[A - A*B*C](https://atcoder.jp/contests/arc113/tasks/arc113_a)

O(N)
a, bが決まればcの値が決まります。
bの値のループ時の制約は、「a*b<=k」にする事で計算量を減らせます。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    ll k;
    cin >> k;

    ll cnt=0;
    for(ll a=1; a<=k; a++){
        for(ll b=1; a*b<=k; b++){
            ll c = k / (a*b); 
            if(a*b*c <= k){
                cnt+=c;
            }
        }
    }
    cout << cnt << endl;
    return 0;
}
```

##[B - A^B^C](https://atcoder.jp/contests/arc113/tasks/arc113_b)

この問題は全く分かりませんでした。
コンテスト中はノートを使わず空想で１桁目を取り出すイメージでやってました。
絶対だめですね、ノートは必須アイテムです。

```python:waのコード

def main():
    a, b, c = list(map(int, input().split()))
    n = pow(b, c, 10)
    res = pow(a, n, 10)
    print(res)

# エントリポイント
if __name__ == '__main__':
    main()
```

まず1~9の数値をそれぞれb^cへ当てはめて、１桁の数値の一覧を確認しましょう。

```txt:1~9の数値を使用したb^cの一覧
1 1 1 1 1 1 1 1 1 
2 4 8 6 2 4 8 6 2 
3 9 7 1 3 9 7 1 3 
4 6 4 6 4 6 4 6 4 
5 5 5 5 5 5 5 5 5 
6 6 6 6 6 6 6 6 6 
7 9 3 1 7 9 3 1 7 
8 4 2 6 8 4 2 6 8 
9 1 9 1 9 1 9 1 9
```

最大で４周期になってるとのこと。
pow(b, c, 4)を使用して余りのnをAの指数にすると良いらしいです。
その前にpow(b, c, 4)の値を確認しましょう。

```txt:1~9の数値を使用した(b^c)%4の一覧
1 1 1 1 1 1 1 1 1 
2 0 0 0 0 0 0 0 0 
3 1 3 1 3 1 3 1 3 
0 0 0 0 0 0 0 0 0 
1 1 1 1 1 1 1 1 1 
2 0 0 0 0 0 0 0 0 
3 1 3 1 3 1 3 1 3 
0 0 0 0 0 0 0 0 0 
1 1 1 1 1 1 1 1 1 
```

０があるので+4しましょう。

```txt:1~9の数値を使用した(b^c)%4+4の一覧
5 5 5 5 5 5 5 5 5 
6 4 4 4 4 4 4 4 4 
7 5 7 5 7 5 7 5 7 
4 4 4 4 4 4 4 4 4 
5 5 5 5 5 5 5 5 5 
6 4 4 4 4 4 4 4 4 
7 5 7 5 7 5 7 5 7 
4 4 4 4 4 4 4 4 4 
5 5 5 5 5 5 5 5 5 
```

a^b^cみたいな指数の指数の計算時、周期性があるのでb^c%ループ数の計算をし余りnを取得。
a^nを計算すると1桁目が取得できる。
中学受験の典型問題で知らないのは受験をしてない人だけらしいです。
都会の小学生、私より数学が強いんですね。。。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

ll modPow(ll a, ll n, ll mod){
    ll res = 1;
    while(n>0){
        if(n&1) res = res * a % mod;
        a = a * a % mod;
        n = n>>1;
    }
    return res;
}

void solve(ll a, ll b, ll c){
    ll n = modPow(b, c, 4)+4;
    ll res = modPow(a, n, 10);
    cout << res << endl;
}

int main() {
    ll a, b, c;
    cin >> a >> b >> c;
    solve(a, b, c);
    return 0;
}
```

ACになりました。

##感想
b問題は難しくて応用問題が出た際は解ける気がしないです。
Spriteset_MapのZにご用心

ツクールMZ対応プラグインをMVにも対応させようとした場合に遭遇した問題です。

Spriteset_MapはScene_Map(ゲーム中のフィールド画面)で使われるスプライトです。
マップに描画されるオブジェクトはZ座標があり、これによって表示の優先順位が決められています。
もしこの値が設定されてない場合NaNで比較されてしまうため、順位が定まらず点滅します。

解決手段としては、zを設定しておくことです。
1ならイベントやプレイヤーの下、3ならプレイヤーと同じ、5ならプレイヤーなどの上です。
Visual Studio Codeのjupyter extensionでJuliaコードのハイライトを適用する方法

## 概要

VSCodeにjupyter拡張機能を入れることでVSCode上のJupyterでJuliaが書けるようになりました。
実際に導入してみましたがシンタックスハイライトが適用されなかったため、対処法について記載します

## 環境/前提

### 環境
OS：Windows10 Home
VSCode：1.53.2

### 前提
Visual Studio CodeでJupyter拡張機能がインストール済でJuliaカーネルが導入されていること

## 手順

シンタックスハイライトに必要な設定ファイルを探します。
Windows環境であれば以下に存在するはずです

- C:\Users\\[ユーザー名]\\.vscode\extensions\julialang.language-julia-1.1.26

最後の1.1.26の部分は導入しているJulia拡張機能のバージョンによって異なるかもしれません

以下3つのファイル、フォルダをコピーします

- syntaxesフォルダ
- julia.language-configuration.json
- package.json

次のパスへ移動します（AppDataは隠しフォルダなのでエクスプローラーオプションで隠しフォルダを表示するようにしてください）

- C:\Users\\[ユーザー名]\\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions

ここにjuliaというフォルダを作成します。
そして、juliaフォルダに先ほどコピーした3つのファイルとフォルダとペーストします。
スタンドアロン版のVSCodeを使っている場合、上記パスの途中に記載されているresourcesフォルダが、VSCode本体と同じフォルダの中にあるはずですので、そこからapp\extensionsと辿ってください

ペーストした結果は以下のようになります

<img width="250" alt="config.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136146/dc899b49-17be-c452-6c4f-530f0ff317ff.png">

VSCodeを再起動すると…

<img width="180" alt="highlight.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136146/a8fbcc67-a344-a957-b21e-d2d0abe3dc67.png">

無事コードがハイライトされました！

## 参考

- [Add configuration files for code highlighting #1620](https://github.com/julia-vscode/julia-vscode/issues/1620#issue-683938901)
周波数応答シミュレーション（scilab）

#はじめに
今日調べたことで、いつか使いそうなので、まとめておく。


#ゲイン（増幅率）
出力／入力で表される。

デシベル表記にするとき、
G[dB] = 20log10(output/input)
25mVの入力に対し、100mVの出力の時、
ゲインG = 0.25 = -12[dB]


###なぜ対数表記にするのか。
人間（生物？）の感覚に合わせるため。
例えば、
振幅、周波数、音、明るさ、地震の強さであるマグニチュード


#シミュレーション
モータの伝達関数　1/(s^2 + s + 10)　のときのscilabのシミュレーション
上のグラフの尖っているところは固有振動数であり、これが建物などで、偶然外力によって、この固有振動数が与えられると崩壊しやすい。

```scilab.
s = %s;
G = syslin('c', 1/(s^2 + s + 10));
bode(G);           // ボード線図,　周波数応答のゲインと位相をプロットする
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/494e002e-c03d-904c-c1a3-2d7007e5b071.png)
wsl2環境でCentOS7.9のテスト環境を構築する

## Linux計算機のテスト環境を構築する
いろいろなテストができる環境を構築したくwsl2でCentOS7.9をインストールした環境を作る。
Microsoft storeのCentOSは有償(しかも公式でない)なので、GitHubでアップしてくれてるフリーのものを使う。

お役に立てたら、LGTMよろしくお願いします。

## CentOS 7.9をwsl2に入れる
wsl2自体は有効な環境であるという前提。

GitHubよりFree版を手に入れる。
下記よりCentOS 7.9-2009のCentOS7.zipをダウンロードする。
https://github.com/mishamosher/CentOS-WSL/releases/tag/7.9-2009

CentOS7.zipを解凍して、下記のフォルダにコピーする。

```powershell
%userprofile%\AppData\Local\Packages
```

Powershellを立ち上げて上記フォルダまで移動し(cdコマンドを打った後ろに、エクスプローラーのアドレスをD&DしてもOK）、下記を実行する

```powershell
.\CentOS7.exe
```
インストールが終わったら、PowerShellかコマンドプロンプトで.\CentOS7.exe を実行するとCentOSに入れる。

インストール後のwslのOS確認

```powershell
$ wsl -l -v
#実行結果
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
  CentOS7         Running         2
```
CentOS7が入っているのがわかる。

ショートカットを作って起動できるようにする。
デスクトップで右クリック→ショートカット
場所にC:\Windows\System32\wsl.exe -d CentOS7
名称をCentOS7.9
で作成。
下記はショートカット(自動でアイコンが！)とCentOS上でOS情報を出した画面。
![CentOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302038/b41e9128-8641-9e6f-14e0-4c0a1f4bb98a.jpeg)

### Vimを更新する

```bash
$ yum info vim-enhanced
# 実行結果
Available Packages
Name        : vim-enhanced
Arch        : x86_64
Epoch       : 2
Version     : 7.4.629
Release     : 8.el7_9
#以下略

$ yum install vim-enhanced
```

## 作業ユーザーを作る
rootで下記のコマンドを実行.

```bash
# testuserというユーザーを作る
useradd testuser
# rootにパスワードを設定する
passwd
```


デスクトップのショートカットを下記とすると、作ったtestuserでログインできる。
場所にC:\Windows\System32\wsl.exe -d CentOS7 -u testuser
なおデフォルトだと、ログイン時に、/home/testuserにならないので、bashrcにcd ~を入れておくと便利。
【Rails】 レビュー投稿は１度までに制限する方法

はじめに
---
先日口コミサイトのレビュー機能を実装していた際に、一人のユーザーが何度もレビューの投稿を出来ては困る、どうしたら良いのだろうかと悩んだことがありましたので、自身の備忘録として記事に残しておきたいと思います。
<br>

開発環境
---
ruby 2.6.3
Rails 5.2.4.4
<br>

テーブル同士の関係性
---
※今回の記事に必要な最低限のテーブルのみ掲載しております。
<img width="800px" alt="スクリーンショット 2021-02-22 22.42.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942338/ee72b3bd-95b5-9ab1-fa99-2a3a0012f31a.png">
<br>

モデル
---
reviewモデルには、評価の値の空を禁止すること、１以上５未満（５段回評価のため）で評価しなければならない、というバリデーションを設定しております。

```review.rb
class Review < ApplicationRecord
  belongs_to :member
  belongs_to :shop

  # 星の評価の空を禁止する、且つ1以上、5未満
  validates :rate, numericality: {
    less_than_or_equal_to: 5,
    greater_than_or_equal_to: 1,
  }, presence: true
end
```
<br>

レビューの入力画面
---
form_withのモデルを＠shopと＠reviewの2つを指定しているのは、ルーティングでshopにreviewをネストさせているためです。

```html:reviews/new.html.erb

<!-- urlを指定しないと、エラーになる -->
<%= form_with(model:[@shop, @review], url: shop_reviews_path, local: true) do |f| %>
<%= render 'layouts/error_messages', model: @review %>
　<div class="new-review-title">
　　<%= f.label :"タイトル" %><br>
　　<%= f.text_field :title, class: "new-review-title-form" %>
　</div>
　<div class="new-review-rate">
　　<div class="form-group" id="star">
　　　<%= f.label :"評価" %><br>
　　　<!-- JavaScriptでidの値"star"の記述を使用するため-->
　　　<%= f.hidden_field :rate, id: :review_star %>
　　　<%= render partial: 'member/reviews/star', locals: { review: @review } %>
　　</div>
　</div>
　<div class="new-review-body">
　　<%= f.label :"口コミ内容" %><br>
　　<%= f.text_area :content, placeholder: "星のみの評価でもレビューを投稿できます！" %>
　</div>
　<%= f.submit '投稿', class: "edit-profile-btn" %>
<% end %>

```
<br>

コントローラー
---
##### 冒頭でもお伝えいたしましたが、「一人のユーザーに付き、一店舗へのレビューは一度までに制限したい」というところが今回のポイントです。

```reviews_controller.rb
class Member::ReviewsController < ApplicationController

  def new
    @shop = Shop.find(params[:shop_id])
    @review = Review.new
  end

  def create
    @shop = Shop.find(params[:shop_id])
    @review = current_member.reviews.new(review_params)
    @review.shop_id = @shop.id
    review_count = Review.where(shop_id: params[:shop_id]).where(member_id: current_member.id).count
    # バリデーションによるエラーがあるか判定
    if @review.valid?
      # バリデーションエラーが無い、且つレビューを一度もしたことない場合
      if review_count < 1
        @review.save
        redirect_to shop_reviews_path(@shop), notice: "レビューを保存しました"
      else
        redirect_to shop_reviews_path(@shop), notice: "レビューの投稿は一度までです"
      end
    else
      flash.now[:alert] = "レビューの保存に失敗しました"
      render :new
    end
  end

〜以下省略〜

end
```
(説明)
● review_count = Review.where(shop_id: params[:shop_id]).where(member_id: current_member.id).count
　　レビューの回数を数えるための記述
　　全レビューの中から、その店舗（今回レビューを投稿されようとしている店舗）のshop_idと、そのユーザー（ログインしている、現在レビューを投稿しようとしているユーザー）のmember_idが存在するかどうかを判定
　　※既にレビュー済みであれば、カウントは１になります。

● if @review.valid?
　　バリデーションによるエラーがあるかどうかを判定

● if review_count < 1
　@review.save
　　レビューの回数が１未満(つまり、まだレビューを投稿していない)のであれば保存

---

つまり...
####「バリデーションに引っかかることなく、尚且つ一度もレビューしていなければ保存される」
というような仕組みになっています。

---

逆にいうと...
####「バリデーションに引っかかってしまったり、既にレビュー済みであれば保存されることがない」
という仕組みであるとも言えます。
<br>


終わり
---
今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になればと思います。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
OpenSSLコマンド使用方法（Windows）

以下に移行しました。


https://pki.world-tls.com/openss-command-windows/

https://pki.world-tls.com/openssl-beginner/

https://pki.world-tls.com/openssl-install-windows-11/

https://pki.world-tls.com/openssl-web-server/
[Ruby on Rails]  WebpackerでjQueryを管理する方法

今回は、**jQuery**のインストール方法について備忘録を書いていきます。

**jQuery**は、JavaScriptを簡易的に記述できるライブラリで、今でも根強い人気を持つものです。
ライブラリを導入するためには、事前の設定がいくつか必要です。

まずはコマンドを実行しjQueryをインストールしていきます。


#% yarn add jquery

jQueryの導入には、jquery-railsというGemを利用することもありますが、今回のように**Webpacker**で管理する際は、Node.jsのパッケージを利用します。

　


yarnコマンドを実行した後は
**webpackの管理下に追加する記述**を追加で書いていきます。

```config/webpack/environment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    jquery: 'jquery',
  })
)
module.exports = environment
```
　　

次にapplication.jsでjQueryを呼び出す記述を加えて行きます。

```app/javascript/packs/application.js
require ("jquery")
```

これでjQueryの導入が完了しましたが、
まだ読み込む為の記述がないので書いていきます。
　　
　　

```app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>
```

上記の記述のうち、上のstylesheet~~~の記述は
**turbolinks**の関係上、自分はいつもコメントアウトにしています。
下の記述があれば動作は問題なく動いたので、
好きなようにして頂いても構いません。


これでjQueryと読み込みの準備が整いました。
後は好きなように記述していくだけです。
【Javaについてまとめてみたオブジェクト編】抽象クラスについて

#はじめに
今回はJavaの抽象クラスについて書いていきたいと思います。
そんなに難しくはないのでサラッと理解しましょう！

##抽象クラスとは
抽象クラスは継承されることを前提としたクラスでスーパークラスとなる為に生まれた存在です。
特徴としては、

- クラス宣言時にabstractを付ける
- newをしてインスタンスを作成することが出来ない
- 抽象メソッドを作成することが出来る。

といったものがあげられます。

###抽象クラスの宣言
```java:抽象クラスの宣言
//下記のどっちかの宣言
abstract public Class Member{};
public abstract Class Member{};
```
宣言する時はこのようにアクセス修飾子の前後どちらかにabstractを付けます。

##抽象メソッドとは
抽象メソッドはスーパークラスでは処理内容は書かずにサブクラスで必ずオーバーライドしないといけないメソッドになります。
逆に言うと、**必ずオーバーライドして欲しいメソッドを書きたい時**に使います。
###抽象メソッドの宣言
```java:抽象メソッドの宣言
public abstaract void show();
```
抽象メソッドは**「{}」**を書きません。
オーバーライド前提なのでサブクラスで処理を書いてもらいます。
##抽象クラスを使いたい場面の例
どんな時に抽象クラスを使うのか例を示したいと思います。
例えば図形のクラスを作りたいと思ったときに「三角形」や「四角形」など様々な図形がありますね。
図形には面積を出す公式がそれぞれ個別に存在します。
公式で計算してくれるメソッドは絶対欲しい！
そんな時はまず抽象クラスで図形のスーパークラスを作ります。


```java:図形の抽象クラス
abstract public Class Shape(){
  //コンストラクタ
　protected Shape(){}
  //公式を書く用のメソッド
　abstract public int areaFomula();
}
```
あとは、この抽象クラスを継承して様々な図形のサブクラスを作っていきましょう

```java:図形のサブクラス
//三角形のクラス 
public Class Triangle extends Shape(){
    public Triangle(){
     super();
    }
    
   @Override 
   public int areaFomula(){
     //底辺*高さ/2の処理を返す
　　　...
   }
 }
```
##さいごに
抽象クラスどうだったでしょうか。
最大の特徴は抽象メソッドで便利ですが、そこまで難しくはないかと思います。
抽象クラスは抽象メソッド以外のクラスも書けますし、融通が利くのでぜひ使ってみてください！

ご覧いただきありがとうございました。
「Alexa、AWS 認定 Alexa スキルビルダーの勉強方法教えて！」

#はじめに
某ベンダで、クラウドの人材育成企画と研修トレーニングのデリバリを担当しています。AWS 認定Alexa スキルビルダーが**3月中旬でリタイア**する噂を耳にし、急ぎ受験することにしました。（今だけ限定と言われると受験意欲を掻き立てられます）

元々、Specialityを１つは受験しようと思いつつ、なかなか腰の重い状態が続いてました。DX全盛の昨今、その代表格と言っていいAlexaスキルを学ぶことで、最新技術に触れる機会もあり一石二鳥。折角なので、僕の試験対策を共有します。

#教材と勉強方法
Speciality試験の全般に言えることですが、これと言える対策本がありません。Alexaに関しては、AWS認定では王道のblackbeltもありません。色々と先人達の情報を収集しながら、教材を剪定します。

AWSに関する知識はあるものの、Alexaに関しては初心者レベル。
まずは、基本をマスターすべく「Alexa道場」で勉強開始です。
                                                                     
・[Alexa公式 動画シリーズ「Alexa道場」](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/get-deeper/webinars)
再生速度は*2倍*視聴をオススメします。だらだらと視聴すると集中力なくなりますが、逆に倍速再生すると集中しないと内容を聞き取れないので集中力があがります。また、視聴時間を短縮できるのでオススメです。２回くらい繰り返すことで、”インテント”などAlexa独自の用語の理解を深めます。

・[AWS 認定 Alexa スキルビルダー 専門知識 サンプル問題を解説します]
(https://qiita.com/hirosys-biz/items/1d8f0fb7ddc4612e9eaa)
サンプル問題の解説サイトです。10問くらいあります。全問題が丁寧に解説されており、Alexa道場の理解度をここで測定できます。AWS関連の問題は難易度難しくないですが、Alexa開発に関連する問題は、やはり少しハードルを感じます。

・[A CLOUD GURU]
(https://acloudguru.com/)
全編英文ですが、模擬問題をひたすら解きます。模擬試験を10周くらいすると流石に問題を暗記してしまいますが、重要なポイントが効率よく学習できるので強くオススメできます。

・[Alexa Skills Kitマニュアル]
(https://developer.amazon.com/ja-JP/docs/alexa/ask-overviews/build-skills-with-the-alexa-skills-kit.html)
サンプル問題、模擬試験の深掘りのため、blackbeltの代わりにマニュアルを活用します。 主要APIの仕様、コンプライアンス周りの違いはマニュアルを参照することで、確実に理解を深めることができます。

#試験
AWSの試験は、試験毎に”和訳に難あり”とよく言われますが、Alexa スキルビルダーは試験問題がわかりやすい日本語でした。全く違和感ありませんでした。これまで受験した中で、一番和訳が綺麗に変換されている気がします。

試験当日は見直しも含めて、３時間フルに活用しました。結果は合格。（流石に３時間は疲れますね。。。）

#所感
試験範囲が絞れるので十分対策できたかなと思ったのですが、やはり難関問題も数個ありました。（一筋縄ではいかず。。。。）普段業務でAlexa開発に携わるエンジニアならば、応用問題にも十分対応できそうですが、開発やっていないと難しい部分あります。今回は試験対策を優先したのですが、スキル公開まで試してみると公開のプロセスを学習できるので良かったかもしれません。時間をみて、スキル開発もやってみようと思います。
インターネットの速度が遅い原因あれこれ

光回線とします

# 光回線が折れている
死ぬほど遅くなります。大体ISDNレベル
素人ではどうにもなりません、完全に修繕コースです


# GNUが寿命
あんまり無いみたいですが、原因の一つとして


# GNU・ルーター間のケーブル
私がハマった原因の一つ
cat5　100Mbps（規格値）
cat5e　1Gbps（規格値）
cat6　1Gbps（規格値）・伝送帯域が広くなり安定しやすい
cat6a,cat7～もあります

どうやっても100Mbpsにギリギリ届かない場合は、cat5のケーブルになっています
どうやっても1Gbpsにギリギリ届かない場合は、cat6のケーブルになっています

よく見ると、ケーブルにcat5と書いています
※書いていないこともある

私は3分ほど考えた結果、cat8にしました。
50cmで800円で買えます。お守り代わりに最高ランクのもの買っといてもいいんじゃないかな

# ルーターの設定や寿命
速度制限の設定をすることはあまりないと思いますが、念の為。
寿命の場合もガンガン速度が落ちます

# ルーター・PC間のケーブルや無線環境
有線の場合はcat5でないか確認
無線の場合は干渉するものがないかを確認。
PC本体を近づけたり直結させたりして変化がないかを見てみましょう


# PCそのもの
設定など


# PCのソフトウェア
他のアプリがひたすら通信している場合など


全部再起動したら直る事もしばしば
速度に悩んでいる方、頑張って下さい
ベイズ最適化で線形計画法を解いてみた

# ベイズ最適化を用いた材料調達額の最適化

材料調達計画の最適化の問題に対して、ベイズ最適化を使った手法について説明します。
PuLPを用いて線形計画法として解く手法を試されている方が大多数(実際、問題に適合していると思います。)ですが、最近はやりのベイズ最適化というものに取り組んでみました。

### 例題
日ごとの原材料費用、調達量のデータから原材料費用を最小に抑えるように調達タイミングを最適化するような場合を想定します。

### ベイズ最適化とは
ベイズ最適化とは、一言で言えば観測点から確率的に良質な点を予測する手法です。パラメータ最適化の課題に対しては、ある入力パラメータに対して得られる出力を観測したとして、そこから次に探索すべきパラメータ(の組)を考えながら最適値を求めることができます。したがって、ユーザーが用意した格子点状のパラメータを網羅的に探索するグリッドサーチよりかなり効率的に入力パラメータを探索できます。確率的な予測を何によって行うかにはいくつか手法はありますが、本稿では割愛します。

### Optunaを用いた多目的最適化
Optunaはベイズ最適化を行うためのフレームワークで、主に機械学習のハイパーパラメータの調整に良く使われています。ハイパーパラメータチューニングに使用する際は、モデルによる学習結果を出力とし、それに対するハイパーパラメータを入力として最適なハイパーパラメータを探索することになります。total_costを出力とし、各原材料の調達量を入力パラメータとして最適な発注量の組、すなわち発注計画を見つけることにOptunaを用いました。実装は以下のような記事を参考にして行いました。
https://qiita.com/pontyo4/items/0a56528988c1e9e3a65e

### 実装
参考資料を写経するだけで動きます。今回の問題に適用すると、`trial.suggest_int`で発注量の探索範囲を設定し、事前に作った関数`CALC`にて所与データと調達量から各原材料のコストを計算し、その計算結果のコストを最小化するようなコードになります。`trial.suggest_int`の第二、第三引数で入力パラメータの最小値、最大値を設定し、探索空間を定義しています。探査空間の定義法には連続値や離散値もありますが、ググればすぐに出てきます。
(例えばこんなん https://qiita.com/motoyuki1963/items/31da1d9c5f7c7290b105)


```
# 目的関数を設定
def objectives(trial):
    # optunaでのパラメータ探索範囲の設定 
　　# この場合はorder_min_* ~ order_max_*(*原材料名)の間で発注量
    order_A = trial.suggest_int('order_A', order_min_A, order_max_A)
    order_B = trial.suggest_int('order_B', order_min_B, order_max_B)
    ・・・
        } #原材料はA,B, ...とした
        
    # 調達計画量のリストにする
    ORDER　= [####]　
    
    # コストの計算
    total_cost = CALC(ORDER)
    
    # スコアの計算
    # デフォルトでスコアを最小化を行うようになっています。
    return  total_cost

# optunaによる最適化呼び出し
study = optuna.multi_objective.create_study()
# 最適化の実行
#n_trials で探索する繰り返し回数を設定します
study.optimize(objectives,n_trials=100)
   ```


### 最適化の結果
実際に今回の例題に似たようなコンペに出場した際、日毎、各材料毎の発注量を入力パラメータとしてOptunaで最適化した結果はtotal_costはPuLPで計算した結果と比較し、15％程度スコアが上がったような結果となりました。
単純な線形計画の問題を解くのにはやはりPuLPに軍配が上がりますが、コードが簡単で実行しやすいのがOptunaを用いた利点かなと思います。Optunaの方が圧倒的に汎用性が高い気がするので、これからベイズ最適化の実装を始めようとしている方の一助になればと思います。
【Oracle】うるう年を判定するストアドファンクション

# はじめに

以前に[【MySQL】うるう年を判定するストアドファンクション](https://qiita.com/nkojima/items/9245cf73e472052f6934)という記事を書きましたが、この記事ではWikipediaに載っている計算式でうるう年であるかを判定しました。

その後、@Papageno さんの [IS_LEAP_YEAR 閏年チェック](https://qiita.com/Papageno/items/ca4b13273584a6ab7d52)という記事を見て、「2月の末日が29日であるか？」という別の方法でうるう年であるかを判定する方法があることに気が付きました。

今回は @Papageno さんの実装とは少し違う方法で、計算式を使わず簡単にうるう年を求めるストアドファンクションを作ってみました。

# 使用した環境

* Oracle社が提供している[Oracle Live SQL](https://livesql.oracle.com/)でOracle19cを利用しました。

# 作成したコード

* @Papageno さんと同様に「2月29日が存在すればうるう年」という考え方ですが、「指定した西暦年における2月の末日が2月29日であるか？」という実装にしたため、エラー処理を使わずに実装できました。
 * うるう年以外は2月29日は存在しないため、2月29日が存在しないことを前提とした実装にしました。

```sql:is_leap_year.sql
-- 引数の西暦年（YYYY）がうるう年であるかを判定するストアドファンクション
-- うるう年であれば1、そうでなければ0を返す。
CREATE OR REPLACE FUNCTION is_leap_year(year IN NUMBER) RETURN NUMBER
-- 宣言部
IS
  yyyymmdd VARCHAR2(50);
  last_day VARCHAR2(50);
-- 処理部
BEGIN
  -- 引数で指定した西暦年の2月の末日を求める。
  yyyymmdd := TO_CHAR(year) || '-02-01';
  
  SELECT TO_CHAR( LAST_DAY(TO_DATE(yyyymmdd,'YYYY-MM-DD')) , 'DD')
  INTO last_day
  FROM DUAL;
  
  -- 2月の末日が29日であればうるう年、そうでなければうるう年以外と判定する。
  IF (last_day = '29') THEN
    RETURN 1;
  ELSE
    RETURN 0;
  END IF;
END;
```

```sql:実行用SQL
-- 宣言部
DECLARE
  year NUMBER;
  ret NUMBER;
BEGIN
  FOR year IN 2000..2021 LOOP
    SELECT
      is_leap_year(year)
    INTO
      ret
    FROM
      dual;
  
    IF (ret = 1) THEN
      DBMS_OUTPUT.PUT_LINE(year || '年はうるう年です。');
    ELSE
      DBMS_OUTPUT.PUT_LINE(year || '年はうるう年ではありません。');
    END IF;
  END LOOP;
END;
```

```text:実行結果
2000年はうるう年です。
2001年はうるう年ではありません。
2002年はうるう年ではありません。
2003年はうるう年ではありません。
2004年はうるう年です。
2005年はうるう年ではありません。
2006年はうるう年ではありません。
2007年はうるう年ではありません。
2008年はうるう年です。
2009年はうるう年ではありません。
2010年はうるう年ではありません。
2011年はうるう年ではありません。
2012年はうるう年です。
2013年はうるう年ではありません。
2014年はうるう年ではありません。
2015年はうるう年ではありません。
2016年はうるう年です。
2017年はうるう年ではありません。
2018年はうるう年ではありません。
2019年はうるう年ではありません。
2020年はうるう年です。
2021年はうるう年ではありません。
```

# 参考URL

* [IS_LEAP_YEAR 閏年チェック](https://qiita.com/Papageno/items/ca4b13273584a6ab7d52)
* [様々な言語で月末の日付を求める（C#,Java,Ruby,Javascript,VBA,Excel,MySQL,SQLite3,Oracle）](https://qiita.com/nkojima/items/09e7b37cbca40d797bcf)

# 関連URL

* [【MySQL】うるう年を判定するストアドファンクション](https://qiita.com/nkojima/items/9245cf73e472052f6934)
* [【Oracle】ストアドファンクション入門](https://qiita.com/nkojima/items/aa7be169f2d983c0f413)
* [【Oracle】PL/SQL入門](https://qiita.com/nkojima/items/93a9c01741965f11bb8c)