LINUX.ORG.RU

Сообщения slovazap

Каноничное название для поддиректории с внешними библиотеками

Форум - Development

Есть у меня проект, и с ним бандлятся несколько библиотек (тоже моих, но допустим что могут быть и чужие). Логично, что они живут в своей поддиректории. Вопрос - какое самое каноничное название для этой директории? 3d-party/, 3rd-party/, contrib/, другое?

()

Участвуете ли вы в проекте OpenStreetMap?

Голосования - Голосования

OpenStreetMap - свободная карта всей планеты пополняемая силами сообщества в стиле wiki. От других crowdsource картографических проектов (wikimapia, google map maker, народные яндекс карты) отличается свободной лицензией и лицензионной чистотой, возможностью использования в любых навигаторах, гораздо более профессиональным подходом к составлению карты (не просто раскраска спутниковых снимков, а точная привязка к GPS треками и поощрение сбора информации на местности), отсутствием ограничений на множество наносимых объектов и подробность карты (можно отметить всё, от отдельных урн и скамеек в парке до поличества проводов, напряжения и частоты тока в ЛЭП, видов деревьев в лесах, этажности зданий и далее до, например, всевозможнох параметров стационарных радиопередатчиков), наличием большого числа свободных инструментов для работы с данными (4 свободных редактора - на Java, C++/Qt и Flash, бесчисленное множество конвертеров, рендеров и анализаторов данных).

Количество свободных проектов на базе OSM исчисляется сотнями (от визуализации специфической информации - например, морские и горнолыжные карты, до прокладки маршрутов и статистического анализа), и всё больше коммерческих проектов также выбирают её, зачастую вместо проприетарных поставщиков web-карт типа yandex/google.

http://www.openstreetmap.org/ - официальный сайт

http://www.openstreetmap.ru/ - сайт, созданный силами русского сообщества

http://wiki.openstreetmap.org/wiki/List_of_OSM_based_Services - несколько примеров проектов на базе osm

Не использую и не интересуюсь 737
 ********************
Просто использую данные проекта 240
 ******
Нарисовал несколько POI в своём районе 86
 **
Нарисовал свой дом/дачу 82
 **
Нарисовал свой район 39
 *
Помогаю проекту треками 38
 *
Нарисовал большую часть своего города 30
 *
Периодически рисую по всей стране 25
 *
Моя контора использует данные OSM 25
 *
Периодически рисую по всему миру 10
 *
Пишу софт для OSM 9
 *
Всего голосов: 1321
Всего проголосовавших: 1103

>>> Результаты

Метки:

()

[ffmpeg] перемотка по кадрам в обе стороны

Форум - Development

Собственно, задача - сабж. Есть видео в h264 (потенциально в чем угодно), нужно уметь мотать его по одному кадру в обе стороны, а также перескакивать точно на нужный номер кадра. Как я понял, в общем случае это невозможно, но для начала возьмем частный, когда есть индекс. av_seek_frame может seek'ать до кейфреймов, от которых можно домотать вперед до нужного кадра, и тут два вопроса.

Во-первых, как узнать номер кадра после перемотки до кейфрейма? DTS/PTS ненадежны - у меня есть видео где PTS нет, а DTS начинается с 2. Разве что сразу после открытия файла читать первый кадр и сохранять его DTS.

Во-вторых, кейфреймы могут располагаться достаточно редко (у меня раз в 60 кадров), т.е. получается что при сике на 1 фрейм назад с кейфрейма придется делать av_seek_frame до предедущего, декодить 60 фреймов и, видимо, ещё и сохранять их в памяти, чтобы не декодить 59 штук при следующем сике. Есть какой-то более эффективный способ?

Есть один нюанс - видео у меня в любом случае предобрабатывается с последовательным чтением кадров, поэтому есть вариант построить свой индекс с произвольной частотой кейфреймов и нумерацией кадров, с привязкой к смещению пакетов в видео файле. Как это лучше сделать? Получится ли просто считать кейфреймами все I-фреймы и просто мотать до них av_seek_frame'ом по смещению, или всё сложнее (что-то говорит мне что нужно два I-фрейма чтобы работали B-фреймы)?

