Work & Beer Balance
1.54K subscribers
117 photos
5 videos
4 files
188 links
Авторский канал @Akiyamka
Поддержать автора можно здесь:
buymeacoffee.com/cherrytea
Download Telegram
Intel Arc Pro B50 16GB за $299 это вкусно

Intel Arc Pro B60 24GB за $500 это интересно

Project Battlematrix 192GB - за $5000 - сомнительно, но если вам очень надо запустить 70b модель локально, то это вариант.

Больше деталей тут
ntfy.sh

Прилага показывает пуш уведомление, которое можно тригерить по http.

Применение придумайте сами.
(То что надо для моего esp32 проекта!)
👍7
Статья про 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