Грязный ноукодер
1.29K subscribers
116 photos
12 videos
2 files
161 links
Пишу про AI, no-code и бизнес процессы.
@low_code - для связи
Видео гайды - https://www.youtube.com/@5_min_ai
Обучение - https://www.skool.com/5minai-pro
Download Telegram
Как я использовал чат ChatGPT за последние 2 месяца:

1. Основной и самой сложной задачей последнего месяца был риверс инжениринг внутренного API маркетплейса Poizon. В отличии от обычных API здесь добавляется шаг с шифрованием данных и созданием уникальной подписи на основе запроса. Таким образом для понимания процесса шифрования требовались навыки JS и на рынке оценили эту задачу в $600-1000 (скорее всего можно и дешевле, но это вопрос поиска хорошего специалиста). Я не отчаялся и решил скормить все, что вижу в консоле разработчика, GPT в надежде на его силы - через полчаса у меня был готовый код для создания подписи и неприступный API был взломан.

2. Для этого же проекта мне потребовалось создать список верхнеуровневых категорий на основе 300 подкатегорий с переводом на русский. Выдавать результаты в чате GPT поленился и это потребовало бы около 10 сообщений. Решением стал небольшой сценарий в Make сохранением данных в Airtable. Не забудьте переключить модель в API запросах на новую 1106-preview, так как она стоит в 2 раза меньше.

3. Схожую задачу категоризации я решил на соседнем проекте, где на основе неструктурированных данных из Linkedin требовалось выбрать уровень образования кандидата из фиксированного списка (bachelor, masters and etc)

4. Вместе с GPT я обновил проекты и портфолио на Upwork - зацените какая теперь красота.

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

6. На волне хайпа кастомных GPT я пробовал создать свой GPT на основе 2ух книг от Amliesolutions по оптимизации и безопасности в Bubble. Результат можете оценить сами.

Ставьте лайк и подписывайтесь, впереди много полезного контента.
Как использовать Option sets в Bubble

Я замечаю, что многие практики разработки, которые давно стали для меня обыденностью, являются непознанными для других разработчиков. Скорее всего и я упускаю какие-то best practice, которые бы помогли мне в работе. С этой целью я буду потихоньку разбирать различные части рабочих инструментов и приглашаю вас к обсуждению и обмену опытом.

Начнем с теории, которую вы можете найти в официальной документации:

1. Данные из Option sets подгружаются на сторону пользователя вместе с загрузкой страницы, а значит там не стоит хранить чувствительную информацию.

2. Хоть эти данные и сохраняются в кэше пользователя до следующего деплоя, не стоит держать там длинных списков, чтобы не замедлять загрузку страницы.

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

4. Как и в БД, к основной колонке Display вы можете добавить дополнительные аттрибуты (колонки). Их возможно поменять только открыв детали конкретной записи.

5. Аттрибут может иметь один из стандартных типов данных либо являться ссылкой на другой Option set. Ссылаться на таблицы из БД нельзя. Сам Options set может быть выбран как тип данных в API и SQL connector’ах, backend workflows и БД.

6. Значения Display могут быть неуникальными, поэтому нужно быть осторожным при создании списка и проверять на дубликаты.

7. Для изменения списка в Live потребуется деплой.


А вот что я успел понять об Option sets:

1. Иногда требуется загрузить длинный список значений (области страны). Для bulk загрузки можно использовать плагин, но работает он не совсем стабильно и не имеет возможности загружать аттрибуты.

2. Основные кейсы, когда я использую Option sets - статусы, опции для dropdown (области, должности, категории и тд), страницы приложения (menu, submenu), алерты.

3. Аттрибуты я использовал для перевода статусов на русский (в БД всегда англ), для сохранения порядкового номера (и дальнейшей сортировке на фронте), для динамических цветов тега.

4. Почему то так сложилось, что моя нейминговая конвенция для Options sets - start case (каждое слово с большой буквы).

А как вы используете Option sets?

___

Не забывайте ставить лайк и подписываться на канал, это мотивирует меня делать больше интересного контента
Если клиент просит добавить фичу (за деньги), которая заведомо не имеет продуктовой значимости, основана на чистом желании клиента и не будет использоваться, вы добавите ее не обсуждая или попытаетесь доказать, что она не нужна?
Почему? (мотивация может быть разной - деньги, время, принципы и тд)
Сегодня я поделюсь лайфхаками по работе с Supabase, которые я узнал, пока автоматизировал многоступенчатый процесс лизинга для мексиканской компании.

