Давно у меня не горело сзади, но седня я просто кричал криком в монитор! 😡Все дело в 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 -
Похожие каналы
Все →Последние посты

Мое внутреннее ощущение, что ллмки достигли своего пика точеного. Иногда мне даже кажется, что некоторые модели даунгрейдят. Например, соннет будто бы стал прям хуже, чем год назад. Возможно это связано с тем, что anthropic надо продавать опус. Че, как у вас? Нет ощущения, что уже сильно лучше не будет?
Пару недель назад после 5 лет обсуждений питон сообщество приняло наконец PEP 661, который называется Sentinel Values. И я считаю, что это очень круто!Что же такое эти ваши сентинел вальюс? Разберемся на примере. Так у нас сейчас обстоит дело с доступом по ключу у словаря.d = {"key": "val"}# Можно так, но тогда можно словить KeyError, если ключ отсутствуетv = d["key"]# Поэтому так. Если ключ отсутствует, будет Nonev = 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. Вроде збс! Но люди все равно чем-то недовольны. Понимаю их 😊На самом деле, мне очень не

обсуждаем с клодом архитектуру я думаю, что клод по уровню интеллекта примерно как я, если я спал 3 часа. вот примерно такие же рассуждения у меня в голове проносятся

А я сегодня купил американо за 200 рублей! И заказал комплект постельного белья на озоне!
Сегодня стартовала очередная Poglodka Crew, посвященая экосистеме PHP. И Несмотря на то, что в php лучшая экосистема среди всех языков, с которыми мне довелось работать, в ней существует довольно серьезный проеб, который я хотел бы подсветить, пользуясь случаем.Дело в том, что php все еще поставляется без дебагера =( Ой, не-не, не кидайте в меня тапками. Я знаю про phpdbg. Но я щас говорю про дебаггер, которым можно пользоваться в работе. И это third-party расширение Xdebug, которое всегда ставится и настраивается отдельно.Когда ты уже дохера опытный пыхарь, ты вообще забываешь, что такая проблема существует. Да для тебя это будто бы и не проблема. Но с точки зрения новичка, это может быть лютым стрессом. Хотя, справедливости ради, отмечу, что шторм довольно неплохо справляется с установкой самого расширения на макос в один клик. Про другие ОС не скажу.Тем не менее, php 8.5 вот вышел в ноябре, а дебаггер для него зарелизили только спустя 2 недели🤷странноватоНу это ладно. Самые большие проблемы для меня в том, что xdebugger ОЧЕНЬ часто генерит segmentation faults. И если на симфони я с этим практически не сталкиваюсь, то на ларке это происходит прям регулярно. И это пиздец раздражает. Последний раз я ковырялся с ларавелем год назад, и мне пришлось 3 версии иксдебаггера перебрать, чтоб смочь нормально работать 😔 просто охуительный девелопмнет экспириенсБлаго, что я не один такой. И есть люди, которые не просто любят поныть, как я, а делают дело💪 И я тут наткнулся на проект, который я не могу пока что рекомендовать, потому что сам не пользовался, но за которым я собираюсь пристально следить.Называется ddless. Чувака тоже заебала вся эта клоунада с xdebuggerом и он написал свой. Причем тут интересен и сам инженерный подход. Вот как написать дебаггер без нативного расширения и чтоб не надо было ничо ставить в пыху? Да просто берем и вставляем вызов специальной функции перед каждой строчкой кода прям на лету. Изи! Ведь php легко (ну ладно, не легко) позволяет модифицир

Внимание! Далее в посте будет много ЧЛЕНОВ! поэтому, если у вас членонепереносимость, то лучше скипните!Нашел вопрос, который не вывезли 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 применяется для роли, которая
Давно не было мемасов че-то, потому что я тут в запаре жоской. Но вот вам вместо мема реальный кейс.Решил добавить новый тип подписки в эпп стор. Угарнул с того, что они тебе не позволяют установить любую цену. Будь добр, выбери прайс из списка доступных) обязательно шоб на 9ку заканчивалось!
Все тут пишут, на сколько полезны стали ИИ как инструмент для разработчиков. Но другую сторону разработки - обучению этой же самой разработке в век ИИ - как-то обходят стороной. Однако, в одном из рабочих чатов, недавно обсуждали, как же круто учиться с помощью ИИ, потому что его можно заебывать тупыми вопросами до бесконечности. И это имеет место. Но, на мой взгляд, заебывать ИИ вопросами != обучение. Хоть это и может быть его частью.Обучение - это сложный процесс. Как минимум надо учитывать, что подходы для обучения детей и взрослых (педагогика и андрагогика) очень отличаются. И в каждой области свои специалисты. Но есть у них и общее, кмк, а именно цель. Цель обучения - это овладение навыком.И я считаю, что навыком можно овладеть только через практику. Поэтому все эти ваши книги по программированию хороши только, если у вас есть практика, на которую можно это все приземлить. Если ее нету, то оно как войдет, так и выйдет, словно огурец в кабинете у хирурга 😂 Но можно будет выебнуться при друзьях, что вот томик Кнута осилил пролистал.Поэтому я думаю, что обучение на книжках - это иллюзия. Ну только если эта книжка не учебник с упражнениями.У меня особенно эта иллюзия проявляется, когда я пытаюсь пользоваться новым фреймворком или либой, и начинаю доку активно читать. Сидишь такой, вроде все понятно. Сел писать код - ноль целых, хуй десятых. Ничо не можешь написать. Ну это раньше было. Щас то я уже не учу новые фреймворки. Смысла ноль, работу все равно не поменятьПоэтому, только практика. Только руками поработать, если вы понимаете, о чем я😉И причем здесь ИИ? а при том, что ИИ очень-очень усложняет вот это "руками поработать". Слишком велик соблазн просто попросить решить задачу ИИ. А затем, ты попросишь эту ИИ полностью объяснить тебе решение. И он объяснит. А самое страшное, что после этого у тебя возникнет ощущение, что ты все понял и чему-то научился. А ты нихера не научился на самом деле.Эта иллюзия сравнима с тем, что ты воспользовался решебником в школе. Я

