OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 16.04 LTSにRe:VIEWを入れる

公式に書いてあるように実行

```bash

gem install review
```

PDFを作成したいので、TeXLiveリポジトリを追加

```bash

sudo apt-add-repository ppa:texlive-backports/ppa
```

そんで、インストール

```bash

sudo apt-get install texlive-lang-cjk texlive-fonts-recommended
```

Quick Startやってみる

```bash

review-init hello
cd hello
rake epub  ## generating EPUB
rake pdf   ## generating PDF
```

book.epubとbook.pdfができる。
Jenkinsのビルド情報をMANIFESTにAnt/Mavenで埋め込む

## 環境
Jenkins : Ver 2.77

## Maven(jar)の場合
```
<build>
	<plugins>
		<plugin>
			 <groupId>org.apache.maven.plugins</groupId>
			 <artifactId>maven-jar-plugin</artifactId>
			 <configuration>
				<archive>
				  <manifestEntries>
					<BUILD_NUMBER>${env.BUILD_NUMBER}</BUILD_NUMBER>
					<BUILD_ID>${env.BUILD_ID}</BUILD_ID>
					<BUILD_URL>${env.BUILD_URL}</BUILD_URL>
					<JOB_NAME>${env.JOB_NAME}</JOB_NAME>
					<BUILD_TAG>${env.BUILD_TAG}</BUILD_TAG>
					<JENKINS_URL>${env.JENKINS_URL}</JENKINS_URL>
					<EXECUTOR_NUMBER>${env.EXECUTOR_NUMBER}</EXECUTOR_NUMBER>
					<WORKSPACE>${env.WORKSPACE}</WORKSPACE>
					<JOB_URL>${env.JOB_URL}</JOB_URL>
					<!-- git -->
					<GIT_COMMIT>${env.GIT_COMMIT}</GIT_COMMIT>
					<!-- svn -->
					<SVN_REVISION>${env.SVN_REVISION}</SVN_REVISION>
				  </manifestEntries>
				</archive>
			 </configuration>
		</plugin>
	</plugins>
</build>
```

## Maven(war)の場合
```
<build>
	<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
				<archive>
				  <manifestEntries>
					<BUILD_NUMBER>${env.BUILD_NUMBER}</BUILD_NUMBER>
					<BUILD_ID>${env.BUILD_ID}</BUILD_ID>
					<BUILD_URL>${env.BUILD_URL}</BUILD_URL>
					<JOB_NAME>${env.JOB_NAME}</JOB_NAME>
					<BUILD_TAG>${env.BUILD_TAG}</BUILD_TAG>
					<JENKINS_URL>${env.JENKINS_URL}</JENKINS_URL>
					<EXECUTOR_NUMBER>${env.EXECUTOR_NUMBER}</EXECUTOR_NUMBER>
					<WORKSPACE>${env.WORKSPACE}</WORKSPACE>
					<JOB_URL>${env.JOB_URL}</JOB_URL>
					<!-- git -->
					<GIT_COMMIT>${env.GIT_COMMIT}</GIT_COMMIT>
					<!-- svn -->
					<SVN_REVISION>${env.SVN_REVISION}</SVN_REVISION>
				  </manifestEntries>
				</archive>
            </configuration>
        </plugin>
    </plugins>
</build>
```

## Antの場合
```
<property environment="env" />
～～～
<target name="jar" >
	<jar destfile="${dist.dir}/${ant.project.name}.jar">
		<fileset dir="${root.dir}/bin" />
		<manifest>
		    <attribute name="Built-By" value="${user.name}"/>
		 <section name="Jenkins">
		    <attribute name="BUILD_NUMBER"  value="${env.BUILD_NUMBER}"/>
		    <attribute name="BUILD_ID"  value="${env.BUILD_ID}"/>
		    <attribute name="BUILD_URL"  value="${env.BUILD_URL}"/>
		    <attribute name="JOB_NAME"  value="${env.JOB_NAME}"/>
		    <attribute name="BUILD_TAG"  value="${env.BUILD_TAG}"/>
		    <attribute name="JENKINS_URL"  value="${env.JENKINS_URL}"/>
		    <attribute name="EXECUTOR_NUMBER"  value="${env.EXECUTOR_NUMBER}"/>
		    <attribute name="WORKSPACE"  value="${env.WORKSPACE}"/>
		    <attribute name="JOB_URL"  value="${env.JOB_URL}"/>
		    <!-- git -->
		    <attribute name="GIT_COMMIT"  value="${env.GIT_COMMIT}"/>
		    <!-- svn -->
		    <attribute name="SVN_REVISION"  value="${env.SVN_REVISION}"/>
		 </section>
		</manifest>
	</jar>
</target>
```
機械学習論文読みメモ_97


