Hatred's Log Place

DON'T PANIC!

Jun 17, 2012 - 2 minute read - туризм maps

Проблема с gdal: система координат LOCAL_CS вместо PROJCS [SOLVED]

Суть проблемы: при отработке утилит вроде ozi2geotiff получался geotiff который потом не читался в том же QLandkarteGT и утилитами самого gdal (типа того же gdalwarp). Самое печальное, что это коснулось и файлов привязок для карт с росгисцентра (в формате .pgw + .prj (первый - привязка в формате ESRI World file, второй - описание проекции в формате WKT((Well Known Text))), картами и привязками можно разжиться тут или на http://rutracker.org поиском по слову ggc).

Печально потому, что если положить рядом файл карты в .png, файл привязки .pgw и описание проекции .prj (имя файла без расширения при этом должно быть одинаковым), то получить geotiff становится проще простого: gdal_translate -of GTiff -a_srs O-50-103-D.prj O-50-103-D.png O-50-103-D.tiff

Файл .pgw подхватывается автоматически, дополнительно его указывать не нужно (об этом же говорится в официальной документации про поддержку PNG: http://www.gdal.org/frmt_various.html).

В печали я написал в список рассылки разработчиков gdal, к утру получил ответ от Frank Warmerdam, с уведомлнем, что он попытался на последне версии gdal и проблемы не наблюдает. Попытался собрать и тоже проблема самоустранилась, при этом, gdalinfo выдал корректную информацию для файлов сгенерированных старым gdal_translate, эти же карты после обновления открылись и в QLandkarteGT. Так что, у кого стоит gdal 1.9.0, нужно срочно обновляться (вроде как проблемы нет уже в 1.9.1, но не проверял)

Полезные ссылки:

Jun 16, 2012 - 2 minute read - туризм maps

Привязка генштабовских карт в QLandkarteGT

В интернетах уже есть заметки по этой тематике, например ссылки приводил в post/2009-03-15_11.42_paru_zametok_o_qlandkartegt, но что бы было под рукой. Опускаться до того, в какой пункт меню заходить не буду, приведу чисто технические моменты.

Исходные данные: лист километровки О-50-103.tiff

На первом шаге нужно указать проекцию карты, для нашего родного генштаба проекция будет примерно такого вида:

+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs

+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.9,-141.3,-80.9,0,-0.37,-0.85,-0.12 +units=m +no_defs

(параметр towgs84, определяет параметры перехода к датуму wgs84, который используется в том же GPS, этот параметр автоматом добавится, если в мастере настройки проекции выбрать датум Pulkovo 1942)

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

  • lon_0 - центральный меридиан
  • x_0 - мнимый восток (false easting)

В статье post/2011-06-26_14.58_gotovim_rastrovuju_kartu_dlja_navigatora_garmin_gpsmap_62s я уже показывал как рассчитывать эти параметры, продублирую и здесь:

lon_0 =  * 6 - 3            # центральный меридиан по известной зоне
x_0   =  * 1000000 + 500000 # мнимый восток (false easting)
    = floor(lon / 6) + 1    # номер зоны по любому значению долготы на листе, floor - взятие целой части от деления
    = (lon_0 + 3) / 6       # номер зоны по центральному меридиану (частный случай)

Как видно, оба параметра зависят от номер зоны, что бы не заморачиваться, есть ещё один очень простой способ определения её: по номеру листа, вычитая из него 30. Т.е. лист у нас O-50, значит его номер - 50, тогда:```scilab Nз = 50 - 30 = 20


Тогда значения центрального меридиана и мнимого востока:```scilab
lon_0 = 20 * 6 - 3 = 117
x_0   = 20 * 1000000 + 500000 = 20500000

Так же, для простоты, можно принять, что мнимый восток это: 500000 перед которым написан номер зоны, как он есть, т.е. как результат объединения двух строк (в программировании):``` “20” + “500000” = “20500000”

Jun 8, 2012 - 2 minute read - programming c++

На правах заметки: Статический анализ кода C++

Давно пользуюсь услугами cppcheck, но решил поглядеть что есть ещё (как оказалось, лучше, по сути, ничего и нету). Наткнулся на статью по теме на хабре: http://habrahabr.ru/post/75123

Тезисно:

  • Педантичные ключи для gcc (сам автор отсылает за подробностями: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html), особо хочется отметить неизвестный мне ключ -Weffc++, включает проверку на соответствие рекомендациям Скотта Майерса. Результат сборки моего последнего проекта поверг в уныние: будет ещё работы по вычистке.
  • cppcheck (в арчике есть в стандартных репах)
  • vera++ (есть в AUR)
  • rats (есть в AUR)
  • проверялки для чистого Си (как оказалось(( http://www.cert.org/secure-coding/tools.html и http://www.cs.cmu.edu/~aldrich/courses/654/tools/index.html)) их значительно больше, нежели для C++)

Далее, Анализ утилит статического анализа C++ кода, автор рассматривает следующие анализаторы:

  • rats (выше писал)
  • cppcheck (аналогично)
  • Graudit (есть в AUR)

причём рассматривает проблемы, которые они не выявляют.

Список статических анализаторов можно поглядеть на страничке в википедии: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis, причём не только для C/C++

Для интереса можно почитать перевод статьи Джона Кармака о статическом анализе: http://habrahabr.ru/post/135234/((Оригинал статьи: altdevblogaday.com/2011/12/24/static-code-analysis/)), где кратко излагается, какими инструментами ему довелось воспользоваться, и какие впечатления остались после них.

И на последок серия из четырёх заметок камрада Andrey2008((Один из разработчиков PVS-Studio, поэтому малость пропускаем его отсылы к этому продукту)) “Как уменьшить вероятность ошибки на этапе написания кода”:

  • Заметка №1:
    1. Избегайте функции memset, memcpy, ZeroMemory и им аналогичные
    2. Внимательно следите, работаете вы со знаковым или беззнаковым типом
    3. Избегайте большого количества вычислений в одной строке
    4. Выравнивайте в коде всё, что возможно
    5. Не размножайте строку более, чем один раз
    6. Выставляйте высокий уровень предупреждений у компилятора и используйте статические анализаторы
  • Заметка №2
    1. Не используйте тернарную операцию ‘?:’ в составных выражениях
    2. Не стесняйтесь использовать скобки
  • Заметка №3 - на примерах ошибок в Qt4
    1. Обрабатывайте переменные в той же последовательности, как они объявлены
    2. Табличные методы — это хорошо
    3. Разное интересное (про разные и интересные ошибки в Qt4)
  • Заметка №4 - на примерах ошибок в Firefox

Jun 2, 2012 - 1 minute read - linux

luakit: проблема со скролингом по PgUp/PgDown

Проблема странная, проявляется не сразу: вроде при запуске всё отлично работает, потом бац, перестаёт, при этом выводится сообщение слудющего содержания:

Error: in bind call: /home/user/.config/luakit/webview.lua:341: attempt to perform arithmetic on local 'p' (a nil value)

Решение проблемы нашёл тут: https://github.com/mason-larobina/luakit/issues/68, нормальный рабочий вариант получается этот: https://github.com/mason-larobina/luakit/issues/68#issuecomment-5528890

May 26, 2012 - 1 minute read - programming c++

Многопоточность в C++

На правах заметки: цикл статей о многопоточности в C++.

В цикле рассматриваются создание обёртки над pthreads((ссылки по теме:

  1. POSIX_Threads

  2. POSIX Threads Programming

  3. Краткое описание pthread (threads))), использование boost::thread, а так же использование идиомы RAII|RAII (Захват ресурса есть инициализация) в контексте потоков.

Вообще, блог Empty Crate крайне рекомендую к ознакомлению - интересные заметки по программированию на C++.

Так же в тему многопоточности concurency в C++0x (но всё это можно переложить, с небольшими оговорками и на boost::thread) серия статей в блоге Just Software Solution:

May 12, 2012 - 1 minute read - linux

Однооконный Dia

Достаточно запустить: dia –integrated

теперь вполне можно пользоваться.

Ну и чуть ярости: ну какого чёрта не вынести это в настройки!?

May 11, 2012 - 1 minute read -

Test

Первый тестовый пост после обновления PHP с 5.3.10 на 5.4.3 и отказа BlogTNG.

Причина: BlogTNG использует SQLite2, который выкинули из PHP 5.4.0.

May 5, 2012 - 1 minute read - programming c++

Как узнать каким компилятором мы компилируемся?

Не всё делается одинаково во всех компиляторах, не на всех платформах, приходится временами городить хитрые конструкции из #if/#elif/#endif. Случайно наткнулся на шпаргалку, в которой описано, какие директивы препроцессора предопределяют конкретные компиляторы: http://sourceforge.net/p/predef/wiki/Compilers/

С того же ресурса:

А так же определение порядка байтов: http://sourceforge.net/p/predef/wiki/Endianness/

Другие ссылки на эту тематику:

Apr 17, 2012 - 1 minute read - programming c++

C++ Cheat Sheets

  1. C++ Containers Cheat Sheet: 1. http://homepages.e3.net.nz/~djm/cppcontainers.html 2. http://habrahabr.ru/company/infopulse/blog/194726/
  2. C++ Iterators & Algorithms Cheat Sheet: 1. http://homepages.e3.net.nz/~djm/cppiterators.html
  3. Shifting from C to C++ strings: 1. http://homepages.e3.net.nz/~djm/cppstrings.html
  4. C++03 vs C++11: 1. http://dl.dropboxusercontent.com/u/13100941/C%2B%2B11.pdf
  5. C++ Quick Reference: 1. http://www.dreamincode.net/downloads/ref_sheets/cpp_reference_sheet.pdf
  6. STL Quick Reference: 1. http://www.digilife.be/quickreferences/QRC/STL%20Quick%20Reference%201.29.pdf
  7. C++ Concurency: 1. http://cpprocks.com/wp-content/uploads/C++-concurrency-cheatsheet.pdf

Отдельно по ANSI C: http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20%28ANSI%29%202.2.pdf

Apr 17, 2012 - 1 minute read - programming c++

Цикл статей "Введение в C++11"

Цикл статей камрада Игоря Кальницкого для “самых маленький” про плюшки нового стандарта C++:

  1. Введение в C++11: auto, decltype, nested templates и range-based-for
  2. Введение в C++11: nullptr и нововведения в системе инициализации
  3. Введение в C++11: лямбда функции
  4. Введение в C++11: умные указатели
  5. Введение в C++11: новые спецификаторы
  6. Введение в C++11: пользовательские литералы

Так же стоит прочитать статью на Википедии, на удивление информативная: C++11

Apr 16, 2012 - 1 minute read -

BgBilling 5.2 - ошибка

А как оказалось, на разделе с /tmp кончилось место, сказал об том Midnight Commander при запуске.

Apr 11, 2012 - 1 minute read - programming c++

Удаление weak_ptr из std::list

Дано: контейнер примерно такого вида:

std::list< boost::weak_ptr<Item> > items;

Вместо %%boost::weak_ptr<>%% могу быть:

  • %%std::tr1::weak_ptr<>%%
  • %%std::weak_ptr<>%% для C++11

Задача: нужно удалить элемент по значению.

Казалось бы, просто сделай:

...
items.remove(value);
...

ан нет: для %%weak_ptr<>%% не определён оператор сравнения. Если потеоретизировать, можно предположить, почему так сделано: что бы гарантировать консистентность указателей при сравнении нужно их захватить (сделать %%value.lock()%%), т.е. создать два %%shared_ptr%% и уже их сравнивать, т.е. лишние накладные расходы.

Поэтому удаление можно делать так:

template <typename T>
bool operator == (const boost::weak_ptr<T>& a, const boost::weak_ptr<T>& b)
{
    return a.lock() == b.lock();
}

после такого %%std::list::remove(const T&)%% будет работать для всех типов. Можно и сузить до конкретного.

Либо использовать %%std::list::remove_if(Predicate)%%, предикат объявить как:

struct EqPredicate
{
    const boost::weak_ptr<Item>& item;

    EqPredicate(const boost::weak_ptr<Item>& item)
        : item(item)
    {
    }

    bool operator () (const boost::weak_ptr<Item>& p) const
    {
         return p.lock() == item.lock();
    }
};

и использовать так:

std::list< boost::weak_ptr<Item> > items;
...
items.remove_if(EqPredicate(value));

Информация взята отсюда: http://stackoverflow.com/questions/1390340/how-can-i-use-stdremove-on-a-container-with-stdtr1weak-ptr

Вышесказанное верно для %%boost::weak_ptr%%, %%std::tr1::weak_ptr%%, %%std::weak_ptr%%

Apr 5, 2012 - 1 minute read -

0x10c - Hard Science Fiction

Проект новой игры от создателя Minecraft - 0x10c

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