RubyとJavaで同じようなプログラムを書いたけど結局どちらが正解なのかわからん

RubyJavaで同じようなプログラムを書いたけれど一長一短。
Rubyはまぁ、あとからメンテする人がいないので実戦投入できないけれど。
テストで流れを確認するにはRubyの表現力はいい感じだけどJava(Eclipse)の補完も捨てがたい。
今回はRubyのヒアドキュメントが良いのよね。

Unity5の教科書 6章 クソゲー爆誕

6章は雲をジャンプしていくやつなんですけどね。。雲を適当にドラッグアンドドロップでフィールドにおいたら超つまんないの。
Unity WebGL Player | ClimbCloud
いやー、ゲームバランス取るのってとっても難しいですね。

物理シミュレーションとか当たり判定とか全部Unityがやってくれるのね。スプライトアニメーションもドラッグアンドドロップで大抵のことはできるし。デバイスの傾きセンサーとかもラップしてくれて使いやすいし。メニュー、ゲームの画面遷移も後先考えずに一行ですよ。すごい時代になったものです。本当にアイデアのみが必要な世界になったのかな?


github.com

それはそうと相当炎上していたプロジェクトを強制消火させたので今日は遊ぶ時間がとれてたのしー

Unity5の教科書 4章

WebGLで書き出してみました。
Unity WebGL Player | SwipeCar

ビルド時間かかるわー。macbookproのcorei5のメモリ16G積んでいても30分ぐらいかかる。
ちょっと辛いわー。
教科書のソースの抽象度が一定ではないので一定にした。
関数の抽象度は一定にすべき。ソースの書き方を指南する本ではないのでmain的なupdate関数にまるまる書くのは理解を助けるのには役立つけどプロダクションコードではきちんとメソッド分割すべき。まぁ、メソッド分割とかコードの抽象度の統一とかは業務系システムのセオリーでゲーム畑はどうなのか知らんけど。メソッドコールが速度的に耐えられないとかいう文化があるのかもしれない。
@GameController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;

public class GameDirector : MonoBehaviour
{

	GameObject car;
	GameObject flag;
	GameObject distance;

	// Use this for initialization
	void Start ()
	{
		this.car = GameObject.Find ("car");
		this.flag = GameObject.Find ("flag");
		this.distance = GameObject.Find ("Distance");
	}
	
	// Update is called once per frame
	void Update ()
	{
		float length = getLength ();
		if (length >= 0f) {
			setText ("to Goal," + length.ToString ("F2") + "m");
		} else {
			setText ("GameOver");
		}

	}

	float getLength ()
	{
		return this.flag.transform.position.x - this.car.transform.position.x;
	}

	void setText (String str)
	{
		this.distance.GetComponent<Text> ().text = str;
	}
}

@CarController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarController : MonoBehaviour
{
	// 速度
	float speed = 0;
	// 初期場所
	Vector2 startPos;

	// Use this for initialization
	void Start ()
	{
		
	}
	
	// Update is called once per frame
	void Update ()
	{
		// スワイプの長さを求める
		detectMouse ();
		// 移動
		move ();
		// 減衰
		decay ();
	}

	/**
	 * スワイプの長さを求める
	 */
	void detectMouse ()
	{
		if (Input.GetMouseButtonDown (0)) {
			this.startPos = Input.mousePosition;
		}
		if (Input.GetMouseButtonUp (0)) {
			Vector2 endPos = Input.mousePosition;
			float swipeLength = endPos.x - this.startPos.x;

			this.speed = swipeLength / 500.0f;
			play ();
		}
			
	}

	/**
	 * 移動
	 */ 
	void move ()
	{
		transform.Translate (this.speed, 0, 0);
	}

	/**
	 * 減衰
	 */ 
	void decay ()
	{
		this.speed *= 0.98f;
	}

	/**
	 * 音声再生
	 */ 
	void play ()
	{
		GetComponent<AudioSource> ().Play ();
	}
}

github.com

Zabbix3でJavaアプリログのExceptionを補足してメールぶっ飛ばす

世の中には看過してよいExceptionと看過してはいけないExceptionがあります。

我らがZabbixでJavaアプリケーションログのExceptionを検知してメールをぶっ飛ばす方法を考えます。

背景

NullPointerExceptionがおきてエラーページに飛んでいた状態に気づかずに1ヶ月ぐらい放置してしまってお客様に指摘されて直すとかありました。
もっと先に気づいて闇に直すことをできるようにしたいと同僚に言われ検証してみる。Javaアプリに手をいれることを考えたが、Javaアプリは糞重いのでこれ以上処理を増やしたくない。
そこでzabbixに登場していただくことにしました。
もちろん無視して良いExceptionもあるので発生したExceptionをメールに載せる、というのを今回はやりたいと思います。
メールがきたらログを見に行くワークフローを想定。
productionでは便利に使えるsmtpサーバーがあるとおもいますが、今回は検証ということでsmtp.gmail.comを使います。
また、本来はアプリごとに一発で決めれるテンプレートを作るべきですが、検証なので直接ホストにアイテム等突っ込みます。
3年ぶりぐらいにzabbix触りました。

