Календарь

Стандартный календарь в Ubuntu вызывается командой cal, но для русскоязычного населения вывод не очень удобен, так как недели начинаются с воскресенья. У команды ncal есть ключ “-M”, который принудительно начинает недели с понедельника, но формат вывода у неё достаточно странный. К счастью, у той же команды есть ключ “-b”, который представляет календарь в более привычном виде. Дополнительно мне нравится добавлять ключ “-3”, который показывает предыдущий и следующий месяц относительно текущего. Так что в конечном виде на алиас вешается команда
{{{ lang=bash line=1
ncal -bM3
}}}

Отступы в питоне

При использовании вима во время написания программ на питоне может быть масса проблем, связанных с отступами. В принципе это может лечиться установкой соответствующих плагинов, но если нет желания тратить время на это, то стандартизировать отступы можно таким набором команд в .vimrc
{{{ line=1 lang=vim
autocmd BufRead,BufNewFile *.py set expandtab
autocmd BufRead,BufNewFile *.py set tabstop=4
autocmd BufRead,BufNewFile *.py set shiftwidth=4
}}}

Если же уже имеется некоторый код, в котором перемешаны табуляции и пробелы, то привести всё к унифицированному виду (с учётом того, что нужные строки уже прописаны) можно командой

{{{ lang=vims line=1
:%retab
}}}

Ошибка работы Postgres при использовании MediaWiki

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

Решение проходило в несколько шагов.
1. Необходимо включить поддержку дебагирования результатов работы wiki. Необходимо в самый конец файла LocalSettings.php дописать следующие строчки
{{{ lang=php line=1
error_reporting( -1 );
ini_set( ‘display_errors’, 1 );
$wgShowSQLErrors = true;
$wgDebugDumpSql = true;
$wgShowDBErrorBacktrace = true;
}}}
2. После этого wiki начнёт показывать дамп ошибки. В моём конкретном случае выяснилось, что неправильно настроен сиквенсер на таблице externallinks. Проблема легко решилась командами
{{{ lang=sql line=1
ALTER SEQUENCE externallinks_id_seq RENAME TO externallinks_el_id_seq;
ALTER TABLE externallinks ALTER COLUMN el_id SET DEFAULT nextval(‘externallinks_el_id_seq’::regclass);
}}}
3. В конце необходимо не забыть закомментировать строчки, которые показывают дебаг, в противном случае сайт могут сломать.

Продвижение инди игр

Интересная статья о том, как продвигать свою игру за 0 долларов. Много полезных ссылок, жаль только, что это всё ориентация на западную аудиторию, как это выглядит в России не очень представляю, но полагаю, что заметно хуже.
http://www.gamasutra.com/blogs/MarcMcCann/20140702/220096/A_small_guide_to_getting_your_PC_game_known__for_0.php

Композиция тайлов при помощи imagemagick

Если есть несколько спрайтов, которые надо объединить в один большой атлас, то можно воспользоваться командой montage из библиотеки image magick
{{{ lang=bash line=1
montage -background none -mode concatenate -tile 4×3 tile*.png map.png
}}}

Здесь ключ -background нужен, чтобы сохранить прозрачность, в противном случае montage сделает белую подложку. Опция после tile, в данном случае 4×3 означает, что нужно собирать в матрицу с 4 колонками и 3 строками. Заполнение при этом идёт слева направа, сверху вниз. То есть заполнение будет следующим:

|1|2|3|4|
|5|6|7|8|
|9|10|11|12|

Fullscreen mode in moai sdk

При создании moai проекта под linux, возникает желание работать в fullscreen режиме, так как это банально хорошо выглядит, всевозможные декорации здорово отвлекают. На данный момент (июнь 2014) стандартный хост, который используется в linux это sdl. Чтобы режим полного экрана включился необходимо внести следующие изменения в SDLHost.cpp

{{{ lang=c++
void _AKUOpenWindowFunc ( const char* title, int width, int height ) {

if ( !sWindow ) {
sWindow = SDL_CreateWindow ( title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN_DESKTOP );

SDL_GL_CreateContext ( sWindow );
SDL_GL_SetSwapInterval ( 1 );
AKUDetectGfxContext ();

int actualScreenWidth_ = -1;
int actualScreenHeight_ = -1;
SDL_GetWindowSize(sWindow, &actualScreenWidth_, &actualScreenHeight_);

AKUSetScreenSize ( actualScreenWidth_, actualScreenHeight_ );
}
}
}}}
При этом в соответствующих луа скриптах надо будет писать следующее
{{{ lang=lua
MOAISim.openWindow ( “test”, 320, 480 )

screenWidth = MOAIEnvironment.horizontalResolution
screenHeight = MOAIEnvironment.verticalResolution

MOAISim.openWindow ( “test”, screenWidth, screenHeight )
}}}

Второй вызов MOAISim.openWindow нужен, чтобы перенастроить moai на адекватное разрешение.

Путь к звёздам

