Hatred's Log Place

DON'T PANIC!

Feb 24, 2012 - 1 minute read - linux

Набор для кросс-компиляции для Linux на ARM

Потребовалось сделать окружение для отстройки приложений для системы Linux, запущенной на платформе с процессором ARM.

Внутри есть eglibc, поэтому решено было попробовать сделать окружение с этой библиотекой Си, а не повсеместно используемой newlib.

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

Особо поразило мозг решение проблемы “кто первый: курица или яйцо?”

В результате получился набор правил для сборки окружение под ArchLinux (пакеты идут в порядке сборки):

Ну и несколько библиотек сразу в придачу:

Feb 16, 2012 - 1 minute read -

ImageMagick: вырезание произвольной области изображения

Изначально задача была: извлечь из изображения область ограниченную полигоном, при этом оставшаяся часть изображения должна залиться “прозрачным” цветом (сиречь размер в пикселях не поменяется). Но как оказалось, можно ещё более обобщить эту задачу - вытаскивать произвольные области изображения.

Рассматриваемый инструмент - ImageMagick или GraphicsMagick.

Решение нашлось тут: http://studio.imagemagick.org/pipermail/magick-users/2006-March/017281.html

Коротко суть: на основе исходного изображения (по сути используется только, что бы задать размеры) создаётся временное изображение-маска и нарисованной фигурой/фигурами которые образуются, если их обрисовать полигоном. Остальные пиксели на маске - прозрачные. Далее маска накладывается на исходное изображение и извлекается только нужная его часть…

Теперь на примере.

Есть изображение:

Нужно вырезать область, заданную полигоном (для простоты - треугольник) с координатами: (10,10)-(400,200)-(100,200)

Шаг 1. Делаем маску:

convert screenshot.png -matte -fill none -draw 'color 0,0 reset' -fill white -draw 'polygon 10,10,400,200,100,200' polygon.png

Получаем следующее (картинка белая :simple_smile: ):

Шаг 2. Вырезаем область:

convert screenshot.png -matte polygon.png -compose DstIn -composite out.png

Получаем чего желаем:

Команды рисования можно посмотреть тут: http://www.imagemagick.org/Usage/draw/

Jan 17, 2012 - 1 minute read - life linux

Amp, a layer3 player

Накатило, решил найти исходники этой программки. Что делает? Да просто берёт и играет mp3 файл. Чем знаменита? :) А тем, что это мой первый проигрыватель mp3 на Linux, который попался мне случайно на купленном диске во Владивостоке, во времена, когда у меня не было интернета и в своём городе-посёлке я был единственным пингвиноводом.

Source1 (на этом сайте) | Source2 | Где найдено

Никаких внешних зависимостей, исходники на чистом Си, в распакованном виде - 290Кб.

PS при сборке на современных системах нужно будет применить такой патч:

--- /home/hatred/download/tmp/mp3/amp-0.7.6/guicontrol.c	1997-08-23 22:30:51.000000000 +1100
@@ -375,7 +375,8 @@
 	break;	
       case GETHDR_SYN: warn("oops, we're out of sync.<br/>n");
 	break;
1.      default: 
+      default:
+        ;
       }
       break;
     }

по сути, после default:, поставить точку с запятой :simple_smile:

Jan 12, 2012 - 2 minute read -

DokuWiki, BlogTNG, плагин googleplusone и доработка шаблона

Что бы при использовании плагина googleplusone совместно с BlogTNG при попытке “поделиться” постом в Google+ вставлялся не абы какой текст, а то, что вам нужно, следует внести некоторые модификации в используемый вами шаблон.

Dec 13, 2011 - 1 minute read - programming c++

Boost, CMake, кросскомпиляция

  • Q: Boost.Asio - что нужно указать в cmake среди компонентов при поиске библиотеки boost?
    A: только библиотеку system:
    find_package(Boost REQUIRED COMPONENTS system)
    
  • Q: Boost.Thread и кроскомпиляция - что делать, если получаем ошибку вида: undefined reference to 'boost::tss_cleanup_implemented()'?
    A: для начала чуток обратно: в случае Linux, в качестве компонента при поиске библиотеки нужно указывать thread, а в случае windows (и кроскомпиляции): thread_win32, т.е. необходимо писать что-то вроде такого кода:
    set(BOOST_COMPONENTS
        program_options
        system)
    # Boost thread library is different on Win/Linux
    if(WIN32)
      set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread_win32)
    else()
      set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread)
    endif()
    ...
    find_package(Boost COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
    
    Подсказку увидел тут: https://lists.gnu.org/archive/html/mingw-cross-env-list/2010-11/msg00063.html. Так же следует добавить следующее (при статической линковке):
    add_definitions(-DBOOST_THREAD_USE_LIB=1)
    
    Далее, собственно, относительно самого вопроса, предлагают в случае появления такой ошибки при компиляции, поместить в любой свой исходник следующее:
    namespace boost {
    void tss_cleanup_implemented() { }
    }
    
    чистой воды хак :) Дополнительно написано тут: https://solarcore.blogspot.com/2010/10/boost-c-threads-mingw-mac-os-x.html

Dec 13, 2011 - 1 minute read - programming c++

inet_aton для windows

Если коротко: функиця заполняет структуру типа in_addr, преобразуя сведения о хосте из строкового представления.

У winsock2 нет такой функции. Есть более продвинутый аналог inet_pton, в POSIX он тоже есть, да вот только mingw про неё в windows не знает. Пичалька.

Поэтому делаем примерно следующее:

#ifdef WIN32
static int inet_aton(const char *cp, struct in_addr *inp)
{
    if (cp == 0 || inp == 0)
    {
        return -1;
    }
    
    unsigned long addr = inet_addr(cp);
    if (addr == INADDR_NONE || addr == INADDR_ANY)
    {
        return -1;
    }
    
    inp->s_addr = addr;
}
#endif

не верх совершенства и корректности, но для моих целей работало.