среда, 27 февраля 2013 г.

Дао программиста

Некоторые из принципов, которых я придерживаюсь в своей работе, можно выразить в виде вот таких афоризмов:

1. Лучшая программа - это та, которая не была написана.

2. Простота - мать надежности.

3. Сложное должно быть простым.

4. Обычный программист думает: "Как сделать так, чтобы оно работало?"
   Хакер думает: "Как сделать так, чтобы оно не сломалось?"
  
5. Оптимизация - это зло.

6. Если программа падает, в ней есть ошибка.
   Если программа не падает, в ней все равно есть ошибка.
   Просто она еще себя не проявила.
  
7. Защита от дурака важнее защиты от недоброжелателя.

8. Хороший код не нуждается в комментариях.

9. Красивое решение - правильное решение.

10. Улучшить порой сложнее, чем переписать заново.

суббота, 23 февраля 2013 г.

Обновление физического движка

Доступная новая бинарная сборка моего физического движка. Повышена точность солвера контактов: тела больше не проникают друг в друга под тяжестью своего веса. Добавлена поддержка интегрирования методом Верле.
Исходники ждите в ближайшем будущем - они вскоре будут интегрированы в Atrium.

physics-test5-win32.zip (0.8 МБ)
physics-test5-linux-x86.tar.bz2 (2.0 МБ)

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

суббота, 9 февраля 2013 г.

Thumbnailer для GIMP

Терпеть не могу рутинную, механическую работу! Сейчас вот пришлось вручную изготовлять миниатюры изображений произвольного разрешения, центрируя и уменьшая их до квадрата размером 128х128. Не стал долго мучиться, написал для GIMP скрипт на Python - и решил сразу выложить, вдруг кому-нибудь тоже пригодится:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import *

def python_fu_thumbnailer(image, layer, width, height):
    origWidth = pdb.gimp_image_width(image)
    origHeight = pdb.gimp_image_height(image)
    newWidth = origWidth
    newHeight = origHeight
    
    newX = 0
    newY = 0
    
    if (origWidth > origHeight):
        newWidth = origHeight
        newX = -(origWidth/2 - newWidth/2)
    elif (origWidth < origHeight):
        newHeight = origWidth
        newY = -(origHeight/2 - newHeight/2)

    pdb.gimp_layer_resize(layer, newWidth, newHeight, newX, newY)
    pdb.gimp_image_resize_to_layers(image)
    
    pdb.gimp_context_set_interpolation(INTERPOLATION_LANCZOS)
    pdb.gimp_image_scale(image, width, height)

register(
    "python-fu-thumbnailer",
    "Thumbnailer",
    "Thumbnailer 0.1",
    "Timur Gafarov",
    "(c) Copyright 2013 Timur Gafarov",
    "09-02-2013",
    "Make a thumbnail...",
    "RGB*, GRAY*",
    [
        (PF_IMAGE, "image", "Target image", None),
        (PF_DRAWABLE, "drawable", "Target layer", None),
        (PF_SPINNER, "width", "Width:", 128, (1, 262144, 1)),
        (PF_SPINNER, "height", "Height:", 128, (1, 262144, 1))
    ],
    [],
    python_fu_thumbnailer, 
    menu = "/Python-Fu/Transform")

main()
Тестировал с GIMP 2.7.4 и Python 2.7.1.

пятница, 8 февраля 2013 г.

«FPS» 5 лет спустя...

Сегодня электронно-познавательному журналу «FPS» исполняется ровно 5 лет. За этот срок издание претерпело немало изменений: позади эксперименты с форматом и дизайном, поиски своей тематической ниши, вечные проблемы с местом размещения журнала в Интернете и множество других «приключений», через которые прошла редакция во главе с вашим покорным слугой. В связи с этим, хотелось бы оглянуться назад и подвести итоги первой «пятилетки», если можно так выразиться...

История журнала «FPS» (название которого некоторые дотошные читатели расшифровывают как «АЗЫ» - по соответствию букв на клавиатуре) берет свое начало в 2008 г. На тот момент в русскоязычной части Интернета практически не было электронных изданий, посвященных именно разработке компьютерных игр – существовавшие тогда игровые и компьютерные журналы, хоть и публиковали иногда материалы по этому направлению, но, как правило, не брали геймдев своей основной темой. Совсем иная ситуация наблюдалась за рубежом: огромной популярностью пользовались издания, адресованные, главным образом, инди-разработчикам. Это, в первую очередь, «Game Maker's Data Magazine», «GMTech», «MarkUp» и другая электронная периодика, корни которой уходят в сообщество пользователей конструктора игр с мировой популярностью Game Maker. Многие из них, к сожалению, давно прекратили свое существование – но именно такие прекрасные PDF-издания, как «MarkUp», и послужили образцами и источниками вдохновения при работе над ранними выпусками «FPS».

Мы задумывали его как небольшой журнал для аудитории пользователей Game Maker, охватывающий, в основном, вопросы разработки трехмерных игр при помощи данного инструмента. Начинали буквально «с нуля»: у команды из двух человек не было ни опыта в компьютерной верстке, ни толковой издательской платформы, ни даже собственного сайта или какого-либо другого информационного ресурса – первый номер журнала, вышедший в свет 8 февраля 2008 г., был размещен буквально на файлообменнике... Зато был энтузиазм и бесконечное желание сделать как можно более качественный медиа-продукт, не уступающий западным аналогам. Удалось ли это нам – судить читателю, но широкий резонанс в русскоязычном геймдев-коммьюнити, тысячи прочтений на сервисе Issuu.com, десятки благодарных писем в редакцию – это что-нибудь да значит?..

