Макроклавиши Razer BlackWidow
29 Января, 2018
Комментарии
Решил я как-то в позапрошлом году обзавестись нормальной, кошерной клавиатурой. С приятно щёлкающими механическими Cherry MX Blue. В общем купил Razer BlackWidow (2013 edition). Всё хорошо, но есть у этой клавиатуры 5 макро-клавиш, которые под Linux ну никак не заводятся, ни как макро, ни просто так. Оказывается, хитрый Razer включает их только по команде от “родного” драйвера, который, понятно, под линукс не рассчитан.
На самом деле выдрать из драйвера магическую последовательность не то чтобы сложно, но в интернетах эта последовательность ищется легко и непринуждённо, а поведение драйвера легко эмулируется скриптом на питоне. Скрипт и некоторые комментарии под катом.
Читать дальше...
Epson Perfection V10
15 Сентября, 2017
Комментарии
Давным-давно пытался я пользоваться сканером Epson Perfection V10. И была у него одна беда: работал он либо под Windows, либо под i386, а на x86_64 драйверов не было. Недавно достал его с полки, сдул пыль, и решил узнать, не изменилось ли чего. Оказалось – изменилось!
Читать дальше...
Модули VirtualBox 5.1.22 на ядре 4.12
12 Июля, 2017
Комментарии
Проблема: модули ядра VirtualBox текущей версии не дружат с ядром линукс 4.12 (последним на данный момент). В причины углубляться не будем, скажем только что несколько поменялось управление виртуальной памятью. Решение под катом.
Читать дальше...
Экспорт bibTeX
13 Марта, 2017
Комментарии
Заметка, чтобы не забыть. При написании TeXовских документов, я использую общий для всех файл biblatex. В основном потому что удобно иметь один шаблон и не думать об этом. Но посылать огромную библиографию в редакцию как-то некрасиво.
Простой способ получить biblatex-файл, в котором содержатся только использованные в документе ссылки возможно следующим образом:
bibexport -o outfile.bib ${document}.aux
при использовании непосредственно bibtex
biber --output-format=bibtex ${document}.bcf
при использовании biber
Определить использование последнего можно по факту наличия bcf
-файла после сборки документа.
Кстати, пока не забыл, беспроблемная сборка:
latexmk --outdir=build -f -pdf $document
Closure-Compiler и ghcjs
13 Марта, 2017
Комментарии
Ghcjs оказывается иногда незаменим если хочется Хаскеля в JavaScript-окружении. Однако его выдача имеет нередко просто чудовищные размеры.
Решить (или по крайней мере уменьшить) проблему размера возможно с помощью гугловского closure-compiler. Однако в случае сборки под node.js возникает трудность: ADVANCED_OPTIMIZATIONS
ломают названия нодовских функций. И все, привет. Есть, само собой, https://github.com/dcodeIO/ClosureCompiler.js, но он отмечен как outdated.
В общем, можно достичь нужного эффекта руками. Для этого следует клонировать https://github.com/dcodeIO/node.js-closure-compiler-externs и включить параметром --externs
все *.js
файлы оттуда. Вручную это, конечно, грустно. Поэтому я набросал вот такой вот скрипт:
#!/bin/bash
closure-compiler $1.jsexe/all.js --compilation_level=ADVANCED_OPTIMIZATIONS $(ls node.js-closure-compiler-externs/*.js | sed 's/^/--externs=/') --externs=$1.jsexe/all.js.externs > $1.js
Он, само собой, ужасен, но нужного эффекта достичь позволяет.
Замечание: гарантий, что extern’ы корректные, ни у кого нет. Поэтому что-то в каких-то случаях может ломаться совершенно случайным образом. Используйте на свой страх и риск.
Явное указание внешнего интерфейса у systemd-networkd-wait-online
10 Февраля, 2017
Комментарии
Проблема
При нестандартной конфигурации сети, systemd-networkd-wait-online
отваливается с таймаутом.
В логах при этом можно найти что-то такое:
systemd-networkd-wait-online[...]: Event loop failed: Connection timed out
Само собой, сервисы, зависящие от systemd-networkd-wait-online
, не стартуюут.
Решение
Решение ситуации – явно указать внешний интерфейс, который должен быть поднят чтобы считать сеть рабочей. Сделать это можно, например, создав файлик /etc/systemd/system/systemd-networkd-wait-online.service.d/exec.conf
следующего содержания:
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online -i <interface-name>
Вместо <interface-name>
следует вставить название интерфейса, например, br0
.
Заодно это решает проблемы на системах с несколькими сетевыми интерфейсами, когда только один из них можно считать “основным”, и если он не поднялся – сети еще, в широком смысле слова, нет.
Как обмануть систему или letsencrypt на shared-хостинге с CPanel
10 Февраля, 2017
Комментарии
С повсеместным пришествием HTTPS в массы, а особенно в связи с тем, что браузеры собираются помечать HTTP-сайты как небезопасные, возникает резонный вопрос: как сделать себе HTTPS задешево.
Раньше был вариант воспользоваться сервисом starttls/startssl, но в новых версиях Google Chrome и Mozilla Firefox их сертификаты блокируются, что еще хуже, чем отсутствие HTTPS вовсе.
С другой стороны, есть новый-модный-молодежный letsencrypt. Но если нет желания каждые три месяца подтверждать домен вручную (что долго и муторно), нужно гонять на целевом сервере утилиту (например, certbot), а это значит как минимум нужен SSH-доступ, ну или на худой конец webshell, которые прямо скажем не так-то просто организовать.
Дополнительно ситуация усугубляется тем, что на shared-хостинге установка certbot, даже при наличии shell-доступа, может быть совсем отдельным развлечением для мсье, знающих толк.
А что делать если у Вас копеечный shared-хостинг, на котором вообще ничего нет кроме CPanel, MySQL и апача?
Читать дальше...
Шпаргалка по xdg-open
8 Марта, 2016
Комментарии
Небольшая заметка про xdg-open
. Эта утилита открывает файлы или URI “наиболее подходящим” приложением, как записано в файлах *.desktop
.
Увы, как показывает практика, “наиболее подходящим” оказывается нередко какой-нибудь Firefox, что явно не всегда самое удачное решение.
Читать дальше...
Удаление просмотренных видео из плейлиста в YouTube
16 Декабря, 2015
Комментарии
Коротко и по делу, можно выполнить что-то такое в консоли:
[].slice.call(
document.getElementsByClassName("watched")
).forEach(
function (x) { x.parentElement.parentElement.parentElement.getElementsByClassName("pl-video-edit-remove")[0].click(); }
)
Пейринг Logitech Unifying на Bash
13 Июля, 2015
Комментарии
Я уже писал про пейринг устройств Logitech Unifiying, однако прошлые мои решения требовали компиляции сишной программы. Сегодня хочу предложить решение на “чистом” Bash (и dd
).
#!/bin/bash
grep -H 'NAME=Logitech USB Receiver' /sys/class/hidraw/hidraw?/device/uevent | cut -f1-5 -d'/' | \
while read syshr; do
devname=`grep -H DEVNAME "$syshr/uevent" | cut -f2 -d'='`
if [ -n "$devname" ]; then
dd if=<(echo -en '\x10\xFF\x80\xB2\x01\x00\x00') of="/dev/$devname" && echo "Pairing mode enabled on $devname"
fi
done
Скрипт пройдется по всем USB-устройствам, и включит режим пейринга на всех Unifying-приемниках, тупо скопировав “волшебную строку” при помощи dd.