Любить свое дело (делать с душой)
Я сторонник версии, что свое дело нужно любить. Вот прям любить.
Мне сложно понять подход "Я гребу с 9 до 18 по будням с перерывом на обед. В остальное время программирование меня не интересует".
Меня программирование интересует 24x7. И не только программирование. В любое дело, что я начинал, я погружался с головой.
Да, это опасно. Можно выгореть :) Но иначе - зачем это все?
Я стараюсь идти в бой такими же увлеченными людьми, но в наше время таких людей все меньше.
Сейчас без индивидуального плана развития ты никого не наймешь.
Job hopping раз в 6 месяцев не считается чем-то плохим...
Но сегодня я не хотел об этом бухтеть. Я расскажу вам историю о том, как много лет назад я открыл интернет-магазин.
У меня было много разных проектов и интернет-магазин один из них.
Нет, это не такие интернет-магазины, которые любой человек сегодня может сделать в 2 клика.
Тогда не было дроп-шиппинга. В онлайне почти никто не покупал и приходилось договариваться с оффлайн точками о выкладке.
Мне хотелось сделать что-то веселое. И я решил привести в нашу деревню какие-то прикольные штуки, которые могут стать подарком.
Тогда на рынке подарков локомотивом был "красный куб" с соответствующим ассортиментом.
Я решил торговать странными штуками - профессиональными yo-yo, паверболами и всяким таким. Если вы не знаете что такое yo-oy, посмотрите видео с международных конкурсов. Это отдельная вселенная :)
До сих пор у меня валяется меч из "звездных воин". Вот такой :)
Вокруг магазина сложилась туса со своей атмосферой. С некоторыми из участников я общаюсь до сих пор.
Делать приходилось все, включая маркетинговые материалы. И я обратился к своему старому корешу, чтобы тот нарисовал плакат и флаеры.
Он очень крутой художник, фотограф, видеограф, аниматор и вот это все. К каждому проекту он подходит с душой.
"Я сделаю, но по-своему", - сказал он. Как обычно, в общем-то :) Но я был уверен, что все будет ок.
В то же время у него был проект, который он делал для себя. Комната из хоррора. Кровища, бензопилы... Крипота!
Подвал в гараже он обклеил газетами. Купил на рынке бычьей крови. Заранее на ebay были заказаны какие-то немецкие винтажные бензопилы.
Снималось все на слайдовый Hasselblad.
Но причем тут йойо !?
Заранее из циркулярных пил была собрана йойоха. Понадобилась модель, которая будет ее "крутить". Кожаные перчатки, бинты, кровь.
На итоговой картинке были дорисованы только разлетающиеся капли крови, чтобы передать динамику вращения. Все остальное - фото.
К чему я это все... Найдите себе дело, которое будет вам по душе. Толку от этого будет гораздо больше, чем от работы с 9 до 18...
Оригинальное фото
Я сторонник версии, что свое дело нужно любить. Вот прям любить.
Мне сложно понять подход "Я гребу с 9 до 18 по будням с перерывом на обед. В остальное время программирование меня не интересует".
Меня программирование интересует 24x7. И не только программирование. В любое дело, что я начинал, я погружался с головой.
Да, это опасно. Можно выгореть :) Но иначе - зачем это все?
Я стараюсь идти в бой такими же увлеченными людьми, но в наше время таких людей все меньше.
Сейчас без индивидуального плана развития ты никого не наймешь.
Job hopping раз в 6 месяцев не считается чем-то плохим...
Но сегодня я не хотел об этом бухтеть. Я расскажу вам историю о том, как много лет назад я открыл интернет-магазин.
У меня было много разных проектов и интернет-магазин один из них.
Нет, это не такие интернет-магазины, которые любой человек сегодня может сделать в 2 клика.
Тогда не было дроп-шиппинга. В онлайне почти никто не покупал и приходилось договариваться с оффлайн точками о выкладке.
Мне хотелось сделать что-то веселое. И я решил привести в нашу деревню какие-то прикольные штуки, которые могут стать подарком.
Тогда на рынке подарков локомотивом был "красный куб" с соответствующим ассортиментом.
Я решил торговать странными штуками - профессиональными yo-yo, паверболами и всяким таким. Если вы не знаете что такое yo-oy, посмотрите видео с международных конкурсов. Это отдельная вселенная :)
До сих пор у меня валяется меч из "звездных воин". Вот такой :)
Вокруг магазина сложилась туса со своей атмосферой. С некоторыми из участников я общаюсь до сих пор.
Делать приходилось все, включая маркетинговые материалы. И я обратился к своему старому корешу, чтобы тот нарисовал плакат и флаеры.
Он очень крутой художник, фотограф, видеограф, аниматор и вот это все. К каждому проекту он подходит с душой.
"Я сделаю, но по-своему", - сказал он. Как обычно, в общем-то :) Но я был уверен, что все будет ок.
В то же время у него был проект, который он делал для себя. Комната из хоррора. Кровища, бензопилы... Крипота!
Подвал в гараже он обклеил газетами. Купил на рынке бычьей крови. Заранее на ebay были заказаны какие-то немецкие винтажные бензопилы.
Снималось все на слайдовый Hasselblad.
Но причем тут йойо !?
Заранее из циркулярных пил была собрана йойоха. Понадобилась модель, которая будет ее "крутить". Кожаные перчатки, бинты, кровь.
На итоговой картинке были дорисованы только разлетающиеся капли крови, чтобы передать динамику вращения. Все остальное - фото.
К чему я это все... Найдите себе дело, которое будет вам по душе. Толку от этого будет гораздо больше, чем от работы с 9 до 18...
Оригинальное фото
Сегодня в эфире наброс на regexp’ы аж о двух постах.
Присоединюсь по всем пунктам, разве что за исключением того, что проверять регеспы можно статическими методами (раз, два). Если вы, конечно, не собираете их динамически :) А если собираете,... я даже не знаю как это можно назвать...
У меня как-то была история о регекспах, когда я парсил базу билетного агенства.
В holistic.dev тоже не обошлось без этой черной юниксово-перловой магии :)
Нет, запросы не парсятся регекспами, это невозможно. Для этого используется оригинальный AST-парсер из postgresql.
Выковыривать его оттуда отдельное приключение. Т.к. разработчики не поставляют его как отдельный продукт, они не переживают за обратную совместимость. Поэтому у дерева постоянно появляются и пропадают узлы :)
Регекспы используются для подготовки сорцов, перед скармливанием их в AST-парсер. Т.к. мы маленький стартап и не можем позволить себе написать грамматику, например, под JetBrains Grammar-Kit, приходится выкручиваться.
Т.к. изначально инструмент планировалось интегрировать с IDE, то хотелось сделать так, чтобы при наличии синтаксической ошибке в одной из sql-команд, только эта команда игнорировалась, а остальное парсилось. Именно так все работает в IDE от Jetbrains. Хотелось сделать так же, но нативный парсер такого не умеет - он падает на первой же синтаксической ошибке.
Идея делать плагин для IDE была отложена, а функционал остался. Если в playground сделать несколько ddl-команд, часть из которых будет с синтаксическими ошибками, это не помешает проверке. (выделение ошибочных мест в DDL будет позже, сейчас можно заметить, что поля из таблицы b не попали в экспорт типов).
Часто спрашивают - почему не подсвечивается отсутствующая таблица в запросе? Сейчас мы не ориентируемся на разработчиков, а у DBA не бывает невалидных запросов :) Но справедливости ради, это правило находится в процессе разработки и нашлись corner cases, которые требуют доработки парсера :)
К слову, если у вас есть экспертиза в AST-парсерах, я был бы рад пообщаться (@antonrevyako)
Присоединюсь по всем пунктам, разве что за исключением того, что проверять регеспы можно статическими методами (раз, два). Если вы, конечно, не собираете их динамически :) А если собираете,... я даже не знаю как это можно назвать...
У меня как-то была история о регекспах, когда я парсил базу билетного агенства.
В holistic.dev тоже не обошлось без этой черной юниксово-перловой магии :)
Нет, запросы не парсятся регекспами, это невозможно. Для этого используется оригинальный AST-парсер из postgresql.
Выковыривать его оттуда отдельное приключение. Т.к. разработчики не поставляют его как отдельный продукт, они не переживают за обратную совместимость. Поэтому у дерева постоянно появляются и пропадают узлы :)
Регекспы используются для подготовки сорцов, перед скармливанием их в AST-парсер. Т.к. мы маленький стартап и не можем позволить себе написать грамматику, например, под JetBrains Grammar-Kit, приходится выкручиваться.
Т.к. изначально инструмент планировалось интегрировать с IDE, то хотелось сделать так, чтобы при наличии синтаксической ошибке в одной из sql-команд, только эта команда игнорировалась, а остальное парсилось. Именно так все работает в IDE от Jetbrains. Хотелось сделать так же, но нативный парсер такого не умеет - он падает на первой же синтаксической ошибке.
Идея делать плагин для IDE была отложена, а функционал остался. Если в playground сделать несколько ddl-команд, часть из которых будет с синтаксическими ошибками, это не помешает проверке. (выделение ошибочных мест в DDL будет позже, сейчас можно заметить, что поля из таблицы b не попали в экспорт типов).
Часто спрашивают - почему не подсвечивается отсутствующая таблица в запросе? Сейчас мы не ориентируемся на разработчиков, а у DBA не бывает невалидных запросов :) Но справедливости ради, это правило находится в процессе разработки и нашлись corner cases, которые требуют доработки парсера :)
К слову, если у вас есть экспертиза в AST-парсерах, я был бы рад пообщаться (@antonrevyako)
AR, который смог (взято у @honestmarketing)
Согласен с автором на все 100 - в образовании AR самое место. Даже на текущем уровне развития технологий.
PS: Так же автор вспоминает боль от изучения астрономии по плоским учебникам. А я недавно рассказывал о сайте с красивым 3d на тему астрономии - https://news.1rj.ru/str/nosingularity/491
Согласен с автором на все 100 - в образовании AR самое место. Даже на текущем уровне развития технологий.
PS: Так же автор вспоминает боль от изучения астрономии по плоским учебникам. А я недавно рассказывал о сайте с красивым 3d на тему астрономии - https://news.1rj.ru/str/nosingularity/491
Раньше, когда мне приходилось нанимать людей, я страдал. Все джоб-порталы делали каки-то вредители.
Например, если ты как работодатель хочешь на hh разместить вакансию в нескольких регионах, то это будут отдельные вакансии, даже если ты ищешь удаленного сотрудника.
Т.е. вот прям отдельные. Размещаешь 5 вакансий в 10 регионах и получаешь 50 отдельных сущностей, отклики на которые надо просматривать, переключаясь по объявлениям.
Но соискателю еще сложнее. З.п. не указана, указана, но до налогов (каких налогов - хз), релокейт/не релокейт. Короче, фу.
Хабровский "мой круг" тоже со своими затеями. Мне до сих пор приходит "подходящая мне" вакансия с последнего места работы, которую я писал собственноручно пару лет назад.
Или предлагается пойти мидлом на php.
На нескольких профильных каналах в телеге тоже какая-то шляпа :(
Поэтому даже если бы админы @profunctor_io не задумали старый добрый взаимопиар, про их канал с вакансиями стоило бы рассказать при случае :)
Собственно вот: @profunctor_jobs
Стек, деньги, ремоут или офис и описание. Коротенько в канале, подробнее на сайте. Разместить вакансию можно бесплатно.
Например, если ты как работодатель хочешь на hh разместить вакансию в нескольких регионах, то это будут отдельные вакансии, даже если ты ищешь удаленного сотрудника.
Т.е. вот прям отдельные. Размещаешь 5 вакансий в 10 регионах и получаешь 50 отдельных сущностей, отклики на которые надо просматривать, переключаясь по объявлениям.
Но соискателю еще сложнее. З.п. не указана, указана, но до налогов (каких налогов - хз), релокейт/не релокейт. Короче, фу.
Хабровский "мой круг" тоже со своими затеями. Мне до сих пор приходит "подходящая мне" вакансия с последнего места работы, которую я писал собственноручно пару лет назад.
Или предлагается пойти мидлом на php.
На нескольких профильных каналах в телеге тоже какая-то шляпа :(
Поэтому даже если бы админы @profunctor_io не задумали старый добрый взаимопиар, про их канал с вакансиями стоило бы рассказать при случае :)
Собственно вот: @profunctor_jobs
Стек, деньги, ремоут или офис и описание. Коротенько в канале, подробнее на сайте. Разместить вакансию можно бесплатно.
Пока мы спали, Маск представил свой нейролинк:
https://www.youtube.com/watch?v=DVvmgjBL74w
Специальный робот сверлит череп, вставляет в мозг электроды и оставляет на макушке чип и разъем для зарядки.
Конектится по блютусу к айфону.
Данные можно читать и писать.
Выглядит максимально крипово :)
Они экспериментировали на свиньях и научились делать предсказания движения мышц по этим сигналам.
Вот, казалось бы, сингулярность as is.
Но первые вопросы были - можно ли будет через эту штуку рулить теслой и шпилить в доту...
До конкретных применений еще далеко, но вангую, что года через 2-3 они увеличат скорость и функционал и откроют апи. Апи, Карл!
Я еще q# не успел посмотреть, а тут это...
Маск говорит, что можно будет музыку стримить сразу в мозг, записывать и воспроизводить мысли. Ну и AR/VR, куда же без него...
Все ждали, что их чипирует Гейтс, а чипирует Маск. Какой удар от классика (c) :)
PS: без шапки зимой не походишь, будет глючить :)
https://www.youtube.com/watch?v=DVvmgjBL74w
Специальный робот сверлит череп, вставляет в мозг электроды и оставляет на макушке чип и разъем для зарядки.
Конектится по блютусу к айфону.
Данные можно читать и писать.
Выглядит максимально крипово :)
Они экспериментировали на свиньях и научились делать предсказания движения мышц по этим сигналам.
Вот, казалось бы, сингулярность as is.
Но первые вопросы были - можно ли будет через эту штуку рулить теслой и шпилить в доту...
До конкретных применений еще далеко, но вангую, что года через 2-3 они увеличат скорость и функционал и откроют апи. Апи, Карл!
Я еще q# не успел посмотреть, а тут это...
Маск говорит, что можно будет музыку стримить сразу в мозг, записывать и воспроизводить мысли. Ну и AR/VR, куда же без него...
Все ждали, что их чипирует Гейтс, а чипирует Маск. Какой удар от классика (c) :)
PS: без шапки зимой не походишь, будет глючить :)
Forwarded from Технологический Болт Генона
Помните историю о том, как парни логику в базу перетащили?https://twitter.com/SanSYS/status/1299657208934916097
Вплоть до формирования json в базе данных, т.к. БД типа отлично умеет это делать ))
Я решил глянуть работу их API и результат меня позабавил
го в тредик )
Это просто отлично
Пятничный SQL-WTF
Понедельничный SQL-TIL
"Хочешь разобраться в чём-то - напиши статью"
Когда я начинал работать над текущим проектом, я программировал уже около 25 лет и с базами данных работал больше 20 из них.
Казалось, что я видел большую часть проблем, связанных с разработкой на SQL.
Но стандарт SQL и частные его реализации не перестают удивлять меня до сих пор.
Сегодня я поделюсь с вами несколькими внезапными синтаксическими конструкциями и неочевидным поведением.
По понятным причинам тестировалось это все в PostgreSQL, но большая часть будет работать и в других базах.
Скорее всего вы никогда не столкнетесь с таким синтаксисом в реальной жизни. Но зато сможете блеснуть эрудицией перед своими коллегами :)
1 wtf из 5 - пустые таблицы
Можно создать таблицу совсем без колонок. Или удалить все колонки из таблицы. И это не ошибка.
Зачем это может быть нужно я придумать не смог, но на всякий случай у нас об этом есть notice :)
2 wtf из 5 - системные колонки и зарезервированные слова
В каждой таблице в PostgreSQL есть специальные колонки tableoid, xmin, cmin, xmax, cmax, ctid, которые создаются автоматически и содержат системную информацию о строках.
Создавать свои колонки с такими именами запрещено. Значения из этих колонок можно читать, но изменять ни значение, ни сами колонки нельзя.
Но если про системные колонки база вам любезно сообщит, то использование зарезервированных слов без кавычек вызывает ошибку парсинга и не всегда можно понять что вообще происходит.
Валидно
Но, что и предсказуемо, ORM ничего не знает про системные колонки и ошибку вы получите уже в рантайме применения миграции.
Все это может показаться ерундой, но наверняка много страданий принесет при необходимости в переезде с одной базы на другую. Например, в процессе импортозамещения.
В идеале стоило бы избегать зарезервированных имен из всех стандартов SQL. И у есть нас соответствующий notice.
3 wtf из 5 - сокращенный синтаксис для SELECT * FROM tbl
Можно короче? Да изи!
4 wtf из 5 - SELECT tbl FROM tbl
Если в таблице нет поля, имя которого совпадает с именем таблицы, то следующие два запроса будут эквивалентны
Возможно не все знают, но такие кортежи можно сравнивать.
Это очень удобно, когда нужно сравнить попарно несколько наборов значений.
Не считая того, что такой синтаксис может ввести не очень опытных разработчиков в заблуждение и затруднит чтение запросов, такой подход так же вреден как, и SELECT *.
Поэтому мы сделали warning.
5 wtf из 5 - замена имен полей в подзапросах
Если подзапрос возвращает одно поле (field1) и это поле сравнивается во внешнем условии с полем field2, то из первого подзапроса можно вернуть поле с именем field2:
Такого поворота не ожидал даже я...
Мы об этом пока не предупреждаем, но обязательно будем.
Это, конечно же, не все, чем я могу вас удивить :) Продолжение в следующих сериях :)
"Хочешь разобраться в чём-то - напиши статью"
Когда я начинал работать над текущим проектом, я программировал уже около 25 лет и с базами данных работал больше 20 из них.
Казалось, что я видел большую часть проблем, связанных с разработкой на SQL.
Но стандарт SQL и частные его реализации не перестают удивлять меня до сих пор.
Сегодня я поделюсь с вами несколькими внезапными синтаксическими конструкциями и неочевидным поведением.
По понятным причинам тестировалось это все в PostgreSQL, но большая часть будет работать и в других базах.
Скорее всего вы никогда не столкнетесь с таким синтаксисом в реальной жизни. Но зато сможете блеснуть эрудицией перед своими коллегами :)
1 wtf из 5 - пустые таблицы
Можно создать таблицу совсем без колонок. Или удалить все колонки из таблицы. И это не ошибка.
Зачем это может быть нужно я придумать не смог, но на всякий случай у нас об этом есть notice :)
2 wtf из 5 - системные колонки и зарезервированные слова
В каждой таблице в PostgreSQL есть специальные колонки tableoid, xmin, cmin, xmax, cmax, ctid, которые создаются автоматически и содержат системную информацию о строках.
Создавать свои колонки с такими именами запрещено. Значения из этих колонок можно читать, но изменять ни значение, ни сами колонки нельзя.
Но если про системные колонки база вам любезно сообщит, то использование зарезервированных слов без кавычек вызывает ошибку парсинга и не всегда можно понять что вообще происходит.
Валидно
CREATE TABLE "all" (a INT);Не валидно
CREATE TABLE all (a INT);Это причина, по которой все ORM генерируют запросы с кавычками для имен таблиц и колонок.
Но, что и предсказуемо, ORM ничего не знает про системные колонки и ошибку вы получите уже в рантайме применения миграции.
Все это может показаться ерундой, но наверняка много страданий принесет при необходимости в переезде с одной базы на другую. Например, в процессе импортозамещения.
В идеале стоило бы избегать зарезервированных имен из всех стандартов SQL. И у есть нас соответствующий notice.
3 wtf из 5 - сокращенный синтаксис для SELECT * FROM tbl
Можно короче? Да изи!
TABLE tblНикаких дополнительных условий этот синтаксис не предполагает.
4 wtf из 5 - SELECT tbl FROM tbl
Если в таблице нет поля, имя которого совпадает с именем таблицы, то следующие два запроса будут эквивалентны
SELECT tbl FROM tbl;И даже больше!
SELECT ROW(tbl.*) FROM tbl;
SELECT * FROM tbl1, tbl2 WHERE tbl1 = tbl2;ROW() - создает тип RECORD. Это кортеж, содержащий значение всех колонок по очереди их следования в источнике данных.
SELECT * FROM tbl1, tbl2 WHERE ROW(tbl1) = ROW(tbl2);
Возможно не все знают, но такие кортежи можно сравнивать.
Это очень удобно, когда нужно сравнить попарно несколько наборов значений.
Не считая того, что такой синтаксис может ввести не очень опытных разработчиков в заблуждение и затруднит чтение запросов, такой подход так же вреден как, и SELECT *.
Поэтому мы сделали warning.
5 wtf из 5 - замена имен полей в подзапросах
Если подзапрос возвращает одно поле (field1) и это поле сравнивается во внешнем условии с полем field2, то из первого подзапроса можно вернуть поле с именем field2:
WITH a(field1) AS (oO
VALUES(1)
),
b(field2) AS (
VALUES(1)
)
SELECT * FROM b WHERE field2 IN (SELECT field2 FROM a)
Такого поворота не ожидал даже я...
Мы об этом пока не предупреждаем, но обязательно будем.
Это, конечно же, не все, чем я могу вас удивить :) Продолжение в следующих сериях :)