четверг, 25 августа 2011 г.

ЛОР

Вот так лор обходится со своими посетителями:

Сообщение удалено JB по причине 'ничего не понял'  

За что?

http://sibrisk.blogspot.com/2011/07/linux-windows-mac-os.html
У меня на блоге побывал ЛОР. И вот я спрашиваю: по что, по что так закрючиваетесь? Если я люблю темный фон, то значит, что я слямзил это с ЛОРа? Ну что за фигня? Вот!
gopik (25.08.2011 18:48:28)

воскресенье, 31 июля 2011 г.

АЦПУ

Когда я получил диплом передо мной встала задача найти работу.
Я пустился во все тяжкие. Также как и при выборе института я руководствовался... ничем. Просто взял то, что давали в службе занятости.
Меня направили в комитет социальной службы по Центральному району.
Как программист я был полный ноль, но чувак который там работал окончил политех и, в принципе справлялся со всем сам. Однако, он скоро уволился  и мне пришлось херачить за двоих. Сначала пришел какой-то бухарик. проработал пару месяцев. Потом пришел чувак из АГУ. Отработал полдня. Потом пришла женщина из администрации. Ее заманили в комитет обманом.
Она была далека от всего этого и очень боялась, что я уволюсь.
Так вот, был у нас там, в кабинете( коридорчик шириной метр-двадцать и длиной метра четыре) АЦПУ - алфавитно-цифровое печатное устройство.
Молоточки долбили со страшной силой по барабану. На барабан надевалась лента, наподобие ленточек для матричного принтера, только большая как тряпка. Делать это все нужно было вручную: отмотать, отрезать, закрепить, намотать, вставить, проверить. Бумага использовалась простая рулонная без перфорации. Как следствие, приходилось постоянно стоять рядом с этой зубодробилкой и подправлять, подматывать бумагу. Каждые пять минут накапливалась статика и меня било током.
Однажды начальница решила, что нужно распечатать все документы за несколько лет. И я встал к станку.
К вечеру я ничего не слышал. Во сне мне снилось, что я стою у АЦПУ и сматываю вылезающую бумагу в рулоны.
АЦПУ медленно умирал - молоточки постепенно горели и я перепаивал рабочие молоточки  с краев в центр.
Вот такие дела, ребятки! До новых встреч!

Дэн

Мы сидели в малой аудитории, перед занятиями иностранным.
Дэн, сияя жирным широким лбом, смотрел изподолбья
на Саню взглядом обреченного на вечные муки сквозь
толстые заляпаные отпечатками пальцев стекла очков.
Сане нравилось его мучать. Саня веселился, пытаясь довести
Дена до срыва. Но Дэн молодцом! За его спиной было два
или три курса политеха, а там над ним издевались покруче
чем в педе. Да и издевался над ним, пожалуй, лишь Саня.
Остальные, видя в Дэне слабую нервную организацию, боялись
ранить его слишком сильно. Все мы знаем к чему приводят подобные
шутки. Тут Ден не выдержал и что-то сказал Сане.
Саня на полном серьезе вызвал Дэна на разборки.
Толпа пацанов вывалилась на университетский стадион.
Благо выпала длинная перемена.
Дэн стоял опустив руки, от страха видимо совершенно
лишившись сил. Саня один раз слегка задел его. Они потоптались
еще чуть-чуть и все пошли обратно в здание.
Однажды я разговарился с Дэном и он прилип ко мне.
По дороге на остановку он стал пересказывать какой-то
фантастический рассказ. Мне с трудом удалось сесть в трамвай.
Он был помешан на фантастике и видеоиграх, в которые он играл
на своем компе.
Он был очень одинок и к тому же страдал от этого.
Позже я часто видел его среди в толпе, посреди улиц города.
А может это был не он? Я не знаю.
P.S. made in geany

вторник, 26 июля 2011 г.

kill by one touch