Тогда, в 2008-м, нам удалось совершить неплохой старт: номер был достаточно тепло встречен читателями и авторами знаменитого эмуляционно-игрового журнала «TOF» – ныне, увы, закрытого. На форуме команды «TOF» и был анонсирован «FPS» №1. Успешное становление журнала вряд ли было бы возможным без портала gamecreating.3dn.ru (ныне gcup.ru), который по интересному совпадению открылся примерно в одно время с «FPS». Администрация любезно разместила журнал и новость о его выходе на страницах своего сайта, который в короткие сроки стал одним из крупнейших и наиболее посещаемых геймдев-ресурсов Рунета. На новостном сервисе gcup.ru до сих пор размещаются анонсы новых номеров журнала.

Менее чем через месяц был выпущен второй номер. Журнал планировался как ежемесячный - первое время так и было, впоследствии «FPS» стал выходить реже. 30 марта 2008 г. начал работу сайт xtreme3d.hut2.ru (ныне xtreme3d.narod.ru), посвященный 3D-движку для Game Maker – Xtreme3D. Журнал долгое время хостился на нем. Последующие выпуски журнала в 2008 г. содержали много материала по Xtreme3D и другим аналогичным движкам. К сожалению, автор Xtreme3D забросил работу над проектом, и, в связи с отсутствием в открытом доступе исходников, сейчас этот движок уже не так актуален, как прежде. Поэтому мы впоследствии решили расширить тематические границы и вещать со страниц журнала о «особенностях национальной разработки игровых движков» на C++, с использованием «чистого» OpenGL, SDL и других библиотек.

Шестой номер «FPS», выпущенный в ноябре 2008 г., в отличие от предыдущих, вышел в горизонтальном  формате. Такое решение было принято по одной простой причине –  горизонтальная полоса удобнее читается на горизонтальном дисплее. Идея была позаимствована у журнала «BlenderArt». Кстати, материалы, посвященные свободному пакету трехмерного моделирования Blender, постепенно сформировали одно из центральных направлений нашего издания.

Журнал помнит и тяжелые времена. В течение 2009 г. был выпущен всего один номер. Это был критический период: одно время даже стоял вопрос о передаче проекта сторонним лицам. Помогли многочисленные письма и положительные отзывы от читателей. К счастью, кризисы миновали, и теперь мы делаем стабильные 4-5 номеров в год. Стабильность стала одним из основополагающих принципов нашей работы: в этом изменчивом мире, где ежегодно создаются и рушатся десятки стартапов, мы решили твердо обнадежить читателя своей незыблемостью.

Был этап сотрудничества со сторонними организациями: совместно с проектом «Мобильный киоск» была выпущена специальная Java-версия журнала, адаптированная для мобильных телефонов. Сейчас, впрочем, мы считаем, что век J2ME подходит к концу: наступила эра смартфонов и планшетов на базе Android, мобильные приложения реинкарнировались в другом формате, и чтение PDF на мобильном устройстве уже отнюдь не выглядит фантастикой. Куда более привлекательными оказались сервисы онлайн-просмотра документов – Issuu.com и GoogleDocs – которые мы взяли «на вооружение», когда Сеть окончательно изменила свое лицо в сторону Web 2.0.

Говоря о эпохе Web 2.0, нельзя не упомянуть бывший официальный сайт журнала (fpsmag.zymichost.com), который был открыт в октябре 2010 года и просуществовал всего пару лет. В связи со сменой политики нашего хостинг-провайдера, который летом 2012 года неожиданно заблокировал доступ к своим сервисам для России и ряда стран СНГ по причине спам-аттак, мы приняли решение вовсе не иметь собственного сайта и функционировать полностью на базе социальных сетей. Все-таки проект некоммерческий, оплату полноценного хостинга и доменного имени мы позволить себе пока не можем – а возможностей, предлагаемых бесплатными социальными сервисами, как оказалось, хватило с лихвой. Осенью 2012 года нашим новым «координационным центром» стала публичная страница в Google+.

Совсем недавно количество выпущенных номеров журнала уже перевалило за двадцать – а когда-то мы сомневались, что оно дойдет и до десяти... Сегодня «FPS» – это журнал для программистов, художников, моделлеров, линуксоидов, энтузиастов движения СПО, хакеров и просто творческих людей, ищущих и умеющих находить в этом мире качественную «пищу для ума». Мы ратуем за свободу слова и свободный обмен информацией – журнал распространяется на условиях лицензии Creative Commons (CC-BY-NC-SA). Мы рады любому сотрудничеству, приглашаем в наш авторский коллектив всех желающих, приветствуем любые новые идеи и предлагаем возможность совершенно бесплатно размещать на страницах журнала анонсы и рекламу интересных проектов (не обязательно игровых, главное – интересных!)

Хотелось бы поблагодарить всех авторов, принявших участие в развитии «FPS». Благодарим и язвительных критиков, чьи высказывания порой приходится читать – поверьте, без вас не было бы того упорства, с которым мы из года в год делаем свою работу. Наконец, примите особую благодарность и вы, уважаемые Читатели, за вашу преданность и поддержку словом!

P.S.: Следующий, 22-й по счету номер ждите в ближайшем будущем – из-за технических осложнений его выход был перенесен.