Hatred's Log Place

DON'T PANIC!

Jun 16, 2012 - 3 minute read - Comments - туризм 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 = Nз * 6 - 3            # центральный меридиан по известной зоне
x_0   = Nз * 1000000 + 500000 # мнимый восток (false easting)
Nз    = floor(lon / 6) + 1    # номер зоны по любому значению долготы на листе, floor - взятие целой части от деления
Nз    = (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"

Переходим ко второму шагу. Тут нужно указать проекцию, в которой вводятся координаты точек привязки: * если привязки указаны в географических координатах (долгота и широта, особенно удобно на листах с рамкой - на них у нас имеются 5 точек указанными координатами - грех не воспользоваться), то проекцию можем ввести: +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +proj=latlong +ellps=krass +towgs84=23.9,-141.3,-80.9,0,-0.37,-0.85,-0.12 и не особо парить мозг. Тогда значения координат точек нужно вводить примерно так: N57 20.00 E117 00.00 не значащие нули опускать не нужно * если привязываете по линиям километровой сетки, то копируете проекцию с первого этапа, а значения координат указываете в метрах, примерно так: 20520000 6356000 подробнее о привязывании по километровой сетке не расскажу - делал всегда по координатам.

Собственно, на этом всё, осталось нажать кнопку Process.

Jun 8, 2012 - 2 minute read - Comments - 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 - Comments - 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 - Comments - 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: * Multithreading in C++0x part 1: Starting Threads * Multithreading in C++0x part 2: Starting Threads with Function Objects and Arguments * Multithreading in C++0x part 3: Starting Threads with Member Functions and Reference Arguments * Multithreading in C++0x part 4: Protecting Shared Data * Multithreading in C++0x Part 5: Flexible locking with std::unique_lock<> * Multithreading in C++0x part 6: Lazy initialization and double-checked locking with atomics * Multithreading in C++0x part 7: Locking multiple mutexes without deadlock * Multithreading in C++0x part 8: Futures, Promises and Asynchronous Function Calls

May 12, 2012 - 1 minute read - Comments - linux

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

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

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

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

May 11, 2012 - 1 minute read - Comments -

Test

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

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

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

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

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

С того же ресурса: * для операционных систем: http://sourceforge.net/p/predef/wiki/OperatingSystems/ * версии Windows: https://msdn.microsoft.com/en-us/library/6sehtctf.aspx * в рантайме: * https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx (устарела) * https://msdn.microsoft.com/en-us/library/windows/desktop/dn424972(v=vs.85).aspx * для стандартов языка: http://sourceforge.net/p/predef/wiki/Standards/ * для стандартных библиотек (реализаций) C и C++: http://sourceforge.net/p/predef/wiki/Libraries/ * для архитектур: http://sourceforge.net/p/predef/wiki/Architectures/

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

Другие ссылки на эту тематику: * C/C++ tip: How to detect the compiler name and version using compiler predefined macros

Apr 17, 2012 - 1 minute read - Comments - 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 - Comments - 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 - Comments -

BgBilling 5.2 - ошибка

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

Apr 11, 2012 - 1 minute read - Comments - 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 - Comments -

0x10c - Hard Science Fiction

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

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