Skip to main content

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.

Evgeny Kuznetsov

О целевом обучении

5 min read

Этот пост, как и все остальные в этом блоге, выражает моё личное мнение. Оно может отличаться от мнения Учёного совета и ректора университета, где я работаю (и университетов, где я не работаю), от мнения Минздрава и Правительства РФ, от мнения моих родителей, моей жены, её родителей, Президента России, Генсека ООН и любых других лиц и организаций.

На этой неделе на BusinessFM прошёл репортаж, вызвавший некоторый резонанс среди населения. Мысли, озвученные в этом репортаже, я от разных людей по долгу службы слышу регулярно, при этом создаётся впечатление, что с законодательством эти люди (как и автор репортажа) не знакомы, со здравым смыслом не дружат, а логики вовсе чураются.

Давайте разбираться.

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

Что такое целевое обучение и кто за что платит, написано в триста втором постановлении Правительства РФ: целевое обучение оплачивает федеральный бюджет. Не регион, не заказчик обучения (которым может быть любое юрлицо, включая ИП), а федеральный бюджет. То есть целевые места — это бюджетные места. Только с дополнительными ограничениями.

Взамен молодой специалист пять лет должен там отработать, невзирая ни на какие условия.

Собственно — да, должен отработать. Правда, если всё-таки прочесть постановление №302, окажется, что есть условия и для приостановки, и для расторжения этого самого договора. И не пять лет, а столько, сколько написано в договоре. Но «не менее трёх».

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

Ну, платные-то места будут. А так — да, есть специальности, проучиться на которые за счёт федерального бюджета можно только при условии заключения договора о целевом обучении.

Моя будущая специальность, там 90% мест по всей стране отдаются на целевые. Как бы я ни старался, что бы я ни делал, мне нужно готовить приличную сумму денег для того, чтобы завершить свое образование.

А постараться поступить на остальные 10% мест? Тем более, если весь из себя краснодипломник и молодец, и тестирование в рамках аккредитации наверняка на 100 баллов написал…

Все это стало явным спустя шесть лет от начала этого образования.

У нас вообще законодательство о медицинском образовании меняется быстро и драматически. За шесть лет и в самом деле утекло много воды. Эти риски стоило учесть в начале пути, как, собственно, риски изменения законодательства в любой области вообще (в России ведь живём). Ну или, как вариант, влиять на власти, чтобы изменения в законодательстве были последовательными, логичными и предсказуемыми. Кто там у нас источник власти-то в Российской Федерации? Где-то я читал, что народ…

Зато на платное обучение берут всех желающих — никаких ограничений.

Ограничений полно, и по количеству мест, и по баллам, полученным при тестировании. Хотя, конечно, за свои деньги попасть на обучение проще, чем за деньги федерального бюджета. Что в этом плохого-то?

Есть, конечно, сомнения, что после таких вложений он пойдет в районную поликлинику на 30 тысяч в месяц.

А этот молодец-краснодипломник, значит, пойдёт?

Открою вам маленький секрет: человек будет работать за копейки только в трёх случаях. Либо он очень идейный (таких, понятно, единицы), либо нормальных денег ему никто платить не готов (то есть специалист он так себе), либо его заставили. В двух последних случаях работать он будет, как правило, посредственно. Собственно, именно это мы в районных поликлиниках сплошь и рядом наблюдаем.

Целевой договор — это как раз про «заставили». Отработать столько-то лет на таких-то условиях в таком-то учреждении, причём условия оговорены заранее, при заключении договора, не нравится — не заключай, свободный человек в свободной стране.

На самом деле, система простая: есть обучение за деньги и есть обучение за счёт федерального бюджета. За счёт федерального бюджета — это за деньги налогоплательщиков. За наши деньги. Это мы с вами спонсируем человеку обучение и, кстати, ничего не требуем от него взамен. Видимо, потому, что у нас, где-то я читал, социальное государство. Благотворительность как она есть. За счёт налогоплательщиков. За мой, в частности.

А поскольку счёт этот не безразмерный, хочется всё-таки чего-то взамен. Например, уверенности, что свежеобученный доктор не подастся в риелторы, за границу, или просто в столицу, а останется там, где докторов этой специальности не хватает. Хотя бы на три года. Пообеспечивает, так сказать, со своей стороны социальность нашего государства… Мне, налогоплательщику, кажется, что в этом есть что-то справедливое.

Хотя, конечно, ещё лучше бы было, если бы у районной поликлиники нашлись деньги на приличную зарплату и адекватные условия труда. Вот и эксперт согласен:

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

Ещё раз: «обычное бюджетное обучение» — это чистой воды благотворительность за мои деньги. Её год от года всё меньше — видать, деньги уходят на что-то другое. Крымский мост, вон, построили зато. Олимпиаду провели. Чемпионат мира по футболу, опять же. Надо думать, тот самый многонациональный источник власти считает, что это ему важнее…

доктора уходят

Photo by Luis Melendez on Unsplash

Evgeny Kuznetsov

Шокирующее открытие последней недели: существуют люди, которые подписываются на подкасты Outlook'ом.

Evgeny Kuznetsov

А можно как-то заставить браузер резолвить конкретный домен не по общесистемному DNS, а с отдельного nameserver'а? Ну, типа как host example.org ns1.customns.me, только в браузере?