PS. ffmpeg_fas смотрел, он с моим видео просто не работает.

()

Unicode в С++

Форум - Development

Понадобился мне тут сабж, и после дня ковыряний появился вопрос - это вообще возможно? Ситуация такая: CLI приложение, у него есть файл данных жёстко в UTF-8, также оно должно читать/писать пользовательские данные (думается, в его локали), а внутри работать со строками посимвольно + tolower/toupper + какая-никакая сортировка.

Как я понял, "C++" way - использовать эти locale и facets, только нигде по ним нет нормальной документации. Во всех примерах конвертят (через facet шототам .wider) ASCII из char* в wchar_t* - замечательно но только если в char* UTF8 то конвертит оно по байтам а не по символам. Это во-первых. Во-вторых, оно зависит от этого долбаного setlocale, а мне нахрен не упёрлось чтобы конвертация между utf8 и широким форматом как-то зависела от локали. C++'ного преобразования регистра нет, конвертим строки через towlower/towupper, что тоже с какого-то хрена зависит от локали. Сишный way с mbstowcs завист от локали аналогично. Кое-где советуют писать свою utf8 локаль или брать из буста с хитрыми хаками по переопределению namespace'ов.

Порыскал по интернету, нашёл замечательную библиотечку http://slonik-v-domene.livejournal.com/17731.html?thread=93507 как я понял utf8<->wide + lower/upper, безо всяких идиотских локалей. Там, правда, уродский сишный интерфейс с кучей аллокаций, но это не проблема переписать. Также для широких символов там используется не wchar_t, а unsigned int, а это уже не попихаешь в в wcout.

Ещё есть ICU (с совершенно ублюдской документацией) и, в конце концов iconv (хотя я бы предпочёл отказаться от внешних библиотек вообще).

Ещё есть новые литералы и char16_t/char32_t в C++11.

Итого - всего много, но ничего нормально не работает. Как быть?

Предполагаю что правильнее всего было бы разобраться с C++ локалями/фасетами и написать свои классы для utf8 и возможно utf32 с возможностью конвертации между ними, а для последнего case и сортировку. Однако нужна вменяемая документация на то как оно работает и вообще что эти фасеты значат. Другой вариант - сделать basic_string<int32_t> и написать для него функции конвертации в/из string (с utf8) и tolower/toupper и забыть про этот ад. Общение с пользователем оставить только в utf8.

()

Альтернатива flex

Форум - Development

Решил наконец изучить flex & bison. Изучил, понравилось. Начал прикручивать парсер к C++ проекту, полез глубже копаться (начал пока с голого лексера), и охренел.

Во-первых, код ни разу не exception-safe. Как вам это (сгенерённый код):

YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size )
{
        YY_BUFFER_STATE b;
    
        b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
        if ( ! b )
                YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

        b->yy_buf_size = size;

        /* yy_ch_buf has to be 2 characters longer than the size given because
         * we need to put in 2 end-of-buffer characters.
         */
        b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2  );
        if ( ! b->yy_ch_buf )
                YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

        b->yy_is_our_buffer = 1;

        yy_init_buffer( b, file );

        return b;
}

Если лень читать - при фейле alloc вызывается YY_FATAL_ERROR. Что прикажете мне в ней делать? Если просто вывести ошибку и сделать вид что ничего не случилос (ну или установить флаг и выкинуть результаты кривого парсинга), то после фейла первого аллока при обращении к b->yy_ch_buf будет SEGV. А если кинуть исключение, при фейле второго alloc'а память, выделенная в первом весело утекает. Получается, что делать остаётся только abort, весело.

