четверг, 14 мая 2009 г.

Сериализация immutable объектов

Понадобилось создать сериализацию/десереализацию immutable объектов. Вот что получилось. Есть класс в который всё сериализуется - Stream, и небольшая иерархия классов, которая включает в себя абстрактные классы.

import java.io.IOException;

/**
 * @author Alexander
 */
public class Stream {

  public Stream() {

  }

  public interface Streamable {
  public Stream writeObject();
  }

  public void writeString(final String key, final String value) {

  }

  public void writeInteger(final String key, final int value) {

  }

  public void writeLong(final String key, final long value) {

  }

  public String readString(final String key) {
  return "";
  }

  public int readInteger(final String key) {
  return 0;
  }

  public long readLong(final String key) {
  return 0;
  }

  public void saveToXML(final String filename) throws IOException {

  }

  public void saveToProperties(final String filename) throws IOException {

  }

  public void saveToBinary(final String filename) throws IOException {

  }

  public void loadFromXML(final String filename) throws IOException {

  }

  public void loadFromProperties(final String filename) throws IOException {

  }

  public void loadFromBinary(final String filename) throws IOException {

  }
}

/**
 * @author Alexander
 */
public abstract class BaseAbstract implements Stream.Streamable {

  private final String name;

  protected BaseAbstract(final String name) {
  validate(name);

  this.name = name;
  }

  protected BaseAbstract(final Stream stream) {
  if (null == stream) {
  throw new IllegalArgumentException("stream cannot be null");
  }

  final String name = stream.readString("name");

  validate(name);

  this.name = name;
  }

  private void validate(final String name) throws IllegalArgumentException {
  if (null == name) {
  throw new IllegalArgumentException("name cannot be null");
  }
  }

  public Stream writeObject() {
  Stream stream = new Stream();
  stream.writeString("name", name);
  return stream;
  }

  public String getName() {
  return name;
  }
}

/**
 * @author Alexander
 */
public class MiddleAbstract extends BaseAbstract {

  private final long x;

  protected MiddleAbstract(final String name, final long x) {
  super(name);

  validate(x);

  this.x = x;
  }

  protected MiddleAbstract(final Stream stream) {
  super(stream);

  final long x = stream.readLong("x");

  validate(x);

  this.x = x;
  }

  private void validate(final long x) throws IllegalArgumentException {
  if (x < 0) {
  throw new IllegalArgumentException("x cannot be less than zero");
  }
  }

  @Override
  public Stream writeObject() {
  Stream stream = super.writeObject();
  stream.writeLong("x", x);
  return stream;
  }

  public long getX() {
  return x;
  }
}

/**
 * @author Alexander D. Shalugin
 */
public final class Child extends MiddleAbstract {

  private final int v;

  public Child(final String name, final long x, final int v) {
  super(name, x);

  validate(v);

  this.v = v;
  }

  public Child(Stream stream) {
  super(stream);

  final int v = stream.readInteger("v");

  validate(v);

  this.v = v;
  }

  private void validate(final int v) throws IllegalArgumentException {
  if (v == 0) {
  throw new IllegalArgumentException("v cannot be zero");
  }
  }

  public int getV() {
  return v;
  }
}

Буду рад любым комментариям.

пятница, 24 октября 2008 г.

Чудесный Erlang

Посмотрел ещё одну презентацию про Erlang - http://highload.ru/papers2008/7179.html. Очень позабавил один из первых слайдов:

"На самом деле системы на Erlang вовсе не масштабируемые и не надежные. Это системы на Java такие. Системы на Erlang просто непробиваемы как скалы. Вячеслав Ахмечет"

четверг, 11 сентября 2008 г.

Как скрестить ужа и ежа --- интеграция Erlang и Java

Прочитал интересную статью про то как можно скрестить Erlang и Java.

К сожалению я не искушён в Эрланге, и у меня не получилось отослать сообщение от клиента к серверу. Была ошибка - {badrpc,nodedown}. Насколько я помню, вызов можно делать и другими способами, но пока ограничен во времени и не разобрался что к чему.

среда, 3 сентября 2008 г.

Learn Cocoa

Нашёл на просторах интернета очень интересный сайт - http://cocoadevcentral.com/. Сижу читаю, очень интересно.

понедельник, 1 сентября 2008 г.

CC 2008


Завершился Chaos Construction 2008. Хотя работ было не очень много, а если честно - очень даже мало. Спасало обилие реалтайм конкурсов, да семинары.

Поскольку я был организатором, мне многое увидеть не удалось. Одну работу я пожалуй отмечу - это первое место в конкурсе Procedural Graphics - klava by unc, Ized. Рекомендую посмотреть, работа есть на ftp.

Краем уха послушал семинар про ОС Фантом. Также заставил себя послушать половину семинара "Маленькая Java с большими возможностями" - докладчик либо очень очень сильно волновался, либо попросту был неподготовлен.

В общем и целом - всё было как всегда, суета, бессоница, интересные люди.

пятница, 15 августа 2008 г.

Oracle. Перевод интервала времени в секунды.

Недавна столкнулся с типовой и тривиальнейшей задачей:

Есть время начала, время окончания. Нужно вычислить интервал между двумя этими временами в секундах, при чём сделать это на Oracle PL/SQL.

Но как оказалось, здесь Oracle ставит нам подножку, т.к. не даёт человеческого способа сделать это. В Oracle результат операции разницы двух дат (переменных типа timestamp) является переменная типа interval. Так вот функции, которая конвертировала бы этот interval в секунды (минуты, часы, дни) нет.

Немного поискав, я понял что не одинок в поиске решения задачи.

Вот и получается что приходится извращаться:

SQL> select
2 EXTRACT(YEAR FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) YEAR to month) YEAR,
3 EXTRACT(month FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) YEAR to month) month,
4 EXTRACT(day FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) days,
5 EXTRACT(hour FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) hour,
6 EXTRACT(minute FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) minute,
7 EXTRACT(second FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) second
8 from dual;

YEAR MONTH DAYS HOUR MINUTE SECOND
---------- ---------- ---------- ---------- ---------- ----------
3 1 1124 2 26 33