суббота, 26 марта 2011 г.

Не два!

Ум один.
 Контролировать его деятельность - строить дорогу в ад.
Ум проявляет себя также как слух или зрение.
Любое  проявление ума естественно!

пятница, 25 марта 2011 г.

Утро

Капли дождя стучатся в окно
Утро настало - вставать пора

Попс

В вашем мозге жиреет попс!

Именно, так! Сижу значит и думаю: какого х... эти ублюдки придумывают всякие хитровые..ные схемы задра...ия людей. Ведь, с..а, если ты без врожденных отклонений, то с первого взгляда отличаешь хорошего человека от плохого. Как много г...а в нас. Лживые обвинения честных людей. Это просто п...ц.


Скоро я расскажу о решении проблемы совместимости uniqueidentifier MS SQL SERVER и GORM(base on hibernate).

суббота, 19 марта 2011 г.

Система

А хороший автобус уехал без нас
Хороший автобус уехал прочь!

Редактор для groovy

Для того, чтобы начать написание groovy-скриптов достаточно перейти а каталог lib и выполнить команду:
~/apps/grails-1.3.7/lib$ java -cp ./groovy-all-1.7.8.jar groovy.ui.Console
В результате мы получим среду разработки для groovy без лишних движений:

пятница, 18 марта 2011 г.

Grails - первый шаг

JDK 1.6 установлен. Grails скачан и распакован.
Создаем первое приложение:~/projects$ /../../apps/grails-1.3.7/bin/grails create-app blog
Приложение готово(!),переходим в каталог приложения запускаем:
...grails-1.3.7/bin/grails run-app
Смотрим, что получилось:
http://localhost:8080/blog/
Создаем первый класс(сущность):
~/projects/blog$ /../../apps/grails-1.3.7/bin/grails create-domain-class note

Пока класс пуст, найдем его и дополним(blog/grails-app/domain/blog):
package blog

class Note {
    String title
    String text
    Date  bithDay
    static constraints = {
    }
}
Генерируем контроллер, представления и прочее:

blog$ /../../apps/grails-1.3.7/bin/grails generate-all blog.Note
.
Запускаем командой grails run-app:


Поздравляю, самое трудное позади. теперь все работает. Не забудьте, по умолчанию используется Hibernate Database In Memory. Все введенные данные сохраняются до перезагрузки грааля:
Итак, не считая времени написания статьи ;-) создание простенького блога заняло примерно(1-2 минуты!), если я соврал - поправьте меня. Java foreva!

Grails против Rails

На самом деле, я бы не стал так противопоставлять эти два каркаса(платформы?) для создания Web-приложений. Дело видимо в привычке. Главное отличие java-технологий от всех остальных это девиз компании Sun Microsystem(снимаю шляпу): "скомплировано один раз - работает везде". Конечно, сторонники php увидев RubyOnRails воскликнут:"Вау!!!". Не отрицаю, ruby и rails качественно и гармонично. Но, есть одно "но" - чтобы установить последнюю 3-ю версию rails нужен интернет(так и не нашел gem-ов для 3-ки). А 2-я версия так и не встала на мой MS Windows XP в режиме off-line.
Помню, когда я только начал изучать java, я сразу по достоинству оценил приятное свойство java - я перестал обращать внимание на операционную систему в которой программировал(благо редакторов и интегрированных сред разработки больше чем достаточно под обе ОСи).
Grails даже не нужно инсталировать - распаковал и запустил. Grails обновился и теперь я могу полностью обновленный и рабочий Grails запустить на другой машине без интернета.
Ну а язык Groovy - серьезный конкурент Ruby. Особенно если вы привыкли к специфике java. В следующих статьях я постараюсь наглядно продемонстрировать возможности Groovy и грааля ;-).
Grails или Rails(грааль или рельсы) решать вам!

пятница, 11 марта 2011 г.

ruby on rails

Случайно зашел на сайт rubyonrails.org и посмотрел ролик о разработке web-приложений. Често скажу: я офигел! Так просто и при этом кроссплатформенно. Да еще сообщество! Салют! Почитал отзывы зубров - отпад! Сейчас ставлю на свою ubuntu. Хотя можно и netbeans поиграть, но хочется начистую. Пока проблема с gem - типа системы управления пакетами только для ruby. Если ставить с сайта, то бинарник ставится не как gem, а как gem1.8. Учтите это пытаясь выполнить установку rails. sudo gem1.8 install rails

