Cododel.dev | Александр
98 subscribers
472 photos
62 videos
7 files
200 links
Alexander Cododel. Full Stack Web Dev since 2019.

📍 Канал: мысли и проекты
📍 Чат: @cododel_chat
📍 Связь: @cododel

🔗 https://cododel.dev
Download Telegram
💎 Личный Нейро-Ассистент

Я тут gpt4all скачал, сделал выгрузку всех постов из @WSCryptal (мой второй канал), загрузил в LocalDocs
И попросил модель LLama 3 сделать компиляцию всех мной допущенных ошибок в торговле

Так как второй канал - по большей части дневник, в нем более 500 постов, с кучей откровенных мыслей, в целом он неплохо справился)
Ответ тут

У меня есть некоторый интерес к нейросетям сейчас, и могу писать о них подробнее, и если будут реакции и просмотры - перевести это дело в видео формат
Все в ваших руках!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🤯1👌1
This media is not supported in your browser
VIEW IN TELEGRAM
🖼️ С Django что-то не так...

Всю ночь пилил проект на Python, понадобилась база данных с админкой
Естественно, не думая, я выбрал Django, который я всегда споминал с теплотой 😊

В целом задачу свою он выполняет, но UX из него выходит дико деревянный
А DjangoRestFramework - не менее дервянен
И вообще у меня ощущение, что популярность его сильно упала, и развитие замедлилось

И документация не модная 😝
Сравнивать мне есть с чем: Laravel, PhilamentPHP, Directus, Strapi, Appwrite, Supabase, ApiPlatform
И это только в бэкенде, в плюс минус схожих проектах по назначению, про фронт, и другие библиотеки молчу вообще...

Походу решу прикрутить laravel в python проект... 🤯
(Хотя идея неплохая, вполне адекватная, если делать сервисную архитекутуру)

Но сначала гляну, не вышел ли очередной "Убивец Django"

На reddit нашел совет, что стоит рассмотреть связку FastAPI + NiceGUI или react
А вот связку моделей с админ панелью пока не вижу, как Django, FilamentPHP, ApiPlatform, Strapi, Directus или хотя бы Supabase, Appwrite
Please open Telegram to view this post
VIEW IN TELEGRAM
Еще один Баг в FilamentPHP: Не обновляется значение поля DateTimeField

Если потребуется подтянуть данные в форму, без перезагрузки страницы - пользуемся примером:


Forms\Components\DateTimePicker::make('broken_at')
->prefixAction(
Action::make('updateLocation')
->icon('heroicon-c-arrow-path')
->action(function (Proxy $record, EditProxy $livewire, DateTimePicker $component) {
$record->recheck(update: true);
$livewire->refreshFormData(['broken_at']);
})
)


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

Но!
В случае с DateTime - должна происходить сериализация объекта в строку нужного формата.
Этого не происходит, данные в базе сохраняются, с ними можно работать, но само значение в поле становится пустым, это баг.
Я за реверсил логику refreshFormData, разобрался, как форматируется этот тип данных при классической работе с формой.
Пока не пофиксят, после изменения данных достаточно вручную отформатировать значение и подставить в форму, используя инъекцию компонента формы.
В данном случае нужно заменить:


$livewire->refreshFormData(['broken_at']);


На следующую конструкцию:


if ($record->broken_at == null) {
$livewire->data['broken_at'] = null;
} else {
$livewire->data['broken_at'] = $record->broken_at->format($component->getFormat());
}


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

Готово!

А еще записал подробное видео, с рзабором этой фишки на реальном проекте!
▶️ YouTube
👍1
Cododel.dev | Александр
🖼️ С Django что-то не так... Всю ночь пилил проект на Python, понадобилась база данных с админкой Естественно, не думая, я выбрал Django, который я всегда споминал с теплотой 😊 В целом задачу свою он выполняет, но UX из него выходит дико деревянный А Dj…
Я собрался, сел, и записал видео отличиями Django от FilamentPHP, на который я в итоге переписал все что было, и даже больше.

Ушло 17 минут, одним дублем, и при этом поживее, менее скомканно чем в прошлом видосе.

Сделал превью для видоса, написал вступительный пост с описанием, загрузил на YouTube

Но не покажу!!
А дело в том, что я не успел добавить всплывашку с ссылкой на прошлый видос, чтобы не рассказывать заново про то, как сделать поля с action, который обновляет информацию в базе, и сразу отображает в форме
Как обнаружил проебавшийся поврежденный звук!
В итоге видос почти без звука, стабильно, на протяжении всего хронометража...

Мне лень снова все вспоминать, презаписывать, эмоции уже не те будут.

Так что я еще раз собрал себя в кулак, и...
Написал сценарий и текст! 🤣
Видос откладывается на несколько дней точно теперь.
Я доработаю сценарий с текстом, подготовлюсь, подстригусь, запишу видос, возможно переозвучу на монтаже.

Попробую выдать качество. И со звуком не подведу.