1️⃣ Вы можете создать базу через интерфейс, но мне больше нравится описывать вместе с ChatGPT запросы на создание нужных таблиц и просто запускать их во вкладке SQL Editor.

CREATE TABLE public.log_types (
id uuid NOT NULL DEFAULT gen_random_uuid(),
type_name TEXT NOT NULL,
CONSTRAINT log_types_pkey PRIMARY KEY (id)
) TABLESPACE pg_default;

2️⃣Немного о первичном ключе:

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

- Для первичного ключа я использую поле с типом uuid и автоматической генерацией через дефолтное значение - gen_random_uuid(). Можно выбрать порядковую нумерация начиная с 1, но мне такой вариант не подошел, ведь при использовании этого id в ссылке пользователь сможет заменить его на другой и посмотреть чужую запись.

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

3️⃣ Для разных типов данных можно использовать разные типы поля. Вы можете использовать для текста один и тот же тип text, а можете варьировать тип в зависимости от размера данных, которые собираетесь там хранить. Каждый из типов резервирует в базе определенный размер памяти, поэтому если вы собираетесь делать большой и масштабируемый проект, есть смысл задумываться над типом каждого поля.

- Varchar - короткий текст
- Text - длинный текст
- Timestamptz - дата с временем и таймзоной
- Int8 - для целых чисел
- Float8 - для чисел с точкой
- Bool - для логических переменных
- JSON - для хранения объектов

4️⃣ У поля можно выбрать дефолтное значение - удобно выставлять текущую дату или дефолтный статус.

5️⃣ Вы можете настроить поле с ссылкой на другую таблицу (значок ссылки). Для этого нужно будет выбрать таблицу и нужное поле (uuid). В настройке “Action if referenced row is removed” следует выбрать поведение базы при удалении референса, иначе при удалении записи и наличии связи база выдаст ошибку.

- Cascade - удалить связанные записи
- No action - ничего не делать, но вызывает ошибку
- Set default/NULL - выставить дефолтное/NULL значение (выбрайте это, если не знаете что лучше)

6️⃣ Все типы полей могут быть массивами (значок шестеренки - Set as Array). Однако, ссылки на другие таблицы не поддерживают массивы. Для хранения массива ссылок на другую таблицу следует убрать связь и хранить данные как массив uuid/text.

7️⃣ Не стоит забывать про нейминг таблиц и полей. Я использую snake_case конвенцию, а ссылки на другие таблицы обозначаю как entity_id.

8️⃣ Файлы хранятся отдельно в storage и вызываются/сохраняются по пути файла через API (название папок/название файла.расширение). Каждый файл я храню в отдельной папке пользователя (название - user_id), сами папки хранятся в папке сущности (users). В отдельной таблице в БД хранятся файлы с названием и полным путем до файла в storage (users/user_id/filename.txt).

9️⃣ Для получения временной ссылки на файл (удобно для просмотра) нужно сначала запросить url с помощью запроса https://yourbase.supabase.co/storage/v1/object/sign/file_storage/[filepath] : JSON body {"expiresIn": 600}. Далее эту ссылку можно использовать с префиксом https://yourbase.supabase.co/storage/v1


Данные советы могут содержать неточности и основаны лишь на моем опыте. Также для простоты я использую мастер-ключ для API запросов к базе (получение файлов), что является плохой практикой. Каждый пользователь должен быть создан в Supabase, данные должны быть привязаны к пользователю и для запросов к API нужно использовать токен пользователя, чтобы ограничить доступ к другим файлам.

Ставьте лайк и подписывайтесь, в следующей части мы разберем лайфхаки подключения SQL к Bubble
В no-code возможно зарабатывать $5-10 тыс./мес.

Какого уровня дохода вам хотелось бы достичь в следующем году? Как вы думаете, какие скиллы вам нужно для этого подтянуть?
Как сделать не виснующее ноукод приложение с БД в 1000000 строк?

Продолжаем говорить о SQL и сегодня разберем полезные советы о работе с SQL в Bubble.
Ранее я уже делал ряд постов об этом, поэтому не будем повторяться и посмотрим новые инсайты.

1️⃣ Для подключение к Supabase устанавливаем плагин SQL Connector и берем креды из Settings - Database. Далее формируем строку для плагина - postgres://User:Password@Host:Port/Database.