Забодало меня процессы убивать. Либо долго искать диспетчер задач. Либо лезть в консоль и там, долго вбивать кучу букв.
Короче, есть в ubuntu файл  ~/.profile. Там есть следующие строки:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
Т.е., если создать папку bin в своей домашней папке, то все что ты туда положишь будет тебе доступно из любого каталога! Я полагаю, что это рекомендуемое место, для твоих личных утилит разного рода и скриптов.
И так, к сути:
  1. Открываем консоль
  2. mkdir ~/bin
  3. cd bin
  4. nano k
  5. печатаем следующий текст:
#!/bin/bash
if [ $1 == "" ]
then
   echo "Usage: `basename $0` part-process-name"
   exit 65
else
        kill $(ps -ef|grep $1|awk ' { print $2 } ')
fi 
 
6. нажимаем F3(сохранить) и F2(выйти).
7. в консоли вводим команду: chmod +x k - делаем файл исполняемым.
8. проверяем командой ls - k должен стать зеленым.
9. проверяем работу скрипта командой:
> k clock-applet

  • P.S. если каталог ~/bin(~ - сокращенное обозначение домашней папки в linux) не существовал до этого, то необходимо перезагрузиться или выйти(logout) и снова войти(login) в систему.
  • Удачи в освоении ubuntu linux!
  • В этот каталог можно складывать не только скрипты( и не только bash! но и груви и т.п.), но и самые разнообразные графические инструменты(или скрипты для их запуска).
  • Для последнего в ubuntu прекрасно подходит команда клавишами ALT+F2
 
 

четверг, 21 июля 2011 г.

Linux победил Windows и Mac OS

Linux операционная система будущего человечества - открытого и свободного. Это говорю вам я - человек сбежавший из застенок Редмонда. Да-да, как странно, сейчас, спустя пару лет вспоминать, что у меня даже понятия не было, что рядом со мной существует свободный и открытый мир. Мир, где ты не боишься нарушить чью-то лицензию всего лишь услышав, например чью-то песню. Linux и Java. Да-да, ведь оба эти творения человеческого гения используют одного и того же персонажа - любознательного пингвина. http://kernel.org/.
Пользователи Windows и Mac Os! Обращается к вам человек, познавший истинную свободу! Хватит томится в темнице старого прошлого! Пора вдохнуть полной грудью свободу! Ubuntu, Puppy, Mandriva, Fedora, Arch, Slackware, Open Suse, Open Solaris, etc.
Какие еще Вам нужны доказательства? Или вам нравится платить каждый год новые деньги за старый код?
Be Open - Be Free! Быть Открытым - Быть Свободным!

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

Как я вырезал клипы из DVD

Проблемка однако, вот есть DVD с клипами со звуком 7.1(DTS) и говноплеер LG(караоке)(больше ничего неизвестно, кроме того, что он ни хера не проигрует диск).
Смотрим через меню Windows Media Player и видим нужные нам 10 и 11 клипы. Но понять какие vob-файлы сложно. Начинаю анализировать vob-ы. Первое - в плеерах неверно отображается размер дорожек - файл в один гиг имеет длину 15-30 секунд. Лажа. Идем дальше запускаем ffmpeg с параметрами -ss 000 -t 00. Подло падает с какими-то ошибками типа "не монотонный трек".Цука! Думай, думай, думай!
Озарение! Клипы склеены! Причем между клипами еще какие-то вставки. При этом похоже они разного аудио видео формата. Не спрашивайте как это возможно, я сам в шоке! Но факт. Короче вооружившись терпением я начинаю калибровку диапазона и о чудо вырезаю первый клип. Со вторым повезло меньше - он оказался в разных vob-ах.
Склейка ffmpeg-ом ничего не дала, кроме многочасового траха.DivFix++ что-то исправлял в склейке, но легче от этого никому не было. Почти отчаявшись, наудачу, я качнул mencoder - и, о, чудо! файлы склеились. Даже без потери качества. Качнул уже знакомый DeVeDe и выбрал конфигурацию DVD для всех плееров.
Готово.
Постскриптум: остался один вопрос: каким образом сделать меню, чтобы всегда было меню или чтобы песни запускались сами?

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

Спонтанность

Слышится шелест листы...
Это не мое усилие и не усилие
кого-то другого.
Так проявляет себя
изначальная природа.
Больше ничего нет.
Таковость.

