OmniAICreator/Qiita-1.07M huggingface dataset:
ラグランジュの未定乗数法とは？

#目次
**1.ラグランジュの未定乗数法とは？**
**2.例題を通してプロセスを理解する**
**3.定義の確認**
**4.参考文献**
#1.ラグランジュの未定乗数法とは？
主成分分析の主成分を求める過程において、データの分散を主成分の分散に反映させるために、**主成分の分散を最大化**する際にラグランジュの未定乗数法を用いました。

ラグランジュの未定乗数法とは、**制約条件のもとで関数最大化**を行うための数学（解析学）的な方法です。SVMでも用いられる手法です。

**主成分の分散を最大化**するプロセスでは

```math
a_1^2+a_2^2=1
```
という制約条件を定めた上で未定乗数 $\lambda$

```math
f(a_1,a_2,\lambda)=a_1^2+a_2^2+2r_{x1x2}a_1a_2-\lambda(a_1^2+a_2^2-1)
```
とおき、$a_1$,$a_2$, $\lambda$を求めました。

#2.例題を通してプロセスを理解する
ラグランジュの未定乗数法を用いた関数最大化を簡単な例題を通じて確認してみましょう。

###例題
$x^2+y^2=1$ のもとで $f(x,y)=2x+3y$の最大値を求めよ。

###解答

```math
g(x,y)=x^2+y^2-1=0
```
とおき、$f(x), g(x)$ を用いて3変数のラグランジュ関数 $L$を作ります。

```math
L(x,y,\lambda)=2x+3y-\lambda(x^2+y^2-1)
```
それぞれの変数で偏微分すると、

```math
\begin{align}
\frac{\partial L}{\partial x}&=2-2x\lambda=0\\
\frac{\partial L}{\partial y}&=3-2y\lambda=0\\
\frac{\partial L}{\partial \lambda}&=-x^2-y^2+1=0
\end{align}
```
これら3変数の三元連立方程式を解けば解の候補が得られます。
上二本から $\lambda$を消去すると 

```math
x=\frac{2}{3}y
```
これと一番下の方程式を元に $x,y$を求めると、

```math
(x, y)=(±\frac{2}{\sqrt{13}},±\frac{3}{\sqrt{13}})\hspace{2cm}
```
この2つが $f(x,y)$の最大値を与える候補です。

実際に2組を $2x+3y$に代入してみると、プラスの方が最大値$\sqrt{13}$を与えます。ちなみにマイナスは最小値$-\sqrt{13}$を与えます。

#3.定義の確認
例題を通して、ラグランジュの未定乗数法のプロセスは確認できたので、一般化のために定義を確認しましょう。

###ラグランジュの未定乗数法
$g(x,y)=0$のもとで $f(x,y)$を**最大化**したいという**等式制約つき**の問題において
$L(x,y,\lambda)=f (x,y)-\lambda g(x,y)$を作ると
$(\alpha,\beta)$が極値を与える→$(\alpha,\beta)$は$\frac{\partial L}{\partial x}=\frac{\partial L}{\partial y}=\frac{\partial L}{\partial \lambda}=0$ の解。

最大値を求めたい関数が$n$次元の場合もラグランジュの未定乗数法は使えます。
![スクリーンショット 2019-04-24 17.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296645/1b2b67f6-cd3b-7106-d10f-9a1b54c98a9f.png)

