OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Desktop for Mac をインストールする

# 目的

- 前に実施したがやり方を忘れてしまったためまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

# 詳細

1. Docker Desktop for Macのインストール
    1. 下記にアクセスする。
        - [Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
    1. 「Get Docker」をクリックする。

        <img width="1789" alt="Docker_Desktop_for_Mac_-_Docker_Hub.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6e4c0f89-d60d-9b4d-0167-862ae2a19a09.png">
    1. Downloadフォルダに格納された「Docker.dmg」をダブルクリックで開く。

        <img width="779" alt="ダウンロード.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/198ce8ca-820f-9f36-1133-b5d5de32feaa.png">
    1. 下記のウインドウが出たら左のDockerのアイコンを長押しして持ち、同じウインドウの矢印の先にある「Applications」に移動する。

        <img width="832" alt="スクリーンショット 2020-05-11 17.35.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7ce68826-bc34-41b4-4f4b-f318cbc5285f.png">
    1. Applicationフォルダに格納されたDockerのアイコンをクリックして起動する。
    1. 下記のウインドウ開いたら「開く」をクリックする。

        <img width="532" alt="スクリーンショット 2020-05-11 17.39.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/05180c40-fa09-c9b3-b4ef-74b8d5d52e15.png">
    1. 「パスワード入力を求めるが良いか？」と聞いてくるので了承する方は「OK」をクリックする。

        <img width="710" alt="スクリーンショット 2020-05-11 17.41.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a09b3f7f-92b0-c24b-bd24-bd343909d5be.png">

    1. パスワードの入力を行う。
    1. 画面上部の帯にDockerの鯨のマークが表示された事を確認する。

        <img width="1327" alt="Item-0_と_Item-0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3992eabc-933c-547b-c69d-3f19695fc0e1.png">
Flutterアプリ作製時にxcdeviceがMacの容量をどんどん浸食する場合の解決方法

#Macの容量がどんどん減っていく。。
　iMac2017を使ってFlutterアプリを作っていた時、ふとMacのストレージを見てみると、何もしていないのに何故だか利用可能領域が「その他」で埋め尽くされ、どんどん減っていく現象が起きました。

![スクリーンショット 2020-05-11 9.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445558/67995ad2-580c-05fb-0b11-12158550fabd.png)

#アクティビティモニタでプロセスを確認
　放っておくとストレージ限界までどんどん増えていき警告が出てしまうので、慌ててアクティビティモニタを確認すると怪しい動きをするプロセスを発見しました。

<img width="926" alt="スクリーンショット 2020-05-11 10.09.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445558/47905c00-2a45-6941-1e2a-6dc4de6826f7.png">

- xcdevice

と言うプロセスがかなり頻繁に動いていておそらくこれが原因と仮定し調べてみることに。

#xcdeviceとは

xcdevice自体あまり記事が出てこないのですが、こちらを参照すると

https://github.com/flutter/flutter/pull/50252

「Xcodeのコマンドラインツールで、デプロイ可能なすべてのデバイスのjson配列を生成する」
のだそうです。

確かにMacにiPhoneをUSBで繋ぐと容量が減り始め、外すと止まるので、
どうやらアプリを動かすための実機を監視しているようです。

念のためxcdeviceが開いているファイルを確認するとやはりXcodeに関連したプロセスでした。
ちなみに普段はXcodeを開いておらず、エディタのVSCodeで作業しているだけで起きた現象です。

<img width="1156" alt="スクリーンショット 2020-05-11 10.46.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445558/6ad034ef-d0cb-3625-9a36-bb062d7f3238.png">

#これで動いた
結果的には

**Xcode > Window > Devices and Simulators**

を開くと一瞬だけ

**iPhone is busy: Copying cache file from device**

と表示されすぐに消えたのち、容量が減っていく現象が収まりました。
xcdeviceのプロセス自体は止まりませんでした。

<img width="796" alt="スクリーンショット 2020-05-11 9.10.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445558/e412fbfa-bd1b-de88-7261-686caea9a81e.png">


#xcdeviceのキャッシュ自体は再起動で破棄される
いろいろやってようやく止まりましたが、
xcdeviceが吐き出しているキャッシュ自体はMacを再起動すると
「Recovered files」としてゴミ箱に入ってました。

頻繁に再起動する方は気にならないかもしれませんが、
自分は基本的にMacの電源を入れっぱなしなので、
ストレージがいっぱいになってしまったと言うお話でした。
EclipseでJava EEのプロジェクトをGit管理する方法

## この記事は以下の環境で実施しています。

- Open JDK 8
- eclipse Photon Build

## 以下を前提としています。

- すでに動的WEBプロジェクトを作成している
- クローンするリポジトリがない
## EclipseでJava EEのプロジェクトをGit管理する方法

### ウィンドウ→パースペクティブ→パースペクティブを開く→Java EEを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/6e0211f2-3437-b514-3412-395e613738c7.png)

### プロジェクトを右クリック、チーム→プロジェクトの共用を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/897068c2-8401-f081-7d2d-f87f2e15f56a.png)

### Gitリポジトリ―の構成ウィンドウで作成ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/0396f6ec-69e9-57d6-4dc7-0cccfa8e4156.png)

### 新規リポジトリの作成ウィンドウで完了ボタンを押下する、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/2367ac3c-2714-ae75-00ab-692afc013c7a.png)

### Gitリポジトリ―の構成ウィンドウに戻るので完了ボタンを押下する、プロジェクトに「>」がついているので確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/3ac7f10e-a9da-2908-a411-fead81c6a1d8.png)

## 改訂履歴

- 2020/5/12 新規作成
VSCodeでPythonの補完が欲しいならMicrosoft Python Language Serverが最高な話

Pythonの補完には通常[Jedi](https://github.com/davidhalter/jedi)が使用されます。VSCodeでは通常、pipによりインストールできる[Python Language Server](https://github.com/palantir/python-language-server)を用いてJediを[LSP](https://microsoft.github.io/language-server-protocol/)に対応させることでPythonの補完を動作させています。

しかしながら、最近Microsoftの開発する[Microsoft Python Language Server](https://github.com/microsoft/python-language-server)なるものが存在することを知りました。こちらは、VSCodeのPython拡張機能を使っていれば簡単に導入することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/f556050c-500c-670e-5a7d-0b88559611ab.png)
設定画面から`Python: Jedi Enabled`をオフにすることで次回起動時に勝手にダウンロードされ有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/23376645-0f2f-8dcc-b126-63f583d02d4c.png)
デフォルトで簡単なLintのようなものも動作し、ドキュメントも美しく表示され、大変開発が捗ります。是非試してみてくださいね！
【意見募集】新発想？のフォームのセキュリティについて

Twitterのフォロワーさんと話していて、既にありそうだけど、もしかしたら使えるかもしれないフォームのセキュリティを見つけたので書いておきます。

例えば一般的なログインフォームはこんな感じですね？

```php:index.php
<?php
	mb_internal_encoding("utf-8");

	@session_start();

    if (isset($_SESSION['login'])&&$_SESSION['login']=="login") {
echo <<< EOM
ログイン
<form action="./logout.php" method="post">
	<input type="submit" value="ログアウト"></input>
</form>
EOM;
    }else{
echo <<< EOM
<form action="./login.php" method="post">
	<label>ID</label>
	<input name="username"></input>
	<label>PW</label>
	<input name="userid"></input>
	<input type="submit" value="ログイン"></input>
</form>
EOM;
    }
?>
```

```php:login.php
<?php
	mb_internal_encoding("utf-8");

	@session_start();

	if(isset($_POST['username'])&&
	isset($_POST['userid'])&&
	$_POST['username']==="admin"&&
	$_POST['userid']==="root"){
		$_SESSION['login'] = "login";
	}
   	header('location:./');
?>
```

表示するとこんな感じ
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82103/57121e30-5df1-d291-ddf3-961bc8462382.jpeg)

これはID(username)にadmin、PW(userid)にrootと入れるとログインできます。
しかしこれだと辞書攻撃などで容易に突破できてしまいます。

そこでlogin.phpをこう変えます。

```php:login.php
<?php
	mb_internal_encoding("utf-8");

	@session_start();

	if(isset($_POST['username'])&&
	isset($_POST['userid'])&&
	$_POST['username']==="admin"&&
	$_POST['userid']==="root"&&
	$_POST['pass']==="pass"){
		$_SESSION['login'] = "login";
	}
   	header('location:./');
?>
```

1行追加しただけですが、表のフォームには出ない値passを検査しています。これに入るためにはindex.phpをブラウザを表示した後、検証ツールなどでpass入力用のinputを追加してあげる必要があります。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82103/89403e63-093a-3f92-610d-d3141b0102e1.png)
シンプルですが、そもそもその追加するルールをわからなければいけない事とnameと値が分からなければ辞書攻撃で突破されないフォームが出来ている気がします。例えば追加するinputの数を多くしたり、type="hidden"で見た目を偽装すれば更に強固になっていくのではないでしょうか。

