ビリヤード系筋トレプログラマ

プログラミング, 筋トレ, ビリヤード, エンジニア, etc

コロナの間に技術資産を増やす

背景

最近業務で使用する技術スタックとしてAWSが当たり前に使用されている時代です。
そこでAWSを使用したTODOアプリを作成してAWS用のポートフォリオをとしようと思った。

ソース

github.com

問題発生しまくり

apache+passengerでrailsを連携して動かそうと思ったらAWSEC2インスタンス作成時はt2.microだったためメモリが1Gしか積んでおらず
メモリ不足で動かない。
なのでNginx+Unicornで環境を構築することに。。

初めて使うWebサーバとアプリケーションサーバだったので四苦八苦しまくりました。
一応トラブルシューティングをQiitaに投稿したためここにくっつけときます。

https://qiita.com/flanres/items/da520f44c376117491d9

これからの課題

一応TODO機能は作り終えたのでこっからユーザ登録とかCI,CDを構築していきたい。
その辺も終わったらまとめます。

ストアドプロシージャ、ストアドファンクションについて

背景

実業務でRailsからDBを叩くときに簡単な判定をストアドファンクションでまとめようという話がでた。
簡単に要点をまとめておきます。

ストアドプロシージャ、ストアドファンクション

1つの要求で複数のSQLを実行出来る機能です。

  • ストアドプロシージャ
    • 戻り値がない
  • ストアドファンクション
    • 戻り値がある

/sample.sql

DELIMITER //
DROP FUNCTION IF EXISTS is_sample;
CREATE FUNCTION is_sample(val INT) RETURNS TINYINT DETERMINISTIC
BEGIN
  DECLARE T TINYINT;
  DECLARE F TINYINT;
  SET @T = 1;
  SET @F = 0;

  IF val IN(1, 2, 3) THEN
    RETURN @F;
  ELSEIF val BETWEEN 10 AND 20 THEN
    RETURN @T;
  ELSE
    RETURN @F;
  END IF;
END;
//
DELIMITER ;

DELIMITER //

  • クエリ内で「;」を使用するためデリミタを最初に変更してあげる。

DROP FUNCTION IF EXISTS is_sample;

  • もし同じ名前でDB内に登録されていたらドロップして再登録

CREATE FUNCTION is_sample(val INT) RETURNS TINYINT DETERMINISTIC

  • ファンクション名と引数、引数の型、戻り値の方を定義する

 レプリケーションを行っていてかつ、ファンクション内で動的に処理を行う場合は
 NOT DETERMINISTIC
 レプリケーションを行っていてかつ、同じ引数を与えると毎回同じ値が返ってくるような処理の場合は
 DETERMINISTIC (今回は数値の判定のみなのでこちら)

DELIMITER ;

  • デリミタをもとに戻す

判定について

普通にif,else ifが使用できます。条件のあとに処理を書きたい場合はTHENを記述します。

bool型について

数値の値に応じてTRUE,FALSEを返すストアドを作りたかったんですが、どうやらbool型を返すことができないようなので
TINYINT 型を使用しています。
まぁ実際プログラムでもTRUE,FALSEは1,0で表現されているので問題なさげです。

モスコーニカップ2019終了

モスコーニカップ終了

ビリヤードイベントの中でも一番の盛り上がりを見せるモスコーニカップ2019が
アメリカ 11-8 ヨーロッパ
で終了しました。

ネームバリュー的には圧倒的にヨーロッパ有利なんですけど、アメリカの勝利。
2連覇はすごいです。(その前に何年も連敗しているけど。)

個人的に好きだったプレイヤー

今回の大会で個人的に好きだったプレイヤーは
justin burgman
ジャスティン・バーグマン

ですね。

シングルスよりダブルスを担当していたプレイヤーです。

結構捻るショットを選択することが多くて、自分の選択肢ととても似ていたのでめちゃめちゃ勉強になりました。
プレッシャーがかかる場面で難しいショットが来たときは結構シュート率が下がってたけど、それは相方の
ミスもあったんで一概にバーグマンが悪いとは言えないかなと思います。