среда, 13 апреля 2011 г.

Думка №1

Вот думаю: завязать с блогосрачеством и еще с кучей всякой фигни.
Но скосив взгляд чуть вверх, на цифру 1, начинаю сомневаться в успехе. Кому нужна джава? Кому нужен дзен?
Ладно, всем бай! Пошел спать.

Посредник

import static java.lang.System.out;
import java.util.*;
public class app
{
 public static void main(String[] args)
 {
   out.println("Create ChatRoom");
   IChatRoom room=new ChatRoom();
   RussianUser ru=new RussianUser("Ivan");
   AmericanUser us=new AmericanUser("Jon");
   room.register(ru);
   room.register(us);
   out.println("reg users:");
   room.listUsers();
   ru.send("Jon","hello, Jon!");
   us.send("Ivan","Ok!");
   ru.send("Jon","Good by, Jon!");
   
   
 } 
}
interface IChatRoom
{
 void send(String from,String to,String message);
 void register(User _user);
 void listUsers();
 
}
class ChatRoom implements IChatRoom
{
 private Hashtable<String, User> users = new Hashtable<String,User>();
 public void send(String from,String to,String message)
 {
  users.get(to).receive(from,message);
 }
 public void register(User _user)
 {
  users.put(_user.getName(),_user); _user.setChat(this);
 }
 public void listUsers()
 {
  for(User user:users.values())
  {
   out.println(user.getName());
  }
 }
}
class User
{
 private IChatRoom chat;
 private String name;
 public User(String name){this.name=name;}
 public void setChat(IChatRoom chat){this.chat=chat;}
 public IChatRoom getChat(){return this.chat;}
 public String getName(){return this.name;}
 public void send(String to, String message)
    { chat.send(name, to, message);  }
  public void receive(String from, String message)
    { out.printf("\n%1s to %2s: '%3s'\n",from, name, message);  }
}
class RussianUser extends User
{
  public RussianUser(String name){super(name);}
  public void receive(String from, String message)
    {  out.println("\nRussian User receive message:");
  super.receive(from,  message); 
    }
}
class AmericanUser extends User
{
 public AmericanUser(String name){super(name);}
  public void receive(String from, String message)
    {  out.println("\nAmerican User receive message:");
  super.receive(from, message);  
     }
}

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

воскресенье, 10 апреля 2011 г.

Грязь

Наставник: что дороже: золото или грязь?
Джеки Чан: золото, однако!
Наставник: а если я дам тебе немного зерен?
/фильм Шаолинь/

среда, 6 апреля 2011 г.

Легко

Шагай легко шаг за шагом. Будто-бы каждый шаг сам по себе и нет цели. Будто-бы некая сила изнутри ведет неведомым уму путем.

суббота, 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 и т.д. В общем, в итоге родилась идея простого редактора, который сохраняет так как надо(в кодах):
Редактор файла свойств.

четверг, 24 февраля 2011 г.

Объект

В java существует набор правил умело применяя которые можно строить очень сложные объектно-ориентированные программы:
import static java.lang.System.out;
public class app
{
 public static void main(String[] args)
 {
  //создать объект можно при помощи ключевого слова 
  //new
  Human human=new Human("Jon");
  human.setFamily("Smith");
 //out.println(human.name); - ошибка доступа на этапе компиляции
  out.println(human.getName());
  out.println(human.family);// - а здесь все нормально
  out.println(human);//один из способов использования
  //унаследованного метода Object.toString();
 }
}
class Human
{
 private String name;
 //приватная переменная доступна 
 // только внутри класса у наследника
 // ее не будет!(для наследования нужно 
 // создать защищенную переменную protected
 public String getName(){return this.name;}
 //публичный метод виден из любого пакета
 public Human(String name)
 { //публичный конструктор с параметром
   this.name=name;
 }
 String family;//доступна только впределах пакета!
 public void setFamily(String family)
 {
  this.family=family;
 }
 @Override
 public String toString()
 {
  return super.toString()+";name="+name+";family="+family;
 }
}

