Все тут пишут, на сколько полезны стали ИИ как инструмент для разработчиков. Но другую сторону разработки - обучению этой же самой разработке в век ИИ - как-то обходят стороной. Однако, в одном из рабочих чатов, недавно обсуждали, как же круто учиться с помощью ИИ, потому что его можно заебывать тупыми вопросами до бесконечности. И это имеет место. Но, на мой взгляд, заебывать ИИ вопросами != обучение. Хоть это и может быть его частью.
Обучение - это сложный процесс. Как минимум надо учитывать, что подходы для обучения детей и взрослых (педагогика и андрагогика) очень отличаются. И в каждой области свои специалисты. Но есть у них и общее, кмк, а именно цель. Цель обучения - это овладение навыком.
И я считаю, что навыком можно овладеть только через практику. Поэтому все эти ваши книги по программированию хороши только, если у вас есть практика, на которую можно это все приземлить. Если ее нету, то оно как войдет, так и выйдет, словно огурец в кабинете у хирурга😂 Но можно будет выебнуться при друзьях, что вот томик Кнута осилил пролистал.
Поэтому я думаю, что обучение на книжках - это иллюзия. Ну только если эта книжка не учебник с упражнениями.
У меня особенно эта иллюзия проявляется, когда я пытаюсь пользоваться новым фреймворком или либой, и начинаю доку активно читать. Сидишь такой, вроде все понятно. Сел писать код - ноль целых, хуй десятых. Ничо не можешь написать. Ну это раньше было. Щас то я уже не учу новые фреймворки. Смысла ноль, работу все равно не поменять
Поэтому, только практика. Только руками поработать, если вы понимаете, о чем я😉
И причем здесь ИИ? а при том, что ИИ очень-очень усложняет вот это "руками поработать". Слишком велик соблазн просто попросить решить задачу ИИ. А затем, ты попросишь эту ИИ полностью объяснить тебе решение. И он объяснит. А самое страшное, что после этого у тебя возникнет ощущение, что ты все понял и чему-то научился. А ты нихера не научился на самом деле.
Эта иллюзия сравнима с тем, что ты воспользовался решебником в школе. Я не знаю, есть ли щас решебники у школьников, но в моем дестве они были. И если раньше найти решебник - это та еще задачка, то теперь этот решебник просто у тебя в кармане. Для практически любой задачи.
И на мой взгляд, это если не в корне, то очень сильно меняет индустрию обучения и процесс самообразования. Потому что я не вижу никаких способов оградить себя от ИИ, как от решебника, за исключением собственного волевого компонента. И у взрослых сформированных людей тут гораздо больше шансов обернуть ИИ себе во благо в процессе обучения. Как быть с детьми - тут вообще я даже не представляю. Ну это пусть специалисты разбираются.
ИИ в образовании - это хороший пример диалектического принципа единства и борьбы противоположностей. С одной стороны, мы действительно получаем серьезный буст в узнавании информации, а с другой стороны, у нас появляется дополнительная преграда на пути к отработке навыка. И, похоже, что современное обучение - это борьба между этими сторонами, в которой наибольшую пользу для себя сможет получить тот, кто способен на самоограничения👆
В итоге, выходит, что даже в обучении ИИ - это отнюдь не серебряная пуля😔
Единственный свет в конце туннеля — это если нас всех заменит ИИ и нам не придется ничему учиться🤡 правда непонятно, а за что тогда будут платить зп, но это я потом подумаю
Обучение - это сложный процесс. Как минимум надо учитывать, что подходы для обучения детей и взрослых (педагогика и андрагогика) очень отличаются. И в каждой области свои специалисты. Но есть у них и общее, кмк, а именно цель. Цель обучения - это овладение навыком.
И я считаю, что навыком можно овладеть только через практику. Поэтому все эти ваши книги по программированию хороши только, если у вас есть практика, на которую можно это все приземлить. Если ее нету, то оно как войдет, так и выйдет, словно огурец в кабинете у хирурга
Поэтому я думаю, что обучение на книжках - это иллюзия. Ну только если эта книжка не учебник с упражнениями.
У меня особенно эта иллюзия проявляется, когда я пытаюсь пользоваться новым фреймворком или либой, и начинаю доку активно читать. Сидишь такой, вроде все понятно. Сел писать код - ноль целых, хуй десятых. Ничо не можешь написать. Ну это раньше было. Щас то я уже не учу новые фреймворки. Смысла ноль
Поэтому, только практика. Только руками поработать, если вы понимаете, о чем я😉
И причем здесь ИИ? а при том, что ИИ очень-очень усложняет вот это "руками поработать". Слишком велик соблазн просто попросить решить задачу ИИ. А затем, ты попросишь эту ИИ полностью объяснить тебе решение. И он объяснит. А самое страшное, что после этого у тебя возникнет ощущение, что ты все понял и чему-то научился. А ты нихера не научился на самом деле.
Эта иллюзия сравнима с тем, что ты воспользовался решебником в школе. Я не знаю, есть ли щас решебники у школьников, но в моем дестве они были. И если раньше найти решебник - это та еще задачка, то теперь этот решебник просто у тебя в кармане. Для практически любой задачи.
И на мой взгляд, это если не в корне, то очень сильно меняет индустрию обучения и процесс самообразования. Потому что я не вижу никаких способов оградить себя от ИИ, как от решебника, за исключением собственного волевого компонента. И у взрослых сформированных людей тут гораздо больше шансов обернуть ИИ себе во благо в процессе обучения. Как быть с детьми - тут вообще я даже не представляю. Ну это пусть специалисты разбираются.
ИИ в образовании - это хороший пример диалектического принципа единства и борьбы противоположностей. С одной стороны, мы действительно получаем серьезный буст в узнавании информации, а с другой стороны, у нас появляется дополнительная преграда на пути к отработке навыка. И, похоже, что современное обучение - это борьба между этими сторонами, в которой наибольшую пользу для себя сможет получить тот, кто способен на самоограничения👆
В итоге, выходит, что даже в обучении ИИ - это отнюдь не серебряная пуля😔
Единственный свет в конце туннеля — это если нас всех заменит ИИ и нам не придется ничему учиться🤡 правда непонятно, а за что тогда будут платить зп, но это я потом подумаю
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
Давно не было мемасов че-то, потому что я тут в запаре жоской. Но вот вам вместо мема реальный кейс.
Решил добавить новый тип подписки в эпп стор. Угарнул с того, что они тебе не позволяют установить любую цену. Будь добр, выбери прайс из списка доступных) обязательно шоб на 9ку заканчивалось!
Решил добавить новый тип подписки в эпп стор. Угарнул с того, что они тебе не позволяют установить любую цену. Будь добр, выбери прайс из списка доступных) обязательно шоб на 9ку заканчивалось!
😁10🤯1
Внимание! Далее в посте будет много ЧЛЕНОВ! поэтому, если у вас членонепереносимость, то лучше скипните!
Нашел вопрос, который не вывезли 3 из 4 нейронок.
В чем суть. Ковыряю систему привилегий в postgres. Наверное обычным разработчикам особо знать ничо не надо. Им креденшиалы выдали девопсы, и они пользуются. Я и сам такой, честно говоря😔
А между тем, там довольно непростая система ACL (ну кто бы блять сомневался). Там есть, так называемые роли (и они же пользователи😮). И есть понятие "членство" 😉 ролей.
Членство означает, что мы явно указали роль-группу, к которой будет принадлежать наша роль. Таким образом, можно гибко управлять правами множества ролей-пользователей через модификацию прав роли-группы, просто сделав их членами группы. Короче, включается (но не ограничвается этим) механизм наследования прав. Выглядит это так.
По умолчанию - это означает, что ator получит права admin (и станет adminator😮)
Но у команды CREATE ROLE есть флаг NOINHERIT. А у команды GRANT можно задать параметр WITH INHERIT FALSE. И тут начинается свистопляска. Потому что можно начать фантазировать, а как эти два флага, семантика которых очень близка, работают друг с другом. Кто-то может подумать, что отличным решением будет спросить нейронку. Ну и если выбор пиздлявого ящика ляжет на ChatGPT, то мои соболезнования.
Правильный ответ: флаг NOINHERIT отвечает за дефолтное поведение при добавлении членства, т.е. за поведение, когда не указан параметр WITH INHERIT при создании этого самого членства. На этом жоско погорел chatgpt (см. скриншот).
А вот дипсик, перплексити и клод корректно сказали, что это флаг управления дефолтным поведением членства. Только вот вопрос, а дефолтным поведением членства какой роли: той которую делают членом или той, куда эти самые члены вступают? И на этом этапе срезались дипсик и перплексити. Причем от перплексити я такого не ожидал. Ведь это поисковик.
Правильный ответ: NOINHERIT применяется для роли, которая станет членом. И WITH INHERIT принудительно включит или отключит наследование прав, и NOINHERET будет проигнорирован.
И только клод объяснил все правильно 🤷
Короче вся эта пиздабратия заставила меня напрягаться и проверять все самому. Хотя вот казалось бы, уже не первое поколение нейронок, но че то все еще не совсем меня заменяют. Жду дальше.
Нашел вопрос, который не вывезли 3 из 4 нейронок.
В чем суть. Ковыряю систему привилегий в postgres. Наверное обычным разработчикам особо знать ничо не надо. Им креденшиалы выдали девопсы, и они пользуются. Я и сам такой, честно говоря😔
А между тем, там довольно непростая система ACL (ну кто бы блять сомневался). Там есть, так называемые роли (и они же пользователи😮). И есть понятие "членство" 😉 ролей.
Членство означает, что мы явно указали роль-группу, к которой будет принадлежать наша роль. Таким образом, можно гибко управлять правами множества ролей-пользователей через модификацию прав роли-группы, просто сделав их членами группы. Короче, включается (но не ограничвается этим) механизм наследования прав. Выглядит это так.
CREATE ROLE admin;
CREATE ROLE ator;
GRANT admin TO ator;
По умолчанию - это означает, что ator получит права admin (и станет adminator😮)
Но у команды CREATE ROLE есть флаг NOINHERIT. А у команды GRANT можно задать параметр WITH INHERIT FALSE. И тут начинается свистопляска. Потому что можно начать фантазировать, а как эти два флага, семантика которых очень близка, работают друг с другом. Кто-то может подумать, что отличным решением будет спросить нейронку. Ну и если выбор пиздлявого ящика ляжет на ChatGPT, то мои соболезнования.
Правильный ответ: флаг NOINHERIT отвечает за дефолтное поведение при добавлении членства, т.е. за поведение, когда не указан параметр WITH INHERIT при создании этого самого членства. На этом жоско погорел chatgpt (см. скриншот).
А вот дипсик, перплексити и клод корректно сказали, что это флаг управления дефолтным поведением членства. Только вот вопрос, а дефолтным поведением членства какой роли: той которую делают членом или той, куда эти самые члены вступают? И на этом этапе срезались дипсик и перплексити. Причем от перплексити я такого не ожидал. Ведь это поисковик.
Правильный ответ: NOINHERIT применяется для роли, которая станет членом. И WITH INHERIT принудительно включит или отключит наследование прав, и NOINHERET будет проигнорирован.
И только клод объяснил все правильно 🤷
Короче вся эта пиздабратия заставила меня напрягаться и проверять все самому. Хотя вот казалось бы, уже не первое поколение нейронок, но че то все еще не совсем меня заменяют. Жду дальше.
🙈3❤2🔥1
Сегодня стартовала очередная Poglodka Crew, посвященая экосистеме PHP. И Несмотря на то, что в php лучшая экосистема среди всех языков, с которыми мне довелось работать, в ней существует довольно серьезный проеб, который я хотел бы подсветить, пользуясь случаем.
Дело в том, что php все еще поставляется без дебагера =( Ой, не-не, не кидайте в меня тапками. Я знаю про phpdbg. Но я щас говорю про дебаггер, которым можно пользоваться в работе. И это third-party расширение Xdebug, которое всегда ставится и настраивается отдельно.
Когда ты уже дохера опытный пыхарь, ты вообще забываешь, что такая проблема существует. Да для тебя это будто бы и не проблема. Но с точки зрения новичка, это может быть лютым стрессом. Хотя, справедливости ради, отмечу, что шторм довольно неплохо справляется с установкой самого расширения на макос в один клик. Про другие ОС не скажу.
Тем не менее, php 8.5 вот вышел в ноябре, а дебаггер для него зарелизили только спустя 2 недели🤷странновато
Ну это ладно. Самые большие проблемы для меня в том, что xdebugger ОЧЕНЬ часто генерит segmentation faults. И если на симфони я с этим практически не сталкиваюсь, то на ларке это происходит прям регулярно. И это пиздец раздражает. Последний раз я ковырялся с ларавелем год назад, и мне пришлось 3 версии иксдебаггера перебрать, чтоб смочь нормально работать 😔 просто охуительный девелопмнет экспириенс
Благо, что я не один такой. И есть люди, которые не просто любят поныть, как я, а делают дело💪 И я тут наткнулся на проект, который я не могу пока что рекомендовать, потому что сам не пользовался, но за которым я собираюсь пристально следить.
Называется ddless. Чувака тоже заебала вся эта клоунада с xdebuggerом и он написал свой. Причем тут интересен и сам инженерный подход. Вот как написать дебаггер без нативного расширения и чтоб не надо было ничо ставить в пыху? Да просто берем и вставляем вызов специальной функции перед каждой строчкой кода прям на лету. Изи! Ведь php легко (ну ладно, не легко) позволяет модифицировать код перед исполнением средствами самого php через переопределение стрима.
Также он принял осознанное архитектурное решение, чтоб вся коммуникация UI дебаггера и самого дебаггера была сделана через файл, а не через какой-то сетевой протокол. Чтоб было неважно, где ты запускаешь свой код - локально, в докере или на удаленном серваке - файл всегда будет под рукой. Подробнее о мотивации и технических решениях можно почитать в блоге автора.
Единственный минус, это то, что надо ставить отдельное десктопное приложение чисто для этого дебаггера. Так оно еще и написано на электроне😔Было б на бозоне - вообще вопросов не было.
Поэтому пока что я жду, когда он зарелизит расширение для IDE, и продолжаю наблюдать за проектом. Спасибо за внимание.
Дело в том, что php все еще поставляется без дебагера =( Ой, не-не, не кидайте в меня тапками. Я знаю про phpdbg. Но я щас говорю про дебаггер, которым можно пользоваться в работе. И это third-party расширение Xdebug, которое всегда ставится и настраивается отдельно.
Когда ты уже дохера опытный пыхарь, ты вообще забываешь, что такая проблема существует. Да для тебя это будто бы и не проблема. Но с точки зрения новичка, это может быть лютым стрессом. Хотя, справедливости ради, отмечу, что шторм довольно неплохо справляется с установкой самого расширения на макос в один клик. Про другие ОС не скажу.
Тем не менее, php 8.5 вот вышел в ноябре, а дебаггер для него зарелизили только спустя 2 недели🤷странновато
Ну это ладно. Самые большие проблемы для меня в том, что xdebugger ОЧЕНЬ часто генерит segmentation faults. И если на симфони я с этим практически не сталкиваюсь, то на ларке это происходит прям регулярно. И это пиздец раздражает. Последний раз я ковырялся с ларавелем год назад, и мне пришлось 3 версии иксдебаггера перебрать, чтоб смочь нормально работать 😔 просто охуительный девелопмнет экспириенс
Благо, что я не один такой. И есть люди, которые не просто любят поныть, как я, а делают дело💪 И я тут наткнулся на проект, который я не могу пока что рекомендовать, потому что сам не пользовался, но за которым я собираюсь пристально следить.
Называется ddless. Чувака тоже заебала вся эта клоунада с xdebuggerом и он написал свой. Причем тут интересен и сам инженерный подход. Вот как написать дебаггер без нативного расширения и чтоб не надо было ничо ставить в пыху? Да просто берем и вставляем вызов специальной функции перед каждой строчкой кода прям на лету. Изи! Ведь php легко (ну ладно, не легко) позволяет модифицировать код перед исполнением средствами самого php через переопределение стрима.
Также он принял осознанное архитектурное решение, чтоб вся коммуникация UI дебаггера и самого дебаггера была сделана через файл, а не через какой-то сетевой протокол. Чтоб было неважно, где ты запускаешь свой код - локально, в докере или на удаленном серваке - файл всегда будет под рукой. Подробнее о мотивации и технических решениях можно почитать в блоге автора.
Единственный минус, это то, что надо ставить отдельное десктопное приложение чисто для этого дебаггера. Так оно еще и написано на электроне😔Было б на бозоне - вообще вопросов не было.
Поэтому пока что я жду, когда он зарелизит расширение для IDE, и продолжаю наблюдать за проектом. Спасибо за внимание.
🤔6👍1
Пару недель назад после 5 лет обсуждений питон сообщество приняло наконец PEP 661, который называется Sentinel Values. И я считаю, что это очень круто!
Что же такое эти ваши сентинел вальюс? Разберемся на примере. Так у нас сейчас обстоит дело с доступом по ключу у словаря.
Но что, если словарь выглядит так
или так
В обоих случаях v будет None. Но у этих None разная семантика: в одном случае это валидное значение, а в другом - его отсутствие.
Ну и помимо словарей, такое различие в семантике может встречаться и в объявлении аргументов функций, и в возвращаемых значениях, и даже в типах свойств объектов.
И чтоб данное противоречие разрешить сейчас приходится что нибудь изобретать в виде енума Empty с единственным элементом или (о, ужас) использовать EllipsisType (тип, обозначающий спец-символ "...").
Но с принятиям этого пепа теперь можно сделать иначе
Короче говоря, это специальные значения, у которых есть одно важное своейство — они могут использоваться в аннотациях типов🤩
Мне кажется, это очень круто!
Но прикол в том, что все примеры использования этого PEP сводятся именно к реализации концепции неопределенного значения. Я вот так не смог с ходу придумать другое применение, чтоб потребовалось определить несколько таких значений. Это всегда missing data так или иначе. Да у них даже в PEP самом 3 юз кейса и все об одном.
И на сколько я понял, в ядре не будет никакого предопределенного значения MISSING. Мы должны будем сами каждый раз определять его, в нашем коде. В целом, дали больше гибкости и не стали ломать обратную совместимость введением глобального undefined. Вроде збс! Но люди все равно чем-то недовольны. Понимаю их 😊
На самом деле, мне очень не хватает подобного в пыхе. Ведь у нас везде блин jsonы туда сюда летают. А в json объекте ключ может как просто отсутствовать, так и быть null. И тот же самый симфонивский пейлоад маппер все это маппит в null. Но отсутствие значения в запросе на обновление может означать "оставь все как есть", а не сброс в null 😔 В итоге уже 5 лет гоняю на проекте кастомный враппер значений, позволяющий вот эту семантику различить.
Но может я один страдаю с этим из-за легаси, и больше ни у кого таких проблем не возникает? 🤔
Что же такое эти ваши сентинел вальюс? Разберемся на примере. Так у нас сейчас обстоит дело с доступом по ключу у словаря.
d = {"key": "val"}
# Можно так, но тогда можно словить KeyError, если ключ отсутствует
v = d["key"]
# Поэтому так. Если ключ отсутствует, будет None
v = d.get("key", None)
Но что, если словарь выглядит так
d = {'key': None}
или так
d = {}
В обоих случаях v будет None. Но у этих None разная семантика: в одном случае это валидное значение, а в другом - его отсутствие.
Ну и помимо словарей, такое различие в семантике может встречаться и в объявлении аргументов функций, и в возвращаемых значениях, и даже в типах свойств объектов.
И чтоб данное противоречие разрешить сейчас приходится что нибудь изобретать в виде енума Empty с единственным элементом или (о, ужас) использовать EllipsisType (тип, обозначающий спец-символ "...").
Но с принятиям этого пепа теперь можно сделать иначе
MISSING = sentinel("MISSING")
v = d.get("key", MISSING)
Короче говоря, это специальные значения, у которых есть одно важное своейство — они могут использоваться в аннотациях типов🤩
MISSING = sentinel('MISSING')
def foo(value: int | MISSING = MISSING) -> int:
...
Мне кажется, это очень круто!
Но прикол в том, что все примеры использования этого PEP сводятся именно к реализации концепции неопределенного значения. Я вот так не смог с ходу придумать другое применение, чтоб потребовалось определить несколько таких значений. Это всегда missing data так или иначе. Да у них даже в PEP самом 3 юз кейса и все об одном.
И на сколько я понял, в ядре не будет никакого предопределенного значения MISSING. Мы должны будем сами каждый раз определять его, в нашем коде. В целом, дали больше гибкости и не стали ломать обратную совместимость введением глобального undefined. Вроде збс! Но люди все равно чем-то недовольны. Понимаю их 😊
На самом деле, мне очень не хватает подобного в пыхе. Ведь у нас везде блин jsonы туда сюда летают. А в json объекте ключ может как просто отсутствовать, так и быть null. И тот же самый симфонивский пейлоад маппер все это маппит в null. Но отсутствие значения в запросе на обновление может означать "оставь все как есть", а не сброс в null 😔 В итоге уже 5 лет гоняю на проекте кастомный враппер значений, позволяющий вот эту семантику различить.
Но может я один страдаю с этим из-за легаси, и больше ни у кого таких проблем не возникает? 🤔
Python Enhancement Proposals (PEPs)
PEP 661 – Sentinel Values | peps.python.org
Unique placeholder values, commonly known as “sentinel values”, are common in programming. They have many uses, such as for:
🔥4
Мое внутреннее ощущение, что ллмки достигли своего пика точеного. Иногда мне даже кажется, что некоторые модели даунгрейдят. Например, соннет будто бы стал прям хуже, чем год назад. Возможно это связано с тем, что anthropic надо продавать опус.
Че, как у вас? Нет ощущения, что уже сильно лучше не будет?
Че, как у вас? Нет ощущения, что уже сильно лучше не будет?
❤3
Давно у меня не горело сзади, но седня я просто кричал криком в монитор! 😡
Все дело в doctrine orm и в ебучих таймзонах.
Я самый несчастный человек на земле, когда дело касается базы данных. Потому что у нас на проекте до сих пор mysql - основная бд 😔 Фан факт про mysql - долгое время эта СУБД не позволяла хранить таймзоны в полях с датами. Ситуация изменилась только в 2020м с версией 8.0.19. Там добавили возможность хранить смещение в поле с датой.
Но суть даже не в этом. Открываем доку доктрины по типам. Там мы можем увидеть следующие типы, касательно времени: datetime, datetime_immutable, datetimetz, datetimetz_immutable. Впринципи любой более менее программистский человек по названию может догадаться, о чем каждый из этих типов.
У меня пользователи в разных таймзонах, и важно точное время события. Поэтому таймзоны я не могу отбросить, и я должен использовать datetimetz. Ведь в описании написано
> Maps and converts date with time and timezone information data. If you know that the data to be stored always contains date, time and timezone information, you should consider using this type.
О боже, это же мой сценарий!
Ну и поскольку я как минимум миддл пхп девелопер, окончательный выбор падает на datetimetz_immutable.
Также под типом datetimetz можно увидеть предупреждение о том, что не все СУБД поддерживают хранения таймзон, поэтому результат чтения может не совпадать с записью. Типа вставили 1986-22-03 19:45:30-03:00, а прочитали 1986-22-03 22:45:30-00:00. В целом это понятно, и мне ок!
Каково же было мое удивление, когда я обнаружил, что доктрина просто на похуй отбрасывает таймзону и сохраняет значение как есть! То есть, сохраняю я например текущую дату 2026-05-18 10:40:50 в таймзоне America/Toronto. В бд я вижу значение 2026-05-18 10:40:50. Без таймзоны. Загружаю сущность после
получаю ту же самую дату в москве. Просто херак и проебал 7 часов на ровном месте.
По факту datetimetz не хэндлит таймзоны! Меняю тип на datetime - поведение не отличается! И в коде все одинаково для обоих типов. Ну пиздейшн конечно!
И я сижу такой обосравшийся и не понимаю, почему мои ожидания, что тип datetimetz конвертнет дату в utc перед сохранением и из utc при загрузке, оказались на столько завышенными. И нахуя этот тип тогда нужен! И почему в mysql уже 6 лет как поддерживаются таймзоны, а доктрина их не сохраняет!
Не ну это не самое прикольное. Самое прикольное, как раз то, что есть страница в доке Working with DateTime Instances, где и описывается подход с конвертацией в/из utc при сохранении/загрузке. И говорится, что это тру вей (с чем трудно спорить). В качестве решения предлагается мне самому написать кастомный тип, который это бы делал🤡 и даже код этого типа предоставили, чтоб я скопипастил.
Но почему не включить этот тип по умолчанию в доктрину!!! Почему написать о подходе в доке, предоставить код для копипасты - это тру вей! 😡
Эх, столько "почему" сегодня. Я устал😔
Все дело в doctrine orm и в ебучих таймзонах.
Я самый несчастный человек на земле, когда дело касается базы данных. Потому что у нас на проекте до сих пор mysql - основная бд 😔 Фан факт про mysql - долгое время эта СУБД не позволяла хранить таймзоны в полях с датами. Ситуация изменилась только в 2020м с версией 8.0.19. Там добавили возможность хранить смещение в поле с датой.
Но суть даже не в этом. Открываем доку доктрины по типам. Там мы можем увидеть следующие типы, касательно времени: datetime, datetime_immutable, datetimetz, datetimetz_immutable. Впринципи любой более менее программистский человек по названию может догадаться, о чем каждый из этих типов.
У меня пользователи в разных таймзонах, и важно точное время события. Поэтому таймзоны я не могу отбросить, и я должен использовать datetimetz. Ведь в описании написано
> Maps and converts date with time and timezone information data. If you know that the data to be stored always contains date, time and timezone information, you should consider using this type.
О боже, это же мой сценарий!
Ну и поскольку я как минимум миддл пхп девелопер, окончательный выбор падает на datetimetz_immutable.
Также под типом datetimetz можно увидеть предупреждение о том, что не все СУБД поддерживают хранения таймзон, поэтому результат чтения может не совпадать с записью. Типа вставили 1986-22-03 19:45:30-03:00, а прочитали 1986-22-03 22:45:30-00:00. В целом это понятно, и мне ок!
Каково же было мое удивление, когда я обнаружил, что доктрина просто на похуй отбрасывает таймзону и сохраняет значение как есть! То есть, сохраняю я например текущую дату 2026-05-18 10:40:50 в таймзоне America/Toronto. В бд я вижу значение 2026-05-18 10:40:50. Без таймзоны. Загружаю сущность после
date_default_timezone_set('Europe/Moscow');
получаю ту же самую дату в москве. Просто херак и проебал 7 часов на ровном месте.
По факту datetimetz не хэндлит таймзоны! Меняю тип на datetime - поведение не отличается! И в коде все одинаково для обоих типов. Ну пиздейшн конечно!
И я сижу такой обосравшийся и не понимаю, почему мои ожидания, что тип datetimetz конвертнет дату в utc перед сохранением и из utc при загрузке, оказались на столько завышенными. И нахуя этот тип тогда нужен! И почему в mysql уже 6 лет как поддерживаются таймзоны, а доктрина их не сохраняет!
Не ну это не самое прикольное. Самое прикольное, как раз то, что есть страница в доке Working with DateTime Instances, где и описывается подход с конвертацией в/из utc при сохранении/загрузке. И говорится, что это тру вей (с чем трудно спорить). В качестве решения предлагается мне самому написать кастомный тип, который это бы делал🤡 и даже код этого типа предоставили, чтоб я скопипастил.
Но почему не включить этот тип по умолчанию в доктрину!!! Почему написать о подходе в доке, предоставить код для копипасты - это тру вей! 😡
Эх, столько "почему" сегодня. Я устал😔
Please open Telegram to view this post
VIEW IN TELEGRAM
www.doctrine-project.org
Types - Doctrine Database Abstraction Layer (DBAL)
Doctrine Database Abstraction Layer Documentation: Types
🔥7💔5😁2❤1
удар в псину 🐶 от вардампа!
вардамп был выбран для hell2shape, потому что он
* есть у всех
* провайдит типы
И, казалось бы, все хорошо.
Но я не знаю, как так получилось, но мы с клодом пропустили капец важный корнер кейс. аж стыдно!😢
дело в том, что вардамп не экранирует двойные кавычки. и получается как-то так.
ну и как бы все! лексер сломан! идея о том, что мы одной регуляркой распарсим все на токены сразу идет в очко.
И если щас кто-то скажет "да ты просто не умеешь готовить регулярки" (что в целом правда), то как вам такое
разница только в цифрах в скобочках. и получается, что надо по-хорошему добавлять препроцессор, и только потом уже в лексер все это пихать😔
и удивительно, что сколько я не пользовался сам hell2shape, я ни разу с этой багой не столкнулся. но мне открыли issue, и я такой "блять как это можно было пропустить" и буквально на следующий день я уже сам это словил. сук.
пока закинул фикс с positive lookahead на пустую строку после кавычки. ну теперь лексер ломается только если кавычка с переносом строки.
но блэт, как так! мне кажется это охереть, как показательно, что если ты тест кейсы отдаешь на откуп ллмке, то в итоге, можно обнаружить себя в очке. Потому что, вот честно, я вообще не включал голову, когда мне клод тесты генерил. Ток мельком читал их, за что и получил удар в кабину.
С другой стороны, может быть, если бы я об этом кейсе знал, я бы до сих пор ничо не выпустил😂
вардамп был выбран для hell2shape, потому что он
* есть у всех
* провайдит типы
И, казалось бы, все хорошо.
Но я не знаю, как так получилось, но мы с клодом пропустили капец важный корнер кейс. аж стыдно!😢
дело в том, что вардамп не экранирует двойные кавычки. и получается как-то так.
$v = ['k' => 'v"v'];
var_dump($v);
array(1) {
["k"]=>
string(3) "v"v"
}
ну и как бы все! лексер сломан! идея о том, что мы одной регуляркой распарсим все на токены сразу идет в очко.
И если щас кто-то скажет "да ты просто не умеешь готовить регулярки" (что в целом правда), то как вам такое
$a = [
'govno' => 'жопа"
["лох"]=>
string(8) "тигр',
];
$b = ['govno' => 'жопа', 'лох' => 'тигр'];
var_dump($a, $b);
array(1) {
["govno"]=>
string(46) "жопа"
["лох"]=>
string(8) "тигр"
}
array(2) {
["govno"]=>
string(8) "жопа"
["лох"]=>
string(8) "тигр"
}
разница только в цифрах в скобочках. и получается, что надо по-хорошему добавлять препроцессор, и только потом уже в лексер все это пихать😔
и удивительно, что сколько я не пользовался сам hell2shape, я ни разу с этой багой не столкнулся. но мне открыли issue, и я такой "блять как это можно было пропустить" и буквально на следующий день я уже сам это словил. сук.
пока закинул фикс с positive lookahead на пустую строку после кавычки. ну теперь лексер ломается только если кавычка с переносом строки.
но блэт, как так! мне кажется это охереть, как показательно, что если ты тест кейсы отдаешь на откуп ллмке, то в итоге, можно обнаружить себя в очке. Потому что, вот честно, я вообще не включал голову, когда мне клод тесты генерил. Ток мельком читал их, за что и получил удар в кабину.
С другой стороны, может быть, если бы я об этом кейсе знал, я бы до сих пор ничо не выпустил
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8❤1🐳1
о! кстати, а знаете, еще в чем показательность этого кейса. я ж поделился со своим напраником, клодом, нашим фиаско. говорю, мол, так и так, двойные кавычки сгубили.
И клод мне как давай накидывать решения! какие-то страшные регулярки подсовывать со словами "вот это точно все зафиксит! нет? а может вот эта регулярка? ща-ща, еще че нить придумаю"
так и не смог пацан смириться, что задача не решается регулярками😔
и самое главное, клод даже не смог никакого альтернативного решения предложить. впал в регулярный цикл между регулярками и все. убеждал меняи себя, что вот эта-то регулярка точно окончательно решит все проблемы.
так шо, кожанные, мы все еще нужны иногда!
И клод мне как давай накидывать решения! какие-то страшные регулярки подсовывать со словами "вот это точно все зафиксит! нет? а может вот эта регулярка? ща-ща, еще че нить придумаю"
так и не смог пацан смириться, что задача не решается регулярками😔
и самое главное, клод даже не смог никакого альтернативного решения предложить. впал в регулярный цикл между регулярками и все. убеждал меня
так шо, кожанные, мы все еще нужны иногда!
❤4🔥3😁2
Сегодня немного пололировал с поста на реддите, где до чувака на собесе по golang докопались с вопросом о том, как реализовать перегрузку методов. Вот уж реально, когда на собесах не знают, как бы изъебнуться, чтоб... а я даже не знаю, чтобы что 🤷хуже только вопрос, почему канализационные люки круглые.
Но меня это навело на определенные мысли. Когда-то давно я начинал свой путь в айти с книги Брюса Эккеля про java. И я прям помню, как там много говорили про перегрузку методов, и как это круто. Ну я тогда ваще ничо не понимал в погромировании. Даже меньше, чем щас 😱 раз сказали, что это круто, значит круто. а. ну мы еще лабы на плюсах писали в универе с перегрузкой операторов.
С джавой у меня так и не задалось. Но код писать продолжил. И все это время писал на ЯП, которые не поддерживают перегрузку. А это кстати все популярные скриптовые языки. И даже не скриптовые (типа go, rust).
И вот щас будет наброс. Че то я не особо ощущаю какой-то дискомфорт от отсутствия перегрузки в бизнес коде. Мне кажется, это вообще самая переоцененная фича в ЯП.
Один пример, который можно набросить в качестве удобства перегрузки - это перегрузка конструктора. Ну типа, было бы удобно иметь у агрегата разные конструкторы - как разные источники происхождения агрегата. Но в целом, эта проблема решается через наследование.
С точки зрения типов, перегрузка это так называемы ad-hoc полиморфизм: конкретная реализация выбирается в зависимости от типов. И кажется, что это збс. Но по факту, хуйня. Ну используем мы одно и тоже слово в названии метода, и чо. Сэкономили на записи. Как это читать потом? Поди потом разберись, какая реализация тут отработала.
В языках без перегрузки у нас параметрический полимфорфизм, т.е. мы принимаем пачку типов на вход, на выходе также пачка типов, а реализация уже там разбирается, чо к чему. На первый взгляд кажется, что такой подход это больший пиздейшн. Но у нас же есть тулинг. Например, typescript поддерживает перегрузку функций. В phpstan есть conditional types. Да даже в ебучем mypy есть такое. И в целом, будто это норм. Когда читаем код, всегда прыгаем в конкретную реализацию. Хочешь другую реализацию для конктреного типа, ну напиши отдельный метод. Не еби мозги себе и другим 😡
Карочи, считаю, что собеседующий долбаеб. Желаю, чтоб его самого на собесе спросили, как реализовать абстрактные классы в го.
Но может собеседующий прав, и долбаеб я? Может реально все мечтают о перегрузке?🤔 вы скажите, кароч
Но меня это навело на определенные мысли. Когда-то давно я начинал свой путь в айти с книги Брюса Эккеля про java. И я прям помню, как там много говорили про перегрузку методов, и как это круто. Ну я тогда ваще ничо не понимал в погромировании. Даже меньше, чем щас 😱 раз сказали, что это круто, значит круто. а. ну мы еще лабы на плюсах писали в универе с перегрузкой операторов.
С джавой у меня так и не задалось. Но код писать продолжил. И все это время писал на ЯП, которые не поддерживают перегрузку. А это кстати все популярные скриптовые языки. И даже не скриптовые (типа go, rust).
И вот щас будет наброс. Че то я не особо ощущаю какой-то дискомфорт от отсутствия перегрузки в бизнес коде. Мне кажется, это вообще самая переоцененная фича в ЯП.
Один пример, который можно набросить в качестве удобства перегрузки - это перегрузка конструктора. Ну типа, было бы удобно иметь у агрегата разные конструкторы - как разные источники происхождения агрегата. Но в целом, эта проблема решается через наследование.
С точки зрения типов, перегрузка это так называемы ad-hoc полиморфизм: конкретная реализация выбирается в зависимости от типов. И кажется, что это збс. Но по факту, хуйня. Ну используем мы одно и тоже слово в названии метода, и чо. Сэкономили на записи. Как это читать потом? Поди потом разберись, какая реализация тут отработала.
В языках без перегрузки у нас параметрический полимфорфизм, т.е. мы принимаем пачку типов на вход, на выходе также пачка типов, а реализация уже там разбирается, чо к чему. На первый взгляд кажется, что такой подход это больший пиздейшн. Но у нас же есть тулинг. Например, typescript поддерживает перегрузку функций. В phpstan есть conditional types. Да даже в ебучем mypy есть такое. И в целом, будто это норм. Когда читаем код, всегда прыгаем в конкретную реализацию. Хочешь другую реализацию для конктреного типа, ну напиши отдельный метод. Не еби мозги себе и другим 😡
Карочи, считаю, что собеседующий долбаеб. Желаю, чтоб его самого на собесе спросили, как реализовать абстрактные классы в го.
Но может собеседующий прав, и долбаеб я? Может реально все мечтают о перегрузке?🤔 вы скажите, кароч
Reddit
From the golang community on Reddit
Explore this post and more from the golang community
👍8❤2