пятница, 14 февраля 2025 г.

монолит - SOA - MSA - микросервисы

Когда я слышу слова монолит и микросервисы, то я на самом деле воспринимаю эти слова так "в IT индустрию последнее время вливается слишком дохера денег, которые достаются ограниченному числу высококвалифицированных людей, любящих свою профессию и производящим качественные продукты. Мы решим все эти проблемы."


воскресенье, 24 декабря 2023 г.

Бизнес-идея. Как заработать миллиарды и зохватить мир

Мне кажется, я уже несколько раз начинал писать этот пост, и он каждый раз куда-то исчезает. Прямо таки  за миллиард лет до конца света.

Давным-давно, когда я был маленький, я думал, что всё зло капитализма средоточено в рекламе (и в микрософте ха-ха). Как так? А вот так - главная ценность капитализма в том, что люди голосуют звонкой чеканной монетой и конкурентное преимущество получают произвозводства с более выскоким качеством и меньшим уровнем издержек. Хочешь выжить, хочешь заработать, хочешь стать богатым - будь лучше, говорили они. Очевидный профит для потребителей - потребители полчуают лучший товар за меньшие деньги. Когда в эту идеальную схему вмешивается реклама, то вместо того, чтобы стать лучше, тебе надо сделать так, чтобы про тебя думали, что ты - лучше. То есть вместо того, чтобы вкладываться в качество и снижать издежки, тебе надо вкладываться в рекламу, и искать инвесторов. Очевидно, что профита простым потребителям тут не дождаться.

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

https://habr.com/ru/companies/ruvds/articles/578422/

Cама природа нерегулируемого капитализма:

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

- Ведёт к неизбежности перехода к посткапитализму — контролю общества над средствами производства через государство.


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

Идея очень проста. Как работает современный интернет. Есть производители и потребители интернет-контента. Писатели и читатели. Писатели пишут чтиво, а читатели его читают. Для того, чтобы читатели оплачивали услуги первых, а писатели имели средства к существованию и работали, существует реклама. Писатель делает так, что потребление его труда обязательно приводит к потреблению рекламы. Читатель видит рекламу, происходят сложные биохимические реакции организма и его синапсы посылают соответствующий сигнал в кончики пальцев, происходит переход, cpv/cpc, покупка, ввод кода из смс, оформление заказа, конверсия, и вот наш читатель становится счастливым обладателем более новенького айфона, а писатель с adme.ru, или дзен получает свою копеечку за бесонные ночи мук творчества. Все смеются, все довольны. Нравится ли это читателям? Судя по количеству установок adBlocker не очень нравится. Но adBlocker не очень нравится писателям, судя по количеству установок anti-adBlocker-ов. И вроде бы все друг друга любят, и даже готовы донатить и меценатить, но продолжают ставить adBlock, adBlock blocker, anti-adBlockBlocker. Замкнутый круг.

А что если. А что если из этого сложного круговорота денег убрать рекламу. И сделать финансовый круг короче. Читатели читают, и платят писателям за чтиво. Писатели получают деньги от читателей, и это вдохновляет их писать. Технически это может быть совсем не сложно. Например это могло быть очень похоже на RTB.

Читатель кидает 500 рублей в месяц на свой счёт и смело идёт на страничку с чтивом. Две системы начинают отслеживать потребление. Одна - система читателя, вторая - система писателя. Информацию о потреблении они сохраняют. Потом посылают друг другу посылку - ты начитал у меня на столько-то, я начитал у тебя на столько-то. Если всё сошлось - ура - вот тебе твоя копеечка, пеши исчо.

В принципе всё действительно похоже на RTB. Есть некий тариф - например за уникальное посещение страницы, за время потребления, за активность, проявленную на странице (scroll, click, select). Есть агрегаторы активности. Активность для читателя собирает плагин в браузере. Активность для писателя очевидно должен собирать js на сайте. Читатель может посмотреть на какие сайты он заходил, какую активность проявлял, сколько за это заплатил, чтобы убедиться, что его никто не обманул. То же самое делает писатель. Очевидно, что в реальной жизни не обойдётся без фрода, накруток и попыток обмануть систему - как в RTB. С точки зрения читателя на мой взгляд всё более-менее прозрачно - если хочешь халяву - ставь adBlock и надейся, что кто-то добавил твою рекламу в Ru AdList. Поэтому от читателей я не ожидаю подвоха. Писатели же должны модерироваться, быть проверенными и нести финансовую ответственность. В принципе и для тех, и для других должен существовать fall-back - возможность отступить и вернуться к старой доброй рекламе. 

Я слышал, что попытки создания такой системы были. И провалились, очевидно из-за того, что создатели системы решили перетянуть одеялко. Несите нам свои денежки, мы всё разрулим. Так работать не будет. Очевидно, что система должна быть построена на открытых стандартах. Во первых все протоколы обмена данными должны быть открытыми. Во-вторых все участники должны быть взаивозаменямыми, с прозрачной стоимостью их услуг. Я вижу таких участников процесса: агрегаторы активности (собирают информацию об активности, консолидируют по читателю, писателю). Финансовые агрегаторы - позволяют с одной стороны оплатить услуги, с другой получить заработанное. И самое сложное - разрешение конфликтов и определение границ стоимости и цен.

Ещё одним интересным моентом является вопрос ценообразования. Проще всего тут взять реальную информацию об активности читателей, доходах писателей, и исходя из этого вычислить стоимость посещения. Я предполагаю, что расход на посещение сайтов без рекламы должен быть сопоставимым с затратами на связь (мобильный телефон / интернет), но эту гипотезу надо проверить.

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


четверг, 28 сентября 2023 г.

Фейсбук Facebook

Пишу сюда потому как оттуда удалился из-за сильного накала страстей и бурления говн. Кмк умные алгоритмы специально подсовывают тебе 95% контента одного лагеря, чтобы сдвинуть твоё мышление и показать тебе - ты среди своих, нас много и всё такое. И 5% другого - чтоб накинуть говнеца на вентилятор и вызвать его бурление.


Все люди делятся на тех, кто ненавидит точку с запятой и других.


Последнее время появилась тенденция мерить языки по обьёму бойлерплэйт кода в hello world. Намекает. И это либо намекает, что сравнением языков занимаются люди, не продвигающиеся дальше hello world. Либо природы с курсов, которые в основном преподают hello world и просто желают экономить бумагу.


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


Как боролись за независимость Нельсон Маршалла и Махатма Ганди. О нет, не с оккупантами захватчиками, отнюдь. С собственным народом. Они убеждали собственный народ в том, что им нужна независимость.


воскресенье, 18 июня 2023 г.

Хабр 10 лет обратно

https://habr.com/ru/articles/174077/

Хабр в 2013. Статья. Написал драйвер для андроид, загрузил и запустил его на телефоне, написал приложуху, которая юзает этот драйвер

Комментарий

Я надеялся увидеть тут мануал по написанию драйверов, ибо мой планшет не видит мою UVC-камеру, не видит блютус-донгла, да и вообще ничего не видит кроме мышки. К примеру, драйвер своей камеры я правил, правда под linux, думал получу новые скиллы и смогу его портировать. А увидел компиляцию нескольких туториалов «как запустить компилятор и не описаться».

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

среда, 24 мая 2023 г.

Моё прощальное письмо

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

И вот я разочаровался. Tldr; думаю, что в эту контору надо нанять не хорошего программиста, а хорошего психолога.


Не думаю, что у меня есть шанс что-либо исправить. Всему виной - принцип Питера. В иерархической системе каждый индивидуум имеет тенденцию подняться до уровня своей некомпетентности. В госуслугах не принято брать людей со стороны - принято "растить" своих. В результате многие должности заняты поднявшимися до уровня свой некомпетентности людьми. Некомпетентными людьми, людьми не на своём месте. Я пытался, но ничего не смог сделать. В какой-то степени это напоминает Советский Союз. Там тоже людей с работы не выгоняли. Наверх людей двигали снизу. Продвижение считалось успехом и к нему все стремились. И... он развалился. Почему продвижение своих плохо? Ну просто потому что быть разработчиком и быть руководителем - это совершенно разные вещи для которых нужны совершенно разные качества. Следовательно хороший, успешный разработчик может вполне и не стать хорошим начальником, и наоборот - плохой разработчик может быть хорошим руководителем. Просто в жизни надо делать, что нравится, а не ползти наверх, и считать, что продвижение наверх есть успех к которому надо стремиться.

Лид

