Skip to main content

Evgeny Kuznetsov

Go — очень клёвый и удобный язык, но иногда его молодость всё-таки даёт о себе знать… 33 строки конфига для Travis CI, из них 30 реально выстраданы… https://github.com/nekr0z/gphotosync/blob/master/.travis.yml

Evgeny Kuznetsov

gphotosync

1 min read

Сам себя не похвалишь — так и будешь ходить, как оплёванный…

Я всё-таки сделал то, о чём писал, причём и библиотеку форкнул, и приложение починил, доработал и выложил на GitHub. Вроде даже под OS X и Windows должно работать (хотя я не проверял).

Вот я молодец! (Произносится с интонацией Хлудова в исполнении Виктора Добронравова).

Evgeny Kuznetsov

Мишель Уэльбек: «Покорность»

2 min read

Французских авторов я читаю очень мало: всё-таки недолюбливаю переводную литературу, а языком этим не владею совсем. Тем больше впечатлений; «Soumission» («Покорность» в переводе Марии Зониной) Мишеля Уэльбека (Michel Houellebecq).

Скажу сразу: это несомненный шедевр. Очень круто, я давненько не читал ничего подобного. Нет, я не могу сказать, что мне прямо-таки всё понравилось: троллинга и эпатажа в этом романе сильно больше, чем лично мне по вкусу, но всё это, чёрт возьми, работает!

Я, пожалуй, этого автора ещё почитаю. Хорошие литераторы — вообще редкость, а уж среди фантастов… А уж среди авторов социальной фантастики ближнего прицела… А литератор он действительно прекрасный, настолько, что само фантдопущение отходит далеко на десятый план, и набрасывается на читателя уже после переворота последней страницы. Кстати, если у вас есть друг, который ценит литературу но не любит фантастики, а вы давно мечтали найти фантастическую книжку, которая ему понравится — так вот это именно она.

Настоятельно рекомендую!

Обложка книги

Мне немного неловко открыто признаваться, что я только что прочёл эту книгу: подарили мне её уже некоторое время тому назад, но книги на бумаге настолько неудобны, что добрался я до неё только вот. Но даже рискуя навлечь на себя праведный гнев и обиду дарителя, молчать не могу: отличная книга! 

Evgeny Kuznetsov

Google Фото: конец прекрасной эпохи

4 min read

В Google есть добрая традиция закрывать полезные сервисы или ломать удобные вещи; интернет-общественность давно ждёт, когда же они, наконец, объявят о закрытии Gmail… Но Gmail пока живёт, а вот Google Фото решили сломать.

Раньше ж как было у меня, например: все фото с телефона автомагически летят в Google Фото в исходном качестве, а старый ноутбук в шкафу, пафосно называемый «сервер», регулярно бэкапит весь Google Диск (в том числе папку с Google Фото), и добавляет всю эту радость в инкрементные бэкапы. Фото не теряются, всё зарезервировано, красота и благорастворение, я ради этого даже гуглу денег давал за дополнительное место. Теперь всё, кончилась простая жизнь.

GooglePhoto by Arthur Osipyan on Unsplash

Теперь Google Диск будет отдельно, а Google Фото — отдельно. И называется это «мы упростили синхронизацию». Новые фотографии в бэкап не попадут. Куда податься бедному крестьянину?

Во-первых, если уж что в Google попало, то это всегда можно из Google достать: да здравствует Takeout! Вот только Google страшно не любит, когда из него что-то достают, поэтому автоматизировать Takeout нельзя. А бэкап вручную — это всё равно, что без бэкапа вовсе. Поэтому думаем дальше…

Во-вторых, есть же Library API, через который можно тыкаться прямо в Google Фото. Начинаем тыкаться, видим грустную картину: файлы в исходном виде через API не получить, от картинки отрезается половина метаданных (например, информация о координатах места съёмки) и отдаётся отдельно в JSON.

Вывод: как посредник при бэкапах Google Фото теперь бесполезен. Ну что ж, горит дом — гори и баня! Раз такие дела, нет больше смысла платить гуглу за дополнительное место, можно грузить фотографии и видео в Google Фото со сжатием, всё равно бэкапить их теперь надо другим путём.

Кстати, а каким?

