среда, 30 сентября 2009 г.

Практика POV-Ray

POV-Ray - графический инструмент построения 3д сцен. Был разработан лет 30 назад, весит 12 мг, но позволяет очень много. Завлекла идея программировать картинки.

Убил 2 часа времени на ЭТО:



Update И еще 30 минут на доделку:




#include "colors.inc"
#include "textures.inc"

camera {
location <5, 13, -40>
look_at <0, 0, -5>
angle 48
}

#declare Steel = texture {
pigment { color rgb < 0.450, 0.450, 0.450> }
finish {
ambient 0.20
diffuse 0.75
brilliance 1.00
phong 0.70
phong_size 10.00
metallic
}
}

#declare Fire = texture {
pigment { color rgb < 0, 0, 1> }
finish {
ambient 0.5
diffuse 0.5
}
}

#declare Energy = texture {
pigment { color rgb < 1, 0, 0> }
finish {
ambient 0.5
diffuse 0.5
}
}


//Halo
cylinder {
<0, 1, 0>
<0, 0, 0>
7
texture { Steel }
}

//Body
union {
cylinder {
<0, -3, -12>
<0, -3, -3.5>
1
texture { Steel }
}

sphere {
<0, -3, -3.5>, 1
texture { Steel }
}

sphere {
<0, -3, -12>, 1
texture { Steel }
}
}

//Left gandola
cylinder {
<-2, -0.5, -13>
<-2, -0.5, -8>
0.5
texture { Steel }
}

//Left Fire
cone {
<-2, -0.5, -25>, 0.1
<-2, -0.5, -13>, 0.4
texture { Fire }
}

//Left energy indicator
cone {
<-2, -0.5, -7>, 0.4
<-2, -0.5, -8>, 0.5
texture { Energy }
}

//Right gandola
cylinder {
<2, -0.5, -13>
<2, -0.5, -8>
0.5
texture { Steel }
}

//Right Fire
cone {
<2, -0.5, -25>, 0.1
<2, -0.5, -13>, 0.4
texture { Fire }
}

//Right energy indicator
cone {
<2, -0.5, -7>, 0.4
<2, -0.5, -8>, 0.5
texture { Energy }
}

//Bridge
cone {
<0, 1, 0>, 2.5
<0, 1.2, 0>, 2
texture { Steel }
}

//Halo ferm
mesh {
triangle {
<-0.2, -3, -8>, <-0.2, -3, -4>, <-0.2, 0, -2>
texture { Steel }
}
triangle {
<0.2, -3, -8>, <0.2, -3, -4>, <0.2, 0, -2>
texture { Steel }
}
triangle {
<0.2, -3, -4>, <-0.2, -3, -4>, <-0.2, 0, -2>
texture { Steel }
}
triangle {
<-0.2, 0, -2>, <0.2, 0, -2>, <0.2, -3, -4>
texture { Steel }
}

triangle {
<-0.2, 0, -2>, <-0.2, 0, -4>, <-0.2, -3, -8>
texture { Steel }
}
triangle {
<0.2, 0, -2>, <0.2, 0, -4>, <0.2, -3, -8>
texture { Steel }
}
triangle {
<0.2, 0, -4>, <-0.2, 0, -4>, <-0.2, -3, -8>
texture { Steel }
}
triangle {
<0.2, -3, -8>, <-0.2, -3, -8>, <0.2, 0, -4>
texture { Steel }
}

}

//Left gandola ferm
prism {
linear_sweep
linear_spline
4,4.3,7,
<0,0>, <3,6>, <0,9>, <-6,9>, <-3, 6>, <-9,0>, <0,0>
texture { Steel }
rotate <-45,-90,0>
scale 0.3
translate <-1, -4, -9.3>
}

//Right gandola ferm
prism {
linear_sweep
linear_spline
4,4.3,7,
<0,0>, <3,6>, <0,9>, <-6,9>, <-3, 6>, <-9,0>, <0,0>
texture { Steel }
rotate <-135,-90,0>
scale 0.3
translate <-1, -2, -9.3>
}


light_source {
<10, 30, -25>
color White
}

light_source {
<10, -30, -5>
color White
}



Думаю, если бы использовал OpenGL, это заняло бы столько же времени, но зато можно было бы заюзать этот объект скажем в игре... а так просто получилась тупая картинка...