- Пример: postgres://postgres:YGe24reS51Sba@db.ekgfdgwertwerajnwqw.supabase.co:5432/postgres

2️⃣ Работая с большим объемом данных не обойтись без пагинации - ее можно сделать с помощью OFFSET и переменной ($1). Для показа следующей “страницы” добавьте к переменной число, указанное у вас в LIMIT. При пагинации обязательна сортировка данных, чтобы БД точно понимать какие именно записи идут следующими.

- ORDER BY created_date DESC LIMIT 200 OFFSET $1;

3️⃣ Переменные в запросах:

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

- Если вам нужно сделать запрос для поиска с различными фильтрами (переменными), которые могут быть пустыми, добавьте в условие проверку переменной - $1 IS NULL. Примеры условий для разных типов:
- - Текстовая переменная - (status LIKE '%' $1 '%' OR $1 IS NULL)
- - Числовая переменная - (telegram_id = $1 OR $1 IS NULL)
- - Массив - school_name = ANY(ARRAY[$1] OR $1 IS NULL) - $1=‘Harvard,Stanford’

- Если у вас есть проблемы с типом данных на стороне Bubble, смените тип переменной в SQL - $1::text или $1::int

4️⃣ Не бойтесь SQL, за меня на нем пишет ChatGPT. Даже 3.5 версии достаточно скормить структуру ваших таблиц (Table - Definition) и он сам напишет все нужные запросы за вас.

🔥Совет со звездочкой для самых-самых:

Кейс - я хочу выбрать из списка заказ и показать детали этого заказа.
Источником данных для карточки деталей заказа я использую выбранную запись из общего списка заказов, который основан на запросе get_orders. Тут нет проблем - жмем на заказ и используем This get_orders.
Но каждый запрос воспринимается как отдельный тип данных. Если я хочу из карточки счета перейти в заказ мне нужно либо использовать отдельный запрос get_this_order, либо брать весь список заказов и фильтровать его на стороне клиента, чтобы получить данные по конкретному заказу.

Первый способ вернет другой типа данных, который нельзя использовать для карточки товара (у нас там все завязано на get_orders). Второй же способ небезопасен (так как грузятся все данные на сторону клиента) и неэффективен (это может занять очень много времени). Что же делать?

