Или век живи - век учись.
Проблема описана здесь: https://stdcpp.ru/proposals/1386b162-0cde-49b7-a41e-90f2d9ee477c.
Суть: зачем передавать бинарный предикат и значение, если нужное значение можно временами захватить в лямбду и не передавать вторым аргументом компаратору.
Пробуем включать TransferServices плагин в Blueman и получаем что-то вроде:

Ключевое:
org.freedesktop.DBus.Error.NameHasNoOwner: Could not get owner of name 'org.bluez.obex': no such name
Исправления два:
- добавить в атозагрузку при логине
/usr/lib/bluetooth/obexd
- подсказать dbus автоматически спавнить его при обращении
Собственно Bluez предоставляет сервис-файл для второго варианта, только он рассчитан на работу с systemd, и поэтому Exec
указывает в /bin/false
.
Gentoo нам подсказывает:
что нужно вместо /bin/false
указать полный путь до obexd
, т.е. /usr/lib/bluetooth/obexd
. После чего передача файлов волшебным образом заработает сама.
Файл для редактирования: /usr/share/dbus-1/services/org.bluez.obex.service
ЗЫ ссылка на заметку:
ЗЗЫ неприятно что такие сервис-файлы нельзя переопределить через /etc/dbus/service/
. Или я не смог?
Буквально сегодня открыл для себя Imported Targets. При использовании их для модулей поиска, очень упрощает и систематизирует код.
Для примера, если вам нужно подключить ZLIB к проекту, при классическом подходе пишется что-то вроде:
cmake_minimum_required (VERSION 3.1)
project(Foo)
find_package(ZLIB)
add_definitions(${ZLIB_DEFINITIONS})
include_directories(${ZLIB_INCLUDE_DIRS})
add_executable(foo_target
main.cpp)
target_link_libraries(foo_target ${ZLIB_LIBRARIES})
Какие проблемы в коде выше?
- Добавляется новая библиотека, нужно не забыть добавить переменные в три места:
1.
add_definitions()
2. include_direcrories()
3. target_link_libraries()
- Мы забыли ключевое слово
REQUIRED
в find_package()
и узнаем, что у нас нет ZLIB или на компиляции или на линковке (так как других условий и проверок нет, предполагаю: данная библиотека необходима).
- Область действия
add_definitions()
и include_directories()
- глобальная (на самом деле нет: все таргеты в текущем CMakeLists.txt во всех далее включённых, но не суть) и распространяется на все таргеты. Что не есть хорошо.
Возможно что-то ещё, чего я не заметил.
Последний пункт можно обойти уже написав более навороченный код:
cmake_minimum_required (VERSION 3.1)
project(Foo)
find_package(ZLIB)
add_executable(foo_target
main.cpp)
target_include_directories(foo_target ${ZLIB_INCLUDE_DIRS})
target_compile_definitions(foo_target ${ZLIB_DEFINITIONS})
target_link_libraries(foo_target ${ZLIB_LIBRARIES})
От проблемы глобальности ушли, но остальные две остались.
А вот, начиная с CMake 3.1 код выше можно переписать так:
cmake_minimum_required (VERSION 3.1)
project(Foo)
find_package(ZLIB)
add_executable(foo_target
main.cpp)
target_link_libraries(foo_target
ZLIB::ZLIB)
И теперь правильно подтянутся и параметры для компиляции, причём только для указанного таргета, и параметры линковки. А кода стало меньше. Более того, если библиотека не найдена, то цели ZLIB::ZLIB
существовать не будет и вызов cmake завершится с ошибкой. А чем раньше ошибка вылазит - тем лучше.
Как это делается? А достаточно просто, маинтейнеру модуля поиска нужно в конце добавить строчки вида:
if (ZLIB_FOUND AND NOT TARGET ZLIB::ZLIB)
add_library(ZLIB::ZLIB UNKNOWN IMPORTED)
set_target_properties(ZLIB::ZLIB PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIRS}"
INTERFACE_COMPILE_OPTIONS "${ZLIB_DEFINITIONS}"
INTERFACE_LINK_LIBRARIES "${ZLIB_LIBRARIES}")
endif()
Код для FindZLIB.cmake на самом деле несколько другой, но общую суть он отражает.
Соглашение для таких тергетов простое:
PkgName::PkgComponent
где PkgName
соответствует имения пакета, которое передаётся в find_package()
(или имя модуля без префикса Find
и суффикса .cmake
), а PkgComponent
- внутренний компонент внутри модуля. Если такой компонент один, он соответствует PkgName
. Примеры:
ZLIB::ZLIB
Threads::Threads
Qt::Widgets
(см FindQt.cmake)
Кстати, вместо проверки:
if (ZLIB_FOUND)
Можно использовать:
if (TARGET ZLIB::ZLIB)
да, более многословно, но везде фигурирует только одно имя таргета.
Кроме того, эти таргеты можно использовать и совместно с target_include_directories()
и target_compile_definitions()
.
В общем, я крайне рекомендую в свои модули добавить несколько строчек, которые привнесут несколько большей унификации. От старых добрый переменных вас тоже никто отказываться не заставляет :)
ЗЫ ЕМНИП то такой синтаксис можно было использовать и до 3.1, с 3.1 оно появилось в некоторых модулях, которые поставляются с самим CMake.
Иногда приходится использовать mainline не из основных репозиториев, а отсюда:
Причин тому может быть несколько. Начиная от желания быть на острие атаки, и заканчивая тем, что на новых ядрах решена проблема характерная для вашего железа или другого окружения. У меня, к примеру, только с 4.10 перестал уходить в тотальный перегрев процессор при использовании Turbo Boost.
Беда этих ядер, что нет полезных пакетов linux-tools, которые требуются таким приложениям как perf
и turbostat
. И их нужно собрать самому, причём так, что бы они соответствовали версии ядра. Рассмотрим как это сделать, на примере 4.10.
Когда в следующий раз в Qt Creator по Ctrl+Shift+U вместо поиска использования символа появится диалог iBus для ввода Unicode кода символа, вспомнить про im-config и запустить его без параметров, после чего снести использование ibus. Если только он вам не жизненно необходим. Мне - нет.
Модель имеет совмещённый порт для подключения наушников с микрофоном (TRRS). Ниже посмотрим, что делать когда нет такой гарнитуры.
Походу Lonovo только “кирпичиный” дизайн не трогает. А всё остальное делает всё более казуальным. Судя по:
Итак:
- Расплодили серию. Хрен пойми чем отличаются W/T/L, а ещё, типа недобуки: X/Carbon X1/etc
- Уход легендарного T61 и переход к линеке Txyz (первые представители T400/T500), ознаменовалось ознаменовался завершением эры 4:3 экранов на ноутбуках. Теперь и здесь засилье wide-screen 16:9. Для видео удобно. Для работы - не очень. Даже интернеты: половина сайтов оставляет уйму места по бокам. Возможно широкий экран удобен для людей работающих с таблицами с огромным числом столбцов… Не знаю. Точно, что не спрос порождает предложение, а маркетоидный бред навязывает моду. Главное накормить непотребством, но так, что бы это вызвало “ВАУ!”
- К серии x30 (T430, T530, etc) линейка лишилась своей классической узнаваемой клавиатуры в угоду модной-молодёжной чиклектной (она же островная). Да фиг с ним, но раскладка вызывает недоумение: привет PrtScr (хоть и поборолся), при этом PgUp/PgDown стали в более удобных позициях /хотя теми же средствами что и PrnScr их можно забиндить на нужное поведение/), ряд Fx клавиш без разделения на группы.
- В серии x40 трекпоинт лишился своих кнопок. Волна негодования была, судя по всему, такой, что в x50 их вернули. Без дублирования кнопок снизу под тачпадом (но сенсорные остались).
- Серия x30 последняя где используется ThinkLight. Оставили только подсветку клавиатуры. Кому как, а для меня это было одной из причин выбора Thinkpad. Особенно удобно, когда рядом блокнот в котором нужно сделать пометки по ходу работы.
- Серия x40 так же ознаменовалась ликвидацией защелки. Мне она кажется удобной. Некоторым - рудиментом… Пока маленький сын не попытается открыть :)
- Снова клавиатура. С линейки 540 (да, касается только 15.6" модели) они вкорячили полноразмерную клавиатуру. Тем самым нарушив центровку основного поля ввода относительно экрана, ровно как и расположение тачпада. Кому так жизненно необходим цифровой блок на ноутбучной клавиатуре??? У меня на обычной он покрывается пылью, а тут просто растрата места.
- А вот динамики при этом решили заменить на полное непотребство. Да и 530 они не ахти, но фоном послушать можно. Точно не скажу, но с какой-то модели динамик а) монофонический и б) направлен вниз, в стол! Они что, решили стол или другую рабочую поверхность использовать как резонатор? Сабвуфер?
На фоне этого выглядит забавно это (тут свежее обсуждение):
Смотрится как эдакая попытка срубить бабла с того, что уже было, но было успешно слито. Если вообще будет сделано. А если сделано, то качественно. Воистину:
- Как сделать человеку хорошо?
- Нужно должно делать плохо, а потом просто перестать.
Походу, остаётся только Dell Latitude, со своими тараканами и нечеловеческими ценами. Радует только то, что на мою текущую модель T530 валом запчастей и в пределы производительности я ещё не упирался.
Уже были стоны и жалобы от меня по поводу несколько убогой клавиатуры, точнее раскладки, точнее расположению PrtScr кнопки. Но… или жри кактус или исправляй. Я, обычно, выбираю второй вариант.
Если коротко, команда ниже забиндит PrtScr и сделает из неё Menu (aka Compose) клавишу:
Для других клавиатур и ноутбуков может сработать, но нужно уточнять сканкод (b7
в примере выше).
Эту команду помещаем в /etc/rc.local
или в аналогичный.
Кому нужно подробностей и альтернативных вариантов - смотрим под катом.
Уже, как обычно, сезон снегоступинга сходу не задаётся и в этом году. Практически весь декабрь проболел какой-то заразой (кашель без каких либо намёков на температуру или насморк), а на Новый Год, вместо празднования на вершине горы в палатке, обошёлся компанией градусника и некоторого количества мероприятий по возвращению здоровья.
Но вот новогодние каникулы закончились. Незаметно пролетела первая рабочая неделя и первые выходные. Желание куда-то выгрестись обрело форму рассылки писем с предложением сходить хоть куда-то хоть на сколько. В результате собралась компания: я, Коля, Кирилл. На один день решается сходить Спайдер (он же Лёха) с женой. Сам после перелома и для него выход — чисто проверить возможности. Он же предлагает забрасываться на его пепелаце. Обратно планируем выбираться уже на электричке.
Маршрут на 21-22 января, по итогу, получился таким:

Немного в сторону от CMakeProjectManager2, в направлении стокового плагина.
Дискуссия на LOR навела на мысль. Ради спортивного интереса попробовал реализовать и… получилось! :)
За подробностями под кат.
Вот и прошло почти два месяца с последних изменений.
Время было потрачено:
- для ожидания некоторой стабилизации апстрима, так как, по сути, они требовали писать абсолютно новый код для реализации текущего функционала, а в условиях сильных и фатальных изменений, переписывать свой код на каждый чих… у меня столько времени нет.
- была предпринята неудачная попытка продвинуть код в апстрим.
- ну и изучался новый код, когда выпадало время, плюс раздумья - как применить функциональность и для серверного режима работы CMake.
Так как код отвергли, а это, по сути, написанная с нуля реализация старого функционала, то он был взят за основу новых изменений. Ну как основу - 99%.
Есть и изменения. Малой кровью была создана обёртка поверх Server Mode Reader’а, которая предоставляет всего его внутренние профиты за исключением классического вида дерева файлов.
Соответственно изменения, сделанные для старого ридера (Tealeaf Reader), который используется для версий CMake младше 3.7, в части отображения всех файлов, добавления, удаления и переименования теперь применимы и для Server Mode Reader.
Сразу же был найден и первый баг: неправильно обрабатываются дефайны из CMAke (add_definition()
). Патч уже отослан, у себя в коде изменений делать не буду, подожду, пока попадёт в апстрим, потом засинхронизируюсь.
Функциональность же передачи Toolchain файлов выла дропнута. Можно делать настройки через Kit или же вручную создать параметр CMAKE_TOOLCHAIN_FILE и задать нужный. Главное не забудьте сделать Build -> Clear CMake Configuration после этого. Ну и будьте готовы, что парсер C++ вас перестанет понимать, как минимум, частично.
Пакеты для Ubuntu 14.04 и 16.04 и производных уже доступны через PPA. Не забываем внимательно читать описание репозитория.
В ближайших планах подготовить ветку для стабильной версии QtC - 4.2. Там окажется только текущая функциональность и нового появляться не будет (если только кто-то не возьмёт её на сопровождение). Есть вероятность, что серверный режим будет выключен, так как он требует много смежных изменений и бекпортирования. Явные косяки тоже будут переноситься. В будущем, планирую саппортить только текущую версию QtC. Для старых не планирую даже исправления ошибок переносить. На всё это нужно время.
Если кто-то предложит варианты, как делать пребилды плагина для официальных версий QtC в автоматическом или полуавтоматическом режиме, буду рад выслушать.
Ну и с ошибками и предложениями: https://github.com/h4tr3d/cmakeprojectmanager2/issues
Начиная с Tx30 Lenovo дропнули старую клавиатуру на ноутбуках серии ThinkPad, что очень грустно, так как новая в части предоставляемой раскладки просто не выдерживает критики. Одно расположение клавиши Print Screen чего только стоит - ощущение, что клавиатура для ярых скриншотеров, не меньше. С другой стороны, расположение PgUp/PgUp значительно более удобнее, нежели на классике.
Помимо сокращения числа рядов клавиш, сократилось и их количество. К примеру, нет вышеозначенных в заголовке клавиш. При этом официальная документация на сайте говорит о том, как эту функциональность можно получить. Скопирую табличку сюда:
Клавиша |
Комбинация |
Break |
Fn+B |
SysRq |
Fn+S |
Scroll Lock |
Fn+K |
Pause |
Fn+P |
Данные комбинации не зависят от операционки, судя по всему, генерируются самим контроллером, так что должны работать и в консоли и в иксах без каких-то телодвижений.
Собственно вопрос, а чего бы эти значения не нанести на сами клавиши?
Ииии важное замечение, как работать с SysRq в Linux:
- Нажимаем Alt
- Нажимаем Fn
- Нажимаем S
- Отпускаем S
- Отпускаем Fn
- Нажимаем нужно командную клавишу (например S для синхронизации дисковых буферов, P - для распечатки регистров или C для паники :)
- Отпускаем нажатые клавиши в любом порядке или, не отпуская Alt, нажимаем следующую командную клавишу
ВАЖНО: простое нажатие Alt+Fn+S+буква ни к чему не приведут.
В продолжение post/2016/12/24/qt_creator_cmake_i_sudba_cmakeprojectmanager2.
Ревью https://codereview.qt-project.org/#/c/180827/ расставило точки над i: “Project View == Build System View”, билд система не может отображать все файлы проекта? Значит не будем показывать. Билд система не предоставляет возможности добавлять, переименовывать и удалять файлы в проекте? Значит не будем даже пытаться предоставить возможность это делать. Не удобно? Ничего, целостность концепции важнее.
Хотя… мне одному кажется, что абстракции тут текут? Ведь Project View сам по себе подразумевает именно проект?
Да, моё решение тоже не верх совершенства, даже так - костыль. Но он же реально помогает в условиях отсутствия более приличной альтернативы…
Ну и обоснование всего одно: “Я боюсь баг-репортов”.
Неприятно, что у меня куча идей, а код из-за сервер-мода будет очень сильно меняться ещё, теперь держать кодовую базу в актуальном состоянии будет всё сложнее (более тяжёлые мёржи).
В любом случае, сейчас будет перезагрузка кода, потому как для новой кодовой базы, по сути, написан новый код. Сейчас буду думать, как наименьшей кровью в истории перенести новые изменения. Скорее всего придётся заревертить все прошлые мои изменений, привести master в состояние идентичное qtc-master, после чего просто сделать новый комит.
Ну а родной менеджер начнёт поддерживать данную функциональность, только кода CMake Server Mode сподобится на это. Удачи в ожидании :) Особенно при том условии, что конкуренты (KDevelop, Clion) это умеют делать.
SSL Everywhere. С HTTP настроен редирект на HTTPS.
Сертификаты от Let’s Encrypt, получение и обновление сертификатов через CertBot.
Работать будет с браузерами, которые умеют Server_Name_Indication|SNI
, т.е. в пролёте древние Андроиды на 2.3.7, всякие IE6-IE8, HTTP клиенты в Java 6u45 и 7u25.
Первоначальный рейтинг C тюнился до A+ по следующим статьям:
Результат: https://www.ssllabs.com/ssltest/analyze.html?d=htrd.su&hideResults=on
Что пришлось менять и что поломалось:
- Ссылки на банеры, в частности картинки пришлось утянуть себе, так как доступны только по HTTP
- Воспользоваться миграционными тулами Disqus, что бы восстановить комментарии к статьям (URL Mapper, предварительно запросив текущий список и обработав его скриптом)
- Счётчики G+ слетели. Как их чинить для новых страниц - хз.
- …
- Что ещё отвалилось. Иначе невозможно :)
Обновочка. Продал свой GPSMAP 62s, как более неподдерживаемый. Плюс хотелось GLONASS. Зачем только не совсем понимаю :)
Отличия пока только визуальные: 62s мне достался практически сразу после выхода, и у него была детская болячка - скрипел корпус. 64s появился в 2014 году и корпус более крепкий. А вот резиновая заглушка для USB и антены на новом навигаторе доверия не внушает. Ещё более тактильная отдача на кнопках при нажатии.
Внутри место под флешку развернули на 90 градусов, теперь шансов, при доставании батареи, что флешка отойдёт меньше. А проблем с этим было две только среди моих знакомых (вторая - при мне быстро решили, но я уже про беду знал). Проявляется - карта то появляется, то исчезает.
Заявлено более короткий срок жизни от батареи. Минимальное время включения подсветки экрана увеличено с 5 сек до 15.
В этой модели можно заряжать аккумуляторы от USB. С одним “но”: внутри батарейного отсека появилась кнопка, что бы зарядка началась, нужно, что бы она была нажата. Автоматически это может сделать фирменный пак аккумуляторов, которые “сшит” общей рубашкой. Эта рубашка и зажимает кнопку. Типа, что бы беспечный пользователь не начал заряжать щелочные батарейки.
К сожалению, погонять чисто GLONASS на приборе не получится, доступные режимы: GPS, GPS+GLONASS. Чисто GLONASS - нет. А очень бы хотелось.
Теперь по ценам… Не покупайте у наших барыг! Типичная цена на навигатор в России - 25000 руб. Плюс минус. Самая маленькая найденная - около 20к руб. Добавьте судя стоимость доставки - от 500 до 1500 руб. (особенно, если хочется быстрее получить). А вот покупка и доставка с Амазона (я выбрал дорогую доставку UPS за 37$) вышла примерно в 15800 руб. (получил в руки за 1.5 недели). Что даже дешевле покупки мною предыдущего навигатора 62s - он мне обошёлся в 15900 руб., а ведь происходило это существенно раньше и по совсем другому курсу доллара. Так-то. Продавец: https://www.amazon.com/gp/product/B00HWL9AS8/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1. Карту памяти купил уже тут, отдал за 32Гб около 1000 руб.