環境

  • アップグレードしっぱいしてこわれたUbuntu14か16かわからないサーバー
  • Zabbix3.x(パッケージシステムで入ったやつ)

zabbixのインストール

適当にググってください。いっぱい出てくる
DBの日本語化はZabbixの日本語文字化けを解消する方法 - geek.conf.2を参考にしました。

1.アイテム

f:id:new_pill:20170326011539p:plain

名前 :適当
タイプ:Zabbixエージェント(アクティブ)
キー:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1]
データ型:ログ
更新間隔(秒):1(適当)
ヒストリ保存期間(日):7(適当)

2.トリガー

f:id:new_pill:20170326011841p:plain

名前:InfoExceptionTrigger(適当)
深刻度:情報
条件式:
{zabbix-server:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1].strlen()}>0
and
{zabbix-server:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1].nodata(5s)}=0
正常イベントの生成
障害イベント生成モード:複数
  • 条件式は正規表現でExceptionの値を取り出していること
  • 5秒たったら正常復帰

今回は検証なので/var/log/test.logを監視している。
ちょっと残念なところはトリガーが2回ずつ呼ばれてメールが発信されてしまうこと。nodataが原因らしいけどうまい解決方法が思いつかない。

3.メディアタイプ

メールタイプで作成
zabbix gmail smtpとかでググると設定がでてきますね。
gmailを使う場合は「セキュリティの弱いプログラムを許可」しないとだめっぽい。
何回かメールぶん投げているとprevent sign in attempt みたいなメールが来て、そこに許可のためのURLが乗ってる。
捨てgmailアドレスを使うことをおすすめ。何れにせよgmailは一日500通の送信制限があったとおもうので実運用には向かないですね。

4.アクション

f:id:new_pill:20170326012409p:plain
f:id:new_pill:20170326012512p:plain
適当につけた名前をつなげる。
3で作ったメディアタイプをつなげる。

メッセージの件名:{TRIGGER.STATUS}: <{ITEM.VALUE1}> :{TRIGGER.NAME}

とすることでNullPointerExceptionとかRuntimeExceptionとかが件名にはいるので気にしなくて良いExceptioonは本文見なくても良くなるのでおすすめ。

5.ユーザーに3で作ったメディアタイプで送信先メールアドレスを追加

これがプロダクションだと社内向けメーリングリストとかになるのだとおもう。

6. 確認

echo "aaa " `date "+%Y%m%d%H%M%S"`Exception bbbb >> /var/log/test.log

とかしてメールが届けはOK。検証完了です。
一回のExceptionでトリガーが2回、回復が1回の3通メールが飛びます。

7.感想

やっぱりZabbixはややこしい。変にスクリプト書くよりも標準機能でなんとかするのが後の人のことを考えた方法だと思う。あと、本番投入の際にはきちんとワークフローの設計もふくめて検討して設定しないと早晩ぐちゃぐちゃになるのがZabbix。あとおれはインフラ系ではないのでZabbixのことはよくわかっていない。

Unityで遊んだ。

nn-hokuson.hatenablog.com
なんか1時間で遊べるシューティングが作れるってよ。本当に1時間で出来たわ。本買ってもうたわ。
10年ぐらい前に「ゲームプログラマになる前に覚えておきたい技術」を読んだときは死にそうになったものだけれど。
めっちゃ楽やね。衝突判定書かなくて良いとか。。UnityでC#のプログラム覚えましたって人は信用出来ないね。これは楽すぎる。
これでクロスプラットフォームとかすごいねぇ。久々にC#書いたけど良いね。書いたとも言えない行数だけど。キャストするのではなくComponent取る感じがSeasarのDIっぽい。

自分で爆発音をつけてみるカスタマイズをしてみた。LINEアプリで録音して共有でメールに飛ばして適当にカットして、と。最速でアセット用意するメソッドかもしれん。

Github pagesで公開してみました。
Unity WebGL Player | SampleShooting
Chromeでも動くね。Firefoxは知らん。

ソース

github.com

Rails Tutotial 14章 完了

何回も通ったfollow/unfollowのところ。
今回は一番理解が進んだかも知れない。やっぱり日本語だったのが大きいねぇ。自分の英語力のなさに失望感も少しありつつ。最先端は追いかけられないけどもうそんな若くないし一周遅れてキャッチアップすれば良いのかなと思ってみたり。

今回はcloud9とかも使ってみたりして最新の開発環境も体感したけどEmacs+iTermで結局一番しっくりくるから、老害になったなと。

まぁ、ともかく終わりました。

やったね!、と。

Home | Ruby on Rails Tutorial Sample App