OmniAICreator/Qiita-1.07M huggingface dataset:
python3.7 + PipEnv + Django with VSCode on Windows10 環境構築

# 目的
表題の手順をいまいち覚えきれないので自分の為にまとめることにする。
Djangoプロジェクトを作成し、サーバの起動確認まで行う。

#環境

 - Windows10
 - VSCode


# 前提

下記はインストール済の前提。

 - VSCode
 - Python3.7
 - PipEnv

※PythonとPipEnvのインストールは[**ここ**](https://qiita.com/youkidkk/items/b6a6e39ee3a109001c75)を見て実施済

# 手順
## 仮想環境を新規作成
VSCodeのターミナル（cmdを前提）にて、環境のルートにしたいところ（例えば C:\hoge ）に行って、下記コマンドを実行。

``` 
C:\hoge>mkdir venv
C:\hoge>cd venv
C:\hoge\venv>pipenv --python 3.7
```

すると、**venv**という名前の仮想環境ができあがる。名前は好きに決めてよい。
例えば、`mkdir fuga`, `cd fuga`, `pipenv...`とすると、fugaという名前の仮想環境ができる。

## 仮想環境有効化
下記コマンドを実行し、仮想環境**venv**を有効化する。

```
C:\hoge\venv>.venv\Scripts\activate
```

## Djangoインストール
先ほど有効化した仮想環境 **venv** 内にDjangoをインストールする。
まず、プロンプトが下記のようになっていることを確認する。

```
(venv) C:\hoge\venv>
```

続いてpipを最新化。

```
(venv) C:\hoge\venv>pip install --upgrade pip
```

そして、Djangoをインストール。

```
(venv) C:\hoge\venv>pip install django
```

## Djangoプロジェクトの作成
サンプルプロジェクトを作成する。下記コマンドを実行。

```
(venv) C:\hoge\venv>django-admin startproject sample
```

インストールが正常に終了したらサーバの起動確認を行う。下記コマンドを実行。

```
(venv) C:\hoge\venv>cd sample
(venv) C:\hoge\venv\sample>python manage.py runserver
```

ブラウザを立ち上げて http://localhost:8000/ にアクセスする。
下記のような画面が表示されたら全工程終了。おつかれさまでした。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/130282/4816d5fc-2923-8cab-172b-efb2550a76f6.png)


