OmniAICreator/Qiita-1.07M huggingface dataset:
【Java】ハッシュユーティリティを列挙型とチェーンな感じで書いてみた

# 0. INDEX
- 概要
- ハッシュユーティリティを書いてみた
- あとがき

# 1. 概要
列挙型を使ってtypoしないぞ計画！
ってそこまで大層なものじゃないけど、いつものようにあれば使うよなって奴です。

# 2. ハッシュユーティリティを書いてみた

## 2.1. 動作サンプル
https://paiza.io/projects/l7JLOgpc_dJpGXJ75gFhqA

## 2.2. 使い方
こんな感じでupdate関数を繰り返せるチェーンメソッド仕様です。

```java
String result = MessageDigestUtil.SHA256
    .update("hello".getBytes())
    .update("everyone".getBytes())
    .toHexString();
        
System.out.println(result);
```


## 2.3. ソースコード
```java:MessageDigestUtil.java
package jp.go.mahny_conf.junk_memo;

import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * SHA-256とか生成するユーティリティ
 * @author mahny
 */
public enum MessageDigestUtil {
	MD2("MD2"),
	MD5("MD5"),
	SHA1("SHA-1"),
	SHA256("SHA-256"),
	SHA384("SHA-384"),
	SHA512("SHA-512"),
	;

	private MessageDigest digest;

	/**
	 * 初期化。使う側は意識しない箇所
	 * @param algorithm アルゴリズム文字列
	 */
	private MessageDigestUtil(String algorithm) {
		try {
			digest = MessageDigest.getInstance(algorithm);
		} catch (NoSuchAlgorithmException e) {
			// 引数のnull指定以外では出ないハズ
			throw new IllegalArgumentException("algorithmの指定が無い", e);
		}
	}

	/**
	 * ハッシュに使用するデータを追加する
	 * @param input 使用するデータ
	 * @return ユーティリティオブジェクト
	 */
	public MessageDigestUtil update(byte input) {
		digest.update(input);
		return this;
	}

	/**
	 * ハッシュに使用するデータを追加する
	 * @param input 使用するデータ
	 * @return ユーティリティオブジェクト
	 */
	public MessageDigestUtil update(byte[] input) {
		digest.update(input);
		return this;
	}

	/**
	 * ハッシュに使用するデータを追加する
	 * @param input 使用するデータ
	 * @return ユーティリティオブジェクト
	 */
	public MessageDigestUtil update(ByteBuffer input) {
		digest.update(input);
		return this;
	}

	/**
	 * ハッシュを生成する
	 * @return ハッシュデータ
	 */
	public byte[] toBytes() {
		return digest.digest();
	}

	/**
	 * ハッシュを生成し、16進数文字列で取得する
	 * @return ハッシュデータ（16進数文字列）
	 */
	public String toHexString() {
		StringBuilder result = new StringBuilder();
		for (byte data : toBytes()) {
			result.append(Integer.toHexString((data >> 4) & 0x0f));
			result.append(Integer.toHexString(data & 0x0f));
		}
		return result.toString();
	}
}
```


# 3. あとがき
列挙型ネタが続いていますが、今回は過去ネタの3番煎じくらいですが、もうちょっと使い勝手に踏み込んだユーティリティを作ってみました。

ちなみに、過去ネタ執筆時の[列挙型の理解が浅かった頃](http://ciablo.blog70.fc2.com/blog-entry-48.html)は、文字列で定義して…

```java:アルゴリズム定義
public static final String ALG_SHA256 = "SHA-256";
```

```java:想定した使い方
byte[] hash = HashUtil.getHash(HashUtil.ALG_SHA256);
```

みたいな使い方を想定するんですが、これだと使い方を浸透させないと↓みたいにチームメイトが好き勝手しちゃうんですよね＞＜

```java:ッ！これは想定外ッ！！
byte[] hash = HashUtil.getHash("SHA-256");
```

使いたい時に直感的に使えるようにしておくのは、他人（未来の自分含む）の為にも大切だなと思う今日この頃です。

ではﾉｼ
量子振幅増幅と量子振幅増幅シミュレーター

## :crown: この記事の目的

量子コンピューティングの理論の一つに量子振幅増幅があります。
量子振幅増幅とは、**Quantum Amplitude Amplifier(QAA)**と呼ばれます。
本記事では量子振幅増幅の原理と、実際にどのように振幅されるのかをグラフで確認できるシミュレータの使い方を紹介します。
※本記事は、令和3年3月29日に執筆しています。

## :crown: 量子振幅増幅とは

量子振幅増幅とは、書いて文字の通り振幅を増幅させるものです。
増幅させるものは**確率振幅**です。確率振幅とは以下の(式1)の$\alpha$,$\beta$を指します。

```math
|\psi〉=\alpha|0〉+\beta|1〉\quad...\;(式1)
```

上記の式は1量子ビットの例です。確率振幅は自身の2乗が確率を表し、全ての確率振幅の絶対値の2乗を合計すると1となります。これを確率原則と言います。

```math
|\alpha|^2+|\beta|^2=1\quad...\;(式2)
```

2量子ビットの場合を見てみましょう。
2量子ビットの場合の一般的な量子状態は

```math
|\psi〉=\alpha|00〉+\beta|01〉+\gamma|10〉+\delta|11〉\quad...\;(式3)
```

と表されます。
確率振幅$\alpha$,$\beta$,$\gamma$,$\delta$は確率原則より以下となります。

```math
|\alpha|^2+|\beta|^2+|\gamma|^2+|\delta|^2=1\quad...\;(式4)
```

確率振幅の増幅とは$\alpha$,$\beta$,$\gamma$,$\delta$のうち、どれか一つを増幅させます。つまり、値を大きくします。
値を大きくすることでその絶対値の2乗も大きくなります。すなわち確率が大きくなります。
確率が大きくなることで、最終的に測定を行った際にその確率振幅項が解として現れることを期待するものです。

## :crown: 振幅増幅の仕方

では、実際に振幅を増幅させてみましょう。
例として、2量子ビットを取り上げます。
2量子ビットの場合は(式3)より項数が4つであるとわかっていますので、具体的に$\alpha$,$\beta$,$\gamma$,$\delta$を以下のように決定します。

```math
|\psi〉=\frac{1}{2}|00〉+\frac{1}{2}|01〉+\frac{1}{2}|10〉+\frac{1}{2}|11〉\quad...\;(式5)
```

次に、増幅させたい確率振幅項に**印を付けます**。
印を付けるとは、具体的には位相を反転させることを意味します。今回の例として、|10〉の確率振幅項に印を付けてみます。

```math
|\psi〉=\frac{1}{2}|00〉+\frac{1}{2}|01〉\color{red}{-}\frac{1}{2}|10〉+\frac{1}{2}|11〉\quad...\;(式6)
```

量子ゲート回路において、この印を付ける方法は以下の操作で行うことができます。
なお、以下の回路では(式5)の状態を生成する手順も含んでおり、そのように回路中に記載しています。

**|10〉に印を付ける場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/14eb2a2e-af99-ca80-7847-8dffa3809507.png)
また|01〉以外の場合のついても印を付ける操作は以下となります。

**|00〉に印を付ける場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/012af0f3-a5d0-8e28-885a-ab52dfb6c2d0.png)
**|01〉に印を付ける場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/5c658641-c5ae-82b0-06fc-a0aa0cfc8d31.png)
**|11〉に印を付ける場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/416c0d6b-d287-01c9-a49c-6a4e9456a750.png)

振幅させたい確率振幅項に印を付けたら、次は確率振幅の**平均値＜av＞**を計算します。
(式6)より以下となります。

```math
\begin{align}
<av>&=\frac{\frac{1}{2}+\frac{1}{2}-\frac{1}{2}+\frac{1}{2}}{4}\\
&=\frac{1}{4}
\end{align}
```

この場合の確率振幅項の値と平均値をグラフにしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/ca273269-d289-5fd6-a690-707d95fb7f19.png)
平均値を求めたら、平均値を軸にして各振幅値を反転させます。これを**拡散変換**と言います。
グラフで確認すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/09c50d1a-f6a0-8302-7a3a-dd2f94b9cf67.png)

上記のように拡散変換を行うことで、印の付いた確率振幅が増幅されることがわかります。
これが確率振幅の仕組みです。
拡散変換を行った後で観測を行うことで、**印の付いた確率振幅項が|10〉であることがわかります**。

本記事では2量子ビットの例を示しましたが、3量子ビットやそれ以上の量子ビットも同様に計算できます。
以下に確率振幅増幅をシミュレーションできるツールをWEB上に公開しました。
増幅させたい確率振幅項に印を付けて拡散変換させ、グラフを表示させることができるツールで、2～5量子ビットで確率振幅増幅を試すことができます。
ぜひお試し頂けると幸いです。

:large_blue_diamond: **量子振幅増幅シミュレーター**
https://amplitude-amplifier.herokuapp.com/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/5ab08f52-0ba5-395a-3b3f-7dad0d44bea2.png)



## :crown: 関連情報

量子振幅増幅シミュレーター
https://amplitude-amplifier.herokuapp.com/index.html

## :crown: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。
Laravelでマークダウンを導入するには??

