Программист 80 уровня
27 subscribers
91 photos
4 videos
141 links
Жизнь, развитие и поделки в сфере IT. Заряжаю мотивацией и делюсь 10 летним опытом в сфере. Пишу на JS 💛 Осваиваю геймдизайн и геймдев.

Все мои ссылки ищи в закреплённом сообщении.

Мой личный тг @sushkakchayu

🔞
Download Telegram
Мне одному кажется, что это тот самый случай, когда всезнающий карьерный консультант наткнулся на таких же мошенников, как он сам, и негодует? 🤔 И ведь она даже не понимает всю комичность выставленной напоказ ситуации
В Nodejs внедряют автоматическое определение типа подключаемого модуля.

Сейчас, чтобы заинклудить модуль, нужно знать, какой он - если cjs, то использовать require(), если module, то import. При этом ещё модули можно реквайрить, если у них расширение .mjs. В общем, это давно уже головная боль, с тех пор, как Nodejs начали внедрять нативную поддержку модулей. И до сих пор этот костыль с расширениями является своего рода переходным моментом. В идеале добиться состояния, когда можно реквайрить/импортировать и модули, и cjs, не думая, о том, что внутри или какое у них расширение. И ребята уже близки к цели.

В release candidate спеке находится элегантное решение автоопределения типа файла на основании анализа его содержимого. Звучит громоздко в рантайме, но на деле это буквально:

try {
require('./common.js');
// если нет ошибки, то cjs
} catch (err) {
// если есть ошибка, то module
}

А результат такой проверки, я так полагаю, будет кешироваться.

Всё гениальное просто 😂

https://nodejs.org/api/packages.html#syntax-detection
Мне часто снятся сны. Сегодня проснулся после очередного, и меня посетила такая мысль:

Мы не помним сны, потому что этих событий никогда не происходило 😱

Я как-то уже писал про загадочность "есть", а тут уже наблюдается проявление "было", которое не привязано к пространству-времени, но имеет наблюдателя 🤔
Grok потерял мой диалог – дизлайк и отписка 👎

Переписывался с Grok в диалоге, который является частью проекта. Диалог доступен по прямой ссылке, я могу продолжать туда писать и получать ответы. У него даже выводится метка принадлежности к проекту.

Но его нет ни в проекте, ни в истории, и поиском никак не находится. В ответах от апи тоже отсутствует. В приложении на телефоне его тоже нет.

Не очень приятно так терять диалоги. Это ладно ещё я по 100 вкладок открытыми держу, и могу найти, что потерял, а тут он просто будто бы решил его забыть.

Похоже, что теперь альтернатив гемини не осталось. Жаль только, что там проектов нет.
Как устроена память ChatGPT

ChatGPT – это интерфейс (клиент + сервер) для общения с языковой моделью (ЯМ). При отправке сообщения в диалог, оно уходит на сервер, объединяется там с предыдущими репликами и направляется в виде контекста в ЯМ, которая генерирует ответ. Например:

💬 Вы: У меня есть красное платье, какую мне подобрать обувь?
Контекст для ЯМ: [У меня…] (использую …, но подразумеваются полные предложения)
🤖 ЯМ: Под красное платье подойдут белые кеды
💬 Вы: А какую сумочку?
Контекст: [У меня…, Под красное…, А какую…]
🤖 ЯМ: Кожаная серая будет отличным выбором!
💬 Вы (на следующий день): Спасибо за совет, друзья оценили!
Контекст: [У меня…, Под красное…, А какую…, Кожаная…, Спасибо…]
🤖 ЯМ: Рад, что красное платье произвело эффект! Если захотите подобрать другую сумочку, только попросите.

Точная "память" работает до тех пор, пока переписка "пролазит" в контекстное окно ЯМ, объём которого ограничен архитектурой модели и [возможной] реализацией сервера. Как только размер переписки превышает этот лимит, сервер сокращает, обобщает или даже исключает старые детали, чтобы сформировать релевантный запросу контекст для отправки в ЯМ.

Допустим, вы продолжили вести активный диалог, и решили вернуться к начальному обсуждению спустя неделю:

💬 Вы: Помнишь, мы обсуждали красное платье?
Контекст (уже обобщён): [Я посоветовал пользователю скомбинировать красное платье, белые кеды и кожаную серую сумочку: ему понравилось, Помнишь…]
🤖 ЯМ: Да, хочешь подберём другую сумочку под кеды?

Содержание старой переписки значительно сократилось сервером, чтобы уместить её в ограниченный контекст ЯМ, а "память" при этом воспроизвелась: кеды, платье, сумочка – всё на месте. В процессе переписки контекст может ужаться ещё сильнее до "Пользователь любит платья, кеды, кожаные сумки", а потом и вовсе потеряться, пока не станет снова релевантным.

Отсюда потеря информации в длинных диалогах – чем сильнее ужимается контекст, тем меньше остаётся исходной информации. Поэтому лучше вести короткие переписки, решая одну задачу. Если есть желание продолжить без потери качества, то попросите GPT прислать саммари по вашему обсуждению и перейдите с ним в новый диалог, таким образом перенеся "память".

ЯМ сама по себе stateless (не сохраняет данные между запросами), а "память" создаётся исключительно за счёт серверной логики, которая [хранит переписку и] решает проблему формирования релевантного (и даже искусственно увеличенного) контекста. Поэтому приложения, работающие с апи OpenAI, Gemini и пр., могут существенно отличаться качеством ответов на длинной дистанции.

🏁 GPT не имеет "памяти", а использует алгоритмы для формирования контекста, релевантного пользовательскому запросу. Он не обидится, если вы уйдёте в новый диалог или вообще – к другому. Пока у вас есть достаточно подробное саммари, сопровождающее запрос, можете смело экспериментировать с партнёрами.
👍1
Так так так, рассказывайте 😂
Если попросить Gemini CLI выполнить скрипт запуска дев сервера (или любого другого скрипта, который не возвращает код ответа), то консоль подвиснет в ожидании кода ответа. А если прервать гемини, то сервер всё равно останется запущенным и выключать его придётся только через висячие процессы 🤷‍♂️ Недоработочка.
Развеиваю миф о подобных колбэках в реакте.

В примере на скриншоте ре-рендер кнопки не произойдет ни в одном из затронутых случаев: ни реактом, ни даже браузером. Потому что button это не компонент, а нативный элемент.

Но что произойдёт на самом деле – реакт пересоздаст обработчик клика, то есть сделает removeEventListener, а затем addEventListener, что совсем не страшно, если кнопок не сильно много.

Но даже, если бы button был компонентом, т.е. Button, то место объявления обработчика никак не влияет на его перерисовку при рендере родителя. Лишь комбинация useCallback на обработчике и memo на самом компоненте Button могут препятствовать его ре-рендеру.

Эх, несмотря на это, у такого лида есть работа, а у меня – нет 😂
👍1
Хм. Я только что решил разобраться, и, кажется, у меня какой-то читерский или привилегированный гитхаб аккаунт.

Я давно обращал внимание, что гитхаб мне ежемесячно шлёт письма о том, что он обновил мою подписку Copilot Pro за 0$. И это правда: мне на самом деле доступны Pro функции, и с меня ничего не списывают (у меня и билинг-то не настроен).

Даже в настройках это выглядит странно: на одной странице написано, что у меня активирован Pro, а на другой – предлагают его купить.

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

Ну или это они просто так благодарят ранних тестеров. И вот вроде и спросить бы, не ошибка ли, а вроде и не сильно-то хочется… Буду надеяться, что не получу однажды инвойс на стопицот денег 😅

Может, кто-нибудь из вас с таким сталкивался?
Буллинг гемини, не покидая терминала: https://www.reddit.com/r/ChatGPTCoding/comments/1lm3fxq/gemini_cli_is_awesome_but_only_when_you_make/

Там в комментах объявился сотрудник гугла, и он одобряет такой подход. Л - лояльность 😂
ой 🤭
😁1
Сай-фай от Илона Маска 😂
Forwarded from Denis Sexy IT 🤖
Media is too big
VIEW IN TELEGRAM
В новом Grok приложении еще и вайфу добавили ☕️ в довесок к 18+ режиму
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Наткнулся на оооочень годный редактор кода с AI возможностями – Kiro.dev.

