28 Ноябрь 2007 г.

Призменный велосипед

Совсем недавно Mozilla объявила о создании нового проекта – Prism. Который по сути являться велосипедом собранным из WebRunner и Google Gears. Это пример самого распространенного способа создания велосипеда.
Как же этот велосипед родился? Об этом достоверно знают только разработчики из Mozilla. Но можно предположить, что появление этого проекта вполне закономерно. Mozilla имела XULRunner, который по сути являться Firefox только без менюшек, кнопочек и рюшек. Google имел Gears, который позволял веб приложениям сохранять данные на машинах пользователя, и был плагин для Firefox. В один прекрасный божий день кто-то поставил Gears на XULRunner, и понял он, что в этом сила, и на этой комбинации можно построить новую технологию и назвать её Prism ;)
Эх если я заметил бы это раньше, и организовал свой стартап, то возможно меня уже купил бы Google. Эх, мечты, мечты...

То, что лежит под ногами


Когда я сам осознал как я проворонил этот велосипед (я много велосипедов проворонил, но об этом позже), то я задумался. Задумался я очень на долго и очень серьёзно. А есть ли где еще велосипед который у меня лежит под ногами. И вот до чего я додумался:
Для велосипеда мне необходимо:
  • Легкость установки приложения пользователем
  • Хранилище для данных приложений
  • Должен быть возможность создания красивого интерфейса
  • Необходима поддержка REST технологий
  • Большие возможности стандартной библиотеки
  • Легкий, но мощный, язык программирования
  • Аппаратная/программная независимость
Если подумать, то это все уже есть, и существует. Осталось только выбрать необходимые технологии. Начнем с конца:
  • Аппаратная/программная независимость – это обеспечивается любым интерпретируемым языком или языком для которого существуют виртуальные машины
  • Легкий, но мощный, язык программирования – таких претендентов много, но из выполняющих предыдущие требование я хорошо знаю только Python
  • Большие возможности стандартной библиотеки – ну это есть в любом языке которые выполняет предыдущие два пункта
  • Необходима поддержка REST технологий – модулей для Python достаточное количество, нужно только выбрать необходимые
  • Должен быть возможность создания красивого интерфейса – желательно векторная графика, чтоб можно было сказать свое слово против AIR и SilverLight, GTK и Cairo это обеспечать (с QT не работал, поэтому нечего сказать не могу)
  • Хранилище для данных приложений – можно использовать SQLite – для баз данных, и одновременно ini файлы – для настроек
  • Легкость установки приложения пользователем – в идеале все в одном файле, что в принципе описывается в моем предыдущем посте.

Создание велосипеда


Итак подводя итоги, наш велосипед будет состоять из:
  • Python
  • Py-JSON
  • PyGTK
  • PyCairo
  • PySQLite
Ну и свой менеджер для запуска приложений, я назвал его LeioPython (это один из разновидностей питона).
Я написал небольшую реализацию этого велосипеда, она состоит из: загрузчика LeioPython программ, компилятора и сборщика программ, и двух примеров («Hello World» и часы на основе cairo). Пускал ее только на Linux, так-что не факт, что она запустится на Windows. Для запуска должна быть установленна PyCairo.

Перспективы


Перспективы практически никаких :( Поезд уже ушел. Есть AIR, есть SilverLight, появился Prism. Без серьезной поддержки, у проекта нет шансов на успех, но как пример велосипеда сгодится.

27 Ноябрь 2007 г.

Импортный питон

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

Зачем это надо?


Для создания велосипедов! :) Если серьезно, то с использованием данной функции была реализована возможность загрузки модулей питон из Zip архивов. Возможно, также – Python EGG архивы. Поэтому если кому-то не нравится Zip, то он может написать импорт из Tar, gz, rar или из своего формата драных модулей питон, например для создания плагинов.

Как это работает?


Довольно подробно хуки модулей описаны в PEP 302, но если коротко, то необходимо создать класс реализующий следующие функции:
  • find_module(name, path). Name – полное имя модуля. Path – путь относительно корневого модуля, для под модулей. Должна возвращать класс загрузчика модуля, или None.
  • load_module(name). Name – полное имя модуля. Функция должна возвращать модуль или выбрасывать исключение ImportError.
Дальше этот класс необзодимо добавить в переменную sys.meta_path и у вас есть собственный импортер модулей питон.