В первый день работы мой лид сделал мне некую "презентацию" проекта. Более ужасной, сумбурной и непонятной речи я в своей жизни никогда не слышал. Ладно думаю - человек был занят, немного подзабыл, что в пятницу выходит сотрудник, немного не подготовился. Завтра соберётся с силами и всё расскажет. Завтра не настало - завтра он был занят "фиксом мега важных багов". И послезавтра. И потом. И всегда. Налаживание процесса разработки, улучшение качества кода, документация, метрики, разработка нового функционала - не, не слышали такого, у нас же есть миллион "мега важных багов, которые мне скинул женя", которые надо было срочно пофиксить вчера - это моя обязанность, буду чинить по ночам, на выходных, с пролетарской ненавистью. Я пытался - я предлагал назначить дежурного на которого все будут скидывать все проблемы, который будет всё разбирать, проводить первичный анализ всех 3лп, срочные чинить, несрочные отдавать в спринт. Адская работа, но позволила бы разгрузить остальных членов команды и дать им работать в нормальном режиме. Позволила бы очень быстро влиться во все тонкости. Предлагал себя. Нет. Нам этого не надо. Мы не будем назначать одного дежурного. Мы будем накидываться на каждую проблему все вместе - всей командой. Мы не будем работать над тем, чтобы проблем стало меньше. Мы просто будем их чинить.

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

Замечание для себя на будущее - гнать ссаными тряпками безграмотных людей. Если человек не умеет грамотно писать на своём родном языке - хорошего от него не жди.

ЗЫ: этого лида убрали. Я ему сначала пытался намекать о том, что он делает не так и как надо. Потом говорил, потом ругался и уже планировал пойти на него жаловаться, но он сам ушёл.

Код

Посмотрел на код. Код, конечно, полное говно. Объектно-ориентированный подход, инкапсуляция, solid - нет, не слышали про такое. У нас есть сервисы и DTO. Какие-то хитрые правила, неочевидности, нетипизированные константы - одним словом мины в коде. Пока в метод не сходишь, ни за что не догадаешься что он делает. Асинхронно что-то обрабатывать - не, мы так не делаем, мы из лихих девяностых - мы всё в одном потоке. Вместо разделения по бизнес логике имеем невнятное разделение по назначению. Это примерно как если бы всех программистов в один отдел, а тестировщиков в другой. Связи ужасные. Начинаешь что-то тянуть и из него вываливается всё остальное. Тестировать невозможно. Существующие тесты даже не компилируются. Ладно думаю. Код, конечно, говно, но дело то хорошее. Сейчас напишем нормальные функциональные тесты. Это развяжет нам руки, даст возможность быстро релизы выводить. Порефакторим. Есть над чем работать - там вроде есть безлимитный гэпс, много нужной, хорошей работы. Сначала всей командой накинулись "нахер нам тесты". Ну вроде удалось убедить - типа это вообще требование сверху. Написал функциональные тесты, настроил cicd.... И всё. За пол года не появилось ни одного нормального функционального теста. Конечно, зачем нам тесты - мы же все фиксим баги, чиним 3лп. Что характерно - у меня есть стойкое подозрение, что никто не считает код гепса говённым. Ну да, есть ошибочки, но в общем - всё збс. То есть чтобы что-то сделать надо сначала научить людей нормально программировать, чтоб они прозрели, потом рассказать как надо, и только потом браться что-то переделывать.

Архитектор

Архитектор вечно занят разгребанием проблем, которые ему по дружбе скидывает женя. Ничего, что его месяцами ждёт команда из 4 человек. Женя - друг - ему нельзя отказать. Подождут. Из моего опыта архитектор в команде - это полная хрень. Например он рисует розовые облака. Ты начинаешь реализовывать и выясняется, что он что-то не дорисовал. Идёшь к нему, а ему твои земные стоны по барабану - он живёт в мире розовых пони. Обычно эти походы к архитектору заканчиваются тем, что тихо забывают о розовых облаках и делают как смогли, без похода к архитектору. Но у нас ещё проще. Один поход к архитектору занимает 4 месяца - да - именно столько времени нужно, чтоб он нашёл время в своём плотном графике и ответил на вопрос. Документации нет, архитектуры нет - за что этого человека называют архитектором?

Замечание для себя на будущее - никогда не работать в компаниях, где в команде есть архитектор.

CTO

Ну и вишенка на торте. Когда CTO 12-летней государственной компании после получения штрафа на 90 млн. приходит и начинает всех нагибать за метрики - это уже кранты. Мужчина, эти метрики должны были появиться 12 лет назад  - в момент, когда MVP получил гос финансирование и стал гос. проектом. Это ваша прямая обязанность - тесты, метрики, документация - обязанность CTO всё это иметь, всё это проверять, всего этого добиться. Сразу. Да, можно налажать с технологиями - нанять неправильных людей в RnD, они могут предложить что-то с чем все намучаются и откажутся. В моём опыте были очень неочевидные моменты при выборе технологий - например в какой-то момент вся команда топила за mesos, потому что на тот момент он уже был, успешно использовался и у всех был опыт работы с ним. Через пару лет стало очевидно, что использовать mesos вместо k8s было бы ошибкой. Но есть какие-то базовые вещи - метрики, тесты, документирование, обеспечение надёжности и качества, стресс тесты. Просто человеку сложно выйти за свои маленькие рамочки - ты всю жизнь работал на одном месте, ничего не видел другого.

Команда

Я до этого 5 лет работал на удалёнке в компании, где офис находился не в россии. Но такой отчуждённости нигде не было. Видео никто не включает - я ни разу не видел людей с которыми работаю. Ни шутки ни от кого не услышишь. Поговорить, обсудить - не, это не у нас. Чё-то это даже для меня перебор. Обмен опытом, обсуждения какие-то - не, это не к нам.

Думаю проблема в пирамидной иерархии, тем, что люди считают, что чем выше они поднялись - тем лучше, тем, что понижение в пирамиде люди будут считать наказанием. Ну и в доброте - все вроде видят - человек не справляется, но дают ему ещё один шанс, помогают расти. Всё как описал Питер Лоуренс. Надо выходить за рамки пирамидки-компании, надо делать это постоянно. В японии например тоже человек женится на компании. Но в процессе работы его, независимо от его показателей и видимой "успешности" ротируют по разным местам - смотрят, как он будет себя проявлять в разных ситуациях. Там, сям - в продажниках, в поддержке, в разработке, в управлении. Спрашивают его - что ему больше нравится. Что, на мой взгляд, могло бы помочь. Нужна более жёсткая ротация - как внешняя, так и внутренняя. Надо стараться набирать лучших из лучших людей со стороны. Надо перемещать людей из одних  команд в другие, чтоб они несли свой опыт или набирались его. Но это уже совсем не моя зона ответственности.

Замечание для себя на будущее - никогда не работать в компаниях, где на собеседование приходит более двух человек, они не включают камеру и не задают ни одного технического вопроса.

Команда 2

Как я уже упомянал, у нас есть большие проблемы с т.н. soft skills. Изначально я выделял коммуникацию. Но было несколько звоночков, которые навели на некоторые размышления. Например в однолассниках ещё во время найма мне сообщили "мы не делаем херни. Да, мы специально набираем ответственных людей и ждём от них самостоятельности. Тебе могут дать задачу сделать херню. Твоя задача понять, что это - херня, донести до нужных людей мысль, что это - херня и не делать её, а сделать нормально." А тут меня начали терзать сомнения. А у нас вообще люди понимают, что мы делаем, зачем, почему и как мы должны это делать. Поэтому я задал вопрос на ретро "кто-нибудь понимает вообще, какие у нас есть цели, как у команды. Не те говно-показатели, которые нам на квартальном планировании спустили, а некий вектор, которые не должен меняться от квартала к кварталу." Молчание было мне ответом. Я, в принципе, понимаю ребят из QA (нет, но в некотором приближении) - они думают, ну а чё мы - мы берём задачи из пула в порядке приоритета и тестируем их - вот и вся наша работа. Я, в принципе, понимаю РП - станартный эффективный менеджмент. Вот есть ресурс, вот есть задача. Надо выполнить задачу ресурсом за ресурс "время". Но devs... . Конечно возможно у меня профессиональная деформация - я почти всё время работал в иностранных компаниях и один раз во флюродросной нашей. Ну иностранцы - они помешаны на целях, на планах, вектор развития, вот это всё. Там постоянно этим накачивают, хочешь - не хочешь какое-нибудь понимание целей команды появится. В одноклассничках тоже с флюродросом было всё в порядке. Ну собственно это следствие медийности компании. Но никто ничего не смог сказать. Ну то ечть это что получается - люди ходят на работу, чтобы работать свою работу и получать за это свою зарплату плюс премии. Хорошо. Но тогда почему никто не подыщет себе более высокооплачиваемую работу. Вроде после ковида почти везде удалёнка - устраивайся хоть в московскую контору, хоть в новосибирскую. И почемку я не должен перейти в другую компанию, где мне придложат на 30% больше. Я чтож, один такой Иванушка - дурачёк, который работает потому что ему нравится идея госуслуг и нравится делать жизнь простых людей удобнее. В принципе это объясняет почему у нас метрик нет, а разбор 3лп мы начинаем с jfr.

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

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

