Куда переносить международные домены в 2022 году

Ряд моих доменов в международных зонах собирался протухнуть осенью 2023 года, и остро встала необходимость в их продлении. В связи с известными событиями буржуйские регистраторы наши карты не принимают, Webmoney растеряли былую популярность и Paypal ушел из России. Казалось бы, дело пахнет керосином — но нет, все еще есть возможность забрать домены куда-нибудь еще.

Во-первых, есть солнечный Казахстан, и единственный в Казахстане аккредитованный ICANN регистратор доменов ps.kz. Там более-менее адекватные цены продления доменов в зоне .com, но совершенно негуманные для зоны .org. По заявлению техподдержки, они принимают отплату через Qiwi. Возможно, могут работать и российские карты МИР, но я это не проверял.

Во-вторых, есть ряд российских регистраторов, которые позволяют перенести международные домены к себе. Но ценник там совсем не гуманный, и есть риск того, что их могут лишить аккредитации или заблокировать им платежи.

И в-третьих, есть один канадский регистратор, который принимает Qiwi, туда я и перенес свои домены и продлил на несколько лет. Да, за обработку платежа в Qiwi регистратор берет дополнительную комиссию (порядка 3%), но это гораздо гуманнее, чем комиссия посредников при оплате криптой или другими способами через проверенные обменники.

Новый сервис: Telegram бот – напоминалка

Представляю новый сервис – напоминалку. Это бот для telegram, который поможет вам не забывать о важных делах и событиях. Распределите дела/встречи/события по нужным дням, настройте напоминания, в заданный день они появятся в вашем мессенджере.

Почесав репу, я решил, что события могут быть одноразовые – запланированные на определенную дату, ежедневные, еженедельные, ежемесячные и ежегодные. Все они поддерживаются в боте, настраиваются в пару кликов и замечательно синхронизируются между всеми устройствами, зарегистрированными на один аккаунт. А главное, что мне нравится больше всего, для подобного сервиса не придется светить где-то свой email адрес, номер телефона или какую-то другую свою персональную информацию. Если бот надоел, от него всегда можно отключиться. И это – очень удобно, и возможно, что пригодится не только мне.

Если будут какие-то пожелания по доработке сервиса, не стесняйтесь, оставляйте ваши комментарии. Если что-то будет действительно стоящее – сделаю. Сервис абсолютно бесплатный, никакой рекламы и нем не будет.

Логи Apache и текст в UTF-8

Заметил одну интересную вещь с логами приложений на php. Если приложение использует вывод отладочной информации в error_log, то в логах php-fpm все сообщения в UTF-8 нормально отображаются. В логах Apache же вместо слова “Ошибка:” будет написано что-то вроде “\xd0\x9e\xd1\x88\xd0\xb8\xd0\xb1\xd0\xba\xd0\xb0:”, что читать совершенно неудобно.

Это совершенно нормальное поведение для apache версии 2.0.49+, там весь вывод в логи экранируют от подозрительных символов. Эту фишку можно отключить, если пересобрать apache с опцией CFLAGS=”-DAP_UNSAFE_ERROR_LOG_UNESCAPED”, но это неудобно – хотелось бы, чтобы была возможность читать логи без танцев с бубном. В результате родился скрипт, декодирующий подобные последовательности символов в нормальные строки в UTF-8:

#!/bin/sh
if [[ $# -eq 0 ]] ; then
    echo "Usage: $0 apache_log_file_name"
    echo "Символы utf8 будут декодированы из вида \\xd0\\xa3\\xd0\\xbf\\xd1\\x80\\xd0\\xb0 в нормальные символы UTF-8"
    exit 0
fi

if [[ $# -eq 1 ]] ; then
    /usr/bin/tail -f "$1" | while read -r line; do echo -e "$line"; done;
fi

Новый сервис: проверка решения геометрических задач

Давненько я не писал что-нибудь общественно-бесполезного. Но тут вдруг решил помочь школьникам с геометрией и алгеброй, в части построения треугольника по заданным координатам.

Треугольник нарисовать — дело нехитрое. Несколько сложнее найти координаты центра окружности, вписанной в треугольник и ее радиус; координаты центра тяжести треугольника; и координаты центра окружности, описанной через вершины треугольника. Для этого и создан мой новый сервис Проверка решения геометрических задач.

Решать задачи я никому не собираюсь, но с радостью делюсь инструментом проверки результата расчетов. Зная координаты вершин треугольника, можно получить всю необходимую информацию как в графическом виде, так и в виде координат точек.

Правда, тут есть нюанс. В HTML5 для рисования предусмотрен тег canvas, в котором координаты X идут слева направо (как и в школьной тетради); а вот координаты Y в нем отсчитываются сверху вниз (зеркально по отношению к обычному рисунку в тетради). Если кто-то решит перенести получившийся чертеж в тетрадь, необходимо учесть эту особенность отображения.

На странице сервиса комментарии отключены. Если у кого-то есть вопросы или пожелания, прошу их озвучивать в комментариях к этому сообщению.

Firefox и включение/отключение javascript

Давным-давно в настройках Firefox была замечательная опция по глобальному включению или отключению Javascript, однако в 2013 году ее убрали. Но все же оставили лазейку в виде javascript.enabled = false в about:config, и некоторые плагины (jsOff, например) могли обратиться к этой опции и включать или выключать выполнение javascript в браузере в один клик мыши.

С выходом Firefox Quantum плагины уже не могут так просто залезать в настройки Firefox и менять их. В результате ни один их готовых плагинов не может отключить выполнение javascript должным образом. Проверить сей факт очень просто — установите какой-нибудь недоплагин ( Disable JavaScript, Toggle JS, или любой другой), создайте файл index.html с текстом <script>alert(“Hi!”);</script> и откройте его в браузере — javascript отработает в любом случае, как бы вы не меняли настройки этих плагинов.

Можно, конечно, каждый раз залезать в about:config и вручную менять опцию javascript.enabled при необходимости, но для этого надо совершать слишком много телодвижений. Мне было лень лазить в настройки постоянно, и в результате родились 2 скрипта, которые отключают или включают javascript глобавльно в браузере и перезапускают его:

$ cat json.sh 

#!/bin/sh
echo "user_pref(\"javascript.enabled\", true);" >/home/username/.mozilla/firefox/randomstring.default/user.js
/usr/bin/pkill firefox
/usr/bin/nohup /usr/bin/firefox >/dev/null 2>/dev/null &
sleep 10
/bin/rm /home/username/.mozilla/firefox/randomstring.default/user.js

$ cat jsoff.sh 

#!/bin/sh
echo "user_pref(\"javascript.enabled\", false);" >/home/username/.mozilla/firefox/randomstring.default/user.js
/usr/bin/pkill firefox
/usr/bin/nohup /usr/bin/firefox >/dev/null 2>/dev/null &

Вот теперь Firefox работает так, как мне надо.

Восстановление случайно удаленного файла в ext4

Смеркалось. Кодил я что-то, и случайно грохнул файл, над которым работал целый день. Насмерть грохнул, мимо корзины. Решил попробовать восстановление файла, и вот что из этого получилось.

Нашел шикарнейшую утилиту для восстановления файлов — extundelete версии 0.2.4. Скачал исходники, собрал и попробовал восстановить результат работы за весь день. Надо сказать, что у меня система установлена на разделе /dev/sda1 (смонтирована в корень), а домашние директории пользователей находятся на /dev/sda4 и монтируются в /home.

Порядок восстановления файла такой:

# umount /dev/sda4

# /ramdisk/extundelete-0.2.4/src/extundelete --restore-file "usename/projects" -o /ramdisk /dev/sda4

В выводе было видно, что в usename/projects есть удаленные файлы. Inode = 3670592 . Теперь файл можно восстановить:

# /ramdisk/extundelete-0.2.4/src/extundelete --inode 3670592 --restore-file=usename/projects/myproject/mymodule.pl /dev/sda4

Successfully restored file  usename/projects/myproject/mymodule.pl

Файл оказался сохранен в /ramdisk/RECOVERED_FILES/username/projects/myproject/mymodule.pl Осталось только смонтировать /home и перекинуть файл обратно.

Про странные вещи в мире программирования.

Пока сам с таким не столкнешься, глазам своим не поверишь. Такой баг сразу и не найдешь.

Многие базы данных корректно работают с датами. Если взять дату — 31.12.2017, и отнять от нее один месяц, то должна получиться дата — 30.11.2017:

db=# select '2017-12-31'::timestamp - interval '1 month' new_date;
      new_date       
---------------------
 2017-11-30 00:00:00
(1 строка)
MariaDB [(none)]> select '2017-12-31' - interval 1 month new_date;
+------------+
| new_date   |
+------------+
| 2017-11-30 |
+------------+
1 row in set (0.00 sec)

Но php почему-то считает иначе:

$dt = date_create("2017-12-31");
$dt->modify("-1 month");
echo $dt->format('Y-m-d')."\n";

2017-12-01

Интересно то, что разработчики php не считают такое поведение багом, а особенностью реализации алгоритма работы с датами.

Синхронизация времени на разных серверах

Самый правильный способ синхронизации часов на серверах — это использовать какой-нибудь общий тайм сервер, и синхронизироваться с ним с помощью ntpd или ntpdate. Однако иногда возникают ситуации, когда таймсервер в локальной сети не настроен или недоступен, а выход во внешнюю сеть закрыт.

Первый вариант решения проблемы — использование какого-нибудь локального HTTP-сервера в качестве тайм-сервера. На все http-запросы сервер должен отвечать, и в заголовке ответа будет присутствовать параметр Date, то есть примерно так:

telnet 10.11.12.105 80
Trying 127.0.0.1...
Connected to 10.11.12.105.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.0 200 OK
Date: Mon, 14 Sep 2017 19:43:59 GMT
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Length: 1496
….

Само тело ответа нас не интересует, нам достаточно знать время. Его можно распарсить и при наличии рутовых прав можно установить локально часы в полученное значение времени. Команда выглядит так:

root# date -s "$(curl -sD - 10.11.12.105 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,"GMT", $4 }' | sed 's/,//')"

Второй вариант — можно считать время одного из серверов эталонным, и запуская скрипты по расписанию на нем, корректировать время на остальных серверах при помощи входа по ssh и удаленного выполнения команд. Примерно так:

ssh root@10.11.12.102 date --utc $(date --utc "+%m%d%H%M%Y.%S")

Тут разница по времени будет чуть больше, поскольку авторизация по ключам RSA занимает чуть больше времени, чем получение ответа от веб сервера без авторизации. Способ тоже рабочий.

Network Manager, wvdial и T-Mobile

Давненько я ничего не писал. Сейчас я в отпуске, в солчнечной Черногории. И интернет у меня мобильный, от местного оператора T-mobile. Обычно я использую для выхода в интернет свой телефон с местной симкой в качестве модема, и звонилку wvdial со следующими настройками:

# cat /etc/wvdial.conf
[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,”IP”,”tmcg-wnw”
Modem = /dev/ttyACM0
Phone = *99#
Idle Seconds = 30000
Modem Type = USB Modem
Stupid Mode = 1
Compuserve = 0
Baud = 460800
Auto DNS = on
New PPPD = Yes
Dial Command = ATDT
Ask Password = 0
ISDN = 0
Password = 38167
Username = 38167

Это отлично работает, если сеть управляется через Wicked в OpenSuSe Leap 42.1. Но если сеть управляется через Network Manager, то при использовании звонилки настройки DNS сетью не подхватываются. Однако, в Network Manager предусмотрена возможность подключения к сети через модем, только стандартные настройки для оператора T-Mobile в Черногории не подходят. Для этого оператора указана точка доступа для тарифных планов Postpaid, требующих заключение договора с оператором. Для Prepaid необходимо поменять настройки точки доступа с tmcg-data на tmcg-wnw:

Настройки T-Mobile

Про формат дампов mysql

Смеркалось. Прилетела задача, залить в mysql таблицу, в которой есть несколько миллиардов записей. Консольная утилита отказывалась ее заливать, с очень непонятным сообщением об ошибке:

mysql -u root -p -D dbname <dump.sql
ERROR 2006 (HY000) at line 2024: MySQL server has gone away

Выяснилось, что за количество вносимых записей за один оператор отвечает параметр настройки max_allowed_packet, и его значение рекомендуется увеличить. Однако, выставить его в число, превышающее 4194304, не получается; и 4 млн записей за раз оказалось недостаточно для загрузки в базу такого дампа.

Выход был найден, пришлось дамп снять со следующими параметрами:

mysqldump -u root -p --opt --skip-extended-insert --skip-quick  dbname tablename >dump.sql

Дамп очень сильно разросся, зато теперь он имел отдельный insert на каждую строчку таблицы. Загружался он очень долго, но все-таки загрузился.