Tuesday, July 31, 2007

Multiple WAN: OpenWRT solution

Некоторое время назад провайдер, к которому я был подключен наверное больше 4 лет (IpNET) стал совсем уж слабо удовлетворять моим требованиям. По этому я решил сменить его. Но у ИпНета есть один довольно существенный плюс - его внутренняя сеть. И как-то не хотелось терять возможность качать со скоростью 5-6мб/сек. Да и покупка ноутбука с WiFi добавила ещё одну причину поменять рутер.

Недолго думая, я остановился на Asus WL500g Premium. Он сравнительно недорогой (~$90), но, судя по описанию, вполне мог обеспечить необходимый функционал - два WAN(MAN) подключения + WiFi.

Попробовал сначала прошивку от Олега, но мне она всё-таки немного не понравилась - получается просто комбинация стандартного интерфейса Asus и OpenWRT. Так что решил я сразу перейти на OpenWRT, но только с неплохим интерфейсом. По этому, остановил я свой выбор на X-WRT.

Как базовую документацию по созданию двух WAN-ов я взял статейку вики на самом сайте OpenWRT. Но там конфигурация намного сложней, чем мне нужна была - там полноценный load balancing, который мне не нужен был.

По этому, я модифицировал скрипты просто добавив в /usr/share/udhcpc/default.script при инициализации рутинга вызов некоторого кастом-скрипта:

                [ -n "$router" ] && {
#remove previous rule/table
ip route flush table $interface

for i in $router ; do
echo "adding router $i"
#route add default gw $i dev $interface
ip rule add from $ip table $interface
ip route add $TT dev $interface src $ip table $interface
ip route add 192.168.1.0/24 dev eth0.0 table $interface
ip route add default via $i table $interface
valid="$valid|$i"

done

#add the default route with equalize mpath
#echo "deleting and updating routes"
#while route del default >&- 2>&- ; do :; done
#P1=`ip route list table eth0.1 | grep via | cut -d" " -f 3`
#P2=`ip route list table eth0.2 | grep via | cut -d" " -f 3`
#ip route add default scope global \
# nexthop via $P1 dev eth0.1 weight 1 \
# nexthop via $P2 dev eth0.2 weight 1

#echo "deleting old routes"
#$(route -n | awk '/^0.0.0.0\W{9}('$valid')\W/ {next} /^0.0.0.0/ {print "route del -net "$1" gw "$2";"}')
#flush previous route
[ -f /etc/$interface.dhcp ] && . /etc/$interface.dhcp
ip route flush cache
}

После чего, создал файлик /etc/eth0.1.dhcp в котором прописал статические подсетки, которые я хотел рутить на WAN интерфейс eth0.1:

ip route add 172.16.0.0/18 dev $interface src $ip table $interface
ip route add 172.16.140.0/22 dev $interface src $ip table $interface
ip route add 82.193.96.0/20 dev $interface src $ip table $interface
ip route add 82.193.96.0/19 dev $interface src $ip table $interface
ip route add 82.193.96.232/29 dev $interface src $ip table $interface

 


Ну и так, как eth0.2 у меня нужен был как дефолтный, я прописал в /etc/firewall.user (может надо в другом файле, но я не знаю точно в каком) инициализацию дефолтного гейтвея:

......
# Default route
ip route add default scope global via 194.0.91.193

 


Таким образом я получил, что подсетки, указанные в eth0.1.dhcp идут через  eth0.1, а всё остальное - через eth0.2, что и требовалось.


Пользовательская оболочка довольно приятная. Хорошая фича - рисование графиков загружености в реальном времени.


Вот примеры рисования графиков:


 


Piccy.info - Free Image Hosting


Piccy.info - Free Image Hosting

Friday, July 27, 2007

Netcraft Web Servers Survey: who is GFE/GWS?

Попалась на глаза свеженькая статистика веб серверов. Судя по ней, сейчас 4.3 млн. сайтов работают под управлением серверов от Google.

