Skip to main content

Evgeny Kuznetsov

The year of table-top Linux in Palermo

The year of table-top Linux in Palermo

Not sure about the year of desktop Linux, though.

Evgeny Kuznetsov

O'zbekiston

2 min read

Если соберётесь в Узбекистан, стоит иметь в виду несколько вещей.

Берите с собой Visa или наличные доллары. Про существование евро здесь в целом знают, но больше теоретически. MasterCard обслуживает единственный банк во всей стране, и банкомат вы будете искать очень долго.

Не меняйте на местную валюту (и не снимайте в банкомате) больше денег, чем реально планируете потратить. Обменять местные деньги обратно на сколько-нибудь конвертируемую валюту — целая история, и сделать её успешной у нас, например, так и не вышло.

Плов надо есть около полудня, а то и раньше. К часу-двум дня в популярных местах (там, где плов вкусный, и его едят местные) плов уже кончается.

На внутренних авиарейсах нельзя возить зажигалки — вообще никакие. Вообще, досмотр при посадке на общественный транспорт дальнего следования (что наземный, что воздушный) очень дотошный и не всегда логичный в смысле запрета отдельных предметов. Аэропорт имени Бен-Гуриона отдыхает…

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

Ну и главное: почитайте заранее хоть что-нибудь (чем больше — тем лучше) по истории Средней Азии, причём не только древней. Знание основных исторических вех поможет понять, почему надо пробовать кухню разных регионов, почему не надо искать в Ташкенте исторические здания, а в Самарканде — дух древнего города, и вообще поможет осознанно смотреть вокруг.

внутри мавзолея Тимура (Тамерлана)

А вообще — поезжайте обязательно, особенно если не бывали в тех краях. Там удивительно доброжелательные и приветливые люди, там исключительно вкусно и обильно кормят, там завораживающе красиво непривычной западно-российскому взгляду красотой. Оно того стоит.

Evgeny Kuznetsov

Google Library API — отличная штука! (Нет.)

2 min read

Чем дальше в лес, тем злее дятлы…

Мало того, что Google Library API не желает отдавать файлы с фотографиями в исходном виде (о чём я уже писал); там вообще весь API работает, как Ктулху на душу положит, в зависимости от фазы Луны, положения планет и настроения Дискордии.

Вот, например mediaItems.list — в документации всё чётко, просто и понятно: вкидываем token страницы и желаемый размер, получаем список с описаниями объектов; если объектов больше, чем наш желаемый размер страницы, получаем ещё token для следующей страницы. Нормально? Более чем!

Вот только в реальности при запросе с указанным размером страницы в 100 можно запросто получить ответ с тремя (!!!) объектами и token'ом следующей страницы. На которой будет 62 объекта. А на следующей — 15. Да, чаще будут страницы по сотне (если библиотека достаточно большая), но далеко не всегда. Бывают страницы вообще без объектов, в смысле в JSON вообще не будет поля "mediaItems"

Но это-то ладно, на то и программист, чтобы предусмотреть и обработать любой мусор на входе. Но некоторые объекты вообще не попадают в выдачу… Ну, то есть в документации написано, что в выдаче будут все объекты, кроме тех, что в архиве или в корзине. Вот есть в веб-интерфейсе Google Фото фотография, не в архиве, не в корзине — а в выдаче её нет. Вообще нет как объекта. И ошибок нет. Ну, потому что нефиг, не нужна тебе через API эта фотография.

Шоб у вас в Google такая система доступа в туалеты для сотрудников была, какой вы API состряпали!

визуализация работоспособности Google Library APIPhoto by Alistair MacRobert on Unsplash

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

Ух как хорошо сказано!

Либерализм это учение о мифических разумных существах, которые имеют свободу и собственность и желают это сохранить.

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

Поэтому модель человека во всех учениях от Гоббса до Мизеса представляет собой идеализованное представление о себе, любимом. Каковой, уже собственно потому что является книжником-философом, представляет собой исчезающе редкую аномалию, и в экономической деятельности человечества почти не участвует. 

И даже этот образец в теории используется с большими искажениями, вызванными самомнением автора.

Собственно все дальнейшие построения на этом фундаменте имеют примерно такую же ценность, как термодинамика, основанная на понятии флогистона. (да, простенькую паровую машину рассчитать можно).

Link

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

Вот как должна выглядеть клавиатура!

Вот как должна выглядеть клавиатура!

Наконец-то я увидел это вживую. Хочу!

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.