ワンポケットも得意なようで、オフェンシブなバンクやセーフティが結構光ってました。
まぁでも、ソープと組んだ時にソープのスーパーショットが決まった後に大きなミスをしてしまって、ヒルヒルゲームを負けてしまったので、そこはアメリカのファンたちに責められるでしょうね。ソープがその前にめんどくさいところにポジションしたのが問題だと僕は思うんですけど、一般の人は結果を重視するからしょうがない。

あと、バーグマンが使っていたシャフトはもしかしたらディヴィニーが出してる燻製したシャフトなのでは?
と思ってます。明らかに色が濃いので。

雰囲気

やっぱりビリヤードの大会では無い位盛り上がってますね。
ヤジがすごいし、選手のプレッシャーになるような大声で囃し立てるし。
みんな酒を飲みながら観戦してるから、すごいテンションです。

でも、これくらいのほうが動画見てるほうも面白いし、僕個人としてはモスコーニカップの雰囲気は大好きです。(相手チームのサポーターが中指立てまくってておもしろい)

まとめ

モスコーニカップはやっぱり面白い
バーグマンのこれからの戦いが気になる
バーグマンのシャフトも気になる

日本のA級の試合データをまとめてる人がいた。尊敬します。

尊敬

日頃エンジニア・プログラマとして働いているので、データの量や正確性、そこから導き出される解析結果にはかなり興味があります。

ビリヤードの研究がてら色々ググってみると下記のようなブログ・記事を拝見しました。

billiard-lab.com

マジですげぇ。
IT系の仕事をしているとこんな感じのデータに出くわすことはしょっちゅうですが、まさか
日本のA級のデータを拝見できるとは思ってませんでした。

アメリカのACCU-STATSが大会中のシュート率やブレイクスクラッチ率など様々なデータを
出しています。また、モスコーニカップ等では公式がデータを出してくれています

まとめ

マジで目から鱗でした。

RailsじゃないRspecで書かれたテストに途中からFactoryGirl導入

背景

Railsではない環境でFactoryGirlを導入したけど、既存で書かれたテストに影響を
及ぼしたくない。

Rails環境だとFactoryGirl_railsがfactoryファイルのパスを自動で読み込んでくれるため
特に設定する必要はないが、ノーマルのFactoryGirlだと
definition_file_paths
find_definitions
の2メソッドを使用してFactoryファイルの場所を指定してあげる必要がある。

もし。既存テストをFactoryGirl無しで書かれている場合はspec_helper内で
設定を分ける方法が必要

shared_contextの活用

Factoryを使用するspecと使用しないspecでshared_contextを分けて定義する。

/spec/spec_helper.rb

shared_context 'Factory init', :factory_init => true do
  RSpec.configure do |config|
    # factory method
    config.include FactoryGirl::Syntax::Methods

 # factory path
    FactoryGirl.definition_file_paths = [File.expand_path('/home/imada/rails_app/spec/factories/', __FILE__)]
    FactoryGirl.find_definitions
  end
end

このshared_contextを定義することで既存specとfactoryを使用したspecとで設定を分けることができる。
Railsだと
config.include FactoryGirl::Syntax::Methods
だけでいいっぽいけど

後は実際のspecファイル内で

RSpec.describe "factory test", :factory_init => true do
end

を記述すればOK

まとめ

RailsじゃないRspecの情報が少なすぎて自分でどうにかするしかない。
テストを書く時には使用するGemをあらかじめちゃんと考えてから書く

WindowsとGit bashとLinuxコマンド

Windows環境でGit bash

Windows環境でもGit bashを使えばLinuxコマンドを使いながら開発できるぞ、キャッホーイと思っていた時期が私にもありました。

chmod使えない

Windows上でVSCodeを開きターミナルにはGit bashを選択しMacと同じ開発スタイルで楽しんでいた所、ビルドする時に楽をするためにshellを書いていたのですが、shellがうまく動かない。

ls -lで見てみるとどうやら実行権限がないみたい。はいはい、よくあるよね。ってことで

chmod 777 build.sh

これでいけるっしょ。

ls -l

変わっていないだと・・・。

Windowsファイルシステム

どうやらWindows10のファイルシステムNTFSが原因のようでした。