четверг, 10 марта 2011 г.

Обобщение

Обобщение(или абстракция) - способность программиста увидеть существенные для модели свойства. Пример: дверь лифта. Если слишком детализировать модель получим 2 объекта: дверь и лифт. Но если подумать в модели лифта нас лишь интересует состояние двери и достаточно в объект ЛИФТ добавить логическое поле ДВЕРЬОТКРЫТА:
Чрезмерная детализация модели:
class Lift
{
 public Door;
}
class Door
{
 public boolean isOpen;
}
Оптимизированая модель:
class Lift
{
 public boolean isOpenDoor;
}

Строитель

Шаблон позволяет уменьшить связь клиентского кода и логики создания сложного объекта при помощи цепочки интерфейсов: управляющий класс - практически не меняется, затем строитель описывающий методы и собственно сложный объект. Также позволяет задать порядок построения частей как в этом примере, что может быть очень важно, а пользователь объекта может об этом не знать. Так задать тип человека(ребенок, взрослый или старик) нельзя не зная возраста!
public class app
{
 public static void main(String[] args)
 {
  LifeCircle lc=new LifeCircle();
  lc.setHumanBuilder(new ManBuilder());
  lc.build(13);
  System.out.println(lc.getResult().type);
  lc.build(20);
        System.out.println(lc.getResult().type);
  lc.build(100);
  System.out.println(lc.getResult().type);
 }
}
abstract class Human
{
 public int age;
 public String type;
}

class Man extends Human{}

interface HumanBuilder
{
 public void buildAge(int age);
 public void buildType();
 public Human getResult();
}
class LifeCircle
{
 private HumanBuilder humanBuilder;
 public void setHumanBuilder(HumanBuilder builder)
 {this.humanBuilder=builder;}
 public void build(int age)
 {
  this.humanBuilder.buildAge(age);
  this.humanBuilder.buildType();
 }
 public Human getResult()
 {return this.humanBuilder.getResult();}
}
class ManBuilder implements HumanBuilder
{
 private Human human=new Man();
 public void buildAge(int age){human.age=age;}
 public void buildType()
 {
  if(human.age>0 && human.age<=15) human.type="children";
  if(human.age>15 && human.age<=55) human.type="man";
  if(human.age>55) human.type="grand man";
 }
 public Human getResult(){return this.human;}
}


Абстрактная фабрика

Обеспечивает общий способ создания родственных или связанных объектов без указания конкретных классов:
public class app
{
 public static void main(String[] args)
 {
  Secretar secretar=new Secretar();
  DocumentFactory factory=new MSOFactory();
  secretar.setDocumentFactory(factory);
  secretar.makeTableDocument().print();
  secretar.makeTextDocument().print();
  factory=new OOOFactory();
  secretar.setDocumentFactory(factory);
  secretar.makeTableDocument().print();
  secretar.makeTextDocument().print();
      
  
 }
}
class Secretar // - Client
{
 private DocumentFactory docFactory;
 public void setDocumentFactory(DocumentFactory factory)
 {
  this.docFactory=factory;
 }
 public TextDocument makeTextDocument()
 {
  return docFactory.createTextDocument();
 }
 public TableDocument makeTableDocument()
 {
  return docFactory.createTableDocument();
 }
}
abstract class DocumentFactory
{
 abstract TextDocument createTextDocument();
 abstract TableDocument createTableDocument();
}
abstract class TextDocument
{
  abstract void print();
}
abstract class TableDocument
{
  abstract void print();
}
class WordDocument extends TextDocument
{
 public void print(){ System.out.println("MS Word Document");}
}
class ExcelDocument extends TableDocument
{
 public void print(){ System.out.println("MS Excel Table");}
}
class OpenDocument extends TextDocument
{
 public void print(){ System.out.println("Open Office Document");}
}
class OpenTableDocument extends TableDocument
{
 public void print(){ System.out.println("Open Office Table");}
}
class MSOFactory extends DocumentFactory
{