Во-вторых, C++'ный лексер наследуется от помоечного класса yyFlexParser, набитого кучей ненужной гадости типа работы с потоками, которые мне нахрен не сделись, вместо того чтобы наследоваться от виртуального интерфейса и дать мне возможность самому определить как работать с вводом/выводом, как выделять память и как обрабатывать ошибки. На самом деле, я пришёл к выводу что из C++ удобнее будет использовать сишный reentrant лексер, а не плюсовый, но невозможность обработки ошибок остаётся, и мусор там свой есть.

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

В общем, хочется инструмента из этого века - удобного, гибкого и безопасного. В идеале - сочетающего лексер, парсер и кнопку "сделать заебись", но хотя бы по минимуму - нормальный лексер, который не генерит говнокод, позволяет управлять буферами как я хочу и не суёт в нос работу с FILE* или ++'ными потоками. В качестве лексера на ум приходит только ragel, но может есть лучшее и/или комплексное решение?

()

Аналог FF аддона permit cookies

Форум - Desktop

Пользуюсь до сих пор Firefox 3.6.x из-за аддона permit cookies, который не позволяет сайтам устанавливать куки, пока я не разрешу. Хочется перейти на FF поновее, но permit cookies не поддерживает новые версии FF. Внимание, вопрос: есть ли аналог аддону (желательно пофичастее), или стоит попробовать похачить его на предмет версии в надежде что он заработает под новым FF либо разобраться и напрямую портировать под новую версию?

Ещё интересен аналог xpather - аддон, показывающий в html документе xpath для выбранного элемента.

()

Правильный MVC для игры

Форум - Development

Есть хитрая настольная игра, хочется сделать её компьютерную реализацию, и хочется сделать её по принцыпам, схожим с MVC - есть модель, описывающая правила и ход игры, есть контроллер, передающий дествия игрока, и есть вид - собственно отображение происходящего в игре. Нужно это чтобы легко можно было менять контроллеры (локальный игрок/удалённый игрок/AI) и виды (GUI/Curses/Web UI, заодно контролировать из модели кому какие данные разрешено видеть). На деле получилось как-то не особо по канонам MVC, в связи с чем следующие непонятки:

1) Взаимодействие модели и контроллера. У игры куча фаз хода игрока, которые могут прерываться другими игроками, и ОЧЕНЬ хочется реализовать это в виде императивного кода, дёргая контроллер когда нужно действие игрока. Т.е.

void Game::Turn() {
  DoFoo();
  m_Controller->AskForAction(SELECT_UNIT);
  DoBar();
  m_Controller->AskForAction(CAST_SPELL);
  DoBaz();
  m_Controller->AskForAction(BUY_STUFF);
  ...
}

допустим, это будет работать с Curses, где в контроллере можно просто ждать нажатия клавиши. Но как быть, например, с GUI, где есть внешний цикл обработки событий? Придётся либо запустить копию цикла в контроллере, что, как мне кажется, криво и скорее всего возможно не во всех тулкитах, либо GUI банально не будет отрисовываться, пока пользователь не нажмёт нужную кнопку. Можно сделать отдельный поток, но это выглядит как костыль. Единственная альтернатива что мне видится - выходить из Turn когда нужно действие и его перезапуск когда действие получено (что-то типа FSM):

RequiredPlayerAction Game::Turn() {
  switch (m_TurnPhase) {
  case 0:
    DoFoo();
    m_Phase = 1;
    return SELECT_UNIT;
  case 1:
    DoBar();
    m_Phase = 2;
    return CAST_SPELL;
  case 2:
    DoBaz();
    m_Phase = 3;
    return BUY_STUFF;
    ...
  }
}

Но так код катастрофически раздувается, теряет наглядность, очень легко ошибиться, и становится невозможно использовать вложенные функции, что, в свою очередь, ещё больше уродует код.

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

2) Взаимодействие модели и вида: push или pull? Вроде в классическом MVC вид просит у модели данные и отображает их. Мне же более удобным видится вариант когда модель при изменении данных пинает вид. Второй вариант выгдятит гораздо лучше потому что взаимодействие происходит через жёстко определённый интерфейс вида, что обеспечивает хорошую абстракцию, тогда как в первом случае придётся либо давать виду const-доступ к кишкам модели, либо гененировать структуру данных, представляющую состояние игры (что по сути просто копия тех же кишок), а структура этих кишок может меняться в процессе разработки модели.

