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


    Стиль MacOS в Linux

    Август 31st, 2008

    Общий стиль системы как в MacOS

    Нажимаем Alt-F2 и в появившемся окне вводим команду редактирования файла репозиториев: gksudo gedit /etc/apt/sources.list Добавляем в открывшемся редакторе в конце файла две строчки:

    deb http://ppa.launchpad.net/udienz/ubuntu hardy main
    deb-src http://ppa.launchpad.net/udienz/ubuntu hardy main

    Открываем терминал и выполняем установку темы Mac4Lin:

    sudo apt-get update
    sudo apt-get install mac4lin-themes

    Открываем настройки через меню Система -> Параметры -> Внешний вид, щелкаем кнопку Настроить. Выбираем тему mac4lin-themes. Наш интерфейс сразу преображается:

    Read the rest of this entry »




    Игры в Linux – проще простого

    Август 31st, 2008

    Хотя для работы в офисе не очень часто требуется установка игр, сама предлагаемая новая концепция их установки будет очень интересна.

    Существует замечательный проект PlayOnLinux, который ставит своей целью автоматизировать процесс установки и настройки Windows приложений с помощью централизованной базы скриптов:

    Примечательно, что с его помощью можно устанавливать не только игры, но и обычные офисные приложения: Internet Explorer, Dreamweaver, mIRC, iTunes, MS Office и даже недавно выпущенный под свободной лицензией OCR Cuneiform. Программа сама создает изолированную среду для каждого устанавливаемого приложения и запускает его именно с той версией Wine, которая гарантировано будет с ним работать.

    Установка самого PlayOnLinux не должна вызывать затруднений. Открываем терминал и вводим команды:

    • sudo wget http://playonlinux.botux.net/playonlinux.list -O /etc/apt/sources.list.d/playonlinux.list
    • sudo apt-get update
    • sudo apt-get install playonlinux

    PlayOnLinux можно будет запустить из меню Приложения -> Игры -> PlayOnLinux.




    Google Developer Day в Москве

    Август 30th, 2008

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

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

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




    Как сделать нормальные шрифты в Ubuntu?

    Август 30th, 2008

    О чем это мы? После перехода из операционной системы Windows на Ubuntu, многие пользователи сморят на нее в растерянности, и одна из таких причин: шрифты.

    К сожалению, по лицензионным соображениям практически во всех дистрибутивах Linux нет из коробки всем знакомой тройки шрифтов: Times New Roman, Arial, Courier и прочих таких любимых сердцу. Ситуация усугубляется тем, что большинство сайтов Интернета заточены на использование именно существующих в Windows шрифтов, и выполненяемые браузером замены могут не совпадать с задумкой дизайнеров этих сайтов. Кроме того, после майкрософтовского метода сглаживания ClearType хотется что-то такого же.

    Допустим до начала эксперимента у нас экран выглядит так:

    Не очень… :-( Начем с добавления шрифтов от Microsoft. Краткий экскурс в историю: когда-то давным давно компания Microsoft выпустила комплект своих шрифтов под лицензией AS IS (как есть), таким образом на сегодняшний день существует законная возможность скачать их и установить себе в систему, даже если вы не являетесь владельцем лицензии на Windows.

    Read the rest of this entry »




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

    Август 30th, 2008

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

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

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




    XML сервисы, часть вторая

    Август 28th, 2008

    Недавно мы рассматривали создание приложения на платформе App Engine, которое позволяет IP телефонам Cisco получать информацию о прогнозе погоды, новостях и курсе валют.

    К сожалению, пользователи, которые же в первые дни появились у этого сервиса, обнаружили в нем два существенных недостатка:

    • Мы отображаем только погоду только по Москве, хотя сервис у нас глобальный
    • Существуют проблемы на разных версиях прошивок для телефонов, которые ожидают данные на русском языке в кодировке cp-1251.

    Первый недочет решено было исправить, добавив опциональный параметр city к URL сервиса, равный коду города на сайте ГисМетео, на котором мы берем данные погоды. Таким образом строка для телефонов Питера выглядит как http://xmlphones.appspot.com/?city=26063. Второй аналогично будет называться encode и содержать при необходимости задание кодировки windows-1251.

    Read the rest of this entry »




    Автоматизированное тестирование приложений Google App Engine

    Август 28th, 2008

    В этой статье мы рассмотрим пример добавления среды тестирования к учебному приложению Гостевая книга, которое описано в Руководстве для начинающих. Вы можете загрузить все описываемые тесты по этой ссылке.

    Начальная настройка

    Python уже имеет в своей стандартной поставке модуль unittest, поэтому беспокоиться о его установке не нужно. К сожалению, существуют несколько специфических для App Engine интерфейсов (такие как datastore и users), которые должны быть либо правильно настроены, либо вообще убраны из тестов. Я решил использовать фреймворк mocker и поставить заглушки на специфический код от Google, вместо того, чтобы заниматься созданием самопального хранилища, объектов пользователей и тому подобного.

    Read the rest of this entry »




    Семинар по Elastic Block Store от RightScale

    Август 28th, 2008

    Сегодня в Четверг, 28 Августа с 21-00 до 22-00 по Московскому времени компания RightScale будет проводить семинар по недавно анонсированному продукту Amazon Elastic Block Store.

    Будут описаны сценарии развертывания, архитектура нового сервиса и дизайн зависимых критически-важных приложений. На встрече будут присутствовать генеральный и технический директора компании RightScale – Майкл Срэнделл (CEO) и Торстен вон Ейчен (CTO).

    Участие в семинаре бесплатное, но так как количество мест ограничено, предлагаем заранее зарегистрироваться.




    Вопрос доверия

    Август 26th, 2008

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

    А что можно сделать, чтобы не пускать кого попало в наше приложение? К примеру, представьте, что вы создали небольшой сайт, который хотите открыть только для членов семьи и своих друзей. Каким образом можно предотвратить доступ для всех других?

    Одним из решений проблемы является составление списка разрешенных пользователей (либо получения его из базы данных). Это годится в том случае, если вы знаете кто же допущен к сайту, но к сожалению требует постоянного изменения этого списка и поддержания его в актуальном состоянии. Другим интересным методом является использование системы инвайтов (приглашений), как той, какую на начальном этапе имел Gmail, но это тоже означает, что-то должен управлять этими приглашениями. Следующий пример показывает работу золотой середины между этими описанными методами — технология, названная HMAC, которая позволяет убедиться, конкретный аккаунт Google имеет право доступа.

    Следующий код создает криптографический хэш для заданного имени порльзователя. Он использует удобный метод из модуля cryptutil, который сам является частью примера кода OpenID. В процессе работы приложение оперирует секретным ключом, который ни в коем случае не должен быть опубликован. К конечному пользователю передается только сгенерированная хэш-строка:

    import base64
    from openid import cryptutil
    
    def sign(username):
    
      # В реальной жизни выберите лучший секретный ключ!
      secret='superSecretKey'
      return base64.encodestring(
          cryptutil.hmacSha1(secret, username))
    
    

    Так как эта проверка работает на практике? Давайте посмотрим на простой обработчик запросов, который будет использовать ее:

    import cgi
    import os
    import urllib
    import wsgiref.handlers
    
    from google.appengine.api import users
    from google.appengine.ext import webapp
    
    class MainPage(webapp.RequestHandler):
    
      def isValid(self):
        """Определение, что заданный запрос валиден.
    
           Для выполнения этих критериев, текущий пользователь должен
           быть авторизован и быть либо администратором, либо передать
           в запросе зашифрованный параметр, совпадающий с его именем пользователя.
        """
        user = users.get_current_user()
        if not user:
          return False
        if not users.is_current_user_admin():
          expected_signature = sign(user.email().lower())
          given_signature = self.request.get('signature')
          if not given_signature == expected_signature:
            return False
        return True
    
    

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

    Следующие методы get и post показывают работу простейшего приложения, отображающего важное сообщение только для приглашенных пользователей. Введя адрес электронной почты другого пользователя, мы позволяем системе создать подписанный URL, который затем будет передан приглашаемому пользователю:

      def get(self):
        """Отображение сообщения только для приглашенных пользователей."""
    
        # Требуется авторизация
        user = users.get_current_user()
        if not user:
          self.redirect(users.create_login_url(self.request.uri))
          return
    
        # Если пользователь не администратор, проверить подпись
        if not self.isValid():
          self.error(403)
          return
    
        # Ok, пользователь допущен к просмотру страницы!
        # В реальной жизни мы воспользуемся в этом месте
        # шаблоном ;-)
        self.response.out.write("""
            <html><body>
            <h1>Hello, %s</h1>
            <p>Ниже секретное сообщение, которое вы ищете:
               &nbsp;<b>APP ENGINE РУЛИТ!!!</b>
            </p>
            <form method="POST">
            Передать сообщение другу
            <input name="invitee"/> &nbsp;
            <input type="submit"/></form>
            <p><a href="%s">Log out</a></p>
            </body></html
            """ % (cgi.escape(user.nickname()),
                   users.create_logout_url(self.request.uri)))
    
      def post(self):
        """Создание строки URL для последующей отправки приглашенному."""
    
        # Если пользователь не администратор, проверить подпись
        if not self.isValid():
          self.error(403)
          return
    
        # Получить имя invitee
        invitee = self.request.get('invitee')
        if not invitee:
          invitee = 'anonymnous'
        invitee = invitee.lower()
    
        # подписать инвайт и вывести url
        signature = sign(invitee)
        self.response.out.write("""
            <html><body>
            URL для друга:
            http://%s?signature=%s</body></html>""" % (
                os.environ['SERVER_NAME'],
                urllib.quote(signature, '')))
    
    

    Несмотря на то, что это выглядит игрушечным приложением, этот пример показывает практический подход, который может быть использован для современных веб-приложений в ответ на вопрос: как можно проверить, что запрос пришел из надежного источника. Для более комплексного алгоритма обратитесь к спецификации OAuth, в которой описываются подходы использования подписи веб-запросов с помощью HMAC.




    Новый QueryWithAttributes в Amazon SimpleDB

    Август 26th, 2008

    Amazon пошел навстречу разработчикам и добавил очень ожидаемую возможность расширения интерфейса Query в SimpleDB, которая упростит процесс разработки приложения. Теперь вместо выполнения запроса, результат которого обрабатывается серией обращений, разработчики могут одним вызовом к API получить все объекты с данными из SimpleDB.

    Если вы не задаете список необходимых в запросе атрибутов, то будут возвращены все доступные – это теперь является поведением по умолчанию нового метода API.

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

    Существующий синтаксис Query:
    Domain = ZipCode
    [‘State’ = ‘WI’]

    Вызов метода Query возращает результат:

     <QueryResult>
    
      <ItemName>24103</ItemName>
      <ItemName>23724</ItemName>
      Etc…
    </QueryResult>

    Синтаксис нового QueryWithAttributes
    Он идентичен старому, за тем исключением, что новый метод называется — QueryWithAttributes:

    Domain = ZipCode
    [‘State’ = ‘WI’]

    Вызов метода QueryWithAttributes возвращает результат:

    <QueryWithAttributesResult>
      <Item>
        <Name>24103</Name>
        <Attribute><Name>state</Name><Value>WI</Value></Attribute>
        <Attribute><Name>zipcode</Name><Value>54936</Value></Attribute>
        <Attribute><Name>city</Name><Value>FOND DU LAC</Value></Attribute>
        <Attribute><Name>county</Name><Value>FOND DU LAC</Value></Attribute>
      </Item>
    <Item>
        <Name>23724</Name>
        <Attribute><Name>state</Name><Value>WI</Value></Attribute>
                      <Attribute><Name>zipcode</Name><Value>53703</Value></Attribute>
                      <Attribute><Name>city</Name><Value>MADISON</Value></Attribute>
                      <Attribute><Name>county</Name><Value>DANE</Value></Attribute>
      </Item>
    Etc…
    </QueryWithAttributesResult>

    Для дополнительной информации о QueryWithAttributes, смотрите Руководство разработчика по Amazon SimpleDB.