Шаблон Цепочка ответственности

Также довольно простой в понимании шаблон.
Используется в основном для создания разнообразных
фильтров. Данные проходя через цепочку фильтров(обработчиков)
подвергаются различной модификации. Один из примеров
обработка URL, другой - обработка запросов в сервлетах.
// file: app.java
// build: javac app.java
// run: java app
 //задаем интерфейс обработчика, 
 //с возможностью задать следующего(setParent)
 interface Handler
 {
    public void setParent(Handler parent);
    public void handle(String url) throws Exception;
 }
 class FtpHandler implements Handler
 {
  private Handler parent=null;  
  @Override 
  public void setParent(Handler parent)
  {
      this.parent=parent;
  
  }
  @Override 
  public void handle(String url) throws Exception
  {
      //если объект подходящий - обрабатываем
      if(url.startsWith("ftp://"))
       System.out.println("FtpHandler resource handle success!");
      else//нет - передаем по цепочке другому обработчику
      if(parent!=null) parent.handle(url);//если цепочка прервалась
      else throw new Exception("Handler not found!");//сообщаем об этом 
      //и завершаем обработку
  }
 }
 class HttpHandler implements Handler
 {
  private Handler parent=null;  
  @Override 
  public void setParent(Handler parent)
  {
      this.parent=parent;
      
  }
  @Override 
  public void handle(String url) throws Exception
  {
      if(url.startsWith("http://"))
       System.out.println("HttpHandler resource handle success!");
      else
      if(parent!=null) parent.handle(url);
      else throw new Exception("Handler not found!");
  }
 }
 class ChainBuilder
 {
    public ChainBuilder(){}
    private Handler root=null;
    public Handler getRoot(){return root;}
    public Handler add(Handler handler)
    {
  if(root==null) root=handler;
  else           root.setParent(handler);
   return handler;
 }
 }
public class app
{
 public static void main(String[] args)
 {
    //суть паттерна цепочка ответственности
    //что мы заранее не знаем какой точно объект
    //будет подан на вход, следовательно не знаем какой
    //обработчик нам понадобиться. пример: адресная строка броузера
    ChainBuilder cb =new ChainBuilder();
    cb.add(new FtpHandler());
    cb.add(new HttpHandler());
    Handler handler=cb.getRoot();
     handle(handler,"https://narod.ru");
     handle(handler,"ftp://narod.ru");
     handle(handler,"http://narod.ru");
 }  
 public static void handle(Handler handler,String url)
 {
  try
  {
      handler.handle(url);
  }
  catch(Exception e)
  {
   //e.printStackTrace();
   System.out.println(e.getMessage());
  }
 }
}

среда, 23 февраля 2011 г.

Программа для просмотра курса валют по данным ЦБР

Программа для просмотра курса валют по данным ЦБР. Очень интересный проект. В том плане, что сервис ЦБР работает на Microsoft.Net и как следствие не дружит с java WS. Поэтому мне пришлось анализировать http-запросы, для того чтобы реализовать вручную SOAP-сообщения с параметром(на определенную дату) и вручную разбирать результат (xml).
Есть возможность распечатки курса валют за любой день.

Java-Игра Докер

Java-Игра Докер - старинная игра. Когда я учился в школе, на корветах была такая игра. Второй раз я столкнулся с ней в телевизоре. Прошел 17 из 20 уровней. Потом тв унесли в подвал. Поиск этой игры в интернете ничего не дал. В общем, я решил написать игру сам. В качестве IDE я использовал BlueJ - среда для изучения java. У меня получилось 3 объекта: кирпич, коробка и докер. В текстовом файле описывается карта и потом загружается в программе. Вообщем-то, это наверно, первый проект в котором я пытался мыслить объектно.Если есть желание - можно доработать в плане разработки набора карт, более удобное меню и сохранение результатов.

Шаблон Команда

