• Home
  • Учебник по ExtJS
  • О сайте
  •  


    Java и Google App Engine

    Апрель 8th, 2009

    Друзья!

    Настал тот радостный миг, когда компания Google все таки публично анонсировала второй поддерживаемый язык для платформы Google App Engine, которым, как и я ожидал, стала Java. Сложно даже сказать, какой импульс придаст этот шаг дальнейшему росту популярности для разработчиков, однако ясно, что это открывает для нас более интересные возможности, чем были ранее.

    Итак, обо всем по порядку. Радует то, что Google не пошла по пути изобретения собственного велосипеда, а попыталась максимально возможно использовать существующие на сегодняшний день и сложившиеся де-факто стандарты на Java-интерфейсы и методы работы с данными Java Servlet API, JDO, JPA, javax.cache и javax.mail. Практически все они реализованы подобно существующим для Python-подсистемы библиотекам Webapp, Datastore, Memcache и Mail API. Прежде всего это дает возможность несложной адаптации существующих Java-приложений на рельсы App Engine, а самое главное – защищает от vendor lock, в случае выбора платформы Google под коммерческий проект: разверните точно такую же инфраструктуру на своем сервере с любой БД по желанию.

    Аналогично приложениям, написанным для GAE на языке Python, Java код исполняется в специальной песочнице, что гарантирует отсутствие негативного влияния на соседей по серверу и наоборот. Учитывая тот факт, что была произведена огромная работа по модификации системного окружения, и скорее всего первое время будут обнаруживаться досадные ошибки, Google набирает команду из 10000 добровольцев, которые хотят прямо сейчас начать тестирование новой системы. Обратите внимание на появление Google Plugin for Eclipse, который сейчас кроме App Engine поддерживает работу еще с GWT. Насколько я понимаю, в планах компании и дальше развивать функционал для этой IDE, что несомненно будет помогать начинать быстрый старт с их решениями для новичков в Java.

    И в завершении три проекта, о которых просто необходимо упомянуть:

    • Доступ к корпоративным данным из веб-приложения: система позволяет осуществить контролируемый политиками доступ к данным компании. Нацелено на использование с коммерческой версией Служб Google.
    • Поддержка заданий сron: стало возможным производить назначенный запуск задач генерации отчетов и работы с данными вне пользовательского контекста в четко заданный момент времени.
    • Импорт данных в хранилище: теперь легко и просто наполнить гигабайтами данных новое приложение App Engine. Аналогичный механизм экспорта данных из хранилища ожидается в ближайшее время.

    А теперь представьте Java-приложение на ExtGWT (а ведь уже на подходе вторая, улучшенная, версия), запущенное на App Engine. Чем не возвращение времен Delphi, когда можно было за пару дней создать толковую морду к БД и передать заказчику? Только теперь это будет web и модель распространения SaaS.




    Google Moderator

    Сентябрь 25th, 2008

    Теливер Хелф, инженер платформы App Engine, использовал 20% своего рабочего времени, которое предоставляется всем сотрудникам компании Google, для создания нового сервиса, названного Google Moderator. Любой посетитель сайта, может оставить в этом сервисе свой вопрос, после чего другие участники могут за него проголосовать. Таким образом все вопросы будут проранжированы, а наиболее полулярные и интересные отобраны модератором данного раздела и по ним проведены обсуждения.

    Однако, этот особенно не выделяющийся среди других подобных сервис может похвастаться во-первых тем, что он работает под App Engine (наверное это не совпадение с тем, что его автор также вплотную занимается этой платформой :) ), а во-вторых – взгляните на исходники:

    Пытливые умы обнаружили, что html код приложения до боли похож на тот, который генерирует библиотека Google Web Toolkit. Для нас это может означать только одно: App Engine получил поддержку второго языка Java и стоит в скором надеяться анонса этой возможности от Google.

    Java-разработчики, присоединяйтесь!




    Много фреймворков – хороших и разных!

    Август 7th, 2008

    Представим, что у нас есть некая web-страница, на которой мы хотим размещать постоянно изменяющиеся цитаты. Существуют несколько сайтов, которые выдают в ответ на запрос вывод стандартной программы fortune. Мы напишем небольшое приложение, которое будет:

    • подключаться к этому web-сервису и загружать содержимое цитаты
    • преобразовывать полученный html и извлекать из него сам текст
    • отображать результаты на нашей странице

    Ниже приведен код на языке Java, который использует сервер NanoHTTPD и реализует этот алгоритм:

    import java.io.*;
    import java.net.*;
    import java.util.*;
    import java.util.regex.*;
    
    class Fortune extends NanoHTTPD {
    
    private static URL FORTUNE_URL;
    {
    try {
    FORTUNE_URL = new URL("http://www.coe.neu.edu/cgi-bin/fortune");
    } catch (MalformedURLException e) {
    e.printStackTrace();
    System.exit(1);
    }
    }
    
    Fortune() throws IOException {
    super(80);
    }
    
    @Override
    public NanoHTTPD.Response serve(
    String uri, String method, Properties header, Properties parms ) {
    
    // Подключаемся к web-сервису
    StringBuilder sb = new StringBuilder();
    BufferedReader in = null;
    try {
    in = new BufferedReader(new InputStreamReader(FORTUNE_URL.openStream()));
    for(String s = in.readLine(); s != null; s = in.readLine()) {
      sb.append(s);
      sb.append("\n");
    }
    }
    catch (MalformedURLException e) {}
    catch (IOException e) {}
    finally {
    if (in != null) {
      try {
        in.close();
      } catch(Exception e){}
    }
    }
    
    // Извлекаем цитату
    String fortune = "Цитат сегодня нет :-( ";
    Pattern p = Pattern.compile(".*<pre>(.*)</pre>.*", Pattern.DOTALL);Matcher m = p.matcher(sb.toString());
    if (m.matches()) {
    fortune = m.group(1);
    }
    
    // Формирование ответа
    String html =
    "Цитата: <pre>" +
    fortune +
    "</pre>";
    return new NanoHTTPD.Response("200 OK", "text/html", html);
    }
    
    public static void main(String[] args) {
    try {
    System.out.println("Для остановки нажмите ENTER");
    NanoHTTPD nh = new Fortune();
    System.in.read();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    Этот код работает? Да. Он идеален? Конечно нет! Вот какие проблемы:

    • Исключения не учитываются должным образом. При запуске приложения в рабочем окружении будет сложно понять, где происходят ошибки
    • Несмотря на то, что реализована лишь небольшая функциональность, код выглядит раздутым
    • Использованный нами web-сервер нельзя масштабировать. Конечно мы можем использовать другие: apache, jetty и тому подобные, но это потребует дополнительных телодвижений
    • Необходимо еще найти хостинг-провайдера, у которого можно разместить это приложение.

    Теперь давайте посмотрим на аналогичный код для App Engine:

    APP.YAML:
    =========
    application: fortune
    version: 1
    runtime: python
    api_version: 1
    
    handlers:
    - url: /.*
    script: fortune.py
    
    FORTUNE.PY:
    ===========
    from google.appengine.api import urlfetch
    import re
    
    def GetFortune(maxtries=3):
    """Подключается к web-сервису и извлекает цитату из полученных данных."""
    fortune = None
    for i in range(maxtries):
     result = None
     try:
       result = urlfetch.Fetch('http://www.coe.neu.edu/cgi-bin/fortune')
     except:
       result = None
     if result and result.content:
       match = re.compile('.*<pre>(.*)</pre>.*', re.DOTALL).match(
           str(result.content))
       if match:
         fortune = match.group(1)
         break
    if not fortune:
     fortune = 'Цитат сегодня нет :-( '
    return fortune
    
    print 'Content-Type: text/html'
    print ''
    print '<html><body>Цитата: <p/><pre>%s</pre></body></html>'\
       % GetFortune()

    Чем эта реализация отличается от предыдущей?

    • Если при работе приложения пойдет что-то не так, мы сможем проанализировать причины этого через его панель управления. Она собирает логи с ошибками и группирует наиболее частые из них.
    • Программа очень компактная и легко читается
    • Всю заботу о выполнении кода берет на себя App Engine. Если сайт за короткое время посетит большое количество народу, платформа автоматически выделит дополнительные ресурсы.
    • Мы не должны искать для приложения хостинг-провайдера. Причем чем оно меньше, тем лучше: если мы не превышаем квоту, то за его размещение не нужно платить!

    Теперь для любителей флеймов: это не сравнение языков «Python против Java». Я уверен, что в будущем App Engine будет поддерживать еще кучу языков, а программы будут получаться как всегда компактные.




    Виснет Eclipse на Ubuntu при работе автозавершения кода

    Август 3rd, 2008

    Обнаружилась неприятная особенность – среда Eclipse при включении функции автозавершения кода начинает виснуть. Виной тому – использование в дистрибутиве Ubuntu по умолчанию свободной версии виртуальной машины Java.

    Как это можно вылечить?

    • Ставим версию Java от Sun. В командной строке вводим: sudo apt-get install sun-java6-jre
    • Выбираем ее использование по умолчанию: sudo update-alternatives –config java. Вводим цифру, соответствующую нужной нам виртуальной машине от Sun /usr/lib/jvm/java-6-sun/jre/bin/java
    • Хотя это не относится напрямую к проблеме, но если на машине установлено более 1 гигабайта оперативной памяти, то можно указать среде использовать ее всю. Открываем конфигурационный файл с привилегиями администратора: sudo gedit /usr/lib/eclipse/eclipse.ini и заменяем его содержимое следующим:
    • -vmargs
      -Xms1024m
      -Xmx1024m
      -XX:MaxPermSize 512m
      
    • При необходимости, эти изменения можно внести напрямую в файле, который запускает Eclipse: /usr/bin/eclipse – добавить в переменную VMARGS=»-Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m»
    • Сохраняем, перезапускаем Eclipse. Все должно заработать.

    Иногда правда Eclipse руководствуется своим конфигурационным файлом /etc/eclipse/java_home, в котором содержится список путей к различным виртуальным машинам. Если вышеприведенные шаги не помогли, попробуйте найти в этом файле строчку со стандартной виртуальной машиной Ubuntu – /usr/lib/jvm/java-gcj/jre/bin/java и удалить ее (соответственно с правами администратора).

    В любом случае, проверить, какую виртуальную машину использует Eclipse, можно запустив команду eclipse из командной строки и проверив, какая информация указана после слов searching for compatible vm…