自分の知識だとこの方法は聞いたことがないのですが、既に名前が付いていたり弱点があったりするんでしょうか・・。
偽のログインサイトとか作られたらダメそうだけど
Webでの画像形式とファイルサイズ目安 [2020/5]

# Webでの画像形式とファイルサイズ

画像形式とサイズの目安

## JPG, JPEG

* 非可逆圧縮

| 区分 | 画素数 | JPGサイズ |
| --- | ----- | --------- |
| FHD | 1920x1080 | 2.2MB|
|4K   |3840*2169  |4.1MB |
|8K   |7680*4320  |21.5Mb|


## PNG

透過が使えて便利、losslessで細かい部分もぼやけずに表現。透過ならWebPでもできる。
小さいアイコン画像とかなら、JPGよりもサイズが小さくなり良いらしい。

| 区分 | 画素数 | PNGサイズ |
| --- | ----- | --------- |
| FHD | 1920x1080 | 3.9MB|
|4K   |3840*2169  |9.5MB |
|8K   |7680*4320  |47.1Mb|

## Webp

Google発

[a new image format for the web](https://developers.google.com/speed/webp/?hl=ja)

軽い・早い・透過できる・[Safariでは全く使えない](https://caniuse.com/#search=webp)

## SVG

ベクター
アイコンをいろいろなサイズでなめらかに表示したいとき、や、Canvas

#　圧縮

Webpつおい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129740/0a3bbe04-e96f-dbe8-5e54-cc58b93f6b92.png)
[画像出典](https://techlife.cookpad.com/entry/2014/12/04/090000)

その他
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129740/5287f79a-18b0-b875-26fc-f8607a0c1a4a.png)
[画像出典](http://www.bunkyo-itg.co.jp/page090.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129740/9accd081-9f46-2694-4e09-3cc40230f83e.png)
[画像出典](http://www.bunkyo-itg.co.jp/page090.html)

## 実験

何枚かの4K~サイズの画像（jpg）をwebpで出力してみた。
概してwebpの方が圧縮率が高かったが、特に同じ色が多いような画像（夜景や書類など）で圧縮率が高かった。
また、qualityに関しては、100~50程度までであれば、ほとんど画像の劣化を感じさせなかった。


|#|size|original data (kb)| webp q=100|webp q=80|webp q=60|webp q=40|
|---|----|------------------|----------:|--------:|--------:|--------:|
|0|4032x3024|6,099 kb|4,082kb <66.9%>|496kb <8.1%>|193kb <3.2%>|131kb <2.1%>|
|1|4032x3024|7,383 kb|4,998kb <67.7%>|1,462kb <19.8%>|884kb<12.0%>|670kb <9.1%>|
|2|4032x3024|9,385 kb|6,408kb <68.3%>|2,237kb <23.8%>|1,551kb<16.5%>|1,192kb <12.7%>|
|3|7088x3904|19,471 kb|12,343kb <63.4%>|4,449kb <22.8%>|3,127kb<16.1%>|2,397kb <12.3%>|
|4|4032x3024|5,095 kb|3,244kb <63.7%>|412kb <8.1%>|237kb<4.7%>|178kb <3.5%>|
|5|4032x3024|5,294 kb|3,421kb <64.6%>|468kb <8.8%>|270kb<5.1%>|196kb <3.7%>|

※<>内は、オリジナルデータの何％かを示している

### 実験コード

```.py
from pathlib import Path
from PIL import Image
from io import BytesIO
import webp

def getsize(img, ext=None, **kwargs):
    if ext is None:
        ext = img.format
    iobuff = BytesIO()
    img.save(iobuff, ext, **kwargs)
    return len(iobuff.getvalue())//1000 #Kb

if __name__ == '__main__':
    ips = list(Path('./').glob("*_*.jpg"))
    print('| # |size|original data (kb)|webp q=100|webp q=80|webp q=60|webp q=40|')
    print('|---|----|------------------|---------:|--------:|--------:|--------:|')
    for i, _p in enumerate(ips):
        im = Image.open(_p)
        h, w = im.size
        s1 = _getsize(im,quality=100)
        s2 = _getsize(im,ext="webp", quality=100)
        s3 = _getsize(im,ext="webp",quality=80)
        s4 = _getsize(im,ext="webp",quality=60)
        s5 = _getsize(im,ext="webp",quality=40)
        print(f'|{i}|{h}x{w}|{s1:,} kb|{s2:,}kb <{s2/s1*100:.1f}%>|{s3:,}kb <{s3/s1*100:.1f}%>|{s4:,}kb<{s4/s1*100:.1f}%>|{s5:,}kb <{s5/s1*100:.1f}%>|')

```

# Reference

https://blog.ideamans.com/2018/04/4k8k.html
macOSアップデート後の[xcrun: error: invalid active developer ...]の対処方法

### macOSをCatalinaにアップデートしたら、gitで下記のエラーが出ました。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

以下のコマンドを入力して、その後出るダウンロードをインストールしたら、解決しました。

```
xcode-select --install
```
DBMSについて色々調べてみた件（１）

どうも初めまして！　

最近基本情報技術者の資格取得に向けて勉強中な駆け出しエンジニアのワカです。

#■この記事を書こうと思ったきっかけ
最近書籍を購入して勉強しているのですが、暗記ばかりでなかなか身にならないと思いました。

そこで基本情報に書かれている内容を自分なりに解釈したものをここに備忘録として書き残すことにしました。
そうすれば手も動かせるし人にみられると思うとその分責任感出ますしね！

あと個人的に今自作PCを作りたいとも考えているのでこの機会に詳しくなっとこうと思ったのも理由の一つです笑

もしかすると間違っている点などあるかもしれませんので、その時は指摘していただけると嬉しいです。

#■DBMS（Data Base Management System)
データベースの定義や操作、制御などの機能を持つミドルウェアのことです
データを蓄積しておくための手段の一つ、大量の蓄積されたデータから必要な上を抜き出したり更新したりが簡単にできるため非常に重宝されます。
型には３種類（　関係型 階層型 ネットワーク型）ありますがここでは関係型のみ紹介しておきます

#■関係型データベース（RDR：Relational Data Base）

| 名称 | 説明 |
|:-:|:--|
| 表（レコード）  | 複数のデータを収容する場所のこと  |
| 行（レコード・組・タプル）  |１件分のデータを表します   |
| 列 （フィールド・属性）  | データを構成する各項目を表します  |

なぜ関係型というかというとデータ次第で複数の表を関連付けして扱うためこのように言われます

##正規化
**リレーショナルデータベースにおいて最も重要な考え方です！**

蓄積されているデータに矛盾や重複が発生しないように最適化することを正規化と言い、
例えば１つのテーブルに様々な行（レコード）が書かれていた場合、特定のものを探す場合だとか、編集する場合、探すのが面倒です。
こういう時に正規化を行っておくことで、表が見やすくなったり、矛盾や重複といった間違いをなくす事ができるわけです。

##関係演算について

データを分割する事が正規化と言いましたが、ただ分割されても表単体では全く意味を持ちません。
そこで表と表とで関係性を持たせて意味を持たせる必要があります。（これを関係演算とよぶ）

関係演算の種類には以下３種類が存在します。
関係演算を行うことによって単体では意味を為さなかった表も組み合わせることによって一意的な表を作り出す事ができる話です。

因みに、組み合わせてできる表のことを**ビュー表**と呼びます。

| 種類 |説明 |
|:-:|:--|
|選択   | 量を取りだせんざんですこの演算を行うことで表の中から特定の条件に合致する行だけを取り出すことができます  |
|射影   | 列を取り出す演算です この演算を使うことで表の中から特定の条件に合致する列だけを取り出すことができます  |
|結合   |表と表をつくつける演算です 表の中にある共通の例を介して二つの表をつなぎ合わせます   |

##スキーマ
スキーマ＝「概要・要旨」 つまり、データベースの構造や使用を定義するものです。
標準的に使用されている ALSI/X３/SPARC規格では三層スキーマ構造をとっています 

この構造を取ることでデータの独立性を高めることができます。

| 名前 | 説明 |
|:-:|:--|
| 外部スキーマ  | 利用者の必要とするデータの見方を表現します ビュー表 がこれに回答 ユーザーやプログラムに対して必要なデータだけを提供します プログラムに加えた変更はこのスキーマまでしか影響しません  |
| 概念スキーマ  | データの論理的関係を表現します 表の定義はここで いわば データベース 本体 プログラムからもハードウェアからも切り離されているのでどこにも依存せずデータの独立性が保たれています  |
| 内部スキーマ  | データの物理的関係を表現します 物理的に道を記憶させるかの定期はここ ハードウェア的な変更はこのスキーまで影響を吸収します  |


#■主キーと外部キー

データベースを扱うためには大量のデータの中から順番に探すわけにもいかないので、
特定のものを指す被りがない番号のようなものが必要になってきます。

例えば学生番号とか社員番号などがそうで、学生や社員個人に与えられた番号のようなものです。

それがデータベースにおいて**主キー**と呼ばれております。

また主キーは表と表とを関連付けさせる際にも一役買っており、「主キーを参照してますよー」と参照側のデータにあるキーのことを**外部キー**と言います。

##主キーとできる条件

ここまで主キーについて説明してきましたが主キーを設定するためには以下の条件があります。
この条件を満たさない場合は主キーとしては扱う事ができないので注意！

・表の中で内容が重複しないこと
・内容が空ではないこと

また一つの列では一意にならないけど複数の列を組み合わせれば一意になる場合、その主キーたちのことを**複合キー**と呼びます。

#■最後に

ここまで長々と読んでくださりありがとうございました！
少し説明がわかりにくかった部分があるかと思いますが、もしわからないところがあればコメントしていただけると嬉しいです。

では！次の記事にて！
Swagger UI ですべてのパスを開いた状態、展開した状態にする #Swagger

例:

URLパラメータで指定できる

https://petstore.swagger.io/?docExpansion=full

![image](https://user-images.githubusercontent.com/13635059/81512341-e534bd80-935a-11ea-9b8d-65b98f61ab35.png)


# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Haskell で Functor を使う

#HeskellでFunctorを使って簡単なプログラムを動かしてみました

Functorを使ってプログラムを動かすのは初めてです。
今回は簡単なプログラムを作ってみました。

```haskell:haskell.hs
data Haskell a= Shit a | Easy a | Difficult a | Demon a

instance Functor Haskell where
    fmap func (Shit n) = Shit (func n)
    fmap func (Easy n) = Easy (func n)
    fmap func (Difficult n) = Difficult (func n)
    fmap func (Demon n) = Demon (func n)

main::IO()
main = do
    let haskell_programing = Difficult 100

    let haskell = fmap ((-) 50) haskell_programing

    let a = (\(Difficult n) -> n) haskell

    print a
```

実行結果は

```
-50
```

##プログラム解説

```haskell
data Haskell a= Shit a | Easy a | Difficult a | Demon a
```

ここでは、型コンストラクタを定義しています。
`Haskell`型は、Haskellの難しさと、その度合いを表しています。
Haskellの難しさは、データコンストラクタにより、
`Shit`糞みたいに簡単、`Easy`簡単、`Difficult`難しい、`Demon`悪魔のように難しい、に分類されます。

```haskell
instance Functor Haskell where
    fmap func (Shit n) = Shit (func n)
    fmap func (Easy n) = Easy (func n)
    fmap func (Difficult n) = Difficult (func n)
    fmap func (Demon n) = Demon (func n)
```

インスタンスを定義しています。
`fmap`のよくある定義の仕方です。

```haskell
main::IO()
main = do
    let haskell_programing = Difficult 100

    let haskell = fmap ((-) 50) haskell_programing

    let a = (\(Difficult n) -> n) haskell

    print a
```

メイン関数です。
`haskell_programing`は、難しい、その度合いは100と、定義されています。
`haskell`は、`haskell_programing`に`fmap`を適用したものです。度合いが-50になってしまいました。

##今回のプログラムは・・・

今回は、Haskell解説書のFunctorの説明を見てプログラミングしました。
Haskell解説書は、Maybeを例にしていましたが、本に書いてあるとおりにそのまま動かしても仕方ないので、「これができるなら、こんなこともできるんじゃないか？」と考えて、自分なりに作ってみて動かすのが、習得の近道だと思います。
OctoberCMS　viewの表示

モデルの中身が以下のようなとき、

```php:models>User.php

public $belongsTo = [
  'divgroup' => [
    '<プロジェクト名>\<プラグイン名>\Models\<モデル名>',
    'table' => '<>',
    'order => 'div_name' <!-- いるのかわかってない -->
  ]
];

<!-- 下はRainLabのUserプラグイン規定値 -->
public $belongsToMany = [
  'groups' => [
    UserGroup::class,
    'table' => 'user_groups'
  ]
];
```

viewでは以下のように記述する

```html

<!-- divgroupの表示 -->
{{ user.divgroup.div_name }} <!-- divgroupのdiv_nameカラムをとってくる

<!-- groupsの表示 -->
{% for group in user.groups %}
  {{ group.name }} <!-- groupのnameカラムをとってくる -->
{% endfor %}
ConohaVPSにMastodonをインストールするときの注意点まとめ

今回は、ConohaVPSにMastodonをインストールしたので、そのときの注意点をまとめておきます。

#チュートリアルページは？
ConohaVPSがあまりマニュアル周りのアップデートを行っていないのか、どれが今見るべきマニュアなのかよくわからない状態になっていました。

2020/05/12時点では、
「https://support.conoha.jp/v/mastodon/?btn_id=v-startupscript_controlpanel-sidebar_v-mastodon#01」
がMastodonのマニュアルとして正解っぽいです。

このページの「こちらの項目については2018/11/06以降にMastodonイメージからVPSを作成された方向けのものとなります。」と書いてある方を参考にしてください。

ただ、メールサーバーの設定がこのページには書いていません。

メールサーバーの設定は
「https://support.conoha.jp/v/mastodonconoha/」
を見ながら設定してください。

#注意点
##独自ドメインの設定方法
DNS周りの情報が書いてなかったので、付け足しておきます。
お名前.comなどで取得した場合は、まずConohaVPSの管理画面サイドバーの「DNS」から「+ドメイン」で、取得済みのドメインを入力してください。

取得したら、そのドメインのDNSレコードを設定する必要があります。

Aレコードで、名称＠、TTL3600、値はVPSのIPアドレスを入力してください。
また、お名前.comから利用するネームサーバーをデフォルトのものから、ConohaVPSで表示されているネームサーバー（ns-a1.conoha.io）に変更してください。

##バージョン違い
ConohaVPSのマニュアルは、Mastodonのバージョンが「2.6.0」になっています。
ただ、実際にインストールされているバージョンは「2.6.5」となっています。
そのため、マニュアル通りにやってもうまくインストールできません。

###変更部門
####3. Mastodonの設定

マニュアルの「3.Mastodonの設定」項目で、実行するコマンドが記載されています。

```
sudo su - mastodon
bash
cd ~/live
RAILS_ENV=production ~/.rbenv/versions/2.6.0/bin/bundle exec rake mastodon:setup
```

これだと、デュレクトリがないと怒られるので

```
sudo su - mastodon
bash
cd ~/live
RAILS_ENV=production ~/.rbenv/versions/2.6.5/bin/bundle exec rake mastodon:setup
```
と変更して入力してください。

####4.Mastodonのデーモン化

マニュアルの「4.Mastodonのデーモン化」項目で、3つのファイルを作成するように指示されています。

こちらも、バージョン違いなので、こんままだとアクセスしたあとにエラーが発生していしまいます。

#####/etc/systemd/system/mastodon-web.service

```
ExecStart=/home/mastodon/.rbenv/versions/2.6.0/bin/bundle exec puma -C config/puma.rb
```

を

```
ExecStart=/home/mastodon/.rbenv/versions/2.6.5/bin/bundle exec puma -C config/puma.rb
```

#####/etc/systemd/system/mastodon-sidekiq.service
```
ExecStart=/home/mastodon/.rbenv/versions/2.6.0/bin/bundle exec sidekiq -c 5 -q default -q pu
```

を

```
ExecStart=/home/mastodon/.rbenv/versions/2.6.5/bin/bundle exec sidekiq -c 5 -q default -q pu
```

と変更してファイルを作成してください。

以上が注意点です。

ConohaVPSさんが、このqiitaに気付いてメンテナンスしてくれることを祈ります。

以上
おわおわり
【Swift】UIStackViewでviewがうまく表示されないエラーの修正

UIStackViewを使って、Viewを等間隔で配置しようとしたく、**Distributiuon = .equalSpacing**に設定していましたが、
viewが思った通りのレイアウトで表示されませんでした、、

え、、stackViewって自動でレイアウト調整してくれるから便利なんじゃないの？？
と困惑しました笑


# StackViewのsubViewも幅や高さは明示的に制約をつけなければならない場合がある！

公式に書いてあるとおり、Distributionには5つの種類があります。
[UIStack View .Distribution](https://developer.apple.com/documentation/uikit/uistackview/distribution)

- .fill
- .fillEqually
- .fillProportionally
- .equalSpacing
- .equalCentering

5つのDistributionの詳しい説明は以下の記事を参照ください。めちゃくちゃわかりやすいです！
[UIStackViewの5つのdistributionを理解する](https://qiita.com/taka1068/items/69273f05d34cfbeb3679#fill)


この５つのうち、私が使いたかった**.equalSpacingはStackViewのSubViewに制約を明示的につけなければならなかったようです！**

```Swift
subview.heightAnchor.constraint(equalToConstant: 100).isActive = true
```

こんな感じでsubViewに制約をつけてあげたら解決しました！！
Railsの環境構築からミニアプリ作成まで

Railsの環境構築からミニアプリ作成まで

🔳rails newコマンド
Railsで新しいアプリケーションを作る時

```
rails(バージョン指定可 _5.2.3_) new アプリケーション名　-オプション名 (-d MySQL)
```
```
bundle install
```
これでアプリの雛形が完成！

🔳hamlとSassの導入
#
```
gem 'haml-rails'
```
```
rails haml:erb2haml
```
application.hamlのハッシュロケットをシンボル型にする
#
```
 %meta{content: "text/html; charset=UTF-8", "http-equiv": "Content-Type"}
```
リセットcssの設定
#
```
@import "reset";
```

🔳rails db:createコマンド
新しくデータベースを作成するコマンド

🔳ルーティングの設定
#
```
root ‘posts#index’
```
コントローラーを作る
#
```
rails g controller posts
```
メソッドを作成
#
```
def index
end
```
モデルを作成
#
```
rails g model post
```

マイグレーションファイルをいじる
#
```
rails db:migrate
```
ポストモデルいじって全部表示
PHPで厳密な型チェック「declare」

## declareとは

declareとは、実行エンジンに対して、スクリプトの処理方法を指示するための仕組みです。

## 例

$priceに文字列を代入します。型宣言で引数・戻り値にintを指定しています。

```php

$price = '100'; //文字列を代入

print calc_tax($price);

function calc_tax(int $price): int {
  return $price * 0.08;
}
```

結果は8が返ってきます。文字列が代入されているので、厳密にチェックしたい場合にdeclareを指定します。

```php
declare(strict_types=1);

$price = '100'; //文字列を代入

print calc_tax($price);

function calc_tax(int $price): int {
  return $price * 0.08;
}
```

``Fatal error: Uncaught TypeError: Argument 1 passed to calc_tax() must be of the type integer, string given``

型が自動で変換されず、エラーが返されます。

## 参考

[独習PHP 第3版](https://www.amazon.co.jp/dp/479813547X/ref=cm_sw_em_r_mt_dp_U_d3DUEbXAF7EY3)
CircleCIで詰まったこと

#前提
php:7.3
laravel:6
postgres:9.6
ubuntu
macOS

#本題
CircleCI導入時に詰まったところを記入していきます。

今回はDBにpostgresを使用していたため、以下の記述が必要になるとのこと。
<code>&& sudo apt-get -y install libpq-dev</code>

```config.yml
#変更前
steps:    
      - checkout
      - run:
          name: Update apt-get
          command: sudo apt-get update


#変更後
steps:    
      - checkout
      - run:
          name: Update apt-get
          command: sudo apt-get update  && sudo apt-get -y install libpq-dev
```




##**mmap() failed: [12] Cannot allocate memory**
メモリー容量不足が原因とのこと。
下記のコマンドをターミナルに入力し解決。

```
# free -m   #容量の確認
# sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
# sudo chmod 600 /swapfile
# sudo mkswap /swapfile
# sudo swapon /swapfile
```

##**SQLSTATE[08006] [7] FATAL:  role "root" does not exist**
ずーっとこのエラーにハマってました...
DockerHubの公式サイトを見るとすぐに解決しました。
https://hub.docker.com/r/circleci/postgres

```cofig.yml
#変更前
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.3-node-browsers
      - image: circleci/postgres:9.6-alpine
    environment:
      - DB_CONNECTION: circle_testing

#変更後
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.3-node-browsers
      - image: circleci/postgres:9.6-alpine
    environment:
      - ENV POSTGRES_DB: circle_testing  #変更点
```


##**Impossible to create the root directory**
そういえば、ssh内のlaravel/.envのAPP_URLがローカルになってると思い、修正しました。

```env.
#変更前
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:*************************=
APP_DEBUG=true
APP_URL=http://localhost

#変更後
APP_URL=http://本番環境のURL.com
```
<code>APP_URL=http://localhost</code>を本番環境のURLに変更しました。

よし、これでリロード！
...またエラー

##**failed to open stream: Permission denied**
ディレクトリパーミッション
Laravelをインストールした後に、多少のパーミッションの設定が必要とのこと。
storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能に設定。
設定しないとLaravelは正しく実行されません。
Homestead仮想マシンを使用する場合は、あらかじめ設定されています。

```
root@eee10544329b:/var/www# chmod -R 777 storage
root@eee10544329b:/var/www# chmod -R 777 bootstrap/cache
```

何とか本番環境でアプリケーションを問題なく起動できました。
本から学ぶプログラミング May 11



```
```

#脳が若返る最高の睡眠
https://amzn.to/3bntgt4
###第１章 寝不足が認知症を引き起こす
- 睡眠時間が短いほど認知症を引き起こしやすい
- 寝不足による影響は、まるで脳の下水が詰まるようなもの
###第３章　長寿女性と成功者の睡眠習慣
- 脳の脳幹にあるマスター時計は人の時を管理している。ただマスター時計は一日を２５時間と考えるため、朝目覚めたらできるだけ早く日光を５分で良いから浴びることで、この１時間のズレを修正できる

###第５章　感情を休息させる脳番地快眠法
- イギリスではうつ病の治療の第一歩として、患者にまず運動を勧めるが、アメリカではそうではない
- 有酸素運動はうつの症状全般に効く
- 運動をすると少なくとも血液中では抗うつ剤を飲むのと同じくらいBDNFが増える

```
```
#脳を鍛えるには運動しかない
https://amzn.to/2WJAwu

###第４章　不安　パニックを避ける
- 運動によって筋肉が働き始めると、体は燃料を供給しようと脂肪を分解して脂肪酸を作り、血液中に放出する。この遊離脂肪酸は血液中を移動する際の乗り物にするために、トリプトファン（必須アミノ酸の一つ）と結合していた輸送タンパク質（アルブミン）を奪い取る。身軽になったトリプトファンは浸透圧差に導かれて血液、脳関門を易々と通り抜け、脳に入っていく。そしてたちまちセロトニンの構成材料になる
###第５章　うつ　気分をよくする
- エンドルフィンはストレスホルモンであり、マラソンランナーの血液ではエンドルフィン値の上昇が見られた。きつい運動の最中に脳を落ち着かせ、筋肉の痛みを和らげる

###第６章　注意欠陥障害　注意散漫から抜け出す
- ADHDの患者もトレーニングをしている限りは、薬がなくても集中できる
###第７章　依存症　セルフコントロールの仕組みを再生する
- セックスをするとドーパミンレベルが１.５倍から２倍に上昇するが、コカインを吸引すると、３倍から８倍にまで急騰する
- 何かを好きであることと、それを欲することには違いがあることがわかった
- 薬物は、側坐核の樹状突起を著しく成長させてシナプス の結びつきを増やす。その変化は薬物をやめた後も数ヶ月から、時には数年もそのまま残る
- 中国語では動物は守護になり得るが、野菜は守護にならない。野菜にここからあそこまでジャンプしろとは言えません。動くのをやめてしまえば、あなたは動物ではなく、野菜になってしまうのです
- 妊娠中のラットに絶えずアルコールを与えた所、胎児の海馬で生まれる脳細胞の数が激減した
###第８章　ホルモンの変化　女性の脳に及ぼす影響





```
```
#今日は...
- 昨晩１０キロのランニングの直後に、必須アミノ酸の粉末 BAAを３０グラム摂取した所、今日の朝起きた時に筋肉の痛みがかなり引いていた。効果があるのかもしれない
- 2set目の１０キロランニングをしてまたアミノ酸を飲んだ。体の脂肪が落ちてきた。
- 今日は今学期の成績発表で、ドロップをした数学以外はAだった。夏休みにretakeをするが、うまくいけばgpaが3.878まで上がり、パブリックアイビーに編入ができると思う。
```
```
【新人エンジニア向け】AWSのお問い合わせガイドラインから学ぶ良い質問のポイント

# はじめに

良い質問をすることって難しいですよね。

私は新人の頃、先輩社員に何をどう質問すれば良い回答をしてもらえるのかわからず、結果的に質問自体がおっくうになってしまった経験があります。

本記事では同じ経験をしてしまう人を減らすために、**AWSサポートの技術的なお問い合わせに関するガイドライン**から良い質問をするためのポイントを記します。

#  AWSサポートの技術的なお問い合わせに関するガイドラインとは？

こちら

[ AWSサポートの技術的なお問い合わせに関するガイドライン](https://aws.amazon.com/jp/premiumsupport/tech-support-guidelines/)

> AWS サポートでは、お客様の課題の解決を効率的かつ迅速に行いたいと常に考えています。本ページでは、お客様が技術的なご質問をサポートケースに起票いただく際に、早期解決に役立つポイントをまとめました。例文も掲載していますのでぜひご参照ください。

AWSユーザーがAWSサポートへ技術的な質問を行うときのポイント、具体例が掲載されています。

ポイントは多数掲載されていますが、**新人エンジニアが先輩社員に質問するときに心がけると良いポイント**を抜粋します。

# 緊急度を設定する

> 緊急度の設定について
> ・適切な緊急度の設定は問題の円滑な解決にとって重要です。

緊急度を設定します。

ガイドライン上はビジネスへの影響度に重きを置いていますが、新人エンジニアとしては**回答が得られるまでの間、他のタスクを進行できる状態であるか**を伝えると良いでしょう。

# 解決したい課題を明確にする

> 最終的に実現したいことと現在の状況を詳しくご共有ください

例：

```
×「Error: Invalid parameters なんとか」って、どういう意味ですか？

×「Error: Invalid parameters. Exceed capacity limit」は、どういう時に出ますか？

○*** を実現するために、CLIで「xcmd ??? -o –k –v:33」と投入したら、「Error: Invalid parameters. Exceeding capacity limit」とメッセージが出て、失敗しました。どうしたら良いでしょうか。コマンド投入時刻は日本時間の本日 15:52、Request ID は *** です。
```

> ご質問内容が省略されている場合、内容の確認にお時間を必要としますので、省略せずにご記載をお願いいたします。
> コマンドの間違い、コマンド投入者の権限不足、AWS 基盤の一時的障害など、さまざまな可能性をお調べします。
> 「最終的に実現したいこと」に近づくための別の方法をご案内することがあります。

ガイドライン上はCLIの例となっていますが、記載されているポイントはコーディングやその他業務にも通じることだと思います。

・何をしたかったのか

・できなかったこと

・できなかったときの操作など詳細な状況

を伝えると良いでしょう。

経験上、**質問が長くならないように質問内容を省略するより大胆に該当部分のソースコードをベタ貼り**した方が解決までの時間が早いです。

# 状況を正確に共有する

> ログ類や画面キャプチャの共有をご検討ください

> 初期の起票段階でログ類やキャプチャを添付いただくことで、サポートエンジニアから共有をお願いする連絡が不要となり、その分、解決までの時間が短くなる可能性があります。

スタックトレースやアプリケーションログはもちろんですが、画面に関する質問をするときはあらかじめ画面キャプチャを連携すると良いでしょう。

動きやデザインを文字や口頭で正確に伝えることは難しいです。正確に伝えるために実際の画面キャプチャやgifを連携すると良い質問に近づきます。

# 経緯を共有する

> すでに試した対応策があればご教示ください

例：

```
×いろいろやっていますが、うまくいきません。
	
○下記のURLの手順は試しましたが、最後のステップで*** というエラーがでます。
https://docs.aws.amazon.com/***/***
```

先輩社員が調査をするとき、既に実施済みの調査や試してみた対応がある場合は失敗したと判断した箇所も含めて連携しましょう。

**実は解決まであと一歩だった**といった状況かもしれません。

# 課題が解決した際のお願い

> 終わりよければすべてよし
>
> ・サポートエンジニアからの回答を得て、お客様の課題が解決した場合、サポートケースをそのままにされることなく、解決した旨をケースにご記載いただき、クローズいただくようお願いいたします。
>
> ・お客様ご自身で課題を解決した場合であっても、同様に、解決された状況をサポートケース上にご記載いただき、クローズすることを推奨いたします。

先輩社員からの回答を試した結果、解決できた場合はその旨を伝えましょう。

回答が来る前に解決できた場合もその旨を伝えましょう。

また、本題からずれますが課題と解決方法を社内wikiや**Qiita**にアウトプットすると良いかもしれません。

# その他

> 文脈依存性のない記述にご協力ください
>
> ・お客様組織内の独自の用語等は使わずにご質問ください。

こちらは新人と先輩社員という関係性であればあまり意識する必要はないかもしれませんが、

個人的には**複数の解釈が取れる略称**、**一般的ではない社内用語**は質問以外の会話でもできる限り使用しないように心がけています。

# まとめ

## 良い質問をするためのポイント

・回答が得られるまでの間、他のタスクを進行できる状態であるかどうか

・何をしたかったのか

・できなかったこと

・できなかったときの操作など詳細な状況

・ログ、画面キャプチャ

・自分で解決するために試してみたこと

を伝えることを意識する

## 質問をした後

状況にかかわらず解決したときは解決報告をする

アウトプットもできればなお良い

# 〆

何をするにも基準があると非常に助かりますね。

この記事を参考にして少しでも質問のハードルが下がれば幸いです。

# 参考・引用元

[ AWSサポートの技術的なお問い合わせに関するガイドライン](https://aws.amazon.com/jp/premiumsupport/tech-support-guidelines/)
DockerでERROR: 2 matches found based on name: network XXXXX_default is ambiguousエラーが出た場合

### 概要
docker-compose up時に、`ERROR: 2 matches found based on name: network XXXXX_default is ambiguous`エラーが出た場合の対処法

（私の場合はRubyMineで`docker-compose up`を二回叩いてしまってこのエラーが出ました)

```terminal
$ docker-compose up
ERROR: 2 matches found based on name: network my_rails_default is ambiguous
```

## 操作

重複しているdockerネットワークを確認

```
$ docker network ls
NETWORK ID          NAME                    DRIVER              SCOPE
3b7ed7e650f7        my_rails_default   bridge              local
0d73ba605d99        my_rails_default   bridge              local
```

重複しているdockerネットワークを削除

```
Docker network rm 0d73ba605d99
```

重複しているdockerネットワークを削除したら、docker-compose upでエラーがなくなりました。

以上
初心者によるプログラミング学習ログ 313日目

#100日チャレンジの313日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
313日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>313日目 2.5h<br>・架空LP模写6日目2.5h（<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>）<br>・架空LP模写：制作一覧部分を作成<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1259935526406074370?ref_src=twsrc%5Etfw">May 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
記事一覧

# フロントエンド
[HTML]()
[Haml](https://qiita.com/tigerwest1009/private/927dfa392601c0116091)
[CSS](https://qiita.com/tigerwest1009/private/c020703775d0cf9cc50c)
[Sass](https://qiita.com/tigerwest1009/private/0c43b5a440d7880f5fa6)
[BEM](https://qiita.com/tigerwest1009/private/ffa9364da8def1083c58)
[javascript]()


# バックエンド
[Ruby]()
[Python]()

# webアプリケーションフレームワーク
[Flask]()
[Django]()
[Ruby on Rails](https://qiita.com/tigerwest1009/private/49149baaf7bfb6a8b218)

# データベース
[MySql]()
[データベース設計](https://qiita.com/tigerwest1009/private/a9cab7df774470051417)

# サーバー
[AWS]()

# Webアプリケーション開発
[Webアプリケーション開発の流れ](https://qiita.com/tigerwest1009/private/f885e8e8c32e29663748)
[Git](https://qiita.com/tigerwest1009/private/88ea56249cb577e629b2)
[Github](https://qiita.com/tigerwest1009/private/819479ccef840a50206b)

# その他
[検索の仕方](https://qiita.com/tigerwest1009/private/dda787e2f870c81b810a#%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%81%8B%E3%82%89%E7%B2%BE%E5%BA%A6%E3%81%AE%E9%AB%98%E3%81%84%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E6%8E%A2%E3%81%97%E5%87%BA%E3%81%99%E3%82%B9%E3%82%AD%E3%83%AB)
[良いコードの書き方](https://qiita.com/tigerwest1009/private/28c664094250c55c4b9c)
[マークダウン記法]()
[リファクタリング](https://qiita.com/tigerwest1009/private/5816a6822de972f1962a)
【Go言語】Go製データベースBadgerの基本的な使い方まとめ【BadgerDB】


日本語のドキュメントを探しても見つからなかったのでメモ。

# Badgerとは

* BadgerDBは、純粋なGoで記述された埋め込み可能な永続的で高速なKey-Value（KV）データベースです。
* Github: [https://github.com/dgraph-io/badger](https://github.com/dgraph-io/badger)

# 環境(執筆時点)

* Go: 1.14.2
* Badger: 2.0.3

# インストール

```bash
$ go get github.com/dgraph-io/badger/v2
```

# サンプルコード

db.View() は読み取り専用トランザクションです。このメソッド内で更新処理は行なえません。

```golang
package main

import (
	"fmt"
	"log"

	badger "github.com/dgraph-io/badger/v2"
)

func handle(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

func main() {
	// オプションを作成
	opt := badger.DefaultOptions("./foo/bar")

	// DBに接続
	db, err := badger.Open(opt)
	handle(err)

	// 最後にDBから切断
	defer db.Close()

	// 読み書きトランザクション
	err = db.Update(func(txn *badger.Txn) error {
		err = txn.SetEntry(badger.NewEntry([]byte("apple"), []byte("140")))
		err = txn.SetEntry(badger.NewEntry([]byte("melon"), []byte("320")))
		err = txn.SetEntry(badger.NewEntry([]byte("lemon"), []byte("230")))
		return err
	})
	handle(err)

	// 読み取り専用トランザクション
	err = db.View(func(txn *badger.Txn) error {

		// 全てのキーと値をループ
		opts := badger.DefaultIteratorOptions
		it := txn.NewIterator(opts)
		defer it.Close()
		for it.Rewind(); it.Valid(); it.Next() {
			item := it.Item()
			k := item.Key()
			err := item.Value(func(v []byte) error {
				fmt.Printf("key=%s, value=%s\n", k, v)
				return nil
			})
			if err != nil {
				return err
			}
		}

		// キーを指定して取得
		item, err := txn.Get([]byte("apple"))
		handle(err)
		err = item.Value(func(val []byte) error {
			fmt.Printf("apple: %s\n", val)
			return nil
		})
		handle(err)

		return nil
	})
	handle(err)
}

```

出力結果は以下の通り

```bash
key=apple, value=140
key=lemon, value=230
key=melon, value=320
apple: 140
```

# オプション

インメモリにする場合は以下の通り

```golang
opt := badger.DefaultOptions("").WithInMemory(true)
```

ログ出力をオフにする場合は以下の通り

```golang
opt.Logger = nil
```

# その他

BadgerはLSM-Treeとは別に値を保持する関係上、定期的にGCを実行する必要があるようです。
([https://github.com/dgraph-io/badger#garbage-collection](https://github.com/dgraph-io/badger#garbage-collection))

# まとめ

Badgerは記述がシンプルなためプロジェクトにも簡単に組み込めそうです。
デフォルトの設定でも高速ですがチューニング次第でさらに高速に稼働できそうです。
他にもキーのプレフィックス検索やキーのみのループ処理など便利な機能があるようです。(README参照)
スライダーのプラグイン bxsliderの設定（2パターン）

bxsliderを使って、2つの型を設置したのでメモとして残します。

##■PC時スライダー、SP時無効

__●ポイント__
・SP時はcssだけでそのまま要素を一列の縦積み。

・ウィンドウ幅を取得して基準にすること。
・フラグを用意し、スライダーを起動したときにはリサイズしても処理が通らないようにすること。
・スライダーをやめるときは、オプションの slider.destroySlider(); でスライダーをデストロイすること。


```js
$(function () {
  var slider;
  var sliderflag = false;

  //読み込み時初回実行
  sliderSetting();

  // リサイズ時の実行
  $(window).on('resize', function () {
    sliderSetting();
  });

  function sliderSetting() {
    var width = $('body').width();
  
    if (width >768 && sliderflag === false ) {
      slider = $('.js-slide').bxSlider({
        minSlides: 4,
        maxSlides: 4,
        auto: false,
        moveSlides: 1,
        responsive: false,
        slideWidth: 222,
        slideMargin: 20
      })
      sliderflag = true;
  
    } else if (width <= 768 && sliderflag === true ) {
      slider.destroySlider();
      sliderflag = false;
    }
  }

});

```


##■PC時スライダー、SP時スライダー

__●ポイント__
・PC時のオプション設定と、SP時のオプション設定が異なるため、
　ウィンドウ幅を取得して基準とし、処理を分けている。
・PC時のスライダーが起動した時のフラグ、
　SP時のスライダーが起動した時のフラグ、
　それぞれを所持するようにし、
　リサイズ時に余分な実行をしないようにしている。
・PCのスライダーを出す時、SPのスライダーを出すときそれぞれで、
　一度オプションの slider.destroySlider(); でスライダーを
　デストロイしてから再設置している。

```js
$(function () {
  var slider;
  var sliderflag = false;

  //読み込み時初回実行
  sliderSetting();

  // リサイズ時の実行
  $(window).on('resize', function () {
    sliderSetting();
  });

  function sliderSetting() {
    var width = $('body').width();

    // 規定サイズより大きかったらPC用の設定に
    // flagは、一度もpcで起動していない、または、spで起動してた場合。
    if ((width > 768 && sliderflag === false) || (width > 768 && sliderflag === 'sp')) { 
      if (sliderflag === 'sp') {
        slider.destroySlider();
      }
      slider = $('.js-slide').bxSlider({
        minSlides: 4,
        maxSlides: 4,
        auto: true,
        moveSlides: 1,
        responsive: true,
        slideWidth: 204,
        slideMargin: 16,
        infiniteLoop: true
      });
      sliderflag = 'pc';

    // 規定サイズより小さい場合はスマホ用の設定に
    // flagは、一度もspで起動していない、または、pcで起動してた場合。
    } else if ((width <= 768 && sliderflag === false) || (width <= 768 && sliderflag === 'pc')) { 
      if (sliderflag === 'pc') {
        slider.destroySlider();
      }
      slider = $('.js-slide').bxSlider({
        minSlides: 1,
        maxSlides: 1,
        auto: true,
        moveSlides: 1,
        responsive: true,
        slideWidth: 270
      });
      sliderflag = 'sp';
    }
  }
});
```

##■補足
・bxslider は、最新のjQuery では動かない模様。
　公式では「jquery/1.8.2/jquery.min.js」のバージョンを読んでいる。

##■参照
https://stand-4u.com/web/javascript/bxslider.html
【Rails】Refileでの保存先をS3にする


## 開発環境

Ruby 2.5.7
Rails 5.2.3

※今回、デプロイについての説明は割愛します。
※AWSのアカウントを持っている前提で話を進めていきます。
※Refileは導入済み

## IAMでユーザーの追加
サービスからIAMを選択し、ユーザーを選択するとユーザーを追加することができます。
`プログラムによるアクセス`にチェックをいれてください。
![スクリーンショット 2020-05-12 2.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456939/e5096027-8172-12e2-453e-cc4fa95fcaf3.png)
既存のポリシーを直接アタッチから`AmazonS3FullAcccess`にチェックを入れます。
アクセスキーIDとシークレットアクセスキーは忘れないようにメモをするかcsvでダウンロードしておきましょう。

ユーザーの追加後、そのユーザー名を選択したら↓のような画面が出てきます。
そこの認証情報からコンソールのパスワードを設定しましょう。(デフォルトでは無効になってます)
※ここのユーザーのARNはコピーしておくと後の設定が少し楽になります。
![スクリーンショット 2020-05-12 2.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456939/ba518e49-3cd1-e7c8-f040-aaa65c22da83.png)

## S3バケットの追加
ここから先は追加したIAMユーザーで作業を行います。
今使っているアカウントからログアウトし、作成したIAMユーザーでログインしてください。
リージョンは無難に東京を選択しておきましょう。  
![スクリーンショット 2020-05-12 3.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456939/0ee47ced-74b4-8b24-c95c-fe306df5bba9.png)
この２つにチェックを入れ、バケットを作成してください。

## バケットポリシーの設定
バケット単位でアクセス制御を設定するために、作成したS3バケットを選択してから`アクセス制限>バケットポリシー`を選択


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::awsアカウントのid:user/IAMで追加したユーザー名"
            },
            "Action": "*",
            "Resource": "arn:aws:s3:::作ったS3バケット名"
        }
    ]
}
```
これを自分の設定に置き換えて保存してください。

## gemの追加

```ruby:gemfile
gem "refile-s3"
gem 'dotenv-rails'
```
refile-s3   : refileで簡単にS3にアップロードができるようになるgemです
dotenv-rails: envが使えるようになるgemです

記述後`bundle install`を実行。

## refile.rbを作成
`config/initializers`に`refile.rb`を作成してください。

```ruby:refile.rb
require "refile/s3"

aws = {
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  region: "ap-northeast-1",
  bucket: "作成したS3バケット名",
}
Refile.cache = Refile::S3.new(prefix: "cache", **aws)
Refile.store = Refile::S3.new(prefix: "store", **aws)
```
作成したファイルに上記を記述
リージョンは東京以外で作られた場合は変更して下さい。

## .envの作成
Gemfileなどがあるディレクトリに`.env`を作成

```bash:.env
AWS_ACCESS_KEY_ID="アクセスキー"
AWS_SECRET_ACCESS_KEY="シークレットキー"
```
設定後、githubなどに.envファイルを上げないように`.gitignore`に`/.env`と追記しておきましょう。

## 最後に

あとはいつも通りデプロイをすることで、画像がS3に保存できるようになります。
CentOS8にRails6のDevelop環境を構築する

手元のPCで動かすことはできたけど、モバイル端末での表示を試したかったり、チーム内で使用感を共有したい場合などに、ちょっとした仮想環境でRailsが動く環境が欲しくなったので作ってみました。



# 超忙しい人向け
「とりあえずバージョン等は気にしないから、手軽に動けばいい」という方向けの手順はこちら。
イントラでの利用を想定しています。事前作業として、

- CentOS8のインストール（最小限のインストール)
- プライベートのIPアドレス割当（下記では192.168.0.100)
- SELinuxやfirewalldは無効化

を行っている前提です。

<!-- ※/root/以下にアプリケーションのディレクトリを生成するので、production環境で動かす場合は要注意（後述）-->


```
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
dnf install -y git gcc gcc-c++ openssl-devel readline-devel zlib-devel sqlite-devel tar bzip2 make nodejs yarn
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 2.7.1
rbenv global 2.7.1
gem install rails
rails new testapp
cd testapp
rails s -b 192.168.0.100
```

# もうちょっと詳しく知りたい人向け
（鋭意執筆中）

<!---
# Production環境を作りたい人向け
セキュリティ的観点からも言えますが、
rootユーザのディレクトリ配下にアプリケーションを配置すると
Nginxで動かす際にパーミッションの関係で苦労します。あらかじめ他のユーザを作成して、
-->

2020/10/13追記
この方法で入れたrbenvをアップデートするときは以下の通り

```
$ cd ~/.rbenv
$ git pull origin master
$ cd ~/.rbenv/plugins/ruby-build
$ git pull origin master
```
RecyclerViewでDiffUtilを使うならAsyncListDifferが便利

## はじめに

RecyclerViewでnotify()系のメソッドでアイテムを更新することは多い思います。
最も手軽な方法はnotifyDataSetChanged()でアイテム全体を更新することですが、アイテムひとつを更新したい時などでは無駄にViewが再生成されパフォーマンスが劣ります。
更新前後のリストを比較して、必要最小限のアイテムを更新することが望ましい方法です。

## DiffUtilとは
[DiffUtil](https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil)は2つのListを比較して差分を計算するユーティリティクラスです。
これをRecyclerViewで使うことで、変更があった際に差分だけ更新され、更新された部分にアニメーションがかかるようになります。
このDiffUtilは、Listのサイズが大きい場合や複雑な場合には、計算に時間がかかるためバックグラウンドスレッドが推奨されています。
そしてこの非同期処理を担ってくれるのが[AsyncListDiffer](https://developer.android.com/reference/androidx/recyclerview/widget/AsyncListDiffer)です。AsyncListDifferを使えば、KotlinCoroutineなどで非同期処理を自分で書くことなく差分を計算できます。

## RecyclerView.Adapterでの使用例
```kotlin

 class UserAdapter extends RecyclerView.Adapter<UserViewHolder> {
     private final AsyncListDiffer<User> mDiffer = new AsyncListDiffer(this, DIFF_CALLBACK);
     @Override
     public int getItemCount() {
         return mDiffer.getCurrentList().size();
     }
     public void submitList(List<User> list) {
         mDiffer.submitList(list);
     }
     @Override
     public void onBindViewHolder(UserViewHolder holder, int position) {
         User user = mDiffer.getCurrentList().get(position);
         holder.bindTo(user);
     }
     public static final DiffUtil.ItemCallback<User> DIFF_CALLBACK
             = new DiffUtil.ItemCallback<User>() {
         @Override
         public boolean areItemsTheSame(
                 @NonNull User oldUser, @NonNull User newUser) {
             // 2つのアイテム自体が同じものであるかを判定します。
             return oldUser.getId() == newUser.getId();
         }
         @Override
         public boolean areContentsTheSame(
                 @NonNull User oldUser, @NonNull User newUser) {
             // 表示する内容が前後で異なっているかどうかを判定します。 falseを返す場合Viewが再利用されます。
             // このメソッドはareItemsTheSameがtrueを返す場合にのみ呼ばれます。
             return oldUser.userName == newUser.userName;
         }
     }
 }
```

## 使い方
#### AsyncListDiffer

- `submitList(list: List<T>)` : AsyncListDifferに新しいリストを渡して非同期で古いリストとの差分を計算させます。
- `getCurrentList()` : 現在のリストを取得します。差分の計算が終わっていない場合は古いリストを返します。
 
#### DiffUtil.ItemCallback
- `areItemsTheSame(oldItem: T, newItem: T)` : 2つのアイテムが同じものであるかを判定します(ユニークなIDを比較するなど)。
- `areContentsTheSame(oldItem: T, newItem: T)` : `areItemsTheSame`がtrueを返す場合にのみ呼ばれます。2つのアイテムのデータ内容が同じであるかを判定します。RecyclerViewで使用するならば、表示する内容が前後で異なるかどうかを判定することで、Viewの無駄な再生成を防ぐことができます。
- `getChangePayload(oldItem: T, newItem: T)` : `areItemsTheSame`がtrue, `areContentsTheSame`がfalseを返すときのみに呼ばれます。２つのアイテムを比較して値を返します。例えば、画像のurlに変更があったときだけ画像表示時にフェードアニメーションをかけ、そうでないときはアニメーションをかけたくないときなどに用いると便利です。

## 参考記事
- https://qiita.com/nakker1218/items/271760a2cfa90e41fb4e
備忘録：イベントループ処理の理解に苦しんだ

# はじめに
初投稿です。
普段はJavaを使用して、Webアプリケーションの開発に携わっています。（２年ほど）
趣味で自宅でプログラミングをしているのですが、最近Javascriptでローカルサーバーが構築できることを知り、うきうき気分でNode.jsをインストールしました。
そこで最初につまづいたのが、このイベントループ処理という方式なので、備忘録的に残しておこうと思います。
※ 当方、まだまだ経験も知識も浅いため、間違っている点等があれば、遠慮なくご指摘ください。

# スレッドとイベントループ
今まで自分が使用してきたJava言語と何が違うのか、ざっくり違いを挙げていくと

**Javaはスレッドモデルである**
**Node.jsはイベントループ方式である**

- **並列**で処理するか、**並行**で処理するか
- **マルチスレッド**か、**シングルスレッド**か

というイメージです。
並列処理と並行処理の違いについては、以下の記事が参考になりました。
https://qiita.com/Kohei909Otsuka/items/26be74de803d195b37bd


スレッドモデルでは、１つのリクエストに対して、１つのスレッドを生成します。
対して、イベントループでは、リクエストが幾つかに関わらず、１つのスレッド上でしか動作しません。

# それぞれのメリット・デメリット
### スレッドモデル　
**メリット**
並列処理ができるため、複数のリクエストがきた場合、他のリクエストが失敗していても、他のリクエストの処理は邪魔されることなく実行されます。

**デメリット**
スレッドはメモリを消費するため、メモリに限界がくると次のリクエストが受け付けられなくなります。C10K問題が起こりうる。

### イベントループ方式
**メリット**
[C10K問題](https://ja.wikipedia.org/wiki/C10K%E5%95%8F%E9%A1%8C)を回避できる。

**デメリット**
こちらに参考になる記事がありました。
まだ全体的に読んでも理解できていないので割愛します・・・
https://www.yunabe.jp/docs/why_events_are_a_bad_idea.html


# Node.jsを使ってみて感じたこと
普段Javaになれており、非同期処理といえばAjax！ぐらいしか知らないような自分にとっては、実装が難しく感じました。しかし、Javascriptで無意識的に敬遠していた、Promiseやasync/awaitについて嫌でも触れることになったので、とても勉強にもなりました！

### 補足 
今回で学んだasync/awaitやPromiseについても、どこかで備忘録にあげていこうと思います。
また、イベントループ方式はNode.jsでしか使われていないわけではなく、Javascriptに備わっているsetTimeoutなどもイベントループ方式らしいです。
[こちらのサイト](https://coliss.com/articles/build-websites/operation/javascript/javascript-visualized-event-loop.html)が動きもついててとてもわかりやすかったです。
RailsのViewでActiveRecordな大量データを出したら…めっちゃ遅！高速化した話

# 結論
- ある特定ユーザだけ段違いにレコードを持っていて、全部のレコードを表示する画面を実装したら無事死亡
- ActiveRecordで取得したオブジェクトがすごく巨大だった
- `ActiveRecord::QueryMethods.select`で劇的に早くなった！
- あくまで特殊の場合だと思うから、銀の弾丸ではないよ


## めっちゃ遅くて使いものにならない
特定ユーザ様だけ大量のレコードを持っていました
問題はそこではなく、あるオペレーションの確認画面を作ったときにその影響ある全てのレコードを表示させたかったので、全レコードを表示しようとしたらすごく遅くなってしまいました

ページネーションを実装する程でもないと考え、ローカル環境なのでデータも少ないため「よさそう」「ヨシッ」という気分で使ってもらったら…ゴメンナサイゴメンナサイ

## どうしようどうしよう
実際のページを見てみたらページを表示しきるのに何十秒とかかっていました
なんで遅いんでしょうか…

- 大量のDOMを表示しきるのに時間がかかっている？
- 発行しているSQLクエリが遅い？

そういえば、メモリ使用量も段違いに上昇していることに気づきました。やっぱりSQLクエリが悪いんでしょうか…
しかしながら、発行されているクエリはN+1問題は発生しておらず、２テーブルくらいしかJOINしていませんでした

ひとまず本番で起きていた状況を再現するため、ローカルでデータを大量に登録し実行してみました。同じように遅くメモリが大量に消費されていました
確認には[rack-mini-profiler Gem](https://github.com/MiniProfiler/rack-mini-profiler)を使いました

## 問題はメモリ消費だ。だがどうやって？ → selectを使う

```ruby
records = Model.where(condition: true)
```

このようなクエリを書く時、モデルの全てのカラムを変数に格納するので、カラム数の多いテーブルは特に一つずつのレコードのメモリも当然大きくなりますよね
今回の場合、確認画面でしたので`id`, `name`ぐらいで良かったのでそれ以外のデータを取得しないようにしました

```ruby
records = Model.select(:id, :name)
               .where(condition: true)
```

それだけの対策で実行時間を２５分の1まで縮めることが出来ました。やったぜ

## 終わりに

落ちがつまらなく申し訳ないですが、高速化の手法だと

- N+1を避ける
- ページネーションをする
- 適切なDBインデックスを貼る

などかな思っていたので、個人的に新鮮な体験だったのでドキュメント化しました

`select`で使うカラムを制限して恩恵が受けられるのは

- 集計的な、特定の情報だけを大量に用意する場合
- カラム数が多いテーブルに対して

などだと思います。みなさんもお気をつけて

以上

### References
https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-select
VScodeでgitが使えなくてハマった（有効なソース管理プロパイダーがありません）

#困った点
Visual Studio Code（以下、VScode）でgitを使おうとした際、「有効なソース管理プロパイダーがありません」と表示され、視覚的に操作を行うことができない状態になった。
##状況
os: mac
git: version 2.23.0
Githubにリポジトリを作成し、ローカルファイルと連携完了した状態。
ある程度ファイル作成は行っている。
ターミナルからファイルのプッシュなどを行うことはできる。

#今回有効だった解決法
VScode画面左部分から、拡張機能ビューを開きボックス内に「@builtin git」と入力。
Gitが無効となっていたため有効に変更した。

#今回有効ではなかったが、その他試したこと
・ターミナルで「git --version」を入力し、そもそもgitが入っているか確認
・VScodeの再起動
・PCの再起動

#参考
https://tatsu-piropiro.tumblr.com/post/181830577888/visual-studio-code%E3%81%A8git%E3%81%AE%E9%80%A3%E6%90%BA%E6%99%82%E3%81%AE%E5%BC%95%E3%81%A3%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D
スプレッドシートの自作関数を人に使ってもらうときの配布方法

# GASスクリプトを他の人に使ってもらう時の方法色々
共有で使用しているスプレッドシートで使える関数を自作したときに、便利だなと思ってメンバにシェアしたいときや、依頼されて作成したスクリプトを渡すとき、どのような方法があるのかのメモ。


# 0.今回配布するテスト用スクリプトの用意
テストとして、下記のスクリプトを作成して配布するケースを説明します。

```Javascript:GAS
function testFunction () {
  Browser.msgBox("確認", "WRYYYYYYYYYYYYYYY!!!!!!", Browser.Buttons.OK);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/31ff421e-b8ec-7d89-6188-ddff7cac8339.png)
実行結果


# 1.開いたときにメニューとして、スクリプトを追加する

```Javascript:GAS
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {
      name : "これはテスト関数です！", //図の②
      functionName : "testFunction" 
    }
  ];
  sheet.addMenu("ここがメニューの名前になります", entries); //図の①
  //メインメニュー部分にaddMenuの第一引数をメニュー名としてメニューを作成して、第二引数に関数情報を渡す。
};

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/62cc5c58-62db-94c1-0e3e-0b13f0b1639e.png)


# 2.スクリプト実行ボタンを用意する

### 図形挿入 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/9af25b38-cf48-a451-0ad4-13a1483b4996.png)
図形描画を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/a7eada97-9ad8-2814-27c7-fe4916f6e12e.png)
適当にボタンとなる図形を選択する。別に吹き出しでもテキストでもよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/32f0e94b-9ca7-7e16-59ff-120d04bffe84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/79999fed-3a01-bdc2-02fe-9432df15c284.png)
スクリプトを割り当てを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/0101d9b1-75c8-2171-89c1-e82a08521c3f.png)
作成した関数名を入力する。今回は"testFunction"と入力。手入力なのでタイプミスに注意！


# 3.マクロとしてインポートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/1da6d0de-e5e3-cd97-f285-3da4d9c945d7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/714085c1-bc98-5f17-89ea-a6676cabc40e.png)
スクリプト一覧が表示されるので、該当のスクリプトを選択して関数を追加をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/7d0b6f79-7fa5-1763-7f32-32d75a5c3913.png)
これでOKです。右上の×で閉じます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/428a3f72-7cf2-0619-836f-126a543a52fa.png)
関数が表示されるようになりました。