среда, 9 сентября 2009 г.

Применение EJB3

Как можно применить контейнер EJB3?

Технология EJB3 представляет из себя смесь различных технологий:

  • JPA, которая чаще всего используется с какой-нибудь ORM вроде Hibernate, TopLink или iBatis

  • IoC контейнер, причем не полный

  • Вполне приличный AOP

  • Автогенерацию веб сервисов



Как правило EJB3 применяют в связке с каким-нибудь MVC фреймворком, вроде JavaFaces. Основным недостатком такой схемы является то, что все эти фреймворки построены на основе Servlet API, что само по себе было бы неплохо, если бы JPA сессия не терялась при выходе из контекста EJB3, что за собой ведет проблемы lazy инициализации объектов бизнес модели.

Долго думаю над тем, как можно применять EJB3, при том, чтобы недостатки технологии не мешали разработке. Я пришел к выводу, что необходимо полностью отказаться от слоев, в которых не действует сессия JPA, т.е. от слоя представления. Слой представления же должен поддерживать связь с EJB контейнером посредством веб сервисов. Преимущества такой схемы:

  • Слой представления может быть реализован на любом динамическом языке, вроде Python, Ruby, Perl

  • Четкое выделение бизнес логики, позволит быстрее и проще ее тестировать

  • Более простое сопряжение с другими системами



Причем последний пункт считаю особо важным. Работая в сфере финансовых операций часто приходится объединять между собой различные системы. Для примера приведу случай из собственного опыта. Наша компания работает в сфере финансовых операций, а именно электронных платежей. Основным нашим продуктом является платежная система на ряд сервисов Кыргызстана. Благодаря тому, что бизнес логика доступна через веб сервисы мы легко можем ее соединить с другими сервисами компании.

среда, 2 сентября 2009 г.

Unit тесты в perl

Настоящему программисту должно быть пофиг на чем писать, главное следовать концепциям. Одной из важнейших я считаю TDD. Начав проект на перле, сразу полез искать имплементацию JUnit на перле. Таковым стали модули Test::Unit::TestCase, Test::Unit::TestSuite и Test::Unit::TestRunner

Сначала напишем TestCase

package SipPaymentTest;
use strict;
use base qw(Test::Unit::TestCase);

sub new {
my $self = shift()->SUPER::new(@_);
return $self;
}

sub set_up {
my $self = shift;
}

sub test_some_feature {
my $self = shift;
$self->assert(0);
}


Написав несколько случаев тестирования, нужен и инструмент запуска тестов:

%cat run.pl
#!/usr/bin/perl

use Test::Unit::TestRunner;
use Test::Unit::TestSuite;

require "lib/config.pl";
require "lib/aub.pl";
require "aubtest.pl";
require "nopaymenttest.pl";
require "sippaymenttest.pl";
require "sipprotocoltest.pl";

my $test = shift;
my $runner = Test::Unit::TestRunner->new();

my $suite = Test::Unit::TestSuite->empty_new("AUB Payment Terminal Test Suite");

if (!$test || $test eq 'AUB') {
$suite->add_test(Test::Unit::TestSuite->new('AUBTest'));
}
if (!$test || $test eq 'NoPayment') {
$suite->add_test(Test::Unit::TestSuite->new('NoPaymentTest'));
}
if (!$test || $test eq 'SipPayment') {
$suite->add_test(Test::Unit::TestSuite->new('SipPaymentTest'));
}
if (!$test || $test eq 'SipProtocol') {
$suite->add_test(Test::Unit::TestSuite->new('SipProtocolTest'));
}
my $result;
$runner->do_run($suite, 0);


Такой инструмент можно использовать для запуска как одиночных тестов, так и все сразу

%./run.pl NoPayment
........
Time: 1 wallclock secs ( 0.46 usr + 0.03 sys = 0.49 CPU)

OK (8 tests)
%./run.pl
..............F..........
Time: 6 wallclock secs ( 1.32 usr + 0.12 sys = 1.44 CPU)

!!!FAILURES!!!
Test Results:
Run: 24, Failures: 1, Errors: 0

There was 1 failure:
1) sippaymenttest.pl:50 - test_pay(SipPaymentTest)
'2009-09-03 13:07:16.427436' did not match /(?-xism:2009-11-22)/

Test was not successful.