суббота, 29 января 2011 г.

Про установку Redmine

Решил сегодня поставить Redmine (http://www.redmine.org). До этого пользовался Trac.
Redmine кажется круче (по крайней мере по количеству кнопок на главном окне :) )

Установка системы хорошо описана.

Долгое время не мог сделать мигрейт на базу данный с команды rake db:migrate RAILS_ENV=»production». Rake все время ругался на ошибку синтаксиса в файле config/database.yml. Проблема, оказывается, была в том, что я в вим поставил табы вместо нескольких пробелов. После замены все заработало.

Compojure 0.6.0

Я пропустил объявление о выходе новой версии библиотеки Compojure - http://groups.google.com/group/compojure/browse_thread/thread/4f8574d808ddf53e.
Теперь он поддерживает контексты.

пятница, 21 января 2011 г.

Начало проекта с Scala, Vaadin и Circumflex ORM

Решил написать простенькое приложение на Scala с использованием Vaadin и Circumflex ORM.
Запустил Netbeans. Создал maven проект с Simple Vaadin Application archetype. Для теста запустил. Выключил. Полез в гугл за ответом на вопрос "как в приложение java внедрить scala". Нашел работающее решение на http://stuq.nl/weblog/2008-11-26/4-steps-to-add-scala-to-your-maven-java-projects. Взял конфиг, который умеет обрабатывать циклические ссылки со скалы на java и обратно.
Затем написал тестовый класс на scala.


import com.vaadin.Application
import com.vaadin.ui._
import ru.circumflex.orm._
import com.kitprof.soma.entity._


class MyVaadinApplication extends Application {

def init = {
val window = new Window("My Vaadin Application")
window.addComponent(new Button("Click Me"))
setMainWindow(window)
}
}


Все прекрасно работает.

Теперь мне нужна база данных. Для разработки, я думаю, подойдет и h2 (Легкая, быстрая СУБД). Открываю pom.xml и добавляю


        com.h2database
        h2
        1.3.149

В качестве ORM я решил попробовать Circumflex ORM. Для этого в pom.xml пишу


        ru.circumflex
        circumflex-orm
        2.0.RC3
    

Circumflex для работы требуется файл с настройками cx.properties. Его нужно создать вручную в папке src/main/resources. В моем случае он имеет следующее содержимое:
orm.connection.driver=org.h2.Driver
orm.connection.url=jdbc:h2:~/test
orm.connection.username=myuser
orm.connection.password=mypassword
Значения всех параметров, я думаю, интуитивно понятно.
В моем приложении будут пользователи. Они должны иметь возможность авторизоваться, поэтому мне нужно, как минимум, два поля: логин и пароль. Итак,


import ru.circumflex.orm._

class User extends Record[String, User]{
val login = "user_login".VARCHAR(50).NOT_NULL
val password = "user_password".VARCHAR(50).NOT_NULL

def PRIMARY_KEY = login
def relation = User
}

object User extends User with Table[String, User]

Теперь мне нужно создать в базе таблицу users с полями user_login и user_password. Как и любая серьезная ORM тулза, Circumflex умеет сам создавать схему базы данных. Для меня самым удобным представился вариант через написание кода, поэтому в методе init класса MyVaadinApplication я добавил следующие строки:

    val ddl = new DDLUnit(User)
    ddl.DROP_CREATE

Метод DROP_CREATE каждый раз удаляет и создает схему заново. При разработке приложения, когда поля и свойства полей (такие как длина) часто меняются это очень удобно. Однако при тестировании удобно, когда в базе уже есть некий набор тестовых данных. Например, в моем случае не плохо было бы иметь несколько пользователей и не создавать их каждый раз после регенерации схемы базы данных. Для меня самым удобным представляется вариант создания некоего класса Bootstrap (привет liftweb.net), где будет код вида
 if (usersCount == 0) createTestUsersPlease()
Да, кстати, нужно попробовать запустить приложение, нажимаю Run и вижу, что все работает. H2 при этом создает в пользовательской папке файл test.h2.db (помните параметр orm.connection.url).

вторник, 18 января 2011 г.

Несколько часов возился с EJB 3.1.
Создал банальный бин UserEjb.

@Stateless

public class UserEjb{



@PersistenceContext(unitName="EjbPU")

private EntityManager em;


public User findById(Long id) {

return em.find(User.class, id);

}


public User create (User user){

em.persist(user);

return user;
}



public User findByLogin(String login){

return (User) em.createQuery("select user from User as user where user.login = :login").setParameter("login", login).getSingleResult();

}


public User edit(User user){

em.merge(user);

return user;
}

}

В классе vaadin он никак не хотел создаваться с помощью аннотации EJB, хотя все сделал как указано в из примере На сайте ваадин

В итоге пришлось написать такой код:

UserEjb userEjb = (UserEjb) new InitialContext().lookup("java:module/UserEjb");

четверг, 6 января 2011 г.

Rails на Clojure

По адресу https://github.com/macourtney/Conjure проживает Rails подобная библиотека для разработки веб приложений на языке Clojure. Из ее особенностей хочется отметить:

1. В качестве слоя доступа к базе данных (ActiveRecord в Rails) используется библиотека clj-record. Это позволяет удобно писать зависимости между сущностями бд, почти как в ActiveRecord, в стиле has_many, belongs_to.

2. Может работать на Google AppEngine. Для этого при создании проекта достаточно набратьlein conjure new -database google-app-engine. А затем с помощью lein uberwar создается веб архив.

3. Удобная работа с Ajax.

Пока из того, что не понравилось – при генерировании модели можно из числовых типов можно указать только integer. Может быть я чего-то не понял, нужно копать дальше. По завершению всех копательств нужно будет написать пост с полным описанием фреймворка.