Честно - я зачем-то по воздуху подцепил iPhone для записи звука в видос, так как мне не понравился звук с AirPods, хотя и прошки, а звук на записи говно 😒
И какого-то черта забыл о проводных EarPods, с шикарнейшим микрофоном! Подцепил и поехали, казалось бы...
Но нет, надо было айфон подцепить, находясь в городе, где стоят глушилки на BlueTooth 👍


Чем больше будет тут реакций, тем быстрее и качественнее выпущу сравнение Django и Laravel + FilamentPHP
Фреймворков на "Модном Python" и "Мертвом PHP"...
Когда увидите - прошу еще раз задать себе вопрос: "чем плох PHP, за исключением работы на потоках"?
(Работу на потоках кстати исправляет FrankenPHP, позволяя даже компилировать проект в бинарник, но пока не стабилен)

И комменты пишем, хватит прохлаждаться, высказываем мнение
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Кстати нейросети хоть и прижились уже, делают классные иллюстрации
Но такие простые ошибки, в основном в тексте - приходится править руками в фотошопе)

Пример до и после прикрепляю.
1
Cododel.dev | Александр
Я собрался, сел, и записал видео отличиями Django от FilamentPHP, на который я в итоге переписал все что было, и даже больше. Ушло 17 минут, одним дублем, и при этом поживее, менее скомканно чем в прошлом видосе. Сделал превью для видоса, написал вступительный…
Я немного поработал еще, и сценарий уже не актуален 😆
Теперь различий в два раза больше с джанго, в том числе по удобству и скорости поднятия новых сервисов, и работы с ними (Очереди, Веб сокеты, Импорты, и тп)

Плюс LiveWire подвспомнить пришлось, пока настраивал вебсокеты, спасибо индусу 🙏
А LiveWire это пушка, из которой легко можно застрелить Django 😊
Не только по причине удобства самого LW, а потому что в Filament любой компонент можно сделать за пару минут.
Да еще и вебсокеты дико удобно интегрированы сюда, по мимо серверных функций, что само по себе очень удобно
Хоть и в плане разработки полноценного фронтенда - сомнительно на сервере весь клиентский код исполнять, а для админки вполне сойдет)
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Я веду не новостной канал, а скорее личный блог, пишу что нравится
Новости мне ненравятся естественно)

Но вот этот комментарий забавный 😅
Please open Telegram to view this post
VIEW IN TELEGRAM
💔1
Cododel.dev | Александр
Кстати нейросети хоть и прижились уже, делают классные иллюстрации Но такие простые ошибки, в основном в тексте - приходится править руками в фотошопе) Пример до и после прикрепляю.
Пока в Photoshop не работает генеративное заполнение (Generative fill) в РФ, в opensource редакторе Krita есть неплохое решение на базе Stable Diffusion

Даже превью функционала есть

При этом не обязательно иметь мощную видеокарту.
Можно воспользоваться онлайн сервисом от самого разработчика, с бесплатными токенами на генерацию, или дешево взять в аренду видеокарту на vast.ai, и самостоятельно поднять Stable Diffusion со своей моделью, и просто указать в настройках адрес сервера.

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

До смотрим в прикрпленном сообщении, результат в прикрепленном изображении
1
Cododel.dev | Александр
Пока в Photoshop не работает генеративное заполнение (Generative fill) в РФ, в opensource редакторе Krita есть неплохое решение на базе Stable Diffusion Даже превью функционала есть При этом не обязательно иметь мощную видеокарту. Можно воспользоваться онлайн…
Кстати если видеокарта есть - легко настраивается всё (но можно и на процессоре)

Но на моем MacBook air с M1 - генерация дико медленная,о все же работает если чай сходить попить пока инференс проиходит 😁
За то без лимитов и без интернета
Forwarded from (НЕ)Экономист! | Cododel Crypto | Alexander
Я нашел условия дропа HamsterCombat

Сейчас во вкладке дропа только подключения кошелька

Но в исходниках бота, которые легко посмотреть в консоли разработчиков, есть уже еще 4 задачки:
· Пригласить не менее 5 друзей
· Достигнуть профита в час не менее 10к
· Достигнуть не менее 4 уровня (Platinum)
· Подписаться на телеграм канал

Скорее всего это обязательные условия для получения дропа, если хотя бы под одно из них не попасть, то с дропом в пролёте 😃

На данный момент это файл
https://hamsterkombatgame.io/_nuxt/airdrop.C16j_n93.js
👍1
🔗 Chainable async Python Queue Runner

Честно - мне сложно по-русски коротко назвать утилити)
Это инструмент очень сильной абстракции, использовать только в редких случаях!

Если в проекте удобно сначала собрать очередь задач, а только затем их последовательно запустить, а у меня такая ситуация и случилась, то предлагаю этот Gist

• Создаем объект QueueRunner
• Затем через метод .task - передаем в него аасинхронную функцию
• Если нужны аргументы, то чейним, как в некоторых конструкциях JavaScript следующий метод .args, и в него передаем требуемые аргменты для функции "Как есть".
Этот метод запишет в класс QueueTask аргументы для последней добавленной задачи
• Чтобы добавить новую задачу - достаточно так же чейном вызвать снова ту же последовательность, либо на объекте, сохраненном в переменной

