Work & Beer Balance
1.53K subscribers
117 photos
5 videos
4 files
188 links
Авторский канал @Akiyamka
Поддержать автора можно здесь:
buymeacoffee.com/cherrytea
Download Telegram
Кто-то додумался хранить картинки в dns записях. И даже сделал весь необходимый тулинг.

Сохраню на случай если буду играть в Цикаду 3301 в 2029ом
(а я то думал после лефтпада npm на эти грабли не наступит)
😁11🤔1
В книге об армейских обычаях, "неуставных" правилах и традициях выпуска годов тае 60-х девятнадцатого века прочитал о поговорках, некоторые, а силу упортебимости и сейчас, запомнились.
Среди них была и поговорка "Так, сказал бедняк", произносимая старшим офицером, когда подразделение получало задание, не обеспеченное материальными ресурсами. Младшим офицерам традицией предписывалось хором отвечать начальству "и хером расколол полено", после чего начиналось обсуждение операции. В случае если старший командир в чине подполковника или выше, отвечать вслух категорически не следовало.

Возьмем на вооружение
😁10
Сегодня я узнал что .catch без колбэка - ничего не словит.
(ранее я всегда туда передавал колбэк, и не знал что будет если так не делать, из-за чего не сразу опознал в коде место ошибки);

На примерах:

Cледующий код все равно выбросит ошибку
const promise = new Promise((_, reject) => {
setTimeout(() => reject('Catch me if you can'))
})

promise.catch()

Поэтому чтобы заглушить ошибку нужно как минимум передать в catch колбэк
const promise = new Promise((_, reject) => {
setTimeout(() => reject('Catch me if you can'))
})

promise.catch(() => void 0)


Думаю это было сделано для того чтобы можно было делать условный catch
const promise = new Promise((_, reject) => {
setTimeout(() => reject('Catch me if you can'))
})

promise.catch(wantToCatch ? () => void 0 : void 0)


(если вы не знаете что такое`void 0` - это тоже самое что длинное undefined. В прод коде мне так "почему-то" не разрешают писать, так что отрываюсь на своих читателях : )
👍10
Поговорим о необычных девайсах, слышали про laptop dock?

Последнее время я очень пристально слежу за рынком Mini PC. (присматриваю себе домашний веб сервер для своих проектов)
И удивительное дело - в коробочки размером с роутер (а то и меньше) запихивают внушительные мощности,
Конкуренция бешеная, beelink, minisforum, gmktec предлагают на выбор варианты от $100 до $2000.
Па паре вариантов есть у Lenovo, Nvidia, Corsair

Ну вот например Ryzen R7 (4.7GHz) 24GB RAM, 500GB за $299. Ноутбук за 300$ - это будет какой-нибудь chromойбук с 8GB RAM, 64 GB SSD и телепающимся всем.

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

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

Конечно остается челедж как случайного размера коробочку, пусть и маленькую, к нему прицепить...
Кстати, в него можно было б подключить и мой смартфон, (который едва ли уступает типичному офисному ноуту).
А если у вас уже есть steam deck... на него же можно деалбут поставить!

Вообщем я пошел мучить интернет и внезапно (для меня) такой девайс есть
- nexdock-xl
- uperfect-x
- EVICIV
72👍1🔥1
Что не так с этим кодом?
const data = await (id ? getData(id) : {})


В парадигме JavaScript все хорошо, а вот для Typescript тут есть подляна - мы потеряли вывод возвращаемого типа из getData, отвалились подсказки, и хуже того дальше оно "растекается по коду" превращая все в тип `{}`с чем пересекается.

К сожалению typescript на такое не ругается, и найти это место бывает сложно, так что лучше иметь ввиду и фолбечиться на null или undefined.

Живой пример

#typescript
👍9
Я был уверен что это случится, но не думал что так скоро. Согласно утечкам AMD скоро презентует новый класс устройств - дискретный NPU. Ждём-с
🔥4👍2
США запретили в Китай продавать мощные железки, так что они начали делать свои.

Теперь у них даже своя китайская NVidia есть - называется Lisuan.

Запомните это название, они уже выпустили свой аналог RTX 4060, только с 24 GB DDR6 памяти. Цена пока не известна, но что то мне подсказывает, что с субсидиями государства она должна быть ощутимо дешевле конкурентов на внутреннем рынке
👍6
Прислали мне скидку на новую версию смартфона но просят его не покупать.

Как будто в альтернативную вселенную попал.

Вот что действительно возвращает веру в человечество, а не красивые иконки в приложениях
👍158😁3👎1
Дешборда антропика би лайк 🙈
Пока все встраивают AI в свои инструменты wallaby решил сделать новые инструменты чтобы было проще дебажить сгенерированный говнокод.