Ну тут вроде всё понятно, но на всяких случай спрошу - push модель это в целом нормально?

()

Приоритеты потоков

Форум - Development

Диспозиция такая: есть два потока, один рисует данные opengl'ем, второй в фоне грузит куски данных. Реализована, соответственно, очередь запросов, защищённая мутексом:

// Главный поток
{
  while (1) {
    pthread_mutex_lock(mutex);
    ...
    отрисовка_данных(dataset);
    ...
    queue.push_back(request);
    ...
    pthread_mutex_unlock(mutex);  /* 1 */
  }
}

// Рабочий поток:
{
  pthread_mutex_lock(mutex);
  while (!die_flag) {
    while (queue.empty())
      pthread_cond_wait(condvar, mutex);
    request = queue.pop_front();
    pthread_mutex_unlock(mutex);

    data = долгая_обработка_куска_данных(request);

    pthread_mutex_lock(mutex);
    dataset.push_back(data);
  }
  pthread_mutex_unlock(mutex);
}

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

На деле же происходит следующая неприятая вещь: первый поток после рендеринга и добавления нескольких запросов в очередь вызывает pthread_mutex_unlock (/* 1 */) и не возвращается из неё 0.1 секунды, за которые второй поток и ухитряется обработать аж десяток кусков данных, соответственно, отображение в главном потоке заметно лагает. Насколько я понимаю, получается так потому что у первого потока, успевшего за время рендеринга пожрать циклов CPU, понижается приоритет, а т.к. второй поток это время спал, он вытесняет первый пока не догонит его по использованию CPU. Вставка sched_yield во второй поток помогает, но сейчас используется два потока, и лаги, хоть и менее заметны, всё ещё присутствуют. Как я понимаю, несколько рабочих потоков будут просто переключаются друг на друга, но не на главный.

Собственно вопрос: как избавиться от лагов? Я так понимаю, приоритеты потокам выставлять не очень хорошо потому что условиях нехватки CPU (т.е. 1 ядро занятое на 100%) поток с меньшим приоритетом будет голодать, а значит данные грузиться не будут. В идеале нужно чтобы главный поток не вытеснялся более чем на 0.01 сек, но при этом чтобы CPU с другими потоками получал поровну.

()

C++ итераторы

Форум - Development

Где-то документировано что инкремент итератора, указывающего на end() даёт begin(), а декремент - последний элемент? Или это вообще не гарантируется?

()

Внеэкранный OpenGL

Форум - Development

Хочется рисовать сцены OpenGL'ем на GPU, но не хочется создавать никаких окон. В идеале вообще без X, но на это я мало надеюсь, так что пойдет и с иксами - как можно создать GL контекст, не привязанный ни к какому окну?

()

Обработка ошибок в библиотеке на C

Форум - Development

Есть библиотека на plain C, которая работает с неким форматом файлов. Интерфейс простой:

typedef struct mylib {
  int mylib_errno;
  ...
} *mylib_t;

mylib_t lib = mylib_open("filename", ...);
somecount = mylib_getsomecount(lib, ...);
if (somecount < 0)
  errx(1, "cannot get some count: %s\n", mylib_strerror(mylib_getlasterror(lib)));

mylib_close(lib);

Т.е. в struct mylib хранится errno в котором могут быть как положительные значения (от системных вызовов и функций из libc) так и отрицательные от самой библиотеки.

Это отлично работает, но только когда в mylib_open ничего сложного не делается (тогда если возвращается NULL, это однозначно malloc вернул ENOMEM) и когда в качестве someval можно передать невозможное значение (ну это не особо проблема, потому что если нельзя, то можно передавать через указатель на манер stat(2)). Но вот нужно в mylib_open сделать что-то нетривиальное, и потом узнать что случилось. Вопрос: как лучше построить интерфейс в общем случае?

