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


    Планы по развитию App Engine

    Октябрь 24th, 2008

    Разработчики платформы Google App Engine открыли карты и по многочисленным просьбам опубликовали список планируемых в течении следующих двух кварталов новых возможностей:

    • Сервис для хостинга больших файлов
    • Утилита, позволяющая выполнять импорт и экспорт данных хранилища, способная работать с огромными базами данных
    • Биллинг: наконец можно будет воспользоваться дополнительными платными ресурсами
    • Поддержка в платформе еще одного нового языка программирования
    • Сайт для мониторинга работоспособности приложений

    Компания Google исторически всячески избегала публикации каких-либо конкретных дат и сроков выхода новых продуктов, так как в отрасли разработки программного обеспечения традиционно сложно точно определить дату окончания проекта. Поэтому в этом списке не приведены сроки запуска тех или иных дополнительных возможностей, и они будут уточняться ближе к дате выхода. На сайте документации открыта новая страница, которая планируется периодически обновляться на основании свежих данных.

    Напомним, какие возможности были добавлены в проект после его публичного выхода:

    • 16.10.08 – Включена поддержка протокола HTTPS для доменов *.appspot.com
    • 14.10.08 – Журнал использования и фильтры регулярных выражений в Административной консоли
    • 18.10.08 – Детализация использования ресурсов CPU, поддержка модулей zipimport, zipserve
    • 22.08.08 – Пакетная запись и удаление множества объектов
    • 24.07.08 – Добавлена возможность экспорта логов, увеличено количество доступных приложений для одного разработчика
    • 28.05.08 – Стали доступны интерфейсы API Memcache и API работы с изображениями, открыта регистрация всех желающих
    • 15.05.08 – Анонсирован App Engine Launcher для Mac
    • 08.04.08 – Выход ограниченной тестовой версии App Engine

    Все дополнительные вопросы можно задать в группе Google проекта.




    Google Moderator

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

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

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

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

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




    Google Developer Day в Москве

    Август 30th, 2008

    Компания Google объявила о проведении 28 октября 2008 года в отеле Амбер Плаза в Москве конференции разработчиков Google Developer Day 2008.

    Ожидаются выступления инженеров Google по многим технологиям компании, в том числе практические занятия по App Engine. К сожалению, предчувствуя большой поток желающих, даже регистрация на это мероприятие не гарантирует получения приглашения.

    Предполагается, что по завершении конференции все видеоматериалы с выступлениями будут выложены в открытый доступ на YouTube.




    Все рецепты для App Engine в одном месте

    Август 30th, 2008

    Есть интересный фрагмент кода, нетривиально решающий какую-нибудь задачу, и хотите поделиться им с сообществом? Совсем пару дней назад для этих целей Google открыла сайт Google App Engine Cookbook, предназначенный для обмена кодом.

    Вкратце, App Engine Cookbook (или Поваренная книга App Engine) позволяет публиковать, оценивать и комментировать рецепты, созданные разработчиками платформы по всему миру. Кроме того, есть возможность подписаться на новостную ленту и читать новые рецепты прямо через программу чтения новостей.

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




    Синхронизация данных

    Август 12th, 2008

    Часто у присматривающихся к платформе Google App Engine разработчиков возникает резонный вопрос: как я могу забрать все свои данные? К примеру, это может понадобиться в таких распространенных случаях:

    • Имеется Интернет-магазин, который принимает онлайн-заказы и помещает их в хранилище. Чтобы в дальнейшем выставить счета, отследить оплату и произвести отгрузку, необходимо эти данные передать в учетную систему (разновидность какой-нибудь ERP).
    • Вы содержите блог. В один прекрасный день захотите составить список всех своих новых статей и разослать подписчикам уведомления о новостях.
    • Мне нравится сама концепция Cloud Computing, но я не доверяю ей. Я хочу всегда держать под рукой копию всех данных сайта и в любой момент быть готовым мигрировать в собственный дата-центр.

    Ниже описан код, который может помочь в достижении этих целей. Я прошу заранее прощения, что он не претендует на оригинальность, и уже был где-то описан. Чтобы не изобрести колесо, мы будем использовать модель SSN из статей «keeping private data private» и for ways to insult a nose. Мы создадим еще одну модель, которая будет вести учет всех производимых изменений данных:

    class DataLog(db.Model):
      """Модель описывает выполненные в хранилище изменения"""
      action = db.StringProperty(required=True)
      timestamp = db.DateTimeProperty(auto_now_add=True)
      data = db.TextProperty()
    
    

    Модель содержит три свойства: поле action, которое описывает тип производимого действия (put для сохранения данных, delete для удаления), timestamp – описывающее когда были сделаны изменения (внимание: точность этого поля далека от совершенства) и текстовое представление изменений. Последнее легко получается с использованием метода to_xml базового класса Model. Мы также создаем метод patch_for_logging, который принимает в качестве своих аргументов класс модели и заменяет методы put and delete своими собственными:

    def patch_for_logging(modelclass):
      """Патч для класса модели, который ведет лог изменений"""
      old_put = modelclass.put
      old_delete = modelclass.delete
      def new_put(self):
        result = old_put(self)
        DataLog(
            action='put',
            parent=self.parent(),
            data=self.to_xml()).put()
        return result
      def new_delete(self):
        result = old_delete(self)
        DataLog(
            action='delete',
            parent=self.parent(),
            data=self.to_xml()).put()
        return result
      if not getattr(modelclass, 'old_put', None):
        setattr(modelclass, 'old_put', old_put)
        setattr(modelclass, 'put', new_put)
      if not getattr(modelclass, 'old_delete', None):
        setattr(modelclass, 'old_delete', old_delete)
        setattr(modelclass, 'delete', new_delete)
    
    

    Следует упомянуть, что мы устанавливаем родительский объект каждой записи об изменении данных в self.parent(). Это необходимо чтобы предотвратить нарушение работоспособности при выполнении программой транзакций. Предположим, что мы помещаем этот код в файл datalog.py, после чего в основном приложении достаточно добавить строчки:

    class SSN(db.Model):
      user = db.UserProperty()
      ssn = db.StringProperty(required=True)
    import datalog
    datalog.patch_for_logging(SSN)
    
    

    Теперь мы уверены, что все изменения будут учтены. Осталось лишь определить способ извлечения этих данных. Для этого нам потребуется следующий обработчик:

    # Очень простой обработчик запроса, который выдает список изменений в данных хранилища
    class MainPage(webapp.RequestHandler):
    
      def get(self):
        self.response.out.write('<changes>\n')
        for change in DataLog.all():
          self.response.out.write(
              '<change action="%s" timestamp="%s">\n' % (
                  change.action, change.timestamp))
          self.response.out.write(change.data)
          self.response.out.write('</change>\n')
        self.response.out.write('</changes>\n')
    
    

    Следующий пример данных в формате XML показывает, как будет выглядеть вывод этого лога изменений:

    <changes>
    <change action="put" timestamp="2008-08-10 22:03:09.503340">
    <entity kind="SSN" key="agNhZWZyCQsSA1NTThgBDA">
      <key>tag:aef.gmail.com,2008-08-10:SSN[agNhZWZyCQsSA1NTThgBDA]</key>
      <property name="ssn" type="string">12345679</property>
      <property name="user" type="user">test@example.com</property>
    </entity>
    </change>
    <change action="put" timestamp="2008-08-10 22:03:34.460330">
    <entity kind="SSN" key="agNhZWZyCQsSA1NTThgBDA">
      <key>tag:aef.gmail.com,2008-08-10:SSN[agNhZWZyCQsSA1NTThgBDA]</key>
    
      <property name="ssn" type="string">098765432</property>
      <property name="user" type="user">test@example.com</property>
    </entity>
    </change>
    </changes>
    

    Не правда ли, все просто? ;-)

    Несколько замечаний:

    Очевидно, что описанный выше код будет работать только в том случае, если к определению каждой модели будет добавлен этот декоратор. Он также требует, чтобы приложение оперировало данными только через использование моделей, так как работа с низкоуровневыми функциями Datastore API приведет к невозможности учета изменений.

    Код обработчика, который я использовал в примере выше не должен быть использован в таком виде в реальном приложении. Существуют следующие серьезные проблемы:

    • он небезопасен – любой человек может получить все данные приложения, угадав его URL. Необходимо использовать специальную схему, подобную той, что описана в примере «Вопрос доверия».
    • он не масштабируем, так как всегда производит извлечение абсолютно всех данных из хранилища. В реальном приложении необходимо продумать, как лучше обеспечить последовательную загрузку данных порциями и их удаление из хранилища (это уже выходит за рамки этой статьи).

    В дополнении вы можете рассмотреть возможность расширения этой функциональности, созданием идентификаторов на манер глобальных счетчиков. В этом случае появится возможность использовать выражение «ORDER BY» в GQL-запросе, который будет проводить сортировку объектов и выдавать только наиболее ранние или поздние записи. Как было описано выше, тип timestamp не гарантирует того, что элементы будут расположены в том же самом порядке, в каком производились действия с объектами – не полагайтесь на него в этом.

    Если все это кажется вам слишком сложным, то существует альтернатива в реализации собственного хранилища на подобии CouchDB, к которому приложения будут обращаться через urlfetch. Однако в этом случае существуют свои подводные камни, такие как производительность такого решения, негативно сказывающиеся на работу приложения задержки и низкая надежность, равная надежности самого слабого компонента.




    Собственный поисковик

    Август 6th, 2008

    Если вы были в курсе последних событий в Интернете, то наверное слышали о провальном старте амбициозного поисковика Cuil. Вы также возможно слышали о сайте Yuil, который использует те же идеи по представлению найденных данных, но сам поиск осуществляется с помощью интерфейса Yahoo BOSS API. Но знаете ли вы, что он был написан под платформу Google App Engine?

    После некоторого времени работы сайта, его создатели решили изменить дизайн, чтобы тот был меньше похож на Cuil. Было придумано новое название – «4hoursearch«. Вот что говорят по поводу этого выбора авторы:

    Потребовалось 4 часа времени, что написать начальный код, 4 часа чтобы из неизвестного сайта превратиться в сайт с посещаемостью 20 хитов в секунду, 4 часа на выбор доменного имени и 4 часа на то, чтобы придумать новый дизайн. К счастью, он сам не будет выполнять каждый запрос по 4 часа :-)

    Почему это так интересно?

    1. Авторам нельзя выдвинуть претензию, что они взяли чужую идею и воспользовались ей в корыстных целях – весь исходный код вы можете свободно скачать и изучить. Он является прекрасным примером компактного кода.
    2. После открытия компанией Google платформы App Engine для тестирования, возникали множественные дискуссии о том, что компания пытается привязать разработчиков к своей платформе и не допустить в дальнейшем слезть с иглы. Сайт 4hoursearch – это пример того, как технология одной компании (облако Google) может взаимодействовать с другой (поиск Yahoo) – что может быть убедительнее?
    3. Настали времена, когда не требуется практически никаких денежных вложений (кроме ума и рук разработчиков), чтобы реализовать шикарную идею и проснуться на следующий день миллионером (все читатели бросились создавать свои поисковые системы :-) )