 public TextDocument createTextDocument()
 {
  return new WordDocument();
 }
 public TableDocument createTableDocument()
 {
  return new ExcelDocument();
 }
}
class OOOFactory extends DocumentFactory
{

 public TextDocument createTextDocument()
 {
  return new OpenDocument();
 }
 public TableDocument createTableDocument()
 {
  return new OpenTableDocument();
 }
}

Простая реализация итератора

Одним из паттернов проектирования является итератор - организация определенного порядка извлечения элементов из списка. Здесь показана реализация программного интерфейса, из спецификации java:
apublic class app
{
 public static void main(String[] args)
 {
   List<Human> lst=new List<Human>();
  
   lst.add(new Human("Jerry"));
   lst.add(new Human("Mary"));
   lst.add(new Human("Jon"));
     lst.add(new Human("Bluz"));
     lst.add(new Human("Jon"));
java.util.Iterator iter=  lst.getIterator();
   while (iter.hasNext()) {
    
       System.out.println(iter.next());
     }

   
 }
}
class Human
{
 String name="";
 public Human(String name)
 {
  this.name=name;
 }
 public String toString()
 {
  return super.toString()+"@name="+this.name;
 }
}
class List<T> implements java.util.Iterator
{
 private Object[] list=null;
  private int index=-1;
 private  int capacity=2;
 private  int size=0;
 public List()
 {
    init();
 }
 public List(int capacity)
 {
  this.capacity=capacity;
  init();
 }
 private void init()
 {
  list=new Object[capacity];
  size=capacity;
 }
 private void resize()
 { 
  int oldsize=size;
  size=size+capacity;
  Object[] lst=new Object[size];
  for(int i=0;i<oldsize;i++)
  {
   lst[i]=list[i];
  }
  list=lst;
  //System.out.println("===resize===");
 }
 public void add(T obj)
 {
 //System.out.println(index);
 //System.out.println(size);
  index++;
  if(index>=size)
   resize(); 
  list[index]=obj;
  
 }
   public boolean hasNext()
   {
   if (cursor == -1)
   return list.length > 0;
   return cursor < list.length;
  }
  private  int cursor;
 public java.util.Iterator getIterator()
 {
  
  cursor = -1;
  return (java.util.Iterator)this;
 }
 public Object next()
 {
  System.out.println(cursor);
  if(cursor==-1) cursor=0;
  Object nxt=list[cursor];
  cursor++;
  return nxt;
 }
 public void remove(){}
}

среда, 9 марта 2011 г.

За и против

Вы уже выбрали свой путь? Определились с тем, кто вы? Поздравляю! Потому что, я сколько не стараюсь никак не могу отрешиться от поисков правильного в кавычках пути, хотя, давно уже понял, что нет ни правильного ни неправильного. Есть лишь болезнь ума. Кто-то сказал, что бог дав человеку разум наказал его, дав ему также безумие (вроде как обезьяны не страдают шизофренией).

воскресенье, 6 марта 2011 г.

UML

Сегодня случайно зашел в книжный магазин и (случайно) купил книжку Пола Киммела "UML Основы визуального анализа и проектирования(раскрытие тайн)". Вообщем-то, отличная книга. Довольно просто объясняется UML. Единственное замечание - издательство при переводе допустило слишком много опечаток при переводе надписей в диаграммах(часто просто пропущены надписи описываемые автором). Прочитав пару глав, я решил набросать пару диаграмм. Для этого использую открытое ПО argoUML. Написано на java. И тут я понял, что для использования uml нужно больше чем знание семантики. Нужно уметь проектировать: выделять значимое, деталезировать процессы и т.п. Хотя я только начал изучение. И диаграмма прецендентов не такая уж сложная. Имея ее под рукой легче ориентироваться при разработке проекта.

суббота, 5 марта 2011 г.

Редактор файла свойств

Начав изучать интересный фреймверк javaswingbuilder, позволяющий декларативно описать пользовательский интерфейс и привязку данных к элементам я натолкнулся на одну проблему: если ключи содержат русские буквы, то билдер просто их не воспринимает или выдает исключение при попытке считать файл. Собственно он пытается читать в кодировке utf-8, но в стиле java, т.е. ему нужны коды типа /u001 и т.д. В общем, в итоге родилась идея простого редактора, который сохраняет так как надо(в кодах):
Редактор файла свойств.