Sep 12, 2007

JavaFX Basics (Part 2)

Прежде всего, JavaFX поддерживает как процедурную так и декларативную нотацию. Очевидно, что декларативный подход очень удобен при описании графического интерфейса. Попробую сделать краткий обзор основных возможностей и особенностей языка. Но тем не менее, рекомендую посетить сайты с оригинальной документацией, ссылки на которые я приводил в предыдущей статье.
Основные типы данных. JavaFX поддерживиет всего несколько основных типов данных:
  • String - java.lang.String
  • Boolean - java.lang.Boolean
  • Number - java.lang.Number
  • Integer - byte, short, int, long, java.math.BigInteger
Для описания массивов можно использовать оператор мощности. Он записывается следующим образом: ? - значение опционально (иожет быть null) + - одно или более значений * - любое количество значений Несколько примеров описания переменных:
var str:String = "Hi!"; var strs:String* = ["String1","String2","String3"];
Что касается массивов, то все они одномерные. То есть мы можем записать что то вроде:
var arr = ["Str 1 ","Str 2 ",["Str 31 ","Str 32 ","Str 33 "],"Str 4 "];
Но если мы попытается просмотреть содержимое переменной arr, то увидим, что это обычный плоский массив, совершенно идентичный следующей записи:
var arr = ["Str 1 ","Str 2 ","Str 31 ","Str 32 ","Str 33 ","Str 4 "];
Декларативная нотация. Другим интересным свойством языка является возможность использования декларативного подхода. Особенно впечатляет использования этого подхода при описании пользовательского интерфейса. Допустим у нас есть некий класс Customer, который содержит строковое свойство Name и числовое свойство Identity, тогда создать новый экземпляр класса мы можем следующим образом:
class Customer { attribute Name:String; attribute Identity:Integer; } var currentCustomer = Customer {Name: "Google" Identity: 1};

JavaFX Magic Numbers

Думаю любой программист испытывает дискомфорт, когда встречает в коде различного рода "магические цифры". JavaFX, похоже, содержит ряд "плохо документированных" констант. Я решил немного исследовать эту тему.
  • __DIR__ -- возвращает url каталога, в котором находится текущий исполняемый файл (скрипт). Это может быть url внутри jar, если скрипт находится внутри.
  • __FILE__ -- возвращает url текущего исполняемого файла.
  • __LINE__ -- Возвращает номер строчки, которая выполняется в данный момент.
  • __ARCHIVE__ -- возвращает url архива (jar), из которого выполняется данный файл (если такой вообще есть).
Просмотреть конкретные значения этих констант можно с помощью нехитрой программы:
import javafx.ui.*;
  