Может я что-то не понимаю, но ведь Google не опубликовывали никаких своих веб-серверов (по типу Apache/IIS). Откуда столько сайтов?

При этом, сами сервисы Google работают на разных веб серверах - вот списочек.

Насколько я знаю, Google использует модифицированные Linux + Apache.

Не удивлюсь, если скоро появится опенсорсовый Google Web Server, который вполне может отобрать определенное количество аудитории от гигантов IIS/Apache.

Хотя, зачем это Google?

Wednesday, July 18, 2007

GWT: Tutorials

Не смог удержатся от того, чтоб не сделать кросс-пост отличной подборки туториалов. Оригинал можно посмотреть тут.

  1. Getting Started Guide - От самого GWT.
  2. Kickstarting Google Web Toolkit on the Client Side - Early "Hello, World!" tutorial with a second, animation example. This quick-start tutorial aims to translate some of the knowledge gained from my monkeying about with GWT into a useful text which will get other developers up and running quickly. To keep things nice and simple, we'll focus on only client-side matters.
  3. Google Web Toolkit Tutorial: The Break Down - Very short tutorial from early on. Demonstrates a simple rollover with GWT.
  4. Working with the Google Web Toolkit - Extensive tutorial with lots of screenshots that demonstrates everything from the basic getting started to some of the more interesting features, such as history support (i.e. the back button.). Article includes a Maven module for GWT.
  5. Introduction to the Google Web Toolkit - another extensive tutorial, this one from Oracle, so if you want to see how to GWT with JDeveloper, this one is for you.
  6. GWT Tutorial with Googlipse - yes, Googlipse is no more, but Cypal Studio has taken it's place. This demonstrates one way of doing GWT with Eclipse.
  7. Exporting WAR in GWT - Tutorial to create a WAR file in command line (works only with WTP 2.0).
  8. GWT Small Guide - I wrote this guide thinking in the user's who want's develope dynamic application's with the  GWT (Google Web Toolkit)  in an AMP(Apache,MySQL,PHP) environment's. The basic idea is write a small and very simple application using  MySQL and PHP at the server side, and GWT for the client interfaze, using JSON for the communication between the client and the server.
  9. Ajax for Java developers: Exploring the Google Web Toolkit - One of several GWT tutorials from IBM's developerworks. In this article, I'll run through creating a simple GWT application to fetch a weather report from a remote Web API and display it in the browser. On the way, I'll briefly cover as many of GWT's capabilities as possible, and I'll mention some of the potential problems you'll come across.
  10. Trivial GWT Example - from Robert Hanson, who went on to write an excellent book on GWT, a simple GWT-RPC example.
  11. Build an Ajax-enabled application using the Google Web Toolkit and Apache Geronimo - recent (May 2007) two part series (part two is here) with source code, flash demos, etc.. Requires registration.
  12. Google Web Toolkit - This article describes the development of a simple Ajax application on Mac OS X using GWT and familiar Java tools, such as Apache Ant, the Tomcat 5.0 servlet container, and the IntelliJ IDEA integrated development environment (the latter is a commercial IDE). The article assumes some knowledge of Java and Ant.
  13. GWT Tutorial - focuses on producing a web site, rather than a webapp.
  14. Getting Started - the first of Paval JBanov's planned five GWT tutorials. The others are First Application, Core widgets and panels, Custom widgets and RPC (not yet written).
  15. GWT Plugin Tutorial - oddly enough, this tutorial demonstrates how to integrate GWT with Struts 2 WITHOUT the GWT plugin. Hmmmm.
  16. Getting Started with Google Web Toolkit (GWT) - Very basic, getting started instructions.
  17. Tutorial: Creating a Login application - demonstrates the use of Instantiations' GWT Designer tool (WYSIWYG UI design for GWT).
  18. Basic GWT / PHP Communication - Part 1: Java and Part 2: PHP. All the GWT documentation is about hooking up Java on the front and back ends. What about PHP? This shows how.
  19. String-based RPC between GWT and PHP - forget about serializing Java objects via XML and JSON; this is the dead simple approach.
  20. Using cURL to Interface GWT with an Existing Site - this one is kind of hard to explain. If you know about curl and PHP, this article is worth reading.
  21. Creating GWT RPC Services Tutorial - short guide to using gwt4nb, the Netbeans plugin for GWT, to create GWT-RPC services.
  22. Creating a simple app with GWT4NB - flash based tutorial on creating an anagram application with GWT and Netbeans.
  23. Googled by GWT - Part 1 and Part 2. Extensive getting started tutorial with lots of screenshots.
  24. Google Web Toolkit Tutorial - short example demonstrates use of the keyboard listener.
  25. Step by Step: A Mortgage Calculator using GWT - as it says, a mortgage calculator demo using GWT.
  26. IntelliJ IDEA: Google Web Toolkit as 1-2-3 - Animated demo walks through the configuration of IntelliJ Idea for the
    Google Web Toolkit and shows how to write a GWT image viewer
    application.
  27. IntelliJ IDEA: Creating GWT Application from a Web Module - Animated demo of using GWT in a web module (IDEA's project/module type for Java webapps).
  28. Ajax for Java developers: Exploring the Google Web Toolkit - extensive tutorial from IBM developerworks that builds all the way to a weather reporter widget.
  29. Integrating the Google Web Toolkit with JSF using G4jsf - I can't say that I really love JSF, but if you bend that way, this will teach you how to marry the two. Extensive with lots of code snippets and screenshots.
  30. Asynchronous Google (Web Toolkit) and Django - Integrating GWT and Django using JSON.
  31. Using VistaFei  IDE 1.0 for GWT: A Tutorial - VistFei is an IDE. The last time I looked at it, this tutorial had somehow lost it's screenshots and the CSS had been jacked up.
  32. Using Google Web Toolkit - video HOWTO by Bruce Johnson, the tech lead of GWT.
  33. GWT-Spring Integration Demystified - any time a new technology comes along, it just has to be integrated into Spring. Here you go.
  34. Build an Ajax application using Google Web Toolkit, Apache Derby, and Eclipse - Part 1 and Part 2. Extensive tutorial in two parts, the first of which deals with the front end, the second of which deals with the back end.
  35. Ease AJAX development with the Google Web Toolkit - develops a book search application as part of a getting started tutorial.
  36. Roughian Examples - combination demo/tutorial of GWT. Version 2 is under development.

 

Если ещё найду, буду добавлять.

Мне когда-то больше всего помогли 1 и  26.

Monday, July 2, 2007

Funny ping from the future

На моём компе стандартные утилиты Windows такие как ping/tracert довольно забавно ведут себя.

Вот записал видео так сказать на память - всё-таки пинги из будущего получается:

 

Вот скриншотики чтоб лучше видно было:

 

GWT: XML-driven user interface

Вчера довёл свой проект gwt-ui до стадии, когда можно его выкладывать. Получился довольно интересный инструмент, который позволяет сильно упростить построение пользовательских интерфейсов для GWT.

Идея появилась после того, как я заметил, что приходится писать много похожего кода при построении интерфейса: панели, внутри ещё панели, внутри которых виджеты и т.д. В то же время, сейчас всё более и более популярны "описательные" способы построения интерфейсов (напр. XAML).

Такой подход более гибкий, наглядный и удобный, чем "последовательное" создание.

В GWT же сейчас используется именно "последовательное" создание интерфейса: созаются панели, внутрь который добавляются виджеты.

Вспомнив о генераторах в GWT, о которых я недавно писал, подумалось - почему бы не использовать их, для генерации хотя бы базового кода генерации интерфейса? Вот и взялся за реализацию этой идеи.

Как результат и появился проект gwt-ui. Что же он из себя представляет? Фактически, это jar-файл, который можно подключить к проекту, и после этого появится возможность воспользоваться генератором, который находится в этом проекте. 

Приведу список возможностей, которые сейчас доступны:

  1. Построение интерфейса используя XML-описание
  2. Простой доступ к сгенерированным объектам (сейчас - к контейнерам)
  3. Простое переключение "состояний" (вызов одного метода)
  4. "Ленивое" создание виджетов: виджеты создаются только тогда, когда они становятся видимыми
  5. Наследование состояний: любое состояние может наследоваться от другого. Можно написать некое "основное" состояние, которое описывает базовое расположение виджетов, а остальные просто описывают изменения.
  6. Возможность задания визуальных свойств контейнеров (напр. "align='right' width='100%' style='bar'")
  7. Нотификация виджетов о новом состоянии: Если виджет имплементирует интерфейс UIStateListener и он добавлен в интерфейс, то ему будет сообщатся о том, что состояние поменялось.

Вот небольшое how-to создания простейшего интерфейса с помощью gwt-ui:

1. Файл описания интерфейса.

Для начала создадим файлик, рядом с файлом описания модуля (который <ModuleName>.gwt.xml), в котором опишем структуру простейшего интерфейса (более сложный пример можно посмотреть в коде примера, доступного в svn):

<gwtui>
<layout>
<container id='main' type='FlowPanel'/>
</layout>
<states widgetpackage='client'>
<state id='fiststate' default='true' >
<content container='main'><widget type='MyWidget1' /></content>
</state>
<state id='anotherstate'>
<content container='main'><widget type='MyWidget2' /></content>
</state>
</states>
</gwtui>

В этом файле определены:



  • Контейнер, имеющий тип FlowPanel под именем 'main'

  • Два состояния:


    • Состояние 'firststate', которое будет использоватся по умолчанию (т.е. при первоначальной загрузке и/или если произведенна попытка изменить состояние, которое не описанно в документе. При установке этого состояния, в контейнер под именем 'main' помещается виджет с типом 'MyWidget1' (находищийся в пакете 'client')

    • Состояние 'anotherstate'. При установке этого состояния, в контейнер под именем 'main' помещается виджет с типом 'MyWidget2' (находищийся в пакете 'client'). При этом, виджеты, которые были помещенны в этот контейнер другими состояниями пропадают.

Думаю, синтаксис достаточно прост.  Более сложное описание примера можно посмотреть на страничке демо-примера, где используется и наследие состояний и визуальные свойства контейнеров.


2. Подключение GWTUI


Для работы gwt-ui, требуется подключение модуля в файле определения модуля GWT. Это можно сделать просто добавив такую строчку в файл определения (<ModuleName>.gwt.xml):

<inherits name='org.olostan.gwtui.GWTUI'/>

 


3. Создание интерфеса-маркера


Для получения объектов, созданных gwt-ui и изменения состояний интерфейса, необходимо определить в своём проекте интерфейс, который будет наследоватся от  интерфейса "UIManager", например:

public interface MyUI extends UIManager {
public Panel getMainContainer();
}

Данный интерфейс позволяет получить екземпляр контейнера 'main', описанного в файле описания интерфейса. Для того, например, чтоб добавить его на страничку.


4. Создание и добавление пользовательского интерфейса


Для того, чтобы создать сгенерированный пользовательский интерфейс, достаточно воспользоватся статическим методом GWT.create(). После этого с помощью полученного интерфейса можно будет получить доступ к созданным объектам и поменять текушее состояние. Например, при инициализации модуля:

public class MyModule implements EntryPoint {
MyUI ui;
public void onModuleLoad() {
ui = (MyUI) GWT.create(MyUI.class);
RootPanel.get().add(ui.getMainContainer());
ui.setState("fiststate");
}
}

В последствии, когда надо поменять текущее состояние, можно вызвать метод setState, например:

ui.setState('anotherstate');.

 


Вот таким способом можно создавать интерфейсы на основе XML-описания интерфейса и потом переключать состояния интерфейса.