chmodコマンドはファイルに実行権限や読み取り書き込みの権限を付与するものなのですが、NTFSにはそもそも実行権限という属性を持っていないのでうまく動かないようです。

まとめ

.shを.exeにすればとりあえず動くので、そっから調整するのがいいかも。

Windows10 LaTeX環境構築 VSCode,Git Bash,Makefileも添えて

背景

LaTeXで作成されたドキュメントを修正する必要が出た。GUIよりCLIで操作したいので、GUIツールは入れたくない。

環境構築

www.ms.u-tokyo.ac.jp
1.こちらからインストーラをダウンロード

2.どこでもいいので、ファルダを解凍
3.abtexinst.exeを実行
4.
f:id:kosuke_rb:20191016165835j:plain
f:id:kosuke_rb:20191016160601j:plain

ファイル保存先と、インストール先を任意に設定して、次へをクリック(わかんない場合はデフォルトでOK)
dvioutとGhostscriptに関してもデフォルトでOKなので、次へをクリック

ファイルの取得がうまくいかない場合はURLの部分を他のURLに変更して実行するとうまくいく場合がある。

5.インストールファイルを選択して次へをクリックしインストール開始
6.GhostscriptはNextでOK
7.I Agree
8. Finishをクリック

再起動がかかると思うので、再起動します。

qiita.com
こちらの記事を参考に導入
※なくてもCLIで動きます。

note.mokuzine.net
こちらの記事を参考にWindows Makeを入れます。
Makefileとかいらねぇって人は飛ばしてもOK

qiita.com
こちらの記事を参考に設定

上記のコラボ設定を行っていれば
Ctrl+Shift+@(Windowsの場合)
でターミナルをVSCode上に出すことができる。

Git Bash
make -v

正常にmakeが導入されていれば

$ make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
これはフリーソフトウェアです. 利用許諾についてはソースを
ご覧ください.
商業性や特定の目的への適合性の如何に関わらず, 無保証です.

This program built for i386-pc-mingw32

みたいに表示される。

TeXファイル作成

なんでもいいので作成します。
ここでは
main.tex
として作成します。
※なんでもいいってなんやねんて方は
texwiki.texjp.org
を参考にすればいいと思います。

Texファイルのコンパイル

.texファイルのコンパイルは、日本語の場合「platex」です。使い方は、「platex オプション LaTeXファイル(*.tex)」になり、オプションには文字コードが入ります。
今回は

オプションで行います。
上記でmain.texを作成していると思うので

platex -kanji=euc main.tex


コンパイルします。
コンパイルに成功するとmain.dviというファイルが生成されます。

PDFに変換

コンパイルすると,dvi ファイル (main.dvi) が出来上がっていると思います。
この dvi ファイルを pdf に変換してドキュメント化します。

dvipdfmx main.dvi

を実行するとPDFファイルが生成されます。

Makefileの作成

毎回platex,dvipdfmxコマンドを打つのがめんどくせぇって方はMakefileを作成するといいかもしれません。

# Makefile

PLATEX   = platex -kanji=euc
DVIPDFMX = dvipdfmx
RM       = /bin/rm -f

TARGET=main.dvi

all:
	make again
	make pdf

pdf:
	$(DVIPDFMX) $(TARGET)

again:
	$(PLATEX) main.tex

allclean:
	$(RM) *.pdf *.old
	make clean

clean::
	$(RM) *.dvi *.aux *.log *.idx *.out\
		*.lot *.lof *.toc *~ 

このコードをMakefileというファイル名でmain.texと同じフォルダに保存します。
すると

  • make

コンパイルとPDF化を行う

  • make clean

make時に自動生成される一時ファイルを削除する

が使えるようになります。
※make,make cleanのどちらもMakefileがあるフォルダ内で行ってください。

これでめんどくさいコマンドや、うっとおしい一時ファイルともおさらばです。

まとめ

今回はLaTeX(ラテック、ラテフ)の環境構築をまとめました。
Makefileを作成しているのは、元々私がC言語のエンジニアだからです。
質問事項や、うまくいかなかった場合はコメントください。わかる限り回答します。