Так к примеру - можно вынести крупные части логики, которая должна исполняться последовательно в разные файлы, у меня в проекте это Actions
Потом их собрать в нужном порядке в QueueRunner, при этом, между каждым вызовом метода можно выполнить доп логику основного потока логики.

И под конец вызвать асинхронный метод .run, который выполнит все сохраненные задачи последовательно.

Это позволяет построить достаточно сильную абстракцию, пихать где попало не стоит)
Но если у вас более 500 строк кода, в котором можно выделить явные последовательные блоки логики, при том некоторые из них условные (выполняются при соблюдении условий в операторе if), то вполне может пригодиться данная фишка)

🖼️ Gist
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Media is too big
VIEW IN TELEGRAM
Попробую для начала себя в переводах, прежде чем делать свои ролики
Нужно поработать с голосом, привыкнуть, сложно с нуля и без опыта делать качественно 🤫
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👏1
Умеете работать с CORS?
Anonymous Poll
43%
Да
57%
Не сталкивался
0%
Не работаю с WEB
Типизированные Датаклассы-модели данных в TypeScript

Появились сложности в работе с Playwright на Python
А в JS api - есть подходящие экспериментальные функции для работы с запросами
Да и с аснихронностью работать мне гораздо приятнее в JS

И первое же, с чем я столкнулся - в Python есть шикарнейшая библиотека Pydantic, а на крайний случай, для работы с данным - предустановленные dataclasses
В JS же такого счастья нет, в виде удобного определения моделей данных, с возможностью добавить к ним методы и вычисляемые значения

Я перепробовал около 10 вариантов, привлек ChatGPT 4o
Ничего не вышло, но я вынес из этого много мыслей и с небольшим перерывом смог реализовать довольно неплохой интерфейс
Самая главная проблема во всех, даже самых крутых интерфейсах - наршуение принципа DRY, так как приходилось определять и properties у модели, и задавать еще дополнительно схему входных данных.

Сейчас достаточно только properties указать и конструктор, в typescript это можно сделать без повторений, через shorthand constructor. (см скрин)
Реализовано это через реверс метода конструктора, чтобы получить список именованных аргументов, а вторая функция извлекает из объекта значения в нужном порядке и переает их в конструктор.
Решение довольно неплохое, ведь нужна имплементация **kwargs из python, чтобы пробросить объект как именованные аргументы функции, но такого в JS нет, хотя решение все же нашлось)

Например, получая данные по api - мы просто передаем их в fromJSON или fromObject метод:

async function getRandomProxy() {
const res = await this._api.get(`/proxy/random`);
return Proxy.fromObject(res.data);
}


А определение модели датакласса смотрим на скрине.
Нигде не выкладывал, если понадобится кому - писать в комменты.
Самописная система кеширования запросов Playwright и ее польза

Реализовал систему кеширования, пока не универсальную, под мой проект.
Для разработки ботов для сайтов - пушка!

В моем кейсе кол-во запросов к реальному серверу сократилось с 80 до 10
А скорость загрузки с 8 сек до 0.8 сек (в 10 раз!) 🤫

Кроме ускорения загрузки страниц, как и скорости работы бота - еще более мощный бенефит в следующем:
Если сайт жестко ограничивает кол-во запросов, то мы их и не будем отправлять.
Так в моем кейсе на одну загрузку страницы тратится 50 запросов через playwright, тк часть кеширования урезана.
При работе через обычный браузер - это 16 запросов.
Сайт же ограничивает кол-во запросов до 200шт за 5 минут, после чего блокирует до окончания этого периода.
В таком режиме бот будет работать медленнее человека...

А с такой системой кеширования, бот не то-что просто будет работать быстрее, за счет мгновенного выполнения всех действий на странице, так еще и в 1.5 раза больше действий имеет право делать, не выходя из лимитов!

Я рад, мне нравится, надеюсь я правильно определил bottleneck, и теперь работа попрёт 😈

Подключается она всего в две строки сейчас, в будущем интерфейс будет изменен, естественно:

const browser = await chromium.launch(launchOptions);
const context = await browser.newContext();
const page = await context.newPage();

const cache = new PWCache(page);
await cache.run();

await page.goto('https://example.com');
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Cododel.dev | Александр
Самописная система кеширования запросов Playwright и ее польза Реализовал систему кеширования, пока не универсальную, под мой проект. Для разработки ботов для сайтов - пушка! В моем кейсе кол-во запросов к реальному серверу сократилось с 80 до 10 А скорость…
Получилось портировать на Python, возможно переписывать на TypeScript буду потом проект, вся логика на Python уже готова, быстрее портировать было.

Плюс для решения капчи буду подключать мою, обученную выше, нейросеть.
Сейчас просто ставлю на паузу и вручную ее решаю)
А делать это точно на python нужно, сейчас это будет сделать проще, чем с nodejs

Как у Python - куча приятных фишек, так и под TS...
👍1