#4.参考文献
[ラグランジュの未定乗数法の解説と直感的な証明](https://www.yunabe.jp/docs/lagrange_multiplier.html)
[ラグランジュの未定乗数法と例題](https://mathtrain.jp/mlm)
[ラグランジュの未定乗数法](https://ja.wikipedia.org/wiki/ラグランジュの未定乗数法)
JUnit 5: テストケースをenumで記述する方法

JUnit 5では**[@ParameterizedTest]**アノテーションが用意されていて、様々な引数ソースから得られる値をテストメソッドに引数として渡すことができます。この記事では、こうした引数ソースの一つである**[@EnumSource]**を活用して、多くのテストケースを手軽に記述する方法を紹介したいと思います。

## 準備

**[@ParameterizedTest]**を使用する場合は、プロジェクトの依存ファイルとして`junit-jupiter-engine`に加えて`junit-jupiter-params`も明示的に追加する必要があります。また、今回のサンプルコードでは、テスト結果の検証に[AssertJ](https://joel-costigliola.github.io/assertj/)を使いました。

**pom.xml**

```xml
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.5.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.5.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.13.1</version>
    <scope>test</scope>
</dependency>
```

## テストの対象
ここでは、JDKの`BigInteger#gcd()`メソッドをテストの対象とします。このメソッドは、自身と与えられた引数の最大公約数を返します。

## テストケースを書く

入力値2つと正しい答えの組み合わせをenum型の定数としてひたすら記述しましょう。

```java
enum GcdTestCase {
    THIS_IS_BIGGER(25, 10, 5),
    OTHER_IS_BIGGER(14, 21, 7),
    BOTH_ARE_EVEN(12, 8, 4),
    BOTH_ARE_ODD(27, 45, 9),
    BOTH_ARE_ZERO(0, 0, 0),
    BOTH_ARE_ONE(1, 1, 1),
    THIS_IS_ZERO(0, 3, 3),
    OTHER_IS_ZERO(4, 0, 4),
    THIS_IS_DIVISOR(3, 12, 3),
    OTHER_IS_DIVISOR(20, 4, 4),
    NO_COMMON_DIVISOR(7, 9, 1);

    final BigInteger a;
    final BigInteger b;
    final BigInteger expected;

    GcdTestCase(long a, long b, long expected) {
        this.a = BigInteger.valueOf(a);
        this.b = BigInteger.valueOf(b);
        this.expected = BigInteger.valueOf(expected);
    }
}
```
とりあえず11個のテストケースを作成しましたが、後からテストケースを追加するのは比較的容易ですよね。列挙子を増やすだけです。

## テストメソッドを書く

テストメソッドには**[@ParameterizedTest]**アノテーションを指定しますが、同時に**[@EnumSource]**アノテーションを使って上で作成したenum型を指定します。

```java
@ParameterizedTest
@EnumSource(GcdTestCase.class)
public void gcdShouldReturnGreatestCommonDivisorAsExpected(GcdTestCase test) {
    BigInteger actual = test.a.gcd(test.b);
    assertThat(actual).isEqualTo(test.expected);
}
```

## テストを実行する
作成したテストを`mvn test`で実行すると、当然ですが、すべてのテストが成功します。

```
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.example.junit5.tips.BigIntegerTest
[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.156 s - in org.example.junit5.tips.BigIntegerTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0
```

## まとめ
今回はJUnit 5の**[@EnumSource]**を利用して多くのテストケースを手軽に記述する方法を紹介しました。
サンプルコードは[GitHub](https://github.com/leadpony/junit5-tips/tree/master/enum-source)に上げてあります。ライセンスは[The Unlicense](https://unlicense.org/)です。

[@ParameterizedTest]: https://junit.org/junit5/docs/current/api/org/junit/jupiter/params/ParameterizedTest.html
[@EnumSource]: https://junit.org/junit5/docs/current/api/org/junit/jupiter/params/provider/EnumSource.html
Pythonでソートアルゴリズムの再発明をしてみる: クイックソート

# 概要
* Pythonでソートアルゴリズムを再発明してみるだけ
* 今回はクイックソートについて
* 参考サイトのサンプルコードをできるだけ見ずに実装する
* とりあえず昇順ソートのみの対応とする

# クイックソートの概要
* 条件が良ければとても速い
* 条件が悪いとかなり遅くなってしまう
* 不安定ソート

## 基本的な手順
※やり方はいろいろありますが、関数型っぽいやり方のほうがわかりやすいと思います
1. 軸（ピボット）となる要素をリストから一つ取り出す
2. ピボットより小さい値を集めたリストと、ピボットより大きい値を集めたリストを作成する
3. 上記2つのリストを引数として関数を再帰呼び出しして、戻り値を連結して返す

# ソース
```python
import random

def quick_sort(lst):
    # 再帰呼び出しの終了条件
    if len(lst) == 0:
        return []
    
    # ピボットとなる値を読み込む
    # ピボットはリストの中央値が望ましいらしいが、ここでは手抜きのため先頭要素としている
    pivot = lst[0]
    
    # リストの残り要素について、ピボットより小さい値と大きい値に振り分ける
    # ピボットと同じ値はとりあえず大きい方に入るが、どちらでも大丈夫
    smaller = []
    larger = []
    for n in lst[1:]:
        if n < pivot:
            smaller.append(n)
        else:
            larger.append(n)
    
    # 再帰呼び出しして連結
    # quick_sort関数はリストをソートして返すわけなので、
    # ソート済小さい値リスト、ピボット、ソート済大きい値リストの3つを連結すれば全体がソートされたリストになる
    return quick_sort(smaller) + [pivot] + quick_sort(larger)


lst = list(range(10))
random.shuffle(lst)

print("ソート前: " + str(lst))

lst = quick_sort(lst)

print("ソート後: " + str(lst))
```

# 参考サイト
* http://learnyouahaskell.com/recursion#quick-sort
* https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88
Circle Ci jobでRubyとaws cliとnpmとdockerを使う方法

# これはなに？
Circle Ciを使っていて、色々入ってるimage探したりOrbs使ったりしてみたけど、やっぱり素直にUbuntuに入れて使うのが良いなーって思った時のまとめです。

## 前提
 - Circle Ci: 2.1
 - AWSの環境変数は埋め込み済み
 - Ci好き

## jobsサンプルコード

```yml
sample-job: 
    working_directory: ~/app
    docker:
      - image: circleci/ruby:2.5.1-node-browsers # このimageならnpmとrubyが既に入っている
        environment: 
         KANKYOHENSU: kankyohensu #よしなに設定
    steps:
      - checkout
      - setup_remote_docker: # dockerを使う場合はCircle Ciが用意したものを使うので立ち上げる
          docker_layer_caching: true
      # aws cliのinstall
      - run: sudo apt-get update && sudo apt-get install python3-pip groff-base
      - run: sudo pip3 install awscli --ignore-installed six
      # aws cli使えるから色々自動化デキル
      - run: aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
      - run: aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
      # gemのinstallも勿論デキる
      - run: bundle check || bundle install --jobs 4 --retry 3
      # assets:precompileやらnpmやら諸々デキる
      - run: npm install && npm run release
      - run: bundle exec rails assets:precompile
      # 後は煮るなり焼くなり好きにやってくれ
      
```

これでCi上で大体の事できる。
AWS上のことならここから自由自在に操作すればよい。
Lambda x ElasticTranscoderで動画の複数サイズを生成 するサンプルコード

# これはなに？
ElasticaTranscoderとLambdaを用いて、S3に動画がアップロードされた際に複数サイズの書き出しを行ってくれるLambdaサンプルコードです。
Lambda Rybyでgemを使用する方法は[こちら](https://qiita.com/kiitan/items/4bdc530c66d6cdfbd294)を参考にして下さい。

## 前提
ElasticTranscoderでの設定は済ませている。
トリガーの設定も出来る。

## Lambdaサンプルコード

```rb
require 'aws-sdk-elastictranscoder'

def lambda_handler(event:, context:)
    transcoder_client = Aws::ElasticTranscoder::Client.new(region: ENV['REGION'])
    input_mp4 = event['Records'].first['s3']['object']['key']
    
    # 大きめ動画変換 
    transcoder_client.create_job(
      pipeline_id: ENV['PIPELINE_ID'],
      input: { key: input_mp4 },
      output: {
        #S3上のvideoをDirからインポートされたファイルをresized_video Dirへエクスポート
        key: input_mp4.gsub('video', 'resized_video').gsub('.mp4','_1080.mp4'),
        preset_id: '1351620000001-000001' # 1080px
      }
    )

    # 中くらい動画変換 
    transcoder_client.create_job(
      pipeline_id: ENV['PIPELINE_ID'],
      input: { key: input_mp4 },
      output: {
        key: input_mp4.gsub('video', 'resized_video').gsub('.mp4','_720.mp4'),
        preset_id: '1351620000001-000010' # 720px
      }
    )
    
    # ちっちゃい動画変換 
    transcoder_client.create_job(
      pipeline_id: ENV['PIPELINE_ID'],
      input: { key: input_mp4 },
      output: {
        key: input_mp4.gsub('video', 'resized_video').gsub('.mp4','_480.mp4'),
        preset_id: '1351620000001-000020' # 480px
      }
    )
    
    { statusCode: 200 }
end


```
AWS＆capstrano＆unicorn＆MySQLの組み合わせの本番環境でよく使用するコマンド一覧

AWS＆capstrano＆unicorn＆MySQLの組み合わせでアプリをデプロイする際によく使うコマンドを纏めました。
これを使用してより効率的な開発を行いましょう。

```
#mysqlの起動
sudo service mysqld start

#mysqlの停止
sudo service mysqld stop

#mysqlの再起動
sudo service mysqld restart

#mysqlの状態確認
sudo service mysqld status

#mysqlのエラー状態の確認
sudo tail -100 /var/log/mysqld.log | grep ERROR

#mysqlのプロセス番号の確認
ps aux| grep mysqld

#mysqlのプロセス停止
sudo kill プロセス番号

#mysqlの設定ファイルまで移動
cd /etc/

#mysqlの設定ファイルの編集
sudo vi my.cnf

#アプリケアプリケーション（今回はunicorn）再起動
unicorn_rails -c config/unicorn.rb -E production -D

#unicornログの確認
less unicorn.stderr.log

#unicornの最新１０行のログ
tail unicorn.stderr.log

#unicornのプロセスの確認
ps aux | grep unicorn

#unicornのプロセスの停止
kill -9 <確認したunicorn rails masterのPID>

#unicornのプロセスの停止の別の方法
kill -QUIT `cat tmp/pids/unicorn.pid`

#デプロイのコマンド
bundle exec cap production deploy

#nginx　webサーバーの再起動
sudo service nginx restart

#本番環境にgitの変更を反映
git pull origin master
```
Ruby aws-sdkを使ってECSをデプロイ※サンプルコード

# これはなに？
Circle Ciを用いたAutoDeployを設定した際、Ruby aws-sdkの知見があまり見当たらなかったのでサンプルコードとしてまとめさせて頂きました。
特にBlue Green Deployment x Fargateのデプロイ記事は少なかったので、お役に立てましたら幸いです。
Circle Ciでの設定諸々は割愛させていただきます。
## 前提
 ECRで最新のcommit hashをタグにしたdocker imageが既に上がっている
 
## タスク定義
```rb
require 'aws-sdk-ecs'
REPO_HOST = 'XXXXXXXX.dkr.ecr.XXXXXXXX.amazonaws.com'.freeze # ECRホスト
REPO = 'XXXXXXXX'.freeze # ECRリポジトリ名
IMAGE_HASH = ARGV.first # 対象のcommit hash
SERVICE_NAME = 'XXXXXXXX-service'.freeze # ECSサービス名
CLUSTER_NAME = 'XXXXXXXX-ecs-cluster'.freeze # ECSクラスター名
FAMILY = 'XXXXXXXX-taskdef'.freeze # ECSタスク定義

client = Aws::ECS::Client.new

# タスク定義一覧を取得
# 最新のタスク定義を取得
latest_task = client.list_task_definitions(
  {
    family_prefix: FAMILY
  }
).task_definition_arns.last

# 最新のタスク定義から新たに作製するタスク定義の設定をコピー
task_def_hash = client.describe_task_definition(
  {
    task_definition: latest_task
  }
).task_definition.to_hash

# タスク定義の設定を整形していく
# imageはdeployしたいものに変更する
task_def_hash[:container_definitions].first[:image] = REPO_HOST + '/' + REPO + ':' + IMAGE_HASH

# いらないkeyは削除する
task_def_hash.delete :task_definition_arn
task_def_hash.delete :revision
task_def_hash.delete :status
task_def_hash.delete :requires_attributes
task_def_hash.delete :compatibilities

# タスク定義を登録
response = client.register_task_definition(task_def_hash)

```
## サービス更新 ※Rolling Deployment
```rb
require 'aws-sdk-ecs'
# タスク定義を作った時のresponseからtask_definitionは指定する
client.update_service(
  {
    cluster: CLUSTER_NAME,
    service: SERVICE_NAME,
    task_definition: res.task_definition.family + ':' + response.task_definition.revision.to_s
  }
)
```
## サービス更新 ※Blue Green Deployment
```rb
require 'aws-sdk-ecs'
require 'aws-sdk-codedeploy'
require 'digest'
# タスク定義の指定用にarnを控えておく
arn = client.register_task_definition(task_def_hash).task_definition.task_definition_arn

# code-deploy clientを生成
code_deploy_client = Aws::CodeDeploy::Client.new

# AppSpecContentのjsonを整形
# AppSpecContentとはbree gree deploymentで必要な設定のこと
# AWS コンソール上のCodeDeploy >アプリケーション > hogehoge > Revisionのアプリ仕様に記載。
content_json = {
  version: 1,
  'Resources' => [
    {
      'TargetService': {
        'Type': 'AWS::ECS::Service',
        'Properties': {
          'TaskDefinition': arn,
          'LoadBalancerInfo': {
            'ContainerName': CONTAINER_NAME,
            'ContainerPort': 80
          },
        'PlatformVersion': 'latest'
        }
      }
    }
  ]
}.to_json

# execute
code_deploy_client.create_deployment(
  {
    application_name: DEPLOYMENT_APP_NAME,
    deployment_group_name: DEPLOYMENT_GROUP_NAME,
    revision: {
      revision_type: 'AppSpecContent',
      app_spec_content: {
        content: content_json,
        sha256: Digest::SHA256.hexdigest(content_json)
      }
    }
  }
)

```

以上。
circle ciでうまくフックしてデプロイを無人化しましょう。
msys2環境でnvm-windowsでnpmを管理している人のための_authTokenの探し方

なんか毎回探し回ってる気がするのでメモしておく。

msys2のuser homeではなくてwindowsのuser home dir(`C:\Users\yumetodo`とか)に`.npmrc`があるのでその中にある。

ほかは多数解説のある通り

[Travis CIを使ってnpmを継続的に公開・メンテナンスするよ](https://qiita.com/KamataRyo/items/6e795c6734f9a775f5a6)
Djangoのインストールの仕方メモ

# Djangoをインストール

```bash
$ mkdir BeginnerProject
$ cd BeginnerProject
BeginnerProject$ python3 -m venv beginner_venv
BeginnerProject$ source beginner_venv/bin/activate
(beginner_venv) BeginnerProject $ pip install --upgrade pip
(beginner_venv) BeginnerProject $ pip install django
(djangorbos_venv) BeginnerProject $ deactivate
```
# プロジェクトを作る

```
BeginnerProject$ source beginner_venv/bin/activate
(beginner_venv) BeginnerProject $ django-admin startproject django_blog
(beginner_venv) BeginnerProject $ cd django_blog
(beginner_venv) BeginnerProject $ python manage.py runserver
```

# 設定を変える
```python:settings.py
LANGUAGE_CODE = 'ja-JP'
TIME_ZONE = 'Asia/Tokyo'
```

# データベースミグレーションをする
```bash
(beginner_venv) BeginnerProject $ python manage.py migrate
```

今回完成したサイトはこちら
[クレジットカードマスター](https://cards-master.com)

ではまた！
ローカルから直接Dockerのデータベースを操作する

# 概要
ローカルから直接Docker内にあるデータベース(MySQL)をダンプ/リストアなどの操作をする方法です。
Dcokerのコマンド + MySQLのコマンドを組み合わせるだけです。

# 本文
以下の定数はコマンド等で確認してください。
`CONTAINER_NAME` : Dockerのコンテナ名。`$ docker ps`で確認する。
`USER_NAME` : Docker内のデータベースのユーザ名
`PASSWORD` : Docker内のデータベースのパスワード
`DATABASE_NAME` : Docker内のデータベース名

## ローカルから直接Dockerのデータベースに接続

```
$ docker exec -it CONTAINER_NAME mysql -u USER_NAME -p
```

## ローカルから直接Dockerのデータベースを操作

データベース作成の例。
-eのオプションでは自由にSQLコマンドを実行できます。

```
$ docker exec -it CONTAINER_NAME  mysql -u USER_NAME -p -e'CREATE DATABASE IF NOT EXISTS DATABASE_NAME;'
```

## ローカルから直接Dockerのデータベースをダンプ
**ダンプ**とは、テーブルなどのデータベースの情報をSQL文の形で出力することです。
バックアップのようなものです。

```
$ docker exec -it CONTAINER_NAME mysqldump -u USER_NAME -pPASSWORD DATABASE_NAME > dump.sql
```

## ローカルから直接Dockerにあるダンプファイルをリストア
**リストア**とは、ダンプされたファイルからデータベースを復元することです。

```
$ docker exec -it CONTAINER_NAME mysql -u USER_NAME -p DATABASE_NAME -e"$(cat dump.sql)" 
```

本題は以上です。

# 補足
個人的によく使うDockerとMySQLのコマンドも記載しておきます。

## Dockerコマンド

### コンテナに接続

```
$ docker exec -it CONTAINER_NAME bash
```

オプションの意味は以下です。
`-i` : アタッチしていなくても STDIN をオープンにし続ける
`-t` : 疑似ターミナル (pseudo-TTY) の割り当て
[exec — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/engine/reference/commandline/exec.html)

### ローカルへファイルをコピー

```
$ docker cp <コンテナID>:path/to/container/dump.sql path/to/local/dump.sql
```

[cp — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/engine/reference/commandline/cp.html)

## MySQLコマンド

### MySQLに接続

```
$ mysql -u USER_NAME -p
```

### ダンプ

```
$ mysqldump -u USER_NAME -p DATABASE_NAME > dump.sql
```

特定のテーブルを指定することもできます。

```
$ mysqldump -u USER_NAME -p DATABASE_NAME TABLE_NAME > dump.sql
```

**バックアップ**としてダンプするときは、`--single-transaction`オプションをつけます。
このオプションをつけるとトランザクションを利用してくれるので、バックアップを開始〜終了まで整合性のとれたデータであることを保証してくれます。 

```
$ mysqldump --single-transaction -u USER_NAME -p DATABASE_NAME > dump.sql
```

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)

### リストア

```
$ mysql -u USER_NAME DATABASE_NAME < dump.sql
```

# 最後に
記事に間違いや不明な点があれば遠慮なくご指摘ください。
slackbot備忘録 ~基本編２~

# はじめに
pythonを使ってslackbotを作成した備忘録パート２

<a href="https://qiita.com/str32/items/dde7e1557fdc7de111d2" rel="nofollow noopener" target="_blank">前回</a>、作成していた時にこれを作りたいなと思ったこと

* 起動時の最初のひとこと
* 完全一致や複数の言葉でのトリガー発動
* オウム返し

上記三つを今回作成した

# 起動時の最初のひとこと
起動時にslack上で「起動しました！」と表示したい
ということでいろいろ探ってみたところslackerを使えばできそう

### slacker
時報やリマインドとしてよく使うらしい
slacker単体で「起動しました！」を送ってみる

slackerパッケージをインストール

```
pip install slacker
```

ディレクトリ構造は下記の通り

```
slackbot
　－ run.py               # slackbot起動用ファイル
　－ slackbot_settings.py # slackbot設定用ファイル
　－ post_message.py      # post message用ファイル
　－ plugins
　  　 － __init__.py     # モジュールを示すファイル（中身は空）
　  　 － my_mention.py   # slackbot機能用ファイル
```

### プログラム

```python:post_message.py
# coding:utf-8
from slacker import Slacker
imoport slackbot_settings  # API_TOKENを使用するため

slack = Slacker(slackbot_settings.API_TOKEN)
slack.chat.post_message(
    'general',
    '起動しました！',
    as_user = True
)
```

![pii1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/4de8021f-9851-b3b5-2cc5-e2532e8632ba.png)


ちなみにslack.chat.post_messageでボット名とアイコンを設定することもできる

```python:post_message.py
slack.chat.post_message(
    'general',
    '起動しました！',
    username = 'bot君',
    icon_emoji = ':robot_face:'
)
```
こやつを**run.py**に入れるとこうなる

```python:run.py
# coding:utf-8

from slackbot.bot import Bot
from slacker import Slacker

import slackbot_settings

def main():
    # 省略

if __name__ == "__main__":
    slack = Slacker(slackbot_settings.API_TOKEN)
    channel = 'general'
    message = '起動しました！'
    slack.chat.post_message(
        'general',
        '起動しました！',
        username = 'bot君',
        icon_emoji = ':robot_face:'
    )
    main()
```

![pii2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/bbcc96b6-5423-63b2-3137-7a40809d5d66.png)

無事、起動時にコメントをした！

# 完全一致や複数の言葉でのトリガー発動
前回、**respond_to('こんにちは')**は部分一致で発動することがわかった
今回は完全一致かつ、複数の言葉にも対応できるように変えていく

完全一致にするには、正規表現を使う

```python:my_mention.py
# ^ => 先頭にマッチ, $ => 末尾にマッチ
@respond_to('^こんにちは$')
def respond_func(message):
    message.reply('こんにちは！')
```

複数の言葉に対応するためには、@respond_toを連続で記述する

```python:my_mention.py
# あまり使用しないが、listen_toも連続で記述すれば発動する
@respond_to('^こんにちは$')
@respond_to('こんちは')
@listen_to('こんにちわん')
def respond_func(message):
    message.reply('こんにちは！')
```

結果は以下の通り

![pii3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/fab30015-0695-05c9-ae2f-bd122fa2a853.png)

# オウム返し
「おはよう」っていうと「おはよう」っていう。
「こんにちは」っていうと「こんにちは」っていう。
「こんばんは」っていうと「こんばんは」っていう。
~~こだまでしょうか？ いいえ、だれでも。~~ 古いですね…笑

こんな感じでオウム返しをする

```python
def function_name(message)
```

前回特に何も触れずに書いた、関数の中にある**message**
この中には、送られてきたメッセージの情報が入っている
この中から**message.body['text']**を使って、メッセージ文を取得し出力する

```python:my_mention.py
@respond_to('^おはよう$')
@respond_to('^こんにちは$')
@respond_to('^こんばんは$')
# 削除　@respond_to('こんちは')
# 削除　@listen_to('こんにちわん')
def respond_func(message):
    #メッセージ文取得
    mes = message.body['text']

    message.reply(mes)
```

結果は以下の通り

![pii4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/33a637d4-ebb3-d2c9-38ac-37e5c1a7e894.png)

ちょっとボットらしくなってきて楽しい
正規表現や、messegeの中身を調べたらもう少し楽しくなりそう
次回はそのあたりを修正していきたい( ˘ω˘ )
pytorch_pretrained_bertでモデルの保存前後で結果が違うのはvocabファイルのせいかも？

pytorch_pretrained_bertを使っていますか？今はpytorch-transformersと名前を変えたこちらのライブラリですが、PyTorchでBERTを扱おうとしたときにはこれを利用している方は多いのではないでしょうか。
京大から[事前学習モデル](http://nlp.ist.i.kyoto-u.ac.jp/index.php?BERT%E6%97%A5%E6%9C%AC%E8%AA%9EPretrained%E3%83%A2%E3%83%87%E3%83%AB "事前学習モデル")が配布されているため、日本語のデータでもタスクに応じた学習をすることが可能なのですが、ちょっとした落とし穴があったため記事にしておきます。ただし、今のバージョンだと修正されており、ちょっと古いバージョンを使っている人向けです
。私の方で問題が発生したときにはpytorch_pretrained_bertのバージョンは0.6.2でした。

# 問題発生
京大の事前学習モデルを使って自分のやりたいタスクの日本語モデルの学習後に、モデルの重みやvocab.txtなどの情報を保存しました。そして再度モデルを読み込み、予測をさせてみると・・・。

**学習中に比べて全然うまくいってない！**

ちょっと違うとかではないし、訓練データを予測させてもうまくいきません。
PyTorchのモデルの保存か読み込みでどこかミスしたのかと考えましたが、どうやら違うようです・・・。

# 原因と解決方法
## 原因はvocab.txtの読み込み
自分で学習した後に保存したvocab.txtを眺めていると、事前学習モデルのvocab.txtと行数が異なることに気づきます。次のような感じになります。

```事前学習モデルのvocab.txt
︙
など
３
−

この
ない
ため
︙
```

```自分で学習したモデルのvocab.txt
︙
など
３
−
この
ない
ため
︙
```


事前学習モデルのvocab.txtには46行目に空行、2451行目にnon-breaking spaceがあるのですが、実はvocab.txtをBERTのtokenizerで読み込むときにこれらを同一視してしまうような仕組みになっていました。同一視されることでvocab.txtの情報が1つ分なかったことにされてしまいます。**学習後に保存したvocab.txtではこれが反映されて保存されたため、おかしくなっていたのでした。**

以下のtokenization.pyのload_vocabにおけるstripの呼び出しとvocab[token]への代入が該当箇所になりますが、空行もnon-breaking spaceもstripすることで空文字になってしまっています。tokenに対応するindexを逐次代入していっていますので、vocab.txtの行数が異なるとこのindexに違いが生じてしまいます。

```python3:tokenization.py
def load_vocab(vocab_file):
    """Loads a vocabulary file into a dictionary."""
    vocab = collections.OrderedDict()
    index = 0
    with open(vocab_file, "r", encoding="utf-8") as reader:
        while True:
            token = reader.readline()
            if not token:
                break
            token = token.strip()
            vocab[token] = index
            index += 1
    return vocab
```

## 解決方法
上記コードのstripの呼び出しの行をtoken = token.rstrip("\n")とすることで、空行とnon-breaking spaceを別物として扱うことができるようになります。結果として事前学習のモデルでのvocab.txtと学習後に保存したvocab.txtは一緒になります。これは今のpytorch-transformersでは対応済みです。

この修正をおこなった後では、ちゃんと学習中の予測結果とモデルを読み込んだ場合の予測結果は一致しました！やったね
mixinを使用時、Undefinedとエラーが起きた

#railsでアプリを作成中、Undefinedとエラーが起きた時の対処した方法
**今回、mixinを使用しようとして、Undefinedとなりmixinのファイルが読み込まれない問題が起きた！ 結論は、下にあります。右のサイドバーのとこから下のに飛んでください。**

*mixinの使い方として、以下の方法がある。*

- @、で定義して@include、で再利用する方法

```css:
@mixin box{
  height: 50px;
  width: 50px;
}

.box1{
  @include box;
  background-color: red;
}
```

- @mixinで引数を使う。

```css:
@mixin box($length){
  height: $length;
  width: $length;
}

.box1{
  @include box(50px);
  background-color: red;
}
```

- 複数の引数を使用する。

```css:
@mixin box($height, $width){
  height: $height;
  width: $width;
}

.box1{
  @include box(50px, 100px);
  background-color: red;
}

```

*以上の方法がある。*

要は、
@mixinで、*箱を定義してあげ、そのまま使う方法* と *箱の形を定義してあげ、使用するときに値を入れてあげる方法*

##・しかし、今回記述方法にミスは、見られないはずなのにmixinのファイルが読み込まれないエラーとなった

この、原因は*application.scss*ファイルに**@import**する順番の問題であった。

ファイルの上から、順に読み込まれていくために**@mixin**を定義したファイルを`使用するファイルの下に記述していた`ため、**@mixin**が`まだ定義されていないからわからない`という意味であることがわかった。

*したがって、まずmixinを定義したファイルを読み込ませる。*

よって、@importする順番を間違えていたことに気づいた。

*これは、初心者でまだ慣れていないために起きた。*

以上で終わり
間違っていることがあれば、すみません。
Model.initializeイベントでsetConnectionを使いDBを切り替えるとDebug_kitでsqlログが見れない

#前提
mysqlを使っているがスキーマがお客さん(法人)ごとにあって、
ログイン情報によって切り替えないといけない。

#原因
app.phpにDBの設定をdefaultだけしておいて、後で動的に変更する場合に
debug_kitが動く前に設定してないこと

#最初は、
共通のコントローラで複数あるスキーマをConnectionManager::setConfig()
で登録しておいて、Model.initializeが動くタイミングでEntity.setConnection
していた

#対策
https://github.com/cakephp/debug_kit/blob/7672bb9688465ac263a65468102307bf506069bc/src/Panel/SqlLogPanel.php#L46
`ConnectionManager::configured();`
が動く前には設定を終わらせてないといけない

https://github.com/cakephp/debug_kit/blob/7672bb9688465ac263a65468102307bf506069bc/config/bootstrap.php#L75

## それにはどうするか
```php

EventManager::instance()->on('Server.buildMiddleware', function ($event, $queue) use ($service) {
        $middleware = new DebugKitMiddleware($service);
        $queue->insertAt(0, $middleware);
    });
```
debug_kitでは「Server.buildMiddleware」という遅い段階で動くイベントで、`insertAt(0, $middleware);`で先頭にミドルウェアを登録される。

なので、Application.phpでミドルウェア登録してもだめ。
bootstrap.phpでべたっと書いてもいいけどかっこ悪い。
app.phpはcakeのormが使えないのでソースが汚くなる。

ということで、Server.buildMiddlewareを設定する処理を作成して、
debug_kitプラグインが読み込まれた後で、設定する
自宅で簡易的にリアルアバターを作る方法【フォトグラメトリ】

#概要

##今回作ったもの
<img width="1325" alt="img_riaava_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423399/5c07a27e-bb3c-1829-d613-a60039cdafb6.png">

##リアルアバターとは？
文字通りリアルの肉体に近いアバターモデルを、属に「リアルアバター」と呼びます。
VRコミュニティの文化のアバターはBlenderなどの3Dモデリングソフトでモデリングして作るのが一般的です。ですが、リアルアバターの場合は写真から生成する[フォトグラメトリ](https://styly.cc/ja/tips/photogrammetry_summary/)という技術を使用することが多いです。

##趣旨
リアルアバターを、特殊な機材を使わずに一人で自宅で生成できないかと思い、今回の制作に取り組みました。もしこれが実現すれば、多くの人がリアルアバターをVRに持ち込める世界を実現できると感じています。勿論、[3Dスキャンスタジオ](http://www.superscanstudio.com)ほどのクオリティを出すことできないですが、使用できるに値する簡易的なアバターを目指します。今回はその撮影方法と機構の作り方を紹介します。

##現状のリアルアバター制作方法
フォトグラメトリには、多点からの静止画が必要です。またその撮影中は動くことができません。その為、現状リアルアバター制作は、3Dスキャンスタジオで撮影するのが一般的です。特殊な機材を使わずに個人レベルで生成する場合は撮られる側と撮る側の２名が必要になります。特殊な高額機材無しで自分一人で撮影するのは、現状困難といえます。

#制作方法

##今回課した条件
* 一人で撮影できる
* スマホ1台で撮影できる
* 自宅で撮影できる
* 市販のもので機構を作る

##機構に必要な材料
* 丸棒（180cm）
* 針金（2m程度）
* 養生テープ
* カーペンターフック
* ペットボトル
* 紙ひも
* 水
* 穴を開けてもよい天井

【総額：約1000円】

##機構の作り方
![C16473D8-F2E1-42A4-BA6C-99C5620D0692.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423399/5156a98d-9bc9-0a3d-dfb8-4a5fae233787.jpeg)

1. 丸棒にの両端に針金を括り付けます
2. その針金の片側にスマホを取り付けます
3. 反対側の針金に水を入れたペットボトルを取り付けます
4. 丸棒の中央にフックが掛けられるように針金を括り付けます
5. ここで重心が中央に安定するようにペットボトルの水の量を調節しましょう
6. 重心が安定したら、養生テープでそれぞれ動かないように固定します
7. カーペンターフックを天井に取り付け、紙ひもを取り付けます
8. 最後にその紙ひもの先を、先程の丸棒の中心に取り付けたら完成です

##撮影方法
* スマホを内側に向けた状態で、ビデオ撮影を開始します。
* その後、丸棒を紙ひもを中心にして回転させます。この時に回転とともに上下に揺れるように力を加えます。そうすることで多点から撮影することができ、生成精度があがります。
* あとは撮影した動画を使えばフォトグラメトリソフトに入れれば簡単に生成できます！
* 
参考URL：[誰でも簡単にフォトグラメトリを今すぐ無料で始める方法](https://qiita.com/amaiokashi/items/db88da0423a1549abcd8)

##最後に
この機構は現在改良中です。
頭から足先まで綺麗に生成できるクオリティにはまだ至れていません。
両端の針金部分を長さを可変にするなど改善を行い、精度を上げたいと思っています。
もし、良いアイデアがありましたらお教え頂けると嬉しいです！

より本格的なクオリティのモデルを作りたい場合は通常数万円かかるのですが、私の知り合いが7800円という破格でスタジオでのリアルアバター制作をしています。ご興味ある方は是非、こちらも見てみて下さい！
[@HappyOcean](https://twitter.com/HappyOcean)
Swift覚書

override：
サブクラス側でベースクラスのメソッドやプロパティを実装しなおす（上書きする）こと。
メソッド

```
class BaseClass {
  func doSomething() {
    // なんかする
  }
}
class SomeClass : BaseClass {
  override func doSomething() {
    super.doSomething()
    // サブクラス側でなんかする
  }
}
```
プロパティもオーバーライド可能

```
class BaseClass {
  var something : String
}
class SomeClass : BaseClass {
  var something : String {
    get {
      return super.something
    }
    set {
      let value = newValue ...... // do something ...
      super.something = value
    }
  }
}

```


delegate
- デザインパターンのひとつ。
特徴：
- 移譲先を意識する必要がない
- 再利用ができる
- 複数のclassをまたいで処理を行う
実装にあたり必要な３つの要素：
1.プロトコル：任せる処理をメソッドとして定義（delegateメソッド）

```
protocol ButtonDelegate{
	//おとを鳴らす
	func audio()

	//背景画像を変更する
	func backgroundChange()
}
```

2.処理を任せるクラス：delegateメソッドを使用し処理の流れを記述

```
class Button{
	var delegate: ButtonDelegate? = nil
	func click(){
		print("Button is clicked")
		if let dl = self.delegate{
			dl.audio()
			dl.bakgroundChange()
		}else{
			print("donothing")
		}
	}

}
```

3.処理を任されるクラス：delegateメソッドを実装。処理をここで実装する（overrideと同じ？）

```
class Button1: ButtonDelegate{
	func audio(){
		print("beep")
	}
	func backgroundChange(){
		print("background is changed")
	}
}

```

4.実行処理

```
let button = Button()

let button1 = Button1()
button.delegate = button1
button.click()
```

didset：
- 値が更新されたときに呼ばれる
自動更新のイベント発火の正規表現の意味(/と\の意味)

# 記事を書いた経緯
chatアプリのメッセージの自動更新のイベント発火させるための条件式において、複数の/(スラッシュ)や\(バックスラッシュ)の意味がわかったのでアウトプットします。条件式の意味としては、『現在開いているページのURLの中に「groups数字messages」が含まれていたら、条件式がtrueになる』という意味である。

```js
if (window.location.href.match(/\/groups\/\d+\/messages/)){
自動更新の処理
}
```

#複数の/(スラッシュ)や\(バックスラッシュ)の意味について

match(/\/groups\/\d+\/messages/)

##1 **両端**の/(スラッシュ)に意味について
両端の/(スラッシュ)は、matchメソッドを使用する時に操作したい文字列を囲む時に使う。

match(**/**対象の文字列**/**)

##2 **\/groups**の/(スラッシュ)や\(バックスラッシュ)の意味について
初めの\(バックスラッシュ)は、次の文字をエスケープすることを意味する。
その次の/(スラッシュ)は、パスのスラッシュを意味する。

##3 **\/\d+**の/(スラッシュ)や\(バックスラッシュ)の意味について
初めの\(バックスラッシュ)は、次の文字をエスケープすることを意味する。
その次の/(スラッシュ)は、パスのスラッシュを意味する。

**\d+**の意味について
**\d**は、数字にマッチしていることを意味する。
ex.groups/1/messagesのパスの１の部分を意味する。

**+**は、直前の文字の 1 回以上の繰り返しにマッチしていることを意味する。
ex.groups/1234/messagesのパスであれば、数字が繰り返し使われているので、+が必要となる。


##4 **\/messages**の/(スラッシュ)や\(バックスラッシュ)の意味について
初めの\(バックスラッシュ)は、次の文字をエスケープすることを意味する。
その次の/(スラッシュ)は、パスのスラッシュを意味する。


＜参考記事＞
・https://pleiades.io/help/pycharm/regular-expression-syntax-reference.html
・https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions
・https://qiita.com/iLLviA/items/b6bf680cd2408edd050f
・https://blog.siteanatomy.com/2017/10/regexp-for-goal-destination.html

location.hrefについて
・https://www.sejuku.net/blog/26999
・http://alphasis.info/2013/07/javascript-locationobject-href/
VisualStudio2019でUnityデバッガーのアタッチをツールバーに置く

備忘録です。


通常VisualStudioでUnityをデバッグするには
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167761/358bc74b-0b6c-4c1f-bc38-aa8de0bfbb67.png)
こんな感じでデバッグ→Unityデバッガーのアタッチを選択する必要がありますが、
デバッグを繰り返すときにはこれがとにかく面倒です。
探したところこの「Unityデバッガーのアタッチ」をツールバーに置く方法が見つかったので書き残しておきます。
(vs2017の頃には勝手にツールバーに置かれてた気がするのですが…)
これでUnityのデバッグが楽になりますね。

##### 環境
- Microsoft Visual Studio Community 2019 Version 16.2.1
- Visual Studio Tools for Unity   4.2.0.1

恐らくvs2017とか他のバージョンでも同じようにできると思います。

#### 手順
ツール→カスタマイズを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167761/34d3ad48-d97a-9da9-f65e-7478cd95bbec.png)

コマンドタブ、ツールバーを選択。プルダウンは標準を選択、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167761/2351fdd1-5beb-12b1-0ebe-70d0312ab2c7.png)

コマンドの追加をクリック。
カテゴリはデバッグ、コマンドは「cmdldUnityAttach」を選択してOKをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167761/8e5a5f16-6972-f2de-4b49-2c13174b9166.png)

下へ移動などしてお好きな位置に移動し、閉じるをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167761/109820b8-032a-3298-8909-022c90f6d63c.png)

追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167761/afac252a-7812-117e-3566-b981fb2680ca.png)

アイコンをクリックするとおなじみのUnityインスタンスの選択画面が表示されます。

この記事が誰かの役に立てたら幸いです。それでは。
スプレッド演算子とArray.prototype.fill() の挙動

2次元配列を`array.fill()`で埋めた時の挙動が難しかったのでメモ

``` js
const row = [0, 0]
const table = new Array(2)
// 0埋め
table.fill([...row])
const table2 =[[0, 0],[0, 0]]

console.log(table) // [[0, 0], [0, 0]]
console.log(table2) // [[0, 0], [0, 0]]

table[1][1]++
table2[1][1]++

console.log(table) // [[0, 1], [0, 1]]　？？？？？
console.log(table2) // [[0, 0], [0, 1]]
```

スプレッド演算子で配列コピーして中身の配列を埋めると値が共有される？
※コメントいただきましたが、参照を渡すだけのようです。
自分の勝手な予想では、arry.fill()にスプレッド演算子を渡すと、中身の数だけシャローコピーを作ってくれると思っていたけど、実際には、一つシャローコピーを作って、それを参照する模様。



0埋めを下記のように変更すると値渡しになる。
~~2次元配列には`array.fill()`は使わない方が良さげ~~

``` js
const row = [0, 0]
const table = new Array(2)
// 0埋め
table[0] = [...row]
table[1] = [...row]
const table2 =[[0, 0],[0, 0]]

console.log(table) // [[0, 0], [0, 0]]
console.log(table2) // [[0, 0], [0, 0]]

table[1][1]++
table2[1][1]++

console.log(table) // [[0, 0], [0, 1]] 
console.log(table2) // [[0, 0], [0, 1]] 想定どうり
```
ScalaでEpochTimeからDate型に変換する方法を調べたときの備忘録

## joda-time

> 標準のjava.util.Dateクラスの代わりにJoda Timeを使用してみてください。 Joda Timeライブラリには、日付処理のためにはるかに優れたAPIがあります。

https://codeday.me/jp/qa/20181217/35055.html

scalaで時間操作メモ
https://blog.shibayu36.org/entry/2015/07/27/093406
JodaOrg/joda-time
https://github.com/JodaOrg/joda-time/blob/master/.github/issue_template.md

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

import org.joda.time.DateTime
val dt = new DateTime(1564441580 * 1000L)
val HH = dt.toString("HH")
val mm = dt.toString("mm")

// Exiting paste mode, now interpreting.

import org.joda.time.DateTime
dt: org.joda.time.DateTime = 2019-07-30T08:06:20.000+09:00
HH: String = 08
mm: String = 06
```

## joda-time -> Java8 Time API

> Java SE 8 contains a new date and time library that is the successor to Joda-Time.

https://github.com/JodaOrg/joda-time/blob/master/.github/issue_template.md

Java8の日時APIはとりあえずこれだけ覚えとけ
https://qiita.com/tag1216/items/91a471b33f383981bfaa
Javaで日時を扱う（Java8）
https://qiita.com/kurukurupapa@github/items/f55395758eba03d749c9

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

import java.time.{Instant, ZonedDateTime, ZoneId}
import java.time.format.DateTimeFormatter

val zdt       = ZonedDateTime.ofInstant(Instant.ofEpochSecond(1564441580), ZoneId.of("Asia/Tokyo"))
val HH        = zdt.format(DateTimeFormatter.ofPattern("HH"))
val mm        = zdt.format(DateTimeFormatter.ofPattern("mm"))
val dayOfWeek = zdt.getDayOfWeek.toString.toLowerCase

// Exiting paste mode, now interpreting.

import java.time.{Instant, ZonedDateTime, ZoneId}
import java.time.format.DateTimeFormatter
zdt: java.time.ZonedDateTime = 2019-07-30T08:06:20+09:00[Asia/Tokyo]
HH: String = 08
mm: String = 06
dayOfWeek: String = tuesday
```

## toString -> getDisplayName

> Scala には既に Any に toString があるため、Show を定義するのは馬鹿げているように一見見えるかもしれない。 
> Any ということは逆に何でも該当してしまうので、型安全性を失うことになる。 toString は何らかの親クラスが書いたゴミかもしれない:

http://eed3si9n.com/herding-cats/ja/Show.html

列挙型DayOfWeek
https://docs.oracle.com/javase/jp/8/docs/api/java/time/DayOfWeek.html

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

import java.time.{Instant, ZonedDateTime, ZoneId}
import java.time.format.{DateTimeFormatter, TextStyle}
import java.util.Locale

val zdt       = ZonedDateTime.ofInstant(Instant.ofEpochSecond(1564441580), ZoneId.of("Asia/Tokyo"))
val dayOfWeek = zdt.getDayOfWeek.getDisplayName(TextStyle.FULL, Locale.US).toLowerCase

// Exiting paste mode, now interpreting.

import java.time.{Instant, ZonedDateTime, ZoneId}
import java.time.format.{DateTimeFormatter, TextStyle}
import java.util.Locale
zdt: java.time.ZonedDateTime = 2019-07-30T08:06:20+09:00[Asia/Tokyo]
dayOfWeek: String = tuesday
```
PHPでプロセスIDを取得して、排他制御する方法をメモ


管理画面でCSVファイル出力など、2度押し防止対策として使ってます。

```php
//プロセスID取得
$pid = getmypid();
```

取得したプロセスIDを一時的にファイルに保存
タスク実行後に、ファイル削除

```php
$file = "/tmp/pid.txt";

$fp = fopen($file,"w");
fwrite($fp,$pid);
fclose($fp);

//タスク実行

//ファイル削除
unlink($file);
```


タスクが実行中かどうかは、上記で生成したプロセスIDを格納したファイルを参照し、
そのプロセスIDが実行されているかどうかpsコマンドで確認するように書いてます。

```php
$file = "/tmp/pid.txt";
if(file_exists($file)) {
    // ファイル内に記載されているプロセスIDを取得
    $pid = file_get_contents($file);

    //取得したプロセスIDが動いていないかチェック
    $cmd = "ps h " . $pid;
    exec($cmd, $output, $result);
}
```

PHPでプロセスIDを取得するのは初めてやりました〜
JavaScriptを学ぶ①（クリックでboxの色を変えてみよう♪）


ドットインストール参照です。

<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458009/9db1bad8-d76e-7a2a-9567-8bf6fe1b46f0.png">

という感じで`クリックすると色が変わります`。

```html 
 <body>
<div id="target" class="box">
</div>

<script>
  `use strict`;

  document.getElementById(`target`).addEventListener(`click`,function(){
    document.getElementById(`target`).style.background = `pink`;
  })
</script>
```
※boxはＣＳＳで以下のように設定しておきます。（アレンジです）
※ドットインストールでは、html文書headタグ内に＜style＞タぐを作って書いています。

```css

.box{
  width:100px;
  height:100px;
  background-color: skyblue;
  cursor:pointer;
}
```


###コードの詳細を見ていこう:point_up_tone1:

`use strict`は、書くと厳密なブラウザチェックをしてくれます。
`.document`というのは文書全体という意味。
`EventListner`は、後ろで表記するイベントが起これば、何らかの処理をする　という意味。
`funavtion`は複数のイベントをまとめる関数。何行でも追加できる。

```html
<script>
  `use strict`;
  document.getElementById(`target`).addEventListener(`click`,function(){
    document.getElementById(`target`).style.background = `pink`;
  })
</script>
```

をシンプルに書いてみると、
①idの読み込み　⇒　②イベントが起こったときの処理の追加　⇒　③何の何をどうするか表記


#アレンジしてみた♪クリックで背景画像を変える！

<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458009/907d1b19-a0bb-8092-ff27-95f48738f8bd.png">


```html
<script>
  `use strict`;
  document.getElementById(`target`).addEventListener(`click`,function(){
    document.getElementById(`target`).style.background = `url(imge/btn_3.png) no-repeat`;
  })
</script>
```
```css
.box{
  width:150px;
  height:100px;
  background-image: url(imge/btn_1.png);
  background-repeat: no-repeat;
  cursor:pointer;
}
```


疑問点①：このとき、backgroundの部分をbackground-imageにはできなかった(´;ω;｀)
疑問点②：no-repeatをつけないと画像がリピートされてしまった(´;ω;｀)


では、長くなるので続きは次回にしていきましょう(^^)
はじめての正規表現

# 一般的な正規表現
- `.`: 任意の1文字
- `\`には2つの場合がある
    - エスケープする場合：`\.`とすると、`.`がメタ文字ではなくてただの文字だよ、と表現する。
    - あとにつづく文字と組み合わせて1つの文字種を表現する場合
        - `\d`: 数字、`\w`: 文字、`\s`: スペース。それぞれ大文字で「それ以外」を表す。
- 量指定子
    - `{3}`: 3文字の繰り返し、`{3,5}`: 3文字以上5文字以下の繰り返し、`{3,}`: 3文字以上の繰り返し。
    - `?`: `{0,1}`, `+`: `{1,}`, `*`: `{0,}`
    - 量指定子を用いた場合、デフォルトでは一番長い文字列が結果となる。一番短い文字列を得たい場合は、量指定子の後ろに`?`をつける。

- `^`: 行頭、`$`: 行末, `\b`: 単語の境界
- `(hoge|fuga)`: hogeまたはfuga
- 文字クラス（`[]`）
    - `[abc]`: aまたはbまたはc、`[^xy]`: xとy以外の1文字（`[`の直後に`^`がくる場合のみ否定の意味になる）、`[a-z]`: 文字コード上でaからzの範囲にあるどれか1文字
    -   地の正規表現でエスケープすべき文字と文字クラス内でエスケープすべき文字は異なるので注意
- 後方参照
    - 正規表現内で`()`で括った内容を、同一の正規表現のそれ以降において`\1`, `\2`で表現できる。
- キャプチャ
    - 検索文字列で`()`で括った内容を、置換文字列において`$1`, `$2`で表現できる。

# Rubyにおける正規表現
- `String# =~ regexp`でマッチすればマッチした文字の位置を整数で返し、マッチしなければnilを返す。
- `String# !~ regexp`はマッチしなければtrueを、マッチすればfalseを返す。
- `\A`は文字列の先頭を、`\z`は文字列の終端を表す。
- `String#scan(regexp)`はマッチした文字列を配列にして返す。
Ruby手習い（Dateクラス）

[https://blog.jnito.com/entry/2019/05/03/121235:title]

上記記事のカレンダー作成問題。

# 出力結果

```
p-064% ruby calendar.rb
      May 2019
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
```

# 自分で書いたコード

```
require 'date'

def main
  puts calendar
end

def calendar
  today = Date.today
  title = today.strftime("%B %Y").center(20)
  head = "Su Mo Tu We Th Fr Sa"
  
  last_day = Date.new(today.year, today.month + 1, -1).day
  wday = Date.new(today.year, today.month, 1).wday

  body = "   " * wday
  d = 1

  (1..last_day).each do
    body << d.to_s.rjust(2)
    d += 1
    wday += 1
    body << (wday % 7 == 0 ? "\n" : " ")
  end

  [title, head, body].join("\n") 
end

if __FILE__ == $0
  main
end
```

- 文字を表示するだけなので1つ1つのDateインスタンスつくらなくていいやと考えた。
- あと細かくメソッドに分割するのはYAGNIでやらなくていいやと考えた。

# 出題者による回答例

```
require 'date'

class CalendarRenderer
  DAY_LENGTH = 3
  WEEK_LENGTH = DAY_LENGTH * 7

  def initialize(year, month)
    @first_date = Date.new(year, month, 1)
  end

  def to_s
    (header_rows + body_rows).join("\n")
  end

  private

  def body_rows
    split_pattern = /.{#{DAY_LENGTH},#{WEEK_LENGTH}}/
    body_text.scan(split_pattern)
  end

  def body_text
    first_week_offset + calendar_text
  end

  def first_week_offset
    ' ' * @first_date.wday * DAY_LENGTH
  end

  def calendar_text
    last_day = @first_date.next_month.prev_day.day
    rjust_all 1..last_day
  end

  def header_rows
    [month_year, sun_to_sat]
  end

  def month_year
    indent_length = 1
    @first_date.strftime("%B %Y").center(WEEK_LENGTH + indent_length).rstrip
  end

  def sun_to_sat
    rjust_all %w(Su Mo Tu We Th Fr Sa)
  end

  def rjust_all(enum)
    enum.to_a.map{|e| e.to_s.rjust(DAY_LENGTH) }.join
  end
end
```

- （ちょっと仕様＝インターフェースがちがう）
- 1日当たりの幅を定数で指定できるようにしてる。
- 1日から最終日までの文字列をつくってから、カレンダーの幅でsplit → \nでjoin　なるほど、これが最大の違い。まず材料をつくって、それを整形するというこっちの処理の方が拡張性高そう。発想できたかったな。

# 学んだこと
- ふだんRailsで`beginning_of_month`とかつかってるけど、あれRubyの組み込みじゃないんだな。
- `String#center`をはじめて知った。
Ruby手習い（MatchDataクラス）

[https://blog.jnito.com/entry/2019/05/03/121235:title]

上記記事の値札分割問題。

# 自分で書いたコード

```
def split_price(price_text)
  match = price_text&.match(/[\d\s０-９.,-]+|価格未定/)
  num = match ? match[0] : ""
  unit = price_text ? price_text[num.length..-1] : ""
  [num, unit]
end
```

数値部分だけみつけて、全体から数値部分をとりだした。

# 他の回答例

```
def split_price(price_text)
  regex = /([^万円]+)(万?円)/
  regex.match(price_text).to_a[1..2] || [price_text.to_s, '']
end
```

「数値部分だけとりだし、全体から数値部分を削除して単位部分を得る」ではなく、正規表現の中で`()`により数字部分と単位部分をまとめて取得するのがきれいだ。

```
def split_price(price_text)
  price_text.to_s.match(/([^万円]*)(.*)/)[1..2]
end
```
なるほど！`*`をつかうことによって必ずマッチする（少なくとも""がマッチする）ため、matchの戻り値がnilの場合を別に定めなくてすむ。

# 学んだこと
- `String#match(regexp)`や`Regexp#match(string)`の戻り値はMatchDataクラス。
- `MatchData[n]`はn=0で`$&`（マッチした最初のの文字列全体）を返し、n>=1で`${n}`（マッチした最初の文字列のうち、正規表現内の`()`により得られたn番目の部分文字列）を返す。
    - マッチしなければnilを返す。
- `MatchData#to_a`は`[$&, $1, $2, $3...]`を返す。

参考：[https://docs.ruby-lang.org/ja/latest/class/MatchData.html#I_--5B--5D:title]
Ruby手習い（再帰または算数）

[https://blog.jnito.com/entry/2019/05/03/121235:title]

上記記事のボーナスドリンク問題。

# 自分で書いたコード

```
class BonusDrink
	def self.calc(count)
		count + self.bonus_of(count)
	end

	private

	def self.bonus_of(count)
		return 0 if count < 3
		count / 3 + self.bonus_of(count / 3 + count % 3)
	end
end
```

# 他の回答例

- これは全く同じ。
    - [https://qiita.com/sackey_24/items/8fc236bb054aff6b74c8:title]

- 実は再帰つかわなくても解けた模様。
    - [http://yucatio.hatenablog.com/entry/2019/05/07/225412:title]
Ruby手習い（正規表現）

[https://blog.jnito.com/entry/2019/05/03/121235:title]

上記記事のカラオケマシーン問題。

# 自分で書いたコード

```
class KaraokeMachine
	KEYS = %w(C C# D D# E F F# G G# A A# B)

	def initialize(melody)
		@melody = melody
	end
		
	def transpose(diff)
		@melody.gsub(/[A-G]#?/) {|l| KEYS[(KEYS.index(l)+diff)%12]}
	end
end
```

# 出題者による回答例

```
class KaraokeMachine
  SCALE = %w(C C# D D# E F F# G G# A A# B).freeze

  def initialize(melody)
    @melody = melody
  end

  def transpose(amount)
    converter = [SCALE, SCALE.rotate(amount)].transpose.to_h
    @melody.gsub(/[A-G]#?/, converter)
  end
end
```

[https://blog.jnito.com/entry/2014/07/10/091216:title]

# 学んだこと

- 正規表現全然知らなかったがちょっと知った。
- 最初gsubの第一引数を`Regexp.new(KEYS.join('|'))`でつくろうとして、`F#`の`F`の部分がヒットしてしまう問題に直面した。`F`か`F#`をヒットさせたければ`F#?`とすぐに発想できたかった。
- 定数がミュータブルなオブジェクトの場合、再代入は警告だすけど実行できてしまう。再代入できないようにするには`freeze`する必要あり。
- gsubの第二引数に文字列じゃなくてハッシュ渡せる！覚えておきたい。（ヒットした文字列をもとにあれこれ操作したい場合はブロックをつかう。）
- `Array#rotate(count)`配列の要素を回転させるみたいに動かせる。
- `Array#transpose`で行列の転置みたいな操作ができる。
- `converter = [SCALE, SCALE.rotate(amount)].transpose.to_h`カコイイ…
Rubyにおけるローカル変数のスコープ

いまさらだけど、あれ？と思うことがあったのでメモ。

[https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#local:title]

「ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでです。」

試してみる。

```
top_level = 1

class Klass
  in_class = 1
  
  def method
    in_method = 1
    
    [0].each do
      in_block = 1
      
      p defined?(top_level)   # => nil
      p defined?(in_class)    # => nil
      p defined?(in_method)   # => "local-variable"  # これはつかえるのか！
      p defined?(in_block)    # => "local-variable"
    end
    
    p defined?(top_level)   # => nil
    p defined?(in_class)    # => nil
    p defined?(in_method)   # => "local-variable"
    p defined?(in_block)    # => nil
  end
  
  p defined?(top_level)   # => nil
  p defined?(in_class)    # => "local-variable"
  p defined?(in_method)   # => nil
  p defined?(in_block)    # => nil
end

p defined?(top_level)   # => "local-variable"
p defined?(in_class)    # => nil
p defined?(in_method)   # => nil
p defined?(in_block)    # => nil
```

- ローカル変数は宣言されたスコープの外側ではつかえない。上記の例でいうと…
    - クラス内で宣言されたローカル変数は、そのクラスの外側ではつかえない。
    - メソッド内で宣言されたローカル変数は、そのメソッドの外側ではつかえない。
    - ブロック内で宣言されたローカル変数は、そのブロックの外側ではつかえない。

- ローカル変数は宣言されたスコープの配下にある独立したスコープでは（基本的に）つかえない。上記の例でいうと…
    - トップレベルで宣言されたローカル変数は、その配下にあるクラスの中ではつかえない。
    - クラス内で宣言されたローカル変数は、その配下にあるメソッドの中ではつかえない。
    - **ただし！！！**
    - **ある場所で宣言されたローカル変数は、その直下のブロック内でつかうことができる！！！**
    - 上記の例では、メソッド内で宣言したローカル変数が、その配下にあるブロックの中でつかえている。

トップレベル/クラス/ブロック内でローカル変数を宣言した場合も同様に、直下のブロックの中でつかうことができる。

```
# トップレベルの場合
top_level = 1

[0].each do
  p defined?(top_level)  # => "local-variable"
end

# クラスの場合
class Klass
  in_class = 1
  
  [0].each do
    p defined?(in_class)  # => "local-variable"
  end
end

# ブロックの場合
[0].each do
  in_block = 1
  
  [0].each do
    p defined?(in_block)  # => "local-variable"
  end
end
```

ふーん例外的な動きをするんだなー、と思ったのだが、「いやいや、例外ではなくこういう観点からみれば当然のこと」みたいなのがあればすごく教えてほしいです。
しゃくとり法

[https://atcoder.jp/contests/abc130/tasks/abc130_d:title]

「いちばん愚直にやるとO(n\*\*3), 累積和つかってもO(n\*\*2)だな」まで考えたところで詰まったので解説みた。

しゃくとり法の存在はなんとなく知っていたが、そうかこういう場合に使うと一気にO(n)にできるんだ。

しゃくとり法のアイデアだけおさえて書いたらACできた。コードは以下。

```
n, k = gets.split.map(&:to_i)
aa = gets.split.map(&:to_i)
 
val = aa[0]
ans = 0
r = 0
 
(0...n).each do |l|
    val -= aa[l-1] if l > 0
        while r < n - 1 do
	    (ans += n-r) && break if val >= k
	    r += 1
	    val += aa[r]
	end
    if r == n-1
	ans += 1 if val >= k
    end
end
 
p ans
``` 

ここから2つ変更を加えてみた。

- その１
    - これだと尺取り虫の範囲を示すインデックス(l, r)を動かしたときに、範囲内の合計(val)を計算している。
    - 累積和を予め計算しておけば、範囲内の合計を計算する必要がない。（累積和[r]-累積和[l] で求まる。）

- その２
    - 「あるlに対してrを右に動かして、kを超えたところより右側に長い部分列を全てansに加える」と考えたが、これだとrが一番右にいったときに「lを右に動かしてkを超えたらその部分列（のみを）ansに加える」必要があった。（その部分列「のみを」加えるのは、「l-1番目からrまで」とか「l-2番目からrまで」とかいう部分列は既に数えているから。）これだと2つの数え上げ方を組み合わせるのが気持ちよくない。
    - 「あるrに対してlを(rを超えない範囲で)右に動かして、kを下回る直前の部分列よりも左側に長い部分列を全てansに加える」とすると、数え上げ方が1つで済んで気持ちいい。

変更を加えた後のコードが以下。

```
n, k = gets.split.map(&:to_i)
aa = gets.split.map(&:to_i)

cs = 0
acs = [0]
aa.each{|a| acs << acs[-1] + a}

l = 0
ans = 0

(1..n).each do |r|
  while l < r do
    break if acs[r] - acs[l] < k
    l += 1
  end
  ans += l
end

p ans
```
Rubyでメソッドの引数にnilを渡すと、デフォルト引数は適用されない。

タイトルのとおりで初歩的な話ながら、知らなかったのでメモ。


<!-- more -->


```
def add_one(num = 10)
  num + 1
end

p add_one(3)  # => 4

p add_one  # => 11

p add_one(nil)  # => undefined method `+' for nil:NilClass (NoMethodError)
```
Rubyにおける（オブジェクトへの参照の）値渡しを理解しようとして無知を感じた

Rubyのメソッド呼び出しではだいたい全部（オブジェクトへの参照を）値渡しする。


<!-- more -->


# ミュータブルなオブジェクトの場合

```
def method(param)
  p param            # => "hoge"
  p param.object_id  # => 47397028882260
  param.upcase!
  p param            # => "HOGE"
  p param.object_id  # => 47397028882260
end

arg = "hoge"
p arg            # => "hoge"
p arg.object_id  # => 47397028882260
method(arg)
p arg            # => "HOGE"
p arg.object_id  # => 47397028882260
```

メモリの状態を追っていく。

まず`arg = "hoge"`の直後。

|メモリ番地|変数名|オブジェクト番号|中身|
|---|---|---|---|
|0x0000|arg||obj47397028882260（への参照）|
|0x1000||obj47397028882260|（"hoge"という文字列オブジェクト）|

`method(arg)`でメソッド内に入った直後。paramをつくり、オブジェクトへの参照を値渡ししている点に注意。

|メモリ番地|変数名|オブジェクト番号|中身|
|---|---|---|---|
|0x0000|arg||obj47397028882260（への参照）|
|0x0001|param||obj47397028882260（への参照）|
|0x1000||obj47397028882260|（"hoge"という文字列オブジェクト）|

`param.upcase!`の直後。文字列オブジェクトはミュータブルなので、既存のオブジェクトが書き換えられる。

|メモリ番地|変数名|オブジェクト番号|中身|
|---|---|---|---|
|0x0000|arg||obj47397028882260（への参照）|
|0x0001|param||obj47397028882260（への参照）|
|0x1000||obj47397028882260|（"HOGE"という文字列オブジェクト）|

なので、メソッドからでた後に`arg`は"HOGE"を返す。

# イミュータブルなオブジェクトの場合

```
def method(param)
  p param            # => 555
  p param.object_id  # => 1111
  param = param + 10
  p param            # => 565
  p param.object_id  # => 1131
end

arg = 555
p arg            # => 555
arg.object_id  # => 1111
method(arg)
p arg            # => 555
p arg.object_id  # => 1111
```

`arg = 555`の直後。

|メモリ番地|変数名|オブジェクト番号|中身|
|---|---|---|---|
|0x0000|arg||obj1111（への参照）|
|0x1000||obj1111|（555という数値オブジェクト）|

`method(arg)`でメソッド内に入った直後。paramをつくり、オブジェクトへの参照を値渡ししている点に注意。

|メモリ番地|変数名|オブジェクト番号|中身|
|---|---|---|---|
|0x0000|arg||obj1111（への参照）|
|0x0001|param||obj1111（への参照）|
|0x1000||obj1111|（555という数値オブジェクト）|

`param = param + 10`の直後。数値オブジェクトはイミュータブルなので、既存の数値オブジェクトはそのままに、新しい数値オブジェクトがつくられる。

|メモリ番地|変数名|オブジェクト番号|中身|
|---|---|---|---|
|0x0000|arg||obj1111（への参照）|
|0x0001|param||obj1131（への参照）|
|0x1000||obj1111|（555という数値オブジェクト）|
|0x1001||obj1131|（565という数値オブジェクト）|

なので、メソッドからでた後に`arg`は555を返す。

# おわりに

参考：[https://magazine.rubyist.net/articles/0032/0032-CallByValueAndCallByReference.html:title]

なんかまとめたけど、やっぱ「Rubyのオブジェクトがメモリ上でどう表現されるのか」とか全然わかってないから大事なことをごまかしたまま、イメージ図でふんわり理解したフリをしているだけだな。以下の記事などを理解できたらよさそう。

[https://qiita.com/kamina_zzz/items/0540f663832e07ee1b10:title]
"<=>"メソッドのオーバーライドによる比較の実装

名著"[Effective Ruby](https://www.amazon.co.jp/Effective-Ruby-Peter-J-Jones/dp/4798139823)"に「"<=>"とComparableモジュールで比較を実装しよう」と書いてあったので江戸時代の身分制度を実装してみた。


<!-- more -->


```
class Rank
  include Comparable
  attr_reader :name
  NAMES = ['士', '農', '工', '商'].map(&:freeze).freeze

  def initialize(name)
    unless NAMES.include?(name)
      raise(ArgumentError, "Argument must be any of #{NAMES}")
    end
    @name = name
  end

  def <=> (other)
    NAMES.index(self.name) <=> NAMES.index(other.name)
  end
end
```

```
['農', '工', '士', '商'].map{|s| Rank.new(s)}.sort.map{|rank| rank.name} 
# => ["士", "農", "工", "商"]

Rank.new('農')  < Rank.new('商')  # => true
Rank.new('農')  > Rank.new('商')  # => false
Rank.new('士') == Rank.new('士')  # => true
Rank.new('工').between?(Rank.new('士'), Rank.new('商'))  # => true
```
おしまい。
ビンゴカード作成問題を解いてみた

問題は[こちら](https://blog.jnito.com/entry/2015/02/09/101018)。

# 最初に書いたコード


<!-- more -->


```
class Bingo
	SIZE = 5

	def generate_card
		format_a_row = Proc.new do |array|
			array.map {|f| f.to_s.rjust(3)}.join(' |')
		end

		header = format_a_row("BINGO".chars)
		rows = (1..SIZE).map do |i|
			(1..SIZE).map {rand((i-1)*15+1..i*15)}
		end.transpose
		
		rows[(SIZE-1)/2][(SIZE-1)/2] = ""		
		rows.map! {|r| format_a_row(r)}

		puts [header, *rows].join("\n")
	end
end

Bingo.new.generate_card
```

出力結果は以下。

```
  B |  I |  N |  G |  O
  9 | 21 | 40 | 46 | 74
  9 | 29 | 45 | 59 | 67
  6 | 22 |    | 56 | 61
 12 | 18 | 34 | 51 | 66
  7 | 28 | 36 | 47 | 62
```

transposeすぐ発想できたのはよかった。

ん…？数字重複してるじゃん！これじゃだめだ。

# 修正したコード

[解答例](https://blog.jnito.com/entry/2015/03/06/085433)もみる。

あと考えたらheaderとbodyの整形まとめた方がいいな。

```
class Bingo
	SIZE = 5
	FORMAT = Array.new(5, '%3s').join(' |')

	def generate_card
		rows = (1..SIZE)
		.map {|i| [*((i-1)*15-1..i*15)].sample(5)}
		.transpose.tap {|t|	t[(SIZE-1)/2][(SIZE-1)/2] = ""}
		
		puts rows.unshift("BINGO".chars).map {|r| FORMAT % r}.join("\n")
	end
end

Bingo.new.generate_card
```

tapってこうやってつかうんやな…すっきりやな…。

# 学んだこと

### String#%(args)

sprintf的なフォーマットができる。[リファレンス](http://doc.okkez.net/2.3.0/view/method/String/i/=25)

```
> "--%s--" % "hoge"  # => "--hoge--"

# 引数に配列もわたせる
> "--%s--%s--" % ["hoge", "fuga"]  # => "--hoge--fuga--"

# 幅も指定できる（右寄せになる）
> "--%10s--" % "hoge"  # => "--      hoge--"
```

### ランダムな値

をとるときには、重複を許容する/しないを意識すべし。