Пример


Этот пример используется для одного из моих велосипедов, о котором я расскажу позже. Смысл его в следующем: Он производит выполнения Zip архива следующего содержания:
  • main.pyo – бинарный исполняемый файл питон, с содержащий код программы.
  • lib/ - директория содержащая дополнительные модули, для исполнения программы.
    • leioexample/ - модуль питон
      • __init__.pyo
      • clock.pyo
Из структуры архива видно, что нам нужно загрузить на выполнение модуль main, но при этом должны учесть, что ему могут понадобится модули из каталога lib.
Код загрузчика для такой ситуации:


#!/usr/bin/env python

import sys
from zipimport import zipimporter

class leioModuleImporter(object):
""" Python module loader for LeioPython program
"""
def __init__(self, importer):
# Module loader
self.__importer = importer

def find_module(self, name, path=None):
# Convert python module name for archive module path
name = name.replace(".", "/")
# Try to find module in archive
if self.__importer.find_module("/".join(["lib", name]), path):
return self # Module finded
else:
return None

def load_module(self, name):
# Convert python module name for archive module path
name = name.replace(".", "/")
# Try to load module
return self.__importer.load_module("/".join(["lib", name]))

# Get cmd parameters
args = sys.argv[1:]

if len(args) > 0:
# Assume first cmd parameters is a program archive name
importer = zipimporter(args[0])

# Initialize program modules
module = importer.load_module("main")
loader = leioModuleImporter(importer)
# Add module loader for program
sys.meta_path.append(loader)
# Load and execute program
module.leioLoader()

Велосипед


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

26 Ноябрь 2007 г.

Предисловие

Я хочу ездить на своем велосипеде!

Сколько раз я слышал фразу: «Не изобретай велосипед!» Но, действительно ли очередное изобретение велосипедов бессмысленно? Ведь велосипедов есть множество разновидностей: спортивные, детские, горные... Каждая новая модель велосипеда, это фактически новый велосипед, люди продолжают его изобретать снова и снова. Почему они продолжают это делать? Может потому-что они хотят ездить на СВОЕМ велосипеде?

Зачем нужен еще один велосипед.

Сколько раз я наблюдал за ходом священных воин, где поклонники одного велосипеда доказывали его преимущества над другим велосипедом (Java vs .NET, Python vs Ruby, PHP vs Perl, Linux vs Windows). Но суть этих воин одна: один велосипед не подходит для ВСЕХ. Поэтому каждый день появляются все новые и новые велосипеды, подходящие одним, но не подходящие другим людям. А я один из тех, кто их (велосипеды) производит, да собственно их производит каждый, просто не каждый это замечает.

Велосипеды которые мы не замечаем.

Оглядываясь в свое студенческое прошлое (вообще-то я все еще студент, но это не важно :) ), я заметил, что все лабораторные, курсовые и практические, что я выполнил, это собрание велосипедов и баянов. Но отставим нашу систему образования в стороне, и перейдем к более обыденным делам, а именно к работе.

Я программист на С и Python, но основная моя среда разработки это FireFox, и это не потому, что я пишу к нему плагины, а потому-что я ищу велосипеды которые мне подойдут, это у меня занимает значительную часть рабочего времени, но оно окупается. Когда мне нужно реализовать тот или иной функционал, я обращаю свой взор к мудрому Google и шустрому Yandex, а не создал ли кто-нибудь велосипед, который мне нужен, и в 90% случаях, такой велосипед уже существует, и все, что мне остается, это приделать к нему педали.

Это даже заметил начальник (данная способность дает +1 к карьерному росту ;) ). Недавно у нас начался новый проект, и начальник в самом начале сказал мне: «Найди информацию по предметной области, я знаю ты умеешь искать». И я нашел. И на собрании, по поводу нового проекта, у меня уже был список велосипедов которые нам могут понадобится, что уже означало хороший старт для проекта.

Это я к чему... а к тому, что прежде чем создавать новый велосипед, внимательно посмотрите, может его уже кто-то создал, это вам сэкономит кучу времени, ну и даст кучу експириенса, или даже левел-ап :)

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

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

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

Послесловие к предисловию.

Если кто не понял, под велосипедом имелось в виду новая либо уже существующая разработка (не всегда только программная, и не всегда связанная с IT)