По ссылочке есть видео и больше информации
https://wallabyjs.com/blog/diagrams.html
👍8
Наконец-то в Linux появился реально классный графический редактор которого так не хватало!
Он только только вышел, а уже очень меня радует.

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

С горой документации, и видео туториалами.

и все это FOSS, , и судя по родмапу это они только начали.

(Заставка сделана в нем через минуту после установки)

https://pixieditor.net/download/
🔥8👍42
В Typescript что вышел пять дней назад (5.9) завезли фичу - разворачивающихся подсказок с типами
https://devblogs.microsoft.com/typescript/wp-content/uploads/sites/11/2025/06/expandable-quick-info-1.mp4

Что еще там:

- import defer - импорт модулей которые будут инициализированы лениво

- --module node20 - флаг с которым можно рекваерить (require) esm модули

- кэширование которое значительно улучило перф ts-a при работе с такими либами как как Zod и tRPC

- fileOrDirectoryExistsUsingSource - убирает лишние обертки над функциями из анализа улучшая время старта tsserver на 11%

Брейкинг Ченжи в lib.d.ts:

- ArrayBuffer это больше не супертип для всех TypedArray
Миграция выглядит вот так:

 let data = new Uint8Array([0, 1, 2, 3, 4]);
- someFunc(data)
+ someFunc(data.buffer)
👍91🔥1
Мне всегда было интересно а что там будет если превысить MAX_SAFE_INTEGER.
Понятно что ничего хорошего, но все же, что именно?

const x = Number.MAX_SAFE_INTEGER + 1;
const y = Number.MAX_SAFE_INTEGER + 2;
console.log(x === y); // true

// YES. BUT

const a = Number.MAX_SAFE_INTEGER + 111
const b = Number.MAX_SAFE_INTEGER + 112
console.log(a === b) // false

Произойдет "квантование", или по простому - снижение точности.

Сначала JS перестает "видеть" разницу между числами которая 2 и меньше. И чем дальше тем точность больше будет "загрубляться"

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

Немного душноты для тех кому интересна техническая часть
Это связано с тем, как IEEE 754 представляет числа. После MAX_SAFE_INTEGER шаг между представимыми числами становится 2, затем 4, затем 8 и т.д. +1 и +2 попадают в один "слот", а +111 и +112 — в разные.

Мантисса: 52 бита + 1 скрытый бит = 53 значащих бита, и при превышении 2^53 младший бит мантиссы представляет 2 единицы, не 1
🔥5👍2
Только что у узнал что у fedora есть atomic версия - это иммутабельная система где все графические приложения устанавливаются только через flatpack, а cli и либы через Toolbx/Distrobox

Почему это круто и почему я сейчас же это попробую:

Я часто что-то билжу у себя локально. Ну например - вчера я собирал демку для моего ESP32 устройства в новом для себя фреймворке Espressif IDF.
Для того чтобы она собралась надо поставить зависимости в систему. МНОГО зависимостей.
sudo dnf install flex bison gperf cmake ninja-build ccache libffi-devel openssl-devel dfu-util libusb1-devel

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

А на прошлой неделе я собирал кастом прошивку на мой принтер - и там была аналогичная ситуация.

В итоге:
🔻 Cистема обрастает хламом который нужен одному конкретному проекту
🔻 Вероятность словить конфликты зависимостей каждый раз возрастает
🔻 dnf обрастает кучей лишних репозиториев которые замедляют обновление.

Я думаю вы теперь понимаете почему что-то во мне каждый раз кричит о том что это все не правильно, и все равно что зависимости каждого js проекта ставить с флагом --global

Как я пытался это решать:

🔸Docker.
Для некоторых проектов я собирал докер образ внутрь которого создавалось окружение и происходил билд . В целом схема рабочая, но это потеря времени на написание докер файла. К тому же если билд таким образом получится сделать, то вот подебажить или поработать из иде внутри контейнера уже проблематично.

🔸 Dev Containers
В целом это тоже самое что первый пункт но без минуса - теперь можно работать внутри него.
Цена - нормально поддерживается только в vscode (в zed вроде тоже можно но я не осилил), и писать конфиг dev контейнера на практике оказалось ничуть не проще, а порой даже сложнее чем докер файл

🔸 Devbox
Решение на базе Nix. Иногда это работает, особенно в популярными экосистемами такими как у rust, go, js или python. Что-то более редкое, различные репы на C++ / C или Zig оказалось запускать в этом окружении
Во многом оно просто работает только в том случае, если до вас кто-то уже отстрадал и потом еще обновляет и поддерживает результат своих страданий.
Самому менеджить никс и создавать в нем пакеты оказалось в 10 раз сложнее чем дев контйенеры! К тому же изоляция не "настоящая" и ограниченна переменными окружения - C пакеты с makefile клали на них большой болт

🧩А вот что предлагает atomic.