# 参考
 - [Python + venv を使うときのVSCode環境](https://qiita.com/evansplus/items/bcc5552f432466cb0587)
 - [Windows + Python 3.6 + PipEnv + Visual Studio Code でPython開発環境](https://qiita.com/youkidkk/items/b6a6e39ee3a109001c75)
 - [初めてのDjango開発](https://qiita.com/mas9612/items/d616a74f931babae4566)
ローカル開発でのomniauthのTwitter認証にどハマった話

# はじめに
ハマる人はいないのかもしれませんが…僕は数時間ハマってしまったのでメモとして残します。

# OmniAuthを使ったTwitter認証
Twitter認証をOmniAuthを使って黒魔術的にやろうとしました。

このような認証エラーが…
<img width="839" alt="スクリーンショット 2018-10-07 22.22.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/37268/54a23c88-13e5-6edf-95ab-81621fdba59b.png">

慣れないRuby、そして初めてのSinatra…
プログラミングを楽しく書ける言語のはずなのに…楽しめない…悔しい

#原因
Twitterのアプリ側のコールバックの設定のミスが原因でした。
最初は以下の設定をした状態で、`localhost:4567`にアクセスをしていました。
<img width="475" alt="スクリーンショット 2018-10-07 23.01.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/37268/cf22617e-4c81-00b0-05d5-a13f24a729b7.png">

ここで`127.0.0.1:4567`にアクセスしておけば正常に動作したのですが…
`localhost:4567`を追加して無事にTwitter認証ができました。
<img width="469" alt="スクリーンショット 2018-10-07 22.59.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/37268/55b40a20-8219-4114-6d74-c776703aecb9.png">

#まとめ
やっぱりRubyは楽しくかけるプログラミング言語でした
接続が切れたWiFiアダプタを自動でオンオフして再接続するバッチファイル「reWiFi.bat」

![rewifi.png](https://qiita-image-store.s3.amazonaws.com/0/71326/e8f74b36-5c07-11db-992d-dcefac3d2a3e.png)
自宅PCのWiFiが切れたままになるので自動で蘇生するreWiFi.batを書いた話です。

#発端
朝、PCをチェックして電源はそのままにして出勤。
夜、帰ってくるとWifiが切れて繋がらないままになっている。
ということが最近起きていて困っていました。

ケーブルに問題があるのかと思い本体にWifiアダプタを直刺しして様子を見てみると、それでも繋がらなくなる。
Wifiを一度無効化して再度有効にすると接続ができる。

というわけで定期的に接続状態を監視して、切れてたら回復させるbatファイルを書きました。

#方法
ネットワークインターフェースを一度無効化して再度有効化します。

#reWiFi.batファイル
```bat:reWifi.bat
@echo off
rem チェック時間間隔を設定する(sec)
set interval=60

rem インターフェース名を設定 *netsh interface show interfaceで調べる
set "interfaceName=Wi-Fi"

rem 場所の移動する
cd /d "%~dp0"

rem 現在の状態を表示 
netsh interface show interface "%interfaceName%"

:checking
echo [%date% %time%] Checking %interfaceName%...
netsh interface show interface %interfaceName% | find "接続状態:             接続" > nul
if ERRORLEVEL 1 goto notconnection

rem 時間をおいてループします
timeout /t %interval% > nul
goto checking


:notconnection
echo [%date% %time%] %interfaceName%は切断されているようです。回復処理を開始します。

rem ログに日時を保存
echo %date% %time%,disconnect! %interfaceName%>> log_reWiFi.txt

echo [%date% %time%] %interfaceName% を無効化して待機します。
netsh interface set interface "%interfaceName%" disable > nul
timeout /t 10 > nul
echo [%date% %time%] %interfaceName% を再起動します。
netsh interface set interface "%interfaceName%" enable > nul
timeout /t 20
goto checking

pause
```

#使用上の注意
##管理者権限
動作には**管理者権限**が必要です。

`右クリック > 管理者として実行`でやるか、
.batファイルのショートカットを作り、
`プロパティ > ショートカットタブ > 詳細設定`から
`管理者として実行(R)`にチェックを入れておきます。
ダブルクリックで起動するときはこのショートカットからやると便利です。

##監視時間
とりあえず60秒にしてありますが、300秒(5分)とかでもいいかもしれません。
お好みで変更してください。

##インターフェース名
うちの環境では`Wi-Fi`という名前でした。環境に合わせて変更してください。

```
C:\WINDOWS\system32>netsh interface show interface

Admin State    State          Type             Interface Name
-------------------------------------------------------------------------
有効             切断             専用               イーサネット
有効             切断             専用               イーサネット 2
有効             接続             専用               Wi-Fi

```
コマンドはこんな感じでInterface Nameでてきます。


##その他の定期的実行方法
タイマー部分を削除し、batファイルをタスクスケジューラに登録して定期実行する、とかでもいいと思います。

##最後のpauseいらなくね？
なんかいれておきたくなるんですよね…エラーの時すぐウインドウ消えちゃうし。

#参考文献
参考にさせていただきました。ありがとうございます！

wifiを無効化して有効化するbat|14にゴー
http://blog.14nigo.net/2016/02/rebootwifibat.html
コア部分。

バッチファイルを常に「管理者として実行」する方法 - Windows - Project Group
https://www.projectgroup.info/tips/Windows/comm_0092.html
ショートカットを作ってそっちで設定しておく方法。

Windowsバッチファイルでping応答の違いで動作をかえる – OSAKANA TAROのメモ帳
https://blog.osakana.net/archives/5429
最初はpingを見て判断するやつを書いてましたがインターフェースのオンオフに変更。

#そもそもなんで切れるの？
わからん…なんも…
ホスト毎にターミナル背景色を自動変更

# iTermsで プロファイル自動変更を簡単設定

###【この記事で解決すること】
1. 設定ファイル類の編集一切無し
2. ホスト毎にターミナルのプロファイル（文字色/背景色）を設定できる
3. キーワード（ホスト名/ユーザ名/ディレクトリ名）で自動的に切り替え
4. 所要時間：５〜１５分

###【この記事がある理由】
- ログイン先での事故を防ぎたい（eg.開発ホストと本番ホストを間違えない様に）

###【この記事の対象者】
- 複数ホストに頻繁にログインする方
- MacOSユーザ
- iTerm2を使う人

---
## 0.準備
このサイトが本家です。Automatic Profile Switchingの説明もこちらに。
https://www.iterm2.com/

---
## 1.切替用のターミナルプロファイルを作成
1. iTerm2を起動
2. Preferenceを開き、Profileリボンを選択
3. 切替用のターミナルプロファイルを作成

![スクリーンショット 2018-10-07 22.51.41.png](https://qiita-image-store.s3.amazonaws.com/0/111758/a6b15a11-bfaf-684d-4ec3-598ec0b8b454.png)

---
## 2.対象ホスト全てに「Shell Integrationファイル」を設置
対象ホストに順次ログインし下記のスクリプトを実行。iTermサイトにある"Shell Integrationファイル（シェルスクリプト）"を設置

``` 
curl -L https://iterm2.com/shell_integration/bash -o ~/.iterm2_shell_integration.bash
```
---
## ３.iTerm2にて、切替用プロファイル毎にフックするキーワードを登録
1. iTerm2を起動
2. Preferenceを開き、Profileタブを選択
3. 切替用のターミナルプロファイルを作成

![スクリーンショット 2018-10-07 22.51.59.png](https://qiita-image-store.s3.amazonaws.com/0/111758/b156ea85-d065-3903-c860-a9724d54264f.png)

---
## 4.感想
びっくりするほど簡単です。

---
## 参考サイト
1. https://www.iterm2.com/documentation-automatic-profile-switching.html
2. https://dev.classmethod.jp/etc/do-ssh-and-change-bg-color-iterm2/
python2.7で日付型のオブジェクトをunixtimeに変換する

python2.7の日付型のオブジェクトをunixtimeに変換してあげる必要があったんですが、関数一発で変換できない悲しみ。
備忘録も兼ねて記事に。

# 動作確認ッ！
https://paiza.io/projects/SOf4wlucLW5uX4DQj_C19Q

Qiitaにもpaiza.ioみたいな感じでwebから動作確認できる、お砂場が欲しい……:yum:

# コード内容ッ！

```unixtime.py
import time
from datetime import datetime, date

def convert_unix_time(datetime_obj):
    return int(time.mktime(datetime_obj.timetuple()))

print convert_unix_time(datetime.now())

# 1538919464
```

と、こんな感じです。
timetupleで変換したものを、mktimeに渡して、そしてそれをInt型に落としています……！

しかし、値を取りたかっただけなのに、こんなめんどくさいことに。
他に上手い実装方法はないのだろうか:thinking:

# 追記
python3ならtimestamp関数があるので、こんな不便なことには……:sob:
Django 1.10 -> 2.1.2 Upgrade

<https://btj0.com/%E3%83%96%E3%83%AD%E3%82%B0/django/django%E3%82%921-11%E3%81%8B%E3%82%892-0%E3%81%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97/>

```
pip3.6 install Django -U
```
エラーなし。
ずんだの1桁足し算問題 Java11編

tbpgrさんの[「ずんだの1桁足し算問題 Ruby編」](https://qiita.com/tbpgr/items/6c75930566dda97bb5b6)を2018年9月にリリースされたJava11で実装しました。

```java
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {    
        IntStream.range(1, 10)
            .boxed()
            .flatMap(x -> {
                return IntStream.range(1, 10).mapToObj(y -> {
                    int z = x + y;
                    var tilda = "~".repeat(z);
                    return String.format("%d+%d=%s%d", x, y, tilda, z);
                });
            })
            .forEach(System.out::println);
    }
}
```

このコードのJava11らしい点といえば、Java11より導入された`String::repeat`を利用していることでしょうか。「とある文字列をn回繰り替えした文字列を生成する」APIがJavaではながらく標準として用意されておらず、自分でUtilメソッドを作成したり、外部ライブラリを用意したりする必要がありましたが、Java11より`String::repeat`が標準ライブラリに実装されています(参考: https://qiita.com/neko_the_shadow/items/78ad73e86f45e4994a89)

なお実行結果は次の通りでした(´・ω・｀)

```
1+1=~~2
1+2=~~~3
1+3=~~~~4
1+4=~~~~~5
1+5=~~~~~~6
1+6=~~~~~~~7
1+7=~~~~~~~~8
1+8=~~~~~~~~~9
1+9=~~~~~~~~~~10
2+1=~~~3
2+2=~~~~4
2+3=~~~~~5
2+4=~~~~~~6
2+5=~~~~~~~7
2+6=~~~~~~~~8
2+7=~~~~~~~~~9
2+8=~~~~~~~~~~10
2+9=~~~~~~~~~~~11
3+1=~~~~4
3+2=~~~~~5
3+3=~~~~~~6
3+4=~~~~~~~7
3+5=~~~~~~~~8
3+6=~~~~~~~~~9
3+7=~~~~~~~~~~10
3+8=~~~~~~~~~~~11
3+9=~~~~~~~~~~~~12
4+1=~~~~~5
4+2=~~~~~~6
4+3=~~~~~~~7
4+4=~~~~~~~~8
4+5=~~~~~~~~~9
4+6=~~~~~~~~~~10
4+7=~~~~~~~~~~~11
4+8=~~~~~~~~~~~~12
4+9=~~~~~~~~~~~~~13
5+1=~~~~~~6
5+2=~~~~~~~7
5+3=~~~~~~~~8
5+4=~~~~~~~~~9
5+5=~~~~~~~~~~10
5+6=~~~~~~~~~~~11
5+7=~~~~~~~~~~~~12
5+8=~~~~~~~~~~~~~13
5+9=~~~~~~~~~~~~~~14
6+1=~~~~~~~7
6+2=~~~~~~~~8
6+3=~~~~~~~~~9
6+4=~~~~~~~~~~10
6+5=~~~~~~~~~~~11
6+6=~~~~~~~~~~~~12
6+7=~~~~~~~~~~~~~13
6+8=~~~~~~~~~~~~~~14
6+9=~~~~~~~~~~~~~~~15
7+1=~~~~~~~~8
7+2=~~~~~~~~~9
7+3=~~~~~~~~~~10
7+4=~~~~~~~~~~~11
7+5=~~~~~~~~~~~~12
7+6=~~~~~~~~~~~~~13
7+7=~~~~~~~~~~~~~~14
7+8=~~~~~~~~~~~~~~~15
7+9=~~~~~~~~~~~~~~~~16
8+1=~~~~~~~~~9
8+2=~~~~~~~~~~10
8+3=~~~~~~~~~~~11
8+4=~~~~~~~~~~~~12
8+5=~~~~~~~~~~~~~13
8+6=~~~~~~~~~~~~~~14
8+7=~~~~~~~~~~~~~~~15
8+8=~~~~~~~~~~~~~~~~16
8+9=~~~~~~~~~~~~~~~~~17
9+1=~~~~~~~~~~10
9+2=~~~~~~~~~~~11
9+3=~~~~~~~~~~~~12
9+4=~~~~~~~~~~~~~13
9+5=~~~~~~~~~~~~~~14
9+6=~~~~~~~~~~~~~~~15
9+7=~~~~~~~~~~~~~~~~16
9+8=~~~~~~~~~~~~~~~~~17
9+9=~~~~~~~~~~~~~~~~~~18
```
MacOSでRaspberry Pi 3にRaspbian Stretchのセットアップ

## 背景
ラズパイを買ったのでセットアップの方法を軽く

## 手順
#### 1. microSDのフォーマット
- disk Utility.appからmicroSDを選択
- フォーマットを「MS-DOM（FAT）」として消去する
<img width="683" alt="スクリーンショット 2018-10-07 22.30.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/193600/f26d8b98-f215-3d2b-e3b8-78f0576f1d23.png">


#### 2. RASPBIANのダウンロード
- [Download Raspbian for Raspberry Pi](https://www.raspberrypi.org/downloads/raspbian/)
- 今回はRASPBIAN STRETCH WITH DESKTOPのZIPをダウンロード

```bash
$ # ダウンロードしたzipファイルを解凍
$ unzip /path/to/20**-**-**-raspbian-stretch.zip
```

#### 3. イメージディスク作成
- [Etcher](https://etcher.io/)を使ってディスク作成
- Select imageで`20-**-**-raspbian-stretch.img`を選択
- Select driveで上記でフォーマットしたmicroSDを選択
- Flash!
<img width="802" alt="スクリーンショット 2018-10-07 22.33.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/193600/0e0fc716-92e2-62d0-797b-5093c533ca49.png">


#### 4. microSDを挿入してRaspberry Piを起動
- 指示に従って言語設定、パスワード変更などをする

## 参考ページ
- [Raspbianのセットアップ（Raspbian Stretch 2017/11/29版）](https://a244.hateblo.jp/entry/2017/12/22/234815)
[macOS] プログラムからshellコマンドを呼び出す方法

# プログラムからのshellコマンドを呼び出す方法
macOSプログラムで、プログラム中からshellコマンドを呼び出す方法について説明します。
コマンド実行時の標準入力, 標準出力, 標準エラー出力を、呼び出し側に接続します。

## 実行環境
* IDE: xcode 10.0
* Programming Language: Swift

## 手順
1. 入出力（パイプ）の準備
2. 入出力の接続
3. 終了時コールバックの接続
4. 実行および実行終了待ち

### 1. 入出力（パイプ）の準備
Pipeオブジェクトを生成し、読み出しあるいは書き込みハンドラを提議します。
プログラム中の`cons`オブジェクトは、シェルコマンドにデータを入力し、出力を受け取るオブジェクトです。シェルコマンドからの`cons`オブジェクトアクセスは、*アプリケーションに対して非同期*である点にご注意ください。

````
let inpipe  = Pipe()
let outpipe = Pipe()
let errpipe = Pipe()

inpipe.fileHandleForWriting.writeabilityHandler = {
  (filehandle: FileHandle) -> Void in
  if let str = cons.scan() {
    if let data = str.data(using: .utf8) {
      filehandle.write(data)
    } else {
      NSLog("Error encoding data: \(str)")
    }
  }
}

outpipe.fileHandleForReading.readabilityHandler = {
  (_ handle: FileHandle) -> Void in
  if let str = String(data: handle.availableData, encoding: String.Encoding.utf8) {
    cons.print(string: str)
  } else {
    NSLog("Error decoding data: \(handle.availableData)")
  }
}

errpipe.fileHandleForReading.readabilityHandler = {
　　(_ handle: FileHandle) -> Void in
　　if let str = String(data: handle.availableData, encoding: String.Encoding.utf8) {
　　　　cons.error(string: str)
　　} else {
　　　　NSLog("Error decoding data: \(handle.availableData)")
　　}
}
````

### 2. 入出力の接続
上で生成したパイプをshellコマンド実行用プロセスに割り付けます。

````
let process  		   = Process()
process.launchPath	   = "/bin/sh"
process.arguments	   = ["-c", <シェルコマンドと引数の文字列>]
process.standardInput      = inpipe
process.standardOutput     = outpipe
FileHandle.standardOutput  = errpipe
````

### 3. 終了時コールバックの接続
終了時コールバックを設定し、*コールバックが呼び出された時に、Read/Writeハンドラをnilでクリアする*のがポイントです。これを忘れるとシェルコマンド実行終了あと、ハンドラが何度も呼び出され、プログラムがハングに陥ります(高負荷状態になります)。

````
process.terminationHandler = {
  (process: Process) -> Void in
  if let handler = termhdl  {
    handler(process.terminationStatus) // コールバック関数呼び出し
  }
  if let inpipe  = process.standardInput as? Pipe {
    inpipe.fileHandleForWriting.writeabilityHandler = nil
  }
  if let outpipe = process.standardOutput as? Pipe {				  
    outpipe.fileHandleForReading.readabilityHandler = nil
  }
  if let errpipe = process.standardError as? Pipe {
    errpipe.fileHandleForReading.readabilityHandler = nil
  }
}
````

### 4. 実行および実行終了待ち
プロセスを実行開始します。必要に応じてプロセスの実行終了を待ちます。
````
process.launch()
process.waitUntilExit()
````

## 参照
本ドキュメントで説明した実装は、自作のフレームワーク[Coconut Framework](https://github.com/steelwheels/Coconut)の、[CNShelクラス](https://github.com/steelwheels/Coconut/blob/master/CoconutShell/Source/CNShell.swift)にて実装しています。
Java9から、primitive typesに対応するクラスのコンストラクタがdeprecatedマークされている

詳しくは、以下のissueに全部書いてある。

[https://bugs.openjdk.java.net/browse/JDK-8176335](https://bugs.openjdk.java.net/browse/JDK-8176335)


[ちなみに、Characterのソースコードを見ると…](https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/Character.java)

```java
public static Character valueOf(char c) {
    if (c <= 127) { // must cache
        return CharacterCache.cache[(int)c];
    }
    return new Character(c);
}
```

このように`valueOf`メソッドには、キャッシュの仕組みがあり、インスタンスの生成コストが低い、とのこと。
Qt C++ ウィンドウの生成


フルスクラッチでウィンドウを表示させるには単純に次の様に記述

```
#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
   	QApplication a(argc, argv);
	QWidget *window = new QWidget;
	window->show();

    return a.exec();
}
```

基本的にQWidgetクラスをインスタンスし`show()`メソッドを呼び出す事で、そのQWidgetがディスプレイに表示される

##画面遷移
ユーザーに表示する画面を切り替える際は、
QWidget->QFrameを継承した`QStackedWidget`を使う事で各種画面の切り替えが可能

```myview.h
class MyView : public QStackedWidget
{
public:
	MyView()
}

```

```
#include <QApplication>
#include <QWidget>
#include "myview.h"

int main(int argc, char *argv[])
{
   	QApplication a(argc, argv);
	MyView *p = MyView();
	p->show()

    return a.exec();
}
```
abc 070

B
Alice と Bob は、ロボットを制御するためのスイッチを1つずつ持っており、ロボットを動かしています。 
Alice はロボットを動かし始めて A 秒後にスイッチを押し始め、ロボットを動かし始めて B 秒後にスイッチを離しました。 
Bob はロボットを動かし始めて C 秒後にスイッチを押し始め、ロボットを動かし始めて D 秒後にスイッチを離しました。 
Alice と Bob が、二人ともスイッチを押していた秒数を求めてください。 

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int A, B, C, D;
	cin >> A >> B >> C >> D;
	if (B <= C) {
		cout << 0;
	}
	else if (D <= A) {
		cout << 0;
	}
	else if(A<=C&&D<=B){
		cout << D - C;
	}
	else if (C <= A && B <= D) {
		cout << B - A;
	}
	else {
		cout << abs(B - C);
	}
	return 0;
}
```
これで一問だけ通らなかった。うーん。。


解説

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int A, B, C, D;
	cin >> A >> B >> C >> D;
	int big = max(A, C);
	int small = min(B, D);
	int ans = small - big;
	cout << max(ans, 0) << endl;
	return 0;
}
```
シンプルで素敵

C
N 台の時計があり、i(1≦i≦N) 番目の時計の針はちょうど Ti 秒で時計盤を 1 周します。 
最初、全ての時計の針は真っ直ぐ上に向いており、止まっています。 
イルカは、全ての時計の針を同時に動かし始めました。 
再び、全ての時計の針が真っ直ぐ上に向くのは何秒後でしょうか? 

ab = gcd(a,b)lcm(a,b)
の利用。数学チックになってきた。

```
#include<iostream>
using namespace std;
using ll = long long;
ll gcd(ll a, ll b) {
	if (b == 0)
		return a;
	else
		return gcd(b, a%b);
}

ll lcm(ll a, ll b) {
	ll g = gcd(a, b);
	return a / g * b;
}

 
int main() {
	int N;
	cin >> N;
	ll ans = 1LL;
	ll T[110];
	for (int i = 0; i < N; ++i) {
		cin >> T[i];
		ans =lcm(ans, T[i]);
	}
	cout << ans << endl;
	return 0;
}
```
laravel インストール


参考
https://qiita.com/tosite0345/items/1e5bbeb33508abb1eaae

をやる。



ただビルトインサーバーとかいうのはよくわからん。
server.php を index.php に変更してアクセスすればビルトインサーバーを起動しなくても使えるので、そういうふうにやる。

```

console
$ cd /var/www/html/helpee.club/
$ ls
# ファイル一覧

server.php <-- これ。 これを index.php にリネームする。

app
artisan  # ビルトインサーバー起動ファイル
bootstrap
composer.json
composer.lock
config
database
gulpfile.js
package.json
phpspec.yml
phpunit.xml
public
readome.md
resources

storage
tests
vendor

# ビルトインサーバーを起動しなくてもいい
# php artisan serve --host 0.0.0.0


```


nginx の設定

```


server {
   listen 80;
   server_name helpee.club;

root   /var/www/html/helpee.club;

   location / {
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$query_string;
    }


location ~ \.php$ {
try_files      $uri =404;
fastcgi_pass   unix:/var/run/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;
}


rewrite ^ https://$server_name$request_uri? permanent;



}


server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;


    root   /var/www/html/xxxxxxx/public;

    ssl_certificate         /etc/letsencrypt/live/xxxxxxx/fullchain.pem;#ここをfullchain.pemに変更
    ssl_certificate_key     /etc/letsencrypt/live/xxxxxx/privkey.pem;

    ssl_session_timeout  10m;
    ssl_prefer_server_ciphers  on;
    ssl_ciphers  'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
    add_header  Strict-Transport-Security "max-age=31536000; includeSubdomains";


server_name helpee.club;





location ^~ /.well-known/acme-challenge/ {
root /var/www/html/acme/;
}

location = /.well-known/acme-challenge/ {
return 404;
}


location / {
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$query_string;
    }



location ~ \.php$ {
try_files      $uri =404;
fastcgi_pass   unix:/var/run/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;
}




location /gcp_storage/ {
    proxy_pass https://storage.googleapis.com/xxxxxxx/;
}






}


```
RuboCop is 何？


# RuboCopとは

Rubyの静的コード解析を実行するgemです。難しく聞こえますが、要はRuboCopが.rbファイルに記述してあるコードを検査し、ここのコードは長すぎるね。とか、インデント入れたほうがいいよ。とかメソッド名変えようか。とかをコマンド１つでターミナルに吐き出しててくれます。(HTML、CSS、またはそれらの中の埋め込みrubyは解析してくれません。)

ただ、RuboCopの警告全てが正しい訳ではなく、どちらかと言うとこうした方が良いよ的なものが多いので、厳しすぎるんじゃないかと思ったらデフォルトを変えたり、警告する/しないの設定をしてみてください。なので、プロジェクトごとに話し合って使い分けれればいいかなと思ってます。

# RuboCopの基本
###・ 準備

```ruby:Gmefile
group :development do
  gem 'rubocop', require: false
end
# or
$ gem install rubocop
```

###・ 関連ファイル

**.rubocop.yml**
RuboCopの設定ファイルです。対象となるファイルの種類だったり、チェックする構文のデフォルトを変えたりと,自分たちのコーディングスタイルに沿った現実的なルールをこのファイルで適用します。([RuboCopの設定アレコレ](https://qiita.com/necojackarc/items/8bc16092bbc69f17a16d)に詳しく書いてあるので参考にしてみてください。)

**.rubocop_todo.yml**
あまりに警告が多い時に**$ rubocop --auto-gen-config**を実行することによって自動生成され、警告内容を全てこのファイルに一旦退避することができます。それ以降は退避された警告は無視されます。(git stashみたいな感じ？)

###・ 基本コマンド 

```rb

$ rubocop
#　解析して結果をターミナルに吐き出す。

$ rubocop --help
# ヘルプを参照できます。

$ rubocop --lint( または rubocop --rails )
# チェック規則は以下の4つに分類されますが --lint がLintのみチェック、 --rails がRailsのみチェック
# -------------------------------------------------------------------------
# 1 Style   (スタイルについて)
# 2 Lint    (誤りである可能性が高い部分やbad practiceを指摘する)
# 3 Metrics (クラスの行数や1行の文字数などに関して)
# 4 Rails   (Rails特有のcop)

$ rubocop --auto-gen-config 
# .rubocop_todo.ymlに警告を一旦退避する。
# .rubocop.ymlに "inherit_from: .rubocop_todo.yml" と書くのを忘れないでください。

$ rubocop --auto-correct 
# 直せる箇所を自動で修正してくれます。(最初は使わないで警告されたコードを眺めてみることをお勧めします。)
```

# 警告内容
警告の種類はたくさんありますが、[Rubocopチートシート](https://qiita.com/kitaro_tn/items/abb881c098b3df3f9871)にしっかりとまとまっています。参考にしてみてください。

# 修正の流れ ⓪〜⑦
⓪　**$ rubocop --auto-correct**を実行して、自動で修正できるものはしてもらう。残りの警告がたくさんある場合は①へ。警告がそんなに多くない場合(10~20個とか)は③と④を繰り返す。
(Railsのコード規則を学ぶのにとても良い教材だと思うので初めは⓪を飛ばすことをお勧めします。)

①　警告がたくさんあると見ずらいので**$ rubocop --auto-gen-config**を実行し、.rubocop_todo.ymlを作成し、そこに全ての警告をいったん移す。(こうすることで**$ rubocop**を実行しても今の段階では全ての警告は無視されます。)

②　.rubocop_todo.yml内の警告の中から一番上の警告をコメントアウトする。(コメントアウトした警告だけが再びRuboCopに感知されるようになる)

③　**$ rubocop**を実行して警告を修正する。

④　警告のデフォルトを変更したり、特定のファイルを今後RuboCopに警告されないたくないという場合は, .rubocop.ymlに設定を書く。

⑤　修正し終わったら.rubocop_todo.ymlに戻り、コメントアウトした警告を削除する。

⑥　.rubocop_todo.yml内全ての警告を修正し終わるまで②~⑤を繰り返す。

⑦　テストがある場合はテストを走らせる。

# RuboCopの存在いつも忘れる問題
RuboCopは便利ですが、いつも実行し忘れしまい警告がたまってしまいます。

後々大量の警告を一度に修正するのは面倒なので、**git commit**実行時に自動でコーディングチェックしてもらいましょう。
きゃまなかのブログさんの[【Ruby on Rails】rubocop と pre-commit を利用して git commit 時にコーディングチェックを行う](http://techblog.kyamanak.com/entry/2018/06/19/221910)に詳しいやり方が書いてあります。

# ありがとう、Rubocop
RuboCopは、日本語のコメントはダメだとか、1行にかける文字がかなり短かったりだとかいちいち厳しいですが、愛のあるlintツールです。なので、早く自分のコーディングスタイルを確立し、理想の.rubocop.ymlを作り上げていきましょう。他の方が自分の.rubocop.ymlを公開しているので参考にしてみてください。([僕の使っている .rubocop.yml · GitHub](https://gist.github.com/linyows/ace586b118f87291ed3e))
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141176/6f800d89-f6cf-b339-f32c-60d874f47c01.png)

# 最後に
こんなお悩みありませんか？
・会社や学校に通いながら学びたい...
・対面でプログラミングについて相談したい…
・値段が高過ぎて通えない…

そんなあなたに「Pikawakaクラス」
・良心的でリーズナブルな価格
・安心の少人数制
・渋谷からスグの良アクセス
働きながら、効率的にプログラミングスキルを身につけて 即戦力に！今なら20名様限定！10万円相当の入学金が無料！

2024年6月から第3期生募集中!

まずは無料相談へ
「入会してみたいけど、ついていけるか不安」「どんなキャリアを描けば良いんだろう…」
そんな方の相談を受け付けております。
https://pikawaka.com/lp
メモ：Dataflowのチュートリアルに出てくるmvnコマンドのオプションの意味

# 概要
DataflowのチュートリアルでMavenを使っているが、そのオプションの意味がわからなかったので調べた。


# mvnコマンドとそのオプション

https://cloud.google.com/dataflow/docs/quickstarts/quickstart-java-maven?hl=ja#wordcount-

```
$ mvn archetype:generate \　　　　                # 新プロジェクトを作成
      -DarchetypeGroupId=org.apache.beam \　　　　# archtype（テンプレート）のグループID
      -DarchetypeArtifactId=beam-sdks-java-maven-archetypes-examples \    # archtype(テンプレートのID)
      -DarchetypeVersion=2.6.0 \            # archtype(テンプレート)のバージョン
      -DgroupId=org.example \               # プロジェクトのルートパッケージ名. ドメインを逆にしたものが使われる
      -DartifactId=word-count-beam \        # 一般にプロジェクト名が使われる（生成されるディレクトリ名になる）
      -Dversion="0.1" \                     # プログラム（？）のバージョン
      -Dpackage=org.apache.beam.examples \　　　　# ソースコードのディレクトリ（パッケージ？）指定しないとgroupIdが使われる
      -DinteractiveMode=false
```

# 資料

 * http://maven.apache.org/archetype/maven-archetype-plugin/
 * http://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html
QiitaのAPIv2を使用して自身の記事取得

##はじめに

現在自身の簡易的なホームページ的な物を作成してまして、そこで自身のQiitaの記事を載せたいなーと思い、取り掛かったのですが、初めてAPIを触るという事でチンプンカンプンでして、どうなる事やらと思ったのですが、なんとか取得できましたので、記載したいと思います。

QiitaのAPIv2に関しましては、下記を参考にして下さい。
[参考]
https://qiita.com/api/v2/docs

認証を用いて取得する場合と、認証を用いらず取得する場合があるのですが、認証を用いらず取得する場合は、公開された記事のみを取得する形となりまして、もし限定公開の記事がある場合、取得できません。

`認証`というのは、`本人しか知り得ない情報を使用して、本人であるという事を証明する事`だと解釈しています。

実際にクライアントとサーバー間の認証までの流れをざっくり話しますと、
 1. クライアントからサーバに認証情報を渡す
2. サーバで認証情報を検証して、Access Token を発行
3. クライアントは API Call で Access Token を利用
4. サーバは Access Token を検証して、API のレスポンスを返す
という流れになります。

で、今回でいう`本人しか知り得ない情報`というのが、`アクセストークン`になりまして、自身のアカウントの`設定`から`アプリケーション`を選択しますと、`新しくトークンを発行する`というのがありますので、そちらでアクセストークンを発行して下さい。
<img width="1439" alt="スクリーンショット_2018-10-08_0_12_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/267738/a616ebe1-041b-99cb-2e80-4cc0779cec40.png">


という事で、認証を用いて自身の記事を取得するまでを記載致します。


##記事取得


まずはターミナル上で`curlコマンド`を使用して、自身の記事を取得してみます。
コードに落とし込むのはその後になります。

```
$ curl -X GET "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=10" -H "Content-Type: application/json" -H "Authorization: Bearer [自身のアクセストークン]"
```

こちらを叩きまして、取得してみて下さい。
ちなみにこのコマンドでは、`per_page=10`としてますので、最新の記事10件を取得する事になります。
`per_page`は取得件数ですので、仮に10件以上の記事を投稿している方は、この値を変更すれば、取得できる件数も変えられるという事になりますが、ここでは`自身の記事が取得できるかどうか`が大事ですので、これでいいかと思われます。

curlコマンドについてはこちらを参考にしてみて下さい。
[参考]
https://qiita.com/yasuhiroki/items/a569d3371a66e365316f


取得できましたら、コードに落とし込んでいきましょう。
今回私はPHPの`cURL関数`を使用して書いていきます。

```php
// curlの初期化
$ch = curl_init();
// 使用するURL
$url = "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=10";
// curlのオプション設定
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HTTPHEADER => array(
        // データの形式、文字コード記載
        'Content-Type: application/json; charser=UTF-8',
        // 自身のアクセストークン
        'Authorization: Bearer ' . "[自身のアクセストークン]"
    ),
    // 返り値を文字列で取得
    CURLOPT_RETURNTRANSFER => true,
    // HTTPメソッド指定
    CURLOPT_CUSTOMREQUEST => 'GET',
);
// 複数のオプションを設定
curl_setopt_array($ch, $options);
// curlの実行
$json = curl_exec($ch);
// curlを閉じる
curl_close($ch);
// json文字列をデコード
$data = json_decode($json);
```

上記のコードがcurlコマンドからcURL関数に置き換えて書いたコードになります。
`cURL関数`がよくわからなかった為、非常に時間がかかりました。

先ほど`per_page`について触れましたが、コードに落とし込んだ際は、各個人の取得したい件数によって変更してみて下さい。


`cURL関数`に関しましては、こちらを参考にしてみて下さい。
[参考]
http://php.net/manual/ja/ref.curl.php


##まとめ

考えた割にはコードは短かったです。
まだAPIについては理解しきっていませんので、勉強が必要かと思いますが、何より`取得できた`という事に喜びを感じました。
プログラミング楽しいなー
是非実践してみて下さい！！

##おまけ
Twitterやってます！外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います！[@Tatsuo96](https://twitter.com/Tatsuo96)
p.s.今年の2月までは溶接職人でした。ガッツ系エンジニアとしてやらせて頂いております。
Webエンジニアの種類　4パターン

Web業界で3年。色々な性格のエンジニアがいましたが、大別すると4つになると思います。
ざっとまとめました。


# Webエンジニアの種類 4パターン
## アイデアマン型 ##
- 技術うんぬんよりも、機能やサービスの内容を気にする
- このWebサービスいいよね！　こんな機能があったらいいよね！みたいな話をする
- アイデア豊富、ネットのネタ（主にTwitter）に敏感
- 人当たりが良い
- ベンチャー向き。受託会社だとストレスが溜まりやすいかもしれない


## サラリーマン型 ##
- そんなに技術的な話をするわけでもない
- 勤怠が悪いわけでもない。ルーズでもない
- 品質も悪くない。
- 計算できる確実な戦力


## 学者型 ##
- とにかくC言語を学べと言う
- 知識が豊富
- 読書量が半端ない
- 話が長い、止まらない

## 芸術家型 ##
- エディタ、コーディングなど細かいところに色々なこだわりがある
- 納得いかないと動かない
- 頑固だが味方になると心強い
- 気分の上下が激しい

# まとめ #
また思いついたら追記します。


-
機械学習を Azure, Python で始めるときのリンク集

## Azure Machine Learning関連のリンク
* **[基礎]**：[初心者向けデータ サイエンス ビデオ（全5本 約30分）\| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/data-science-for-beginners-the-5-questions-data-science-answers)
  - 動画は英語で字幕はないが、Webページのトランスクリプトに日本語訳が掲載されている。

* **[基礎]**：[機械学習チュートリアル: Azure Machine Learning Studio で初めてのデータ サイエンス実験を作成する \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/create-experiment)

* **[基礎]**：[Machine Learning Web サービスをデプロイする \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/publish-a-machine-learning-web-service)

* **[応用]**：[信用リスク評価のための予測分析ソリューションを Machine Learning で開発する \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/walkthrough-develop-predictive-solution)

* **[応用:英語]**: [故障検知| Azure AI Gallery](https://gallery.azure.ai/Experiment/df7c518dcba7407fb855377339d6589f)
  - 故障検知に関する機械学習のテンプレート
  - Regression: 残り耐用期間, 故障までの時間の予測
  - Binary classification: 一定のタイムフレーム（例：1日以内）に故障するかどうかの予測
  - Multi-class classification: 複数の別々のタイムウィンドウのどこで故障するかの予測（例：1〜w0 日、w0+1 〜 w1 日, w1 日以内には故障しない）
* **[応用:英語]**: [販売予測| Azure AI Gallery](https://gallery.azure.ai/Experiment/8d1587b63ec54d03ae1276c513ab72f6)
* **[応用:英語]**: [Regression: 需要見積り| Azure AI Gallery](https://gallery.azure.ai/Experiment/d92ab449519a46be9b8f31776c1e638b)

## Python関連のリンク
* **[基礎]**：[Pythonで始める機械学習入門 \- ＠IT](http://www.atmarkit.co.jp/ait/series/4424/)
  - `第２回`でJupyter Notebookの使い方を覚える
  - `第７回`でJupyter Notebook上でpythonのscikit-learnを使っていくつかの機械学習を試す
  - Jupyter NotebookはAnacondaを使ってローカルにインストールするか、Azure Machine Learning Studioでも利用可能

## 各種チャート
* [Choosing the right estimator — scikit\-learn 0\.20\.0 documentation](http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html)

* [Machine Learning Studio 機能の概要図 \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/studio-overview-diagram#download-the-machine-learning-studio-overview-diagram)

* [機械学習アルゴリズム チート シート \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/algorithm-cheat-sheet)
黒目の中心を求めるとき、細目でも使える方法

視線追跡は、赤外線の目による反射を使って角膜の曲率中心を求める方法が長く主流でした。これは、1度くらいまでの高精度な推定が得られるという利点があり、一方、1mくらいまでの距離での撮影と使い方が限定され、外界だと赤外線ノイズに邪魔されるという欠点があります。

一方で、赤外線を使わずに、外見だけで視線を求める流れもありました。これは、カメラから被写体までの距離制約が小さく、利用シナリオが多いという利点があり、一方、得られる精度がチャレンジという欠点があります。

後者で、ニューラルネットで目の外見と視線を直接対応学習させる流れもありますが、学習データの整備という問題があります。

一方、後者の外見から攻めるアプローチには、眼球モデルを設定し、他方で黒目（虹彩）の中心をとらえ、視線を計算する方法もあります。そのとき、黒目の中心を求める方法として、以下のような方法がありました。

１．黒目あるいは瞳の境界を検出して、楕円で近似し、楕円のゆがみを踏まえて、法線を求める。
２．黒目の中心を求めて、他方で眼球中心の推定を行い、両者から視線を求める。黒目の中心は、
２－１．黒目(虹彩）の境界や瞳の境界が円形であることを利用して、観察された複数の円形から中心を推定する。
２－２．明暗のGradientに注目し、Gradientベクトルの方向に無限長の線を引いて、線の密度のもっとも濃い点を、黒目の中心とする。

ところが、以上のような、これまでに公開された有名な方法を見ると、どうも、どれも、黒目が明確に見えていることが前提ですね。実用までケアしないリサーチなら構わないかもしれないが、これじゃ、実際、だめじゃん。東洋人の細目だと、黒目あるいは瞳の円・楕円の一部は瞼で隠れていることが多い。そのため、既存の有名な方法はどれも使えません。

しかし、２－２の方法を少し変形して、Gradientの負の方向（白目の明るいほうから黒目の暗いほう）に虹彩の直径（~半径）の生体的統計（虹彩の大きさはかなり一定であることが知られている）の長さ程度の線を引き、その密度の中心を求めます。その変形だと細目でも、横方向のGradientが効いて、いい感じで黒目の中心が得られます。

特許出願のクレームの一つにするか迷った末に、小粒なテクなので、実施形態で明示するにとどめました。が、黒目中心を検出する方法として、東洋人の目でも安定して有効です。以下にPythonコードを載せます。似たようなことを目指している方のために、ここに残しておきます。ご自由にご利用ください。

```py

    ...
    gvcnt = get_gvLines(img, mask)
    maxIdx = np.unravel_index(gvcnt.argmax(), gvcnt.shape)
    ...
def get_gvLines(img, mask):
    # variant of Kothari and Mitchell method, 
    # in "ACCURATE EYE CENTRE LOCALISATION BY MEANS OF GRADIENTS"
    GRADIENT_MIN = 100
    GRADIENT_MAX = 9999
    h, w = img.shape[:2]
    img_pyr = cv2.pyrDown(img)　#結構、重いので画像を1/4へスケールダウン
    mask_pyr = cv2.pyrDown(mask)　#まぶたや目頭、目尻からのノイズを避けるため、できるだけ検査領域をしぼりこんでおくためのマスク
    h, w = img_pyr.shape[:2]
    gx = cv2.Sobel(img_pyr, cv2.CV_32FC1, 1, 0)  # x derivative
    gy = cv2.Sobel(img_pyr, cv2.CV_32FC1, 0, 1)  # y derivative
    gvcnt = np.zeros((h, w), dtype=np.uint8)  # count points with black background
    for i, value in np.ndenumerate(mask_pyr):
        v = np.array([gx[i], gy[i]])
        n = np.linalg.norm(v)
        if mask_pyr[i] == 0:
            if GRADIENT_MIN < n < GRADIENT_MAX:
                v = (v / n) * IRIS_SIZE_IN_PIXELS / 2
                pstart = (int(i[1] - v[0] * 0.3), int(i[0] - v[1] * 0.3))
                pend = (int(i[1] - v[0] * 0.6), int(i[0] - v[1] * 0.6))
                # About Bresenham class:
                # Pypedia version (bresenham.py) is slow but accurate
                # Python package version https://pypi.python.org/pypi/bresenham/0.1 is 
                # super fast. But it is inaccurate or requires other parameters
                line = bresenham.bresenhamline(np.array([pstart]), np.array([pend]), 2)
                for l in line:
                    if l[1] < h and l[0] < w: gvcnt[l[1], l[0]] += 1
    return cv2.pyrUp(gvcnt)
```
[2021/02/25追加]なお、このコードで、bresenhamを使っているところ、OpenCVのGrayScale Imageの全pixelが0のやつにに、線を重ね書きしていくやり方のほうがSimpleです。OpenCVの線引きも、結局、Bresenhamのアルゴリズムを使っていると思うので。
CloudFormationを使ってSystems Managerのパラメータストアの値を登録し、取得する

#はじめに
本記事では、AWS CloudFormationを使って、Systems Managerのパラメータストアの値を登録し、取得する手順を説明しています。（初心者向け）

本記事で掲載しているテンプレートの最新版は、下記に置いてます。
https://github.com/okubo-t/aws-cloudformation
#Systems Manager パラメータストアとは
Key/Value形式のパラメータを、AWSで集中管理する機能です。
####参考
[AWS Systems Manager パラメータストア]
(https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-paramstore.html)

#Systems Managerのパラメータストアに値を登録する
###Stringタイプのパラメータを登録する
####参考
[Using AWS Systems Manager Parameter Store Secure String parameters in AWS CloudFormation templates]
(https://aws.amazon.com/jp/blogs/mt/using-aws-systems-manager-parameter-store-secure-string-parameters-in-aws-cloudformation-templates/)

CloudFormationを使ってSystems Managerのパラメータストアの<font color="Red">String</font>タイプのパラメータを登録する場合のスタックのサンプルテンプレート

```ssm-sample-parm-01.yml
AWSTemplateFormatVersion: "2010-09-09"
Description:
  SSM Parameter Create

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  MasterUserName:
    Type: String
    NoEcho: true
    MinLength: 1
    MaxLength: 16
    AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*"
    ConstraintDescription: "must begin with a letter and contain only alphanumeric characters."

# ------------------------------------------------------------#
#  SSM Parameter
# ------------------------------------------------------------#
Resources:
  Parameter:
    Type: "AWS::SSM::Parameter"
    Properties:
      Name: "MasterUsername"
      Type: "String"
      Value: !Ref MasterUserName
      Description: "MasterUsername for RDS"
```

AWS CLIを使って登録する場合のサンプルコマンド

```
aws ssm put-parameter --name MasterUsername --type String --value "MasterUsername"
```

###Secure Stringタイプのパラメータを登録する
CloudFormationを使ってSystems Managerのパラメータストアの<font color="Red">Secure String</font>タイプのパラメータの登録は、まだサポートされていません。（2018/10/6時点）

AWS CLIを使って登録する場合のサンプルコマンド

```
aws ssm put-parameter --name MasterUserPassword --type SecureString --value "MasterUserPassword"
```

## Systems Managerのパラメータストアの値を取得する
ここでは、動的参照の機能を使用して、パラメータストアの値を取得します。

参考：
[Using Dynamic References to Specify Template Values]
(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html)

スタックテンプレートに指定するパラメータの動的参照は、次のパターンに従って設定します。

###ssm動的参照の場合
```
{{resolve:ssm:parameter-name:version}}
```

###ssm-secure動的参照の場合

```
{{resolve:ssm-secure:parameter-name:version}}
```
<font color="Red">※パラメータ名では大文字と小文字は区別されます。</font>

スタックテンプレートには、下記のように組み込みます。

```YAML
Resources:
  DBInstance:
    Type: "AWS::RDS::DBInstance"
    Properties: 

      MasterUsername: "{{resolve:ssm:MasterUsername:1}}"
      MasterUserPassword:  "{{resolve:ssm-secure:MasterUserPassword:1}}"

      DBInstanceIdentifier: !Ref DBInstanceIdentifier
      Engine: MySQL
      EngineVersion: 5.7
      DBInstanceClass: !Ref DBInstanceClass
      AllocatedStorage: 100
      StorageType: gp2
      DBName: !Ref DBName

## 以下 省略
```
初心者がする「初めてのlaravel」＊homesteadで環境構築するの巻（その一）

最近何かと話題の「入江開発室」で立ち上がった「初心者向けプログラミング学習支援」に参加してLalavelの環境構築が整ったのでその手順をメモ。

参加した全員がwindowsでしかもhome editionなのでdockerは建てられず、homesteadを選択。

**【手順1】**下記をインストール

1. git, https://git-scm.com/downloads
2. virtualbox, https://www.virtualbox.org/
3. vargrant, https://www.vagrantup.com/downloads.html

サイトの「download」にある「windows」の32bit、64bitを自分のPCの型を調べて選択してください。
詳しい内容はそれぞれ検索してください（何度調べてもよくわからない・・・）

**【手順2】**コマンドプロンプト

- Cドライブまで移動: `\c`もしくは`C:\`と打つと移動できます（移動するのはインストールした「vagrant」のあるフォルダ名（HashiCorp）がCドライブ直下にあるためです）。

- `vagrant box add laravel/homestead`
と入力して、virtual boxを選択します（選択肢が出ます）。

- `cd %USERPROFILE%`
でホームディレクリに移動して（%USERPROFILE%で「C:\Users\[useraccount]\」に戻れます、もしくは自力で戻ってください）下記を打ち込んでください。
```git clone https://github.com/laravel/homestead.git Homestead```

- 完了したら「エクスプローラー」から「ローカルディスク」→「ユーザー」→「アカウント名」→「homestead」があるか確認。

- コマンドプロンプトからhomesteadに移動して「init.bat」と打ち込んで、「Homestead initialized!」と表示されたら完了です。


（追記）
同じメンティさんにcloneに７時間もかかると表示されることもありました。気長に待ちましょう。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/137730/27e8ccbb-a22b-b2dd-78ff-bc03d3c9b548.png)

hiroroさん、ありがとう。
abc 069

B
internationalization という英単語は、i18n と略されることがあります。 これは、先頭文字 i と末尾文字 n の間に 18 文字が挟まっていることに由来します。
長さ 3 以上の英小文字のみからなる文字列 s が与えられます。 同様の規則によって s を略してください。

```
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main() {
	string S;
	cin >> S;
	cout << S[0] << S.size() - 2 << S[S.size() - 1] << endl;
	return 0;
}
```

C
長さ N の数列 a=(a1,a2,…,aN) があります。 各 ai は正の整数です。
すぬけ君の目標は、a の要素を自由に並べ替え、次の条件が成り立つようにすることです。
各 1≤i≤N−1 について、ai と ai+1 の積は 4 の倍数である。
すぬけ君が目標を達成できるか判定してください。

この例を見ると，
ひと繋がりの 2 ⃝は単体の 1 ⃝ と等価であることが分かります． 1 ⃝ はできるだけ少ない方が嬉しいので， 2 ⃝ はすべてまとめてひと繋がりにするのが最適です．←kasikoi

```#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N;
	int a[100010];
	cin >> N;
	int countone = 0, countfour = 0;
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
		if (a[i] % 4 == 0)countfour++;
		else if (a[i] % 2 != 0)countone++;
	}
	if (countfour + countone != N)countone++;
	if (countone > countfour + 1) {
		cout << "No" << endl;
	}
	else {
		cout << "Yes" << endl;
	}
	return 0;
}

```
PHPerがRuby on Railsを学んで気が付いたこと


3年目PHPerがRubyを学んでみたので、学習メモと感想を載せる

# PHPerがRubyを学んだ

## Rubyを学ぶ動機
3年目で業務も最近マンネリ化しつつあるので、刺激が欲しくて。初心に帰る意味で
~~遊ぶ金欲しさで~~
~~むしゃくしゃして~~

## 学習した内容
dot install のRuby講座, Ruby on Rails講座


## 感想 ##
### Rubyの感想 ###
1.第一印象はドットでつなげる感じとか, JavaとかJavaScriptっぽいな
2.配列にマイナス使えるのか、配列操作が簡単そう
3.繰り返しが独特。times使いやすそう
5.try catch throw じゃなくて、begin end raiseなの面白い 

### Railsの感想 ###
1.sqliteが標準なのね。
2.scaffoldスゴイ。こんなにサクッと出来るなんて！
3.サンプルどおりなのにJSのエラーで詰まったが、解決した。

### 気が付いたこと ###
1.全く知らなかった技術に触るのは面白い
2.過去の経験があると、全く知らない言語でも問題解決が早い
3.作ったものが動くと面白い
4.一つのことを深く、というよりは広く浅くやるほうが好きらしい
5.自分は技術に興味が無いエンジニアだと思っていたが、案外そうでもなかった。仕事が上手く行ってないためエンジニアリングへの興味が薄れていただけだった。

### 今後、やっていくこと ###
1.なんとなく気分が落ち込んだとき、モチベーションが下がったときは、全く触れたことのない、触れる機会のない技術に触れてみる
2.定期的に初心に帰ろう。
3.もっと自由でいいじゃないか。仕事じゃないんだし。
abc 068

B
高橋君は 2 で割れる数が好きです。
正整数 N が与えられるので、1 以上 N 以下の整数のうち、最も 2 で割れる回数が多いものを求めてください。答えは必ず 1 つに定まります。
なお、2 で割っていき、何回あまりが出ずに割れるかを、2 で割れる回数と呼ぶことにします。
例えば
6 ならば、6 -> 3で、1 回 2 で割れます。
8 ならば、8 -> 4 -> 2 -> 1で、3 回 2 で割れます。
3 ならば、0 回 2 で割れます。

これは書かなくていいや

C
高橋キングダムには、高橋諸島という、N 個の島からなる諸島があります。 便宜上、これらの島を島 1、島 2、 ...、島 N と呼ぶことにします。
これらの諸島の間では、船の定期便が M 種類運行されています。 定期便はそれぞれ 2 つの島の間を行き来しており、i 種類目の定期便を使うと、 島 ai と島 bi の間を行き来する事ができます。
すぬけくんは今島 1 にいて、島 N に行きたいと思っています。 しかし、島 1 から島 N への定期便は存在しないことがわかりました。 なので、定期便を 2 つ使うことで、島 N に行けるか調べたいと思っています。
これを代わりに調べてあげてください。

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N, M;
	cin >> N >> M;
	vector<bool>S(N + 1, false), E(N + 1, false);
	bool ans = false;
	for (int i = 0; i < M; ++i) {
		int a, b;
		cin >> a >> b;
		if (a == 1) {
			S[b] = true;
		}
		if (b == N) {
			E[a] = true;
		}
	}
	for (int i = 0; i < N+1; ++i) {
		if (S[i] && E[i]) {
			ans = true;
		}
	}
	if (!ans)cout << "IM";
	cout << "POSSIBLE" << endl;
	return 0;
}
```
abc 067

B
すぬけくんは N 本の棒を持っています。 i 番目の棒の長さは li です。
すぬけくんは K 本の棒を選んでつなげて、ヘビのおもちゃを作りたいです。
ヘビのおもちゃの長さは選んだ棒たちの長さの総和で表されます。 ヘビのおもちゃの長さとしてありうる長さのうち、最大値を求めなさい。


```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int N, K;
	cin >> N >> K;
	int l[51];
	for (int i = 0; i < N; ++i) {
		cin >> l[i];
	}
	sort(l, l + N, greater<int>());
	int sum = 0;
	for (int i = 0; i < K; ++i) {
		sum += l[i];
	}
	cout << sum << endl;
	return 0;
}
```
C
すぬけくんとアライグマは N 枚のカードの山を作りました。カードの山の上から i 番目のカードには整数 ai が書かれています。
N 枚のカードを分け合うことにしました。 すぬけくんがカードの山の上から何枚かのカードを取ったあと、アライグマは残ったカード全てを取ります。 このとき、すぬけくんもアライグマも 1 枚以上のカードを取る必要があります。
すぬけくんとアライグマが持っているカードに書かれた数の総和をそれぞれ x,y として、|x−y| を最小化したいです。 |x−y| としてありうる値の最小値を求めなさい。

```
#include<iostream>
#include<algorithm>
using ll = long long;
using namespace std;
int main() {
	int N;
	cin >> N;
	ll a[200001];
	ll sum = 0;
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
		sum += a[i];
	}
	ll sum1 = 0;
	ll sum2 = 0;
	ll ans = 1e10;
	for (int i = 0; i < N-1; ++i) {
		sum1 += a[i];
		sum2 = sum - sum1;
		ll sum3 = abs(sum2 - sum1);
		ans = min(ans, sum3);
	}
	cout << ans << endl;
	return 0;
}
```
Ruby on Railsのアップデート系メソッドまとめ

①update
　レコードを更新する。

②update_all
　条件に一致するレコードを更新する。

③update_attribute
　属性ハッシュを指定して更新する。データベースの1つのカラムを変更・保存するメソッド。

④update_attributes
　属性ハッシュを指定して更新する。データベースの値を複数変更・保存するメソッド。
bundle installとかの理解

#メモ書き

#bundle install
bundle installってgemfileに書いてあるものをインストールするのは、新しいgemが追加された時だけ。
bundle installは新しいgemをインストールしてgemfilelockに書き込む。

#実体はどこ？
何が実体化というと、インストールされたやつの一覧は***gemfilelock***に書かれている。
チーム開発の時に、みんながgemのバージョン違ったら困る。
そのバージョンを揃えるためにgemfilelockがある。
Gemfilelockに書いてあるバージョンを、みんなで共通して使いましょう。ってこと。


***Bundle update***はgemfilelockにあるバージョンをupdateすること。なのでチーム開発だと、bundle updateやると本番環境にも変わって検証必要なので、だめ。
ポスグレ設定メモ

ポスグレ設定のやり方を毎回忘れて毎回調べるのでメモ。

# とりあえずpostgresで入る
> sudo -u postgres psql;

# ロール（dev）を作る
> CREATE ROLE dev;
> ALTER ROLE dev LOGIN;
> ALTER ROLE dev PASSWORD 'password';

# データベースを作る
> CREATE DATABASE db_dev OWNER=dev;

# とりあえず出る
> \q

# 作ったロール（dev）で入る
> psql -h localhost -U dev db_dev

しかしpg_hba.confにこれがないと怒られる。
> host    all             all             127.0.0.1/32            md5
> host    all             all             ::1/128                 md5

pg_hba.confを書き換えたらリスタート。
> sudo /etc/init.d/postgresql restart
【cakePHP3.x】cakePHP3.x系のformHelperの使い方

webサイトをcakePHP3で組んでいた際、応募フォームを作る過程でformの作り方を調べていたら2系と3系とで作り方が変わっていた
かつ、CSSやJSとも連携させようとすると上手くできなかったので作り方をメモ

環境
virtualbox / centOS7 / nginx / php5.6
[公式ドキュメント](https://book.cakephp.org/3.0/ja/views/helpers/form.html)

# そもそもcakePHPのformHelperを使う意味
私は最初formHelperを使わずに自前でformタグ・inputタグを書いて、レイアウトまで整えていました
そのあと、セキュリティのこと考えないとなーと色々調べていたら、formHeplerを使うとCSRF対策のトークン関連の処理を内包してくれるとのことでした
自分でセキュリティ対策を0から組める自信がない方はformHelperを使うことをオススメします

# コード例
``` hogehoge.ctp
<?php echo $this->Html->css('hogehoge.css') ?>
<?php echo $this->Html->script('hogehoge.js') ?>

// CSSは割愛
<div id="contact_info">
    <?=$this->Form->create(null, ['url' => ['action' => 'submit', 'type' => 'post'], 'onsubmit' => 'return send()'])?>
        <div class="tr1 clear">
            <p class="th1">名前</p>
            <div class="td1">
                <?php echo $this->Form->input('name', ['label' => false, 'templates' => ['inputContainer' => '{{content}}']]); ?>
            </div>
        </div>

        <div class="tr1 clear">
            <p class="th1">備考</p>
            <div class="td1">
                <?php echo $this->Form->input('remarks', ['label' => false, 'type' => 'textarea', 'placeholder' => 'hogehoge' ,'templates' => ['inputContainer' => '{{content}}']]); ?>
            </div>
        </div>

        <div id="contact_submit">
            <?php echo $this->Form->submit('送信', ['label' => false, 'templates' => ['submitContainer' => '{{content}}']]); ?>
        </div>
    <?=$this->Form->end()?>
</div>
```
▼送信ボタンが押された時に未入力チェックを行うJS

``` hogehoge.js
function send() {
    name = document.getElementById('name').value;

    if (name === '') {
        alert('名前が入力されていません');
        return false;
    }
}
```

# 結果
<img width="1000" alt="スクリーンショット 2018-10-07 20.19.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/298813/e66c72db-59d9-6b25-8b46-465b7164d4ce.png">

# 個別の関数説明
▼ $this->Form->create
第2引数($options)で色々な設定を登録できます

| キー       | 説明 |
|:----------|:-------|
| url       | action : submit時のアクション名(関数名)<br>type : [post / get] 通信種別|
| onsubmit  | submit時にJSを挟む<br>関数からfalseがreturnされた場合、submitがキャンセルされる |

▼ $this->Form->input
第1引数はコントローラで受け取る際の名前を指定する
第2引数($options)で色々な設定を登録できます

| キー       | 説明 |
|:----------|:-------|
|label|input領域の左側に表示させる語句<br>falseで非表示|
|type       |未入力で通常のinputタグ<br>textareaやradioなども指定可能|
|placeholder|placeholderの設定が可能|
|templates|何も指定しない場合、inputタグがdivタグで括られる<br>回避策は2つ<br>1.'templates' => ['XXXContainer' => '{{content}}']と指定する<br>2.プロジェクト名/vender/cakephp/cakephp/src/View/Helper/FormHelper.phpの$_defaultConfig変数内のtemplateを書き換える|

▼ $this->Form->submit
第1引数はボタン内に表示させる文字
第2引数はinputと同じ

# 備考
他にも色々な設定が可能です
公式ドキュメントやソースを見てみてください
migrationファイル内のnull: falseとは

#migrationファイル内のnull: falseって何？

これを入れておくと、指定したカラムに空の状態で保存させるのを防ぎます。

```
class CreateMessages < ActiveRecord::Migration[5.0]
  def change
    create_table :messages do |t|
      t.references :user, foreign_key: true
      t.string :content, null: false　　　←ここ
      t.string :title, null: false　　　　　　　←ここ

      t.timestamps
    end
  end
end
```

モデルファイルに下記のようにバリーデーションするだけの場合、
```validates :content, presence: true```

これのみだと、Rails側で保存させないだけなので、ブラウザ上では入力できませんが、
SQLから実行すると値は保存できてしまいます。

なのでモデルに```presence: true```などでバリデーションかける場合は、マイグレーションファイルに```null: false```を指定置くと安心です。
個人で開発期間1日のアプリが結構ダウンロードされた話

# はじめに
Qiita初投稿です。
業務でiOSアプリの開発をしてる傍ら、個人でもアプリ開発をしてリリースしています。

自分の個人開発の主な目的は、勉強と副収入です。
今までは、作ってリリースして自己完結型で終わりだったのですが、最近記事を書くことによって、作って得たものを共有することのメリットを感じるようになりました。

何本かiOS・Androidのアプリをリリースしているのですが、一番書きやすそうなアプリをネタにして、試しにダウンロード数や収益を公開してみようと思います。

# 紹介するアプリ
今回紹介したいアプリは恵方巻きアプリです。
2018年1月18日にリリースしたiOSアプリです。

アプリはこちら↓
[恵方巻コンパス 2018](https://itunes.apple.com/jp/app/%E6%81%B5%E6%96%B9%E5%B7%BB%E3%82%B3%E3%83%B3%E3%83%91%E3%82%B9-2018/id1335336786?mt=8)

## なぜ作ったか
去年の恵方巻きの日にapp storeのランキングをみた事がキッカケです。
ご存知の方も多いかもしれませんが、恵方巻きの日だけコンパスアプリが物凄くダウンロードされます。コンビニやスーパーで売っている太巻の食べる方角を皆知りたいからです。
またランキング上位の恵方巻き関連のアプリは大企業ではなく、個人が作ったアプリが多い事にも気づきました。恵方巻きの日だけダウンロードされるアプリをわざわざ企業は開発しないのだと思います。恵方巻きアプリの数自体も大量にあるわけでもないようでした。
いくつかランキング上位の恵方巻きアプリをダウンロードしてみたのですが、大体1画面で完結するコンパスアプリでした。
一年後に後追いで恵方巻きアプリをリリースしても、面白い結果を得られそうだと感じました。

## 開発
2017年の2月に作ろうと思い、実際に作り始めたのは2018年1月でした。。。
iOSでコンパスアプリの作り方は、検索すればたくさん出てくるので、実装方法に困る事は全く無かったです。後は今年の恵方を調べて設定するだけで機能は完成としました。

デザインは「いらすとや」さんのフリー画像を使わせていただき、それっぽく仕上げたつもりです。コンパスの向きが恵方の方角に来た時に、画像を変更しています。他のアプリを参考にしました。
開発期間は1日で、Appleの審査提出まで完了し、無事2018年1月中にリリースすることが出来ました。
クソアプリ感は否めませんでしたが。。。

### 実装内容
一応簡単にコンパスの実装内容を書いておきます。
iOSのCoreLocationを使用します。
viewDidLoad内で、CLLocationManagerのインスタンスを作成し、delegateを設定します。

```swift
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
    
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager = CLLocationManager()
        locationManager.delegate = self
    }
}
```

後は、方角が変わる度に、delegateメソッドのdidUpdateHeadingメソッドが呼ばれるので、ここでコンパスの位置を動かします。

```swift
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
    
}
```

参考
http://makesomethingue.hatenablog.com/entry/2018/10/02/013157
https://dev.classmethod.jp/smartphone/ios-corelocation-swift3/

## リリース後
リリース後はGoogle Analyticsを起動時にだけ仕込んでおいたので、ダウンロード数等はそれでチェックしていましたが、1日数ダウンロード程度でした。
恵方巻きの日(2月3日)が近づくにつれ、ダウンロード数も多少上がってきて、前日は1日で200ダウンロードを超えました。
そして、当日を迎えました。
午前中には1000ダウンロードを突破し、夜には更に加速し、1日で6000ダウンロードを超えました。
<img width="540" alt="スクリーンショット 2018-10-05 1.08.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/172962/f53b1fc4-dedf-9d5e-7acf-1c56bedbafe2.png">

## ランキング
app storeのランキングはどうなったかというと、恵方巻きの翌日には総合ランキングで62位まで上昇しました。
ちなみに他の恵方巻きアプリは1位や2位でしたが。。。
![IMG_3129.PNG](https://qiita-image-store.s3.amazonaws.com/0/172962/6650eb1c-4d87-77e9-d58f-d0cb8ad9818f.png)

## 収益
admobとnendの広告を貼っていたのですが、1日でトータル7000円程度でした。。。

# まとめ
個人でリリースしたアプリはプロモーションがうまくできないため、リリースしてもあまりダウンロードされないと言われています。ただ、企業が参入しないようなニッチなアプリについていえば、まだまだ可能性があるのかもしれません。
反省点としては完全にクソアプリでリリースしてしまった事です。もっと機能やデザインをちゃんと考えれば、もう少し良い結果になったのかなと思ってますので、来年は恵方巻きでAppStoreランキング１位を目指そうと思います！

# 最後に
アプリのソースを公開しました。
[GitHub](https://github.com/yakazu/EhoCompass)
Swift：リソースを含んだFrameworkを作成するときのTips

#はじめに
CSVのファイルを利用したオリジナルのFrameworkを作成する際に，リソースが読み込めない問題にぶつかった．
解決策を記述する

#Bad
```swift:
if let filePath = Bundle.main.path(forResource: "sample", ofType: "csv") {
    do {
        let str = try String(contentsOfFile: filePath, encoding: String.Encoding.utf8)
        //処理
    } catch let error {
        Swift.print(error.localizedDescription)
    }
}
```

#Good
```swift:
if let filePath = Bundle(for: type(of: self)).path(forResource: "sample", ofType: "csv") {
    do {
        let str = try String(contentsOfFile: filePath, encoding: String.Encoding.utf8)
        //処理
    } catch let error {
        Swift.print(error.localizedDescription)
    }
}
```

要は`Bundle.main`ではなく`Bundle(for: type(of: self))`を使えということらしい．
【Mac】iTerm2のMetaキー(メタキー)をEscからOption(Alt)に変更する方法

ターミナル上でのキーバインドはデフォルトではEmacsライクになっています。

そのため、ターミナル操作でキーバインドを扱う場合、CtrlキーとMetaキーを利用するわけですが、Mac環境ではデフォルトのMetaキーとしてEscキーしか設定されていません。

Macのターミナル、iTerm2においてOptionキーをMetaキーとして扱える方法を記載しておきます。

Preferencesを開き、以下の手順で設定を行います。

1. Profilesを選択
2. Keysを選択
3. Esc+を選択


![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/be1c7c16-ac58-8186-2922-6ef0ddb7d26e.png)

なお、ターミナルのキーバインドについては<a href="https://nishinatoshiharu.com/terminal-keybind/" target="_blank">『こちらの記事』</a>にまとめたので興味がある方はご覧になってください。

by <a href="https://twitter.com/nishina555" target="_blank" rel="noopener">@nishina555</a>
Git の branch とかが less になるのをやめたい

## どんな感じ？
いつのバージョンからかは忘れたけど、 git branch や git log をした時に、以下のようになるようになった。
![git-branch-less.gif](https://qiita-image-store.s3.amazonaws.com/0/71497/a1454f5b-e872-d84b-678e-30018f5093e4.gif)
ブランチをたくさん作らなかったり(作ってもマージ後削除したり)、log は件数を絞って表示するみたいな運用だと、ページャ機能は不要だなと思う。
たった1タイプだけど `q` 押すのが面倒です。
GUI? なにそれおいしいの？

## 設定
`--global` をつけることでマシン全体に適応することもできる。

### for log
個別: `git config pager.log cat`
全体: `git config --global pager.log cat`

### for branch
個別: `git config pager.branch cat`
全体: `git config --global pager.branch cat`

### for config
個別: `git config pager.config cat`
全体: `git config --global pager.config cat`

### for diff
個別: `git config pager.diff cat`
全体: `git config --global pager.diff cat`

## 戻し方
./git/config に [pager] という項目が増えているので、その下にあるそれぞれの行を削除する。
もしくは、上記コマンドで `cat` を `less` にする。
e.g.) `git config pager.branch less`

## 注意
運用が長く続くと log や branch で表示される行数が増えていくので、この設定をすることでえらいことになる場合もある。