Резюме

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

2. Организация работы. Есть воспитатель Лёша, который делает анализ, тех проектирование, декомпозицию. В общем 90% работы делает Лёша. Все остальные опускаются до уровня кодировщиков. А за оставшимися 10% опять приходят к Лёше, когда в процессе кодирования что-то не срастается и Лёша вытирает всем сопельки. Детский сад. Несколько раз говорил, что такой подход - херня.

3. БГ. Ну БГ был коммуникационным кошмаром с самого начала. С тем подходом, который придумал Лёша и одобрил Женя всё затянется ещё сильнее. Нам дали 2 месяца, они уже прошли, а мы ещё даже ничего не начинали. РТЛабс, конечно, от этого не развалится, рано или поздно все переедут на кассандру - через годик что-то сделают, через полтора запустят, года через два окончательно переедут. Несколько раз говорил - это херня.

4. Подход к разработке - Женя даёт задачи, иногда важные и полезные и хочет абсолютно невозможного - чтобы их допинали до продакшена за два дня. В результате выходит полное говно. Вредное, неработающее говно. Так было с open tracing, так было с PMD, так было с epgu-kafka-spring-boot-starter. То же самое будет с тестами - напишут очередное бесполезное говно. Покроют одно говно другим на 60%, чтоб получить премию. Жалкое зрелище, не хотелось бы на это смотреть. Тут даже сказать нечего и некому.

5. Ну как бы можно было работать. Делать то, что считаешь нужным с максимальной отдачей. Но как-то я слишком молод для всего этого. Вот лет через 10, когда мне стукнет 60 и когда я начну забывать в какой стороне находится тулает, то можно будет вернуться в госуслуги мирно доживать до пенсии и пытаться не растерять остатки мозга. Но думаю годика через два всё это станет не важным - появится какая-нибудь очередная LLM GPT-6, загрузим в неё наш код, она нам его исправит, напишет тесты. И будем ей писать ТЗ, а она нам будет писать всё остальное.


вторник, 16 мая 2023 г.

Неформатированный список материалов для Яндекс собеседования

Общее описание всех этапов

Более подробный Notion в Яндекс.Облако с этапами, примерами задач, материалами для подготовки


Про архитектурную секцию

Предстоит определить и сформулировать функциональные и технические требования, спроектировать высокоуровневую архитектуру, детально описать один из компонентов, оценить вычислительные ресурсы, необходимые для полномасштабного внедрения. Пример такой задачи: спроектировать сервис Яндекс.Такси. Как правило, задача формулируется в очень общих чертах, поэтому здесь важна активная коммуникация: задавайте уточняющие вопросы, выдвигайте обоснованные предположения и идеи, аргументируйте свою точку зрения. В процессе беседы вам может понадобиться описать потоки данных в системе, API, определить ключевые алгоритмы и структуры данных или описать структуру таблиц в СУБД, набросать черновик реализации одной из частей. Кроме проектирования ядра системы, важно определить ее структуру и топологию в целом: балансировку нагрузки, сценарии отказов и соответствующих защитных механизмов, нюансы эксплуатации, способы и методы контроля штатного функционирования системы.

Для подготовки к архитектуре:

Тут написано в общих чертах, что будет на секции (смотри пункт 3)

Как проходят архитектурные секции (habr)

Опыт разработчиков (habr)

Гайд про архитектуру - System Design Primer (полезные шаблоны, много полезной информации, обзорно)

Числа, которые точно нужно знать

Видео с полезной информацией про архитектурную секцию


На секции не обязательны инструменты для рисования, но если вам понадобятся, то вот примеры

Доска (Майкрософт)

Miro

Web whiteboard (powered by miro)


Какие материалы можно использовать для подготовки (ссылки невозбранно вырезаны из статьи с хабра):

Книги

— Эндрю Таненбаум — Распределенные системы. Принципы и парадигмы

— Брендан Бёрнс — Распределенные системы. Паттерны проектирования

— Martin Kleppmann — Designing Data-Intensive Applications

— Бетси Бейер, Крис Джоунс, Дженнифер Петофф, Нейл Ричард Мёрфи — Site Reliability Engineering. Надежность и безотказность как в Google

— Computer Architecture, Fifth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design) by: John L. Hennessy, David A. Patterson Amazon

— Designing Data Intensive Applications

— Databases by Korth

— Clean Architecture

— DDD (красная, зелёная, синяя - Эрик Эванс Domain Driven Design)

— Cracking Code Interview (там есть глава про System Design)

Доклады

Видео с докладами с любых конференций по высоконагруженным системам, например HighLoad++.


Некоторые команды

Yandex Platform Engineering

Audit Services в Yandex.Cloud

Identity & Access Management в Yandex.Cloud

Биллинг и Директория 360

Телемост

Диск

ML-сервисы Yandex Cloud

Managed Kubernetes в Yandex Cloud, notion


И ещё

Как получить офер в Яндекс за 1–2 дня

Яндекс диагностика


понедельник, 15 мая 2023 г.

Обо мне

Чем могу быть полезен

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


Личное

У меня есть три темы для разговора - смысл жизни, воспитание детей и на худой конец айтишечка (если не удалось найти общего по первым двум)
Раньше я занимался капоэйрой и танцами, но бросил. Планирую опять начать (уже три года как).
В детстве мечтал потолстеть, теперь мечтаю похудеть
Характер у меня не очень, но это не проблема - я считаю, что быть говном не зазорно, зазорно говном оставаться, к тому же я - жадный шопоголик
Не люблю верить в "шанс" - мне больше нравится считать, что случится то, что должно случиться
Ценю необычность взглядов

Профессиональное

Не люблю spring и микросервисы. Spring за то, что уменьшает объём boilerplate code, но повышает порог вхождения. Микросервисы не люблю не по их вине - в основном за то, что народ пытается возвести их в ранг серебряной пули и пихает туда куда не надо, решая ими задачи, которые ими решать не надо. Но это пройдёт.
Люблю порядочек и контроль. Хлебом не корми - дай что-нибудь причесать и разобрать, чтоб было ровненько и аккуратненько.
Ценю умение идти в проблеме до конца
Не люблю делать одно и то же несколько раз (детей двое)
Пытаюсь научиться в ML (примерно 8 лет, пока безуспешно, но я всё ещё надеюсь). Но уже не получится - есть ChatGPT, он уже научился в ML, теперь пора учиться в ChatGPT.
Считаю, что в команде полезен туповатый старичок, который будет постоянно говорить "А это непонятно, а давайте сделаем попроще". Ну вы понели
Почему-то меня привлекает всякая перепрошивка устройств и настройка сети типа iptables - может потому что мне это кажется очень сложным
Выбрал YPE потому что хочу как можно лучше познакомиться со всем Яндексом
Надеюсь, что окажусь Я-у полезным и надеюсь, что Я даст мне возможность сделать что-то полезное для людей
Перешёл на тёмную сторону

пятница, 28 октября 2022 г.

Обучение

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

пятница, 7 октября 2022 г.

Свой путь

Мне кажется у нас есть прям неплохой материал для для доклада на каком-нибудь хайлоаде
- наш путь в микросервисы - почему мы в разных сервисах используем одну базу
- наш путь в gitflow - как сломать себе шею во время комита
- наш путь в тестировании - как писать тесты для красоты
- наш путь в документации - документация - это я!
- наш путь в метрики - как собирать метрики через jfr


Потому что мы - русские. С нами бох. У нас свой путь - православие, самодержавие, народность.

---

"Мы были в аду и сейчас расскажем, как мы оттуда выбрались."

Отказались от спринга?

Дата доклада - "неизвестно"🤣


среда, 10 августа 2022 г.

Spring мазда

Сука блядский йобаный spring. Для его создателей в аду есть отдельный котел. А для мудацких любителей ссаного спринга есть другой котел. И этот блять котел с любителями, он сука внутри того котла, который с создателями. Но блять вылезая из внешнего котла ты сука попадаешь во внутренний. Гореть вам блять вечно в аду!



О качестве спринга можно судить по ... объёму созданной энтузиастами документации.

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