Пока я гадаю, какой же следующий пет проект мне сделать через год, когда появится свободное время, настоящие гигачады пишут компилятор rust на php. И нет, это не <?php exec(“cargo build”); ?>Это прям генератор бинарников для линукса на пыхе.Но самое прикольное то, что у этого есть реальный use case. Угадаете какой? Если что, ответ в этой самой первой issue, которая называется Why?😀Без всяких смехуечков, захотелось выразить дикий респект автору. Он красавчик!🤝

Атеисты: *бога и дъявола не существует*Дьявол в комментах:
Уже больше года активно не пишу на "лучшем языке для написания бизнес логики" по версии биг техов. Я сейчас конечно же про golang. Так уж получилось, что наши пути разошлись🤷 Обстоятельства оказались сильнее😢Но тут, как с бывшей, вроде уже все давно прошло, но ты иной раз чисто из любопытства возьмешь да зайдешь на ее страничку в инсте вк. Одним глазком глянуть, че там и как😉Вот так и я решил посмотреть, че там в голэнг релизах последних. И я с удивлением обнаружил, что они там переделали реализацию map под капотом. Это было год назад. И вы скажете "ну переделали и переделали, тебе то чо". А то, что буквально за полгода до этого я был на собесе, где меня доебали вопросом про реализацию мапы в голэнг. И я прям помню, что я тогда наизусть знал, как она устроена. Понимаете, без этих знаний бесполезно было суваться на собесы по голэнг. Это конечно вообще так бесило. Стопроц надо было знать, как реализованы каналы и слайсы, как устроен планировщик, и конечно же про хэшмапы. Знания, которые тебе в 99 процентах случаях никогда не пригодятся. Вопросы, которые на мой субьективный взгляд, такую тень бросают на голэнг, как на инструмент. Будто ты не можешь нормально ничо на нем писать, без знаний внутрянки. Будто бы на столько там херовые и протекающие абстракции, что ты и войти туда не можешь без этого всего.И вот тут разработчики берут и переделывают реализацию хэш мапы, хех. Теперь там, так называемые Swiss Tables. И получается, все ответы, которые кандидаты заучивали годами, становятся неверными устаревшими. И важно выдать другой ответ на собесе. Со старым ответом ты уже не сможешь json перекладывать🤡Я хочу тут все таки оговориться. В самом знании, как оно устроено под капотом, нет ничего плохого. Тем более, если у тебя еще задача попалась, которая заставила покопаться в этом, то тут я вообще могу только позавидывать. Проблема лишь в использовании этих вопросов для определения квалификации человека. Для каких задач набирают людей с такими вопросами? Как часто кому-то т

Внимание! Обнаружена самая лживая книга по программированию!

Теперь можно выразить еще и глубокую озабоченность, а чуть позже — решительный протест🤷