#ポートフォリオにMarkdownを導入したい
ポートフォリオになぜMarkdownを導入するに至った経緯は、[こちら](https://qiita.com/miyaseinto/items/3e7f38af08cc8687dab6#%E5%B7%A5%E5%A4%AB%E3%81%97%E3%81%9F%E8%8B%A6%E5%8A%B4%E3%81%97%E3%81%9Fpoint)を読んでください！笑
で、どの様にMarkdownを導入したのかは今回はこれを使用しました。

```
composer require cebe/markdown
```

のライブラリをcomposerでインストールして使用しました。


#実際の記述解説


```php:app/Models/Tweet.php
use cebe\markdown\Markdown as Markdown;
#useでインポートを行う。
class Tweet extends Model
{
    public function parse(){
        $parser = new Markdown();
        #$parserにMarkdownを使用する記述を行う
        return $parser->parse($this->content);
        #返り値としてtweetのcontentの内容にparse()メソッドを追加を行う。
    }
    #パース（コンピュータプログラムの機能・処理の一つで、一定の書式や文法に従って記述されたデータを解析し、
    #プログラムで扱えるようなデータ構造の集合体に変換することをパースという）


    public function getMarkdownBodyAttribute(){
        return $this->parse();
        #返り値としてparse()を実施する。
    }
}
```

```php:resources/views/tweets/show.blade.php
        <div>
          {!! $tweet->markdown_body !!}
          #これでtweetの中で保存したcontentの内容をmarkdownで表示させる。
        </div>
```
参考にしたサイトは以下のとおりです。
・cebe/markdownのGitHub:https://github.com/cebe/markdown
・[上の情報を簡略化されたQiita投稿内容](https://qiita.com/ohida/items/f5280ccbb10f9b43f92c#markdown%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B)

#実際に使用して
markdownの導入を行う前は、かなり難しそうで手を出しにくいと考えていましたが、使用してみたらハードルは低いと感じました。しかし、これをライブラリなしで導入できる様に勉強に励まないとなと考えます！
Rubyとは

##Rubyとは
プログラミング言語の一種です。
作者がまつもとひろゆきさんという日本人であることもあり、
日本語のドキュメントが豊富で、プログラミングを学んだことのない方でも比較的学びやすい
言語といえます。

##Rubyのメリット
Rubyはインタプリタ型言語です。コードはコンピューターが理解できるように翻訳した後実行されますが、
インタプリタ型言語はコードを一つずつ随時翻訳してくれます。（コンパイル型言語は実行前に全てを翻訳して実行します）
インタープリタ方式であるRubyはコードを手軽に実行し確認することができます。
Rubyはオブジェクト指向な言語であり、あらゆるものがオブジェクトとして扱われ
開発効率が良いと定評があります。
またRubyは他の言語に比べ記述量が少なく、初学者にも学びやすい言語です。

##Rubyのデメリット
Rubyはインタプリタ型言語の為、コンパイル型言語に比べると実行速度が遅くなってしまいます。
また記述の自由度が高く、ある機能に対して様々記述ができる為、記述者のレベルによって
記述の仕方に差が出てしまいます。

##まとめ
Rubyは日本人が作った言語であり、比較的学習ハードルの低い言語だと思います。
デメリットはあるものの、WebサイトやWebアプリなど様々な開発に利用でき、
利用者の多いメジャーな言語でもあるので、プログラミング初心者が学ぶ最初の言語に適していると思います。
パスからidを取得したい

#背景
dreddでapiテストを作成している。
テストデータを作成するときに使用するidを取得したい。
そのためにパスからidを取得する。

#環境
PHP 7.3.22

#末尾のidを取得する

```
$path = '/users/30';
$id = intval(basename($path));

var_dump($id);
```

結果

```
int(30)
```

やっていること
basenaemでパスの末尾の文字列を取得する
intvalで整数型に変換する

#idがパスの途中にある場合
idが末尾になるようにパスから末尾の文字列をトリムすればいい

```
$path = '/users/30/admin';
$id = intval(basename(rtrim($path, '/admin')));

var_dump($id);
```

結果


```
int(30)
```

#ちょっと沼ったのでメモ
basename()の第２引数にsuffixを指定できる。
これを指定することで、指定した文字列を除いて末尾の文字列を取得できる。
参考
https://www.php.net/manual/ja/function.basename.php

そこで最初は以下のようにしていた

```
$path = '/users/30/admin';
$id = intval(basename($path, '/admin'));

var_dump($id);
```

その結果は以下のようになった。

```
int(0)
```

###問題点
* basenameのsuffixは'/'で区切った最末尾の文字列（'admin'）から'/admin'がその末尾にあれば、除くことになるので、この場合'admin'がbasenameした結果になる
* intvalは失敗するとint(0)を返す

その結果、idが0のテストデータを作成していたため、テスト結果がエラーも出さず望んだ結果にならずに沼ってしまった。
FlutterでPopupMenuを表示する

Flutterで以下のようなPopupMenuを表示する方法を記す。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196890/534b82c8-f674-6b2c-1079-fe6b6ba5d2a1.png" width="120" />
↓タップ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196890/dd851a11-268f-004a-2185-b06a7efdb9a4.png" width="120" />

"Signed in as John Smith"の部分はただのラベル。選択不可。
"Sign out"の部分は、選択可。

## 実現のポイント

- Menu全体には、PoupMenuButtonを使う
- Menuの各項目にはPopupMenuItem、罫線にはPopupMenuDividerを使う
- PoupMenuItemにenabled=falseを指定すると、選択不可項目を作れる
  - ただし、子Textがグレーアウトされるので、TextStyle#colorを指定する必要がある

## コードサンプル

```dart
PopupMenuButton<MenuCommand>(
    onSelected: (MenuCommand value) {},
    // ボタンの見た目を指定。省略すると"..."になる。
    child: CircleAvatar(
        child: Icon(Icons.person),
    ),
    itemBuilder: (BuildContext context) => <PopupMenuEntry<MenuCommand>>[
      PopupMenuItem(
        enabled: false,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Signed in as',
              style: TextStyle(
                color: Colors.black87,
              ),
            ),
            Text(
              'John Smith',
              style: TextStyle(
                fontWeight: FontWeight.bold,
                color: Colors.black87,
              ),
            ),
          ],
        ),
      ),
      const PopupMenuDivider(),
      const PopupMenuItem(
        value: MenuCommand.signOut,
        child: Text('Sign out'),
      ),
    ],
  ),
```

MenuCommandは自分で定義したenumで、Menuの項目選択時のvalueの型に対応している。
サンプルコードでは定義を省略している。

最初に示した図のようにタイトルバーにボタンを置くなら、AppBar#actionsにPopupMenuButtonを於けばOK。
【Gatsby.js】グローバル CSS を反映させたいときは、gatsby-browser.js に設定を記述する

# Gatsby.js 製のサイトにグローバル CSS を使いたい

こんにちは、@ndj です。
表題の通りです。
フォントの設定とか、margin や padding の初期設定をすべてのページ全体に反映させたいときにいちいちコンポーネントごとにスタイルを読み込んだりするのは面倒です。
[Gatsby: Standard Styling with Global CSS Files](https://www.gatsbyjs.com/docs/how-to/styling/global-css/)を確認したところ、方法が見つかったので、備忘録として残しておきます。

## 環境
- Gatsby.js: v3.1.1
- React.js: v17.0.1

## 結論
1. グローバル CSS ファイルを作成する
2. gatsby-browser.js でグローバル CSS ファイルを読み込む記述を追加する


## 手順

### 1. グローバル CSS ファイルを作成する

なにはともあれ、まずは CSS ファイルを作成します。
テストがてら body 要素を真っ赤にしておきましょう。

```global.css
body {
    background-color: red;
}
```

### 2. gatsby-browser.js にグローバル CSS ファイルを読み込む記述を追加する

次は、gatsby-browser.js というファイルに、先ほど作成した global.css を読み込ませます。

Gatsby プロジェクトの root に gatsby-browser.js という名前のファイルを作成します。
そして、以下の記述を追加します。
global.css の場所は適宜確認してください。

```gatsby-browser.js
import './global.css';

//もしくは、
//require('./global.css');
```

これで OK です！

#### 注意！
もし開発サーバーが動いていたら、再起動が必要です。

```
1. Ctrl+C を押して停止
2. gatsby develop を実行
```

#### gatsby-browser.js とは
[Gatsby: Gatsby Browser APIs](https://www.gatsbyjs.com/docs/reference/config-files/gatsby-browser/)によると以下のような記述がありました。

>Introduction
>The file gatsby-browser.js lets you respond to actions within the browser, and wrap your site in additional components. The Gatsby Browser API gives you many options for interacting with the client-side of Gatsby.

サイト全体をコンポーネントでラップできたりするらしいです。
アナリティクスの API なんかはここに設定するみたいです（訳にあまり自信がないです…）。
だがとりあえず、グローバル CSS を利用する際はあまり深く考える必要はないっぽい。

> What is gatsby-browser.js? Don’t worry about this too much and for now, just know that gatsby-browser.js is one of a handful of special files that Gatsby looks for and uses (if they exist). Here, the naming of the file is important. If you do want to explore more now, check out the docs.
[Gatsby: Introduction to Styling in Gatsby](https://www.gatsbyjs.com/docs/tutorial/part-two/)より

## その他の方法
共有レイアウトコンポーネントを作成する方法もあるみたいです。
参考 [Gatsby: Standard Styling with Global CSS Files](https://www.gatsbyjs.com/docs/how-to/styling/global-css/)

## 参考
[Gatsby: Introduction to Styling in Gatsby](https://www.gatsbyjs.com/docs/tutorial/part-two/)
[Gatsby: Standard Styling with Global CSS Files](https://www.gatsbyjs.com/docs/how-to/styling/global-css/)
[Gatsby: Gatsby Browser APIs](https://www.gatsbyjs.com/docs/reference/config-files/gatsby-browser/)

## さいごに
今後は、gatsby-browser.js についてもっと深く調べた記事なども書いていきたいと思います。
誤字脱字、間違いご指摘などありましたらコメントいただけますと幸いです。
ここまで読んでくださり、ありがとうございました。

[Twitter: ndj](https://twitter.com/teqndj)
unittestとpytestでそれぞれC1カバレッジ出力のコマンドを最小限に抑えてみました。

Pythonでテストしてカバレッジを取得する時にあれこれコマンドが長くなるなぁと思いつつ特に気にせず作業していたんですけど、やっぱり長いのを打つのってけっこうめんどくさい。。ということで、テストコマンドを最小限に抑えるための設定ファイルの作り方を探った時のメモ的なものです。

2021年3月時点で最新のunittestとpytestに対応しています。今回はテストのコマンドを短くすることに目的をおいているので、テストコードの例は省いています。

## 環境

- Windows10
- Python3.9インストール済

## 今回のディレクトリ構成

```
proj_unittest/
  ├ src/
  │   ├ app/
  │   │   ├ __init__.py
  │   │   └ main.py
  │   ├ tests/
  │   │   ├ __init__.py
  │   │   └ test_app_main.py
  │   └ __init__.py
  └ .coveragerc

proj_pytest/
  ├ src/
  │   ├ app/
  │   │   ├ __init__.py
  │   │   └ main.py
  │   ├ tests/
  │   │   ├ __init__.py
  │   │   └ test_app_main.py
  │   └ __init__.py
  └ pytest.ini
```

## unittestの場合

### 準備

`.coveragerc`を準備します。

今回はC1カバレッジ(判定条件網羅)を出力するために`branch = true`を書いています。テストコードでカバーできてない行をコマンド出力するために`show_missing = true`も追加しています。

```:proj_unittest/.coveragerc
[run]
source = src/app
branch = true
command_line = -m unittest

[report]
show_missing = true
```

`coverage`をインストールします。

```bash
$ pip install coverage
```

### テスト＆カバレッジ出力

[Before]

```bash
$ coverage run --source=src/app --branch -m unittest  ← テスト
$ coverage report -m                                  ← コマンド出力
$ coverage html                                       ← HTML出力
```

[after]

```bash
$ coverage run
$ coverage report
$ coverage html
```

だいぶきれいになりました。


## pytestの場合

### 準備

`pytest.ini`を準備します。

C1カバレッジを出力するために`--cov-branch`を書いています。テストコードでカバーできてない行をコマンド出力するために`--cov-report=term-missing`、自動でHTMLを出力する機能もあるので`--cov-report=html`も追加しています。

```:proj_pytest/pytest.ini
[pytest]
addopts=
  --cov=src/app
  --cov-branch
  --cov-report=term-missing
  --cov-report=html
```

`pytest`、`pytest-cov`をインストールします。

```bash
$ pip install pytest pytest-cov
```

### テスト＆カバレッジ出力

[before]

```bash
$ pytest --cov=src/app --cov-branch --cov-report=term-missing --cov-report=html
```

[after]

```bash
$ pytest
```

pytestの場合はこれでカバレッジ出力も自動でやってくれるからほんと便利です。


## 参考

* [Configuration reference — Coverage.py 5.0 documentation](https://coverage.readthedocs.io/en/coverage-5.0/config.html)
* [Configuration — pytest documentation](https://docs.pytest.org/en/stable/customize.html#pytest-ini)
～ MOD ～ チートシート

#目次
[割り算](#割り算)
[コンビネーション（nCr）](#コンビネーション)

[割り算以外の四則演算](#割り算以外の四則演算)
[べき乗](#べき乗)　`pow(x,n,MOD)`

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#割り算

```python:mod.py
MOD = 1000000007

def div(a, b):
  return ((a % MOD) * pow(b, MOD-2, MOD)) % MOD
```

自分で割り算用の関数を定義する
MODが素数の場合、Aの逆元はA**(MOD-2)となる（フェルマーの小定理を使うらしい）

```python:mod.py
print(A * pow(B, -1, MOD) % MOD)
```

python3.8以降なら`pow()`でも簡単に逆元を求められる**（pypyだとエラーを吐くので注意）**

#コンビネーション

```python:mod.py
MOD = 1000000007

def div(a, b):
  return ((a % MOD) * pow(b, MOD-2, MOD)) % MOD

def Combination(n,r):
  bunnshi = 1
  bunnbo = 1
  for i in range(r):
    bunnshi = (bunnshi*(n-i))%MOD
    bunnbo = (bunnbo*(i+1))%MOD
  return div(bunnshi,bunnbo)
```

```math
nCr = \frac{n!}{r!(n-r)!} = \frac{n(n-1)...(n-r+1)}{r(r-1)...1}\\
```
をMOD計算する
割り算ができれば簡単に実装できる

#割り算以外の四則演算

```python:mod.py
MOD = 1000000007

(a + b) % MOD
(a - b) % MOD
(a * b) % MOD
```

まあ自明
pythonは負の整数に対しても余りを計算できるので、引き算の時に`(a - b + MOD) % MOD`としなくても正しく計算できる

#べき乗

```python:mod.py
MOD = 1000000007

pow(x, n, MOD)
```

`x ** n % MOD`を早く正確に計算できる
詳しくは[こちら](https://qiita.com/ysys_Ba/items/e422b6ab951853dc87d8#1-%E3%81%B9%E3%81%8D%E4%B9%97)
ARC116 振り返りメモ(B問題まで)

#結果
Aの1完で, レート変化は<font color="Maroon">729</font>→<font color="Maroon">713</font> (-16)

#[A問題 ( Odd vs Even )](https://atcoder.jp/contests/arc116/tasks/arc116_a)
###概要
> N の約数のうち, 偶数のものと奇数のものの個数を比較する.

###方針
N を素因数分解することを考えると, 

```math
N = 2^d \times a　(aは奇数)
```
という風に素因数分解できるはずである.
d = 0のときは, 奇数の約数しか持たないので, 当然奇数の約数の方が多い.
d = 1のときは, 奇数と偶数の約数の個数は等しくなる.
d > 2のときは, 偶数の約数の方が多くなる.

まとめると, 4で割った余りが1または3のときは奇数の方が多くなり, 2のときは等しくなり, 0の時は偶数の方が多くなる.

C++ での実装例は以下のようになる.

```cpp:a.cpp
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (long long i = 0; i < (n); i++)
using ll = long long;

int main() {
    ll t; cin >> t;
    rep(i, t) {
        ll n; cin >> n;
        if (n % 4 == 1 || n % 4 == 3) cout << "Odd" << endl;
        if (n % 4 == 0) cout << "Even" << endl;
        if (n % 4 == 2) cout << "Same" << endl;
    }
    return 0;
} 
```

#[B問題 ( Products of Min-Max )](https://atcoder.jp/contests/arc116/tasks/arc116_b) 
###概要
> 長さNの整数列(A)の空でない全ての部分列(B)に対して, それぞれmax(B) * min(B) を計算し, その総和を求める.

### 方針
minの添字をi, maxの添字をjとすると, 
A[i] * A[j] * 2 ^ (j - i - 1) 
を全ての(i, j)の組について計算すれば良い.
が, 愚直に計算するとO(N^2)となって計算が間に合わなくなってしまう.
そのため, i を固定して, jをi+1~n まで動かす部分をまとめて計算する.


C++ での実装例は以下のようになる.

```cpp:b.cpp 
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (long long i = 0; i < (n); i++)
using ll = long long;

const ll MOD = 998244353;

int main() {
    ll n; cin >> n;
    vector<ll> a(n);
    rep(i, n) cin >> a[i];
    sort(a.begin(), a.end());
    ll ans = 0;
    // max と min が同じ値の場合の処理
    rep(i, n) {
        ans += a[i] * a[i] % MOD;
    }
    ll mx = 0;
    for (ll i = 1; i < n; i++) {
        mx = 2 * mx;
        mx += a[n-i];
        mx %= MOD;
        ans += a[n-i-1] * mx % MOD;
        ans %= MOD;
    }
    cout << ans << endl;
    return 0;
} 
```
DoxygenとGraphvizでC++コードのドキュメントを作る

#目次
[０．doxygenとは](#doxygenとは)
[１．環境構築](#環境構築)
[２．ソースコード記述](#ソースコード記述)
[３．プロジェクト作成](#プロジェクト作成)
[４．ドキュメント出力](#ドキュメント出力)

#doxygenとは
**メリット**
・コードに設計内容が埋め込まれているため、コードと設計書の乖離が軽減され保守性が向上する
・コメントにDoxygenに対応したタグを埋め込むだけなので低コストで詳細設計書が作成可能である
![ドキュメント生成の流れ-1024x423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803090/5886e2d7-e045-e5c9-55c8-1cca6714b36a.png)

【引用】[【C/C++】ドキュメント作成(doxygen)まとめ](https://www.mathkuro.com/c-cpp/doxygen/) 

#環境構築
・Doxygenのインストール
・Graphvizのインストール

こちらを参考に構築。環境変数のパスだけ気を付ける。
【参考】[最近覚えた便利アプリ[doxygen]](https://qiita.com/wakaba130/items/faa6671bd5c954cb2d02) 

```terminal:consol
>doxygen  -v
1.9.1 (ef9b20ac7f8a8621fcfc299f8bd0b80422390f4b)
>dot -V
dot - graphviz version 2.47.0 (20210316.0004)

```

#ソースコード記述
```c++:sample.cpp
/*! @class Class1
    @brief  クラスの説明
*/
class Class1 {
public:
    /*! メンバ1の説明 */
    int member1;

    int member2; /*!< メンバ2の説明を横につける */

    /*! メソッド1の説明 */
    int method1(int var1, int var2);

    /*! メソッド2の説明。詳細説明
        @param[out]     var1    var1の説明
        @param[in]      var2    var2の説明
        @param[in,out]  var3    var3の説明
        @par            Refer
        - 参照するグローバル変数 global_var1
        - 参照するグローバル変数 global_var2
        @par            Modify
        - 変更するグローバル変数 global_var3
        - 変更するグローバル変数 global_var4
        @return         成功 0, 失敗 0 以外 など
        @exception      例外。不要であればnoneを記述
    */
    int method2(int var1, int var2, int var3) {

    }
};
/*! @class Class2
    @brief  クラスの説明
    クラスの詳細
*/
class Class2 {
public:
    /*! メンバ1の説明 */
    Class1 class_obj1;
};
};
```

#プロジェクト作成
Doxywizardを使ってプロジェクト作成。
RUNボタンでHTMLが生成される。DoxyfileでConfigurationを直接編集もできる。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803090/754d2f76-d9dd-c53c-0b4f-2678bbb5ad1e.png">

【参考】[Graphviz の設定](https://blog.cercopes-z.com/doxygen-diagrams-auto/) 

#ドキュメント出力
![html.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803090/d15e2c4d-ac72-4448-cf21-3695e15c7f0e.png)
ethreumアプリを作成してみた

最近、仮想通貨の仕組みに興味がありまして、実際にブロックチェーンを用いたアプリケーションを作ってみようということにしてみました。dappsで一番主流と言われているethreumを使って、どんな感じか触ってみてます。

dappsとは、実際の仮想通貨口座とアプリケーションを紐付けてやりとりができるアプリケーションだと認識してます。

https://github.com/PaulRBerg/create-eth-app

上記のlibraryを起動させれば簡単な手順でローカル開発環境を整えることができます。
初期の状態でmetamaskとの連携ができるって感じですね。

my-eth-app
├── README.md
├── node_modules
├── package.json
├── .gitignore
└── packages
    ├── contracts
    │   ├── README.json
    │   ├── package.json
    │   └── src
    │       ├── abis
    │       │   ├── erc20.json
    │       │   └── ownable.json
    │       ├── addresses.js
    │       └── index.js
    ├── react-app
    │   ├── README.md
    │   ├── package.json
    │   ├── node_modules
    │   ├── public
    │   │   ├── favicon.ico
    │   │   ├── index.html
    │   │   └── manifest.json
    │   └── src
    │       ├── App.css
    │       ├── App.js
    │       ├── App.test.js
    │       ├── ethereumLogo.svg
    │       ├── index.css
    │       ├── index.js
    │       ├── serviceWorker.js
    │       └── setupTests.js
    └── subgraph
        ├── README.md
        ├── abis
        │   └── erc20.json
        ├── package.json
        ├── schema.graphql
        ├── src
        │   └── mappings
        │       ├── tokens.ts
        │       └── transfers.ts
        └── subgraph.yaml


初期構成は、上記でしてreactアプリケーションとして構成されてます。metamaskとのやりとり以外は通常のアプリケーションと大層変わりがないようかなと感じてます。
packages内のcontracts react-app subgraphの三つのディレクトリが根幹に関わってくるコントラクトとreactアプリケーションとgraphqlに似たapiかなって感じですね。
500mb近いアプリケーションになっているので初期状態から結構重めだなって印象です。

日本の記事は限りなく少ないので随時増やせていけたらなと思います。以上です！
機械学習による米雇用統計予測

金融市場で最も注目度の高い経済指標の一つである米雇用統計を機械学習を用いて予測してみた。

#米雇用統計とは
非農業部門で働く就業者数を集計したもので、通常、毎月第一金曜日に発表される経済指標。
米連邦準備理事会（FRB）は「雇用の最大化とインフレの安定」というデュアルマンデートを持っていることもあり、雇用情勢を図る上で非常に注目度は高いものとなっている。

#データ
2002年1月から2021年2月までのデータから、パンデミックによる外れ値（2020年3月から9月）を除いた223個を使用。非農業部門雇用者数変化（前月比）を目的変数とし、ADP雇用統計や新規失業保険申請件数、消費者信頼感指数の雇用見通し等、21個を特徴量として採用した。

#特徴量エンジニアリング
消費者信頼感の雇用見通しについて、"positive - negative, positive/negative"等、四則演算を用いてさらに特徴量を生成。日付データに三角関数を適用することで、月毎のシーズナリティも考慮した。
また、偽の特徴量を追加し、検定により特徴量を15個まで削減した(Boruta)。

#アルゴリズム
ランダムフォレストを採用。LightGBMやXGBoostも試したが、データ数が少ないためか収束せず。

#ハイパーパラメータチューニング
optunaを用いて以下のハイパーパラメータをチューニングした。

```python
rf_max_depth = trial.suggest_int('rf_max_depth', 2, 32)
n_estimators = trial.suggest_int('n_estimators', 10, 100, 10)
max_features = trial.suggest_loguniform('max_features', 1e-1, 1)
```

#結果
絶対平均誤差（MAE）と決定係数（R2)を用いてモデルを評価した。誤差の単位は[千人]。

|  | データ処理前 | 特徴量エンジニアリング後 | ハイパーパラメータチューニング後 |
|:-----------|------------:|:------------:|:------------:|
| MAE       | 86.6         | 76.8         | 73.7          |
| R2     | 0.778      | 0.850      | 0.869           |

<img width="400" alt="predict_acctual.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248754/e6c284d6-1807-94e8-aa67-0e447124fee4.png">



#終わりに
毎月金曜日発表の非農業部門雇用者数は速報値であり、発表後二ヶ月に渡り遡及改定される。速報値と改定値の誤差と決定係数は以下の通りであり、このブレが雇用統計予測モデルの限界である。

|  | 速報値と改定値 | 
|:-----------|------------:|
| MAE       | 56.1         | 
| R2     | 0.886      |


<img width="400" alt="first_revision.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248754/08c3022f-9581-278d-97df-38ee09e0a820.png">

また、説明変数に用いたADP雇用統計は、雇用統計に合わせた年次改定を行っているため、上記のモデルではLeakageの影響が入ってしまっている。とはいえ、ADP雇用統計は、非農業部門雇用者数の予測をするために開発されたものであり、説明変数としては外せなかった。
【メモ】 JSON 概要 

JSONを初めて使用したので、概要だけまとめておく。

おおむね、下記の3パターンを階層的に組み合わせていく。

## オブジェクト型
### json
```
{
	"id": "001",
	"name": "taro"
}
```

### java
```
// マッピング
JsonSampleBean bean = mapper.readValue(json, JsonSampleBean.class);

// Beanの定義
package com.example.app.bean.json.request;

import lombok.Getter;
import lombok.Setter;

/**
 * JSONマッピング用のオブジェクト。
 *
 * @author start
 */
public class JsonSampleBean {

	/** ID */
	@Getter
	@Setter
	private String id;

	/** 名称 */
	@Getter
	@Setter
	private String name;

}
```

## リスト（配列）型
### json
```
{
	"sampleList": [
		{
			"id": "001",
			"name": "taro"
		},
		{
			"id": "002",
			"name": "jiro"
		}
	]
}
```

### java
```
// マッピング
JsonSampleListBean list = mapper.readValue(listJson, JsonSampleListBean.class);

// Beanの定義
package com.example.app.bean.json.request;

import java.util.List;

import lombok.Getter;
import lombok.Setter;

/**
 * JSONマッピング用のオブジェクト。
 *
 * @author start
 */
public class JsonSampleListBean {

	/** リスト */
	@Getter
	@Setter
	private List<JsonSampleBean> sampleList;

}
```

## リスト（配列）型_リストのみ
### json
```
[
	{
		"id": "001",
		"name": "taro"
	},
	{
		"id": "002",
		"name": "jiro"
	}
]
```

### java
```
// マッピング
List<JsonSampleBean> list = mapper.readValue(listJson, new TypeReference<List<JsonSampleBean>>(){});

// Beanの定義
// 省略
```

## マップ型
### json
```
{
    "sampleMap":{
    	"key1": {
    		"id": "001",
    		"name": "taro"
    	},
    	"key2": {
    		"id": "002",
    		"name": "jiro"
    	}
    }
}
```

### java
```
// マッピング
JsonSampleMapBean map = mapper.readValue(mapJson, JsonSampleMapBean.class);

// Beanの定義
package com.example.app.bean.json.request;

import java.util.Map;

import lombok.Getter;
import lombok.Setter;

/**
 * JSONマッピング用のオブジェクト。
 *
 * @author start
 */
public class JsonSampleMapBean {

	/** マップ */
	@Getter
	@Setter
	private Map<String, JsonSampleBean> sampleMap;

}

```

## マップ型_マップのみ
### json
```
{
	"key1": {
		"id": "001",
		"name": "taro"
	},
	"key2": {
		"id": "002",
		"name": "jiro"
	}
}
```

### java
```
// マッピング
Map<String, JsonSampleBean> map = mapper.readValue(mapJson, new TypeReference<LinkedHashMap<String,JsonSampleBean>>(){});

// Beanの定義
// 省略
```
PlatformIOでRaspberry Pi Pico を動かす（Windows,Arduinoフレームワーク）

2021/10/27追記
公式から出ている Raspberry Pi Pico のボート選択でビルドできました。
ボタン押しながらUSBを挿して転送モードにしておいても転送には失敗するようで（wizio-pico は成功する）、
ビルドボタンでビルド後、
.pio\build\pico\firmware.uf2

をRaspberry Pi Picoにドラッグ＆ドロップすることで転送＆実行できました。

---

(2021/03/27現在)公式からは対応されていないようですが、
[こちら](https://github.com/Wiz-IO/wizio-pico)にある方法でビルド＆実行を確認できました。 

１．Platforms>Advanced Installation -> https://github.com/Wiz-IO/wizio-pico を入力してInstall
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e351632c-2563-261a-a9e3-39c2ad553cb2.png)

２．Board:WizIO - Raspberry Pi Pico, Framework:Arduino で適当なプロジェクトを作成  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a1fe4272-f838-c124-0514-eb5ccbde07af.png)

３．適当なプログラムを作成

```
#include <Arduino.h>

void setup() {
  // put your setup code here, to run once:
  pinMode(2,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(2,HIGH);
  delay(100);
  digitalWrite(2,LOW);
  delay(400);
}
```

４．ビルド＆アップロードで実行ファイル作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4c059584-63e0-115e-833d-21fc9f6dac1c.png)

５．Raspberry Pi PicoのBOOTSELボタンを押しながらUSBを接続し、ARDUINO.uf2をドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d6cf8fc7-979d-f150-94d4-da8f2e13af83.png)

６．Raspberry Pi Pico上で実行される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/24fd38f3-8427-fdcd-9b96-b852852d8ec2.png)
[動画](https://youtu.be/ep9tdJ0jRW0)

以上です。
Windows資格情報のバックアップ/復元手順

PC交換の時にいろいろ調べたので備忘録。

Windowsの資格情報をバックアップ復元する手順
　※Webのパスワードではなく、フォルダアクセス等のもののみ

Windows8以降で利用可。

#バックアップ手順
①　スタートで以下を入力する。
　　「資格情報マネージャー」

②　[Windows資格情報]を押下する。

③　[資格情報のバックアップ]を押下する。

④　[バックアップの作成先]を指定し、次へを押下する。

⑤　[Ctrl+Alt+Del]を押下する。

⑥　パスワードの入力が求められるので、
　　現在ログインしているユーザのログインパスを入力する。
　　　※インポート時にも必要になります。

#復元手順

⑦　スタートで以下を入力する。
　　「資格情報マネージャー」

⑧　[Windows資格情報]を押下する。

⑨　[資格情報の復元]を押下する。

⑩　[バックアップファイルの場所]にて④のファイルを選択し、[次へ]を押下する。

⑪　[Ctrl+Alt+Del]を押下する。

⑫　パスワード入力が求められるので、
　　⑥で入力したパスワードを入力する。
　　　※インポートするユーザが違っても⑥で利用したパスワードになります。

⑬　[F5]を押下し、ウィンドウを更新する。

⑭　エクスポートと同じ資格情報があることを確認し、終了です。

以上
AtCoder、中一の間に青コーダーに

なれませんでした。
#精進量
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/d226f2e8-29b4-fd45-4980-d2e087f01a44.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/d776ca1c-4e31-922c-8b7d-b12d9c397ba2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/2db546bb-7388-424d-d074-7a53320f9093.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/4ee602e2-dfdf-bc0d-8a66-d9c664514125.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/7db3221e-fdf8-83c0-6cf0-e0e506160c3b.png)
｢え、少な。よくこんなんで青コーダーになろうと思ったな。｣
1500AC、水まで全埋め、青も7~80%は埋めてたかったなって思ってます。
同期を見てても1500とか1700とかはACしてるので、それくらいはやっておきたかったかな
#パフォーマンス・レーティング推移
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/a178160b-4468-80ee-0ec4-34ba43f49ea6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/78ae5701-904d-1e30-b2c4-175595f43a78.png)
最後のゴタゴタなんや、いろいろ起きすぎやろ、ということであとで解説。
#これまでの記録
##2020年2月
processing言語をちょっとやる。変数は理解したけど、配列理解できなくてやめた。
##2020年5月
クラスメイトがパ研の宣伝してたので入ってみる。
5月28日にパ研に仮入部する。
##2020年6月
5月の終わりごろからAPG4bを読んだり過去問解いたりする。
6月17日にコンテストにそろそろ出たいと思ったのでAtCoderのアカウントを作る。
6月21日初コンテストABC171。3完で茶パフォだった
##2020年8月
精進してたらABC174で入茶した。当時646AC。
C++始めてから2カ月ちょいで入茶したので、ここまでは割と順調(?)だと思う。同期に初回コンテストで入茶した人いるけど、そんな人のことは気にしません。
8月22日に初水パフォ。ここら辺でさっき言った人と違う同期をライバル視したはず。
##2020年9月
9月13日、さっきの同期にあっさり抜かされる。
これ以降この同期には追い付いてないです。
9月19日、JOI一次予選1回目。瞬殺した。スマホで15,6分台なので、まあまあ早いはず。
##2020年10月
ARC105で入緑した。当時960AC。
10月18日、JOI一次予選2回目。PCだったので6分台だったと思う。
10月31日、1000ACを突破する。
ここら辺、文化祭準備で結構忙しかった。
##2020年11月
11月21日、JOI一次予選3回目。スマホで10分切った気がする。
11月28日、入水する。自殺じゃない方のね。当時1081AC。
この時、青パフォ3連続で入水した。割とノってた時期。
###余談
入水って、勘違いされるから、寒色に入ったっていう意味で入寒とかの方がいいんじゃないかなって思う。みんなはどっちの方がいいんだろ、
##2020年12月
JOI対策めっちゃしてた。
12月13日、JOI二次予選でボーダー188点で184点とって落ちた。詳しくはhttps://qiita.com/cpcznksutbeoa/items/f53a88d1c9d47ea58cd0 を見てください。
ここらへんでOTPCあった気がする。ずっと椅子温めてた。チームメイトの2人、ごめんなさい...。
##2021年1月
ここらへんから伸びるスピードが落ちる。
目標を中一の間に1400から1600(入青)に引き上げる。
##2021年2月
とくに何もなかった...。
##2021年3月
3月忙しかったのでいろいろ書く。
3月7日、人生初の黄パフォをとる。この時点で1500に乗り、3月中に入青を確信する。
3月11日、新入生プログラミングコンテストの開催が決定する。ここから作問をずっとやって精進をそんなにやらないようになる。みなさん、このコンテスト、出ましょう！3月31日に開催です！
ABC195,ARC114,ABC196で適正レートに戻される。
ARC115で2回目の黄パフォをとる。1510だったのでまだあると思った。
ここでネタ画像が生まれた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963100/d99d6fbd-ccac-6172-11b9-3d94b4736541.png)
なんやねんこのレートグラフ()
ABC197,ARC116で冷え、1500を切る。
3月中にRatedコンテストが生えることはあり得ないので、中1青コーダーになれないことが確定する。
今期中1で青になった経験がある人が4人いるので、今月中に青色になりたかった人生でした...。
#来年の目標
JOIで春に頑張っていきたいです。本選はマストかな、という感じ。
AtCoderは2200台に乗っけたいです。
#終わりに
同期がプロすぎます。助けてください。(助けなくて結構です)
日本語が前より変になっているかもしれません...
青色目指してる人は、1500問とか1800問とか問題を解きましょう!
最後まで読んでくださり、ありがとうございました！
【備忘録】【エラー解決】bundle updateをするとコンフリクトエラーが返ってくるためrubyのバージョンを下げて解決

bundle updateを実行するとエラーが発生したため、
自分が忘れないためにも記録を残しておきます。

# bundle updateを実行した結果
![スクリーンショット 2021-03-28 23.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/17462cdf-c536-f653-536e-8cc761cfe7f9.png)

エラーの内容を読み解いていくと、、、

Ruby (>= 2.4.0)を使うにはcapybara (= 3.28.0)ではバージョンが古すぎるので、もっと新しいバージョンにする必要がある。

Ruby (>= 1.9.3)を使うにはguard (= 2.16.2)ではバージョンが古すぎるので、もっと新しいバージョンにする必要がある。

Ruby (>= 2.2.3, ~> 2.2)を使うにはlisten (= 3.1.5)ではバージョンが古すぎるので、もっと新しいバージョンにする必要がある。


Ruby (>= 2.0.0)を使うには pg (= 1.1.4)ではバージョンが古すぎるので、もっと新しいバージョンにする必要がある。


云々・・・・・と続いていました。
つまり、バージョンを変えることで解決できるエラーということでした。

初めは、capybara、guard、listen・・・・と一つ一つ最適なバージョンを調べていたのですが、これでは切りがないなと思い
他にもっと効率的な解決策はないかな？と考えてみると、
すべてのエラーに「Ruby」が共通していることに気がつきました！

更に、他の人が「Rubyのバージョンを下げた（2.7.2）らできました。」
という記事もあったことから、
Rubyのバージョンを下げてみることにしました。

# Ruby 2.7.2バージョンをインストール
$ rbenv install 2.7.2


# インストール済みのすべてのRubyバージョンを調べる
$ rbenv versions

![スクリーンショット 2021-03-29 0.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/cbbbae69-0371-7bb8-e786-5c0d051716a9.png)



Ruby 2.7.2バージョンがインストールできました！

# ローカルのRubyのバージョンを2.7.2に切り替える

$ rbenv local 2.7.2

# バージョンが2.7.2に切り替わったか確認

$ rbenv versions

![スクリーンショット 2021-03-29 0.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/8ca02b6c-858c-ecba-14c5-e8f002545895.png)


Ruby 2.7.2バージョンに切り替えられました！

その後、
bundle update　成功！
bundle install 成功！
rails チュートリアルのとおりに進めて無事にHerokuへデプロイまで成功しました！
クローズ環境でウイルスバスターコーポレートエディションのクライアントバージョンをアップデートする方法。


始めてのアップデート作業でやり方がわからずトラブったので、備忘録。。

#実施内容

ウイルスバスターサーバ：ウイルスバスターXGコーポレートエディション
クライアント：windows10PC、windowsserver2016

#手順

①　以下URLを参考にウイルスバスターサーバのアップデートを実施する。

　　　▼バージョンXG を最新版へバージョンアップしてご使用いただくまでの流れ
　　　　https://success.trendmicro.com/jp/solution/1116148


②　サーバのversionが指定のversionへアップデートできたことを確認する。

③　下記パスより[ClnPack.exe]を実行する。

　　　▼格納パス
　　　　C:\Program Files (x86)\Trend Micro\OfficeScan\PCCSRV\Admin\Utility\ClientPackager\ClnPack.exe

④　[クライアントパッケージャ]が起動するので下記情報を入力する。

　　・パッケージタイプ：セットアップ　※1
　　・Windows OSタイプ：該当するbitを選択する。
　　・検索方法　　　　：従来型スキャン　※2

　　・ドメイン：クライアントによるドメイン自動報告を許可する。　※3
　　
　　・オプション：「チェックなし」　※4
　　
　　・アップデートエージェントの機能：「チェックなし」　※5
　　
　　・入力ファイル：C:\Program Files (x86)\Trend Micro\OfficeScan\PCCSRV\ofcscan.ini　※6
　　・出力ファイル：「任意のファイル名」
　　
　　
⑤　[作成]を押下する。

⑥　[任意のファイル名.exe]のファイルが作成されるので、
　　対象の端末で実行する。
　　
⑦　実行後、稼働している「ウイルスバスター」が停止し
　　アプリの再起動が起きるので待機する。
　　
⑧　アプリ起動後、画面右下の[^]よりウイルスバスターのアイコンを右クリックする・

⑨　[コンポーネントバージョン]を押下する。

⑩　クライアントのバージョンが指定のversionになっていることを確認する。

⑪　筐体を再起動する。


#注意書き

※1：[MSI]でも問題ないですが、
　　 コマンドプロンプトから管理者実行する必要があるようなので、セットアップのほうが無難です。
　　 
※2：[スマートスキャン]を選択した場合、サーバとの通信が必要になるため、
　　 [従来型スキャン]で作成してください。
　　 
※3：指定のドメインに追加したい場合はそちらを選択してください。

※4：サイレントインストールがしたい場合は[サイレントモード]にチェックを入れてください。
　　 [事前検索を無効にする]は新規インストールのみが対象のため、チェック不要です。
　　　
※5：アップデートエージェント設定はサーバとの通信が必要になるため、チェック不要です。

※6:入力の[ofcscan.ini]は変更しないこと。

#参照

▼どうしても社内サーバとアクセスしない場合のクライアントアップデート方法
https://success.trendmicro.com/jp/solution/1308789
UbuntuでL2TPのVPNに接続する

# はじめに
softetherで立てたVPNサーバー(L2TP)に、Ubuntuから接続する方法をまとめた
確認したのは`Ubuntu 18.04`です

# network-managerの設定追加

デフォルとだとL2TPの設定がないので、以下のコマンドで追加する

```
sudo apt-get install network-manager-l2tp network-manager-l2tp-gnome
```

# VPNの設定

Settings -> Network -> VPN右上の+　-> identity
`名前:適当につける`
`ユーザー名：softetherで設定したユーザー`

IPsec Settings
`Enable IPsec tunnel to L2TP host:チェックする`
`pre-shared key:IPsec 事前共有鍵を入れる`
`Phase1 Algorithms:aes128-sha1-modp1536`
`Phase2 Algorithms:aes128-sha1`

phase2 はsoftetherの暗号化アルゴリズム名。
phase1は諸説あったので、以下のページを参考にしました。
[2018-12-01 Ubuntu18.04をL2TPのVPNクライアントにする](https://www.komee.org/entry/2018/12/01/213000)
PythonでExcel操作【openpyxl - 複数セルの範囲指定】

### 目次
1. for文で自力で
1. 左上と右下のセルを指定して
1. sheet.iter_rows()を利用して
1. 実践テクニック

### Excelファイルの読み込み
```python:
import openpyxl as excel
book = excel.load_workbook("excel_filename.xlsx")
sheet = book.active
```
### 1.for文で自力で
```python:
for y in range(2, 5):
    r = []
    for x in range(2, 5):
        v = sheet.cell(row = y, column = x).value
        r.append(v)
    print(r)
```
### 2.左上と右下のセルを指定して
```python:
for row in sheet["B2:D4"]:
    print([cell.value for cell in row])
```
### 3.sheet.iter_rows()を利用して
```python:
for row in sheet.iter_rows(min_row = 2, max_row = 4, min_col = 2, max_col = 4):
    print([cell.value for cell in row])
```
### 4.実践テクニック
何行続くかわからない場合は、セルを多めに取得して何かしらでbreak処理等する

```python:
rows = sheet["A3": "F999"]
for row in rows:
    values = [cell.value for cell in row]
    if values[0] is None: break
    print(values)
```
【VBA】値のあるセルの最終行を取得する方法

今回は、値のあるセルの最終行までループ処理する方法です。

以下のデータを使用します。
単価と個数の合計金額を入力する時に、行数が変更されても正しく処理されるようにします。
![20210329_000012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/7f1b063f-1336-9728-78e2-b0cc8919f663.jpeg)

まずは、ソースコードを記載します。

```vb.合計金額の計算
Sub 合計金額の計算()

For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row

    Cells(i, 4) = Cells(i, 2) * Cells(i, 3)

Next

End Sub
```

最終行を取得するためには、以下のコードになります。
>Cells(Rows.Count, 1).End(xlUp).Row

「Rows.Count」は、シートの最終行を取得しています。
2007以降なら1048576（行）が入ると思います。

「.End(xlUp)」は、セルに値が入ってるところまで、下から上にジャンプしてくれます。
やっている操作は、Ctrl + ↑と同じ処理になります。

結局何をやっているかというと、1列目の最終セルから、値のあるセルまで上にジャンプしています。

最後に、ジャンプして止まったセルの行数を取得するため、「.Row」を記載します。

最終行までループ処理が出来れば、あとは必要な計算を行ってセルに入力すれば完了です！

以上、値のあるセルの最終行を取得する方法でした。
Railsチュートリアルを途中からやり直した時の備忘録

##経緯
Railsチュートリアルを途中まで進めたが、
前章でやったところが引き金でエラー発生 -> どこかわからなくて詰んだ
っていう状況に陥る同士がいるかもしれない。

自分の場合は前章のブランチに戻って新規ブランチを作成後、
masterブランチにmergeしたらコンフリクトが大量発生した。
コンフリクト一つ一つ解消していくのもいい（そもそも起こす事自体が問題らしい）が、

解消後、``rails test``でエラー出まくったりherokuにデプロイができなくなった。
どうしようもなくなった時の対処法をまとめておこうと思う。


##どうしようもない時にやったこと

1. リモートのmasterブランチ巻き戻し & ローカルのmasterブランチ巻き戻し
2. Herokuアプリ作り直し


###1. リモートのmasterブランチ巻き戻し

順序

- リモートのmasterブランチのバックアップ作成
- ローカルのmasterブランチ巻き戻し
- リモートのmasterブランチを削除
- ローカルのmasterブランチをリモートにプッシュ
- リモートのmasterブランチのバックアップ削除


###リモートのmasterブランチのバックアップ作成
``$ git push origin master:master_bak``


###ローカルのmasterブランチ巻き戻し
commitの履歴確認
``$ git log master``

ローカルのmasterブランチを巻き戻したいところまで戻す
5なら前のコミット5つ目まで戻る
``$ git reset HEAD~5``

戻した内容を確認
``git status``

戻した内容取り除く
``git stash -u``

上書きのためにコミット
``git add -A``
``git commit -m "コミットメッセージ"``

###リモートのmasterブランチを削除
githubのアプリケーション画面で、
-> settings
-> Branches
-> Default Branch をmaster以外に変更（masterがDefault Branchに指定されていると削除できない）

リモートのmasterブランチ削除
``git push origin :master``

###ローカルのmasterブランチをリモートにプッシュ
``$ git push origin master``

できなかったら強制push (非推奨)
``$ git push -f origin master``

###リモートのmasterブランチのバックアップ削除
``$ git push origin :master_bak``



##2.herokuアプリ作り直し

こちらの記事が非常に参考になったので共有しておきます。

https://qiita.com/ddpmntcpbr/items/d5126a272cc5e24f4f3c

自分の場合、
SendGridやAWSの設定まで終わらせていたので、
アプリケーション内で設定したところは再度修正した。
ここの設定ミスでデプロイ後のブラウザ表示にエラーが出たので気をつけましょう。
Lambda@Edge とは

## 勉強前イメージ

lambda関係してそうだけど、Edgeがわからん

## 調査

### Lambda@Edge とは

cloudfrontのエッジロケーションからコードを実行するLambda関数のことで、
ユーザに近い場所でコードが実行されるので高速なコンテンツ配信が可能になる仕組みです。
コードをLambdaにアップロードするだけで自動的にコードの実行やスケーリングが行われます。
ですので、Lambda@Edgeは Lambdaとcloudfrontから成り立ちます

### メリット

- 低レイテンシーのコンテンツを配信

ユーザに近いロケーションからコードを実行するので
低レイテンシーの配信が出来ます

- サーバ管理が不要

オリジンサーバを複数のロケーションでプロビジョニング・拡張・管理することもなく、自動的にスケールします。
オリジンで実行しているアプリケーションに何も変更を加えることなく追加できます。

### 指定できるcloufrontイベント

cloudfrontには4つの流れがあり、
それぞれ1つのリクエストに対して一意のlambdaのコードを割り当てることが出来ます。

- Viewer request : リクエストが最初に閲覧者から届いた時
- Origin request : オリジンへのリクエウトを転送する時
- Origin response : オリジンからの応答を受ける時
- Viewer response : 閲覧者に応答する前

![2021-03-27 Lambda@Edge とは - diagrams.net - Google .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/d03d0551-02fc-dfdd-bab2-d307fce9586f.png)


## 勉強後イメージ

lambdaとcloudfrontをくっつけたようなサービス(正確にはサービスではないけど)
オリジンでコードを動かすより早く応答できる。

## 参考

- [Lambda@EdgeでCloudFrontへのアクセスをいい感じに振り分ける](https://techblog.zozo.com/entry/lambda-edge)
- [5分で読む！Lambda@Edge 設計のベストプラクティス](https://dev.classmethod.jp/articles/lambda-edge-design-best-practices/)
Unityの画面構成について

# はじめに
Unityについての備忘録です。
筆者はUnity初心者なので間違っている点も多いかと思いますがご容赦ください。

# Unity画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691938/e58bbe04-a6a9-a440-64e6-bbbe4575d247.png)


Unityでプロジェクトを作成した際、最初に開く画面です。
大きく分けて4つの画面で構成されています。
今回はこれら各画面について簡単に説明したいと思います。

各画面の詳細について知りたい場合はUnity公式マニュアルをご覧ください。
https://docs.unity3d.com/ja/2021.1/Manual/GameView.html

## Hierarchy Window(ヒエラルキーウィンドウ)
現在のシーン内に存在しているオブジェクトを管理しているタブです。
シーンの切り替え等は後程説明するProject Tab(プロジェクトタブ)等から行えます。

### オブジェクトの作成
Hierarchy Window上部の"+"ボタンを押すとメニューが開きます。
このメニューからオブジェクトを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691938/d4b19c39-dc4e-f66e-32a4-532eb6f74942.png)

オブジェクトを右クリックするとメニューが開きます。
このメニューからオブジェクトの複製、リネーム、削除等ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691938/52be1acc-e080-9475-dfcd-659575826fff.png)


## Game View(ゲームビュー)

シーン内のカメラから見た絵をレンダリングしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691938/42bad78e-98f1-1823-8fdb-c906c8ee13ff.png)

### 再生モード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691938/0841a362-fff2-64d1-5a2a-cef7974b5862.png)

左から Playボタン Pauseボタン Stepボタンです。

■Playボタン
　シーン内で作成中のゲームを実行できます。
　実行中に再度ボタンを押すと停止します。

■Pauseボタン
　実行中に押すとゲームが一時停止します。
　一時停止中に再度ボタンを押すと、ゲームを再開します。

■Stepボタン
　停止中にStepボタンを押すと1フレームずつゲームが進行します。
　ゲームのデバッグ等をする際などで使います。

## Project Window(プロジェクトウィンドウ)
ゲーム中で使用する3Dモデルやマテリアル、サウンドといったリソースを管理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691938/a017b9ea-e74a-f4f5-5afe-35b4e8905ee4.png)

## Inspector Window(インスペクターウィンドウ)
対象のゲームオブジェクトの情報を表示/編集を行う事ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691938/121223ba-959f-a22d-4c69-05dd8d1fe618.png)
PythonでExcel操作【openpyxl - 基礎まとめ】

### インポート
```python:
import openpyxl as excel
```
### ワークブック作成 or 読み込み
```python:
# 新規ワークブック
book = excel.Workbook()
# 作成済みファイルを読み込み
book = excel.load_workbook("excel_filename.xlsx")
# 計算式ではなく値を取得する
book = excel.load_workbook("excel_filename.xlsx", data_only = True)
```
### シートの指定や操作
```python:
# アクティブなワークシート
sheet = book.active
# インデックスで指定
sheet = book.worksheets[シート番号]
# シート名で指定
sheet = book["sheetname"]
# シート名一覧
print(book.sheetnames)
# 新規シート作成
sheet = book.create_sheet(title = "sheetname")
# 既存のシートをコピーして複製
sheet = book.copy_worksheet(book["sheetname"])
# シート名を変更する
sheet.title = "sheetname"
# シートを削除
book.remove(book["sheetname"])
```
### セルの値へのアクセス方法三つ
```python:
# セル名で指定
sheet["A1"] = "cell_value"
# 引数で指定
sheet.cell(row = 2, column = 1, value = "cell_value")
# または
cell = sheet.cell(row = 3, column = 1)
cell.value = "cell_value"
```
### セル名の取得、行と列番号の取得
```python:
# セル名の取得
cell = sheet.cell(row = 2, column = 3)
print(cell.coordinate)
# 行・列番号の取得
cell = sheet["C2"]
(row, col) = (cell.row, cell.column)
```
### 保存
```python:
book.save("excel_filename.xlsx")
```
Google Cloud SDK でGCSにデータをアップロード

<h1>
Google Cloud SDK でGCSにデータをアップロード
</h1>
個人的なメモ、備忘録です。


<h2>１　事前準備</h2>
<b>google cloud platformのアカウント作成</b>
https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ja
を参考にアカウントを作成する。
<b>プロジェクトの作成</b>
https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja
を参考にプロジェクトを作成する。
<h2>２　google cloud sdkのインストールと各種設定</h2>
<h3>インストール</h3>
公式によると、「Cloud SDK には Python が必要です。サポートされているバージョンは Python 3（3.5～3.8 を推奨）と Python 2（2.7.9 以降）です。」https://cloud.google.com/sdk/docs/install?hl=ja
とのことでしたが、私のローカルでは、２系も３系もどちらもサポート外のバージョンが入っていたので、dockerコンテナ
にインストールすることにしました。
<br/>

下を参考に、公式のdockerイメージを使いました。
https://cloud.google.com/sdk/docs/downloads-docker?hl=ja

こんな感じでコンテナを立てました。

```:ディレクトリ構成
root/
  ├ volumes/
  │   ├ data.csv ←最終的にこれをGCSにアップロードしたいので、あらかじめ作った。なくてもいい。
  │   ├ entrypoint.sh
  ├ docker-compose.yml
  ├ Dockerfile
```

下の公式を参考にDockerfileを作成。alpineの軽量なものを使った。
https://cloud.google.com/sdk/docs/downloads-docker?hl=ja


```:Dockerfile
FROM gcr.io/google.com/cloudsdktool/cloud-sdk:alpine
WORKDIR googleCloudSdk
ENTRYPOINT ["sh","./entrypoint.sh"]  
```

コンテナ内に入ってからgoogle-cloud-sdkの設定（ログイン、プロジェクトIDの設定）を行いたかったので、コンテナのコマンドはbashとした。

```:entrypoint.sh
#!/bin/sh
bash
```

docker-compose.ymlを作成。
（個人的にdocker-composeにした方が、後々見返したときに何をやっているのか、分かりやすい気がする。。。）

```:docker-compose.yml
version: "3.7"

services:
  gcp:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./volumes:/googleCloudSdk
```

後は、docker image を作って、コンテナ内に入る。

```:terminal
$ docker-compose run gcp
```



<h3>設定</h3>
次に、設定をします。具体的には、
１　google cloud platformにログインし
２　プロジェクトIDを設定します。

```:google-cloud-sdk
$ gcloud auth login
```

下のようにリンク先urlが表示されるので、コピペして、ブラウザでアクセスします。
リンク先でアカウントをクリックすると、vertification codeが表示されるので、コピーしてターミナル上に貼り付けます。

```:google-cloud-sdk
$ gcloud auth login
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?xxxxxxx~
Enter verification code:
```
```:google-cloud-sdk
Enter verification code:xxxxxxxxxxx ←ここに貼り付け
```
次に、プロジェクトを選択します。

```:google-cloud-sdk
$ gcloud config set project PROJECT_ID
```

PROJECT_IDはgoogle cloud platform のコンソール画面から確認して貼り付けます。

<h2>３　バケットの作成（GCS）</h2>
下の公式のサイトを見ながら、バケットを作成します。

https://cloud.google.com/storage/docs/creating-buckets?hl=ja#storage-create-bucket-gsutil

```:google-cloud-sdk
$ gsutil mb -p PROJECT_ID gs://BUCKET_NAME ←バケット名を任意につけます。
```

<h2>４　アップロード</h2>
次は、データをアップロードします。今回はcsvファイルをアップロードしたいので、サンプルのデータを作成します。

```:google-cloud-sdk
$ vi data.csv
```

```:data.csv
id,name,gender,
1,anne,F,
2,jon,M,
3,ken,M,
```
上記のように、仮に作成したcsvファイルをgoogle cloud storage 上にアップします。
また、公式サイトを確認しながらコマンドを実行します。
https://cloud.google.com/storage/docs/uploading-objects?hl=ja

```:google-cloud-sdk
$ gsutil cp data.csv gs://BUCKET_NAME
```
無事、GCSにデータをアップロードできました。

終わり。
【Ruby】stripメソッドを使って空白文字を取り除く方法

#プログラミング勉強日記
2021年3月28日

#stripメソッドとは
　文字列の先頭や末尾に含まれる空白文字やタブを削除することができるStringクラスで用意されているメソッド。空白文字とタブだけでなく、改行コードや垂直タブなど(`¥r`, `¥n`, `¥f`, `¥v`)を削除する。ただし、<b>全角スペースは削除しない</b>。
　メソッド名の最後に`!`(ビックリマーク)を付けて破壊的メソッドを使用することもできる。`strip!`メソッドを使うと、先頭と末尾の空白文字を取り除いた文字列を元の文字列に書きかえる。

```ruby:stripメソッドの使い方
str = " Hello World "
stripStr = str.strip
#=> "Hello World"
```


```ruby:strip!メソッドの使い方
str = " Hello World "
str.strip!
#=> "Hello World"
```


#サンプルプログラム

```ruby
# 先頭と末尾に改行コードがある
str = "\nHello World\r\n"
str.strip
#=> "Hello World"

# 空白と改行コードが混ざってる
str = " Hello World \r\n\v\t"
str.strip
#=> "Hello World"

# 先頭に全角スペースがある
str = "　Hello World"
str.strip
#=> "　Hello World"
```

##全角スペースを取り除く方法
　stripメソッドでは全角スペースを削除できないので、gsubメソッドで半角スペースに変換してからstripメソッドを使うことで削除できる。


```ruby:全角スペースを取り除く方法
str = "　Hello World"
str.gsub(/　/," ").strip
#=> "　Hello World"
```

#参考文献
[空白文字を取り除く](https://www.javadrive.jp/ruby/string_class/index11.html)
[Rubyでstripを使う方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/30508)
【Rails】ルーティングの理解

#ルーティングとは
Railsでは「どのようなURLへどのようなHTTPメソッドでアクセスされたら、どのコントローラーのどのアクションを呼び出したいか」をconfig/routes.rbに定義します。アクセスを受けて、適切なアクションへ案内する仕組みをルーティングと呼びます。

##5つの構成要素
ルーティングは、リクエストをアクションへと誘導する「ルートの」集合と捉えることができます。1つの「ルート」は主に以下表の5つの構成要素から成り立ちます。

| 要素の名前      | 要素の内容の例                  | 説明                                                            |
| ---------- | ------------------------ | ------------------------------------------------------------- |
| HTTPメソッド   | GET、POSTなど               | サーバーへのリクエストで、情報の送信・受信の方法を表す。                                  |
| URLパターン    | /posts /posts/:idなど      | URLそのものや、:idのように一部に任意の文字が入るパターンを定義する。                         |
| URLパターンの名前 | new/post postsなど         | 定義したURLパターンごとに一意な名前をつける。この名前をもとに、対応するURL生成のためのヘルパーメソッドが用意される。 |
| コントローラ     | posts(PostsController)など | 呼び出したいアクションのコントローラークラスを指定する。                                  |
| アクション      | indexなど                  | 呼び出したいアクションを指定する。                                             |

次の図でこれらの要素がどのように利用されるかを表しました。基本的には①のように、HTTPメソッドとURLからアクションに案内しますが、もう一つの働きとして②のように、URLパターンに名前をつけておいて、その名前をもとにURLを簡単に生成するヘルパーメソッドを作り出します。

![2D810555-5F04-4223-AFC8-6031F8CB62A1_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/47dd957a-8260-a2bc-d1eb-f584ade5c8bd.jpeg)


##1つのルートの定義
では、実際に例を見てみましょう。homeコントローラーのtopアクションがアプリのトップページの説明を取得するとします。

```config/routes.rb
get '/top', to: 'home#top'
```

この定義は次のような意味になります。

***
__GET__メソッドで、'/__top__'というURLに対してリクエストが来たら、__Home__Controllerの__top__アクションを呼び出す。
また、'/top'というURLを、__top___pathというヘルパーメソッドで生成できるようにする。
***

###複数のHTTPメソッドを受け付けるルートの定義
HTTメソッドの記述の代わりに、mathと:viaオプションの組み合わせを使うと、複数のHTTPメソッドを受け付ける1つのルートを定義できます。
仮に、home#topをPATCHやPUTでリクエストされた際にも呼び出したい場合は以下のようになります。

```
match '/login', to: 'home#top', via: [:get, :patch, :put]
```

##URLヘルパーメソッド以外の取得方法
ヘルパーメソッドでURLを得るには、以下の方法もあります。

1. ”/posts”といった文字列を直接記述
2. { Controller: :posts, action: :index }といったハッシュの利用

1の方法は、あとでそのアクションに対応するURLを変更する際に修正箇所が多くなること、URLの記述方法や本番サーバの運用設定でバグが起きる可能性があるため避けた方が良いでしょう。

#終わりに
ルーティングの理解はつまずきがちですが、この記事が少しでも参考になれば幸いです。最初は、とにかく実装さえできれば大丈夫でしょう！

#参考
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/gp/product/B07JHQ9B5T/ref=ppx_yo_dt_b_d_asin_title_o03?ie=UTF8&psc=1)
いまさらindex.htmlのhrefは省略できることを知った

# 概要
aタグのhrefでindex.htmlを指定する時に「/index.html」とするところを「/」のみにすることができることを知った

``` html:index.html
<!-- 以下、二つは同じindex.htmlにリンクする -->
<!-- 省略なし -->
<a href="rootFold/index.html">リンク</a>

<!-- 省略あり-->
<a href="rootFold/">リンク</a>
```

# ちなみにローカルでChromeから確認すると
ローカルファイルをchromeで開き、index.htmlを省略した形のリンクを開くとディレクトリが表示されてしまう
Calc メモ 〜 大きな数字を扱える計算ツール

大きな数字を扱える計算ツールについてのメモです。
環境は Mac です。
※ まとめ中です。

# 概要

Calc で大きな数字を扱った例です。

```
% calc          
C-style arbitrary precision calculator (version 2.12.7.1)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.]

; 3 * 19 ^ 43 - 1
	29075426613099201338473141505176993450849249622191102976
; (3 * 19 ^ 43 - 1) / 2 * 2
	29075426613099201338473141505176993450849249622191102976
```

Python でも大きな整数を扱えますが、

```python
(3 * 19 ** 43 - 1)
```




    29075426613099201338473141505176993450849249622191102976


浮動小数になるとほとんどの系では double 相当の演算になります。
Python チュートリアル[「15. 浮動小数点演算、その問題と制限」](https://docs.python.org/ja/3/tutorial/floatingpoint.html)の記述が詳しいです。

```python
(3 * 19 ** 43 - 1) / 2 * 2
```




    2.90754266130992e+55



# インストール

[Homebrew](https://brew.sh/index_ja) を用いてインストールをするのが簡単です。

~~~
brew install calc
~~~

# 関連情報

[GitHub  lcn/calc](https://github.com/lcn2/calc)
[開発者のサイト](http://www.isthe.com/chongo/tech/comp/calc/calc-whatis.html)