Шаблоны программирования - это базовый инструмент для создания профессиональных программ. Знание шаблонов, пожалуй, важнее даже знания самого языка. Написание программы требует прежде всего мышления, а не знания. А шаблоны - это и есть процесс мышления предыдущего поколения программистов, обобщенный и оформленный в виде шаблонов. Команда - наиболее простой для первого знакомства шаблон. Позволяет упростить вызов любого количества действий в программе. При этом команда как бы делегирует выполнение действия другому объекту:
interface Command
{
 public void execute();
}
class ConnectCommand implements Command
{
 public void execute()
 {
   System.out.println("connect...");
 }
}
class ExitCommand implements Command
{
 public void execute()
 {
   System.out.println("exit...");
   System.exit(0);
 }
}
class app
{
 public static void main(String[] args)
 {
  Command cmd=new ConnectCommand();
          cmd.execute();
          //повторное использование уже
          //созданной команды
          cmd.execute();
          //использование единого интерфейса(унификация)
          cmd=new ExitCommand();
          cmd.execute(); 
 }
}
Используя данный шаблон в качестве основы легко организовать историю команд как например в текстовых редакторах наподобие Word или Writer с возможностью отмены.

среда, 16 февраля 2011 г.

Упаковка программы

Итак, программа написана, работает. Не очень удобно распространять свою программу ввиде кучи файлов(средний проект состоит из 10-100 классов). Не говоря уже о всевозможных ресурсах(картинки, xml и т.п.). В состав JDK входит утилита jar - упаковщик java-классов в один архивный файл. Возьмем программу из предыдущего примера:
jar -ec utils.app * > app.jar
Здесь используется два ключа: e - задать класс с main-функцией, c - создать архив. * таким образом со стандартного вывода результат работы утилиты будет записан в файл app.jar. По структуре это обычный zip-файл. Так что, в крайнем случае это можно сделать и без утилиты jar. Запустить программу из jar-файла можно двумя способами.
Первый работает, если как в этой статье была указана entry-point(точка входа в программу):
java -jar app.jar.
Второй универсальный(в том смысле что каждый класс в пакете может
содержать main-функцию, поэтому можно по разному запустить программу, в первом случае мы всегда начинаем выполнение программы из одной функции)
java -cp app.jar utils.app
просто добавляем jar-файл в переменную classpath(пути по которым загручик классов java class loader ищет нужные классы) и опять указываем путь к точке входа.

Вторая программа

Создайте каталог для своего второго проекта, в нем создаете
следующие каталоги ./src/utils и ./bin. В папке utils создайте файл
app.java:
package utils;
// - пакеты позволяют разделить
// программные модули - это еще одна
// особенность ООП
import  static java.lang.System.out;
// ООП позволяет подключать программные единицы
// находящиеся в других пакетах
//ключевое слово static
//в данном случае позволяет сократить форму
//записи использования объекта out
public class app
{
 private int a;//эту переменную можно
 // использовать только внутри класса 
 int b;//эту на уровне пакета
 public int c;//эта будет доступна 
 //из любого класса
 public static void main(String[] args)
 {
  out.println("Hello!");
 }
}

После этого откройте терминал в корневом каталоге и выполните команду:
javac -sourcepath ./src -d ./bin ./src/utils/app.java
перейдите в каталог bin и запустите программу
java utils.app.
Обратите внимание, что для запуска программы мы указываем
имя класса содержащего main-функцию вместе с именем пакета.
В противном случае java выдаст ошибку "Класс не найден!"

Первая программа

//файл app.java:
public class app
{
 //как видим для того чтобы запустить программу
 //нам необходима точка входа:
 //данный метод публичный (специфика ООП)
 // - иначе среда исполнения
 //java не увидит его и не выполнит программу!
 public static void main(String[] args)
 {
 }
}

для компиляции и запуска набираем две команды в терминале:
javac app.java
java app

Так как в коде не было ни одной инструкции программ сразу после
запуска завершит свою работу.
Попробуйте сами. Для программирования на java могу порекомендовать
сразу несколько инструментов JDK oracle 1.6(само собой разумеется),
текстовый редактор Geany и если вы очень ленивы и не хотите начинать с основ NetBeans IDE также от oracle.
Если все сделано правильно на выходе вы получаете app.class - скомпилированный байт код для виртаульной java-машины.