# 注意（コンテナバインドとスタンドアローンの違い）
スタンドアローンスクリプトファイルに作成した場合は、スクリプトファイルの共有設定も適切に付与する必要がある。
ビット全探索を学ぶ

##先人達が残してくれた資料
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-10-%E5%95%8F)

「ここまで解いたら」から挑戦していきます。
最後のbit全探索について学習します。

##[AC - 3.05.ビット演算](https://atcoder.jp/contests/apg4b/tasks/APG4b_ac)
bit演算を初めて学習する人は[AC - 3.05.ビット演算](https://atcoder.jp/contests/apg4b/tasks/APG4b_ac)を見てください。

##ビット全探索
ビット全探索とは「すべてのビット列の組合せ」に対して何らかの処理を行うことをいいます。
組合せの全列挙をシンプルに実装することができます。
下記がAtcoderのサンプルになります。

```C++:C++
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  // 3ビットのビット列をすべて列挙する
  for (int tmp = 0; tmp < (1 << 3); tmp++) {
    bitset<3> s(tmp);
    // ビット列を出力
    cout << s << endl;
  }
}
```

- (1-3)は８を表しています。
- C++にてbitを扱う際にはbitsetを使用します。
- 000, 001, 010, 011, 100, 101, 110, 111を表示するプログラム。

では次は最後の問題に取り掛かりましょう。

##[C - Train Ticket](https://atcoder.jp/contests/abc079/tasks/abc079_c)
問題文はAtcoderを参照してください。

- 2^3、つまり８通り全探索で記載する方法
- 2^N、将来を見てbit全探索を行う方法

の２通りの回答があります。今回はbit全探索を使いましょう。

- 考えたい組み合わせは、"+"、"-"をどのように組み合わせるかです。
- 0を"+"、1を"-"としましょう。

```C++:C++
#include <iostream>
#include <vector>
#include <cmath>
#include <bitset>
 
using namespace std;
using ll = long long;

int main(int argc, const char * argv[]) {
    string s;
    cin >> s;
    vector<int> var(s.length(), 0);
    //A, B, C, Dに分ける
    for(int i=0; i<s.length(); i++){
        var[i] = atoi(s.substr(i, 1).c_str());
    }
    
    // 3ビットのビット列をすべて列挙する
    for (int tmp = 0; tmp < (1 << 3); tmp++) {
        bitset<3> b(tmp);
        // ビット列を使用した処理
        s.clear();
        int sum=var[0];
        s+= to_string(var[0]);
        
        //3bitのループ
        for(int i=0; i<3; i++){
            //i桁目のbitが0or1を判定
            if(b.test(i)){
                sum=sum-var[i+1];
                s+="-"+to_string(var[i+1]);
            }else{
                sum=sum+var[i+1];
                s+="+"+to_string(var[i+1]);
            }
        }
        
        if(sum==7){
            cout << s + "=7" << endl;
            break;
        }
    }
    
    return 0;
}
```

解説を見なくてもbit全探索で組めていると思えるプログラムができました。
後日に答え合わせをしたいと思います。

今回はいつもと違いC++で記載しています。
C++で組めると自信がある問題、練習のときだけpythonを使用しています。