XeTex и XeLaTeX
На правах мемориза:
На правах мемориза:
Некоторые библиотеки находятся в AUR, некоторые собираются сами, но есть ещё такой чудный проект как Windows KDE: http://windows.kde.org/ в рамках которого, для компиляции KDE уже отстроено много библиотек.
Найти их можно:
Ну и поиграться с версиями, начиная отсюда: http://www.winkde.org/pub/kde/ports/win32/
Что самое чудное, есть версии не только для mingw, но и для VC10, а так же версии библиотек с отладочной информацией.
UPD
Для зависимостей между модулями будет полезно: http://www.winkde.org/pub/kde/ports/win32/repository-4.8/config/config.txt
И все файлы одним списком без разделение ня kde & win32libs: http://winkde.org/pub/kde/ports/win32/releases/stable/4.8.0/
Долго собирался и вот, наконец, дошло до дела: опробовать аварийную ночёвку в лесу, когда под руками только самое необходимое, а то и без него.
Итак, 2 июня, после экзаменов в горной школе нашего турклуба, на пару с другом Евгением, сруливаем в, относительно, недалёкие окрестности стольного града Владивостока.
Задачу ставим на первый раз простую: организация укрытия, ночёвка в нём, при этом нет спальника (легенда: “палатка и спальник в рюкзаке, рюкзак свалился в пропасть”). Насчёт пенки решили сделать допущение, ровно как на котелок и еду - в самом деле, не всё же сразу!
Самое главное, если вдруг оказался в чрезвычайной ситуации - не паниковать. Не знаешь что делать - лучше сядь и посиди, успокаивая мысли, не делай лишних телодвижений, шевели головой - на это меньше тратится энергии, а полезного выхлопа больше.
Особенно этому правилу нужно следовать в делах выбора места для ночлега: если палатка и может защитить в некоторой степени, даже будучи поставленной на сырую землю, то когда пола нет совсем, нужно поискать месте более приподнятое, сухое, лучше если оно будет хорошо освещаться солнцем (естественно при его наличии). Примерно такое место мы и нашли, плюс недалеко, в распадке обнаружился ручей - чистая вода очень хороший помощник! Но остерегайтесь чуть журчащих по земле и листве ручейков - такую воду однозначно следует кипятить, если ручей бурный, с каменистым дном - опасностей для организма в такой воде значительно меньше. Хотя быстрый бег с низкими приседаниями и не исключены и в этом случае.
И вот, место выбрано, теперь стоит определиться с укрытием. Если вас один-два человека, подойдут даже природные заготовки, вроде вывороченного пня - просто наложите лаги, застелите ветками, засыпьте листвой, и закрытое почти со всех сторон жилище готово. Иногда в лесу падает сухостой, по дороге к земле, бывает зацепляется, при этом, часто, образуется уже почти готовый шалаш, только пообломай лишние ветки, да немного облагородь. Мы решаем делать односкатный шалаш, можно сказать, из ничего.
Посмотришь всякие фильмы, где суровые дядьки показывают, что делать когда случилась опа, у них куда не плюнь - верёвка из лианы: плети, крути, делай что хочешь. А у на в Приморском крае оказывается не хуже - актинидии (в народе киш-мышь), лимонника да дикого винограда где только нет. В нашем распоряжении оказалось немного актинидии, её мы и использовали, как замену верёвки, для укрепления нашего жилища.
Основа - два дерева. Для двух человек достаточно, что бы расстояние между ними было сантиметров 130-140. Меньше - тесно, да дождь по бокам может заливать, больше - дополнительные трудозатраты, как следствие, потеря энергии (это у нас была еда, а если действительно - рюкзак в пропасть?). Находим подходящую сухую жердину, главное что бы она не сломалась от малейшего чиха. Лучшим выбором будет дерево не лежачее на земле, а ещё стоячее - оно меньше подвержено гнили. Глубина ската выбирается по росту самого высокого человека, плюс десять, двадцать сантиметров. Высота ската при этом побирается такой, что бы угол между скатом и землёй был примерно 45 градусов - потом поясню, для чего.
Итак, два дерева найдены, жердина подобрана, теперь её нужно закрепить. У нас веток на деревьях на нужной высоте не оказалось, поэтому нашли две сухие рогатины, нужной высоты, прислонили к деревьям, закрепили актинидией, на рогатины положили жердь.
Если ничего лианоподобного нет, нет ивы (кору с её молодых побегов легко можно использовать как верёвку, да и счищать можно руками), то тогда следует подыскать деревья, на которые можно положить перекладину без дополнительных ухищрений
Теперь нужно уложить поперечные лаги. Предварительно нахожу три бревна побольше, можно даже сущую труху, главное что бы было потяжелее. Одно бревно ложу на землю параллельно нашей жерди - на него и на жердь будут ложиться лаги. Лаги - тоже сушнины, только потоньше и полегче, нежели основная жердь, укладываем их на расстоянии 40-60 сантиметров друг от друга. К поперечной жерди приматываем той же актинидией. Когда все лаги будут уложены, на нижнюю часть, сверху ложим два запасённых бревна, тем самым плотно прижав концы к лежачему на земле бревну.
Снова, если нет ничего для вязки, закрепить лаги сверху можно, положив поверх ещё одну жердь - она придавит их к основной
После этого я нарезал тонкой живой гибкой поросли и как бы вплёл её поперёк лагов, в результате получилась этакая сетчатая конструкция. На эту конструкцию теперь будет удобно укладывать “черепицу”… В качестве оной “матёрые выживальщики” используют пальмовые листья, ога, ща, сгоняем по быстрому! Поэтому снова нарезаем поросль, тонкие ветки с листвой, собирая их в своеобразный веник и укладывая их на нашу сетчатую конструкцию таким образом, что бы черенки смотрели вверх. Естественно укладываем с нахлёстом, снизу вверх, как настоящую черепицу.
Всё, по сути на этом процесс строительства укрытия закончен, правда если у вас не окажется коврика (как я писал выше, у нас это было допущением), нужно будет сделать настил, что бы поднять ваше тело от сырости и холода земли (почки вам ещё пригодятся!). Сделать его можно просто: найти два бревна побольше, положить их параллельно боковым стенкам и плотно плотно уложить на них поперечные жерди. Поверх жердей, как и на крышу, можно уложить веток с листвой - комфорта будет значительно больше и отдохнувший организм скажет вам спасибо.
Всё, теперь можно заносить вещи и озадачиваться обогревом жилища.
В качестве обогревателя будет костёр, а другого и не дано! Делаем его из длинных брёвен, желательно их натаскать пока светло, фонарика тоже может не быть, а бегать вотьмах за дровами сомнительное удовольствие. Раскладываем его параллельно входу. Если получится подыскать подходящий материал для нодьи - лучше сделать её: горит долго, жара много. На крайний случай пойдёт и таёжный костёр.
Важным элементом обогрева, про который мы по глупому забыли в этот раз, это теплоотбойник. Название страшное, а суть проста: за костром, на расстоянии 40-50 (и более, зависит от жара) см делается вертикальная стенка, высотой до 50см. Материал - дерево (деревянный век какой-то). Что бы она держалась, берутся 4 ветки молодняка и втыкаются в землю, между ними накладывается стенка, просто и быстро, наличие щелей не особо критично.
Вцелом на все приготовления у нас ушло меньше двух часов, притом, что строительством жилища занимался в основном только я, Женя занимался заготовкой дров и костром, при этом укрытие получилось не на 2х человек, а на 4-5, соответственно есть запас по ресурсам.
Переночевали сносно, костёр прогорал примерно каждые 2 часа, просыпались, от того, что становилось прохладно, подкладывали дров и снова засыпали.
Теперь пару замечаний, которые вынесли после такой ночёвки.
Первое, это уже упомянутый выше теплоотбойник - делать обязательно! Меньший расход дров, даст больше тепла.
Второе, тут мы тоже сделали не правильно, ветер должен надувать на стенку, в нашем случае он дул во внутрь убежища, задувал костёр, поэтому то было очень жарко, то прохладно. Кроме того, костёр сушит листья, и держать дождь они будут хуже, да и спалить из снаряжения, оставшегося, будет проще. А отбойник с правильно расположенной стенкой даст спокойный огонь и ровное тепло. Так же, ветер не будет задувать капли дождя, при подобном расположении ската.
Третье, про угол 45 градусов, его мы тоже не соблюли. Вообще критично, если крыша из листьев (и листья эти не пальмовые), тогда капли дождя будут скатываться и меньше проникать во внутрь. Если найдена какая нибудь плёнка, то лучше укрыть крышу ею, главное закрепить (положить сверху несколько лаг), что бы не унесло ветром
Больше огрехов, вроде не заметили, при этом, вцелом, при строительстве можно было даже обойтись даже без ножа, не говоря уж о каком-то другом инструменте (я пользовался только ножом). Теперь нужно будет отработать ночёвки в безлесье и в зимний период.
И напоследок, немного фотографий, делал на телефон, поэтому не обесудьте. На фотографии, со стороны ската ещё не все ветки с листьями уложены, поэтому выглядит так облезло.
Карты ресурса “Поехали” канули в лету, хоть они и не блистали своим качеством. Теперь их можно найти на различных торрентах в сбониках и т.д. Данная заметка, что бы после было можно оперативно найти себе карту (привязать, кропнуть, склеить, сделать jnx :simple_smile:) для похода.
UPD 2019-11-14:
Которые утекли на просторы интернета, скачиваются на торрентах с http://rutracker.org, поиск по слову “ggc”. Отдельно стоит отметить то, что к ним есть привязки (там же на торрентах) в трёх форматах:
Последние представляют из себя пару файлов с расширениями .prj (описание проекции в тестовом формате Well-known_text|WKT (Well-Known Text)
) и .pgw (файл с 6 строчками с цифрами - сам Wold файл) и могут быть использованы gdal_translate
для получения привязанного GeoTIFF (об этом я вскользь уже упоминал:
Проблема с gdal: система координат LOCAL_CS вместо PROJCS [SOLVED] )
Полный набор можно скачать с раздачи на nnm-club: http://nnm-club.ru/forum/viewtopic.php?t=403156 только раздача очень жирная, на моём нетбуке открыть её не получилось :)
Наличие самих карт можно смотреть на неофициальном сайте: http://loadmap.net (старый генштаб тут же).
Особенно полезен в различных картографических программах, вроде QLandkarteGT, для планирования маршрута, дневных переходов, т.к. предоставляет карту высот и мы может увидеть график высоты, оценить, стоит ли подниматься на перевал с этой стороны или выбрать другой вариант.
SRTM данные, в формате, поддерживаемом gdal можно скачать тут (официальный сайт): http://dds.cr.usgs.gov/srtm/version2_1/SRTM3
Файлы там имеют структуру: NddEddd.hgt.zip, где N - северная широта (S - для южной), dd - градусы широты, E - восточная долгота (W - для западной), ddd - градусы долготы. Сайм файл рельефа покрывает площать 1x1 градус. Датум у этих файлов WGS84, для использования с генштабовскими картами, нужно будет преобразовать систему координат с помощью gdalwarp
(на выхода правда получится уже не hgt, а GeoTIFF - но почти все программы такой вариант представления высоты тоже понимают)
Этими же файлами можно разжиться в двух раздачать на торрентах:
Для широт севернее 60 градусов северной широты можно данные можно взять тут: http://www.viewfinderpanoramas.org/Coverage%20map%20viewfinderpanoramas_org3.htm
Для начала, для навигаторов Garmin, а вообще не раздел, а один сплошной TODO, т.е. все рекомендации приветствуются.
Бывает необходимость в вашем приложении отобразить ту или иную стандартную системную иконку, типа значка диска CD-ROM. Можно, конечно, создавать свой ресурсный файл и ложить иконки туда, но это будет выглядеть несуразно, особенно при смене различных тем оформления. Задаёмся резонным вопросом: а как бы использовать то, что уже есть в Qt и/или системе?
Про это написано тут: http://www.qtcentre.org/wiki/index.php?title=Embedded_resources
Помимо списка, приведён и код, которым можно получить список самостоятельно. Так же показан пример, как создавать изображение из ресурса:
QPixmap pixmap(":/trolltech/styles/commonstyle/images/up-128.png");
QIcon icon(":/trolltech/styles/commonstyle/images/up-128.png");
Сылки по теме:
Собственно что нам нужно, это метод класса QStyle:
QIcon QStyle::standardIcon ( StandardPixmap standardIcon, const QStyleOption * option = 0, const QWidget * widget = 0 ) const
Иконки опеределяются перечислением StandardPixmap
Тут, скорее всего, всё будет очень сильно зависеть от платформы. Но в общем случае, нам нужен такой вызов:
QIcon icon(QIcon::fromTheme(QString::fromUtf8("icon-name")));
icon-name
имя иконки, возможные значения, стандартные, для Linux можно узнать тут:
http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
На выходных готовил растровую карту для похода на Кодар, с последующей конвертацией оной в JNX.
Самые неинтересные и скучные моменты в этом деле была обрезка рамки. А кроме того, печаль, по причине того, что есть карты с привязками OZI, но нет нормального конвертера для них.
В результате, подумал и написал за выходные две программы: ozi2map и geocrop
Первая, как можно понять из названия, предназначена для конвертации карты с привязкой OZI (сама карта в JPEG или GIF или другом распространённом растровом формате, который поддерживает OZI, но не OZFX/OZFX2/OZFX3, для них преобразования можно сделать средствами самого gdal (в прошлых статьях писал про это)).
Для чтения точек привязки и параметров проекции используется функция из недр GDAL: GDALReadOziMapFile(...)
, что, в отличии от питоновского ozi2geotiff.py, даёт корректные параметры проекции. Далее, не стал особо заморачиваться и подсовывая нужные параметры gdal_translate/gdalwarp вызываю их через system()
.
Я вообще не стал лезть в разбор map файла, поэтому файла растра автоматически не определяется и его нужно указывать самому: ./ozi2map O-50-103.map O-50-103.jpg ./ozi2map O-50-103.map O-50-103.jpg O-50-103.tif
Если имя выходного файла не задано, имя будет сформировано из имени растра с заменой расширения на .tif.
Всё, пользоваться программой должно быть проще простого. Найти исходники (GPLv2) можно тут:
https://git.gitorious.org/h4tr3d-utils/ozi2map.git
Собирать просто: make
Полученный бинарник можно запускать от куда угодно.
Вторая программа предназначена для автоматической (хотя лукавлю: полуавтоматической) обрезки рамки на номенклатурном листе. Принцип действия прост: определённому набору координат соответствует какой-то стандартный лист заданного масштаба (его как раз и нужно указывать). Стандартный лист обрамлён вполне конкретными координатами, по которым вполне можно осуществить обрезку без вмешательства человека.
Т.е. по сути, программе на вход нужен только масштаб листа (в виде 1M, 500k, 200k, 100k, 50k, 25k, 10k, 5k, 2k) и сам лист карты в формате, поддерживаемом GDAL с корректной привязкой.
Когда расчёты по привязке будут выполнены, вызывается gdalwarp через system()
. Полигон для обрезки формируется в координатах листа (не в точках растра), для всех листов, кроме 1M, это 4х угольник (на будущее будет более качественно сделано, но и текущего результата хватит в 99.99% случаев).
Пользоваться программой не сложнее чем ozi2map: ./geocrop -s 100k O-50-103.tif O-50-103-crop.tif
Первым аргументом - стилизованное обозначение масштаба:
Вторым аргрументом - входной файл, поддерживаемый GDAL.
Третий аргумент - выходной, кропнутый файл. По умолчанию - GeoTiff, но можно переопределить опцией “-f FORMAT”, где FORMAT - любой поддерживаемый GDAL.
Если хотите обрезанные карты потом склеивать при помощи gdal_merge.py
, и получить вразумительные результат, входной файл должен быть в цветовой палитре RGB, узнать это можно при помощи утилиты gdalinfo
, если в выводе есть такое:
Band 1 Block=4096x1 Type=Byte, ColorInterp=Red
Band 2 Block=4096x1 Type=Byte, ColorInterp=Green
Band 3 Block=4096x1 Type=Byte, ColorInterp=Blue
значит всё хорошо, если нет (выводится палитра из 255 цветов), то палитра индексированная, нужно преобразовать в RGB при помощи утилиты pct2rgb.py
из комплекта GDAL.
Собирать просто: mkdir build cd build cmake .. make
Если на стадии cmake будут какие-то проблемы, стоит поставить dev-пакеты для GDAL и PROJ.4
Исходники можно взять тут (GPLv2):
https://github.com/h4tr3d/geocrop
Суть проблемы: при отработке утилит вроде 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, но не проверял)
Полезные ссылки:
В интернетах уже есть заметки по этой тематике, например ссылки приводил в 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)
собственно для каждого листа миллионки она будет своя, жирным выделено то, что будет меняться от листа к листу. Теперь пояснения:
В статье 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”
Давно пользуюсь услугами cppcheck, но решил поглядеть что есть ещё (как оказалось, лучше, по сути, ничего и нету). Наткнулся на статью по теме на хабре: http://habrahabr.ru/post/75123
Тезисно:
-Weffc++
, включает проверку на соответствие рекомендациям Скотта Майерса. Результат сборки моего последнего проекта поверг в уныние: будет ещё работы по вычистке.Далее, Анализ утилит статического анализа C++ кода, автор рассматривает следующие анализаторы:
причём рассматривает проблемы, которые они не выявляют.
Список статических анализаторов можно поглядеть на страничке в википедии: 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, поэтому малость пропускаем его отсылы к этому продукту)) “Как уменьшить вероятность ошибки на этапе написания кода”:
Проблема странная, проявляется не сразу: вроде при запуске всё отлично работает, потом бац, перестаёт, при этом выводится сообщение слудющего содержания:
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++.
В цикле рассматриваются создание обёртки над pthreads((ссылки по теме:
Вообще, блог Empty Crate крайне рекомендую к ознакомлению - интересные заметки по программированию на C++.
Так же в тему многопоточности concurency в C++0x (но всё это можно переложить, с небольшими оговорками и на boost::thread) серия статей в блоге Just Software Solution:
Достаточно запустить: dia –integrated
теперь вполне можно пользоваться.
Ну и чуть ярости: ну какого чёрта не вынести это в настройки!?
Первый тестовый пост после обновления 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/Endianness/
Другие ссылки на эту тематику:
Отдельно по ANSI C: http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20%28ANSI%29%202.2.pdf