🔹 GUI приложения → Flatpak
flatpak install org.mozilla.firefox
flatpak install com.visualstudio.code


🔹 CLI инструменты → Toolbx/Distrobox
# Создание изолированного контейнера
toolbox create my-container

# Работа внутри контейнера
toolbox enter my-container

# Внутри контейнера - обычная Fedora!
sudo dnf install nodejs python3-pip docker vim
pip install poetry
npm install -g typescript
code .

# Выходим из контейнера и удаляем когда не нужен вместе со всеми зависимостями
exit
toolbox rm my-container


🔹 Системные компоненты → rpm-ostree layering
# Только для критичных системных пакетов
rpm-ostree install zsh fish

# Требует перезагрузки!
systemctl reboot

rpm-ostree layering работает похоже на git - можно легко откатиться на любой состояние системы с снова вернуться к нему (полезно например для определения что вызвало баг)
Кроме того любой системный пакет можно восстановить на "родное состояние"
# Заменить системный пакет на другую версию
rpm-ostree override replace /path/to/custom-kernel.rpm

# Откатить замену
rpm-ostree override reset kernel
9👍2🔥2
Вообще я заметил что многие docker недооценивают. Обычно из перечисленных ниже трех сценариев использованию знают только об одном или двух:

🔹 Контейнеризация приложения.
Классический сценарий использования - Dockerfile описывает всё окружение и последовательность действий для запуска приложения, а снаружи "торчит" только порт который приложению позволено слушать.

Такой контейнер запускается и в норме работает до следующего деплоя изменений. Запускается обычно командой docker run

🔹 Build container
Это менее известный сценарий (хотя я его использую даже чаще) - Dockerfile описывает окружение необходимое для сборки приложения, собирает его, и на выход отдает некие артефакты.

Запускается командой docker build -o output/path. Dockerfile выглядит (упрощенно) так:
FROM whatewer AS build
# describe build env
# describe build steps

FROM scratch AS export
COPY --from=build /target/ ./

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

🔹 Песочница
Пожалуй самый редкий сценарий использования. Это dockerfile в котором главная роль принадлежит инструкции ENTRYPOINT и флаги :ro, --network=none.
Представим что мы хотим запустить какой curl bash, ну или даже подозрительный npm пакет у себя в системе, один из тех в которые любят встраивать бекдоры.
Оговорюсь что такие вещи бывает опасно запускать даже в одном контейнере с приложением, т.к. они могут, например, украсть ключи из переменных окружения.

Но довольно безопасно запускать их в песочнице, например htmlhint
 
FROM node:24-alpine3.21
RUN npm install -g htmlhint
ENTRYPOINT ["htmlhint"]

и потом запустить в полностью иммутабельном окружении и с запретом на доступ в сеть
docker run --rm --network=none -v ${PWD}:${PWD}:ro htmlhint ${PWD}

Впрочем для таких простых случаев можно и без Dockerfile (да, учтите что его надо будет разочек предсобрать командой docker build с разрешением доступа в сеть, ведь npx-у надо пакет откуда-то взять)
docker run --network=none -v ${PWD}:${PWD} --workdir=${PWD} node:24-alpine3.21 npx prettier --fix
👍141
Как дебажить LLM?

Сложно не замечать слона в комнате - текущие LLM выдают очень не стабильные результаты.

Жалобы на "вчера было хорошо а сегодня плохо" проходят постоянным фоном в каждом обсуждении LLM, дошло даже до небольшого скандала.

Люди гадают в чем дело (перегрузка серверов, не та модель, не та Иде, не те mcp, не тот план, не тот размер контекста, не та фаза луны и вовсе всемирный заговор).

По началу это воспринималось как - ну это же альфа. Ну бета. Ну счас просто повалили все и никто не был готов.

Я успокаивал себя тем что - ну и ладно, я же не вижу ассемблер который получается из моего кода.

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

Не может такого быть что в первый день релиза новой версии один и тот же JS код выполнялся верно, а на второй - перестал.

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

Сказал человек который 5 лет изучал психологию : ). Есть тут некоторые параллели, например мы точно так же спрашиваем LLM почему она допустила ошибку, в надежде лучше понять проблему (и она точно так же как человек едва ли скажет правду) Хотите верьте, хотите нет, но даже у Карла Рэнсома Роджерса было больше определенности чем сегодня в том, что касается "поведения" LLM.
🔥8👍2
Framework анонсировали презентацию "чего-то грандиозного" через 6 дней
(трансляция). Тарологи объявили неделю спекуляций на тему того что бы это могло быть.
Лично я хотел бы что бы что были апдейты для 16ти дюймовика, что-то давно для него ничего не было нового. Надеюсь "something big" это про него )

Но дизайн анонсов в стиле pixelart наводит на другие мысли
🔥3