Но если вы открываете tutorial на тему какой-нибудь кафки или elasticsearch, вроде делаете его и ... ой, а как же подключиться к реальной кафке - вроде я всё сделал по бумажке, а почему коннекчусь до сих пор к тестконтейнеру на локалхосте? И "да не вопрос - вот же stack overflow, baeldung, миллионы примеров - ща всё будет". Но блин, такое впечатление, что спиздил с завода самолёт, собрал, получился пулемёт и теперь тебе надо "доработать изделие напильником". Спринг старые русские чтоле пишут, которые не могут забыть свои железные конструкторы номер 3 и номер 5?



Framework должен решать две проблемы - уменьшать порог входы и снижать объём boilerplate кода. Другими словами framework должен упрощать. Spring, а особенно spring boot, неплохо справляются с задачей снижения объёма кода. Но уменьшают ли они порог входа? Любую проблему в спринге можно решить одной строчкой кода. Чтобы найти эту строчку часто надо потратить целый день.


понедельник, 4 апреля 2022 г.

Я - прогромист

Получила фидбек от [RedLab], к сожалению не готовы сделать вам предложение. Вот краткое обоснование:

- по всем компонентам стэка очень слабый уровень

- Java - в основном старые версии (5,6,7)

- Spring - использовал только как контейнер, т.е. только базовые функции, без глубокого погружения

- SQL -откровенно слабо, не было серьезных задач, не работал с JPA/Hibernates

- Cassandra- так же только элементарные запросы, без глубокого погружения

- Кафка - только запись в топики, без глубокого понимания возможностей системы

- Java Core - с теорией слабо, практика тоже 


четверг, 3 февраля 2022 г.

Как подружить марусю и home assistant

Как я уже говорил раньше, я считал рекламу главной проблемой капитализма и поэтому постоянно на нее покупаюсь. На самом деле оказалось, что проблема капитализма в стагнирующем рынке - пока рынок растет от капитализма есть польза, как только рынок перестает расти капитализм превращается в олигополию и от этого всем один только вред. Как бы то ни было в одной рекламно-но востной статье я увидел, что на али предлагают умную колонку Xiaomi Mi AI Speaker мощностью 12 Вт за 3 680 рублей с марусей от mail.ru внутри. Это дешевле, чем Яндекс станция мини. Посмотрел - вроде у маруси есть API, думаю надо брать - там разберемся.

Что умеет маруся как умная колонка - играет музыку с VK, управляет видео с Wink по подписке VK Combo за 169 руб./мес, есть поддержка некоторых умных домов. Поддерживает умный дом Xiaomi, но только в русском регионе - обычно для Xiaomi все выбирает регион китай потому что для китая число поддерживаемых устройств гораздо больше. Есть поддержка Yeelight, Roborock. Может позвонить на аккаунт VK или на другую марусю. Развлечения - типа новости, анекдоты, время, таймер, будильник, поиск. Позвонить с моего телефона не может, хотя колонка и может подключаться к телефону как bluetooth гарнитура. Ну в общем с самим телефоном особо не взаимодействует. DLNA нет. С календарем не взаимодействует, почту проверяет только в аккаунте mail.ru. Может вызвать такси с сервиса Ситимобил. Есть API для разработки скилов. Есть пуши для скилов, но если я понимаю все правильно, то колонку нельзя заставить что-то сказать "просто так" - например по событию от умного дома.

Но я то покупал колонку для того, чтобы не брать с полки телефон, когда надо выключить свет в спальне. Оказалось, что у маруси есть кастомная поддержка умного дома через Web Hooks (пункт DIY Hooks в списке умных домов маруси). Добавили ее в канун 2021 года. Поддерживает только включение-выключение. Этой фиче явно не уделяется много внимания - ждать чего-то нового не стоит - например в android приложении пункт DIY Hooks немного глючит. Есть возможность задать свои Http Headers (например для авторизации). Есть возможность передать json в теле запроса. Http запрос отправляется с внешнего адреса, поэтому для интеграции надо будет выставить web интерфейс home assistant в интернет. Не всегда обязательно иметь для этого белый IP - например, если у вас роутер ZyXel, то можно использовать их сервис KeenDNS.

Мой умный дом работает в основном под управлением HomeAssistant. И Mi Home немножко. HomeAssistant не создан для простых людей - чтобы им пользоваться нужны некоторые специальные навыки и знания. Поэтому и инструкции особо не нужны - народ догадливый - сам разберется. Но я все же оставлю это здесь, для тех, кто еще размышляет о покупке маруси или установке home assistant.

Для доступа к сервисам Home Assistant через web нам понадобится долгосрочный токен доступа. Идем в HomeAssistant - левая колонка навигации, самый низ, имя или иконка пользователя, жмем. В открывшейся странице "Профиль" пункт "Долгосрочные токены доступа" - генерируем и сохраняем.



Затем идем на сайт с описанием HomeAssistant web API и вясняем, что нам надо отправить POST запрос на URL `/api/services/<domain>/<service>`.

Чтобы понять какой сервис нам надо дернуть идем в HomeAssistant - Панель разработчика - Службы - ищем нужную службу и нужный объект (цель). Я выбрал сервис "Выключатель: Turn on (switch.turn_on)", цель - "пространство Bedroom". Можно протестировать сервис нажав "Вызвать службу" и убедиться, что он действительно делает то, что вы от него ожидаете. После этого жмем "Перейти в режим Yaml" и смотрим что там.



Получился вот такой YAML:


Исходя из этого нам надо сделать такой http запрос:

URL: https://<hass_addr>/api/services/switch/turn_on

Http Headers: 

  • Authorization: Bearer $LONG_LIVING_TOKEN
  • Content-Type: application/json, 

Body (payload): {"area_id": "bedroom"}

Можно попробовать выполнить этот запрос через curl и убедиться, что все работает.

```

LONG_LIVING_TOKEN='...'

HASS_ADDR='...'

curl -X POST -H "Authorization: Bearer $LONG_LIVING_TOKEN" \

  -H "Content-Type: application/json" \

  -d '{"area_id": "bedroom"}' \

  "https://${HASS_ADDR}/api/services/switch/turn_off"

```


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



Свой yaml файл для включения и выключения света в спальне я выложил на GitHub, без LongLivingToken и без адреса сервера - моя вера в людей не стопроцентна.

Вам надо создать свой yaml файл на основе примеров, вставить туда адрес своего доступного из интернета Home Assistant сервера и свой Long Living Token. Адреса типа 192.168.х.х или 10.х.х.х не подойдут! Затем этот файл надо как-то передать на телефон и в процессе настройки скопировать в буфер обмена. В android приложении есть кнопка загрузить файл, но она не работает.

Заходим в приложение маруся на смартфоне, настройки, выбираем "Умный дом", листаем список умных домов вниз, выбираем "DIY Hooks", жмем "Войти в VK", выбираем "Умный дом загрузка описания формата YAML или JSON" и вставляем наш YAML файл и жмем "Сохранить".


Далее следует шаманство. После сохранения описания оно появляется в списке, но его можно из списка удалить. Нам так не надо, нам надо выбрать. Чтобы кнопка действия с описанием стала "Выбрать" нужно подшаманить - я жал назад до выхода на экран со списком умных домов, опять выбирал "DIY Hooks", жал (или не жал) "Войти в VK" и видел список, в котором кнопка была "Выбрать". Возможно тут придется поэкспериментировать. Возможно это проблема Android, в iOS приложении все хорошо. Нажимаем кнопку "выбрать" на нашем созданном описании. И все, после этого можно пользоваться. Просто говорим "маруся включи свет в спальне".

Нормального обновления JSON описания устройств я не увидел. Чтобы обновить (например для добавления нового устройства) - я отключаю в марусе Умный дом DIY Hooks (маруся - настройки - "Умный дом" - "DIY Hooks" - кнопка "Отключить сервис"), потом заново его настраиваю. Но старые настройки не исчезают - можно откатиться к предыдущей работающей конфигурации.
Для настройки нескольких устройств надо просто все устройства добавить в список. Когда будете копипастить, не забудьте исправить id устройства.
Удачной автоматизации.
Стоит напомнить, что марусин Умный дом DIY Hooks позволяет включать и выключать устройства. Что-то более сложное, включающее обратное взаимодействие - например "маруся, скажи какая температура в спальне" он сделать не может. Для этого надо писать полноценный скилл. Но это уже совсем другая история.

пятница, 7 января 2022 г.

Настройка Wireguard VPN

