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