Frame {
    title  : 'Magic Constants'
    width  : 700
    height : 400
    content: Label {text: "<html><dl>
                           <dt>__DOCBASE__</dt><dd>{__DOCBASE__}</dd>
                           <dt>__DIR__</dt>    <dd>{__DIR__}</dd>
                           <dt>__FILE__</dt>   <dd>{__FILE__}</dd>
                           <dt>__LINE__</dt>   <dd>{__LINE__}</dd>
                           <dt>__ARCHIVE__</dt><dd>{__ARCHIVE__}</dd>
                           </dl></html>"}
       
    visible: true
}// Frame
Источник информаци : "Magic Constants" From Planet JFX

Sep 8, 2007

Firewall on Ububtu

Совсем недавно решил переустановить систему на своем основном компьютере (домашнем). До этого там стояла MS Windows XP. Но работала она очень плохо. Были очень неприятные проблемы. Самой ужасной - перезагрузка системы во время работы. В самые неожиданные моменты. Это очень похоже на проблемы с железом. Программы диагностики особо ничего не выявили. Одним радостным днем системе стало совсем плохо. При попытке войти в систему под любым пользователем она перегружалась. Я решил, что не буду пытаться ее восстанавливать (тем более что файлы были доступны удаленно и всю информацию можно было спасти), а просто переустановлю. Причем в качестве новой системы я выбрал линукс. Он не так сильно напрягает меня, а дома у меня нет особой нужды в программах под альтернативную платформу. Как Java Developer мне вообще не слишком важна целевая платформа. Наиболее актуальный для меня дистрибутив в данный момент SUSE. Я считаю его наиболее стабильным и отполированным. Более того, в этом дистрибутиве идет, не побоюсь этого слова, самый совершенный редактор настроек. Ну если не считать, конечно, прямого редактирования конфигурационных файлов. Однако, последнее время я слышу много восторженных криков по поводу Ubuntu. У этого дистрибутива хорошие, крепкие корни, большое число поклонников, но уж очень много PR. Я всегда с большой опаской отношусь, к продуктам, которые особенно активно рекламируют. Тем не менее, я решил попробовать. Не буду глубоко вдаваться в подробности, кратко выскажу свое мнение. Прежде всего этот дистрибутив абсолютно не тянет на почетное звание лучший desktop. У него огромное количество проблем. Встроенные средства конфигурации не покрывают и 10% системы. А то что покрыто, покрыто очень плохо. Доработка напильником требуется на каждом углу. Я был удивлен, когда мне говорили, что убунта не годится для новичков. Теперь мне стало понятно. Но я не могу не сказать, что общее впечатление от дистрибутива очень положительное. Это не Fedora, которую вообще противно использовать в качестве рабочей станции. (О серверах речи нет). Поэтому я довел начатое до логического конца и привел систему к состоянию, в котором ее реально использовать. Я хочу подчеркнуть, что проблем было довольно много, но все они решались легко. Решение было либо очевидными, либо легко находилось в документации, доступной в сети. Основные проблемы, на сколько я помню, можно выразить следующим списком:
  • Установка необходимого ПО и библиотек для проигрывания музыки и видео.
  • Установка проприетарных драйверов (видео).
  • Установка 3D рабочего стола.
  • Подключение к сети (странная проблема, сеть подключалась через раз).
  • Шрифты/ кодировки.
Как вы видите - проблемы тривиальные, и особых трудностей не вызвали. Хочу сосредоточиться на специфике моего случая. Основной компьютер подключен к внешней и внутренней сетям. Он выполняет функции брандмауэра. Поэтому встал вопрос доступа к Интернету из внутренней сети. Конечно, самый прямой способ это настройка конфигурации iptables. То есть включение masquerading/NAT. Кроме того, мне нужен DHCP сервер для внутренней сети, чтобы я не напрягался со статическими адресам и не менял настройки рабочего ноутбука. Итак имеем две проблемы:
  • DHCPd
  • Firewall + NAT
По прямому пути я не пошел, ведь у меня в руках самая дружественная система в мире. Прежде всего многих новичков очень пугает отсутствие возможности зайти под root. Точнее, пугает тот факт, что пароль супер пользователя неизвестен. При этом попытка произвести любое административное действие приводит к запросу пароля. Дело в том, что в Ubuntu используется немного другой подход, основанный на sudo. В чем его суть? Если не вдаваться в подробности, на все вопросы надо отвечать своим пользовательским паролем. Если есть необходимость запуска некой программы из консоли, но с правами root, надо выполнить следующий финт: sudo <название программы> Вас опять попросят ввести пароль - ВАШ ПАРОЛЬ! Одним словом все просто и прекрасно. Теперь вернемся к нашим проблемам. Установка dhcpd не вызывает особых проблем. Можно воспользоваться Synaptic - встроенным менеджером пакетов (не супер, но достаточно удобно и надежно). Либо прямо в консоль ввести sudo apt-get install dhcpd. Для особого удобства можно установить какую-нибудь программу для конфигурации этого демона. Самое интересное (для меня) второй пункт. На сколько это удобно можно сделать в Ubuntu. Решений много, я остановился на Firestarter. Это ПРЕДЕЛЬНО ПРОСТОЙ конфигуратор брандмауэра. Все сводится к простейшему визарду. Более того! Ferestarter берется настроить даже DHCP для внутренней сети. Однако в моем случае, возник небольшой конфликт. Так как установленный в системе демон и тот который хотел использовать Firestarter отличались версиями. Я не слишком расстроился, так как эта функция у меня уже и так работала, поэтому я просто пропустил настройку dhcp в Firestarter. Еще более приятным сюрпризом, для меня была возможность Firestarter показывать активные подключения и на лету модифицировать правила фильтрации. Но меня ждал один подвох. Как оказалось, я не могу войти из внутренней сети в корпоративный VPN. Это меня сильно огорчило. Тем более, что разработчики обещают исправить эту проблему только в следующем релизе Firestarter. Однако (как всегда!!!) решение есть. Причем достаточно прямое. Необходимо внести небольшую правку в один из конфигурационных файлов Firestarter. Открываем терминал и выполняем следующую магическую последовательность: # sudo -i < вводим СВОЙ пароль> # chmod +w /etc/firestarter/user-pre # gedit /etc/firestarter/user-pre В открывшемся редакторе вводим следующий текст: # Forward PPTP VPN client traffic $IPT -A FORWARD -i $IF -o $INIF -p tcp --dport 1723 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $IF -o $INIF -p 47 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $INIF -o $IF -p 47 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT Затем выполняем: # chmod -w /etc/firestarter/user-pre # /etc/init.d/firestarter restart После всех этих действий я получил возможность полноценно работать из внутренней сети. Буду рад, если эта статья кому-то поможет побороть его проблемы. PS. Вот уже прошел месяц использования дистрибутива Ubuntu. Какие выводы можно сделать. Прежде всего дистрибутив работает. И в нем можно работать. Ошибок в программах довольно много, но проблемы решаемые и особо не раздражают пользователя (меня) у которого нет времени долго и глубоко копать. Из оставшихся проблем - поддержка микрафона и skype. Удалось заставить работать и то и другое, но ... работают они не очень красиво. Добиться желаемого поведения на 100% мне не удалось.