Последняя неделя была весьма положительной с той точки зрения, что внезапно я сделал генератор созвездий. То бишь процедурно генерирую различные лабиринты, которые по сути являются графами, в качестве узлов – звёздные системы/планеты, в качестве рёбер условные ворп туннели. При этом положение узлов является полностью рандомным, но количество циклов, то есть путей, двигаясь по которым можно вернуться в исходную точку, можно зафиксировать. Дополнительно выполнено условие, что пути не пересекаются. В общем, получается достаточно красивое, но случайное созвездие, внешний вид которого можно в достаточно широких пределах варьировать.

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

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

* **Звёздный магнат**. Это идея о tycoon в космосе и возникла, когда я достаточно долго смотрел на сгенерированные созвездия и понял, что было бы очень здорово просто смотреть орлиным взглядом и устанавливать пути сообщения между звёздами, потихоньку накапливая всё больше и больше богатств.

* **Галактические войны**. Это тоже довольно старая идея, пришла мне после изучения большого количества настолок. По сути, это урезанная 4x, то есть у игрока есть определённое количество ресурсов, возможно часть из них восполнимых. На каждом шаге он может двигать часть войск из точки в точку, периодически встречаясь с противником и устраивая с ним бои.

Раскрутка Android приложений

Эта статья является переводом http://www.technewscentral.co.uk/how-to-promote-android-app. Возможно, в будущем я добавлю в эту статью свои личные замечания и постараюсь держать список линков в более-менее адекватном состоянии.

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

Исходная идея очень проста, чем больше количество загрузок/установок приложения, тем выше его его позиция в магазине гугл плея. Так что, шаг №0 состоит в том, чтобы обзвонить всех своих друзей и родственников, у которых есть андроид телефон и попросить их загрузить приложение и оставить о нём хорошие отзывы. В самом деле, никто не захочет скачивать приложение, у которого нет отзывов, так что это придаст вашему приложению неплохое ускорение на начальном этапе. Попросите также, чтобы они поставили +1 в гугл плюс на маркете.

Затем начните размещать приложение в различных аппсторах. Некоторые из них приведены ниже:

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

Подобно веб сайтам, можно рекламировать и андроид приложения. Так что, при наличии достаточного количества денег, можно найти огромное количество сервисов, которые будут продвигать ваше приложение, при этом возможны различные механизмы, как например оплата за показы, оплата за установку и тому подобные на аппсторах типа AppBrain и других. В эту тему углубляться не будем, так как хороший поиск в гугле выдаст массу вариантов. Для того, чтобы было с чего начать, можно воспользоваться следующей ссылкой: http://www.mobyaffiliates.com/blog/how-to-promote-your-ios-and-android-mobile-apps/

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

Создайте видео промо для приложения и размещайте его на ютубе, metacafe, фейсбуке, гугл плюс и в других сетях.

Не забудьте использовать социальные медиа для продвижения приложения.

Используйте гостевые аккаунты в блогах, для рекламирования своего приложения. Примечание: мне кажется, что этот совет слишком уж отдаёт спамерством…

Создавайте посты посвящённые запуску вашего приложения на различных андроид форумах. Некоторые из топовых форумов приведены ниже.

Размещайте приложение на таких сайтах, как piratebay, isohunt, mediafire, 4shared и т.д. Как ни странно, но люди ищут андроид приложения на таких сайтах.

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

Удобное копирование файлов между серверами

Недавно передо мной встала задача по перекидыванию кучи файлов с одного сервера на другой. scp оказалась не очень удобной для этого, так как возникли проблемы с симлинками и расставлением прав, поэтому пришлось обратиться к команде rsync. Правда тут же возникла другая проблема – к части файлов не было доступа, поэтому они не скопировались, но так как на экран выводилась вся доступная информация о происходящем, то разделить глазами, что куда выводится возможности не было. Перенаправление вывода в файл спасало, но при этом терялась информация о процессе. И тут на помощь пришёл tee и конечная команда стала выглядеть так

rsync -ave ssh : > >(tee /tmp/rsync_log) 2> >(tee /tmp/rsync_err_log >&2)

Смысл в следующем:

  • rsync – собственно команда копирования
  • -a – команда архивирования. Включает в себя
    • r = рекурсивное копирование (по директориям)
    • l = копирование симлинков, как симлинков
    • p = сохранение прав
    • t = сохранение времени создания файлов
    • g = сохранение групп, которой принадлежит файл
    • o = сохранение владельца файла
    • D = сохранение файлов устройств и специальных файлов
  • v = verbose режим, то есть выводится дополнительная информация.
  • e = выполнить соответствующую команду на удалённой машине.
  • >(tee …) = скопировать stdout в файл и копию отправить на экран
  • 2> = добавить к выводу на stdout результат выполнения следующей команды
  • >(tee … >&2) = скопировать вывод stderr в файл и так же отдать его на экран.

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

Способы управления несколькими удалёнными репозиториями в гите

Самый простой и изящный способ, который я нашёл на http://jeetworks.org/node/22

git remote | xargs -L 1 git push