Мы делаем универсальный запрос get_orders, куда добавляем еще один фильтр id=$1. Проблема в том, что UUID это жесткий 32 символьный формат и при попытке отправки пустой строки вы получите ошибку ($1 IS NULL тоже не поможет). Для обхода этой проблемы мы заменяем дефолтное пустое значение на валидный UUID и меняем условие. (id = $4 OR $4= '00000000-0000-0000-0000-000000000000’)


Спасибо вам, за то что читали мой блог весь этот год. ❤️‍🔥
Поздравляю всех с наступающим Новым Годом🎄, ставьте лайки и подписывайтесь, в следующем году дело примет серьезные обороты!
Channel name was changed to «Грязный ноукодер»
Добро пожаловать на канал Грязного ноукодера

Что случилось?

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

Почему такое название?

Несмотря на мой сугобо технический контент, в жизни я совсем другой человек👀
Посудите сами - сейчас, когда меня просят рассказать о себе, я представляюсь так:

2019: работал бизнес-аналитиком
2020: работал в Integromat
2021: помогал делать немецкий стартап
2022: работал с инвестиционным фондом из США

Сухо, грустно, скучно. А что если так:

2012: слил первую 10ку на бинарных опционах
2014: придумывал стратегии для Forex
2015: полгода пытался математически переиграть букмекеров
2016: кардил через Paypal аккаунты
2019: создал сетку дропов для заработка на альфах
🔽
2022: все эти ранее накопленные навыки помогли мне с помощью ноукод обработать транзакций на $14 млн.

Стало интересней? А если я добавлю, что мне пришлось чистить следы за одним из 🍋 и мой бывший босс все еще под следствием в США? Думаю теперь вам будет о чем почитать 😏

А чтобы познакомиться еще ближе, предлагаю начать этот год с полезной личной встречи. Я буду рад пообщаться с вами и узнать на каком этапе ноукодерского пути вы находитесь, по возможности дам полезный совет и задам несколько вопросов, которые помогут вам выйти на следующий уровень в новом году.

Назначить встречу можно тут - https://calendly.com/lowcodingdev/networking
Please open Telegram to view this post
VIEW IN TELEGRAM
Как достичь стабильности в ноукоде?

Ответ на мой вчерашний призыв не заставил себя ждать и я уже успел созвониться с одним из своих подписчиков и обсудить его путь no-code разработчика.

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

Откуда же берется стабильность? Из большого потока задач. Ими вас может обеспечить агентство (продажники постоянно находят новые проекты), компания с растущим продуктом (рост = потребность в новых фичах) или же налаженный источник трафика (главное выстроить хорошую воронку).

1️⃣ Агентство. Вы можете создать свое🥲 или постучаться во все существующие агентства на российском/зарубежном рынке (не забывайте, что есть множество агентств на западе с русскими командами). Их можно найти на Clutch, Bubble, Airtable, Make, и в прочих списках.

2️⃣ Растущий продукт. Это компания с развивающимся бизнесом, использующая внешний или внутренний ИТ продукт . В зависимости от размера продукта вы можете получить должность разработчика в существующей команде или в одиночку тянуть на себе техническую часть продукта как фрилансер. Найти такое можно на досках с вакансиями (Linkedin, HH) или на биржах (Upwork, Fivver). Также, вы можете стать частью такого продукта, если создадите MVP и оно начнет приносить реальную пользу.

3️⃣ Источник трафика. Тут все гораздо сложнее, но надежнее. Вам нужно выстраивать собственную воронку с источником трафика и продуктом. Источники трафика - посты в соцсетях (Linkedin, TG), профильные статьи в онлайн журналах (VC.ru, habr), помощь в чатах комьюнити (TG, Facebook, Reddit, Linkedin), таргетированная реклама (Yandex, Google, IG), прочее (Avito🤨). Продукт - блог в тг, сайт, профиль на бирже или соцсети, где вы рассказываете о своей деятельности и призываете пользователя записаться на консультацию/оставить заявку с описанием проекта.

🔥 Бонус источник - ваши текущие клиенты. Самый мощный источник новых заказов для любого бизнеса - сарафанное радио. Выполните свою работу качественно, проявите заботу о клиенте и его продукте, и он будет советовать вас всем знакомым даже спустя несколько лет.

Кстати, этот подписчик ищет работу Bubble разработчика и вы можете связаться с ним напрямую - @pirueti

Если и вы хотите получить полезных советов или просто приятно поболтать, ставьте лайки и успевайте забронировать звонок тут - https://calendly.com/lowcodingdev/networking
Please open Telegram to view this post
VIEW IN TELEGRAM
Меня всегда интересовала корреляция «впахивания» и получаемых доходов.

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

Сколько часов в день работаете вы работаете сейчас?
Пытаетесь ли вы работать больше или качественнее, чтобы выйти на новый уровень дохода?
Please open Telegram to view this post
VIEW IN TELEGRAM
Жесть…

Очень быстро собрали 30 огней🔥🤝

Для меня очень ценно видеть вашу тягу к практическим знаням, я сам был и остаюсь таким же.

Уже сел готовить для вас структуру урока, чтобы выжать 140% процентов пользы.

Как попасть на урок — расскажу завтра.
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет!

Весь день готовлюсь к предстоящему уроку по автоматизации в Make, на который записалось уже 20 человек.

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

Кто еще не успел прочитать последний пост в канале, заполнить анкету и зарегистрироваться на урок — успевайте, так как времени осталось совсем немного.

Даже если вы не сможете принять участие в уроке — я все равно пришлю его запись на почту.

А пока оставляю вам план урока, до встреч в 17:00 по МСК.
Спасибо всем, кто поучаствовал на вчерашнем уроке и заполнил анкету!🔥

Я внимательно изучил ваши запросы и сделал вывод, что ваша основная точка интереса — это вырасти в уровне дохода.

У меня есть много чем поделиться на эту тему, так как сам прошел каждый шаг на пути с 0 до $5’000 на ноукоде и понимаю, как прийти к этому результату кратчайшим маршрутом.

Сейчас я рассылаю всем запись урока вместе с презентацией (вы еще успеваете получить ее, заполнив анкету).

Также я добавил туда дополнительных ссылок и домашнее задание разной сложности.

Кто был на уроке — напишите, как вам?

Буду благодарен за обратную связь в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
Совсем забыл, что хотел визуализировать вчерашний рассказ 😅