Привязка генштабовских карт в 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”
На правах заметки: Статический анализ кода 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:
- Избегайте функции memset, memcpy, ZeroMemory и им аналогичные
- Внимательно следите, работаете вы со знаковым или беззнаковым типом
- Избегайте большого количества вычислений в одной строке
- Выравнивайте в коде всё, что возможно
- Не размножайте строку более, чем один раз
- Выставляйте высокий уровень предупреждений у компилятора и используйте статические анализаторы
- Заметка №2
- Не используйте тернарную операцию ‘?:’ в составных выражениях
- Не стесняйтесь использовать скобки
- Заметка №3 - на примерах ошибок в Qt4
- Обрабатывайте переменные в той же последовательности, как они объявлены
- Табличные методы — это хорошо
- Разное интересное (про разные и интересные ошибки в Qt4)
- Заметка №4 - на примерах ошибок в Firefox
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
Многопоточность в C++
На правах заметки: цикл статей о многопоточности в C++.
В цикле рассматриваются создание обёртки над pthreads((ссылки по теме:
- POSIX_Threads
- POSIX Threads Programming
- Краткое описание pthread (threads))), использование boost::thread, а так же использование идиомы RAII|RAII (Захват ресурса есть инициализация) в контексте потоков.
- Multithreaded C++: Part 1: Pthreads
- Multithreaded C++: Part 2: Boost Threads
- Multithreaded C++: Part 3: RAII And Threads
Вообще, блог 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
Однооконный Dia
Достаточно запустить: dia –integrated
теперь вполне можно пользоваться.
Ну и чуть ярости: ну какого чёрта не вынести это в настройки!?
Test
Первый тестовый пост после обновления PHP с 5.3.10 на 5.4.3 и отказа BlogTNG.
Причина: BlogTNG использует SQLite2, который выкинули из PHP 5.4.0.
Как узнать каким компилятором мы компилируемся?
Не всё делается одинаково во всех компиляторах, не на всех платформах, приходится временами городить хитрые конструкции из #if/#elif/#endif. Случайно наткнулся на шпаргалку, в которой описано, какие директивы препроцессора предопределяют конкретные компиляторы: http://sourceforge.net/p/predef/wiki/Compilers/
С того же ресурса:
- для операционных систем: http://sourceforge.net/p/predef/wiki/OperatingSystems/
- для стандартов языка: 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++ Cheat Sheets
- C++ Containers Cheat Sheet: 1. http://homepages.e3.net.nz/~djm/cppcontainers.html 2. http://habrahabr.ru/company/infopulse/blog/194726/
- C++ Iterators & Algorithms Cheat Sheet: 1. http://homepages.e3.net.nz/~djm/cppiterators.html
- Shifting from C to C++ strings: 1. http://homepages.e3.net.nz/~djm/cppstrings.html
- C++03 vs C++11: 1. http://dl.dropboxusercontent.com/u/13100941/C%2B%2B11.pdf
- C++ Quick Reference: 1. http://www.dreamincode.net/downloads/ref_sheets/cpp_reference_sheet.pdf
- STL Quick Reference: 1. http://www.digilife.be/quickreferences/QRC/STL%20Quick%20Reference%201.29.pdf
- 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
Цикл статей "Введение в C++11"
Цикл статей камрада Игоря Кальницкого для “самых маленький” про плюшки нового стандарта C++:
- Введение в C++11: auto, decltype, nested templates и range-based-for
- Введение в C++11: nullptr и нововведения в системе инициализации
- Введение в C++11: лямбда функции
- Введение в C++11: умные указатели
- Введение в C++11: новые спецификаторы
- Введение в C++11: пользовательские литералы
Так же стоит прочитать статью на Википедии, на удивление информативная: C++11
BgBilling 5.2 - ошибка
А как оказалось, на разделе с /tmp кончилось место, сказал об том Midnight Commander при запуске.
С днем космонавтики!
Надеюсь, что всё таки выберемся за пределы орбиты Земли..
The Function Pointer Tutorials
Хорошее руководство: http://www.newty.de/fpt/index.html
PDF версия: http://www.newty.de/fpt/zip/e_fpt.pdf
Там же, прицепом: “Callback Implementations in C++”
- сама статья: http://www.newty.de/jakubik/callback.pdf
- доп материалы: http://www.newty.de/jakubik/callback.html
Удаление 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%%
0x10c - Hard Science Fiction
Проект новой игры от создателя Minecraft - 0x10c
Канву и основные фичи читать на сайте, отмечу только, что в игре придётся заниматься программированием 16-битного компьютера на чипе DCPU-16, спецификация чипа прилагается. Думаю, что тут можно будет проследить историю развития языков :)
Ищем замену OziExplorer на Linux
Решил таки переопубликовать свою статью в OpenSource (http://osa.samag.ru/info/OpenSource068.zip) и у себя в блоге. В журнале статья называется: “QLandKarte GT как замена OziExplorer в GNU/Linux”, здесь же публикую под оригинальным.