Это не просто очередной форк VS Code, а глоток свежего воздуха. Это как Arc, когда он только вышел. Авторы не просто напихали фич ради фич, а сделали это так, чтобы максимально раскрыть возможности LLM. И дизайн у него из коробки хоть нормальный.

Они предлагают 2 режима вайб кодинга:
1. Типичный вайб кодинг (но, кстати, я его не тестил, может, там тоже будут приятные инсайты :D)
2. Написание спеки!

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

1. requirements.md – высокоуровневное, но очень подробное описание фичи с ЮЗЕР СТОРЯМИ – то есть ожидаемое действие и его следствие (даже если речь про обычную функцию)
2. design.md – системный дизайн фичи: какие потребуются интерфейсы, сервисы, библиотеки, тесты, будущее расположение файлов, даже блок схемы рисует
3. tasks.md – разбивка спеки на конкретные мелкие задачи

Каждый этап можно редактировать вручную. Пока не скажешь, что готов – Kiro не перейдёт на следующий шаг. Таким образом на выходе есть 3 очень хорошо проработанных файла, которые подробным образом описывают задачу и её реализацию.

Далее, прямо в файле tasks.md можно запускать каждую таску, и даже ставить их в очередь. А какие-то таски можно и не выполнять, а вернуться к ним позже (например, создание тестов 🙈).

Самая большая прелесть, что при таком подходе код всегда сопровождается подробными спеками под каждую даже мелкую фичу. И если нужны доработки, то можно либо дорабатывать существующую спеку, либо на её основе создать новую. И Kiro видит все их сразу, тем самым имеет знание о проекте, будто он – продукт оунер.

Код генерит очень приятный. Пишет много тестов, не успокаивается, пока все не будут работать.

Единственный жирный минус: работает очень медленно. Полагаю из-за одной лишь доступной модели (пока) – Claude Sonnet 4. А она так-то платная. Но Kiro, пока находится в альфе, разрешает всем пользоваться ей бесплатно. И я думаю там просто уже все лимиты быстрых запросов потрачены, либо тротлинг намеренный стоит, чтобы не разорить их.

Я попробовал лайфхак: спеку генерю через Kiro, а задачи выполняю через Copilot с тем же Sonnet 🤭 Скорость в разы быстрее, код – плюс минус тот же. А всё потому, что генерится по очень качественным спекам. То есть он берёт на себя всю сложную работу по преобразованию пользовательской фантазии в понятное для LLM описание. Руками никогда в жизни не захочется это писать)

Там ещё есть всякие крутые возможности, которых нет в существующих IDE с Agentic mode, и пока всё это бесплатно – настоятельно рекомендую попробовать и поиграться на домашних проектах.
🔥1
Кэшики, такие кэшики
Разбор промптов, которые использует Kiro для генерации спек и выполнения кода.

https://ghuntley.com/amazon-kiro-source-code/

Там же можно найти ссылка на исходник редактора (не уверен, что он оригинальный).
Заглянул в документацию JS итераторов, и нашёл там новые полезные хелперы:
- map
- filter
- find
- reduce
- take
- drop

, которые теперь сполна реализуют флоу работы с итерируемыми объектами, как с массивами, давая возможность итерировать бесконечные массивы/потоки, и не выделяющие память под промежуточное хранение результатов. То есть, если запись вида:

arr.slice().map().filter()

создаёт аж три промежуточных массива, то:

arr.values().take().drop().map().filter()

не создаёт ни одного! :) результатом этой записи будет итератор, чьё значение можно прочитать последовательно: iterator.next() и for...of, либо преобразовать в массив, для получения всех результатов разом Array.from(iterator) – и это единственный "промежуточный" массив.
🔥2
В приложении ютуба на Андроиде сейчас есть довольно неприятный баг с тем, что скорость воспроизведения видео нельзя изменить :/ Ползунок есть, двигается, но его значение ни на что не влияет.

Лично я заметил уже пару дней назад, что ютуб что-то тестируют с контролами. Например, в Arc у меня тоже сломалась скорость, а именно – она каждый раз слетает на единицу после рекламы. А в какой-то момент я и вовсе поймал A/B тест, где контролы полностью поменяли свой вид, на, субъективно, очень неудобные.

Делаю ставку, что это был первый ролаут, реализованный целиком Gemini 😂
😁1