Эта статья - продолжение `Настройка маршрутизации в сети с неподконтрольным роутером`. Итак имеем домашнюю локальную сеть, роутер от провайдера без возможности прошивки и настройки. Ставим в локальной сети сервер. Настраиваем на сервере Wireguard VPN и связываем две локальные сети. Другая локальная сеть - маршрутизатор Xiaomi Mi Router 3G с прошивкой Padavan и Entware. В принципе инструкций по настройке Wireguard - масса. Лично я долго не мог понять, да и сейчас не понимаю, зачем нужно каждому wg устройству назначать адрес из частного диапазона. Могу понять зачем это нужно для одного клиента - ему же нужен какой-то адрес. Но зачем это нужно если связывать две разных сети - непонятно. У специалистов настройка wireguard вообще не вызывает никаких проблем, но я не они. Кстати мне больше всего понравилась инструкция на сайте keenetic - по ней я все и делал.

Параметры

  • Локальная сеть - 192.168.2.0/24
  • Роутер - 192.168.2.1
  • Сервер - 192.168.2.4, ethernet интерфейс - enp1s0
  • Другая локальная сеть (за xiaomi mi router) - 192.168.3.0/24
  • wireguard device network (частный диапазон IP адресов из которого назначаются адреса wireguard интерфейсам) - 10.253.1.0/24
    • сервер wireguard address - 10.253.1.2
    • android клиент - 10.253.1.10
    • xiaomi mi router wireguard - 10.253.1.3

Dnsmasq

Чтобы все работало в локальной сети необходимо добавить два новых маршрута, которые мы анонсируем через DHCP, чтобы трафик в другую локальную сеть и wireguard device network шел через наш сервер:

Wireguard сервер

Ставим пакет wireguard.
Генерируем пару ключей (открытый + закрытый) для сервера:
```
cd /etc/wireguard
wg genkey > private-key
wg pubkey > public-key < private-key
```
Конфигурация /etc/wireguard/wg0.conf
Запускаем `systemctl start wg-quick@wg0.service`
Включаем автозапуск `systemctl enable wg-quick@wg0.service`
В ubuntu все работает - создается интерфейс wg0, создаются маршруты.
Проверить статус можно командой `wg showconf wg0`, `wg show`, маршруты командой `ip route`.
В настройках роутера пробрасываем wireguard порт до сервера.

Andoid client

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

Entware + Padavan

Файлы настроек:

