mof-brown

ずっとモフモフしてたい

2014年を振り返る

年明けてしまいましたが、昨年を振り返ってみます。
去年は↓のようなことを書いてました。

サーバーサイドエンジニアへ復帰

前職ではサーバーもフロントも両方やってたのですが、 今の会社ではフロントエンジニアとして入社しました。

で、昨年末から新しいプロジェクトにジョインしてフロント周りをやってたのですが、

  • サーバーサイドエンジニアが不足していた
  • ブラウザ×ソシャゲのフロント周りの技術については、前プロジェクトで一通り触って一旦満足してた
  • 今のプロジェクトのフロント周りは、技術的にレガシーなところや歴史的経緯によるコードが多く、モチベーションを保つのが難しかった

といった理由で、サーバーサイド側への復帰を希望してました。

会社として注力タイトルであったこと、リリース直後でリソースを寄せなければいけなかったこともあり、3月くらいからサーバーサイドエンジニアに復帰できました。

これまで経験したことのない規模の負荷であったり、ソシャゲならではのスピード感を求められる開発は色々勉強になってます。

社内チューニンガソンで1位になった

9月に社内チューニンガソンが開催されたのですが、中途メンバーの中で1位を取ることが出来ました。 まさか1位を取れるとは思ってなかったけど、1ヶ月くらい集中して勉強して入賞狙いにいってたので、これは素直に嬉しかった。

と同時に、小さい子供がいる中で勉強時間を確保するのは大変なことを実感...。

長男が1才になった

さらに可愛くなっている。ウンコは臭い。

勉強した技術

  • Spring 3.2
  • Java 8
  • Node.js
  • TypeScript
  • Golang
  • Beego
  • AWS
  • Chef
  • Ansible
  • Jenkins
  • zsh

こんな感じ。

はてなブログに引っ越しました

これまで「さくら×WordPress」でブログを運用してたんだけど、
特にその必要性を感じなくなってきたのと、
かかってた費用を違うところに使いたくなったので
はてなブログに引っ越しました。

といっても、技術的なネタは最近 Qiita に書いてますが。

Spring MVC で複数データソースを扱った場合の挙動を調べてみた

Spring MVC で扱うデータソースが2つある時、片方だけトランザクションを張った場合にもう片方の更新が反映されない、という問題に直面したので色々試してみた。Spring 初心者すぎて辛い。

環境

Spring 3.2.4

元々のソース

例えば user と groupというテーブルがあり、それぞれに対して更新する処理を書いていた。

#!java

@Service

public class HogeService {

@Transactional

public void update() {

userService.update();

groupService.update();

}

}

ここで、user と group とでDBを分けることになり、DataSource と TransactionManager を複数に分けた際、デフォルトの user は更新されるが group の更新がされなくなった。この挙動自体はまぁ当然。

(1) groupService 側にも @Transactional を指定してみる

これで両方トランザクションが張られて正常に動作した。

#!java

@Service

public class GroupService {

@Transactional(“group")

public void update() {

// update...

}

}

(2) afterCommit を利用してみる

今回は group 側にトランザクションを張らなくても良いケースだったので、試しに TransactionSynchronizationAdapter#afterCommit を利用してみた。

#!java

@Service

public class HogeService {

@Transactional

public void update() {

userService.update();

TransactionSynchronizationManager.registerSynchronization(

new TransactionSynchronizationAdapter() {

@Override

public void afterCommit() {

groupService.update();

}

}

);

}

}

これでうまくいくかと思ったが、group への更新は反映されなかった。何かイメージと違う。afterCommit の後に何か処理が走っているのか。

(3) user、group への更新処理をメソッド毎分ける

StackOverflow とか Spring 関連の記事を見ていると、結局これに落ち着きそうな感じ。もちろん想定通りに動作する。

#!java

@Service

public class HogeService {

@Transactional

public void updateUser() {

userService.update();

}

@Transactional(“group")

public void updateGroup() {

groupService.update();

}

}

時間も無く、結局うまいやり方が見つからないので、(3) の実装で一旦落ち着いた。

Eclipse 開発環境構築手順メモ (Mac OS X)

Eclipse をダウンロード

http://www.eclipse.org/downloads/

執筆時点では Kepler SR2 が最新でした。

eclipse-xxx.tar.gz を解凍し、好きな場所に配置

個人的には ~/dev/eclipse/kepler とかディレクトリ切ってます。

Eclipse を起動して各種設定を行う

  • 行番号を表示する
  • 文字コードの設定を UTF-8 にする
  • Code Assist のショートカットキーを Command + Space に変更する
  • Project Explorer ではなく Package Explorer を使う
  • Package Presentation を Hierarchical に変更する

必要に応じてプラグインをインストール

とか。

Mac の Evernote を完全アンインストールする手順

久しぶりに Evernote の断捨離をしてみたところ、1台の Mac だけうまく同期がされない現象が発生。Evernote を再インストールしてみるも以前の同期データを保持しているようでうまく行かず。

色々調べてみたところ、AppCleaner を使ってアンインストールしてみたところ、Evernote が完全にアンインストールされ、再度一から同期することが出来ました。

AppCleaner

  1. AppCleaner をインストール
  2. AppCleaner を起動して Evernote を検索
  3. Evernote を削除
  4. ゴミ箱を空にする (これをしないと完全アンインストールされなかった...)

はじめての Node.js (3)

今回は MySQL との接続周りを確認。 詳細は https://github.com/felixge/node-mysql の README 見たほうが早い。 MongoDB は今回は割愛。

 

Node.js からデータベースにアクセスする

 

 

 

  • 利用したい DB に対応するモジュールを使う

 

 

 

 

 

サンプルソース

 

#!js

var mysql = require('mysql');

 

// create connection.

var conn = mysql.createConnection({

user: 'nodejs_study',

password: 'nodejs_study',

database: 'nodejs_study'

});

 

// connect

conn.connect();

 

// create table.

conn.query('CREATE TABLE IF NOT EXISTS users (' +

'id INT(11) NOT NULL AUTO_INCREMENT,' +

'name VARCHAR(255),' +

'PRIMARY KEY (id)' +

')');

 

// execute query.

conn.query('INSERT INTO users(name) VALUES(?)', ['foo'], function(err, result) {

console.log(result.insertId);

});

 

// streaming query rows.

var query = conn.query('SELECT * FROM users;');

query.on('result', function(row) {

console.log(row);

});

 

// end

conn.end();