Вариант 1:

typedef int mylib_code_t;

mylib_code_t mylib_open(mylib_t *);
mylib_code_t mylib_getsomeval(mylib_t, int *)

Т.е. выходные данные всегда передавать через указатели, а возвращать всегда код ошибки (или MYLIB_OK). Это не нравится по той причине, что так пользователю вероятнее забыть что-то освободить, т.е. вызвать mylib_open(&lib) при уже открытом lib уже открыт. Все-таки с lib = mylib_open() это легче заметить. Далее, нельзя написать в одну строку struct mylib *lib = mylib_open() и общее несогласование интерфейса с обычными библиотечными функциями, которые возвращают данные а не коды.

Вариант 2:

Хранить свой глобальный errno. Описанных выше проблем нет, но имеем проблемы с многопоточными программами. С другой стороны, если есть портабельный способ так объявить mylib_errno, чтобы при сборке с потоками он был в TLS, а без потоков просто глобальным, ИМХО это было бы самое оно.

Вариант 3:

Никогда не делать в open ничего сложного. Если нужно, добавить отдельную функцию, к вызову которой хэндл библиотеки уже будет выделен и будет куда сохранить ошибку. Лишняя строчка при инициализции, и по-моему, это единственный минус. Не так красиво, как вариант 2.

Идеи? Особенно интересует второй вариант. Есть мысли про установку обработчика ошибки + setjmp, но а коде который это использует невозможно разбираться, да и jmpbuf надо передавать опять таки. Т.е. это ухудшенный вариант 1.

()

Алгоритм Хаффмана для последовательностей/больших алфавитов

Форум - Development

Есть поток 32битных целых, надо его максимально эффективно сжать. Значения распределены неравномерно, скажем так примерно половина влезет в 16 бит, но на деле распределение еще сложнее - хочется построить максимально эффективный код. Нужно что-то типа алгоритма Хаффмана, но напрямую (с алфавитом из 2^32 букв) его не применить. Есть идея отталкиваться от длины последовательности, т.е. разбить значения на 32 класса по числу значащих битов, и для каждого Хоффманом вывести префикс. Но как учитывать в алгоритме длину, просто умножать на частоту? Может есть другие варианты - думаю было бы эффективнее разбить числа на большее число классов.

Ссылки/хинты/идеи?

()

Узнать из какого репозитория установлен пакет

Форум - Desktop

Собственно как сабж в дебианоподобных дистрах (конкретно maemo 5)?

()

GIS для вардрайвинга

Форум - General

Поездил я с GPS и ноутом по району и теперь у меня есть куча точек, в которых известны ловящиеся там сети. Вопрос - как мне систематизировать это информацию и представить в удобном для восприятия виде, с возможностью дольнейшего уточнения (т.е. новых точек)? Я так понимаю, именно этим занимаются ГИС - какая есть конкретная, умеющая что мне нужно? А именно - подложна из OpenStreetMap + диаграмма Вороного или что-то похожее из моих точек.

()

Задачка с потоками и sigchld.

Форум - Development

Есть софтина, которая форкает детей и, соответственно, должна обрабатывать их завершение. У нее есть встроенный HTTP сервер с web интерфейсом.

Логично, что сигналы хочется обрабатывать исключительно в главном треде, поэтому перед созданием потока web сервер все сигналы блочатся, затем разблокируются как было и запускается цикл с sigwait и далее waitpid с WNOHANG.

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

- До завершения ребенкаб в web треде успевает запуститься wait() из pclose() - тогда pclose возвращает 0, т.е. как бы все ok. sigwait в главном треде возвращается, и waitpid возвращает ECHILD, т.е. детей как бы нет.
- Ребенок завершается до pclose(), тогда главный поток ловит полноценного дохлого ребенка. pclose() в web треде возвращает -1, потому что ребенка уже нету.

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