Для работы Entware на прошивке Padavan нужна USB флешка. Как ставить entware написано в padavan wiki.
Ставим пакет wireguard-go: `opkg install wireguard-go`. Теоретически можно использовать утилиту `wg-quick` для настройки интерфейса и маршрутизатора, но у меня оно почему-то не заработало :(.
Итак настраиваем wireguard вручную как написано на официальном сайте. Создаем файл конфигурации /opt/etc/wireguard/wg0.conf и делаем

```
wireguard-go wg0
ip address add dev wg0 10.253.1.3/24
wg setconf wg0 /opt/etc/wireguard/wg0.conf
ip link set up dev wg0
ip route add 192.168.2.0/24 dev wg0 src 192.168.3.1
iptables -t filter -A INPUT -i wg0 -j ACCEPT
iptables -t filter -A FORWARD -i wg0 -j ACCEPT
```

По какой-то причине эту строчку конфигурации из секции [Interfaces] конфига `wg setconf` не принял, поэтому я ее закоментировал:
```
[Interfaces]
Address = 10.253.1.3/24
```

Примечание:
Маршрут `ip route add 10.253.1.0/24 dev wg0 src 10.253.1.3` добавился сам.
Переопределяем iptables policy по умолчанию для цепочек INPUT, FORWARD таблицы filter - у меня значения по-умолчанию были DROP, с ними маршрутизация из локальной сети 192.168.2.0/24 в 192.168.3.0/24 (в мою локальную сеть) не работала.

Настройка iptables

После некоторых обновлений конфигурации маршрутизатора (например обновление правил белых/черных списков по mac адресу - web интерфейс маршрутизатора -> Advanced settings -> Firewall -> MAC Filter) маршрутизатор с прошивкой padavan сбрасывает правила iptables. Чтобы все продолжало работать в прошивке есть файлик `/opt/etc/init.d/S10iptables` (softlinkg) -> `/opt/bin/update_iptables.sh`, который запускается после обновления конфигурации. В него заносим все правила iptables - у меня там правила для wireguard и правила, которые я настроил для прозрачного использования tor в локальной сети, который настроил по этой инструкции.

Доступ к роутеру из VPN

Поскольку на роутере таблицу маршрутизации мы настроить не можем, то не можем и получить к нему доступ из VPN напрямую. Чтобы получить web доступ к роутеру можно добавить nginx reverse proxy configuration. Например на порту 8081. Ссылку на файл колнфигурации надо добавить в директорию /etc/nginx/sites-enabled - `ln -s /etc/nginx/sites-available/local ./`.
Перезагружаем конфигурацию nginx: `systemctl reload nginx`.
Теперь роутер доступен по адресу `http://192.168.2.4:8081`.
 

Настройка маршрутизации в сети с неподконтрольным роутером

Я ненавижу рекламу, но постоянно на нее покупаюсь. Увидел в подъезде объявление МГТС - 500 мегабит за 500 рублей в месяц, настоящий IP, IPv6. Из минусов - всего лишь необходимость сверлить стену и вешать в квартире чужой роутер. Думаю надо брать - разберемся как-нибудь. (На самом деле нет, но об этом позже). Гигабитный роутер с WiFi 5G, без возможности модификации прошивки и установки софта (с вероятностью, но об этом еще позже). Задача - настроить VPN с другой сетью и прозрачное для клиентов использование ресурсов из луковой сети (The Onion Router aka TOR) с использованием своего сервера в локальной сети.

Думаю данная статья не потянет на полноценное руководство. Слишком разные возможности и потребности у людей - разное железо. Скорее некоторый указатель пути по которому можно пойти. Например для сервера можно использовать малину. Возможно даже с pi-hole. Я, например, поставил недорогой x86 сервер с распаянным на материнской плате процессором, поставил ubuntu и использую его в том числе как файловый, home assistant, веб и сервер приложений.

В общем я хотел, чтобы была возможность использовать WiFi интерфейс роутера, а также, чтобы клиенты локальной сети получили прозрачный доступ к некоторым внешним ресурсам без дополнительной настройки на стороне клиента. И не хотелось понапрасну пропускать весь трафик через сторонний сервер - хотелось, чтобы обычный интернет трафик шел напрямую на роутер, а специальный обрабатывался сервером. Решил, что отключу на маршрутизаторе DHCP и DNS server, поставлю DHCP на свой сервер, который будет анонсировать правильные маршруты по DHCP и на котором будет крутиться dns, vpn и tor daemon. С vpn все понятно - если другая локальная сеть имеет другие адреса, то достаточно просто настроить маршрутизацию. Для прозрачного доступа к ресурсам через луковый маршрутизатор решил использовать связку dnsmasq + tor.VirtualAddrNetwork + tor.DNS. Настраиваем dnsmasq для предопределенных доменов из списка, чтобы для их разрешения он использовал tor. После этого домены из луковой сети будут иметь специфичные адреса из специального выделенного диапазона частных адресов и можно использовать обычные правила маршрутизации для перенаправления этого трафика в tor.TransPort с использованием правил iptables. Для соединения локальных сетей по vpn использовал wireguard. В другой локалке стоит обычный роутер пока с прошивкой padavan + entware.

Итак ключевые параметры:

  • Локальная сеть - 192.168.2.0/24. У роутера локальной сети статический белый IP
  • Другая локальная сеть (доступ к которой получаем через vpn) - 192.168.3.0/24
  • Роутер - 192.168.2.1
  • Сервер - 192.168.2.4, имя ethernet интерфейс - enp1s0
  • tor
    • private network (VirtualAddrNetwork) - 10.254.0.0/16
    • dns server (DNSPort) - 127.0.0.1:9053
    • transparent proxy address (TransPort) - 0.0.0.0:9040
  • dnscrypt-proxy (DoH) address - 127.0.0.1:9153
  • wireguard device network (частный диапазон IP адресов из которого назначаются адреса wireguard интерфейсам) - 10.253.1.0/24
    • сервер wireguard address - 10.253.1.2
    • android клиент - 10.253.1.10
    • vpn сервер другой локалки - 10.253.1.3

Сервер

Как я уже говорил у меня сервер - обычный x86 с Ubuntu 20.04 LTS.

Установливаем пакеты (`apt install <packet>`):

  • iptables-persistent - сохранение и восстановление правил iptables
  • tor
  • dnsmasq - DNS + DHCP сервер
  • dnscrypt-proxy - DoH DNS клиент
  • systemd + netplan.io - были установлены по умолчанию и используются для настройки сети
  • wireguard - vpn
Настраиваем статический сетевой интерфейс - /etc/netplan/eth0-static.yaml и запускаем `netplan apply` для применения изменений.
Для включения маршрутизации установливаем параметры ядра:
```
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
```
и правим файл /etc/sysctl.conf для сохранения изменений после перезагрузки.

Настроиваем iptables - для таблицы filter установливаем default policy ACCEPT для цепочек INPUT и FORWARD - /etc/iptables/rules.v4. И перезагружаем правила `netfilter-persistent start` или `iptables-restore < /etc/iptables/rules.v4`.

Настройки dnsmasq

В /etc/default/dnsmasq добавляем опцию для игнорирования файлов с расширением *.i.
Локальные устройства прописываем в /etc/dnsmasq.d/src/lan_hosts.csv.i для задания фиксированных IP адресов.
Домены для доступа к которым будем использовать tor прописываем в /etc/dnsmasq.d/src/dns_tor_domains.txt.i
Для анонса маршрутов используется DHCP опция classless-static-route и microsoft-classless-static-route - 249 (на всякий случай). В принципе можно было бы попробовать и не отключать DHCP сервер на роутере, а просто анонсировать дополнительные маршруты. Проблема возникла на телефоне Android Xiaomi Mi 9T. Он не использовал маршруты с DHCP, использовал только один маршрут по умолчанию. Не уверен, что на всех андроидах есть такая проблема. Пришлось для андроидов сделать специальные настройки и перенаправлять весь трафик от андроид клиентов на сервер.
Специальные настройки для андроид - нет маршрутов, сервер используется в качестве маршрутизатора.
Для примения настроек запускаем `dnsmasq_reconfig.sh` - более подробно описано в разделе "Обновление конфигурации".

Настройки tor

Порт для socks5 proxy - SocksPort
Запрещаем выходные ноды в некоторых странах - ExcludeExitNodes
Порт для transparent proxy - TransPort
Порт DNS - DNSPort
Частный диапазон адресов из которых будут назначаться IP для серверов к которым мы будем ходить через tor - VirtualAddrNetwork
Список доменов которые мы будем резолвить через tor и которые будут иметь адреса из нашего частного диапазона (см. VirtualAddrNetwork) - AutomapHostsSuffixes - настраивается скриптом dnsmasq_reconfig.sh и сохраняется в файл /etc/tor/hosts_suffixes.cfg.

DoH

Конфигурация /etc/dnscrypt-proxy/dnscrypt-proxy.toml

Примечание: я немного изменил способ запуска dnscrypt-proxy потому что мне показалось, что он не работает. В настройках по умолчанию он запускается через systemd.socket - то есть порт слушает systemd и запускает dnscrypt-proxy когда нужно, а я его запускаю напрямую. Не думаю что это нужно. Для смены порта в конфигурации по умолчанию - когда dnscrypt активируется через systemd.socket надо выполнить `systemctl edit dnscrypt-proxy.socket` и установить
```
ListenStream=127.0.0.1:9153
ListenDatagram=127.0.0.1:9153
```
Должен появиться файл /etc/systemd/system/dnscrypt-proxy.socket.d/override.conf

Обновление конфигурации

Добавляем домен на который хотим ходить через tor в /etc/dnsmasq.d/src/dns_tor_domains.txt.i
Добавляем статический адрес устройства локальной сети в /etc/dnsmasq.d/src/lan_hosts.csv.i
Запускаем скрипт dnsmasq_reconfig.sh, который сгеренрирует файлы настройки для dnsmasq (/etc/dnsmasq.d/ lan_hosts.cfg.i, resolv.conf.i), tor (/etc/tor/hosts_suffixes.cfg) и все перезапустит для обновления конфигурации.
Для сброса DNS кэша:
На клиентском линуксе с systemd-resolve запускаем `sudo systemd-resolve --flush-caches`
На клиенте с windows запускаем `ipconfig /flushdns` в командной строке с правами администратора.
В google chrome открываем страничку `chrome://net-internals/#dns`, сбрасываем кэш браузера.

Плач Ярославны

Ну и напоследок напишу почему всё это оказалось ненужным
во-первых в какой-то момент МГТС отобрала настоящий IP и посадила всех за NAT. Почему-то в этот момент отвалился корпоративный VPN и в службе поддержки порекомендовали подключить выделенный IP
во-вторых после подключения выделенного IP перестал работать IPv6. Служба поддержки сообщила, что МГТС в принципе никогда и не поддерживала IPv6. Ну то есть он какбы работает, но его работу не гарантируют. На форумах есть объяснение на эту тему - типа выделяют статический IP, но IPv6 статический выделить не могут и чтобы  никого не смущать при подключении статического IP тупо обрубают v6.
в-третьих тех поддержка МГТС ужасна. Повысили тариф на 100 рубей. Сначала у меня был роутер sercomm rv6699 - вроде все более-менее работало. И это был не самый плохой вариант - там был доступ к iptables. Говорят его даже можно перепрошить. Был косяк - к внешнему IP адресу нельзя было достучаться из локальной сети по http и https - но это решалось удалениеми 2 правил iptables. Но потом я решил назначить фиксированный канал сети WiFi 5G. Канал не назначился - начал прыгать, я обратился в техподдержку и мне заменили роутер на ZTE ZXHN F680. И это оказалось полным концом. Он не пробрасывал DHCP пакеты из локальной сети в WiFi. Мою схему я использовать уже не мог. Техподдержкой был послан с заключением "в конфигурации по умолчанию странички грузятся, все остальное не наши проблемы". Думал может попробую использовать DNS от роутера, но там совсем шлак. Максимум можно настроить - 10 статических адресов в локальной сети. Статические и динамические адреса должны быть в одном диапазоне.
в-четрвертых у МГТС есть полный доступ к вашему роутеру. А иметь третье лицо, а вернее даже целую компанию в своей локальной сети - это как-то даже негигиенично. Ну то есть ты как бы перед ними голый. И они тебе такие - чувак - не смущайся, мы не смотрим.
Вывод - можно и МГТС, но отключать WiFi и переводить роутер в режим моста (не факт, что это можно сделать, не факт, что это не слетит после принудидтельного обновления, не факт, что это не запретят).
Говорят, что роутер Sercomm RV6699 v4 можно перепрошить. Хотел попробовать, но не могу - у меня этого роутера больше нет - мне его заменили на ZTE ZXHN F680.
Еще говорят, что можно купить коробочку мене чем за 1.5 тыс. рублей и она будет работать бриджом - думаю это хороший вариант.

суббота, 29 мая 2021 г.

TerraMaster F4-210 & Ubuntu

У меня дома опрометчиво появился новый зверек - TerraMaster F4-210, модель с 2Гб памяти за $260 на SoC Realtek1296 - arm64. И я решил его начать использовать. Использовать - это значит сделать цифровым сердцем дома - поставить dhcp/dns/tor, homeassistant, vpn и прочие радости NAS - transmission, dlna, aria2.

Но вот незадача - не получается. Там сейчас стоит OpenWrt 15.05 + кастомный linux kernel 4.4.18. Для использования моего zigbee stick cc2531 понадобился новый модуль ядра - cdc-acm. Для использования wireguard vpn нужен либо модуль ядра tun (если запускать wireguard в user space) либо собственный модуль wireguard. cdc-acm я с грехом пополам как-то собрал. Не совсем правильно - модуль грузится и отображается в lsmod со статусом  [permanent], что говорит о том, что у него не реализована функция выгрузки. tun грузиться и работать нормально не захотел. Я подозреваю, что проблема в неправильной конфигурации ядра при сборке модуля. Но правильной конфигурации у меня нет :(. Хотя исходники есть - на официальном сайте.

Все, что нашел по аппарату сложил сюда.

Сначала я попытался собрать инфу с рабочей платы:

Еще есть прошивка:
  • firmware, с помощью которого можно восстановить убитый NAS после неудачного обновления как написано на официальном форуме - через USB
  • php7-all.tar - архив PHP Web UI, идет на флешке, вставленной в USB 2.0 разъем платы.
  • Последняя прошивка - TOS_A1.0_Install_ARM4.2_4.2.12_2104281637_2104281658.ins - вся файловая система NAS


И в общем я решил попробовать накатить туда ubuntu или другой линукс.

Есть очень сильно похожая плата - Banana Pi BPI-W2 на таком же процессоре. Там есть описанная возможность установить разные линуксы, в том числе ubuntu и openWrt. На моей плате есть uart (такой же порт как в TV Box Zidoo-X9S - TX и RX можно подключить с разъема, а землю с любого места платы, поскольку uart разъем на плате - jst с шагом 2мм немного маловат для подключения трех стандартных монтажных проводов). С uart терминалом можно войти либо в SPI prompt (d/g/r> prompt, если зажать ctrl+q в uart терминале перед включением платы), либо в uboot (Realtek> prompt, если предварительно зажать Esc в uart терминале перед включением платы), либо в сам OpenWrt Linux, если ничего не нажимать.

Далее попробовал загрузить ядро. Поскольку scsi в данной сборке uboot судя по всему нет, то ядро грузил с USB поскольку перепрошивать eMMC не пока сыкотно. Ну, допустим, я знаю параметры загрузки текущего ядра OpenWrt: `rdinit=/sbin/init  mtdparts=RtkSFC:128k(factory),512k(uboot),320k(logo),1408k(afw),64k(dtb),7680k(kernel),5632k(initrd)  earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200 loglevel=7 U-boot=2015.07 (Nov 27 2019 - 14:31:13)`

device-tree есть с рабочей системы - см. mtd map, mtd dump выше. Больше всего на мой взгляд похож 'NVR_18/linux-4.4.18/arch/arm64/boot/dts/realtek/rtd-1296-saola-2GB-HDMI.dts' из исходников. С некоторыми изменениями - там разные bootargs, initrd-start, end, и другие параметры. Может они как-то динамически меняются во время сборки OpenWrt.

Сделал дампы uart:

  • plain1.cap.txt - простая загрузка
  • spi.cap.txt -  вход SPI prompt (если зажать ctrl+q в uart терминале перед включением платы)
  • ubuntu4.cap.txt - безуспешная попытка загрузки другого ядра (предварительно зажать Esc в uart терминале перед включением платы для входа в uboot console - Realtek>)
  • ubuntu2-bootm.cap.txt - безуспешная попытка загрузить ядро через комманду uboot `bootm`
Что можно делать в консоле SPI prompt непонятно. На сайте Banana Pi W2 в инструкции есть несколько команд, но мне не совсем понятно, что они делают. На форуме zidoo есть некоторое описание, но неполное.

На форуме Armbian нашел похожий тред по запуску Armbian на похожем железе, запустил примерно так:

`usb start && fatload usb 0:1 $kernel_loadaddr uimage && fatload usb 0:1 $fdt_loadaddr tm_f4-210.dtb && env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200 noinitrd root=/dev/sda2  rootfs=ext2 init=/bin/bash && bootr`
...
И загрузилось старое ядро - 4.4.18-g8bcbd8a-dirty :(

Попробовал загрузить ядро как написано тут - через комманду `bootm`. Получил вот такое сообщение:
Realtek> fatload usb 0:1 $kernel_loadaddr uimage
reading uimage
10630032 bytes read in 667 ms (15.2 MiB/s)
Realtek> fatload usb 0:1 $fdt_loadaddr tm_f4-221.dtb
reading tm_f4-221.dtb
65536 bytes read in 32 ms (2 MiB/s)
Realtek> env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200 noinitrd root=/dev/sda1 rootfs=vfat 
Realtek> bootm $kernel_loadaddr - $fdt_loadaddr
Wrong Image Format for do_booti command
ERROR: can't get kernel image!


Че делать дальше пока не знаю.



суббота, 13 февраля 2021 г.

Как я пытался начать в Raspberry Pi 4

Пишу прост чтоб не забыть. Если будет необходимость, то надеюсь хватит сил написать что-то в хабр.

Какие-то левые проблемы с Qt5, snap, wayland

Начал я ставить Raspberry Pi OS на Pi 4. И тут такое

# sudo snap install rpi-imager

# rpi-imager

This application failed to start because it could not find or load the Qt platform plugin "wayland-egl"

in "".

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.

Reinstalling the application may fix this problem.

Aborted (core dumped) 

Ну хуе-мое - вроде как ошибка связана с установленной wayland, qt5 и сборкой snap пакета - https://forum.snapcraft.io/t/problem-launching-qt-snaps-in-wayland/7055. Обычная в этих случаях установка пакетов не помогает - это же snap. Вроде патч простой - https://github.com/pbek/QOwnNotes/pull/1012/files. Ошибка кстати существовала https://github.com/popey/imager-snap/pull/14.

Скачал сорцы, запатчил, поставил snapcraft + multipass, запускаю

Тут кароч ошибка типа не могу найти файл и имя моего файла snapcraft.yaml. Поподробнее потом напишу - надо удалить собранный уже.

Порылся в логах, вижу странные сообщения в dmesg от apparmor

[23961.893990] audit: type=1400 audit(1613217487.081:653): apparmor="DENIED" operation="open" profile="snap.multipass.multipassd" name="/etc/ssh/ssh_config" pid=13393 comm="multipassd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0

Вроде профили защиты apparmor в ubuntu лежат в /etc/apparmor.d. Думаю поправлю. Но для снапов они лежат в /var/lib/snapd/apparmor/profiles. Поправил, вроде перезагрузил конфиги, ничего не меняется. Я начал смотреть snap.multipass.multipassd и сошелся пазл. Надо заметить, что проекты мои лежали раньше в /opt/projects. А профиль apparmor для snap.multipass.multipassd разрешал чтение только из home. Попробовал я, потыркался, плюнул и переместил директорию projects в свой home от греха подальше - не первый раз в конце то концов я на эти грабли с apparmor и /opt/projects наступаю. Такие дела.

Переместил. Заработало.

В общем перед добавлением статьи на хабр надо бы поподробнее разобраться с профилями apparmor, с профилями apparmor для snap и рассказать как собирать снапы локально например.


---

Пытаюсь в автомонтирование usb диска.

Почему-то в минимальной конфигурации raspberry Pi автомонтирование включено не было. Нашел usbmount, но он не работал. Начал разбираться. И тут понеслось. udev. udisks2. udevil. systemd.
В общем оно не работало потому что в репозитории лежит старая версия.
Дай думаю малой кровью поставлю udisks2 - чет не помогло. udevil, который вроде как lightweight replacement udisks почему-то потянул udisks2 и тоже автомонтирование не заработало. В итоге собрал последнюю версию usbmount из сорцов и добавил вот эту хрень (и еще добавил монтирование по UUID) чтоб можно было ссылаться на диск.
В общем в старой версии usbmount монтирование шло из скрипта напрямую, а это запрещено в новых версиях udev. Рецепт оттуда-же - использовать для монтирования сервис. Например вот так.
Еще есть совет https://holyhead.de/index.php?title=Raspberry_Pi#External_USB_drives - рекомендуют udevil и к нему самопально udev павило - например вот это. Но правило использовало сервис udevil, тот udevil, который был в комплекте с raspberri не имел сервиса. Скорее всего старая версия udevil.
Было бы неплохо разобраться как же все-таки работает и монтирует диски udisks2, и написать про это вот все, а заодно про udevadm.

Но нет худа без добра - тут https://holyhead.de/index.php?title=Raspberry_Pi написано как сделать hdd spin down, буду пробовать.

Ну вот, попробовал. Говорят для дисков, подключенных по usb не работает hdparam. Вроде как hd-idle умеет это делать. Надо запретить smart. И возможно дополнительно деактивировать собственное управление питанием диска через `hdparm -B255 </dev/XXX>` (A value of 255 will disable apm on the drive).

---

Обновление

Так блэд. Ставим ветку testing...

По какой то причине перестал ставиться RPi.GPIO. Помог совет https://forum.manjaro.org/t/pip-install-rpi-gpio-fail/25788/4:
CFLAGS="-fcommon" pip install rpi.gpio

.

 

среда, 31 мая 2017 г.

Мой Ноутбук и Линукс

Так получилось, что у меня по весне случается кризис. Несильный, но случается. Творческий кризис - работать не хочется совсем, руки опускаются. Даже если знаешь что надо делать, все равно работа стоит. В качестве спасения я иногда менял по весне работу. Но однажды придумал ставить себе линукс. Ну и вот с тех пор как бы повелось и теперь у меня почти всегда почти везде линукс стоит.
Недавно купил себе ноутбук для работы. Чтоб ездить с ним и чтоб можно было на кухне на диване в очередной раз развалиться во время работы. Давно хотел 17 дюймовый 4К ноут взять, а тут у ASUS появились не такие дорогие, вот и взял. ASUS VivoBook Pro N752VX, который с 4К дисплеем. Вот официальный сайт. Доставил памяти до 32Гб и поставил SSD. У него оказалось есть внутри настоящий SSD на 128, на котором винда установлена, скорее всего с интерфейсом PCI-E, но я его не нашел (не сильно и хотелось) и трогать не стал. Так что я SATA HDD заменил на SATA HDD и начал ставить на него линукс. Xubuntu. Я ее везде ставлю - она мне больше импонирует своей минималистичностью.
Установка линукс на самое новое железо это не всегда приятное занятие. Ubuntu 14.04 LTS загрузилась с флешки, но без поддержки тачпада и с плохой графикой. Ubuntu 16.04 LTS с флешки как-то совсем не загрузилась и я решил попробовать самую последнюю версию, 17.04. Не LTS. 17.04 загрузилась. И поставилась. Но в процессе загрузки с установленной версии не грузилась.
Я добавил в grub параметры для загрузки nosplash, чтоб было видно в какой момент она падает. (Для добавление параметра надо в процессе загрузки выбрать нужную строчку, нажать e и вбить параметр). И вроде как каким-то мифическим способом выяснил, что падает она в процессе загрузки иксов. Погуглил, нашел предложенный на форумах параметр загрузки nouveau.modeset=0, включил его и система загрузилась. Что странно поскольку этот параметр отключает KMS - aka Kernel mode setting - переключение режимов дисплея не в user-space, а в kernel-space. Но якобы этот параметр должен быть выпилен начиная с 2010-01-10. Ну да и пес с ним. Загрузилось, пошли странные сообщения в консоли. (Что-то типа pcieport 0000:00:1c.5:    [ 0] Receiver Error). Погуглил, добавил параметр pci=nomsi. MSI, как я понял, это возможность устройствам использовать один номер запроса на прерывание (IRQ) и должно негативно сказываться на работе системы если устройств много и на все устройства IRQ не хватает.
После успешного начала работы со своим линуксом на своем ноутбуке я поставил проприетарные драйвера nvidia. Потом поставил более свежие драйвера nvidia из ppa. В настройках ubuntu (Дополнительные драйверы aka Additional Drivers) включил параметр для использования некоего микрокода интел - Using processor microcode firmware for Intel CPUs from intel-microcode (proprietary).
Потом заметил, что система малость сильно греется. Попытался поставить TLP – Linux Advanced Power Management. Не заметил изменений, снес, поставил laptop-mode-tools. После установки laptop-mode-tools система перестала грузиться. Снес.
Потом нашел, что в ноуте установлены две видеокарты - дискретная (медленная) intel и nvidia. И типа в винде или при работе проприетарного драйвера nvidia он автоматом переключается на использование карты intel. Переключился на видеокарту intel, комп завис и отказался загружаться. Я перепугался, похимичил. Но выяснил, что переключиться обратно можно используя команду sudo prime-select nvidia. Переключился, попробовал пару других версий драйверов nvidia, выяснил, что со всеми ими система виснет при попытке переключения графики на использование карты intel. Поставил последние интеловские драйвера для видео. Изменений не произошло.
В какой-то момент выяснилось, что система не грузится при выборе пункта "Ubuntu" в grub - просто черный экран. Грузится при выборе пункта "Загрузка ubunu с дополнительными параметрами" при выборе последнего или предпоследнего ядра. Так и не понял в чем соль - разницы вроде нет никакой.
В какой-то момент выяснилось виснет при закрытии иксов (во время shutdown, что само по себе неприятно, во время Ctrl+F1). Полечилось выключением в настройках ubuntu (Дополнительные драйверы aka Additional Drivers) параметра для использования микрокода интел - Using processor microcode firmware for Intel CPUs from intel-microcode (proprietary).
Ну и еще настроил в терминале xfce Ctrl+C / Ctrl+V вместо используемых по умолчанию Ctrl+Shift+C/Ctrl+Shift+V - редактированием файла ~/.config/xfce4/terminal/accels.scm. Почему то изначально пришлось еще дополнительно сменить Ctrl+C -> Ctrl+K (например) - stty intr ^K.
Почему-то не включался NumLock по умолчанию. Не стал морочиться с lightdm, просто прописал numlockx on в .xinitrc.
Смапил клавишу отключения тачпада (touchpad disable) на клавишу XF86TouchpadToggle -
#!/bin/bash
if synclient | grep --quiet 'TouchpadOff             = 0'; then
  synclient TouchpadOff=2
  notify-send Touchpad Disabled
else
  synclient TouchpadOff=0
  notify-send Touchpad Enabled
fi
TouchpadOff=2 - это когда работает перемещение мышки тачпадом, но не работает скроллинг и клик по тапу - тачпад не мешает, но в принципе его можно использовать.
Как ни странно все остальные клавиши уже работали - даже включение подсветки клавиатуры.

Ну и еще меня раздражало отсутствие клавиши End - Home есть, а End нет. Поэтому я смапил fn+Cursor Move, которые по умолчанию используются для управления медиаплеером. Есть засада - клавиши срабатывают не на нажатие, а на отжатие - немного раздражает - xmodmap ~/.Xmodmap в файле .xinitrc. И ~/.Xmodmap
keycode 171 = End
keycode 172 = Next
keycode 173 = Home
keycode 174 = Prior
Еще есть проблемы с просыпанием после перехода в спячку. Если шнур питания подключен, то комп просыпается. Если нет, то сбрасывается и начинает загружаться.
Со скроллингом традиционный в линуксе пиздец. В каждой программе он работает по-своему. В каждом направлении он работает по-своему. Единственное, что мне понравилось в маке - это направление скроллинга. То есть на мой тупорылый взгляд он там сделан логично - ты тащишь страницу, а не ползунок и страница "следует" за твоими пальцами. Окей. В среднем на линуксе если я делаю reverse mouse для тачпада, то вверх-вниз работает как надо, влево вправо наоборот. Если я не делаю reverse, но все работает наоборот. То есть похоже горизонтальный скроллинг всегда работает наоборот и не настраивается. В хроме все наоборот, ему насрать на системные настройки. У него влево-вправо работает как надо, а вверх-вниз наоборот. Хотя не уверен по поводу хрома и горизонтальной прокрутки - так с ходу не нашел сайтов без специальной поддержки, чтоб проверить.
Такие дела. Надеюсь, что в будущем появится нормальная поддержка всего без шаманских плясок с бубном. Хотя судя по мизерному числу пользователей линукса на десктопе нормальной поддержки не будет никогда.

пятница, 29 июля 2016 г.

Spring. Хоть и неплохой, но почему я его не люблю.

Не знаю, работали ли вы со спрингом, но я внесу свои 5 копеек на тему почему я его не люблю.
В нормальной спеке а ля J2EE есть чоткая граница между интерфейсами и реализацией. При этом несмотря на казенность языка J2EE спеки в принципе ее можно прочесть и обозреть. Спринг же это монстр с кишками наружу. Да еще и с отсутствием внятного иерархичного описания. То есть у него внутри кишки перемешаны - типа херачь не хочу. И снаружи доки переписаны - точки входа и построения нормального представления нет. Все нормальные спеки древовидные потому что если так, до даже если ты не знаешь куда тебе надо попасть ты всегда знаешь куда тебе идти. В плоской структуре чтобы понять куда тебе попасть тебе надо знать все про все. Это ахтунг.
Вот простой пример. Допустим я решил что хочу что-то сделать после инициализации бинов в контейнере. Казалось бы - иди в документацию, кури оглавние и там ищи что-то типа контэйнер state machine. Как бы не хуй. Иди в ClassPathXmlApplicationContext и кури конструктор. Иниибет. Ну это как бы норм для наколенной поделки, но тут как бэ версия 4.3.2. Не какая-то там альфа на хоум пейдже васи пупкина. Это проект, который дефакто используется в более чем половине всех джавских серверных (а может и клиентских) приложений. Который изначально создавался как легковесная замена JEE, а теперь собственно призван умирающего поциента собой заменить. И эти люди еще спрашивают меня паттерны и объясняют мне, что я плохой архитектор. А сами спринг юзают.
Появление спринга было бы невозможно 20 лет назад ввиду отсутствия интернета и поисковых машин. Типичный алгоритм решения проблемы сводится к "поищу как это сделали менее волосатые собратья в интернете, на крайняк посмотрю исходники". И это еще хорошо, что он неплохо написан, и неплохо документирован. Но господа смотреть исходники для того, чтобы попользовать самый популярный джавский фреймворк - не кажется ли вам это моветоном. Мне хватает простите "исследований" "труда" моих коллег. За глаза.
В общем печалька в том, что программист в наши дни превращается в сисадмина. Работа из разряда почитай документацию и сделай как написано. Найди. Повтори. Не то, чтобы это плохо - мамы всякие нужны. Но просто если бы лично мне нравилось сисадминить, то я бы пошел в сисадмины, а не программеры.

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

Такие дела.