Work & Beer Balance
1.54K subscribers
117 photos
5 videos
4 files
188 links
Авторский канал @Akiyamka
Поддержать автора можно здесь:
buymeacoffee.com/cherrytea
Download Telegram
Статья про LLM компиляторы это прикольно, но насколько надо быть уверенным в своих тестах. Да, можно покрыть код на 100% тестами, но даже в этом случае мы знаем лишь то что наша программа корректна в известных нам кейсах (при условии что мы все тесты написали без ошибок). Эта ситуация потревожила мои воспоминания о лямбда кубе и AGDA.

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

Но чтобы решать на них практические задачи надо быть этаким одаренным математиком. А вот LLM возможно справилась бы с задачей выражения того что мы хотим сделать в форме математики. И на основе выводов компилятора который проверит все формулы - дать обратную связь о чем надо бы еще подумать.
👍5😁1😢1
Целый день сегодня пытаюсь задебажить почему в моей fedora падают некоторые тесты.
Докопался до того что падает вот эта апи -
https://w3c.github.io/webdriver/#switch-to-frame

Она позволяет перейти в контекст iframe с родительской страницы.
Кто не в теме работает это так -
x = $('iframe') // аналог querySelector у webdriver
browser.switchToFrame(x)

В этот момент вэбдрайвер делает POST запрос к своему внутреннему серверу /session/{session_id}/frame с JSON который содержит какую-то айди которая очень похожа на поинтер.
а тот отвечает что такого нету с 400 ошибкой.

Сначала я думал это как то связано с wayland, но переключение на xorg ничего не изменило
Так как в CI тоже линух, теперь думаю а не из-за SELinux ли это
🔥1
Интересный лайфхак - чтобы пошарить что-то всем iframe на любом уровне вложенности можно создать в корневом документе пустой iframe и добавлять все что нужно в него.
👍1
Пишу тут тесты на vitest и обнаружил для себя пару новых приемов:

1. beforeEach и afterEach более не актуальны
Раньше я писал так
type TestCtx = {
mock: Mock
}

describe<TestCtx>("Test", (ctx) => {
beforeEach(async (ctx) => {
const mock = await createMock();
ctx.mock = mock;
return async () => {
await mock.destroy();
}
});

it<TestCtx>("uses mock", async ({ mock }) => {
mock.doSmth()
expect(mock.getState).toBe(expectedState);
});
}


Теперь можно (а согласно документации даже нужно) вот так
const itWithCtx = test.extend({
mock: async ({}, use) => {
const mock = await createMock();
// Все что до use - это beforeEach
await use(mock);
// Все что до после use - это afterEach
await mock.destroy();
}
})

itWithCtx("uses mock", async ({ mock }) => {
mock.doSmth()
expect(mock.getState).toBe(expectedState);
});
👍212👎2
Второй прием - тестирование функций которые какие-то события оборачивают в промисы:

Раньше я писал так:
  itWithMock('test getFooFromEvents', async ({ ctx }) => {
const { mock, api } = ctx;
const getFooFromEventsSpy = vi.fn(getFooFromEvents);
getFooFromEventsSpy(api);

const eventPayload = {
foo: 'bar',
};
mock.emit('event', eventPayload);

await pause(100);

expect(getFooFromEventsSpy).toHaveResolvedWith(eventPayload);
});

И честно признаюсь мне никогда не нравилась часть с const getFooFromEventsSpy = vi.fn(getFooFromEvents);
потому что она ощущалась мусорным болиерплейтом, который даже в beforeEach вынесешь только хуже сделаешь (потому goToReferenece по тестируемой функции приведет на место оборачивания в vi.fn вместо сорс кода функции)

да и await pause(100); будем честны тоже грязновато.

Теперь я пишу так
  itWithMock('test getFooFromEvents', async ({ ctx }) => {
const { mock, api } = ctx;

const eventPayload = {
foo: 'bar',
};

const assertion = expect(getFooFromEventsSpy(api)).resolves.toEqual(eventPayload);
mock.emit('event', eventPayload);
await assertion;
});


Второй вариант мне кажется намного чище, а вам?
5
Обнаружил интересный и стабильно работающий сценарий с которым агент справляется на отлично (по крайней мере пока) - добавить логи для дебага процесса или проверки теории, и потом - удалить логи добавленные ранее для дебага.
👍12🤔2
Не делайте кнопку копирования как zed, делайте как vscode. Потому что вы почти наверняка накосячили с Clipboard API (все нормально, это встречается повсеместно) и ваша кнопка ничего не делает у части пользователей. Просто дайте им скопировать вручную этот чертов текст
😁4
В zed можно менять json файл темы и он сразу же применяется как только файл был сохранен - удобно. Накидал себе тему за 20 мин
Meta пошарила всему свету о чем люди там шептались с их AI чатом.
Красавцы. А у вас есть такие диалоги которые бы вы никому не хотели показывать?
В zed завезли поддержку DAP.
Теперь он совсем взрослый!

На это ушло 8 месяцев разработки, 977 коммитов и более 25 тысяч строк кода
🔥9
термины CHIPS, FSA, FedCM, RWS вам о чем нибудь говорят?
Я прошла афганскую войну
Если вы делаете какие-нибудь встроенные виджеты, или у вас SSO,
все это вам может понадобиться в скором будущем когда тридпати куки отключат совсем.
В целом вот тут довольно хорошо объяснено, даже я понял

Спойлер - проще всего проверить понадобится или нет - врубить флаг chrome://flags/#test-third-party-cookie-phaseout и посмотреть как у вас будет не работать
Подписчики напоминают что как то мало пива, и я черт побери полностью с ними согласен!
Теперь по пятницам буду делать пост про свои хобби или пиво.
Моё любимое пиво кстати - Märzenbier, или Мартовское пиво, так же известно как Oktoberfest Beer, потому что именно на этом фестивале его и наливают. (Вы ж не думали что на фестивале пива будет много разного пива, правда?). И у этого есть причина - оно нравится многим, своего рода классика.

Вам наверное стало интересно почему пиво называется мартовским и почему его пьют в октябре.

Если вкратце - для приготовления пива нужно не более 8°-9° градусов - в Баварии Март последний месяц когда можно было успеть наварить пивка до следующих холодов. Варить его начинали не все, а каждый еще в сентябре, и оно получалось чуть по крепче (чтоб хранилось подольше)
👍83🔥2
Если мне надо ребейзнуть свой бранч на свежий мастер я делаю так:
git fetch origin master:master && git stash && git rebase master  

Расскажу чуть подробнее о части git fetch origin master:master - она нужна чтобы получить свежий мастер не переключая ветку.

Обратите внимание на два раза master:master - если написать один раз git fetch origin master - вы только получите информацию о текущем состоянии удаленного мастера, но ваш локальный master не будет обновлен
14
Учитесь продвигать свои ишьюсы )
(ну хоть котят не угрожают убивать)
🥰5😁4