Решение вижу такое: руками сделать fork, pipe, в ребенке daemon и exec/system. Таким образом сигнала мы уже точно не получим, потому что daemon, а данные спокойно прочитаем из пайпа и закроем его. Ну код завершения не сможем узнать - это, в принципе, не критично.

()

[tkabber] скачать SSL сертификат для jabber.ru

Форум - Desktop

Надоело что tkabber постоянно просит подтвердить этот долбаный сертификат. Как подсунуть сертификат tkabber - понятно, а вот как скачать его? Думаю, должен быть какой-то общий способ. Типа openssl <что-то>.

Заодно, можно сделать чтобы tkabber подключался сразу при запуске, а не выводил каждый раз диалок с логин/пасс/сервер?

Последнее, есть jabber клиент с интерфейсом в стиле jabber, а именно не вертикальная кишка с ростером + чаты в отдельных окнах, а одно окно, слева ростер, справа - табы с чатами. Думаю сменить tkabber на что-нибудь более актуальное, что хотя бы поддерживает второй gpg, написано не на маргинальных языках и тулкитах и умеет/имеет шансы научиться аудио и видео чатам.

()

Reverse engineering файловых форматов

Форум - Talks

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

()

Убиралка текстовой рекламы, но не AdBlock

Форум - Desktop

В AdBlock можно убирать отдельные элементы страницы (с дополнением Element Hiding Helper), но сделано это настолько по-ублюдски, что пользоваться даже не хочется. Есть ли что-то подобное, только с поддержкой нормального XPath? Желательно с возможностью выбора элемента ну и прочими плюшками.

()

Хочу медиацентр

Форум - Desktop

Жизнь так повернулась, что теперь я не единственный обитатель собственной квартиры, в связи с чем встал вопрос о сетапе не-гиковских развлечений, а именно о покупке DVD плеера. Эти быдлокоробки стоят как г-но и я бы о них даже и не спрашивал, но подумалось что раз уж на то пошло, надо сделать по-человечески и использовать факт наличия в квартире NAS на несколько TB, на котором уже есть кое-какие фильмы. Итого - вместо тупого DVD плеера купить что-нибудь умное на линуксе, с поддержкой помимо DVD нормальных православных форматов, а главное, возможности смотреть фильмы по NFS. Никаких торрентов, думаю, не нужно.

Собственно вопрос - есть ли готовые железки и где купить? Если нет, то в какую сторону смотреть (barebone какой или что-то в этом роде, какой дистр)?

Требования по железу: наличие DVD читалки, ethernet, возможность без проблем декодировать H.264 1080p, управление с пульта, отсутствие ревущих кулеров. По софту - поддержка NFS и любых кодеков, что мне могут понадобиться, а также GUI в котором разберется не-гик. В идеале - не тивоизированная железка, потому что если там будет свободный перепрошивемый дистр и настроить NFS, и поставить кодеки, и даже допилить GUI уже не будет проблемой.

()

Syntensity

Форум - Games

Все уже видели: http://www.syntensity.com/ ?

В кратце: графический движок cube2 + гугловский javascript движок v8 = беспрецедентная по простоте и открытости платформа для создания 3D игр.
Сейчас можно посмотреть демонстрацию возможностей - есть две обычные CTF карты, многопользовательская 3D рисовалка, простенькие гоночки, набросок платформера с видом сбоку и одна неплохая сингловая/co-op карта. Для пользователя все абсолютно прозрачно - подключился к lobby (комната с порталами в другие игры), посмотрел там какие есть игры, нашел с кем поиграть (хотя пока там почти никого нет), вошел в игру, код и данные качаются автоматически - играй. Для разработчиков тоже все шоколадно - представленные игры занимают по паре-тройке KB javascript кода, карты можно редактировать в online (при желании нескольким людям сразу), разные cервера можно связывать порталами и т.д.

PS. Под FreeBSD собралась из исходников почти без напильника.
PSS. А вообще, хотя новых версий самого sauerbraten не выходило уже давольно давно, игры на его движке как-то пульнули. blood frontier последнее время тоже очень радует.

()