[CliqueCNN: Deep Unsupervised Exemplar Learning](https://arxiv.org/abs/1608.08792), NIPS2016
Exemplar learningにおいては，代表点として少量（あるいは一つ）のpositiveサンプルを
選び，それと大量のnegative sampleとを組み合わせて学習を行う手法である．
この手法を元に，教師なしの類似度学習を行う．
そのためにはCNNとサンプルの類似度学習を同時に行う手法を用いる．
序盤は少量のサンプル間に対して類似，非類似が分かるとする．
するとそれ以外のサンプルに対してはそれが分からないため，
そのままでは上手く推移律を満たした類似度学習を行う事が出来ない．
そこでCNN学習のために与えるバッチのサンプル選択を行う最適化を
さらに考え，この最適化は各バッチ内は類似しているが，各バッチ間は
非類似であるように，最適化していく．
CNNは結局，これらバッチ（クラスタ）の分類タスクを学習する．
これらを行っていく事により，結果CNNは各サンプルの類似度を学習可能になる．

[Bayesian Optimization with Robust Bayesian Neural Networks](https://papers.nips.cc/paper/6117-bayesian-optimization-with-robust-bayesian-neural-networks), NIPS2016
Bayesian optimizationは評価が困難なblack-boxモデルに対するハイパーパラメータ最適化手法として一般的な手法である．
しかし，対象モデルの規模が大きい場合にはスケールし辛い．
本論ではこの問題に対して，出来る限りbayesianな扱いを保ったまま，neural networkを用いたbayesian optimizationを行う手法を提案する．
特にstochastic gradient Hamiltonian Monte Carloを通したrobustnessとスケーラビリティの確保を行う．

[VARIATIONAL INTRINSIC CONTROL](https://arxiv.org/abs/1611.07507)
エージェントが獲得可能な潜在的なオプションを探索するための教師なし強化学習手法を
提案する．
この手法では，選択可能なオプションとその最終到達状態の間の相互情報量を評価指標に用いる事で，
エージェントがある程度確実の到達可能な状態の数を最大化する事で実現する．
特に複数のオプションが同じ状態に収束する事が分かっている．
その中で似たようなオプションが近傍へ集まるような特徴埋め込みを行う事で
より汎化性能を向上させる．
この空間を用いて外部利得の最大化のための探索を効率的に行う事が可能だし，
Empowerment，つまり外部利得の頼る事なく環境の探索のよる環境へのコントロール方法
の獲得を効率良く行う事が可能になる．
これはエージェントが学習可能なコントロールを学ぶという意味で，
任意のコントロールとは違う．
また従来手法にあるような，環境から与えられる観測を予測する事とも
違っている（環境を知らずともコントロールは可能）
こんなことを書こうかと思っているリスト

Qiitaとかブログとかにこんなことを書こうかとふと思うのだが、メモっておかないと忘れるのと、なかなか書けないので背中を押してもらいたいという理由から、とりあえず概要だけ公開してみて反応を求めてみるテスト。ライトニングトークのネタになるかもなー。

- 絵の描き方
数か月前に絵を描こう的な記事があったのに触発されて、じゃー具体的にどんなふうに絵を描けばいいのよ、を書こうと思った。UMLのダイアグラムを描けると認識共有しやすいよねとか、時間軸をきちんと取ろうとか、UMLではバウンダリを左に書くけどMQとかネットワーク屋は右に書くので混乱するとかいう話。

- URL/URIの説明
SIer的には課題管理Excelとかをやりとりしてるけど、その課題ってプロジェクトでユニークな番号ついてますか的な話。


- 時刻とかタイムゾーン
1752年9月とかオルソンとかカトマンズとかの話。


- SSL
クライアント証明書について詳しく知りたいので調べたら書くメソッド。
【備忘録】MacのPHPからPostgreSQLに接続する準備【PHP】【PostgreSQL】

# MacのデフォルトのPHPではPostgreSQLに接続できない問題

## 【状況】 PostgreSQL使用時にDB接続エラーに遭遇した
PHPからDBに接続しようとすると、以下のようなエラーが出てしまいました😇  

```
  [PDOException]         
  could not find driver 
```

## 【解決策】 そんな時はbrewで楽にインストールしたいですよね？

> --with-postgresql

オプションを使えば、使用中のphpにオプション追加して、インストールが可能です。

```
$ brew update
$ brew upgrade
↑ 最近アップデート、アップグレードしてないわーって方はこちらを

$ brew unlink php71
↑ 使用中のphpをunlinkしないと、コンフリクトしてエラーって言われる場合があります

$ brew reinstall php71 --with-postgresql
$ brew link php71
```

### 【補足？】 違うエラーが出たんですけど...

ZLIBがないよって言われちゃう時があります。

```
$ brew reinstall php71 --with-postgresql
..
省略
..
checking if the location of ZLIB install directory is defined... no
configure: error: Cannot find libz
```

そんな時は、

```
$ xcode-select --install
```
で、インストールしてあげましょう。
簡易サーバを起動して、なんか処理をして結果を返却する方法

## やりたいこと
別サーバにクエリつきの要求をcurlで送信し、引数に応じた値を返却値として受け取る
※サーバBにncコマンドがない、かつ勝手に入れるのもよろしくなかったので、
こんな手法を取りました。

## 環境
サーバA(要求を送る方)
CentOS Linux release 7.2.1511 (Core)

サーバB(要求を受ける方)
Red Hat Enterprise Linux Server release 7.1 (Maipo)

なお両方ともにサーバZを踏み台として経由していますが関係ないと思います。

pythonのバージョン(サーバB)
Python 2.7.5

curlのバージョン(サーバA)
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.19.1 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3

## 準備(全てサーバB)
1.ディレクトリの作成
任意のディレクトリに「cgi-bin」という名前のディレクトリを作成します。

2.スクリプトの作成
bash,perl,pythonなどでスクリプトを作成してcgi-binに配置します。
スクリプトには実行権限を付与してください。
例としてbashスクリプトを提示します。
(私はperl,pythonは書けないです。)

```bash:[任意のディレクトリ]/cgi-bin/test.bash
#!/bin/bash

echo "Content-type:text/plain"
echo ""

param=$(echo ${QUERY_STRING} | awk -F= '$0=$2')

echo ${param}
```

3.ディレクトリの移動***(重要！！)***
これで結構ハマりました。。
「cgi-bin」がある[任意のディレクトリ]にcdしてください。
(これがなくてもできそうな気がしますが、できませんでした。)

4.簡易サーバの起動
下記コマンドを***root以外のユーザで***実行します。
rootで実行するとCGIHTTPServerのモジュールの実行途中で異常終了します。

※補足
下記コマンドを実行したディレクトリが簡易サーバのルートディレクトリとして扱われます。

```
python -m CGIHTTPServer
```
必要に応じて、

```
python -m CGIHTTPServer &
```

や、

```
nohup python -m CGIHTTPServer &
```
としてもよいです。
なおpython3の場合はこれではダメなのですが、
すみません、調べてません。

これで、サーバBで簡易サーバが起動しました。
なおポートはデフォルトでは8000を使用します。
ポートを変更したい場合は下記のようにしてください。

```
python -m CGIHTTPServer 10000
```

## curlで要求を投げる(サーバA)
以下のようにcurlを投げてみます。

```
curl "http://[サーバBのIP]:8000/cgi-bin/test.bash?q=hello"
```

すると「hello」の文字が標準出力に表示されたと思います。

クエリである「q=hello」の部分が「test.bash」では「${QUERY_STRING}」で取得できますので、後は煮るなり焼くなりお好きにどうぞ。

以上

## 参考にさせて頂いたサイト様
[コマンド1つで今すぐWebサーバを起動させるためのワンライナー(Ruby or Python) - 元RX-7乗りの適当な日々](http://d.hatena.ne.jp/rx7/20090812/p1)
[bashでCGIを実行する  小粋空間](http://www.koikikukan.com/archives/2014/04/11-015555.php)
[一行でCGIサーバー(1)python編 - Qiita](http://qiita.com/wan-liner/items/15312af7eca45c67f4fd)
[2013-11-28 - since 2010](http://d.hatena.ne.jp/ksnt/20131128)
Rails:5.1.2でCSSファイルを複数読み込む

# CSSファイルの読み込み方
Ruby on Rails ではCSSを読み込むときにいくつかの設定が必要である。
実際、スタイルシートのタグがrubyには用意されているのでそれで簡単に読み込むことができる。
いかがそのコード例である。
<%= stylesheet_link_tag    "css/bootstrap", :media => "all" %>
このコードの例はasset/css/bootstrapのcssファイルをhtml.erbファイルに込みこむという作業である。このパーセントはrubyのコードである。


## レイアウトファイルを編集する。
asset/view/layoutsにapplication.html.erbが入っている。このファイルはすべてのすべての情報を集めるファイルであるため、初期の段階ではすべてのcssファイルをすべて読み込むことになっている。まずはこのコードを消しましょう。
削除するコード

```ruby:application.html.erb
<!DOCTYPE html>
<html>
  <head>
  <title>Sheen</title>
    <style>
    body { 
  padding: 45px 0 0 0;
}
    </style>
        <title>PaperclipTest</title>
    <%= csrf_meta_tags %>

    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    </br>
    <%= yield %>
  </body>
</html>

```
## application.erbを編集する。
この項目を編集することによって、cssを許可することになる。プリコンパイルという作業である。
application.erb に以下のコードを追加する。Rails.application.config.assets.precompile += %w( css/* )
この時、*はワイルドカードといいcssファイル以下のすべてのファイルが対象とできる。

  [1]: http://google.com/        "Google"
  [2]: http://search.yahoo.com/  "Yahoo Search"
  [3]: http://search.msn.com/    "MSN Search"
```ruby:application.rb
# Be sure to restart your server when you modify this file.

# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'

# Add additional assets to the asset load path.
# Rails.application.config.assets.paths << Emoji.images_path
# Add Yarn node_modules folder to the asset load path.
Rails.application.config.assets.paths << Rails.root.join('node_modules')
Rails.application.config.serve_static_assets = true
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in the app/assets
# folder are already added.
 Rails.application.config.assets.precompile += %w( css/* )
```

## producation環境にアップする場合
herokuなどのサーバーにアップする際はconfig file を編集しないと行けない。
config/initializers/asset.rb
を編集する。
以下のコードを追加しましょう。
Rails.application.config.serve_static_assets = true

##まとめ
以上の作業によって、独立したCSSファイルを互いに影響を受けずに使用することができる。
世界一簡単な「ファイル名を指定して実行」の履歴のクリア(全消し)手順

「ファイル名を指定して実行」の履歴削除の手順自体はWeb上に沢山転がっているのですが、
どれも「レジストリエディターを開いて…」といった手順で…。

僕はレジストリエディターの深い深い階層を潜っていくのが非常に苦手なので、
さくっと消せる手順を作成しました。

＃Windows10でしか検証していないです…。

# 1. <kbd>Windows</kbd>＋<kbd>R</kbd>を押します。
押します。

# 2. 以下をコピペします。

```powershell
powershell "rm HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU"
```



# 3. 実行します。

おわり。
Firebase tips(Storage rule)

# FIREBASE TIPS

## 1. Allow user to be able to upload profile.png in own directory.

```:storage.rule
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read: if request.auth != null;
    }
    
    match /images/{userId}/profile.png {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}
```

- TEST1: UID of coffeeandcode.tokyo@gmail.com is eFcFmn2lbqTzXf83vtHPdSCID9W2

```html:test1
<script>
    firebase.initializeApp(config);
    firebase.auth().signInWithEmailAndPassword('coffeeandcode.tokyo@gmail.com', 'xxxxx').catch((error) => {
        console.log('code:' + error.code + 'message' + error.message);
    });

    firebase.auth().onAuthStateChanged(function (user) {
        if (user) {
            let uid = user.uid;
            console.log('login success');
        } else { }
    });

    var storage = firebase.storage();
    function upload() {
        var file = document.getElementById('loadFile').files[0];
        var storageRef = storage.ref('/images/eFcFmn2lbqTzXf83vtHPdSCID9W2/profile.png');
        storageRef.put(file).then(function (snapshot) {
            console.log('Uploaded a blob or file!');
        });
    }
</script>
```

`result`
![result.png](https://qiita-image-store.s3.amazonaws.com/0/199460/40f2adf7-a637-b17c-089b-e0867257778c.png)

`result`
![result2.png](https://qiita-image-store.s3.amazonaws.com/0/199460/ad1d11d2-d4da-518f-3994-1059f1863205.png)

- TEST2: UID of coffeeandcode.tokyo2@gmail.com is not eFcFmn2lbqTzXf83vtHPdSCID9W2

```html:test2
<script>
    firebase.initializeApp(config);
    firebase.auth().signInWithEmailAndPassword('coffeeandcode.tokyo2@gmail.com', 'xxxxx').catch((error) => {
        console.log('code:' + error.code + 'message' + error.message);
    });

    firebase.auth().onAuthStateChanged(function (user) {
        if (user) {
            let uid = user.uid;
            console.log('login success');
        } else { }
    });

    var storage = firebase.storage();
    function upload() {
        var file = document.getElementById('loadFile').files[0];
        var storageRef = storage.ref('/images/eFcFmn2lbqTzXf83vtHPdSCID9W2/profile.png');
        storageRef.put(file).then(function (snapshot) {
            console.log('Uploaded a blob or file!');
        });
    }
</script>
```
`result`
![result.png](https://qiita-image-store.s3.amazonaws.com/0/199460/7491e4cd-28d6-7e80-74ae-cfb86f3372f4.png)
指定長・個数のランダム数字列生成バッチ（Windows編）

# はじめに
例えばWindowsでテスト用のダミーファイルを生成する際、一般的には`fsutil`コマンドをよく使いますが、今回は完全にランダムな文字列のファイルを（出来るだけ同じサイズで）作りたかったので、`%RANDOM%`を使って、指定した個数・長さのランダム数字列をファイルに出力するバッチを作成してみました。

# 実装例

この実装例ではファイル名、数列の個数・桁数などの設定はINIファイルに切り出しています。（毎回バッチファイル編集するのもめんどくさいですし・・・・・・）

（9/29追記）
コメント欄で @kshibamo さんにご指摘いただきましたが、確かに環境変数PATHを書き換えているように見えるのでちょっとパラメータ名直してます。ご指摘ありがとうございました。

```ini:makeseq.ini
;生成するファイル名
FILEPATH=seq.txt

;生成する数列の数
SEQNUMBER=5

;生成する数列の桁数
SEQLINES=10

```

バッチファイルの実装例は以下の通り。
要はINIファイルで指定した回数分だけfor文を回して、その都度`%RANDOM%`の下1桁を切り出して、ファイルに書き出しています。試してないけど10掛けて32768で割るのとどっちが早いんだろ？
`%RANDOM%`の範囲が0～32767なので、実は0～9の出る確率は等しく1/10ではありませんが、0.1%も差はないので、そこは誤差の範疇ということで見逃して貰えれば・・・・・・

あと注意してほしい点として、for文の中で`%RANDOM%`を使う場合、ちゃんと`setlocal enabledelayedexpansion`（いつも思うけど見辛い・・・・・・）してあげないと、おんなじ値が何度も繰り返し出ちゃうため、そこは気を付けてください。詳しくは「遅延環境変数」で検索、検索ゥー！（手抜き）

```bat:makeseq.bat
@echo off
rem 指定長・個数のランダム数字列生成バッチ
setlocal enabledelayedexpansion

%~d0
cd %~d0%~p0
cd

rem INIファイル読み込み
for /F "delims== tokens=1,2" %%i in (makeseq.ini) do (
  set %%i=%%j
)

rem 数字列の個数分繰り返し
for /l %%i in (1,1,%SEQNUMBER%) do (
  rem 数字列の指定長分1文字のランダム数字をファイルに出力
  for /l %%i in (1,1,%SEQLINES%) do (
    set /P X=!RANDOM:~-1!<NUL >> %FILEPATH%
  )
  rem 改行挿入
  echo.>>%FILEPATH%
)

pause
```

実際にバッチを叩いて数列を出力すると、以下のような感じになります。

```text:出力例.txt
0315409597
3361260796
6949076383
9725482743
7695448784

```

# おわりに
`fsutil`コマンドを叩いた時と比較すると、NULL文字ではない完全にランダムな数列が出来る、管理者権限不要という、といったところがメリットでしょうか。
ただし、for文を何度もぐるぐる回してその都度ランダムな数値を生成しては書き出している関係上、大きい数列を生成するとかなり遅いので、用途に合わせて使い分けする形にはなるかと。

ただ、for文でぐるぐる回すところとか、`%RANDOM%`の下1桁だけ切り出すところとか、もうちょっとスマートなやり方がある気はします。
serverless frameworkを使って本格的なAPIサーバーを構築（Express編）


# serverless frameworkを使って本格的なAPIサーバーを構築（Express編）
最近、推しメンの　serverless framework の記事の第３弾です。
保守メンテが楽になりつつも、実戦で速攻で構築ができます。

## 目次
- [serverless frameworkを使って本格的なAPIサーバーを構築（魅力編）](https://qiita.com/okamu_/items/e246887cb6f2621ad40a)
- [serverless frameworkを使って本格的なAPIサーバーを構築（ハンズオン編）](https://qiita.com/okamu_/items/0f1055e5c91ed99ebec6)
- **[serverless frameworkを使って本格的なAPIサーバーを構築（Express編）](https://qiita.com/okamu_/items/c19e2a682afe41a47eb1)←　今ここ**
- [serverless frameworkを使って本格的なAPIサーバーを構築（テストコード編）](https://qiita.com/okamu_/items/2967726eef27420e6c63)


![framework_repo.png](https://qiita-image-store.s3.amazonaws.com/0/62822/e9ffa044-cdaf-c024-2dba-b670407ab1dd.png)


前回まで、serverless frameworkのハンズオンの記事まで書きました。
今回は、serverless frameworkで 「 **lambda + APIGateway + DynamoDB** 」　の構成ですが、**Express**を導入しローカルで実行できるようにします。

## この記事でできるようになること
- **Lambda上でExpressを動かす**
- **ローカルでAPIを試す環境を構築する**

## Expressを使う旨味
- サーバレスでサービス全体を作るのはしんどい
- **ローカルで開発＋テストできるようになる**
- Expressは、RubyのSinatraのようなシンプルなMVCフレームワークなので**とっつきやすい**
- **packege.jsonをfunctionごとに用意しなくて良くなる!!**

## 前準備
- expressを**install**しておく
- Lambda上でExpressを動かすツールとして、「[aws-serverless-express](https://github.com/awslabs/aws-serverless-express)(公式)」と「[express-on-serverless](https://github.com/toduq/express-on-serverless)」というものがあります。本来公式のものを使うべきですが、今回はexpress-on-serverlessを使用しました。

```
$ yarn add express
$ yarn add express-on-serverless
```



## まずは、単純にJSONを返してみる(Express)
- serverless.ymlを編集します
    - /配下をAnyですべてExpressに渡します

```serverless.yml
functions:
  app:
    handler: functions/api/api.handler
    events:
      - http:
          path: /{proxy+}
          method: any
          cors: ${self:custom.cors_enabled.${opt:stage, self:provider.stage}}
```

- api.jsでは、`/hello` がきたらJSONを返すようにしておきます。

```functions/api/api.js
'use strict';

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(bodyParser.json());

const response = {
  statusCode: 200,
  body: JSON.stringify({
    message: 'Go Serverless v1.0! Your function executed successfully!'
  }),
};

app.get("/hello", function(req, res, next){
  res.json(response);
});
exports.handler = require('express-on-serverless')(app);
```


## ローカルで動かしてみる
- 先ほどの、シンプルなアプリケーションをローカルで動かして見ましょう
- functions/api/api.jsに以下を追記してください。

```functions/api/api.js
// 追記する
if (process.env.NODE_ENV === 'dev') {
  app.listen(3000,  () => {
    console.log("Node.js is listening to PORT: 3000");
  });
}
```

そしてサーバーを起動します `$ node functions/api/api.js`

すると、[http://localhost:3000/hello](http://localhost:3000/hello) で先ほどのAPIにアクセスすることができます！！


- これで、**deploy**しても、前回と同じようなAPIを作ることができます！！

```
$ sls deploy -v -s dev
```

デプロイが成功し、APIにアクセスすると
前回Expressを使わずに作ったAPIと同じレスポンスになると思いますが、ローカルで開発できるようになったので、**開発スピードは5000兆倍**になります！！

## まとめ
- serverlessにExpressを乗せて使うと、開発スピードが5000兆倍になりました！！
- 今まで通り、serverlessの旨味を生かしたイベントのフックでの発動＋APIの構築ができるようになり利益ありありです。

## 次回
- serverless frameworkを使って本格的なAPIサーバーを構築（テストコード編）です！！
gitlabとかでオートマージされるときの注意点

## 背景

- 複数人で開発していると自分のプルリクがマージされる前に別の人のコードがマージされているケースがよくある
- 複雑なコンフリクトが起きていない場合gitが勝手にマージしてくれる
- gitがよしなにマージしてくれた時に内容を確認しないでミスったので注意点を記録しておく

## サンプル

- masterブランチの内容が以下の状態でスタートする

```text:REDME.md[master]
今日のスタメン

(二) 田中賢
(中) 森本
(右) 稲葉
(一) 高橋信
(指) スレッジ
(三) 小谷野
(左) 糸井
(捕) 鶴岡
(遊) 金子誠
```

- このmasterブランチをベースにdev1ブランチとdev2ブランチを作成する
- dev1ブランチで以下の内容に変更をしてmasterにマージした

```text:REDME.md[dev1]
今日のスタメン

先発：ダルビッシュ
(二) 田中賢
(中) 森本
(右) 稲葉
(一) 高橋信
(指) スレッジ
(三) 小谷野
(左) 糸井
(捕) 鶴岡
(遊) 金子誠
```

- 特に問題は起きないのでmasterブランチの内容は以下に更新される

```text:REDME.md[master]
今日のスタメン

先発：ダルビッシュ
(二) 田中賢
(中) 森本
(右) 稲葉
(一) 高橋信
(指) スレッジ
(三) 小谷野
(左) 糸井
(捕) 鶴岡
(遊) 金子誠
```

- dev2ブランチで以下の内容に変更する

```text:REDME.md[dev2]
今日のスタメン

(二) 田中賢
(中) 森本
(右) 稲葉
(一) 高橋信
(指) スレッジ
(三) 小谷野
(左) 糸井
(捕) 鶴岡
(遊) 金子誠
(投) ダルビッシュ
```
- masterブランチはdev1がマージされているので、dev2ブランチを作った時から更新されている
- でもgitがオートマージしてくれるのでプルリクのマージボタンはそのまま押せる
- プルリクをマージするとmasterは以下の内容になる

```text:REDME.md[master]
今日のスタメン

先発：ダルビッシュ
(二) 田中賢
(中) 森本
(右) 稲葉
(一) 高橋信
(指) スレッジ
(三) 小谷野
(左) 糸井
(捕) 鶴岡
(遊) 金子誠
(投) ダルビッシュ
```

- しかしこれはではダルビッシュと2回書いてしまっているので意図した結果ではない
- 自動でマージされたからといって内容を確認しないと意図しないコードのまま進んでしまう
- このケースだと見ればすぐわかるけど、もっと複雑なコードだとテストしないと気づけない

## まとめ

- オートマージしてくれるの便利だけどたまにこういうこともあるから注意
- 複数人開発ってめんどくさい
- github flowに従えばこれは起きないのでそういう運用にしてもいいかも
上の階の人の騒音を記録するために、部長が自腹で買ってくれたRaspberry Piを使う

## かくかくしかじか

こちらの続きです。

上の階の人の騒音をAmazon Dash ButtonとGoogle Sheetsで記録する
https://qiita.com/momoiroshikibu@github/items/d6b30959725eea8c2038

深く考えずに、「次回、Raspberry Pi編。」と書いてしまったので。
先に宣言しておきますが、中身はスカスカですので、ご了承ください。

## 一言で言うと

これを
<img width="896" alt="before.png" src="https://qiita-image-store.s3.amazonaws.com/0/7745/cda9643b-945d-09f8-6363-59623aed0964.png">


こうしました。
<img width="909" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/7745/d6012607-742b-8e53-8d3d-23f100c9ccfb.png">


これだけ。
運用して1ヶ月くらいが過ぎました。


## きっかけ

Dash Buttonにより、騒音の日時を記録できるようになったものの…

妻「今日、ボタン押しておいたよ、記録されてるかな？」
私「あっと、、MacBook起動してなかった…」
妻「じゃ、押しても意味なかったってこと？」
私「うん、ごめんね…」

という障害が発生。

Dash Buttonのイベントを受けるために、MacBook Pro以外に何かのサーバーを用意することにした。
MacBook Proでも良かったのだけれど、そうすると、持ち歩けなくなってしまう。
(他に持っていたiMacなどは、売ってしまった。)


## この賃貸マンションの片隅に

部屋の片隅に、Raspberry Piを見つけた。電源は入っていなかった。
これを使うことにした。けど、葛藤があった。

このRaspberry Piは、半年くらい前に部長が自腹で買ってくれたものだった。(ありがとうございます)
自分が主催している社内の勉強会用に、という目的だったけど、
1台をみんなで触るにはいろいろと手間なことがあって、使用機会が無かった。
あと、活用するシーンが意外と思い浮かばなかった。

ということで、活用した。
いえ、活用させて頂きました。部長、ありがとうございます。


## Raspberry Piの用途
Dash Buttonから発せられるARPのブロードキャストを受け取り、Google Sheets APIにHTTP POSTするだけ。
そのために、Node.jsの環境があればそれで良い。ただそれだけ。
あとは騒音問題が解決するまで、ずっと動いていて欲しい。
妻のボタンプッシュを無駄にしないで欲しい。それだけ。

つまり、用途的には、Raspberry Piである必要は全くない。

黒くて強そうなかっこいいサーバーに比べて、電気代が安い。はず。メリットはこれくらいでは。
実際、いくらかかっているかは正確にわからないけど、たぶん安い。妻からの苦情も来ていない。
あ、もう一つメリットが。すごく小さい。


## 環境構築

ただデスクの上に置いただけ。ACアダプタがつながっている。
ソフトウェア面では、大したことをしていないので省略。何も困難がなかった。

<img width="511" alt="raspberry-on-the-desk.png" src="https://qiita-image-store.s3.amazonaws.com/0/7745/7fd0c383-8987-1b9e-3f92-22bf77fd0f96.png">


# やってみてわかったこと

良かったこと。

- もともとの障害が解消。
- 意外と安定して動作している。
- 一度もプロセスが落ちていない。
- デスクの上に置いてある。掃除しやすい。
- 「何もしてないのに壊れた」イベントが発生しない。
- HHKBも使える。


悪かったこと。

- なんか、赤と黄のLEDが、夜中にチカチカしている。(妻から、やんわりと苦情あり)
- 安定して動きすぎてて、なんか逆に寂しい。
- Raspberry Pi、もっとちゃんとした用途で使ってみたい。宝の持ち腐れ感。


# 各種数値など

サーバーがどういう状態か、少しは把握してみようかなと思ったけど、SSHの鍵が見つからない。
メルカリで旅立っていったMacBookを初期化した時かな。きっとそうだな。

- ロードアベレージ
- CPU使用率
- `uptime`

すべて不明。ファンも回っていない。あ、そもそもついてないから当然か。

# 感想
6,000円くらいあれば買えるというのがすごい。自分のお金じゃないけど。
とても気軽に楽しめる。自分のお金じゃないけど。
部長、ありがとうございました。いまは違う部門だけど。
昔、15,000円くらいで購入したデカい筐体の自宅サーバー(MADE IN TOKYO)は電気代とネットワークに苦労したのに。

乾電池でも動くし、Wi-Fiもつながるってすごい。乾電池では運用していないけど。
そういう用途で使ってみたい。

SSHの鍵、どうしよう。大家さん、持ってないかな。
管理会社にもらえないかな。騒音問題も解決してくれないから無理か。
そういうことじゃないか…ただの自分のミスか。

ちなみに、この文章は、断続的に続く騒音(野球の硬式ボールを落としたみたいな音)の中、書いてます。

<img src="https://docs.google.com/spreadsheets/d/16lo2shpaf1n-qaFzOkn87nujLT8RaCPXWrEshTjNDpE/pubchart?oid=76728450&format=image">

運命のドラフトまで、あと1ヶ月。
arduinoでgpsロガー

#概要
arduinoでgpsロガーやってみた。

#写真

![log.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/707b9185-a097-6d12-b399-0a9516818833.jpeg)


#結果

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/y/O/N/yONK.jpg?t=1506472025)


#サンプルコード

```
#include <Arduino.h>
#include "TinyGPS.h"
#include <SoftwareSerial.h>


TinyGPS gps;
SoftwareSerial ss(10, 11);

void setup()
{
	Serial.begin(9600);
	ss.begin(9600);
	while (!Serial)
	{
		;
	}
	Serial.println("start!");
}
void loop()
{
	bool newData = false;
	float lat = 0;
	float lon = 0;
	unsigned long age;
	while (ss.available())
	{
		char u = ss.read();
		if (gps.encode(u)) newData = true;
	}
	if (newData)
	{
		gps.f_get_position(&lat, &lon, &age);
		Serial.print('"');
		Serial.print(lat, 7);
		Serial.print(",");
		Serial.print(lon, 7);
		Serial.print('"');
		Serial.println(",");
	}
}



```

以上
Ruby のオブジェクトの継承関係を tree コマンドっぽく表示する

ruby のオブジェクトの継承関係を tree っぽく表示することが出来るようになります。

```rb
class ObjectTree
  SPACE_SIZE = 8
  T_LINE = '├─────'
  I_LINE = '│'
  L_LINE = '└─────'

  def self.create(klass)
    new(klass)
  end

  def initialize(klass)
    @queue = []
    walk(klass)
  end

  def to_s
    @queue.join
  end

  private

  def output_node(klass)
    klass.instance_of?(Class) ? "<C> #{klass}\n" : "<M> #{klass}\n"
  end

  def get_line(end_line: nil, space: '')
    end_line ? "#{space}#{L_LINE} " : "#{space}#{T_LINE} "
  end

  def get_space(end_line: nil)
    end_line ? ' ' * SPACE_SIZE : I_LINE + ' ' * (SPACE_SIZE - 1)
  end

  def walk(klass, space = '', path: [])
    path << klass
    @queue << output_node(klass)
    modules = get_modules(klass, path.reverse)

    while sub = modules.shift
      @queue << get_line(end_line: modules.empty?, space: space)
      walk(sub, space + get_space(end_line: modules.empty?), path: path.dup)
    end
  end

  def get_modules(klass, path)
    ObjectSpace.each_object(Module).map do |k|
      l = k.ancestors
      if l.each_cons(path.size).include?(path)
        (l[l.index(k)..l.index(klass)] - path).last
      end
    end.compact.uniq.sort_by(&:to_s)
  end
end

puts ObjectTree.create(Numeric)
```

実行結果

```
<C> Numeric
├───── <C> Complex
├───── <C> Float
├───── <C> Integer
└───── <C> Rational
```

Ruby のバージョンが 2.4 以前だと結果が異なります。（Integer に統一される前）

```
<C> Numeric
├───── <C> Complex
├───── <C> Float
├───── <C> Integer
│       ├───── <C> Bignum
│       └───── <C> Fixnum
└───── <C> Rational
```

BasicObject の結果はちょっと大きかったので gist に貼り付けておきます

https://gist.github.com/siman-man/eb696cea856bffb9fc18dc668756c1d1

## Gem にしました

gem のほうは結果に色がついてちょっとだけ見やすくなっています。

https://github.com/siman-man/object_tree

こんな感じで使えるようになります

```rb:sample.rb
require "object_tree"

module D
end

module E
end

class A
  include D
end

class B < A
end

class C < A
  include E
end

class F < B
  include E
end

puts ObjectTree.create(D)
```

結果

```
<M> D
└───── <C> A
        ├───── <C> B
        │       └───── <M> E
        │               └───── <C> F
        └───── <M> E
                └───── <C> C
```
オープンクラスでメソッドチェインできるrubyプログラムの書き方

#メソッドチェイン愛好会会員です

元の記事
[全部のファイルを結合するrubyプログラム](https://qiita.com/taroyanaka/items/5de919008edba37fa844)
[メソッドチェインできるrubyプログラムの書き方](dd106792f463f4535dc8)

組み込みクラスにメソッドを追加して、メソッドチェインできるようにしました。
レシーバを意識してメソッドを追加すればいいということが分かります。
delete_myselfメソッドもprivateかmoduleに隠蔽したくて調べたがよく分からず、とりあえずArrayクラスに追加。

前回の記事から、文字数カウント、行数カウント、ファイル名を文中に追記する機能を追加しました。
少しだけ全体をリファクタリング済み。

設計とリファクタリングの本を熟読したら、もう少し綺麗に書けそう。
もっと良い設計を知りたい。

```ruby:method_chain_by_open_class.rb
# coding: utf-8
# about open class http://www.ruby.or.jp/ja/tech/development/ruby/tutorial/090_class_extension.html


class String
	def glob_by_extension
		all_files = Dir.glob("**/*."+self)
		all_files = all_files.delete_myself
		return all_files
	end

	def count_lines
		return self.count("\n")
	end

	def file_write(name)
		File.write name, self
	end

	def file_write_ruby_ver_1_8(name)
  	File.open(name,"w:EUC-JP:UTF-8") {|file| file << self }
	end
end


class Array
	def delete_myself
		self.delete(__FILE__) if self.include?(__FILE__)
		return self
	end

	def all_ary_to_str
		@str = ""
		self.each {|file| @str << txt_add(file) }
		return @str
	end

	def all_ary_with_name_to_str
		@str = ""
		self.each {|file| @str << txt_add_with_name(file) + txt_add(file) }
		return @str
	end

	private

	def txt_add(file)
		return File.read(file)
	end

	def txt_add_with_name(file)
		file_name_str = "-------------------------------------------------------"
		file_name_str += "\n" + file + "\n"
		file_name_str += "-------------------------------------------------------" + "\n"
		return file_name_str
	end
end

puts "rb".glob_by_extension.all_ary_to_str.length
#puts "rb".glob_by_extension.all_ary_to_str.count("\n")
puts "rb".glob_by_extension.all_ary_to_str.count_lines

#"rb".glob_by_extension.all_ary_to_str.file_write_ruby_ver_1_8("combining.rb")
"rb".glob_by_extension.all_ary_with_name_to_str.file_write_ruby_ver_1_8("combining.rb")
```

参考
[定義済みクラスの拡張（オープンクラス）](http://www.ruby.or.jp/ja/tech/development/ruby/tutorial/090_class_extension.html)
MySQLをMacにいれる時の手順

MacBook Pro に MySQL をインストールしてみたので手順をメモ。

#前提
- ローカルの環境(Mac)に MySQL をインストールします。
 - 今回の OS X のバージョンは OS X 10.12.6 (Serra) です。
- Homebrew でインストールします。
 - Homebrew自体が入ってなければ、Homebrewの公式ページどおり、次のようにインストール  
 ```
 $ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
 ```  
   ※ 執筆時とコマンド内容が変わってるかもしれないので、公式ページを確認ください。
   ※ 事前に Xcode のインストール(および起動して許諾への同意)が必要

# 手順
## MySQL のインストール
```
// brewのアップデート
$ brew update
Updated 1 tap (homebrew/core).
==> New Formulae
libbitcoin-node
==> Updated Formulae
・・・・
```
```
// MySQLをインストール
$ brew install mysql
==> Installing dependencies for mysql: openssl
==> Installing mysql dependency: openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2l.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl-1.0.2l.sierra.bottle.tar.gz
==> Caveats

・・・・・

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Summary
  /usr/local/Cellar/mysql/5.7.19: 322 files, 233MB
```
インストール完了。どうやらインストールログを見ると起動方法とログイン方法（コマンド）が書いてある。
MySQLの起動：mysql.server start
ログイン方法：mysql -uroot
## MySQLの起動

```
$ mysql.server start
Starting MySQL
. SUCCESS! 
```

##MySQLにログイン
```
$ mysql -uroot
inokoichi@localhost:~$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.19 Homebrew
・・・・・・
```
接続完了。
WindowsでもPostgreSQLでCSV出力したい！

PostgreSQLで、テーブルをCSVファイルに書き出す（エクスポートする）方法についてです。

- 動作確認環境：
    - PostgreSQL 9.6.4
    - Windows10

大きく分けて2つある。といっても両方psqlコマンドを使うのだが。。。
https://www.postgresql.jp/document/9.6/html/app-psql.html

# psqlを直接使う

```psql
psql データベース名 -c "SQL文" -A -F, > 出力するファイル名
```
こんな感じ。
-Aは位置揃えなしの出力モードに切り替え、
-Fはフィールド区切り文字の指定。例では「,(カンマ)」を指定してる。

これ手軽だけどいくつか弱点がある。

- 項目の ”（ダブルクォーテーション）括りができない
- タブ区切りにするのがめんどい（コマンドプロンプト自体の設定変更が必要）
- NULL文字が変更できない
- 列名を付けると、もれなく"結果の行数フッタ"がついてくる。フッタ行だけ外すのできない。

# COPYコマンドを使う

psqlコマンドでCOPYコマンドを発行する。これならダブルクォーテーション括りも楽々ですよ！
コマンドはバッチファイル化する。

```bat:postgres_export.bat
@echo off
cd /d %~dp0

set PGHOST=192.168.0.10
set PGDATABASE=dbname
set PGUSER=postgresuser
set PGPASSWORD=postgrespassword
set PSQL_COMMAND="C:\Program Files\PostgreSQL\9.6\bin\psql.exe"

%PSQL_COMMAND% -c "COPY (SELECT * FROM hogehoge LIMIT 100) TO STDOUT WITH CSV DELIMITER E'\t' FORCE QUOTE * NULL AS '' HEADER;" > C:\export.csv

```
これで タブ区切り、引用符囲み、NULLは空文字、カラム名表示 になる。
https://www.postgresql.jp/document/9.6/html/sql-copy.html

STDOUTで標準出力に出したのを、先のpsqlと同じようにファイルに流しているだけですね。
バッチにしてるのは、PostgreSQLのpsqlコマンドは引数でパスワードを設定できないから。手入力じゃ自動化しんどいので。
パス等は適当に書き換えてください。コマンドプロンプトでもPowershellでも動きます。

クエリが長かったり複数行に分かれるときは、-cオプションやめて -fオプションでファイルにしてもいいかも。

```SQL:query.sql
COPY (
SELECT * FROM hogehoge
 LEFT JOIN fugafuga ON hogehoge.piyo = fugafuga.piyo
 LIMIT 100
) TO STDOUT WITH CSV DELIMITER E'\t' FORCE QUOTE * NULL AS '' HEADER;
```

```bat:postgres_export.bat
@echo off
cd /d %~dp0

set PGHOST=192.168.0.10
set PGDATABASE=dbname
set PGUSER=postgresuser
set PGPASSWORD=postgrespassword
set PSQL_COMMAND="C:\Program Files\PostgreSQL\9.6\bin\psql.exe"
%PSQL_COMMAND% -f query.sql > C:\export.csv

```
formのsubmitがおかしい時にチェックすべき3つの事

formの挙動ではまった箇所をまとめました。
あれ？っと思ったら確認してみてください。

##formが入れ子になっている

```html
<form id="main">
  <form id="sub"></form>
</form>
```

エラーとかは起きません。
formが入れ子になっている場合、`<form id="main"></form>`の中のタグはソースから全て消え去ります。

##formを動的に追加した場合

```js
  var $f = $('<form></form>');
  $f.append('<input type="hidden" name="age" value="20">');
  $f.submit();
```
これは動きません。htmlソース上にformがないので、`Form submission canceled because the form is not connected` とか出ます。なので

```js
  var $f = $('<form></form>');
  $f.append('<input type="hidden" name="age" value="20">').appendTo($('body:first'));
  $f.submit();
```
これでbody内にformが追加され、送信できるようになります。


##buttonタグのtype

```html
<button type="**">ボタン</button>
```

buttonタグのtypeは指定しないと、初期値で`submit(送信)`が入ります。

勝手に`button(何もしない)`だと思っていたので、謎の挙動に焦りました。


##参考

http://www.htmq.com/html5/button.shtml
http://blog.fkoji.com/2012/04151445.html
デレステのガシャ（ガチャ）不具合から見るガシャ（ガチャ）想像図


2017/09/27 15:00:00 JSTにデレステのガシャが更新されたのですが、提供割合不具合が発生しました。
（余談ですが、バンダイナムコエンタテインメント社提供のアプリでは「ガチャ」ではなく「ガシャ」表記です。商標絡みだとか何とか。）

で、そこで発生した現象は

1. 10連ガシャの最後、SR確定ガシャで本来0.4%のピックアップSSRの確率が0.04%になっていた
2. それにより、通常SSRの提供割合が想定より上がっていた
3. SSR以外のレアリティ及び全体の提供割合は想定どおりだった

と言うものです。
また、表記上ピックアップSSR 0.400%、通常SSR 0.029%、ピックアップSR 2.400%、通常SR 0.082%、R 0.825%となっていて、小数第4位での切り捨てが明言されています。（※SR以上確定でないガシャ）
これらの情報から、

* 割合のうちマスタに明記されているのはレアリティ全体のものとピックアップの割合のみ
* 通常の確率はレアリティ全体の割合・ピックアップの割合・ピックアップの枚数から計算される

と言う処理が想像出来ます。
ここから、[以前作成したガチャの実装例](https://qiita.com/aono/items/233a53fc04314ad6f034)を改変して動作する例を作成してみました。

```gacha.rb
require 'csv'

module Gacha
  class Main
    def self.execute
      rarity_deck = RarityDeck.new('rarity.csv')
      lotter = rarity_deck.lot
      card_deck = CardDeck.new('card.csv', lotter.rarity_id, lotter.is_pickup)
      return card_deck.lot
    end
  end

  class RarityDeck
    def initialize(file_name)
      @file_name = file_name
    end
  
    def data
      base = CSV.read(@file_name)
      data = base.map{|b| Rarity.new(*b)}
      return data
    end
  
    def lot
      i = 0.0
      lots = data.product([1, 0]).map{|a|
        l = Gacha::Lotter.new(i, i + a[0].wait(a[1]), a[0].id, a[1])
        i +=  a[0].wait(a[1])
        l
      }
      r = rand * 100
      return lots.find{|a| r > a.from && r <= a.to}
    end
  end

  class Rarity
    attr_reader :id, :name, :base_wait, :pickup_wait, :pickup_count
    def initialize(id, name, base_wait, pickup_wait, pickup_count)
      @id = id.to_i
      @name = name
      @base_wait = base_wait.to_f
      @pickup_wait = pickup_wait.to_f
      @pickup_count = pickup_count.to_i
    end

    def wait(is_pickup)
      if is_pickup > 0
        return @pickup_wait * @pickup_count
      else
        return @base_wait - (@pickup_wait * @pickup_count)
      end
    end
  end

  class CardDeck
    def initialize(file_name, rarity_id, is_pickup)
      @file_name = file_name
      @rarity_id = rarity_id
      @is_pickup = is_pickup.to_i > 0
    end

    def data
      base = CSV.read(@file_name)
      data = base.map{|b| Card.new(*b)}
      data = data.select{|d| d.rarity_id == @rarity_id && d.is_pickup == @is_pickup}
      return data
    end

    def lot
      return data.sample
    end
  end

  class Card
    attr_reader :id, :rarity_id, :is_pickup, :name
    def initialize(id, rarity_id, is_pickup, name)
      @id = id.to_i
      @rarity_id = rarity_id.to_i
      @is_pickup = is_pickup.to_i > 0
      @name = name
    end
  end

  class Lotter
    attr_reader :from, :to, :rarity_id, :is_pickup
    def initialize(from, to, rarity_id, is_pickup)
      @from = from
      @to = to
      @rarity_id = rarity_id
      @is_pickup = is_pickup
    end
  end
end
```

汚い？
もう時間が無いんです！

…ごめんなさい、正直今回のこれは防備録程度のものでしかないですので、少し時間が取れたらもっときれいな実装を作成したいと思います。
そのときには取って付けたようなミリマスのネタではなくちゃんとデレマスのネタも仕込みたいと思います。
一応、以前のものとはブランチを変えて[githubに上げました](https://github.com/aono-sinya/simple_gacha_sample/tree/starlight)。
D3.js資料

## よく使う資料
- 公式APIリファレンス
    - https://github.com/d3/d3/blob/master/API.md
- 公式wiki 
    - https://github.com/d3/d3/wiki
- 公式github
    - https://github.com/d3/d3
- 公式リリースノート
    - https://github.com/d3/d3/releases
- 公式サイト
    - https://d3js.org/
- 公式サイト - イントロダクション
    - https://d3js.org/#introduction
- 使用例の一覧
    - https://github.com/d3/d3/wiki/Gallery
- チュートリアルの一覧
    - https://github.com/d3/d3/wiki/Tutorials
- D3.jsのstackoverflow一覧
    - https://stackoverflow.com/questions/tagged/d3.js
- D3.jsのQiita一覧
    - https://qiita.com/tags/d3.js
- D3.js を使ってみる - Qiita
    - https://qiita.com/ynakayama/items/362049808223c191d252

## APIとその関心事
項目は公式APIリファレンスより

- Arrays (Statistics, Search, Transformations, Histograms) - 配列とその操作
- Axes - グラフの軸
- Brushes - タッチによる点や範囲選択
- Chords - 円状に関係を示す
- Collections (Objects, Maps, Sets, Nests) - 情報の集まり
- Colors - 色の操作
- Dispatches - コードを遅延実行
- Dragging - ドラッグ&ドロップ
- Delimiter-Separated Values - CSVパース 
- Easings - アニメーションの緩急
- Forces - 物体間の力
- Number Formats - 人が読めるよう数値を整形
- Geographies (Paths, Projections, Spherical Math, Spherical Shapes, Streams, Transforms) - 地理情報
- Hierarchies - 階層データ
- Interpolators - 補完
- Paths - pathをSVGに
- Polygons - 多角形
- Quadtrees - ちょうど4つの子をもつツリー
- Queues - Promise的なもの
- Random Numbers - 乱数
- Requests - XMLHttpRequest
- Scales (Continuous, Sequential, Quantize, Ordinal) - 位置上の値の視覚化
- Selections (Selecting, Modifying, Data, Events, Control, Local Variables, Namespaces) - DOM要素の操作
- Shapes (Arcs, Pies, Lines, Areas, Curves, Links, Symbols, Stacks) - 簡便な描画
- Time Formats - 時間フォーマット
- Time Intervals - 日付時刻
- Timers - タイマ
- Transitions - selectionのアニメーション
- Voronoi Diagrams - ボロノイ図
- Zooming - タッチとズーム
Swift3 配列を受け取り、偶数・奇数・小数に分けて表示

※動作はしますが、多分80点程度だと思います。

##配列を引数として受け取り、「偶数はa、a、a」「奇数はb、b、b」「少数はc,c,c」と表示

[10,7,2,9,0,4,-2,15,1.5,0.9,-4.5,] と [10,6,4,] を渡してみます。

FloatやDouble型の引数をとる場合に、
2で割った時の余りが0かどうかを判定するif文、％を使うとエラーになりました。
試したところ、+,-,*,/は通じるのですが、%の場合のみエラーになってしまいます。
swift2までは、％でも通じたらしいですが、
swift3ではuse truncating remainder instead というエラーメッセージが出ます。
→ truncatingReminderを使用して解決しました。


```swift:分類表示する関数

func printArray(_ numbers:[Float])->Void{
    
    //結果出力用配列を準備
    var newArrayDecimal:[Float] = []
    var newArrayEvenNumbers:[Float] = []
    var newArrayOddNumbers:[Float] = []
    
    let max:Int = numbers.count - 1
    for index in 0...max{
        var element = numbers[index]
        
        //小数の条件判定の準備。round(towardZero)を使う。
        //0に近い数値にする。正の数は切り捨て、負の数は切り上げの挙動。
        //rounded(towardZero)だと汎用性が低くなってしまう。
        element.round(.towardZero)
        
        //条件に合致した配列の要素を、上で準備した配列に代入

        //帯小数の場合
        if numbers[index] - element != 0.0 {
            newArrayDecimal.append(numbers[index])

        //偶数の場合
        } else if numbers[index].truncatingRemainder(dividingBy: 2.0) == 0{
            newArrayEvenNumbers.append(numbers[index])

        //奇数の場合
        } else if numbers[index].truncatingRemainder(dividingBy: 2.0) != 0{
            newArrayOddNumbers.append(numbers[index])
        }
    }

    print("小数は\(newArrayDecimal)です")
    print("偶数は\(newArrayEvenNumbers)です")
    print("奇数は\(newArrayOddNumbers)です")
}


printArray([10,7,2,9,0,4,-2,15,1.5,0.9,-4.5,])
print("----------------------")
printArray([10,6,4,])
```

実行結果
純小数がきちんと表示されない。なぜ？というところ。

```:実行結果
小数は[1.5, 0.899999976, -4.5]です
偶数は[10.0, 2.0, 0.0, 4.0, -2.0]です
奇数は[7.0, 9.0, 15.0]です
----------------------
小数は[]です
偶数は[10.0, 6.0, 4.0]です
奇数は[]です
```
C# / Unity2D 学んだこと #1

# Unity2D

## カメラ座標をグローバル座標への変換

- カメラの座標は、左下が(0,0)、右上が(1,1)
- ただカメラを初期配置したままだと、カメラの中心が(0,0)になっているので、下のbottomLeftは(0,0)ではない

```csharp
var bottomLeft = Camera.main.ViewportToWorldPoint(Vector3.zero);
var topRight = Camera.main.ViewportToWorldPoint(Vector3.one);
```

## GameObjectのスプライトの大きさを取得

```csharp
var gameObjectWidth  = go.GetComponent<SpriteRenderer>().bounds.size.x;
var gameObjectHeight = go.GetComponent<SpriteRenderer>().bounds.size.y;
```

## クリック座標をワールド座標へ変換

```csharp
var sx = Input.mousePosition.x;
var sy = Input.mousePosition.y;
var pos = Camera.main.ScreenToWorldPoint(new Vector3(sx, sy, 0f));
```

# C\# 

## ref/outの違い

- ref
    - いわゆる参照渡し。
- out
    - 参照渡しだが、メソッドから呼び出し側に何らかの値を返すのに使う。
    - 呼び出し側で渡す変数は初期化されてなくて良い。

## indexerの定義方法

- C#はいわゆる配列アクセスを任意のクラスに定義できる
- ただ書き方が独特な気がする

```csharp
using System;

class Hoge
{
  int[] myArray = new int[] {0, 1, 2};
  public int this[int i]
  {
    get
    {
        return myArray[i];
    }
  }
  
  public static void Main(string[] args)
  {
    var hoge = new Hoge();
    Console.WriteLine(hoge[1]);
  }
}
```

## オペレーターオーバーローディング

- +とか-のような演算子をオーバーローディング出来る

```csharp
using System;

class Hoge
{
  public int n = 0;

  public static Hoge operator+(Hoge h1, Hoge h2)
  {
    var hoge = new Hoge();
    hoge.n = h1.n + h3.n;
    return hoge;
  }
  
  public static void Main(string[] args)
  {
    Hoge h1 = new Hoge(),
         h2 = new Hoge(); // ちなみにここで var h1 = ..., h2 = ...; と書くと
                          //  An implicitly typed local variable declaration cannot include multiple declarators
                          // というエラーが出る。
    h1.n = 1;
    h2.n = 2;
    var h3 = h1 + h2;
    Console.WriteLine(h3.n); // -> 3
  }
}
```

## プロパティの定義

- JavaerがKotlinを触ったときに感動するアレ

```csharp
using System;

class Hoge
{
  public int Age { get; set; } // オートプロパティ
  
  string name;
  public string Name
  {
    get { return name; }
    set { name = value; }
  }
  
  public static void Main(string[] args)
  {
    var hoge = new Hoge();
    hoge.Name = "Asakura";
    Console.WriteLine(hoge.Name);
    
    hoge.Age = 10;
    Console.WriteLine(hoge.Age);
  }
}
```

## C\# のデフォルトのアクセス修飾子は、private

- protectedでないのが嬉しい
- internalとprotected internalというのもあるらしい
    - internal : 同一アセンブリ内で見れるもの
    - protected internal : 派生クラスからも見れるもの
- アセンブリとは？
    - *物理的なコードのグループ分けの基本単位であるアセンブリ。* by https://msdn.microsoft.com/ja-jp/library/ms973231.aspx
      - ？？？
    - *個々のアセンブリは.exe または.dll ファイルとして保存されます。* by https://msdn.microsoft.com/ja-jp/library/ms973231.aspx
        - Javaでいうjarみたいな感じ？
    - *厳密に言えば、アセンブリと名前空間は互いに独立しています。つまり、1 つの名前空間のメンバを複数のアセンブリで宣言することもできますし、1 つのアセンブリの中で複数の名前空間を宣言することもできます。しかし、このような方法を選択する十分な理由がない限り、アセンブリと名前空間は 1 対 1 に対応させて、話を単純にしておくのが一番です。* by https://msdn.microsoft.com/ja-jp/library/ms973231.aspx
      - なるほど…AndroidアプリでMulti-Dexの構成を取ると同じパッケージ(名前空間)でも別のdexファイルに配置されることがあるので、それと対応させると(Java脳)の自分でも理解できた
      - しかし、C\# は名前空間レベルでのアクセス制御は出来ないのか
[Pythonによる科学・技術計算] 正方行列の最大(最小)要素の行・列のインデックスの取得, numpy

#はじめに

**正方行列の要素の最大値となるインデックスの行番号・列番号を求めます。**
科学・技術計算ではよく行う作業です。**numpy.argmax**メソッドを使います。


テストで用いる行列Cを構築します。

```py3
C=np.array( [[1,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])
```

![スクリーンショット 2017-09-28 0.04.02.png](https://qiita-image-store.s3.amazonaws.com/0/192457/8f6d5d8d-7b0b-f222-92c2-c3832e264b5c.png)

**Cの最大値はインデックス[3,2]にありますね。**
そして，これを求めるために

```py3
np.argmax(C)
```
としても<font color="Red">**残念ながらインデックスを0からの通し番号である"14"が返されるだけで，望んでいた行・列の要素番号である[3,2]が得られません。**</font>

**本稿では， 上の[3,2]を取得するコードを作ります。**

＃もっとカンタンにできる方法があれば教えていただければ幸いです。。

###追記 2017年10月5日

***SatoshiTerasaki さまより，最も簡単な方法を教えてもらいました。SatoshiTerasakiさま，ありがとうございました！***

```py3
C=np.array( [[1,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])
np.argwhere(C == C.max())
```

***だけでokです。***

非対角要素の最大値なども探したら簡単な方法があるかもしれません。
分かったら更新いたします。


###


#コード
とてもシンプルです。
要するに**行数の番号を計算するために，行列のサイズ(今の場合は4)で割り切れる最大の整数値が列のインデックス番号，そしてそれの余りが行のインデックス番号に対応する**ので，pythonの組み込み関数である "//"と"%"を用いればokです。

```py3
#行列Cの定義
C=np.array( [[1,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])
index=np.argmax(C)
# メイン
index_list=[]
i = index // len(C)  # 行のインデックス番号の取得
j = index % len(C) # 列のインデックス番号
index_list.append(i)
index_list.append(j)

print(index_list)
```

#結果
[3, 2]

望みの結果が得られました。

#発展
以下，様々な利用シーンを考えます。


## 非対角要素の最大値
非対角要素の最大値を求める場合は，
まず対角要素をゼロにしてから上のコードを実行します。

```py3
C=np.array( [[21,2,3,-4],[2,5,4,0],[3,4,1,1],[-4,0,10,2]])

for i in range(len(C)) :
    C[i,i] = 0


#
index_list=[]
index=np.argmax(C)
i = index // len(C)
j = index % len(C)
index_list.append(i)
index_list.append(j)

print(index_list)
```

###結果: 
数値が21の[0,0]ではなく，きちんと[3, 2]を返します。

##非対角要素の絶対値の最大値

行列が以下のように負の大きな数を含む場合です。

![スクリーンショット 2017-09-28 0.28.18.png](https://qiita-image-store.s3.amazonaws.com/0/192457/8fb7b1cf-dc91-b094-ad7f-c37fc7231abe.png)

**絶対値が100となるインデックス[1,2]を取得します。**

そのためには，要素の絶対値をとったものをさきに作ってから上の方法を適用します。

```py3
#行列Cの定義
C=np.array( [[1,2,3,-4],[2,5,-100,0],[3,4,1,1],[-4,0,10,2]])
D= np.abs(C) # 絶対値をとったものに変換しそれをDとする

index=np.argmax(D)

# メイン
index_list=[]
i = index // len(C)  # 行のインデックス番号￥の取得
j = index % len(C) # 列のインデックス番号
index_list.append(i)
index_list.append(j)

print(index_list)

```

###結果

**[1, 2]**

okです。


##最小値の場合
例として以下の行列を考えます。
**負の最大値-10のインデックスは[3,1]です。これを取得します。**


![スクリーンショット 2017-09-28 0.32.24.png](https://qiita-image-store.s3.amazonaws.com/0/192457/9da16784-e61c-88f7-5dac-330f0dc255a7.png)


それには要素の最小値のインデックスを返すnp.argminメソッドを使います。


```py3
C=np.array( [[21,2,3,-9],[2,5,4,0],[3,4,1,1],[-4,-10,10,2]])
index=np.argmin(C)

for i in range(len(C)) :
    C[i,i] = 0

#
index_list=[]
i = index // len(C)
j = index % len(C)

index_list.append(i)
index_list.append(j)

print(index_list)

```
###結果

**[3, 1]**

okです。

***
$_SERVER['SCRIPT_URI']が使えたり使えなかったり

他人が書いたコードを読んでいたら "$\_SERVER\['SCRIPT\_URI'\]" というのが出てきたのだが 
[PHPのドキュメントの$\_SERVERのところ](http\://php.net/manual/ja/reserved.variables.server.php)には載っていなかった。
URLリライト（mod_rewrite）由来の値らしい。ただ、URLリライトが使えるからといって必ず $\_SERVER\['SCRIPT\_URI'\] が使えるとは限らない。この辺りがよくわからない。

下記の .htaccess と index.php をドキュメントルートに置いてアクセスした場合の $\_SERVER のSCRIPT\_URI、REQUEST\_URI、SCRIPT\_NAME を調べた。
\#ドメイン名はダミー。


```text:.htaccess
RewriteEngine On

ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
```

```php:index.php
<?php
echo "_SERVER[SCRIPT_URI]={$_SERVER['SCRIPT_URI']}" . PHP_EOL;
echo "_SERVER[REQUEST_URI]={$_SERVER['REQUEST_URI']}" . PHP_EOL;
echo "_SERVER[SCRIPT_NAME]={$_SERVER['SCRIPT_NAME']}" . PHP_EOL;
```

## $_SERVER['SCRIPT_URI'] が使えたケース

環境：
Apache/2.2.15
PHP 5.3.3

"http\://www\.mogero.jp/" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=http://www.mogero.jp/
_SERVER[REQUEST_URI]=/
_SERVER[SCRIPT_NAME]=/index.php
```

"http\://www\.mogero.jp/index.php" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=http://www.mogero.jp/index.php
_SERVER[REQUEST_URI]=/index.php
_SERVER[SCRIPT_NAME]=/index.php
```

"http\://www\.mogero.jp/index.php?mode=test" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=http://www.mogero.jp/index.php
_SERVER[REQUEST_URI]=/index.php?mode=test
_SERVER[SCRIPT_NAME]=/index.php
```

"http\://www\.mogero.jp/hoge" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=http://www.mogero.jp/hoge
_SERVER[REQUEST_URI]=/hoge
_SERVER[SCRIPT_NAME]=/index.php
```

## $_SERVER['SCRIPT_URI'] が使えなかったケース

環境：
Apache/2.4.6
PHP 7.0.14

"http\://www\.into-main.jp/" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/
_SERVER[SCRIPT_NAME]=/index.php
```

"http\://www\.mogero.jp/index.php" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/index.php
_SERVER[SCRIPT_NAME]=/index.php
```

"http\://www\.mogero.jp/index.php?mode=test" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/index.php?mode=test
_SERVER[SCRIPT_NAME]=/index.php
```

"http\://www\.mogero.jp/hoge" にアクセスした場合

```text
_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/hoge
_SERVER[SCRIPT_NAME]=/index.php
```

## まとめ

SCRIPT\_URI は使えないこともあるので、使わない方がいいかも。

SCRIPT\_URI が使えなくても

* HTTPS：HTTPSプロトコルの場合、値がセットされる 
* HTTP\_HOST：HTTPリクエストのHOSTヘッダの値 
* REQUEST\_URI

でURLを作ることができる。SCRIPT\_URIと違ってクエリーストリングが付いてしまうが。
HTTP\_HOST は改ざんされている可能性があるのでちゃんと検証しましょう。

REQUEST\_URI と SCRIPT\_NAME は似ているが以下のように違う。 

* REQUEST\_URI：アクセスのURLのパス部 
* SCRIPT\_NAME：実行されるスクリプトのドキュメントルートからのパス

## 参考ページ
[PHP: $_SERVER - Manual](http://php.net/manual/ja/reserved.variables.server.php)
[php - $_SERVER["SCRIPT_URI"] not working? alternative? - Stack Overflow](https://stackoverflow.com/questions/717874/serverscript-uri-not-working-alternative)
[Apache の基本 -バーチャルホスト編- | バシャログ。](http\://bashalog.c-brains.jp/09/07/28-213947.php)
[Apache : mod_rewriteリファレンス - dawgsdk.org](http\://blog.dawgsdk.org/weblog/archives/411011)
チケットの粒度について

(整地鯖において利用しているRedmineのチケットシステムについて、より上手な使用方法をgoogle先生のヒアリングを受けつつ現状の考察をまとめてみました。qiitaはこれまでひたすらROM専に浸っていましたが、良い機会だと思いテストがてら初投稿です。)

チケットの粒度大きすぎる(例えば、大規模あるいは工数の多い開発案件をチケット1つだけで管理しようとする)と…

* 注記が伸びまくり＆色んな話がごちゃ混ぜになり、いざという時にお目当ての内容を見つけるのに一苦労する
* 何が終わって何が終わっていないのか把握しにくくなる
* チケットの終了条件が曖昧になりやすく、タスクの取りこぼしを発生させる確率を高める

…といったデメリットが生じ、折角のチケットシステムの利点が活きない。

よって、案件の大きさによっては、まず案件の概要を書いた親チケットを作成し、次に作業項目別に小チケットを作成し、それを親チケットに束ねておく。すると…

* 注記が自然と小チケット毎に整理され探しやすく＆読みやすくなる
* チケット毎の対象範囲が狭まり、終了条件が設定しやすい＆明確になる
* 親チケットページの子チケット一覧で作業の進捗(何が終わってて何が終わってないか)が把握しやすい
* チケット毎に作業時間や期日を整理でき、案件全体の予定工数(かかるであろう時間のこと)の見積もりや進捗管理がしやすい
* 自然とチケットの更新頻度が増え、進捗管理担当や途中から作業に参加するメンバーが作業状態を把握しやすい状態になる

などなど、チーム作業をする上で魅力的なメリットを多数享受できる。
ので、チケットを作る時は粒度を意識してみるといいかもしれません！終わり！


以下参考

https://www.google.co.jp/search?q=redmine+%E3%83%81%E3%82%B1%E3%83%83%E3%83%88+%E7%B2%92%E5%BA%A6&ie=UTF-8&oe=UTF-8&hl=ja-jp&client=safari
[Sublime Text]プラグイン：EJS用シンタックスハイライト


Sublime TextでテンプレートエンジンEJSの構文を見やすくするプラグインの紹介です。

## プラグイン名・ダウンロード先
EJS 2▷[https://packagecontrol.io/packages/EJS%202](https://packagecontrol.io/packages/EJS%202)

## .ejsファイルの紐付け
パッケージインストール後、.ejsファイルを開いて
View > Syntax > ESJ 2 > EJS<% %> を選択すれば次回から自動的にejsファイルに適用されます。

## 検証環境
OS：Mac
Sublime Text：Version 3.0
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル1

# 構成要素一巡り

## 関連
ドメイン駆動設計について語るとき、あまり話題にならない関連ですが、実はとても重要。

> オブジェクト間の関連は、想像するのも描くのも簡単だが、実装するとなると泥沼になるかもしれない。(第二部 第五章より)

片方に関連を持たせると、どうしてももう片方にも関連させたくなります。現実には両方向の関連が成り立つからですね。どちらの関連にするかが問題。

> 詳細な実装上の意思決定がモデル駆動設計を実現する上でどれほど重大か(第二部 第五章より)

この観点で関連を考えていきます。

## エンティティ・値オブジェクト・サービス

> その区別が設計の原則と結びつくことで、特殊なオブジェクトが切り出される(第二部 第五章より)

連続性と一意性を持ったものがエンティティ、他の何かの状態を記述する属性が値オブジェクト、エンティティや値オブジェクトに押し付けないのが自然な操作がサービス（ただし、オブジェクト指向モデリングの伝統からはやや外れる）です。

# モジュール(パッケージ)

> モジュールはモデルの一部であり、ドメインにある概念を反映していなければならない。(第二部 第五章より)

モジュール（パッケージ）の構成もドメインの概念が反映されていないといけないということですが、オブジェクト指向でよく語られる高凝集・疎結合の考え方を概念そのものに適用するということです。

## 実装で妥協すること

このトピックの最初と最後に「実装上の妥協」について書かれています。

実装する上で、妥協することは許さない（何となく、モデルと実装を結びつける＝妥協しないと思ってしまう・・・)ということではなく、妥協は避けられないものとされています。

> 実装にあたって妥協をしつつ、モデル駆動設計の持つ力を失わないようにするためには、基本を見直す必要がある。(第二部 第五章より)


> 避けられない妥協を行う時でも、基本原則に対する感覚に助けられることによって、開発者は道を踏み外さずにいられる。(第二部 第五章より)

どうしてもでてくる実装上の妥協から道を外さないためにも、上記の区分と基本原則を結びつけて正しく理解し、使いこなすことが必要になってくるということですね。