Читать в телеге. Когда-то там были посты не только от меня.
Статистика меток тикетов GitHub
Вернулся недавно к своему пет-проекту по вычислению статистики времени принятия пулл-реквестов, который я сделал на Kotlin/JS пару лет назад. Добавил туда построение графа, где вершинами являются метки, а ребро говорит о том, что есть тикет, в котором есть обе метки.
К сожалению, взаимодействие с JS не стало лучше. Возможно частично из-за того, что рекомендуемый подход — использовать multiplatform. Планирую как-нибудь попробовать.
Из неприятного — в последней версии Kotlin сломали генерацию интерфейсов из типов .d.ts, потому что требуется npm install. Не стал разбираться детально с причинами, просто ругнулся из-за унылого решения и понизил версию платформы. Еще словил баг инкрементального компилятора, который вместо человеческой ошибки (я забыл передать требуемый аргумент) выдал мне хрень, но заводить баг посчитал излишним, т.к. скоро будет K2.
В основном делал кучу всякого рефакторинга, чтобы было получше. Опять поругался с библиотекой сериализации, с которой нужно много танцевать, если хочется иметь нормальный полиморфизм. Несколько раз возникала мысль, что когда пытаешься срезать углы, чтобы написать “быстрее”, это приводит к большим проблемам и трудозатратам, чем если писать сразу “правильно”, хоть это и утомительно. Возможно, опять перфекционизм заиграл в одном месте.
Немного интересного узнал с точки зрения фронта — как скопировать в буфер обмена, как сделать ссылку на скачивание файла “из памяти” и как сделать вкладки на CSS (которые не пригодились в итоге).
Думал еще сделать какую-нибудь визуализацию графа с автоматической укладкой, но всякие force-layout мне не понравились. На парочке интересующих меня репозиториев все выглядело просто как комок вершин без выраженной структуры. Попробовал force-graph (быстро, просто, негибко), d3 (быстро, очень гибко, хрен настроишь) и vivagraph (вроде работает, но куча сломанных ссылок на доки напрягла). Cytoscape не стал пробовать, воспоминаний с работы было достаточно, чтобы сделать это неинтересным. В итоге решил сделать просто экспорт в .dot — если кто вдруг будет пользоваться (кек), сам разберется.
В целом как пет-проект мне эта фигня нравится. Делает что-то не совсем бесполезное, можно потрогать фронт, котлиновские корутины, GraphQL и всякую мелочевку попутно.
Вкладки на чистом CSS
Это оказалось достаточно интересной задачей, если знания о CSS близки к нулевым. С JS любой дурак может — шлепнул вызов на элемент, чтобы переключить видимость и/или подменить текст, вот и все. А вот с CSS надо немного поизвращаться (правда не так сильно, как для галереи), хотя решение получилось довольно короткое. Немного жаль, что код в итоге идет в помойку этот блог, потому что я передумал делать вкладки там, где изначально хотел.
Сломанные строки в Java
Оказывается, в java строки не потокобезопасны, и можно получить весьма прикольное поведение, используя “нормальный” код.
Операционная система на Rust
Не очень новый (2018), но занятный доклад про то, стоит ли писать ОС на Rust.
Начинается с вопроса, а что такое ОС? (“если бы мы знали что это такое, мы не знаем что это такое”). Потом приводится краткая, но весьма познавательная историческая справка про историю развития ОС, в частности Mutics и Unix.
Затем обсуждаются C, другие языки, операционные системы на них (например, ОС на java, sic!). В частности, почему какой-нибудь Go не предназначен для написания ОС (кроме “idiosyncrasies” еще мешает сборщик мусора). Ну и что C++ — хороший язык, но можно нинада.
Наконец, обсуждение переходит к Rust, его преимуществам и проблемам подхода “давайте все перепишем на Rust” в контексте ОС. Одна из основных проблем — памятью все-таки надо управлять и в Rust это тяжело сделать. Альтернатива — использовать гибридный подход: писать модули и системное ПО на Rust. В итоге в Linux так и сделали в конце прошлого года.
Иногда докладчик отвлекается ради баек. Например, рассказал историю, почему в C нет логического XOR: потому что для его вычисления нужны оба операнда и нельзя остановить вычисление условия раньше, как это можно сделать с логическим И или ИЛИ. Или про то, что замена AVL на B-дерево дает преимущество Rust против С, но просто так на C упорешься его писать.
Как запихнуть данные в Prometheus
Классический способ: приложение выставляет URL /metrics, prometheus забирает оттуда их в простом текстовом формате.
Однако не все сервисы — это HTTP-серверы, да и не все живут достаточно долго. Поэтому второй способ — сделать прокси, PushGateway. Приложение запихивает метрики в PushGateway, а он уже отдает классическим способом.
Но, увы, этот PushGateway надо разворачивать, и если Grafana облачная, то там его нет. Чтобы запихать метрики в ее Prometheus, необходимо зайти через Mimir — это распределенный Prometheus такой. И вот тут уже нельзя простой формат, а обязательно Protobuf, который использует устаревшие зависимости, да еще при этом завернутый в Snappy и с особым заголовком :harold:
Основы безопасности API
Очень вводный доклад про то, что надо хоть немного думать о безопасности API. В основном состоит из показательных примеров, как не надо делать, но ничего космического, топ-10 OWASP.
Некоторые интересные идеи:
- Делать все проверки не только на бэке (где они обязательны), но и на клиенте. Если какой-то запрос вызвал ошибку бэка, то это либо баг фронта, либо кто-то пытается ломать API.
- Явно помечать публичные API, чтобы не гадать ничего (“явное лучше неявного”).
- Вынести проверку авторизации в отдельный слой, чтобы не дублировать код и мониторить изменения политик.
В конце докладчик немного прошелся по токенам (упомянув убогость JWT) и гейтвеи.
Веселые правила паролей
Если вы думаете, что на сайте %X% дурацкие правила паролей, то эта игра для вас.
Очень классно, что задания довольно разнообразны и заставят хоть немного подумать. Я сдался на 35 уровне. Самым напряжным заданием, наверно, было совмещение 24-го правила с 9-м и 18-м. И немного жаль, что поле ввода пароля не закрыто звездочками и не требует повторного ввода, так было бы еще веселее:)
У автора есть и другие игры/интерактивы, например, про проблему вагонетки.
ChatGPT не смог сгенерить нормальный пост
В продолжение попыток использовать AI. Я попросил написать пост для канала, описал формат и дал теги.
ChatGPT сгенерировал воду про метрики разработки. Попросил писать более емко и более технично — получил еще воды про git, а потом воды про AI vs Deep Learning. Попросил написать разницу между связностью и зацеплением — опять вода. 3 раза просил короче, в итоге все равно чушь.
Попросил рассказать про какую-нибудь интересную консольную команду Linux. Опять вода про find, dd, lsof (“Просто запустите ‘lsof’ в терминале и впечатлитесь информацией, которую она раскроет о системе.”). Но последний пост был хотя бы нормальной длины (после 7 просьб! И это я еще явно в первом сообщении указал, что это микроблог). Попросил в таком же объеме рассказать про другую команду. Получил опять воду про rename, но это хотя бы можно было читать. Бот предлагал chattr и mtr, но текст мне не нравился.
- Ладно, с командами что-то не клеится, давай на другую тему что-нибудь
- %Вода про МКС%.
- Это не соответствует тематике моего микроблога. И укладывайся в 50 слов, пожалуйста
- %Печать на 3D-принтере органов человека%
Попросил подвести итоги нашего разговора, чтобы получить текст выше, и акцентировать внимание на моих реакциях. Лучшая попытка:
В нашем разговоре вы просили меня создать посты для вашего микроблога. В первом задании вы предоставили список тегов и попросили написать пост. Я предложил вам пост о разнице между связностью и зацеплением, но он оказался слишком длинным для ваших требований. Затем вы попросили сократить его до 100 слов, и я представил более краткую версию. Однако, вы просили еще более краткий пост в 50 слов, и я предложил новую тему про команды Linux. В дальнейшем вы запросили более интересную и редкую команду, а также пост не длиннее 50 слов. Я предложил команду ‘rename’, но она оказалась известной вам и не подходила. В следующем задании вы просили описать интересную и редкую команду, но не более чем в 50 слов. Я предложил команду ‘mtr’, но она также не соответствовала вашим ожиданиям. В конечном итоге, вы просили подвести краткие итоги нашего разговора, описав ваши предпочтения и ошибки, которые я допустил. Вы также просили более подробное описание нашего разговора, где я предлагал варианты и вы оценивали их соответствие вашим требованиям.
Поражаюсь терпению студентов, которые с помощь этой хрени дипломы сдают:)
Карта GitHub
Карта репозиториев GitHub с ручным ChatGPT разделением на “страны” типа Big Datia или Vuestan. Процесс создания тоже довольно занятный.
Не всё то disruptive technology, что AI
Так получилось, что на прошлой неделе удалось попробовать несколько инструментов на базе AI.
- Вежливое письмо. Был кризис социальной энергии, попросил ChatGPT написать вежливое письмо главному HR. Хотелось, чтобы оно звучало не как “слыш, мне надо это”, а как вежливая просьба, письменный этикет же, все-такое, best regards. Первые 2 результата были очень многословными, и я не смог нормально подобрать промпт так, чтобы письмо мне самому нравилось. В итоге забил и написал сам.
- Для тупой шутейки захотелось изменить фото человека, чтобы он был похож на Волдеморта. Попробовал топ-2 сервиса из выдачи гугла. Результаты получились так себе: похоже на Носферату, но оригинальные черты лица были потеряны, да и нос был совсем не тот, хотя я явно его указал в промпте. Фон нейронки совсем отказали генерировать. Справедливости ради, попробовал древние инструменты морфинга, в одном из коробки шел Волдеморт, в другом размечал все точки лица вручную (sic!), но получилась тоже фигня. В итоге забил.
- Хотел улучшить разрешение фотки, чтобы было прям HD. В одной онлайн-шляпе получилось 1-в-1 как делает любой графический редактор (т.е. никакого улучшения, хотя заявлен AI). В другой получилось тоже не очень, но хоть какой-то намек на улучшение был, в итоге взял его.
- Делал тупой мем, искал надпись diversity в радужном цвете, на стоках был либо поганый jpg, который было лень редактировать, либо то, что мне не подходило. Ладно, попробуем AI! Попробовал топ-5 инструментов из выдачи гугла. На один и тот же запрос они мне выдали абстрактную радужную хрень, очень diversity чернокожую женщину, просто радугу и, наконец, буквы “dLмersLТu” на радужном фоне одним цветом. Meh. В итоге воспользовался… WordArt, получилось еще более всрато.
- ChatPDF — сервис позволяет загрузить статью и задавать по ней вопросы с помощью ChatGPT, причем даже указывает параграфы, на основе которых ответ был сгенерирован. Sounds good, doesn’t work. Просил бота написать основные тезисы. Конечно, клево, что можно получить ответ даже в формате LaTeX, чтобы его сразу вкорячить в презентацию, но есть мааааленькая проблема: половина данных тезисов не соответствовала действительности, а параграфы-источники не содержали искомой информации. Попробовал на трех статьях, в итоге быстрее оказалось прочитать статьи самостоятельно, чем проверять ту фигню, что нагенерил бот.
- Нейромузыка от Яндекса. Тут скорее позитивные ощущения. “Бодрость” бодрит, “вдохновение” и “спокойствие” — сойдет для фона. Иногда генерируется что-то противное (увы, нет кнопки переключения, только обновление страницы помогает) и повторения бывают длинноваты, но если это фон для работы и не вслушиваться, то в целом норм.
В целом понятно, что очень много хайпа вокруг новых технологий и если разобраться (стать промпт-инженером, кек), то можно получить адекватные результаты. Интеллектуальная деятельность пока в безопасности, но страшно другое — бездумное использование результатов.