без бэкапа никудаPhoto by Markus Spiske on Unsplash

Отправная точка есть: тот самый бэкап директории Google Фото из Google Диска. Копируем в отдельную директорию (потому что из Диска это дело в перспективе надо удалять, чтобы место не занимало). Теперь надо сделать, чтобы туда же добавлялись новые фото, сделанные на телефон. Благо, есть Syncthing: настраиваем папку, куда камера телефона складывает фото и видео, на «только отправить», делимся ей с «сервером», на «сервере» ставим в режим «только получить», чтобы при удалении файлов из этой директории они на телефоне не удалялись. Не забываем, что Syncthing на Android любит электричество, поэтому пусть он работает только при зарядке телефона.

Теперь хорошо бы в cron поставить задачу перемещать из этой директории файлы в наш фото/видеоархив. Правда, в архиве они у нас рассортированы по директориям по годам и месяцам (это удобно, и так было в Google Диске), но это не проблема, мы ведь линуксоиды-туксоводы — бери bash и действуй! В телефоне (в отличие от Google Диска, кстати) mtime файла будет совпадать с временем создания, поэтому пишем несложный скрипт и сажаем его в cron. Одной проблемой меньше.

Правда, вторая проблема осталась: надо как-то забирать из Google Фото фотографии, накиданные родственниками и друзьями в общие альбомы. Вообще Google Фото стоит пользоваться хотя бы ради одного этого: поехали куда-то толпой, создали общий альбом, каждый туда забросил, что наснимал — времена «а кто снимал, когда на море ходили? Вася, не у тебя на фотике? когда скинешь?» прошли навсегда, и вспоминаются как страшный сон. Хорошо бы и это всё в бэкап, как было до гугловского «упрощения».

Пока, правда, новые фотографии в Диск ещё добавляются, так что пока — временно — можно поставить в cron что-то примерно такое:

50 23 * * * /bin/cp -pnr /mnt/ext/GoogleDrive/Google\ Фото/"$(/bin/date -d "week ago" +\%Y/\%m)" /mnt/ext/photo/"$(/bin/date -d "week ago" +\%Y/)"
55 23 * * * /bin/cp -pnr /mnt/ext/GoogleDrive/Google\ Фото/"$(/bin/date +\%Y/\%m)" /mnt/ext/photo/"$(/bin/date +\%Y/)"
10 22 * * 6 /bin/cp -pnr /mnt/ext/GoogleDrive/Google\ Фото/* /mnt/ext/photo/

(Фишка с "week ago" — это чтоб плавно проходить стыки месяцев и годов.)

А вот что делать, когда «упрощение» вступит в силу?..

Нет, понятно, что делать: писать софтину, которая будет по REST API забирать эти файлы из Google Фото напрямую. Для этого придётся, например, форкнуть Go-библиотеку, которую Google сначала выложил, а потом убрал, но Git всё помнит, поэтому по require google.golang.org/api v0.0.0-20181221000618-65a46cafb132 её можно подтянуть. Она неполноценная (например, она не поддерживает для mediaItem свойство filename, хотя для этого достаточно добавить ровно одну строчку), поэтому надо форкать (и потом, очевидно, поддерживать). Потом, имея эту библиотеку, можно слегка допилить обработку ошибок в явно заброшенном проекте, для чего его, очевидно, тоже придётся форкнуть. На всё это нужно время и вдохновение; одна надежда — что кто-то соберётся всё это сделать раньше, чем они будут у меня.

кодить может каждыйPhoto by Adi Goldstein on Unsplash

Надежда эта, правда, совсем призрачная.

Evgeny Kuznetsov

Got an email from @Fastmail regarding the issue (https://evgenykuznetsov.org/2019/felt-like-giving-fastmail-a-try-got) that didn't allow me to register. Well, not from them, actually, but from their automated system. It is awesome:
"Well, your message to support was not delivered to humans, because you first need to 'complete the support system' (wtf?), and to do that you need to log in, which you can't do because your registration wasn't completed, so basically screw you, you're not welcome in our 'customers first' universe!"
Well, I suppose it's a good thing my registration failed. Wouldn't want to trust this company with my email anyway...

Evgeny Kuznetsov

Felt like giving @Fastmail a try, got "internal error" trying to register. Now their server thinks my domain is already registered, so I can't give it a second try. Looks like they have enough customers without me. OK, any other hoster worth trying?

Evgeny Kuznetsov

Посмотрел, как Gmail выглядит через IMAP. Думаю: может, правда на Fastmail перейти?

Evgeny Kuznetsov

Обнаружил, что получение любого webmention'а к посту, где есть не-ASCII символы, ломает внутренний поиск по сайту: https://github.com/idno/known/issues/2490
Грызу локти: до чего же плохо не знать PHP!

Evgeny Kuznetsov

Scratch Your Own Itch

3 min read

Пожалуй, самое хреновое с точки зрения пользователя в Open Source вообще и Free Software в частности: никто никому ничего не должен. Нравится — бери, пользуйся на здоровье; не нравится — твоя проблема. Никто не подписывался воплощать твои «хотелки». Код — вот он, можешь внести исправления, чтобы всё работало так, как тебе надо, или найми кого-нибудь, пусть тебе сделают. Если получится хорошо и полезно, и ты решишь поделиться с нами результатом — скажем спасибо.

Бывает, конечно, что ты нашёл баг, который заденет разработчиков за живое, или придумал какую-то фишку, полезность которой сразу очевидна всем, и разработчику захотелось её прикрутить. Но в больших проектах такое — редкость: скорее всего, всё, что было реально нужно и интересно, уже придумали и реализовали. «Да, — скажут тебе, — это интересно, будет здорово, если этим кто-нибудь займётся. Pull requests are welcome».

Поначалу это всё здорово огорчает, и даже злит. Но в какой-то момент какая-то мелочь толкает тебя к пониманию: привлекать богов к обжиганию горшков совершенно необязательно. Исправить две опечатки в интерфейсе можно самому, надо только найти, в каком месте какого файла сохранена эта фраза. И потом ещё надо эти исправления заслать обратно, разработчикам. Ты долго ходишь вокруг да около, но в какой-то момент есть свободный вечер и соответствующее настроение, и ты осваиваешь Git и GitHub…

Всё, Рубикон позади. Самое забавное, что Git — полезнейший инструмент для любого, кто так или иначе работает с текстом, а уж если работа в команде… Да даже если не в команде: если у тебя есть любые текстовые документы, которые меняются со временем или проходят несколько итераций в процессе рождения финальной версии, после освоения Git ты будешь с ужасом вспоминать, как жил до этого. То есть изучить Git хотя бы в общих чертах (на самом деле — любую СКВ, просто Git самая популярная, потому что самая удобная) в любом случае стоит. И как только это сделано, вдруг оказывается, что у тебя есть способ взаимодействовать с разработчиками «на их языке».

Вот первые твои правки приняли в проект. Вот твои правки отклонили, сказали, что именно нужно сделать иначе, и после нескольких итераций всё-таки приняли. Вот ты делаешь первые шаги в программировании, исправляя (по нагугленному шаблону) одну строчку, которая «сломала» функциональность при переходе проекта на новую версию библиотеки. Вот уже склонированный тобой репозиторий заметно ушёл вперёд от заброшенного пару лет назад авторского, а вот ты создал простенький свой собственный репозиторий с программой на десяток строк, или даже просто с документацией. И вот уже тебе сообщают о багах и просят добавить функций… А ты полминуты обдумываешь поступившее сообщение и пишешь в ответ: «Ну да, было бы здорово, если бы кто-то этим занялся. Pull requests are welcome!»

Никто никому ничего не должен, каждый исправляет какую-то мелочь, которая мешает жить лично ему, и вместе мы шаг за шагом делаем вещи, которыми можно гордиться. И это, пожалуй, самое ценное и чудесное в Open Source вообще и Free Software в частности.

Evgeny Kuznetsov

Some things never change

1 min read

No sound after upgrade from Debian Stretch to Buster? See your soundcard in /proc/asound/cards and alsamixer, but not in KMix? You know what your problem is, don't you?

Yep.

pulseaudio logo

Good luck trying to debug the situation. Been there, hopeless. Just doesn't make sense. You need to either know the answer or have had been through enough pain with pulseaudio in the past to get that hunch.

Here's your one-line fix:

sudo apt remove timidity

I hate you, Lennart! I hate you.