Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL) и учимся делать сайты. Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не запоминайте его, он временный). Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Если не знаешь как решать, запости код и попроси подсказку или поищи задачу в архиве тредов.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование. У нас есть задачи для изучения этого:
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.
Платиновые вопросы
- Почему PHP? Потому что вакансий море, и учить легко. - Сайт опять упал!!!!! — Не паникуй, а зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Clone or Download -> Download ZIP, распакуй на рабочий стол и получи личную копию сайта, не требующую интернетов. - Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу (ищи в архиве по слову "устроился"). - Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись - Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/ - Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев - Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
>>2571790 (OP) Как можно реализовать перенаправление с site.ru/profile/1, на файл site.ru/profile? Типа пользователь вбивает нужный ему профиль в браузер site.ru/profile/1, где 1 это id профиля, а далее этот профиль обрабатывается в файле profrile.php?
>>2571862 А чего так? После праздников кол-во вакансий подросло, для джунов даже есть, даже БЕЗ битрикса. Правда оффлайн в основном, но что поделать? Полгода-год в офисе, и ты свободен как птица-кодер, работай где хош.
>>2571991 Страшно идти на собеседование. Все время кажется, что я еще не готов и нужно сначала пройти все темы, а потом уже откликаться. Я наоборот хочу хотя бы год-два в офисе поработать. Если возле дома получится найти, то вообще заебись
>>2571790 (OP) (репост с прошлого треда) Это вообще нормально что Phpstorm просит по умолчанию fast-cgi -интерпритатор? Почему не FPM?
Первый раз с php работаю, настраиваю phpstorm-локальный сервер. Поставил пак (по уроку) - sudo apt install php-fpm php-cli php-common php-json php-mysql php-phpdbg php-mbstring php-imap php-dev php-curl php-xdebug Пришлось еще устанавливать (потому-что шторм ругался) - sudo apt install -y php8.2-cgi
И еще вопрос, новая версия шторма уровень языка 8.2 поддерживает, или нет пока-что?
>>2572404 Битриксоид это лох, который закапывает свою жизнь в болоте этого говна. Курс для разработчиков, но он тебе мало поможет на практике там все пилят костыли разной степени всратости потому что чаще всего бизнес логика выходит за пределы взглядов на жизнь разработчиков этой хуйни. На работе предстоит натягивать верстку на говнокод, пилить свои говнокомпоненты, наебывать заказчика и постоянно колупаться в админке как веб-мастер из нулевых. Учи сразу ларавель и английский Работал с этой хуйней первые 8 месяцев когда вкатывался
>>2572445 Ну видишь, ты же вкатился. Значит и я так же вкачусь. Да, битрикс кал, но зато сразу на удаленке, еще и 30к/мес, а в моем селе такие бабки получают только люди проработавшие 3-4 года+, выше 35-40к тут только начальники. Потом через полгода-год перекачусь на "тру"-фрейворк, наверное на лару.
>>2573269 Он имеет ввиду что потратишь время. И понимание как правильно программировать, сейчас везде требуют понимание ооп, solid и тд. Проекты делают со ставкой на расширяемость. От себя скажу, битрикс это очень необоснованно тяжелый фреймворк, магазины на нем у меня даж с рабочего компа (и с некоторых телефонов) не открывались, с чего я кекал, оперативку или проц нахлухо сажает - просто сайты не открываются. А для бизнеса важны такие вещи как CRP, FCP, RAIL (если коротко это скорость и реакция интерфейса, скорость загрузки на стороне клиента). Лучше выдрочить html5/css конкретно, и потом в нормальный фреймворк лезть. Ты плохому только голову набьеш, изучая битрикс и не дай боже 1С(который с ним связан). 1С можно и к laravel например прикрутить, но это уже другая история.
Мало того, скоро на go полностью или частично перелазить будем, в РФ он приживается, судя по всему - и на эту работу часто требуют хороший опыт с PHP. Ну если ты хочешь стать кибер-таджиком, которого ни заказчик свинорылый не будет уважать, ни другие программисты - это конечно твое дело. Кто-то же должен толчки мыть как говориться.
>>2573402 >магазины на нем у меня даж с рабочего компа (и с некоторых телефонов) не открывались, с чего я кекал, оперативку или проц нахлухо сажает - просто сайты не открываются
Чел, ну ты как-то совсем не шаришь. В том же и смысл, что это говно из коробки может поднять любая домохозяйка. Но оно будет еле шевелиться. Вот тут и нужны ПОГРОМИЗДЫ 1С. Это как демо-версия, поднимающая продажи лучше любой рекламы. Популярность есть, база уже готовых решений есть, работы уйма. Да любая макака с правильным фреймворком сто раз успеет от голода сдохнуть, пока битриксогосподин будет от лишних бабок отмахиваться.
>>2573546 1C это десктопное приложение, с битриксом он не связан. 1с 'программист' пишет всякие модули на русском языке для бухгалтерш в основном.
Тебе от 1С нужно только мелкие данные типа остаток товаров и цены, это можно и так отправить по http, на любой твой фреймворк. Сам битрикс написан на корявом php/js на сколько мне известно. И копаться во всем этом дерьме мне например гордость не позволит, я хрчу любить свой язык, и уважать своих клиентов.
>>2573546 Вот пример по запросу на битрикс на hh(пикрил) > — Увеличение скорости загрузки сайта, обеспечение бесперебойной работы сайта при высоких нагрузках;
Это уже смешно, какой нахуй highload и быстрота интерфейса на битриксе? Это задание из разряда "чисти унитаз вилкой". И когда я слышу Jquery - сразу у меня реакция либо молча развернуться и уйти, либо узнать как дохуя платят или нет, потому что за легаси браться я буду только в хорошей компании и за хорошие деньги. Они там фантазируют, и Vue им подавай, и spa наверное хотят и быструю загрузку и хайлоад. Это же просто детские фантазии, из разряда что у меня есть кнопочка "сделать пиздато" и она у всех программистов есть
>>2572587 Какая блять разница, что ты используешь в шторме? Это же максимум для дебага или запуска скриптов используется и обычного CGI для этого более чем достаточно. А проекты в наше время разворачиваются в докерах как правило.
>>2573940 Два варианта: 1) они должны быть сгенерированы не случайно, а по какому-то алгоритму, гарантирующему неповторяемость. Самое тупое это инкрементом, повторяться точно не будут ;) Ну или к примеру есть такая штука, как uuid (хотя это не совсем число, но ты понял), шанс повторения крайне низок. Хотя, я сейчас подумал, у тебя же известное количество чисел из диапазона, так? Ну так и разбей диапазон на n интервалов и генерируй случайные числа уже внутри них. Повторяться не будут точно, но "случайность" тогда будет не совсем случайной всё же. 2) либо после генерации убеждаться, что таких чисел ещё не сгенерировано, для чего нужно хранить уже сгенерированные числа в некой структуре, подходящей для быстрого поиска. В php вариантов по сути и нет, юзай хэш мапу, то бишь, ассоциативный массив. Сгенерировал число, проверил нахождение его в массиве -и или записал в массив или перегенерировал.
>>2573603 >>2573580 >>2573402 >>2573428 >>2573546 Понятно, битрикс это кал. Но у меня на собеседовании на неоплачиваемую стажировку в Ylab спрашивали про дизайн паттерны, про mvc, ооп, про теорию бд типа что такое нормализация, денормализация, были вопросы по запросам sql, ну и конечно простые вопросы по синтаксису пхп.
Вот если они такие вещи спрашивают, значит они норм разрабы? Или нет? Я просто думал что дизайн паттерны и теория бд это вообще не про битрикс, я думал там хуяк и готово, не надо в такие подробности вдаваться. Ну выучил битрикс орм, инфоблоки да их mvc-битрикс и всё клепай на здоровье, разве не так?
>>2574092 Говорят на собесах все профессионалы, а когда устроишься - обомлеешь какая тупая контора
Ну если начал, работай. Относись как к работе, просто я бы психологически такое не вывез, для меня кодить это труд, это много энергии забирает, а кодить говно не могу. Хз, долго ли вообще на этой параше (битриксе) можно работать. Это просто велосипед на велосипеде, при том быстро-устревающий. Все хотят магазы типа озона или wb, кому нахуй усрался этот битрикс. В рф ничего хорошего не делают сами, фреймворки и новые языки это выход из ямы, эволюция читай, а поддерживать это преступление против природы, называемое битрикс или 1С только шизы могут.
Я подозреваю, что под "увеличением скорости работы" там подразумевается прикручивание кеша страниц (не работает для авторищованных пользователей, а также вызывает проблем с устареванием кеша, что обычно решается кнопкой "сбросить кеш") + может быть какой-то склеивальщик статических файлов в многомегабайтный JS + CSS вместо отдельных файлов на каждый раздел.
Сколько я не видел SPA, там почти всегда медленная загрузка: вместо того, чтобы показать сразу контент, пользователю показывают круг, потом грузят мегабайты яваскрипта, от которых почтенный проц скрипит и греется, а потом грузят данные из 10 API по очереди.
Хотя SPA может дать преимущества, такие, как поддержка работы оффлайн, на практике он почему-то только замедляет загрузку и иногда ломает навигацию.
>>2575854 А не спа типо медленной загрузки не бывает. Полчаса висит белая пустая страница, а потом хлоп - говно из БД прилетело. Причем здесь спа? Ты наверно просто вообще нихуя не видел и не с чем сравнивать.
>>2575966 берешь постое число p большее чем тебе надо сгенерировать последовательность, берешь первообразный корень q по модулю p и вычисляешь q1(mod p), ..., qp-1(mod p)
>>2576092 Короче, умножаешь число на самого себя, а в качестве результата на итерации берешь остаток от деления произведения на другое число. Только нужно нагуглить пару чисел q и р, чтобы последовательность хоть немного походила на псевдорандомную.
Проработал на первой работе год, теперь ищу новую работу, но планирую в резюме указать два года опыта, дабы проще в поиску было и зп побольше. Насколько это вообще действенно и как меня могут раскрыть, если к тех вопросам я хорошо подготовлюсь? Расскажите мб кто делал подобное
Покажи быстрый SPA без мегабайтов JS. Сколько я не видел SPA, они все тормозные. Сбербанк - грузится медленно, например.
Быстрая загрузка без SPA бывает часто, например, https://news.ycombinator.com/ отдает главную за 183 мс, и это при том, что он в США. То есть из этих 183 мс больше половины это пинг до сервера.
Очевидно, что SPA при прочих равных медленнее, чем отдача с сервера готового HTML. Так как SPA нужно загружать тяжелое JS приложение, делать REST запросы на выборку данных итд. Это конечно можно оптимизировать и "впечь" в страницу, но тогда это будет уже не совсем и SPA.
SPA имеет смысл для "приложений" с высокой степенью интерактивности, например, электронные таблицы, графический редактор, мобильное приложение, где надо прокручивать ленту с картинками и лайкать их, и тд. Для обычного сайта со страницами или магазина он больше мешает, чем помогает. А глупцы этого не понимают, не понимают, что бывают разные типы сайтов и просто думают ,что SPA всегда лучше чем не SPA. Этим они лишь демонстрируют свою глупость.
В твоем варианте последовательность чисел всегда будет одинаковая и не очень-то случайная. Хотя в задаче ничего не написано про случайность. Но если случайность не нужна, то проще сгенерировать последовательность 1..n, чем заморачиваться с поиском простых чисел, что само по себе нетривиальная задача с огромной сложностью.
Возможно, что и так. Тогда можно сделать альтернативный алгоритм: сделать массив чисел, брать из него случайное, и удалять его из массива. Тут сложность будет O(N × M) в худшем случае, если не оптимизировать поиск/удаление из массива.
Есть php файл, воткнул в него html код с фронтом от бутстрапа, он работает и показывается в браузере, вот только сам php нет, пробовал и через include разсметку подключать - она есть а бэка нет. Из-за чего такое?
Два Ч, спешу поделиться радостью! 7 лет ждал вката в программрование. Всё это время учил PHP (psr-*), дрочил алгоритмы, разные фрэймворки... ну короче, я джуниор битрикс разраб!
Спасибо тому анону, что 7 лет назад уговорил меня уйти с работы и заняться самообразованием. Это время прошоо незаметно. Джун в 35 это нормально.
>>2579440 Вот кстати да, где-то во времена выхода php7 мне казалось, что пыха не умрет вообще никогда, но сейчас что-то уже такое назревает. Слишком много новых языков, слишком динамически всё развивается, слишком устарел дизайн самого php. Джуны и прочий аутсорс уйдёт в голанг. Да и в целом я что-то смотрю, почти всё, что возможно, переписывается с php на go, даже странно, почему так Ну и джуны может в питон, что-то он прям активно продвизается всякими говноскиллбоксами Геи в nodejs Копораты за $$$ так и останутся сидеть на джаве и шарпах И тп.
Будет как с руби, легаси есть, какой-никакой движняк есть, а треды мертвые и тому подобное околоболото. Полной и окончательной смерти конечно не будет, но только потому, что её в принципе не бывает, единичные решения можно найти на любом существовавшем языке, от фортрана до делфи. Кроме хаскелля, лол.
При асинхронных запросах скрипт должен быть отдельный под каждый запрос? Или в тот же самый можно вызвать, откуда идет запрос и там же его обрабатывать?
>>2580249 Kotlin перестал быть экспериментом и теперь уже де факто стандарт в мобилках и серьезно наступает на бекенды. Rust медленно завоёвывает популярность, у него другая ниша относительно php, но хайлоад и хайлоад-корпораты будут уходить туда (ну или сначала в го, а потом туда). Про го уже всё сказано сто раз, это отличный компромисс между отличным перфомансом и простотой/уровнем входа. Сам язык мне может и не очень нравится, но просто по моему опыту, целая куча компаний с кодом php находятся в переезде на него, хотя бы под соусом "микросервисов". То есть, вижу сильный тренд php->go, но вообще не вижу чтоугодно->php. Java и C# тоже развиваются, особенно шарпы. Корпораты с них никогда не слезут, а с новыми свестелками (да даже с появлением и популярностью сраного spring boot) всё больше проектов просто сразу начинается на них. Typescript и всякие эксперименты типа deno тоже становятся всё популярнее.
Понятно, что явного конкурента нет и пыха не умрет в ближайший год или даже пять лет, загнивание может длиться годами. Я скорее говорю о том, что пыха была хороша как простой и нетребовательный к разработчикам язык, чтобы делать дело, отсюда и всякие CRM на нём, и бложеки, и тд и тп. Сейчас же есть уже куча языков или сразу простых, или с упрощающими жизнь фичами, нет такого копроративного ада, что был лет 10 назад. И это убивает "уникальность" пызи из-за которой он и был так популярен. Теперь пыха это просто язык, "один из". Причем даже не самый модный, далеко не самый. А это означает, что новые проекты будут писаться в основном на модных, а php будет жить в основном в виде поддержки легаси, ну и фанатиков. Ещё не смерть, но уже и не жизнь, так, анабиоз.
>>2581989 TLDR раньше был простой php и сложная страшная джава. Сейчас есть простой go, простой nodejs (точнее нубы так думают) модный kotlin, модный c#, супер модный rust и тд и тп. И простой немодный php. Итог немного предсказуем.
>>2581990 Сейчас понабегут люди, которые воспримут мои слова о том, что пыха слабеет на свой счет и начнут спорить просто из чувства несправедливости. Так вот, ребят, вы -это не язык, не принуждайте себя. Исчезнет один - пересядете на другой, вы ж не тупые. Язык это просто инструмент, и когда вам говорят, что ваша дрель начала хуже работать, вы не спорите, а меняете её на любую, какая понравится.
>>2582001 Самое время влетать в пхп. В течение 2 лет изучаете го. Через эти 2 года пересаживаетесь на смежный проект. Через год работы на смежном проекте полностью переходите на го. Вот и всё. Ну еще можно пойти учиться, да и сразу устроиться в "крутой" стек. Но мне кажется это потеря времени, да и пхп знать надо любому веб-разрабу.
>>2582011 > пхп знать надо любому веб-разрабу. Пиздеж, не надо. Можно знать вообще любой язык и это будет нормально. Я знаю кучу очень сильных инженеров, которые про php только слышали.
> Ну еще можно пойти учиться, да и сразу устроиться в "крутой" стек. Но мне кажется это потеря времени Лолчто. Потеря времени это как раз тратить лишние два года
- Kotlin основан на экосистема Java и чтобы его изучить, надо сначала изучить Java и все, что с ней связано. При работе с Kotlin нужно взаимодействовать с Java-библиотеками. Это явно не простой язык для начинающих.
- Rust это улчшенный Си, тебе сначала надо изучить Си и все его низкоуровневые тонкости, чтобы понимать Rust. Rust это язык для людей с 10+ годами опыта в системном программировании, а не для вкатывальщиков в поисках легких денег. Плюс, по Rust нет русской документации.
> хайлоад Это (цифра с потолка) 1% проектов, ничтожная доля рынка. Никому не нужен твой хайлоад. Битрикс, например, намного востребованнее.
> Сам язык мне может и не очень нравится Язык мягко говоря со странностями, если ты меняешь тип поля с закрытого на открытое, надо менять регистр букв.
> целая куча компаний с кодом php находятся в переезде на него, хотя бы под соусом "микросервисов". Если у людей много лишних денег, то это конечно их дело как их тратить.
> Java и C# тоже развиваются Их проблема (как и PHP) в том, что они поддерживают совместимость и ты не можешь изучить просто Java 17. Тебе заодно надо изучать легаси из всех предыдущих 16 версий, так как оно может встретиться. Мне не очень нравится это совместимость, нужно в определенный момент просто выбрасывать легаси и переделывать язык с нуля.
> Сейчас же есть уже куча языков или сразу простых, и Приведенные тобой языки не простые и их вряд ли освоит вкатывальщик. Странно, что ты не привел Swift, он подходит под твои требования гораздо лучше чем этот энтерпрайзный хлам.
>>2582584 >пхп круто потому что он для бедных, для далеких от айти домохозяек и дегенератов, которые не способны изучить что-то сложнее Это как тебя бы защищали словами "Отстаньте от юродивого! Как вам не стыдно!". Ахуенная защита пхп! Если бы ты адвокатом работал по уголовным делам, прокурор бы на суде офигевал и начинал защищать подсудимых от тебя.
>>2582605 А вдруг этот анон был адвокатом? Но потом его сын загадал желание, чтобы папа не мог врать. Желание сбылось. И теперь анон адвокат не может врать?
>пхп круто потому что он для бедных, для далеких от айти домохозяек и дегенератов, которые не способны изучить что-то сложнее ну так анон же про это и говорил? Что для бедных есть модный го и мб другие языки, а для богатых пхп это не лучший выбор?
>>2582915 Хз, чисто посмотрев украинский рыночек я сделал вывод, что ПХП достаточно хороший выбор для быстрого вката. Даже сказал бы, единственный если ты джун. На условном вротенде 500 человек на вакансию, на любом бекенд ентерпрайсе по 100+-, а тут Пыха с самым большим количеством вакансий и 10-20 откликами.
>>2582996 Откликов поменьше, вакансий побольше, но на удаленке почти та же ситуация, что на любом стеке. Вместе 500 откликов увидишь 200-300. А вот в офисе да, действительно 10-20-30 в зависимости от милионника. Если дс, то может и до сотки дойти.
>>2582996 Ну и ты сам подумай, что вообще означает много вакансий с 10-20 откликами. Что там придется делать и чему ты там научишься. И кто там работает. Скорее всего это говноаутсорсы на говносрмках с бывшими строителями в сотрудниках, которые тебя не научат ничему хорошему.
Количество почти всегда противоположно качеству, особенно в плане работодателей.
И "найти работу программистом" ващет нифига не равно "действительно решать инженерные задачи". Я видел таких людей, просидев десять лет за каким-нибудь drupal или bitrix, они умеют накликивать веб формочки или странички, но при этом от джуна они ушли очень недалеко. И больше, чем "за еду" они не получают и получать не будут. Ну, тут со скидкой на российские реалии, где жалкие 50к это уже космические деньги в регионах.
А я считаю, что сравнивать результаты надо не с нулём, а с тем, что ты мог достичь, но не достиг. Взяв тех же знакомых, о которых я говорил. Некоторые просидели всю жизнь в аутсорсе и радуются "сеньорским/тимлидским" 80к рублей. А другие, сразу попав в нормальную контору, получают под 500к и очень ждут, когда кризис закончится, чтобы устроиться в модный стартап и ещё раз удвоить свою зарплату.
Я к чему это всё написал, где черт возьми ваше честолюбие? В какой момент для вас "легко найти работу айти-бомжом" стало рассматриваться, как вариант?
>>2583142 >Я к чему это всё написал, где черт возьми ваше честолюбие? В какой момент для вас "легко найти работу айти-бомжом" стало рассматриваться, как вариант?
Да, действительно, обычно об этих конторах ещё отзывы паршивые.
Лично за себя отвечу. Очевидно на говноработы идут не из хорошей жизни. Для меня найти работу в той области, куда я хочу вкатиться просто невозможно ни по времени ни по средствам, ни по вводным. Конкурировать с другими вкатунами просто не вижу перспектив, всегда буду в пролёте среди таких же но всегда немного лучше меня. На 30 вакансий(из которых большинство с 1 годом работы(знаю) и аппер интермедиат инглишем, много из которых даже не на удалёнке, когда я в селе живу) по всей Украине(мобилизация). Даже резюме несчего состряпать. Сидеть сложа руки? Считаю лучше попытаться отработать на говноработке год, потратить на себя немножко денег и с уже полученным опытом, с прокачанным инглишом перекатиться в куда получше место и на лучший стек.
>>2583142 В любом случае, скорее всего если не найду работу, потрачу этот год ниначто буквально. Или 100 откликов, и ситуация в стране, когда вакансий стаём все меньше и меньше - не так страшно как мне кажется? Я просто не опытный, могу чушь нести.
>>2583142 С каких пор laravel/symfony вакансии стали нереспектабельны? На них те же 20-50 откликов в провинциях. На удаленке частенько появляются вакансии, пусть и по 300 откликов, но в пхп тенденция такова, что найти шарящего человека здесь сложнее, чем в java/spring или .net'e.
>>2583346 В Украине как я понимаю рынок всё таки другой немного. В провинциях нет вообще вакансий, либо я не знаю как их искать, лтбо не знаю что ты имеешь ввиду под провинцией. А на удалёнке не то чтобы много откликов. Да и ЗП, про которые выше анон написал, таких низких для лидов/синьоров нет.
Если честно устал даже. Вроде сейчас кажется всё простым, но когда решал было не очень просто. Решения конечно не совсем полные, но и описания заданий тоже не до конца точны, как мне показалось. Спасибо ОП'у за такой чудесный туториал. Пока нигде ничего лучше я не видел. Завтра продолжу изучать и решать задачи.
Кстати, а можно ли выставлять решения на гитхаб сразу? Создать там, например, репу с названием "php playground", где будут вот такие простые задачи? Или как такие репы называют? Или их вообще не заводят? Мне просто хотелось бы сохранять эти решения, во-первых, для проверки прогресса со временем, во-вторых, возможно, когда-то где-то мне что-то из этих решений понадобится, кто знает...
>>2583450 В мыле не стал искать "+", т.к. вроде в мылах не бывает плюсиков. С другой стороны, какая разница? Это же просто задание... Ну да ладно, там ничё сложного вроде, докинуть к точке и черточке еще "+".
По поводу задания граммар наци - как выводить ошибки? Вот например есть текст "Ты умный?Шызанутый но умный.". Как сделать так, чтоб регулярка вытащила и ошибку, где пробел пропущен, и ошибку, где ШЫ вместо ШИ, и ошибку, где нет запятой?
Просто в задании ведь написано "выводить кусок текста". Но для того, чтоб вывести кусок текста, мне приходится написать \\S+[,.;:!?]\\S, либо через {N, N} обозначить количество символов с двух сторон. Но в таком случае, регулярка найдет сначала самую первую слева ошибку, там, где нет пробела после знака вопроса. Затем она вытащит мне сразу, скажем, по 20 символов слева и справа от этой ошибки, а там ведь еще и другие ошибки есть! Но они не будут учтены, а просто пойдут в текст первой ошибки.
Но по заданию, как я понял, надо учесть каждую. Для этого мне что, отдельно делать миллион регулярок и через цикл проходить по ним? Для пропущенных пробелов одна регулярка, для неправильных букв - другая. Так? Но это ведь получается громоздко? Ладно, я устал кароче!!! Завтра может еще подумаю, а может просто дальше пойду, хз.
Сорри, если показался грубым. Я не наезжаю или еще что, просто... просто вот так пишу наверной!
>>2571790 (OP) >Знание REST API будет плюсом. В REST API страница смотрит на запрос, который был ей отправлен, url, далее она из этой информации либо добавляет(POST), либо обновляет (PATCH), либо показывает (GET) информацию, и т.д. Что еще нужно знать о REST API? на juniour? И можете, пожалуйста, поподробней сказать, что это такое? header("Access-Control-Allow-Origin: "); header("Access-Control-Allow-Headers: , Authorization"); header("Access-Control-Allow-Methods: *"); header("Access-Control-Allow-Credentials: true"); header("Content-type: application/json; charset=UTF-8");
>>2583211 > и с уже полученным опытом > с прокачанным инглишом Ошибка находится вот здесь. Нет в таких местах никакого опыта и никакого инглиша. Одно копание в, гхм, веб-навозе. Это примерно как нанял бы ты врачом чувака, который помогал в индийском морге вскрывать трупы бомжей? И много бы у него было скиллухи после такой работы вообще?
>>2583346 Сами по себе фреймворки норм и на них встречаются нормальные вакансии. Но сам фреймворк мало что значит, значат конкретные работодатели. И если ты видишь перез собой вакансию laravel-разраба с копеечным рейтом и малым количеством откликов - значит в этом месте на ларавеле будешь делать какую-нибудь херню, без бест практисов, стайлгайдов и тп, как понравится владельцу, так и будешь делать. Я видел и местечковые интернет-магазины на ларе, знаешь ли.
> найти шарящего человека здесь сложнее, чем в java/spring или .net'e. Из чего кстати элементарно следует, что большая часть "коллег" и лидов не шарят. Ты точно хочешь работать вместе с таким контингентом? И чему они тебя научат? Даже если ты сам будешь самообразовываться, представь, что ты такой приходишь и говоришь "давайте юзать гит, я поизучал, это правильно и технологично", а они тебе "а нам и по фтп норм, всегда так делали". И будешь как дурак один со своим гитом сидеть :) История кстати невыдуманная, я где-то в начале-середине десятых с такой конторой сталкивался. Нужно сразу работать в системе, которая задизайнена под инженерию. В одиночку ты ничего не выстроишь, только в лучшем случае сопьешься.
>>2583230 Ищи, конечно и удачи тебе. Речь о том, чтобы по возможности сразу искать подходящее место с перспективой роста. Иначе можно стать аналогом охранника из пятерочки. Да, тепло и денежки есть, только вот годы идут, а лучше жизнь не становится и не станет.
>>2583933 В олдскульном пхп он используется для "деплоя" и потом для редактирования скриптов на живом сайте. Это потом хипсторы всякие новомодные гиты эти ваши принесли.
>>2583945 Речь даже не про деплои, а про то, что в некоторых конторах гита нет вообще, просто каждый редактирует свои файлики локально, а потом заливает их на продовый сервер по фтп и всё. Если чьи-то правки уже перетерли - это его проблемы.
>>2583958 Без гита обычно сложно использовать какой-нибудь гитлаб или гитхаб, на которых уже и настраивается нормальный пайплайн деплоя в современном мире.
> А другие, сразу попав в нормальную контору, получают под 500к и очень ждут, когда кризис закончится, чтобы устроиться в модный стартап и ещё раз удвоить свою зарплату.
Ну кого ты пытаешься обмануть. Если бы было можно вместо PHP изучить другой язык за то же время и с 0 опыта получать от 500к, все бы так и делали. Но почему-то этого не происходит. Наверно, потому что твои фантазии не совсем соотносятся с реальностью.
Я вообще, замечаю, что среди анонимов не популярны реальные языки, на которых можно делать реальные проекты для бизнеса, а какие-то экзотические языки, которые никто не использует. Потому, что аноним любит изучать экзотические языки, а не работать.
>>2583795 Спасибо анон, и тебе удачи. Я прислушаюсь, и попробую понастороженее быть в поиске работы. Если что попробую побыстрее(когда смогу) перепрыгнуть на понравившийся стак На инглиш я хочу денег накопить и с нейтивами по вечерам за деньги разговаривать - для этого деньги нужны, собственно для денег нужна и хоть какая работа.
Если хочешь, ты можешь завести репозиторий на гитхабе, но думаю, скоро ты такие простые задачки уже будешь на автомате решать, так что если только для истории, чтобы потом вспоминать, с чего начинал изучение PHP.
Спасибо за замечания по учебнику, они очень полезны.
Увы, неправильно составлена регулярка. Например, email вида vsevolod-ryurikovich@mail.ru она не найдет. Вообще, есть спецификация, какие символы могут входить в email, но она очень сложная и там получится километровая регулярка (если любопытно, гугли RFC 2822, пункт 3.4.1 ).
Для этой задачи email считается следующее:
- конструкция вида имя@домен - имя может содержать 1 или более букв (включая кирилицу), цифр, минусы, точки, плюсы, подчеркивания - домен состоит из 2 или более частей, разделенных точками. Каждая часть состоит из букв (включая кирилицу), цифр, минусов.
> В мыле не стал искать "+", т.к. вроде в мылах не бывает плюсиков
Бывают, просто редко используются и не везде поддерживаются.
> Как сделать так, чтоб регулярка вытащила и ошибку, где пробел пропущен, и ошибку, где ШЫ вместо ШИ, и ошибку, где нет запятой?
preg_match_all выбирает только не-перекрывающиеся части строк. Чтобы вывести каждую ошибку, есть несколько вариантов:
1) добавлять в вызов preg_match_all флаг PREG_OFFSET_CAPTURE, чтобы она вернула позицию (в байтах) где найдено совпадение, и далее по этой позиции вытаскивать часть строки
2) как-то разбить строку на массив слов или на части и проверять каждое слово по очереди.
Вообще, под REST подразумевается архитектура REST или принципы REST, которые нетрудно нагуглить, по крайней мере на английском: https://restfulapi.net/
REST API - это API, построенное с соблюдением принципов REST.
API - здесь это набор правил, следуя которым мы можем получить информацию или сделать действие (например, получить список популярных постов или поставить лайк посту).
На практике "REST" API часто не следуют принципам REST, и их правильнее называть HTTP API - то есть API, основанные на протоколе HTTP.
Начать стоит с изучения HTTP. В HTTP есть "методы" и "ресурсы", которые напоминают действие и объект действия. Например, мы можем сказать "погладь кота Василия". Здесь "погладь" это действие, а "кот Василий" это объект. Так же и в HTTP, запрос DELETE /photo/123 значит "удали фото 123", здесь DELETE это метод, а /photo/123 это идентификатор ресурса, над которым делается действие (фото). Ресурс - это не строчка /photo/123, а само фото, а URL /photo/123 лишь указывает на него.
Как я написал выше, URL - это указатель на ресурс (идентификатор, позволяющий отличить ресурс от других).
Поверх этих ресурсов и строится архитектура REST. Изучи 6 принципов REST и ты поймешь, какие API на самом деле являются REST API.
> И можете, пожалуйста, поподробней сказать, что это такое? > header("Access-Control-Allow-Origin: ");
Это HTTP-заголовки. Тебе нужно почитать про протокол HTTP сначала.
> В REST API страница смотрит на запрос
не страница смотрит на запрос, а код на сервере или "сервер".
>>2584341 Никто не говорил об 500к с нуля, такого не бывает, тут ты прав. Речь о том, что условно став битрикс-разработчиком, ты никогда вообще не получишь 500к (если забудем про инфляцию), в этом стеке просто нет таких рейтов. И при этом битрикс это crm, то есть такой маленький мирок, для работы в котором тебе не нужно знать ничего из программирования кроме базы для накликивания страничек ну и там по мелочи всякого. В том числе и по такой причине, что битрикс просто не используют для серьезных и сложных задач, поэтому ты там просто не встретишь заданий, где нужно будет что-то такое поизучать и потом применить. Речь даже не про алгоритмы какие-то, а про базовые инженерные навыки, миграции, базы данных, сети, протоколы, паттерны проектирования и всё такое.
Так что речь не про то, что ты где-то там сразу начнешь получать дохуя, совсем нет, джунам везде мало платят. Речь про том, что идти джуном надо туда, где вообще возможно дорасти до условных 500 какосеков. Потому что протирая штаны и тратя годы в разработке на битриксе ты останешься настолько же далек от таких сумм, как и был, когда приходил в битриксоиды.
Битрикс здесь использую как имя нарицательное,вместо него можно подставить разные технологии и даже языки
>>2584862 Придумал отличную аналогию, представь, что ты играешь в WoW и хочешь заработать денег. И можешь начать качать какую-нибудь алхимию или любое другое собирательство с которой со временем можно будет зашибать кучу денег на аукционе с продаже редких ресурсов, а можешь условную первую помощь, в раскачку которой ты можешь вложить 100500 часов, но денег с этого всё равно не получишь. Так вот, с реальными профессиями всё точно так же и нужно сразу выбирать такую, у которой выше потолок. Потому что переключаться между профами трудно и это не всегда происходит с сохранением экспы.
>>2584869 Ну тогда надо сразу в джаву или в дотнет и забугор, т.к. у нас на дотнете мало платят. Но мне кажется на любом современном стеке можно примерно одинаковые суммы зарабатывать. Хоть пхп хоть нода хоть джава. Главное не идти в CMS, твой посыл ясен.
>>2585015 Не совсем. Как раз примерно одинаково мало платят на любом стеке джунам, а вот потолок сеньоров от стека к стеку отличается. К примеру, взяв php ты вообще никогда не сможешь зарабатывать столько же, сколько перфоманс C++ник в гугле, майкрософте или каком-нибудь оракле. Не уверен, что в них вообще есть вакансии на php, но не проверял Не потому, что php плохой, а потому что специфика языков определяет задачи, которые этим языком решаются. А ценность и сложность этих задач различна, отсюда и разница в рейтах.
Поэтому, выбирая стек, нужно смотреть на две вещи: 1) Возможность для вката лично для тебя потому что у скажем haskell есть топовые рейты, но кривая вката очень велика, ещё и вакансий нет; 2) Потолок стека, чтобы он был больше, чтобы не выбрать "1C программиста" и не уперется лбом в потолок в два раза ниже потолка у других языков. Твоя же цель зарабатывать как можно больше, правильно? :)
>>2585306 Не обманывай! Битрикс это фреймворк на пыхе с открытыми сорцами. 1С предприятие это десктопная платформа на плюсах с закрытым кодом, которая предоставляет специальный язык для описания предментой области документооборота на предприятии.
>>2585361 Чел, эта хуйня идет стеком. Никому не всралась пхпмакака без знания 1с. Толку от твоего магаза на битрихе, если ты его к обороту не прикрутишь?
>>2585368 Чел есть еще облачный битрикс, там тоже самое http апи от пыхобитрикса, но ты можешь там хоть на хаскеле приложения для маркета писать. Я писал, никто с меня знания одинаса не требовал.
>>2585231 С моей колокольни кажется лучше битрикс, который phpшный фреймворк, так как это всё же что-то на php и поэтому всё же подразумевает какую-никакую близость хотя и очень маленькую к глобальному миру php-разработки. А 1С это чисто локальная СНГшная история, ещё и залоченная на одного вендора не на уровне фреймворка даже, а вообще на уровне языка. В этом языке хоть дженерики то есть? Лол.
Но конечно это выбор из двух сортов говна и лучше, как Геральт, не выбирать вовсе. Вот не поверю, что у тебя в доступности нет местячкового аутсорса на ларавеле или хотя бы yii, хоть второй мне и не нравится.
Ну что, сделали "офер" на испытальный срок но его как я понял все проходят. Только прикол в том, что я встретился с эйджизмом, хотя мне слегка за 25.Собеседующий сказал, что хоть я и был лучше предыдущих собеседуемых, но все равно плавал и вообще есть люди, которые в 18 лет уже являются специалистами, а я вот такое недоразумение, поэтому мне нужно работать в режиме x5. Только я не понял, это он выделил молодых или сказал, что мне нужно догонять "себя", чтобы стать специалистом? А может мне послышалось, и в телефонном звонке сказали, что офер сделали на какую то другую вакансию? Или как объяснить, почему вакансия еще висит? >>2584408 Да, спасибо, анон ОП?,я даже удивился, что они спрашивали принципы REST вообще собеседование в основном было на темы, которые в вакансии были указаны как желательные, а не обязательные.
Только мне уже тимлид сказал, что я тут https://codeshare.io/OdVyqA нарушил один из принципов SOLID (класс должен решать одну задачу), а я думаю, а как мне нужно было это реализовать то, чтобы не нарушить этот принцип? Плюс он сказал, что у меня каждый файл подключается к базе данных, что затратно. А что можно сделать?
>>2585971 1. У тебя класс авторизации сам себе создаёт подключение к бд, так делать нельзя. Погугли про паттерн dependency injection, принцип D в solid и интерфейсы: класс должен в конструкторе принимать интерфейс подключения к бд, а сам объект создаётся где-то снаружи, и AuthModel не должен знать, как это делается, чтобы не зависеть от конструктора другого класса или от функции, как в твоём коде. 2. Класс авторизации вообще не должен знать, откуда у тебя берется юзер. Твой класс AuthModel одновременно авторизует юзера и ищет его в бд, взаимодействие с бд не должно быть его задачей. Нужно сделать интерфейс UserRepositoryInterface и его имплементацию DatabaseUserRepository, соответственно, в нем должен быть метод findUserByЧеТоТам. AuthModel в конструкторе должен получать интерфейс репозитория и дальше использовать его для поиска юзера. Соответственно, передавать в AuthModel объект подключения бд вообще не нужно, он понадобится только в DatabaseUserRepository, так как запросы у нас происходят в нем, а AuthModel не должен взаимодействовать с бд. в фреймворках на паттерн репозитория часто ложат хуй, что иногда оправдано, а иногда - нет. Например, в laravel ёлка работает как active record и там класс сущности сам себе является репозиторием. Тем не менее подобный код поиска сущности все ещё можно и нужно выносить в сервисные классы, экшны или query, если код по CQRS организован, чтобы не захламлять и не дублировать логику 3. Класс авторизации не должен сам проверять хеш. Нужен отдельный класс PasswordVerifier с методом для проверки пароля, принимающим аргументы из хешированного пароля и открытого. Соответственно, точно так же он должен передаваться в AuthModel через конструктор вместе с репозиторием из пункта 2. 4. субьективщина Нейминг говно, AuthModel я бы назвал AuthService, Authenticator или ещё как-то.
Да, удивительно, конечно, как тебя вообще взяли, без обид. Я думал, что до такого кода даже в последней галере доебутся если галера не на битриксе или вордпрессе, конечно, там в ядре код хуже написан
Очень интересует вопрос, насколько разумно получить первую работу в php, отработать 1 год и после этого пойти на вакансию java? О том, что не смогу учить параллельно работе, не переживаю.
Слышал от некоторых медиа личностей, что рекомендуют вкатываться через php, т.к. востребовано (без битриксов, вордпрессов и проч). Особенно когда сейчас так пугают, что попасть на вакансию тяжело. Важно, что для первой работы мне нужна удалёнка, дальше уже офис. Что думаете?
>>2586073 Если хочешь в итоге вкатиться в джаву, лучше с неё и начинать, перекатываться всегда непросто. Если вариантов для вката в джаву сейчас нет, а в пхп есть - то пробуй пыху сейчас, а там посмотришь.
> Только мне уже тимлид сказал, что я тут https://codeshare.io/OdVyqA нарушил один из принципов SOLID (класс должен решать одну задачу),
Не очень понимаю, где тут нарушение SOLID в таком маленьком классе. Но тут есть 2 других косяка:
- ты подставляешь переменную напрямую в SQL-запрос, чем открваешь возможность SQL-инъекций. Нужно использовать плейсхолдеры
- ты из класса подсоединяешься прямо к БД. Это плохо, нужно было передавать объект mysqli в конструктор класса. То есть, класс не должен сам искать, где ему взять соединение с БД, ему это соединение должны передать снаружи.
Наверно дурацкая аналогия, но когда ты приходишь на завод, ты не покупаешь сам инструменты в магазине, а тебе дают уже готовые. Так же и твой класс, ему должны были дать соединение к БД, которое нужно для работы.
> Нужно сделать интерфейс UserRepositoryInterface и его имплементацию DatabaseUserRepository, соответственно, в нем должен быть метод findUserByЧеТоТам.
Если честно, это выглядит как бессмысленное переусложнение.
По моим ощущениям, паттерн Repository плохо работает в реальных проектах. Представь, что у тебя 20 сервисов, каждому из которых нужно искать юзеров по разным критериям. Тебе придется в репозитории сделать под сотню методов для них. Проще в этих сервисах искать то, что нужно. Так будет проще, потому что логика сервиса будет только в сервисе, а не размазана между сервисом и репозиторием.
Плюс, обычно Репозиторий по задумке отвечает за работу с одной таблицей, но на практике часто требуется выбирать данные из несольких таблиц сразу (например, юзер + история его платежей + подключенные тарифы).
Есть ли у тебя какие-то убедительные примеры, статьи, где использование паттерна Repository дает выгоду и это не проект уровня TodoList?
Пока что у меня ощущение, что Repository это неудачный паттерн.
>>2586336 Да, про инъекции я особо не заморачивался, а про SOLID он сказал, что мой класс выполняет две функции. И авторизует и подключается к базе данных. Но это подключение же должно хоть где-то происходить? Если оно не должно было происходить в модуле, то оно должно было бы происходить в контроллере. Но в контроллере и так своих подключений достаточно контролёр вообще может придерживаться принципа Solid?, хотя отображение за подключение не считается, наверное. Ладно, спасибо, глянуть надо, что и как
>>2586405 >Но это подключение же должно хоть где-то происходить? в бутстрапе происходит, и потом в конструктор передаётся хэндлер (объект mysqli или pdo) а у тебя фактически происходит коннект к базе при инстанцировании AuthModel если ты будешь гонять тесты, в которых AuthModel создаётся десять раз - у тебя будет десять подключений, что абсолютно не нужно
>>2586529 Ну то есть да, получается, что >фактически происходит коннект к базе при инстанцировании AuthModel Но если бы я это делал в контролере, то было бы то же самое, нет?
>>2586533 Типа да, но вообще ты и в контроллере это делать не должен. Должен быть конфигуратор, который инстанцирует все синглтоны (класс подключения к БД - это синглтон, потому что он нужен в одном экземпляре в отличии от entity и DTO), и пихает pdo в конструктор модели, а контроллер к модели обращается, но сам её не инстанцирует. Выучи Symfony, там всё это есть.
Тяжело решить задания "Yoda speak" и "Числа прописью". Йода спик решил, но не понимаю, как сохранить знаки препинания. Прям голова взрывается, я просто не понимаю, как найти решение в моей башке. То же и с заданием "Числа прописью", я просто хуею насколько это сложно.
Неужели у меня нет шансов вкатиться? Я такой тупой? Как так! За что? Или это у всех так в начале пути? Решал первый день эти задания, пока вот такие ощущения: что я ничтожество и никогда никуда не вкачусь, что "думать" это не про меня. Пока не хочу поддаваться нытью, поэтому продолжу думать. Если за неделю не решу эти два задания, то придётся смириться.
>>2587163 Не, там всё просто. Даже проще заданий про кредит здесь. Там же чисто по синтаксису дрочат и всё. Я вот прям щяс прошел 15 уроков, потом чекнул что там дальше, ну как и сказал - дрочка синтаксиса. Синтаксис я и так уже знаю. Спасибо за совет.
>>2587261 Я говорю вам о трех превращениях духа: о том, как трейни стал джуном, джун – мидлом и, наконец, мидл – сеньером. Много трудного существует для духа, для духа сильного и выносливого, способного к почитанию: всего самого трудного и тяжелого жаждет сила его. "Что такое тяжесть?" – вопрошает выносливый трейни, становится, как джун, на колени и хочет, чтобы его хорошенько навьючили. Но там, в безлюдной пустыне, свершается второе превращение: там мидлом становится дух, добыть себе свободу желает он и сделаться господином пустыни своей. Там ищет он своего последнего владыку: врагом хочет он стать ему, последнему господину и Господу своему, до победного конца хочет бороться с великим кабаном. Кто же он, великий кабан, которого дух отныне не хочет признавать господином и владыкой? Имя того кабана – "Ты должен". Но дух мидла говорит "Я хочу в гэп". Зверь "Ты должен" лежит на пути его, переливаясь золотой чешуей, и на каждой чешуйке блестит золотом "Ты должен!".
>>2587504 Я правильно понимаю, что PHP таким образом создаст один экземпляр класса для всех клиентов, которые запросили информацию у сервера. То есть сервер не будет повторно инициализировать экземпляр для каждого клиента? А когда этот экземпляр удалится? И когда он первый раз инициализируется?
>>2587708 Нет не правильно. Пыхо процесс инициализируется для каждого запроса отдельно. У тебя в каждом запросе будет создаваться экземпляр синглтона. При шатдауне процесса память будет очищаться. С fpm немного сложнее но не принцириально. Вообще для персистент коннекшион синглтон инкапсулирующий подключение не нужен. Оно и так из коробки работает. Синглтоны или звездные объекты удобны архитектурно и для экономиии памяти. Например User текущий - ты знаешь что работаешь с одним объектом в конторолере и мидварах. Или Request и тд
Всё ещё рекомендуете вкат в PHP? Меня заебало, что вокруг меня одни айтишники, хвастающиеся своими доходами, да и сам я в техподдержке за копейки работаю пару месяцев. Постоянно желание вкатиться, технические темы интересуют, хуё-моё.
>>2587823 Я просто понял, что тут надо быть настоящим задротом, иначе хуй ты че сделаешь. Это тебе не учить детей или работать гейологом и описывать керн ёбанный. Там думать не надо, запомнил один раз как че описывать, как кого чему учить и усё, там больше пиздеть надо. А вот тут ты ебать пиздец задачи сука решай хуё-моё туда-сюда. Это тебе не это дружочек. Надо сидеть и красноглазить по 6-10 часов в день С ИНТЕРЕСОМ, иначе ты ничему не научишься.
>>2587834 +геморрой, мне кажется еще хуже чем кодерство, даже не встанешь из руля. Когда кодишь можешь хотя бы вставать на минутку каждые полчаса-час, жопку размять, покрутить бедрами из стороны всторону и всё такое. А там все пизда будут вырезать тебе уже лет в 35-40. Нахуй надо. Придумай что-то получше или стань задротом и вкатывайся с нами в бекенд.
>>2588044 Шансов мало, в битриксе шансов много, это супер изи. На норм стек хуй там плавал. Надо прям везде светиться: хх, дискорды, группы в тг и т.д. Чем больше активности, тем больше шанс дойти до интервью. Правда не стоит это делать не подготовленным, иначе засрешь один шанс, некст раз не раньше чем через полгода будет - раньше этого срока на тебя не будут обращать внимание, если ты уже обосрался.
По поводу знаний в шапке всё есть. Можете еще задачи на литкоде поебашить и почитать поверхностно про алгосы в книге типа "Грокаем алгоритмы" или на метаните, правда там шарп, но знания шарпа нужны поверхностные, больше "основы программирования", чтоб понять о чем речь.
>>2571790 (OP) Аноны, меня, почему то, очень гложет тот факт, что я не могу работать в топ компаниях, потому что я тупо не смогу решить их задачи, да и не шарю я в вышмате, в алгоритмах или в чем нужно шарить? Я даже задачу понять не могу, а как решать, тем более. Можно ли это исправить, или в том же Яндексе без знаний вышмата лучше не сказаться?
пытаюсь установит nginx по этой инструкции. все хорошо до момента, когда пытаюсь на http://localhost:8080 должно быть "Вы должны увидеть такую страницу с текстом «Welcome to nginx!».", а у меня страница не найдена. В чем проблема? Я гуглил нихуя найти не смог. В логах вот эта ошибка 2023/01/26 21:56:28 [emerg] 18053#0: unexpected end of parameter, expecting ";" in command line
Погуглив ошибку, я понял, что могут быть забыты скобки в конфе nginx, проверил все в редакторе, все заебись. Я ХУЙ ЗНАЕТ ЧТО ДЕЛАТЬ.
Рассмотрим как установить веб-сервер самостоятельно.
Установим последнюю версию nginx:
brew install nginx Поскольку порт 80 требует прав администратора, а homebrew по умолчанию устанавливает софт с пользовательскими правами, то работать nginx будет на порту 8080.
Запускаем nginx, чтобы он работал в фоне и обслуживал наши запросы:
brew services start nginx Индикатор успеха:
==> Successfully started `nginx` (label: homebrew.mxcl.nginx) Проверяем, что всё установилось корректно, и nginx успешно работает на нашем компьютере. Откройте любой браузер и введите в адресной строке следующий URL:
>>2588661 Это про локальный сервер? Тогда ой зряяя ты все это вручную делаешь. Ты потратил на это кучу сил, а забудешь как ты это делал сразу, так как тебе это знания долго не понадобятся если вообще понадобятся. Качай спокойно openserver, mamp или другое и не делай себе мозги.
>>2588667 Не слушайте этого долбаеба. Элементарные админские навыки нужны вебразработчику. Не говоря о том что почти каждый сколько-нибудь опытный разработчик держит впску с докером. Попенсервер - 100% ый детектор лоускила.
>>2588677 я хочу доделать, я на это весь вечер убил два варианта со стейкофферло нихуя не помогли как эту хуйню запустить, чтобы он мне мой проект показывал в браузере?
>>2588680 я хочу доделать, я на это весь вечер убил два варианта со стейкофферло нихуя не помогли как эту хуйню запустить, чтобы он мне мой проект показывал в браузере?
через sudo sudo nginx -t nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
>>2588731 Ну вот с конфигом все впорядке. У тебя на порту 8080 ничего не висит другого? Может твой нжинкс и не зарущен. И ли там остатки твоих нужавшихся попыток в процессах весят. Перезагрузи свой мак
А тебе в принципе интересно разобраться, как решать такие задачи, или неинтересно? Если интересно, то ты можешь начать с изучения базовых вещей, таких, как алгоритмы и структуры данных. Порешать задачи с codeforces или leetcode. Если непонятно, можно в нашем треде спросить совета.
Математика не очень нужна, если только тебя не интересуют нейросети и машинное обучение (это очень крутые технологии). Тогда придется математику подтянуть.
>>2588755 sudo brew services start nginx Warning: Taking root:admin ownership of some nginx paths: /usr/local/Cellar/nginx/1.23.3/bin /usr/local/Cellar/nginx/1.23.3/bin/nginx /usr/local/opt/nginx /usr/local/opt/nginx/bin /usr/local/var/homebrew/linked/nginx This will require manual removal of these paths using `sudo rm` on brew upgrade/reinstall/uninstall.
если кто-то будет делать на маке, то вместо того что они пишут Запускаем nginx, чтобы он работал в фоне и обслуживал наши запросы: brew services start nginx
Допустим, у меня в ларавеле есть модели постов и комментов к ним. Должны быть такие эндпоинты, возвращающие жсоны: - все посты + к каждому последний коммент - просто все посты без последнего коммента - один конкретный пост + все комменты к нему
Я не понимаю, как нормально расщепить на два сервиса, чтобы один занимался только постами, а другой только комментами, чтобы не делалось лишних запросов к бд
Типа сделать сервис для постов с методами getAll и getById
И сервис для комментов с методами getAllByPostId и getLatestByPostsIds(array). Но это как-то пиздец всрато, этому последнему методу приходится передавать массив айди постов, для которых надо достать последний коммент, чтобы избежать н+1. И я хз как даже нормально запрос в нём написать
Я бы мог просто сделать eager loading для комментов, но мне же не на всех эндпоинтах нужны комменты, иногда только один коммент нужно достать из бд
>>2589308 зависит от твоей схемы. если посты хранят id комментариев, то можно сделать Post::getAll($criteria, $order, $offset, $limit) сделать $commentIds = array_map(fn($post) => $post->commentIds->orderBy('date', 'desc')->take(1), $posts) и сделать Comment::getByIds($commentIds)
>>2588677 Я это настраивал, а потом забыл. Для начала есть больше других полезных вещей, которые нужно пройти, потом уже можешь свой сервер настраивать
>>2589308 Короче я вместо отдельных сервисов для постов и комментов просто сделал методы withLatestComment(builder) и withAllComments(builder), которые к квери билдеру на посты через with добавляет комменты
>>2588737 Не, я говорю больше про работу на большие компании, если честно. Так то php особо в таких компаниях не используется, только Яндекс могу сказать и больше не знаю. Алгоритмы я допустим на базовом уровне выучу, но этого будет не достаточно. Я посмотрел в тестовом контенксте от Яндекса задачи на backend, я даже понять не могу что они хотят.
А кто сказал, что каждый сервис должен работать только со своей таблицей? Это, как ты убедился, не работает в реальности. Сервисы надо делать не по таблицам, а по задачам.
Здесь можно сделать сервис постов, который умеет выбирать и комменты к ним. Для управления комментами можно сделать отдельный сервис.
>>2590780 Там нечего учить, почитай документацию и попробуй запустить проект с докером - всё. Тебя никто не заставит писать docker image, поэтому можно посмотреть и для node или python, но больше запутаешься
Обрати внимание, что brew services ... и sudo brew services ... работают немного по-разному. Первый управляет сервисами, запущенными с правами пользователя, а второй - с правами администратора. Я бы сначала пробовал без sudo, если можно без прав администратора, то так проще.
Почему не стартует, трудно понять. Тебе нужно запустить команду, посмотреть, что она выводит, и может быть, посмотреть логи нгинкса на предмет ошибок или предупреждений.
Как я понял, команда services start работает успешно, но services info показывает, что сервис не запущен. Наверно, это из-за каких-то ошибок при запуске, информация о которых должна быть в логах.
Там написано, что права администратора не требуются, и перечислены папки, которые используются nginx. То есть, должно все работать без sudo. Но если ты уже запустил nginx с sudo, то может быть, поменялись права на файлы и сначала нужно его остановить и вернуть права обратно.
Если ты будешь разбираться и изучать, то рано или поздно поймешь. Можешь скинуть пример задачи, а я скажу, что надо изучить, чтобы научиться ее решать.
Может быть, тебе надо начать с решения более простых задач, а не браться сразу за самые сложные.
И не надо бояться математики. Она довольно логичная, и в ней можно разобраться при желании. Хотя, должен заметить, что часто статьи про математику используют усложненный язык, например, в Википедии часто все объясняется самым сложным образом.
Давай посмотрим, что такое Докер? Докер это система для создания контейнеров, запуска и управления ими. Контейнер - это что-то вроде изолированной системы, куда устанавливается программа и все ее зависимости (библиотеки, расширения). Например, ты можешь создать контейнер с PHP определенной версии.
Контейнер создается с помощью консольных команд Линукса. Изначально Докер дает тебе абсолютно пустой контейнер, в котором ничего нет. Например, чтобы создать контейнер с PHP, ты пишешь команды, которые:
- устанавливают в контейнер базовые бибилиотеки из дистрибутива вроде Alpine Linux - скачивают в контейнер исходный код PHP - скачивают нужные зависимости - устанавливают в контейнер компилятор Си и его зависимости - компилируют и собирают интерпретатор PHP - устанавливают в контейнер нужные конфиги для PHP
- основые Линукса (файловые системы, права, процессы и тд) - основы командной строки Линукса - основные консольные команды Линукса - как использовать компилятор, как компилировать и собирать программы на Си, попробовать самому что-то собрать - документацию по Докеру
Без этих знаний максимум, что ты сможешь сделать - это запускать уже собранный и настроенный кем-то контейнер по инструкции, в случае, если он настроен идеально и при работе не возникает никаких ошибок. Такое бывает, но не всегда.
То есть, если ты думал, что надо начать с изучения Докера, то нет, ты ошибся, надо начать с изучения Линукса.
- изучить протокол HTTP - изучить принципы REST (их, по моему, 6 штук) - почитать про SOAP
Что касается RPC, то это значит "удаленный вызов процедур". Процедура это по сути функция, которой можно передать какие-то параметры и она вернет в ответ какой-то результат. Отличие RPC от обычного вызова в том, что функция находится на другом компьютере. Поэтому ты не можешь ее просто так вызвать, а должен отправить параметры, с которыми надо ее вызвать, и в ответ получишь результат.
Или ты имел в виду JSON RPC? Тогда надо просто погуглить этот протокол.
>>2584408 Можешь, пожалуйста, ответить на вопросы? Что такое единый интерфейс в rest api? Как можно идентифицировать ресурсы? .../post/123 - вот это и есть идентификатор? Что вообще такое ресурсы? Index.php может выступать в роли ресурса?
Как организовать лучше ветки в учёбном репозитории гита? У меня два источника задачек которые я решаю и хочу закидывать в две разные папки в один реп.. Все просто скидывать в мейн?
>>2594153 Спасибо, я изучал математику по mathprothi, но это все равно долго, да и не получилось освоить. А какие разделы нужно изучить, чтобы решать такие задачи? Все?
Начал учить php по слитому курсу от Skillbox, хотел узнать у вас подобные курсы это норм для базового изучения или они не охватывают чего то важного, а может нужно больше практики. Мимо проходил, хотелось поинтересоваться, что не трачу время неэффективно.
>>2594920 Псры дрочил, миддлвари дрочил, мвц дрочил, сборку проекта из отдельных элементов вместо цельного фрумворка дрочил? На стандартные функции блевал? Убунты, пхп-фпмы настраивал? Если нет, то плохой курс.
Ресурсы - это какие-то объекты на стороне сервера, с которыми мы хотим что-то сделать. Например: фото, комментарий, пост, пользователь, выданный бан, ит.д.
Многие команды состоят из действия и объекта, например: "погладь кота Василия". В HTTP действие это метод (GET, POST, DELETE), а ресурс это объект над которым делается действие.
URL это идентификатор ресурса, например, /post/123 или /user/ivan/bans/12345.
> Index.php может выступать в роли ресурса?
Только в том случае, если у тебя система управления файлами и index.php является одним из файлов, с которым ты хочешь что-то сделать (удалить, отредактировать и тд).
Да. Ветки предназначены для создания временных копий репозитория. Например, если ты хочешь внести какие-то правки, которые требуют неделю, ты можешь создать ветку, вносить правки в неё (при этом не мешая коллегам), а после окончания работы смерджить результат в главную ветку.
Попробуй начать с понимания, зачем это придумано. Зачем вообще нужно документировать API? Очевидно, для взаимодействия между людьми:
- проектировщик может описать API и отдать кодерам в качестве задания - бекендер может дать документацию фронтендеру - компания может дать документацию партнерам или клиентам - разработчик может дать документацию тестировщику для тестирования API - новый пришедший разработчик может ознакомиться с документацией и быстрее влиться в проект
Документация может быть написана хоть в Ворде текстом, но машинночитаемый формат вроде OpenAPI лучше. Это позволяет:
- генерировать из нее красивую человекочитаемую документацию наподобие такой: https://api.apiship.ru/doc/ (это реальная документация к реальному сервису) - делать автоматические тесты, проверяющие, например, что возвращаемый формат данных соответствует описанному - генерировать заготовки кода, а когда нейросети станут помощнее, то наверно и сам код будут генерировать
OpenAPI позволяет описывать (по моему, в формате YAML, его тоже надо изучить) способы авторизации, все эндпойнты, все типы параметров и возвращаемых значений.
Ее не всегда пишут руками, иногда с помощью каких-то GUI утилит, иногда генерируют из кода.
Что делать с вложениями в API, если нельзя создавать, если нельзя создавать вложения третьего и более уровня? Ещё вопрос. Есть сущность главная, а эта главная сущность имеет ещё сущности зависимые. Получается нужно сделать Главная сущность/зависимая сущность/главная сущность? Но три вложенности делать нельзя, да и странно это выглядит. А что делать тогда? Вот пример: в научном портале есть научные статьи - это главная сущность. А есть ещё авторы этих статей. Так как мы должны использовать логические вложения, а статья тут главная сущность, то получается, что Научные статьи/авторы статей. Чтобы получить всех авторов определенной научной статьи, пишем Статьи/id/авторы. А что делать, чтобы получить все статьи определенного автора? Статьи/автор/id/статьи же не напишешь, тут три уровня вложенности.
>>2597371 Поправлю вопрос. Как правильно писать пути в API? Вот пример: в научном портале есть научные статьи - это главная сущность. У статей есть авторы. Так как мы должны использовать логические вложения, а статья тут главная сущность, то получается, что articles/authors Но статьи и авторы имеют свои поля (пример: название, количество страниц, авторы для статей и имя, в каком ВУЗе учится/преподает для авторов) И мы должны уметь вносить изменения, добавлять, получать новые сущности статей и авторов. Дело в том, что есть ограничения, нельзя использовать вложения третьего уровня. И так же не понятно, что делать, чтобы получить все статьи определенного автора. Как пример: articles/authors/{id}/articles может ли подойти? Ведь тут articles повторяется, да еще, возможно, тут вложения третьего уровня (хотя я, если честно, не совсем понимаю, точно ли это, ведь второй articles тут выступает в своем роде в роли команды, мол покажи мне все статьи определенного автора). Либо делать articles/{id}/articles. Но тут получается, что есть и такой вариант и такой articles/authors,я не уверен, что это правильно?
Сап линукс стоит год на основной машине. Терминалом пользуюсь, но многое все равно делаю через гуи. Как научиться делать всякие изощренные цепочки команд? Может есть какие-то задачки по типу "сделайте такую-то сложную операцию в терминале"? Кодить понемногу учусь, задачек полно, а с этим проблема.
>>2597532 Эта хуйня про вложенные функции это во многом пережиток нулевых, когда все топили за REST, HATEOAS и прочее. История показала несостоятельность всего этого, потому что апи - это штука не для людей, а для машин, которым не важны такие "самоописуемые красивости". В GRPC к примеру просто есть сервисы и методы у них. Рекомендую тебе не запариваться и делать плоскую схему, отдельно `/users`, отдельно `/articles`. Тем более что вложенность тут может быть вообще не очевидной. Что, если у статьи несколько авторов? А что, если статья написана не автором, а скажем импортирована откуда-то? И тд и тп. Короч плоская схема гибче и удобнее для всех.
Сап, завтра иду устраиваться на работу. Может кто-то рассказать как все это происходит ? Собес уже был, и офер скинули. Я просто приду, попизжу с начальством, подпишу договор и все?
Вопрос по html, наверное. Проблема уже решена, но мне любопытно узнать о ней больше.
Итак. Решил я подреактировать книгу в epub-формате, хотел сделать курсивом стихотврные вставки. И столкнулся с проблемой - теги <i> и <em> хоть и выделяют текст курсивом, но ломают его (в Суматре не отображаются первые буквы, а в телефоне отображаются, но некоторые буквы в средине слова почему-то выделяются жирным шрифтом, хуйня всякая). Методом научного тыка и заглянув в другие электронные книги, поменял класс Z на Z1 и все пофиксилось.
Где можно прочитать про эти классы - Z и Z1, в чем разница? Гугл ничего не говорит, он знает только про z-index, но это что-то другое.
Авторы не вложены внутрь статей. Так как один автор может, например, написать много разных статей.
И статья не вложена внутрь автора, так как у нее может быть много авторов.
Потому правильное решение тут сделать авторов и статьи отдельно:
/author/123 /article/123
Если тебе нужен отдельный URL для получения статей автора, можно сделать так:
/author/123/articles/ - вернет список статей.
Ты можешь вернуть либо просто список id, либо краткую выжимку о каждой статье (название, реферат, дата публикации итд).
А можно просто эти данные отдавать при запросе /author/123. У каждого подхода есть плюсы и минусы.
Пример вложенной сущности - это пост и коменнтарии к нему: /post/123/comment/456. И то, мы можем захотеть сделать раздел "последние комментарии" и тогда логичнее будет сделать комментарий отдельной сущностью.
Изучи базовые команды работы с файлами вроде ls, cp, mv, rm, find, затем команды обработки строк вроде grep, sort, head, tail, wc, cut, sed, затем команды получения системной информации вроде ps, ip, mount, lsof, df, du.
Этого хватит для 80% случаев, когда тебе надо решить задачу вроде "вывести 3 процесса с наибольшим потреблением памяти" или "найти 5 самых больших файлов на диске".
Найди в гугле первую статью про регулярки и прочитай. Не понял? Найди вторую статью и прочти. Не понял? Посмотри видео. Не понял? Сделай перерыв хотя бы на несколько часов, а потом прочти что-то еще.
Если после 5 статей/уроков тебе все еще что-то непонятно, напиши здесь что именно непонятно, и я попробую помочь.
Можете пояснить почему указание класса впереди не засчитывает правильный ответ, а если его убрать засчитает? Как мне тогда искать локатор в нескольких классах?
Сап анон. Переодически слышу от разных людей, что пыха, мягко говоря, не самый хороший язык. Может кто рассказать, откуда такой хейт в сторону этого языка и почему? Сам писал на петухоне, когда только начал знакомиться с программированием, сейчас с недавнего времени пишу на Go в одной конторе, но чувствую, что останусь там ненадолго, поэтому посматриваю в сторону пыхи, чтобы вкатиться куда-нибудь уже через нее.
>>2607616 Все просто. Потому что я не пишу на PHP. Мне интересно мнение от людей, которые непосредственно работают с этой технологией, потому что они уже споткнулись о множество подводных камней.
>>2607613 Хейт потому что надо что-то хейтить. Хейтить имеет смысл только популярное, желательно, максимально доступное массам и имеющее какие-то альтернативы. Вот поэтому и хейтят пыху. При этом настоящие кривое в рот ебаное говнище говна из жопы, вроде крестов и жс, никто особо не хейтит, ведь в их парашных нишах альтернатив нет.
Можно ли вкатываться в 2023? Когда то давно пытался вкатиться в пхп, но забил (у меня депрессия тогда была). Смотрю ща вакансии, чет не много совсем, а на джунов вовсе ноль. Стоит?
>>2608266 >Смотрю ща вакансии, чет не много совсем, а на джунов вовсе ноль. Это ты где такое смотришь? И на хх, и на хаброкарьере и в тг-каналах есть вакансии для джунов. Я в пятницу сделал первый отклик, на следующей неделе пойдут первые собесы. Думаю, вкатыватсья стоит.
>>2608266 есть одно простое правило как понять, стоит ли вкатываться или нет: не стоит вкатываться тем, кто спрашивает, стоит ли
остальным однозначно стоит пробовать в этой жизни что-то новое, но не держаться слишком долго за то, что и не нравится, и не получается
есть каста людей, которые постоянно что-то начинают делать, но не продолжают, еще в народе обычно говорят "не доводят дело до конца", вот в IT такие люди проявляются в том числе вопросами "стоит ли вкатываться?", опытные прогеры в сообществах постоянно видят таких персонажей, некоторые из них по несколько лет только и спрашивают, стоит ли вкатываться, работают какими-нибудь эникейщиками или поступают на очередное высшее и сидят параллельно в чатах и спрашивают, а стоит ли вкатываться, но не вкатываются
я видел много успешных прогеров, которые стеснялись спросить что-то толковое по делу, но не могу вспомнить еще ни одного состоявшегося "стоитливкатываться"
>>2608413 Бля, чел. Я вот сам пока не вкатился, но даже для меня очевидно, что в таком случае надо самому чекнуть вакансии на рынке, количество откликов на одну вакансию, порог входа и динамику на рынке - из этого делаешь выводы и вкатываешься(в твоём случае). Может какие подводные есть, тогда спрашивай по сути. Вот как ты сам бы ответил на вопрос "Можно ли вкатываться в 2023?" Как по мне на PHP в целом потупее конкуренты, можно выделится. Да и ~10-20 человек на вакансию всего(в сравнеении с другими бекенд языками где по 100 человек), ЗП тоже не сильно отличается если не планируешь всю жизнь на цмске сидеть. Но это для рынка в моей стране, у тебя по другому может быть.
>>2608266 > Можно ли вкатываться в 2023? Когда то давно пытался вкатиться в пхп, но забил (у меня депрессия тогда была). Смотрю ща вакансии, чет не много совсем, а на джунов вовсе ноль.
Джуны больше не нужны (уже лет пять как), единственный вариант наебать с опытом но это сложнее чем сам вкат хех
>>2611668 Вообще у разных контор они могут отличаться, но нанимай я джуна (обычно впрочем не нанимаю), то мыслил бы так: Чего я хочу? Чтобы он приносил какую-то пользу. Чего я не хочу? Чтобы он ебал мне мозг или тратил моё время сверх необходимого.
Соответстенно, у хорошего джуна я бы ожидал хорошее понимание основ и, главное, концепций. Что такое клиент-сервер, миграция, мок, транзакция в базе и тд. Чтобы можно было ему написать "Нужно сделать ручку в апи, которая делает вот это, в рамках транзакции и ещё нужно будет адвизори лок на вот это сделать, а то вот тут рейс кондишен будет. Ну и тест потом напиши, вот этот сервис надо будет замокать" и джун не просил значение прям каждого из слов, а мог пойти и попробовать по аналогии с уже существующими ручками/тестами что-то написать, какой-то псевдокод и прийти ко мне с уже более осмысленными вопросами. К примеру "ты сказал, что нужен адвизори лок, как это правильно сделать вот тут? Мне нужно прям в методе репозитория для такой то сущности его реализовать?". А я бы ответил "нет, у нас используется компонент Locker для этого, подключи его через DI и юзай, вот тут смотри примеры использования".
Обобщая, джун, которого бы я хотел нанять, может не знать, как сделать что-то правильно, но он хотя бы понимает, о чем концептуально идет речь и как это можно было бы погуглить и где посмотреть. Ну и знать бест практисы своего стека, хотя бы теоретически, на словах.
По софт скиллам, это сеньор может выглядеть, как усталая выгоревшая котлета и то не стоит, проверено на своем опыте, hr такое в штыки воспринимают, так как им платят за опыт и навыки. Джун же первое время работает в минус работодателю, пока не освоится, поэтому он на собесе продает грубо говоря ожидание того, что он быстро станет профицитным. То есть, должен выглядеть как чел, который или разбирается, или готов в короткие сроки разобраться с чем угодно. Быстро думает, быстро пробует, адекватно воспринимает критику и всё такое. Ну и что готов въебывать, да.
В идеале также джуну бы иметь какие-то примеры кода, выполненных тестовых заданий или пет проектов. Банальный туду лист (можно даже чисто апи) и то хорошо подойдет. Но только он должен во первых быть хорошо сделан (по бест практисам и гайдлайнам), а во вторых в идеале джун должен иметь возможность пояснить, почему он сделал именно так или хотя бы своё мнение почему бест практисы советуют делать что-то именно так.
Может показаться, что тут много всего, но то, что джун же первое время работает в минус работодателю - это к сожалению не шутка, я от самих владельцев бизнеса слышал, что средний джун вообще в принципе начинает работать в плюс в среднем через год после найма. А всё это время ему платят запрлату и он ещё и отвлекает других сотрудников, причем зачастую они тратят от трети до половины своего времени на менторство. Отсюда и надо действовать.
>>2612813 > средний джун вообще в принципе начинает работать в плюс в среднем через год после найма. А всё это время ему платят запрлату и он ещё и отвлекает других сотрудников, причем зачастую они тратят от трети до половины своего времени на менторство И при этом кстати половина джунов через полгода-год любит уволиться или потому что поняли, что это не их или потому что внезапно решают поменять работу. И ещё часть джунов же не справляется и их приходится увольнять, то есть они в принципе не окупились. Поэтому нет ничего удивительного в том, что джуну сложно найти работу, для работодателей джуны это боль и гемор зачастую.
Может быть, там просто заложен определенный ответ?
Мне не нравится твое решение, так как ты написал "третий элемент с конца", в то время как тебя просили найти "первый элемент bento". То есть, ты делаешь не то, что требовалось. Если на стол добавить пару других элементов, и бенто перестанет быть третьим с конца, то твой селектор перестанет работать.
>>2612909 У го есть много черт, за которые его можно справедливо критиковать, но чего я не понимал никогда, так это критики блять маленькой и большой буквы. Это как критиковать php за $ перед переменной. Казалось бы, какая разница, писать Property или вместо public property? Кстати, по опыту (на го пишу уже несколько лет), первое потом даже легче воспринимается на месте использования, а не объявления. Примерно как с php, кстати, глаз тренируется цепляться за $ и код очень легко читать.
>>2574114 Вот вроде здесь чел говорит, что сейчас на битриксе можно писать нормально. Пиздит? Или конторы говно и не могут в нормальную разработку? https://youtu.be/Jx-Us1Hs8-U?t=25
>>2571790 (OP) Насколько быстро можно вкатиться в битрикс, если я неплохо знаю пхп для вкатуна, и на базовом уровне знаю ларавель (состряпал небольшой круд с аутенификацией, которая из коробки)? С джуновскими вакансиями сейчас не оч, а на те что есть на удаленке 100-200 откликов.
>>2615910 >D7 Лол, тупо для маркетинга высрали тонну говнокода с ООП ради ООП, который под капотом использует весь предыдущий говнокод, забили хуй на полпути и в итоге получили переплетение D7, говна мамонта и окаменелого говна мамонта
В этом есть плюсы, например, не надо писать огромное JS приложение, не надо утяжелять им страницу. Более того, уже есть готовая библиотека (pjax) для этого.
>>2617581 На пыхе оно не особо часто используется, если не брать крупные компании. Большинство вакансий на пыхе - это один монолит среднего размера на symfony / laravel и слава богу, всем бы так
>>2618157 Беги оттуда, это всё, что можно посоветовать. Ты приобретешь очень мало полезного опыта, по сравнению с тем, что мог бы приобрести. Я с 3 курса уже работал в аутсорсе, в итоге к окончанию маги уже был миддл+ левела и имел в портфолио проекты всяких крупных европейских и американских контор типа johnson & johnson. Хороший старт по сравнению с теми одногруппниками, которые только начали искать работу после окончания маги. Подозреваю, что обгоняю большинство из них по зп на ~200к, но мне ещё пару раз везло с работодателями уже после аутсорса
>>2618214 Нехуй жить в глубинке, что сказать. Как бы, по определению, в глубинке меньше хороших вариантов и больше всратых. По увеличению качества работодателей и суммы зп: Штаты > Европа > Москва > прочая Российская глубинка Кстати, универов это тоже касается.
> у меня в глубинке только битрикс. А только ли он? Хз, скажи название глубинки
>>2621093 Смотря что ты понимаешь под битриксом, но вообще нет. Битрикс - кусок говна и crm. Ларавел - неплохой фреймворк. Это в первую очередь разные инструменты, с, во вторую очередь, различным уровнем качества исполнения.
Есть ли у Laravel объективные плюсы перед Bitrix кроме бесплатности? У Bitrix тоже есть ORM, контроллеры, роутинг, middleware, кеши, итд, но в дополнение еще идет множество разных интеграций, готовы компоненты, админка.
Поясните, пожалуйста, какая связь 1С, Битрикса и PHP? Есть смысл иметь стек из всех трех технологий? Сам зеленый-вкатыш в 1С, но часто в ваках мелькает и битрикс и пхп и всё остальное, что с пхп связано.
>>2621649 >>2621653 Че ж ты самое главное не написал: приставка "1С" у битрикса это разводка для гоев, чтобы они думали что если у них есть бухучет 1С, то сайт будет легко интегрировать, типа совместимые продукты.
Что разумеется не так и битрикс имеет такое же отношение к 1С как к >>2621659 Ил-2 Штурмовик.
>>2621739 Я другой анон, хотел спросить вот что - ты учил всю эту 1С-ную подноготную? Ну там 1с бухгалтерия, 1с управление предприятием, 1с кадры, 1с управление тороговлей?
>>2621833 Значит пока я вкатываюсь в пхп мне надо на работу устроиться оператором 1С чтобы изнутри узнать подноготную всех этих 1С программ! Как они работают - как в них работать
>>2621739 >Хуйню несёшь, она интегрируется с битриксом из коробки Сильное заявление. То есть этот модуль не кусок говна, который просто не будет работать по миллиону причин, а прямо из коробки все у него охуенно? А доказательства этому какие-то есть?
А то я как не напишу в гугле "битрикс интеграция с 1С" так там обязательно кто-нибудь рассказывает про газовую еблю длинной в месяц, подводные камни или вообще советует писать самому. А на официальном форуме самая популярная тема с гигантским отрывом это тот самый "Модуль обмена для БУС". 4к ответов 5 лямов просмотров https://dev.1c-bitrix.ru/community/forums/forum26/ . Наверное люди просто "спасибо" пишут. При этом в теме по обновлениям документации всего 500к просмотров, кек.
Коробочное решение, ага. Ищи его на Говнокод.ру бесплатно без писечек и смс.
>>2621649 Разделяй эти вещи. PHP это язык программирования, одна история. На этом языке написана CMS (то есть некий конструктор для создания сайтов), это вторая история. Битрикс принадлежит компании 1С, это третья история.
Соответственно, знать php это норм и делает тебя php-программистом. Знание битрикса делает тебя "битрикс программистом", что не очень, потому что CMS сиречь конструкторы сайтов это довольно ограниченные штуки, которые ориентированы на то, что ими будут пользоваться не особо технические люди, поэтому они ориентированы на накликивание всяких настроечек в интернете, натягивание "готовых" тем из магазинов и всё такое. Поэтому чаще всего "работа" битриксоидом это сравнительно тупая работа накликивателем сайтиков на заказ, она не особо ценится и за неё мало платят по сравнению с настоящей разработкой каких-нибудь сложных технических продуктов. Плюс, битрикс сам по себе очень некачественно сделан с точки зрения программирования, очень плохой код, плохие паттерны и тд и тп. Статей на эту тему много на том же хабре.
Про 1С ничего конкретного сказать не могу, это компания с кучей продуктов. К примеру, "1С предприятие" и аналоги это видимо стандарт на СНГшном пространстве и от них не уйти. Но программирование этих средств для автоматизации предприятий и бухгалтерии - это отдельная штука и с битриксом общего не имеет.
>>2621629 Главное, это очень разные вещи, примерно как раскладной столик (битрикс) и чемоданчик с инструментами (лара). То есть, первое - это конструктор для создания сайтов и заточен он на конкретно создание сайтов и управление сайтами, возврат веб страничек с содержимым, управление страницами, стилизацию этого дела и тд и тп. Со скидкой на то, что это очень грубый инструмент, потому что заточен под "накликивание". А второе это фреймворк, то есть набор компонентов/инструментов, с помощью которых ты можешь делать сайты, апи, телеграм ботов, бекенд для игр лол и тд и тп. Ты сейчас скажешь, что на битриксе тоже есть все эти компоненты, но проблема в том, что они там есть довольно условно, их никто и никогда не создавал с мыслями об универсальности, они написаны исключительно для того, чтобы быть в составе битрикса и хорошо исполняют только эту задачу. С CMS вообще это популярная проблема, ты 30% времени ставишь новый модуль, а потом 70% времени сражаешься с ним, пытаясь заставить его делать не то, что он хочет, а то, что тебе нужно. С фрейморком ты простом сам запрограммируешь себе нужную логику под задачу.
Другое различие это качество. Лара - это один из двух самых популярных и качественных фреймворков на php. И при этом из этих двоих он несколько дружелюбнее к новичкам. При этом он известен и популярен по всему миру. А битрикс - это популярная только на постсоветском пространстве (то есть никаких западных заказчиков с $$$ нет и быть не может, что влияет на зарплаты) штука. По качеству она точно не входит в топы даже среди CMS. И по сравнению с точки зрения просто качества исполнения программного продукта, ларавел гораздно лучше запрограммирован, чем битрикс.
>>2623897 Смотря на чём ты разрабатываешь. В двух словах, маркируешь страницы или пути в роутере или allow-auth-only, или allow-everyone. Потом в отдельной подсистеме (в условном middleware, хотя зависит от архитектуры твоего фреймворка) проверяешь, если текущий путь allow-auth-only, а текущий пользователь это аноним - то выкидываешь или ошибку, или вызываешь фоллбек на показ страницы с инфой о том, что путь закрыт для анонимов. Лучше выкидывать ошибку (скажем 403, но оно конечно зависит) и потом просто задать для такой ошибки рендеринг в виде страницы с инфой.
Возмжно, проблема в том, что "1С" это не одна программа, а фреймворк, на котором сделаны тысячи решений. Ну представь, например, задачу "сделать обмен данными с магазином на Симфони". Ты можешь написать такой обмен для всех существующих магазинов на Симфони? То же самое и с 1С. Практически в каждой компании используется своя разработка на основе 1С, а не стандартная программа.
То есть, по моему ты просто не понимаешь сложности проблемы, а спешишь объявить, что 1С "кривой", потому что его авторы не смогли заложить возможность обмена чем угодно с чем угодно.
>>2624101 Это не фреймворк даже если они пытаются его так называть, а CMS, прекрати блять путать людей. Это пиздец какая натяжка. С этой точки зрения и джумла фреймворк, и вики-движок фреймворк и вообще всё что угодно фреймворк.
>>2624101 >Возмжно, проблема в том, что "1С" это не одна программа, а фреймворк Ну во первых я ничего не писал про 1С, хотя там тоже свой атмосфера. Я написал что "битрикс" никакого отношения к 1С не имеет, а приписка "1С" это наебка чтобы заманить клиентов, которым нужна функция обмена, на свое говно. Написанное десять лет назад школькниками за дошик.
Как правильно с урлами обходится? Вроде как если идёт речь о директории то должен быть слеш в конце example.com/dir/, а если файл то не должен - example.com/page.html, но сейчас понятно что никто .html файлы не использует и на разных сайтах вижу разное и example.com/page?param=value и example.com/page/?param=value. И как с корнем правильно - example.com/ или example.com?
>>2625838 Это всё херня из интернета девяностых и нулевых, когда это ещё были прям веб странички, которые тебе возвращал сервер. Сейчас уже пути, которые ты видишь в браузере не имеют вообще и тотально никакого смысла, потому что нет ни отдельных страниц (только роутинг и рендеринг на сервере), ни даже реального контента по этим путям (всякие js приложения рисуют или управляют этими путями как угодно). Поэтому правило одно - чем проще людям и чем меньше избыточности, тем лучше. То есть, никаких лишних знаков, слешей, расширений. https://www.google.com/a/b.html -> https://google.com/a/b https://google.com/ -> https://google.com
Когда я изучаю новую технологию, я по привычке, оставшейся от школы и универа, делаю краткие конспекты по ней (например, знакомясь с Redis, записываю в txt-файл самые полезные опции конфига, основные CLI-команды и функции). Вроде бы в документации это всё уже есть, но там либо много избыточной и сложной инфы (которой я никогда в жизни не воспользуюсь), либо наоборот недосказанность (не поясняют человеческим языком, как это юзать). К тому же своё говно роднее если долго не работал с технологией и надо быстро освежить память а память у меня как у печеньки , то на руках этакий мини-справочник. Но минус: технологии меняются, и мои шпаргалки становятся либо неполными, либо неактуальными. Приходится следить за апдейтами технологий и тратить время на правки, да и создавать их тоже долго. Вопрос: я занимаюсь фигнёй и стоит отвыкать от такого подхода, или смысл в этом есть?
>>2626957 > В итоге нашел какую-то говнолибу для пдф В этом и проблема, говнолибы позволяют добиться неких результатов, но в итоге ты просто упираешься в то, что в либе или чего-то нет, или что что-то хуёво работает и всё, приехали. То есть, ты сможешь делать пдфки, но не сможешь делать хорошие пдфки.
При этом варианты, запускающие хедлесс хром или анаглоги хороши тем, что html позволяет тебе сверстать и отдебажить через Ctrl+P прям в хроме что хочешь (можешь даже js запускать внутри страницы, чтобы что-то подправить), а хром гарантированно качественно рендерит pdf. Если у тебя проект не маленького размера, то полюбому есть какая-нибудь очередь задач, самописаня на раббите, gearman, celery, что угодно. Просто создаешь там таск, который делает docker run -it wkhtmltopdf и получаешь пдфку.
>>2626736 Это помогает, когда ты совсем зеленый джун. Со временем понимаешь, что во первых инструментов настолько дохуя и они нсатолько часто меняются, что ты заебешься это все поддерживать и актуализировать, во вторых, научишься быстро читать спеки и в третьих уже будет достаточно опыта, чтобы представлять, что ты хочешь сделать, как оно называется и где оно лежит, поэтому любую инфу просто одним коротким запросом из гугла тебе будет быстрее достать, чем копаться в своих самописках. Короче, болезнь новичка и пройдёт.
Не знаю, тут ли спрашиваю, но в htaccess rewrite rule работает только одно после группы условий? Мне нужно объединить 2 разных rewrite в один, если у первого не ставить флагов, а второму задать r=301,L - это будет работать?
Подходит ли сей язык для быстрого вката с последующим унижением на собесах или работе за Доширак на фрилансах? Или же есть языки программирования приносящие профит быстрее?
>>2627989 Если от этой жизни чего-то хочешь, то бери симфони. В офис походить пару лет не очень западло, зато потом человеком будешь. А битрикс это как подсесть на хмурого, закончишь в бомжатнике с разрушенной нервной системой.
>>2627942 В любом случае быстро не получится. Даже не так, задрочить что-то простенькое и потом сидеть на 40к в месяц можно изи, но тебе ведь не это надо? А для хороших рейтов нужно что-то уметь и для этого нужно многому научиться, во многом разобраться и при этом перестроить мышление на алгоритмическое, что непросто, если тебе не повезло со школой и в школьные годы этому не научили. Ещё программирование на любом стеке - это работа с целым набором технологий, всегда используешь какие-то протоколы, какие-то базы данных, какие-то разметки и файлы конфигурации и тд и тп. В-общем один "язык" ничего не решит, как тебе правильно сказали выше. Решит знание базы, которая +- одинакова везде (алгоритмы и структуры данных, сети и прочее) и при этом знание технологий конкретного стека.
Как стек для вката php в целом ок, удалёнка есть, дошик найдешь. Хотя я бы первые несколько лет порекомендвоал в офис-то походить, по моим наблюдениям, пока люди стоят в курилке или на кухне, да и просто вместе сидят и работают, они обмениваются многими знаниями и навыками. На ремоут лучше уходить уже миддлом хотя бы, когда нечему учиться у других и учишься уже у себя
>>2627889 Ну ты спросил, кто-то вообще использует апач. Офигеть. Я думал, что все уже на nginx пересели, лет 10 назад. по-моему все rewrite rule применяются последовательно, но могу сильно наврать
>>2627297 В целом нормально, хотя и не огонь. Чуть менее академично и чуть более грязно (всё-таки их фасады и работа через static это ну такое), но не критично. Если на ларе больше предлагают или проект интереснее (или просто больше/сложнее), то переходи.
Как реализовать доступ к файлу по ссылке, типа как у гугл диска? Просто добавить страницу в игнор robots.txt норм будет если в урле uuid и ссылка доступна в течении суток? Вроде рандом чел не сможет найти такую ссылку, даже если будет брутфорсить?
>>2628072 Да обычно тоже через rewrite, просто htaccess это чисто апачевская тема, я на неё и триггернулся
>>2628063 Да даже в robots.txt можешь не добавлять, гугловый краулер никогда не узнает о ней и потому никогда туда не перейдёт. Так что да, решается генерацией особо уникальной ссылки, если не вспоминать уже про авторизацию и нарезку доступов к ссылке по пользователям.
>>2628131 >Да даже в robots.txt можешь не добавлять, гугловый краулер никогда не узнает о ней Ошибка вот так думать. Лично видел как приватные страницы с uuid'ами в ссылке попадали в выдачу гугла. Лучше сразу подумать есть ли там что-то критичное и закрыть доступ на всякий.
Тимлиды, подскажите чё должен знать мидл? Я так понимаю технологии на первом месте, а потом уже задрачивается архитектура приложения/бд? Я вот начал учить redis, memcached, rabbitmq. На первый взгляд достаточно простые в использовании штуки, разве что пока не понимаю как работает репликация, но это, наверное, только для высоконагруженных приложений актуально. Достоин ли я буду звания мидла после изучения и практики вышеперечисленных вещей?
>>2628758 Да, когда к тебе на хату заходит новое тело, кидай ему под ноги полотенце. Если перешагнет - значит можно авторизовать.
>>2628807 Нормально базу (алгоритмы и структуры, плюс конечно же паттерны, хотя бы gof), нормально язык (стандарты и практики), нормально экосистему (самые популярные либы + свой фреймворк, включая его архитектуру и бест практисы), нормально сети (http1, 1.1, 2, https как минимум), нормально базы и очереди (хотя бы одну postgres/mysql/oracle/sqlserver + сам по себе sql как стандарт, ну и какой-нибудь rabbitmq или kafka. Redis или memcahed уже бонусом), нормально сопредельные технологии (git + git workflow, nginx, docker). > На первый взгляд достаточно простые в использовании штук Если забыть про acid, нормальные формы, уровни изоляции, индексы, оптимизацию запросов и вообще представление того, как работает планировшик, всякие особенности конкретного движка типа вакуума в постгре и тп. Ну и репликация, шардирование и партиционирование туда же, бонусом. Ну и наверное нужно понимать что-то про архитектуру, хотя бы те же паттерны, что-то слышать про ddd и вообще, структурирование домена, понимать, какая у вас используется архитектура (MVC к примеру или MVP, хотя это больше мобильная тема) и почему именно она. Слышать что-то про active record и почему это плохо. Про тот же DI знать и про разделение ответственностей между компонентами.
>>2629071 А, и я забыл пункт "радуешься, что пишешь на кастрированном языке и тебе особо не нужно учить особенности гц, рантайма, планировщика и тому подобные штуки". Пехапешникам на внутренности языка как правило похуй, хотя иногда всякие дрочилы на собесах любят спросить как массивы работают под капотом.
Подходит. Я так вкатился, сначала делал сайты в вебстудии за 20 тыщ, потом перешел в парашу на laravel за 80 тыщ, потом перешел в крупную компанию с дохулиардом кода на 250 тыщ.
Щас вот думаю куда дальше развиваться. В крупнопараше боюсь застрять. Я уже начал петпроджекты писать потому что с работой в крупняке забываешь че такое базы данных, забываешь че такое верстка, и так далее. Потому что не пользуешься. Ты пишешь пакет composer который другие ставят через composer require
>>2629116 Да в целом то же самое, но на более глубоком уровне. Условно, на миддла я бы ждал от тебя ответа на то "как и когда использовать индексы в бд", а на сеньора "как они работают, какие их типы бывают и какими ограничениями обладают, что такое селективность, когда имеет смысл их создавать, а когда это вредно, что, если их слишком много, что делать, если деградирует запись, что делать, если деградирует чтение" и тд и тп..
Сдвинь на 1, то что у тебя на синьора это мидл, то что на мидла это ждун. У синьки спрашивают системный дизайн. А лучше - с примерами из рабочей практики.
Вот вам нужно спроектировать приложение для института информационных технологий. Там должна быть интеграция с гитхабом, возможность проходить тесты, сдавать лабы и тд. Ну и вопросы.
>>2629474 Не спрашивают. Спрашивают все тот же солид и ебут загадками на индексы в базе.
Никто не будет у тебя спрашивать никакой когнитивно сложной хуйни просто потому что тот кто спрашивает только что подорвал сраку со своего рабочего места, а через час опять вернется работать работу. И ему еще пять интервью на неделе проводить.
Скорее всего спросят твое мнение по некоторым вопросам, типа нужны ли тесты, пидар ли мартин, в гробу какого цвета ты видел пср стандарты. И если твое мнение кого-то не устраивает, то скажут что перезвонят. Это гораздо эффективнее чем часами ломать голову над какими-то прожектами тех с кем ты срать в одном офисе не стал бы.
>>2629474 > У синьки спрашивают системный дизайн Одно из - да. Но всё остальное, что я сказал, тоже спрашивают. Норма это 2-3 собеса, алгоритмы, технологии и дизайн.
>>2629999 Все эти волшебные слова ничего не гвоорят, потому что непонятно, насколько глубоко ты это всё знаешь. Кстати, любопытно, что ты ничего не написал про алгоритмы или паттерны. я бы просто из любопытства глядя на такое резюме попросил тебя синглтон реализовать Вообще мне казалось, что в регионах джун может расчитывать примерно на 50к +- 20к в зависимости от своих скиллов, стека и везения/степени захолусться, в котором он живет. Ну и в Москве и Питере умножай на 1.5-2 всё, и доходы, и траты. Сейчас правда с рынком чёрт знает что происходит и никто тебе точно не скажет, кроме тех, кто прям сейчас нанимает или ходит по собесам.
>>2629999 Ты случайно не херка? А то ты намешал(а) все в кучу как херка. Smarty это привет из 2000 Про mysql какая-то шиза. Ты в mysql EAV знаешь? EAV это модель данных. Непосредственно к знанию бд отношения не имеет.
>>2629999 >SOLID и другие паттерны Тут все. Интервьюер встает и уходит проржаться.
Почитав твой пост начинаю наконец понимать нахуя на собесах спрашивают про этот ебаный солид, если никто его один хуй не использует. А это такой прикол для своих, секрет полишинеля. Человек в теме знает что никто по солиду не пишет, и человек который спрашивает об этом знает. А вот джун-пиздобол об этом не знает, и по этому начинает лечить что только по солиду и пишет.
Правильным ответом на вопрос "используешь ли ты солид" будет ответный вопрос "а вы сами-то как?", интервьюер отвечает "да по маленьку" и понимает что перед ним человек опытный, который шарит что пользоваться этой хуйней попросту невозможно.
>>2630105 И тут ты такой называешь контору где пишут по солиду. Даже похуй на каком языке. Жаль что дальше пойдут маневры и виляния сракой, но ни одного конкретного названия не будет.
1. Принцип единственной ответственности - тут и так понятно. Если в классе есть методы которые лезут в бд за инфой, обрабатывают ее и рендереят результат - то разбиваем все на тематику. и получится типа $o = new OrderRender(new Order(new OrderRepository())) и далее можно развить это в сервис, все это засунуть в OrderService который будет все это собирать внутри себя и для людей уже человеческие методы и уже его юзаем в контроллере фреймворка, а низкоуровневые классы в нем ебутся
2. Принцип открытости/закрытости - то что есть не меняем, а расширяем за счет классов на основе интерфейса. Допустим есть класс Storage() который сохраняет сессии, он принимает класс new Session - $s = Storage(new Session);, сам Storage закрыт для изменений, но открыт для расширений, мы ему передаем $s = Storage(new RedisSession); на основе интерфеса и он уже сохраняет сессию в редисе а не в сессии или в $s = Storage(new MySQLSession); Либо класс Storage отнаследовать и дополнить новым функционалом, а не менять то что уже есть.
3. Принцип Барбары Лисков - Объекты классов могут быть заменены их наследниками. Дает возможность использовать дочерние классы как и родительские. Допустим есть Который получает json книг из файла, мы от него наследуемся и получаем книги из mysql сохраняя один и тот же метод $x->getBooks(); - но сам принцип так себе, лучше на основе интерфейсов все делать без такого наследования, а то есть не наследуемые классы типа квадрат и прямоугольник и методы прямоугольника к вадрату присовывать? Нет.
4. Принцип разделения интерфейсов - есть интерфейс Птица, у него методы кушац и летать. А есть класс Пингвин, он как бы тоже птиц, но летать не может, разделяем интерфейсы (Птица->кушать(), ЛетающаяПтица->летать(), БегающаяПтица->бежать()) и вот все эти интерфейсы дописываем классу Утка и так же пингвину, только ему не дописываем летающая птица. А вот если бы был большой интерфейс то пизда. Так же можно с хостинг провайдерами, у кого облако Cloud, у кого CDN
5. Инверсия зависимостей. Ну как обычно у нас есть класс мы в конструктор передаем объект и его используем, так? А сейчас мы указываем интерфейс в __construct(Zaloopa $o) и вообще поебать что там теперь придет, внутри класса работает только с методами из интерфейса Залупа, а вот теперь в наш класс хуй пойми что не вставишь, туда только залупа влезет, и вот теперь мы уже голову ломаем не что туда придем и что нам ловить, а что туда теперь нужно всунуть чтобы заработало. - вот это и есть инверсия зивисимостей. Залупа неизвестно сколько см - это абстракция и мы теперь зависим от абстрации а не от чего-то конкретного, а 14-15см это детали, мы не должны зависить от деталей. Детали должны от абстракций, сколько хочешь см в анус столько и будет. Классы верхних уровней не должны зависеть от классов нижних уровней. Оба должны зависеть от абстракций. То что нам приходит - это классы нижнего уровня, шныри, ходят в базу, принеси-подай или может нарисовать че захочешь. А это, ебать, класс высокого уровня - содержит бизнесс логику, кручу-верчу наебать хочу, скидочки, денюжки, на черную пятницу цену якобы понизим лохам - но они опираются на классы низкого уровня. Так вот когда мы пишем под интерфейс мы вызываем метод save() сохраняя данные и вообще похуй как и где оно сохранится, мы только передадим класс репозиторий, а репозиторий чего это уже похуй, у них у всех один и тот же интерфейс, аналог PDO который и в мускл может и в постгресс и код один
>>2630116 Больное животное, нахуя мне твоя шизофазия? Ты давай мне лучше расскажи как мне отличить открыто там в коде или закрыто? Это ведь не сектантский бред, можно ведь код проверить на соответствие солиду? Напиши алгоритм, по пунктам, чтобы применив его к любому классу я мог сказать закрыт он или приоткрыт.
>>2630117 >пук Ну это слишком ожидаемо. А мог ведь и не оправдывать моих ожиданий и просто промолчать.
Сеньоры привет. У нас тут есть задачка со списком студентов. Нашел на гите вариант от анона https://github.com/Bocmah/student-list можно ли считать его вариант как хорошее решение? И если кто уже проходил местные испытания, то поделитесь эталонными решениями
>>2571790 (OP) Можете, пожалуйста, привести простые ну или не очень примеры принципа Code on done (код по требованию) в REST API? И можете объяснить про манипулирование ресурсами, самоописывающее сообщение принципа единого интерефеса?
Короче. >Она ни от чего ни защищает Пиздежь слепого долбоеба, все она защищает. После таких пассажей подумаешь десять раз прежде чем свой код сюда вываливать. Понапишут надуманной хуйни, а по сути дела нихуя не скажут.
Кстати, светанешь свою реализацию парсинга jwt? У пацанчика там чистый самопис, без компромиссов и сторонних библиотек. Так что? Набросаешь нам примерчик или будет стандартная шарманка про то что ты ничего никому не должен и пошел я нахуй? Чел вот не забздел и сделал приложуху. А ты хотя бы мааааленькую частичку его работы в состоянии сделать?
>>2632177 Эксперт по безопасности закукарекал. Если у тебя какая-то обида, пиши в жалобную книгу двача. Я просто проходил, мне некогда дотошно каждую строчку анализировать и разводить с тобой длинные дискуссии. Это самая топорная реализация которую можно было придумать. Проверять, существует ли куки или не существует. Это просто ебать смешно, утверждать типа "если по хешу студентов не найдёт", значит защита работает. Колхозная реализация.
>>2632213 Еще раз: то что ты написал в первом посте не соответствует действительности. Топорная, хуерная, самая, не самая. По факту работает. Кстати если в куке будет токен, то процесс мало изменится, ты расшифруешь токен, вытащишь из токена хэш и точно так же полезешь с этим хешем в базу.
Прочитать код тебе некогда, а выебываться на двачах тебе есть когда. Как итог - хотел выебнуться, а получилось только обосраться.
>>2632248 Это детская защита. Через CSRF картинку можно увести куку элементарно. Тем более, у тебя нет привязки девайса, нет ротации кук. Ты как один хеш поставил, так им можно пользоваться до пенсии. Токены сессии должны ну как минимум меняться при каждом логине.
>>2632253 Просто у тебя наблюдается расхождение желаемого с действительным. "Синьор должен". Ну охуеть теперь. Тебе хочется чтобы сеньор был кем-то особенным, какие-то новые обязанности, новые дела.
По факту сеньор может себе позволить мерджить более толстые пулл реквесты и поводить хуем по губам аналитикам и продактам найдя сходу какую-нибудь нестыковку в их планах. И 99% времени сидит и пишет код как все остальные.
Про ответственных за модуль очень смешно. У меня за последние лет пять меньше трех одновременно открытых проектов в шторме не было. Сколько там сотен "модулей" я даже не ебу. Ты создаешь мердж реквест, парни делают код ревью, все.
Какой нахуй "ответственный"? Если косяк в бизнес логике - за это отвечает аналитик и продакт, без их отмашки ты даже не начинаешь код писать. Если косяк в качестве кода - для этого и делают код ревью. Если им всем похуй, тесты прошли и код работает без ошибок, то тебя это тем более ебать не должно.
>Можно потерпеть, не каждый день синьора нанимаем. Ну тут ясно, собесы ты не проводил. Ты нанимаешь сеньора каждый день в течении двух месяцев. Тебе постоянно несут на посмотреть какую-то хуйню мутных и гиблых людей. У тебя постоянно как кол осиновый стоит это интервью на пять часов и твое расписание скачет вокруг него как на ярмарке - это откладываем, это сегодня не успею, это без меня. И на этом ебаном интервью надо ведь и самому не выглядеть дегенератом, быть бодрячком, шевелить мозгами. А если их несколько в один день, то вообще пизда.
>>2632259 >Это детская защита. Через CSRF картинку можно увести куку элементарно. У меня перманентно в фоксе выключены third party куки. Ссу на твое обосранное туловище. Можешь начинать фантазировать про XSS, хакать моего хостера и заливать шелл.
>>2632253 > Просто у тебя наблюдается "инфляция терминов". У тебя синьорами называют мидлов. Синьор должен быть руководителем. Руководить участком кода. Модулем. Быть ответственным не только за код который он пишет, но и за код который другие пишут в его модуль. Вы все увлекаетесь цветовой дифференциацией штанов и забываете, что нет точного определения сеньора. В некоторых конторах сеньор = лид и все разработчики со временем растут в менеджеров и они искренне могут тебе сказать, что ты не сеньор, если не руководил хотя бы 6 сотрудниками. В некоторых конторах сеньор = архитектор. В некоторых конторах сеньор = технарь, который может погрузиться в лоу-левел и найти ошибку в сишном pecl экстеншене к примеру, ещё и пофиксить, форкнуть, скомпилить и на прод катануть. А в некоторых вот таких остерегайтесь, самые говнистые сеньоров меряют просто по возрасту. Мне как-то на собесе заявили, что я слишком много денег хочу и что они такие зп платят только тем, кто старше 30 лет, лол. И не завод был, а какой-то дата-аналитический стартап
Короче, прекратите выебываться конкретикой, терминология была и есть условная. Джун - начинающий разработчик. Миддл - разработчик средней руки. Сеньор - опытный разработчик. Всё остальное - это вопрос квалификации в конкретном направлении. Сеньор менеджер может быть миддл разработчиком и джуниор оптимизатором, условно.
>>2632540 Соответственно, может эти "сеньоры" зато охуенно управляют людьми, сроками и требованиями. Вопрос нейминга.
Есть ещё другая проблема, php сам по себе, как экосистема, очень сильно замкнут и часто не даёт условным миддлам вырасти в сеньора. К примеру, как ты научишься программировать что-то лоу-лейтенси на php? Да никак, в таких областях php даже не используют. Поэтому ты и развиться в этом направлении толком не сможешь, ил ипридется стек менять. То же самое и с байтомолотилками и с прочим. Но это отдельная история.
>>2632548 >погрузиться в лоу-левел и найти ошибку в сишном pecl экстеншене Ебать фантазер. Твое место у вордпресс параши. В лоу левел ты погружаешься только приняв пивандепалы после тяжелого дня формошлепства. Сеньор-архитектор ебать ахахахахахах, да ты прямо сейчас угашенный сидишь походу ахахахахаха
>>2632582 По делу есть что сказать? Если ты формошлепишь говно всякое, это не значит, что все так делают. pecl я впрочем не трогаю, да и в целом это уже устаревшая штука, я привел его для примера лоу-левела. Лично у меня половина проектов на golang и вот там периодически приходится нырять в рантайм, тыкать pprof и всё такое.
>>2632727 По какому делу, залупа ты понурая? Ты навыдумывал у себя в башке какой-то хуйни, а когда тебя попустили, начал выдумывать новую хуйню, теперь про какой-то го. Ну так и пиздуй в го тред, тебя там быстро обслужат. Нахуй ты тут свой шизофренический бред высираешь?
Сап, аноны, есть вопрос. Я отправляю в своём сервисе запрос на сторонний апи, мне приходит ответ в виде джейсона, который я сразу конвертирую в массив. Чтобы достать оттуда нужные данные, мне приходится обращаться к массиву по длинному паравозу ключей, например: $title = $response["foo"]["bar"]["mocha"]["govno"]["title"] Как чище всего это офорить? Не хочется на каждую скобку городить if isset. Просто проверить итоговый $title на null и кинуть эксепшон? Пыха даёт обращаться к несуществующим ключам, кидая warning, но выглядит это грязновато. Вопрос номер два: у меня есть сервис, который отвечает за запросы и получает большой-большой джейсон и сразу же конвертирует в массив. Из массива ему надо наковырять данных и создать из них сущность. Разбирать массив на запчасти прям в сервисе, или вынести это в отдельный класс? В сущность заносить метод createFromApiResponse() или вроде того не хочу, т.к. будет жёсткая привязка к конкретному АПИ, а они могут меняться. Раздумываю над абстрактной фабрикой, которая будет спавнить как сервис для запросов к апи, так и фабрику сущностей из массива запроса, но хз.
>>2633173 В дополнение ко второму вопросу спешу добавить, что к апи будет делаться много разных запросов, и соответственно как это всё вынести в отдельный класс я не понимаю, т.к. придётся делать ему на каждый эндпоинт по методу, и где-то логика будет повторяться. Например, в каком-то методе нужно найти чисто название сущности, а в другом найти все атрибуты сущности. Ничего лучше паровоза индексов в методе запроса не могу придумать.
>>2633173 Конвертируй не в массив а в DTO, делай класс для работы с этим api, поверх него класс для того что бы не зависеть от конкретного api и сайта, и иметь возможность заменить его на схожий сервис с другим протоколом.
>>2633173 Ну какие нахуй массивы. Привыкай работать с объектами. К объекту ты можешь написать пхпдок и будет работать автокомплит и видна ожидаемая структура. По этой структуре ты можешь написать иерархию валидаторов.
Вот тебе простейший пример https://3v4l.org/LJB3k#v7.4.33 проверяет есть ли значение в жсоне и соответствует ли оно типу. Я для краткости все сделал на статике, но никто не мешает сделать на объектах, с прямыми вызовами функций. Добавить обработку массивов и будет универсальная штука, которая любой жсон завалидирует. А если заморочиться, то можно сделать фабрику, которая по скормленному ей конкретному жсону создаст уникальный валидатор.
Короче, завязывай с массивами. Это недокументируемое, непроверяемое нечто, пользы никакой, а гемора дохуя.
>>2633247 Ну у меня так и есть по сути: интерфейс работы с апи и классы его реализации. Я не уверен насчёт ДТО, ведь он больше нигде в коде не будет использоваться. Т.е. методы сервиса выглядят примерно так: public function getEntity(int $id): Entity { $response = $this->client->request(["id" => $id])->toArray(); return new Entity($response['foo'], $response['bar'], ...); } подобным образом выглядит большинство методов апи, но какие-то возвращают не сущности, а простые типы. Если добаить ДТО, то ничего не поменяется. Ну мб связность системы уменьшится, но хз, я всё равно этот класс потом никуда выносить не буду. Да и потом, этот DTO всё равно придётся как-то создавать, и тут мы снова возвращаемся к паравозу индексов массива либо стрелочек объекта.
>>2633315 Интересно, спасибо, надо будет разобрать. Я стажёр-вкатун, учу симфони сейчас, и там почему-то нет встроенного компонента для валидации жсона. Респонс можно получить либо строкой, либо массивом, и я подумал, что удобнее работать с последним, а такой подход ещё не встречал.
>>2633315 Получается, придётся делать абстрактную фабрику конкретного апи, которая будет создавать как сервис запросов, так и валидаторы на каждый жсон? Выглядит стильно, но ещё такой вопрос: у меня в респонсе большая вложенность всяких мусорных слоёв. Мне для каждого слоя создавать свой класс и валидатор? Типа { "response": { "data": { "result": { "matches": { "entity": "title"} } } } Тут из трёх слоёв мне нужно только одно поле: следующий слой. Твоим способом получится три класса, делающих плюс-минус одно и то же. Это норм?
>>2633843 >абстрактную фабрику конкретного апи Фу блядь, слова какие мерзкие. Как на рукав высморкался блядь. Нахуя ты так усложняешь? Для начала переведи код на работу с объектами. Потом напиши типизацию этих объектов, чтобы с ними блядь в IDE можно было работать, чтобы ctrl+q нажать и увидеть что это поле улица в адресе, строка. Чтобы автокомплит работал.
Если. Если блядь. Если приходят не полные данные, то сначала задумайся с какого хуя они неполные блядь. Какой пидорас неполные данные отправил тебе. А уже если ничего с этим поделать нельзя, то напиши валидаторы на конкретные сущности, возвращаемые апи, как в моем примере или как в другом, похую.
И только если там какие-то огромные жсоны, и сто эндпоинтов, то можно написать код, который распарсит пример жсона, скумекает какие там типы, создаст валидатор под этот конкретный жсон, и закеширует его. А если ты это вынесешь в отдельный пакет, да выложишь на гитхаб, то тебе в любой конторе за такой ништяк будут пятки целовать и деньги в трусы засовывать, потому что ты будешь человееек блядь, а не обезъяна ебаная.
>у меня в респонсе большая вложенность всяких мусорных слоёв Ну так вычищай мусор перед валидацией, какие проблемы? Можешь хоть прямо по строкам хуярить еще до парсинга. Вообще в нормальном рест апи можно выбрать какие поля хочешь получать. Вот тебе пример пикрелетед как должно быть https://mailchimp.com/developer/marketing/api/account-exports/ .
>>2633912 Я хз, как это сделать без абстрактной фабрики, т.к. объекты респонсов жёстко привязаны к конкретному апи, и у другого апи будут другие валидаторы. Ну и соответственно ДТО будет по-другому создаваться. Например, в одном апи приходит { "name": "slavik", "second name": "sychev", "age": 33 } В другом приходит { "full name": { "name": "slavik", "second name": "sychev" }, "age": 33 } Можно написать базовый ДТО, на основе которого создаётся сущность, но тогда придётся писать адаптеры под каждый из респонсов.
Давй начнем с простого варианта. Допустим, у нас есть APIб через которое можно получать посты в блоге и оставлять комменты. Простой вариант заключается в том, что вся работа с API засовывается в класс такого вида:
class SomeClient { function getPostById(int $id): Post { ... } function sendComment(Comment $comment): ?Error { ... } }
То есть, на каждый метод API мы делаем метод в классе. Этот метод формирует запрос к API, вручную разбирает JSON и возвращает объект нужного типа, который заполняется из ответа API.
Все данные мы представляем в виде объектов. Для Поста один объект, для Комментария другой, для Пользователя третий и тд.
isset писать не надо, используй оператор ??, например
$x = $result['a']['b']['c'] ?? null;
Этот способ прост и эффективен для небольших API. Но когда тебе нужно интегрировать десятки больших API, ты начнешь замечать что работа становится однообразной. Здесь на помощь придет сериалиайзер. Он позволяет автоматически преобразовывать объекты с данными в JSON и обратно. Как именно это делать, ты описываешь аннотациями в классе:
class Post { #[SerializedName('post_id')] int $id;
// Это поле может отсутствовать #[Optional] #[SerializedPath("[post][information][name]")] ?string $name = null }
После добавления аннотаций ты можешь автоматически разбирать JSON. Есть много готовых сериалайзеров, смотри Symfony Serializer, в Ларавеле есть поддержка сериализации моделей, есть JMS Serializer.
Наконец, можно облегчить себе жизнь еще дальше, если написать генератор классов из описания API в формате OpenAPI, но это уже сложновато.
По моему, ты не понимаешь, зачем нужна фабрика. Она нужна, когда ты используешь стороннюю библиотеку и не можешь править ее код, но хочешь повлиять на то, как она создает объекты. Ты не используешь стороннюю библиотеку и фабрика тебе не нужна.
> Разбирать массив на запчасти прям в сервисе, или вынести это в отдельный класс?
Сделай отдельный класс только для взаимодействия с API и в нем разбирай.
Мне кажется, ты изобретаешь велосипед. Для валидации есть Symfony Validation, правила валидации описваются аннотациями к полям, например:
class User { #[NotEmpty] #[Length(min: 4, max: 50)] private string $username; }
А ты свой велосипед написал. Например, в твоем велосипеде у правил валидации нет параметров (строка короче N символов) и нельзя добавить несколько правил на одно поле. А в Симфони Валидаторе можно. Там даже текст ошибки указать можно.
Далее, мне не нравится то, что ты используешь объекты-мешки (@property-read) вместо явного объявления свойств с типизацией. В чем тут выгода?
Далее, для разбора JSON в объект есть сериалайзеры вроде Symfony Serializer.
>>2634081 Какое-то странное понимание абстрактной фабрики. В Симфони и в бандлах постоянно используются абстрактные фабрики и фабричные методы и к использованию библиотек никакого отношения. createForm и createFormBuilder. Не все нужно доставать из контейнера
Зачем тебе интерфейс? У тебя есть несолько разных API с одинаковыми методами?
> Я не уверен насчёт ДТО, ведь он больше нигде в коде не будет использоваться.
Я думаю, анон имел в виду, что данные надо возвращать в виде объектов, а не в виде массивов. А не именно отдельный DTO и потом преобразовывать его в другой объект.
> Я стажёр-вкатун, учу симфони сейчас, и там почему-то нет встроенного компонента для валидации жсона
Плохо учишь. Есть Symfony Validation и он вешается на любой объект. Но сначала, конечно, JSON надо преобразовать в объект, а только потом валидировать. Хотя валидатор и массивы как-то умеет валидировать: https://symfony.com/doc/current/validation/raw_values.html
Если тебя интересует именно валидация JSON без его разбора в объекты, то используй формат JSON Schema и любую библиотеку валидации JSON по схеме.
Зачем тут абстрактная фабрика, я не понимаю. Почему нельзя сделать так:
- сделать класс для объекта ответа - в нем аннотации для валидации и десериализации - сделать сервис для работы с API, в нем кучу методов, в каждом методе: - отправить запрос - сериалайзером распарсить JSON в объект - валидатором проверить объект
Ааа, как все запутанно. Тогда сериалайзер тебе мало поможет. Я тебе советую сделать массив, в котором сопоставляются поля из JSON и из сущности (для каждого API массив свой):
API1:
result.name -> name "result['second name']" -> second_name
API2:
response.user['full name'] -> name response.user.surname -> second_name
И по этому массиву делать сопоставление полей. А валидацию делать уже единообразно для всех.
Симфони это и есть сторонняя библиотека. В Симфони все сделано очень гибко, чтобы ты мог подменить практически любой компонент и класс в нем. Плюс, возможно, они там местами перемудрили с абстрактными фабриками.
Если ты можешь обосновать, какие выгоды дает абстрактная фабрика, тогда пожалуйста. Если не можешь, то не трать деньги твоего работодателя на ерунду и не запутывай код, чтобы твои коллеги не тратили деньги, распутывая его.
> У меня за последние лет пять меньше трех одновременно открытых проектов в шторме не было.
Вообще, мне кажется, ты плохой работник. Ты быстро сделал что написано в задаче, отправил пулл реквест и забыл. А проверить правильность задачи? Может тот, кто ее писал, не проверил все и предложил неправильное исправление. А проверить код системы? Может, модуль, который ты правил, криво написан и в нем скоро возникнут новые баги, или он криво используется. Может там плохая архитекутра. Может ошибки в документации. Если это все не проверить, то и дальше будут возникать баги.
Нет, лучше, когда человек не прыгает между кучей проектов, а работает с одним.
Если ты хочешь получить знания, то надо писать все с нуля целиком, а не взять и чуть подправить. Ты можешь подглядеть код, если непонятен какой-то момент, но стоит также прочесть комментарии к задаче, где подробнейше расписаны все подводные камни, на которые натыкались предыдущие аноны.
JWT - это хорошая штука, и ее полезно изучить, но тут можно обойтись без неё. Здесь просто при регистрации генерируется случайный токен, ставится в куки и для редактирования нужно предъявить этот токен.
Как через CSRF картинку увести куку, опиши сценарий, ибо я не понимаю.
Здесь, возможно, есть CSRF-уязвимость, которая позволяет обновить чужой профиль, но от нее можно защититься, добавив CSRf-токен или проверяя заголовок Origin или передавая хеш дополнительно в форме (используя его как CSRF-токен).
Но вообще, это субъективные критерии, которые люди понимают по-разному. Например, в классе нет слова final, но весь код собран в одном методе - и поменять тут ничего нельзя.
Более того, принцип открыт/закрыт можно применять не только к классу, а к модулю, библиотеке, фреймворку.
Но эти принципы есть. Я уверен, что можно легко привести пример класса, который делает 5 разных вещей и любому будет очевидно, что он нарушает SOLID. Просто есть случаи, когда нарушение явно, а есть когда мнения расходятся. Прямо как нарушения в спорте.
Формализовать можно как-то попробовать, как насчет такого критерия:
- математическое ожидание количества измененных строк при добавлении к библиотеке (не меняя код класса) простого функционала должно быть менее N, чтобы класс считался "открытым для расширения".
>>2634119 А почему твой код не должен быть библиотекой для других? Почему другие разработчик должны знать как создавать объекты твоего домена/контекста в своем домене/контексте? Ладно если это один клас, а ели это композиция 100500 классов 90% который написали до тебя?
Почему не используют? А принцип единой ответственности?
А правило Лисков? Попробуй в PHP при наследовании поменять тип аргументов функции и ты получишь ошибку. А почему? Потому, что в PHP применено правило Лисков на уровне интепретатора (и правильно). И по этой же причине ты не можешь при наследовании удалять поля или методы.
Никто не использует - это ты точно погорячился. Принцип SOLID встроен в сам PHP, как видишь.
Мне нравятся задачи от Яндекса и олимпиадные задачи, я бы хотел чтобы их задавали на собеседованиях для сениоров. Про структуры данных, алгоритмы, оценку сложности, немного математики и теории вероятности. Приятно поломать голову.
>>2634140 Номинальная типизация все таки не принцип Лисков, больше на него похожа структурная типизация как в typescript или типизация интерфейсов в голанге
- пользователь отправляет форму - проверяем ее правильность - если все ок, создаем в БД пользователя и генерируем ему токен, который тоже сохранен в БД. Ставим пользователю в куки токен. Пароль не храним в БД, храним соленый хеш от него.
Авторизация:
- пользователь вводит имя и пароль - проверяем их в БД, если все ок, то берем токен и ставим в куки
Проверка авторизации:
- смотрим куки, ищем там токен, проверяем, есть ли такой в БД. Если нет, то это аноним, если есть то пользователь.
Твой код может быть библиотекой или модулем в большом проекте. Но если ты можешь легко обойтись без фабрик, то лучше обойтись и не усложнять проект без необходимости.
Я видел случаи, когда вместо switch/case городили паттерн Стратегия, например. Тяжелое зрелище. Человек прочитал про паттерн и бежит рефакторить свитчи.
Неудобно, тебе надо при написании кода помнить не только название свойства, но и с какой буквы оно пишется. И выглядит смесь названий в разном регистре страшно, как будто студент лабу писал.
Многим запись информации помогает лучше ее запомнить. Хотя мне больше нравится писать на бумаге в альбоме или блокноте. Я предпочитаю A4, так как на маленькие листочки ничего не помещается. Также, на бумаге можно рисовать. Также, ты можешь сделать такие вещи:
- когда есть несколько алгоритмов решения задачи, ты можешь их выписать и кратко перечислить плюсы и минусы
Ну например для редиса, ты мог бы выписать:
- сильные стороны - слабые стороны - подводные камни
Также ты бы мог выписать основные структуры данных и их плюсы/минусы, что они делают быстро, а что нет. ЧТобы было легко сравнивать их.
Также названия основных команд.
Переписывать целиком документацию, наверно, не надо, пиши кратко только основные моменты.
Чтобы знания не становились неактуальными, надо изучать общие прицнипы, а не их особенности реализации в отдельном продукте. Например, структуры данных вроде словарей и множеств не устарели и не устареют в ближайшее время. Также, не устареют принципы, которые redis использует для персистентности.
>>2634122 Бля, ну наступит день когда сам пойдешь на работу и казаться перестанет.
>А проверить правильность задачи? Это делается ДО начала выполнения. Это блядь первый шаг: условие задачи должно содержать критерии её выполнения и тестирования. Да что там говорить, хуево сформулированную задачу в беклог тупо не пропустят. И готовность задачи определяешь не ты, а QA или сам продакт в dev ветке.
>А проверить код системы? Этим занимаются QA, и то если им выделили бюджет на такое широкое тестирование. У тебя есть команда и спринт, и если там нет задачи "проверить код системы", то и времени у тебя на это нет.
>Может, модуль, который ты правил, криво написан и в нем скоро возникнут новые баги Сразу видно нубаса. Если ты написал говнокод, то ты не пройдешь ревью. Если ты написал бесполезный код, то не закроешь задачу, если твой код срет ошибками, то не пройдешь QA. Смекаешь?
А если всего этого - QA, бизнес аналитиков и код ревью нет, то и появляются модули прямо из твоих маняфантазий, с самозарождающимися багами, не читанные и не документированные. Тут уже реально похуй сеньор ты или нет, надо валить в нормальную контору.
QA просто тыкают мышкой в кнопки, они никогда не увидят, что в алгоритме допущена ошибка, которая проявляется в 3% случаев. Программист увидит и исправит. А ты нет.
>>2634166 Такое легко запомнить Редис + 1 000 000 запросов в сек - нихуя не умеет, нет роутинга, нет гарантии доставки до консумера + Прост как палка Ребит - 40тысяч запросов в сек + роутинг, гарантия доставки + Прост как палка Кафка + 1 000 000 запросов в сек + Умеет все, даже заваривать кофе - Сложна как управление самолетом
>>2634170 >QA просто тыкают мышкой в кнопки, они никогда не увидят, что в алгоритме допущена ошибка, которая проявляется в 3% случаев. Программист увидит и исправит. А ты нет. Если программист такое сходу видит, то откуда там эта ошибка, ебанько? Исправление и поиск багов всегда идет от логов, то есть от фидбека системы, а не наоборот. Никто еще не додумался перечитывать колд в надежде найти внем баг. Завязывай нести хуйню, лучше подтяни пхп и на собес сходи, авось возьмут на твою первую работу.
>>2634174 Редис охуенная вещь, всё лучше с редисом. А кафки-хуяфки это какой-то оверинжениринг, чтобы смуззихлебы ездили на конфы и рассказывали, что они там нахуевертили, а то нормальный человек не разберется.
> Исправление и поиск багов всегда идет от логов, то есть от фидбека системы, а не наоборот.
Ну и логика. Выложим кривой код и подождем, пока он сломается.
Код ревью - а ты уверен, что ревьюверы, у которых 120 других дел, будут внимально читать код? Код ревью вообще не для этого. Код ревью это чтобы обнаруживать когда кто-то нарушает твои правила. То есть, если код твое правило не нарушает, то там может быть что угодно написано.
Ну условно ты разбираешься в финансовых API и видишь что кто-то передает рубли вместо целого числа копеек, и говоришь ему об этом. А не проверяешь каждую строчку.
>>2634174 >>2634183 Мдаа, дожили. Тормознутый редис у них на первом месте. Redis ето кал для черепах. Это однопоточный еле ворочающийся кусок говна. Какой нахуй миллион запросов в секунду? Ты на серверах разоришься нахуй, тебе сотня инстансов этого редиса понадобится или даже больше.
Memcached сучки вот кто реально быстрый. Это самое быстрое NOSql хранилище в природе.
>>2634183 >А кафки-хуяфки это какой-то оверинжениринг Просто ты пхп макака и с реально сложными задачами не сталкивался. Кафка решает, например, проблему exactly once delivery. Но в формошлепстве таки проблем офк нет.
>>2634192 Завязывай фантазировать. Ты несешь хуйню и это мой последний ответ тебе. Результат выполнения задачи проверяешь не ты, а тот кто эту задачу ставил. Задачи перед релизом кучу времени висят в дев ветке, именно для того чтобы выловить возможные баги. Для проверки кода на соответствие стандартам существует code sniffer и стайлгайд, хуево оформленный код дженкинс пайплайн не пройдет. А в финансовых апи пишутся юнит тесты. Покеда.
>>2634207 >Но в мемкеше нет структур и персистентности. Лол, если ты хочешь выжать из редиса больше запросов, то у тебя тоже нет персистентности. Чтобы было хоть что-то на персистентность похожее нужно чтобы на диск писал отдельный инстанс.
Ну и дальше идет пример как структуры ускоряют, а не замедляют работу с кешем.
>>2634201 Но речь о редисе не как о кивелью хранилише, а как о меседж брокере. Та есть простой пубсуб. Было бы странно тогда с рабитом и кафкой сравнивать
>>2634112 Я хочу сделать что-то наподобие того, что предложил этот >>2633315 Но не знаю, как лучше всего организовать код. У меня есть папка Service, в ней папка под взаимодействие с api, в которой интерфейс и папки под разные апи. В папке под конкретный апи хранится реализация интерфейса. Куда мне девать кучу мелких классов на разные виды респонсов? Создать папку Responses и разбить каждый класс на собстввенный файл? Но там у 90% классов две строки: аннотация одного типа и название класса с пустым телом. Работать с такой хуйнёй, когда она разбита на 10 файлов по 2 строки, гораздо менее удобно, чем если бы они все были в одном, как конфиг. Но вроде как хранить несколько классов в одном файле - это говнокод. Только папку с этими классами ещё походу придётся разбивать на подпапки для всех методов апи, что ещё сильнее усложняет задачу.
>>2634138 Надо отдать тебе должное - ты хотя бы пытался.
>Если есть слово final, то точно закрыт. Согласен, но только частично. Это работает со сторонними библиотеками, но не с кодом проекта. В своем проекте final просто временная заглушка, которую убирают, когда посчитают нужным.
>Но вообще, это субъективные критерии Ну тогда сектанство получается?
>Но эти принципы есть. Я уверен Принципы есть, а критерия их фальсифицируемости нет, смекаешь?
>Формализовать можно как-то попробовать Вообще достаточно того факта что они до сих пор не формализованы. Достаточно чтобы понять почему на вопрос "любите ли вы солид" все отвечают да, а на вопрос "как там с имплементацией" отвечают "мы пытаемся, пока в планах".
>- математическое ожидание количества измененных строк при добавлении к библиотеке Жаль что ты это дело быстро бросишь и так ничего и не формализуешь. Я в свое время таки нашел способ определения single responsibility для любого класса.
>>2634227 Ну так напиши правила валидации в виде конфига. Че там у тебя симфони? Ну и напиши Yml с конфигом валидации, а потом по этому конфигу создавай валидатор.
>>2634230 Сингл респонсибили в SOLID это то что код отвечает не за одну задачу, а то что что у него одна причина для изменения. Вроде пожоже но есть нюанс... Так у дади Боба написанно, а у тебя?
>>2634240 >Просто парсишь json в объект Так соль в том, что json многослойный, и под каждый слой нужен свой класс, который надо индивидуально валидировать, походу. Мало того, они ещё и отличаются в зависимости от метода апи.
>>2634241 И на это я тебе написал что нужно выкинуть нахуй бойлерплейт из жсона. Валидировать нужно сущности апи, а не мусор. Ну а если там эти сущностей сто, садись блядь и пиши. Нахуй тебе только такое большое апи тогда я хуй пойму.
>>2634246 >Вдруг внешний слой переименуют. То есть сломают обратную совместимость не поменяв версию апи? КТо и нахуя? Даже если так сделают все пизданется с исключениями. А нам ведь именно это и надо.
>>2634245 А как его выкинуть? Прямо стрингу руками парсить? Это дрочь же какая-то. Если конвертировать в массив, выбрать нужное, а потом обратно закодировать в строку, будет медленно работать. Если сразу сделать объектом, то обращение будет без автокомплита.
>>2634252 А ещё ж есть проблема, что в жсоне свойство может называться не одним словом, а через пробел или снейк кейсом. Это его ещё отдельно сериализовать надо, получается. Я надеялся чисто вызывать json_decode() ...
>>2634266 >Это дрочь же какая-то. Мальчик, это не дотка и не серик. Это реальная жизнь.
>Прямо стрингу руками парсить? Что блядь значит "руками"? Один раз написал и все. Найди закономерность. Как? Ну я хуй знаю, попробуй думать. Жсон это строка. Удаляй все до какого-то ключевого слова или группы слов, ищи вхождение сроки, итерируй построчно пока не найдешь что-то. Короче мозгами шевели, я за тебя это делать не буду. Я походу вообще поспешил какой-то код тебе давать, какой-то ты ленивый слишком. Ты мог уже пол сотни примеров кода сюда скинуть, а до сих пор только болтовня.
>А ещё ж есть проблема, что в жсоне свойство может называться не одним словом, а через пробел Ну вот тебе загадка от жака фреско: если в жсоне свойство может содержать пробел, а пхп не поддерживает пробелы в свойствах объектов, то каким хуем пхп может преобразовать любой жсон в объект? На размышление по классике 30 секунд.
У тебя похоже структура папок в стиле Ларавель/Симфони. То есть, у тебя есть папки Controllers, Models, Services, и может что-то еще, а в них все свалено вперемешку. Минус в том, что связанные вещи хранятся далеко друг от друга, а не связанные рядом.
Ты можешь попробовать модульную структуру, когда делается папка под модуль. То есть, ты делаешь папку "Разные API", в ней "API службы доставки", а в нее кладешь клиент и классы сущностей, исключений и прочее.
> Но там у 90% классов две строки: аннотация одного типа и название класса с пустым телом.
Если у тебя все пути начинаются с result.response.data, то не надо создавать классы. Можно просто на уровне PHP выделить этот элемент из массива, а дальше уже разбирать сериалайзером. Плюс, сериалайзеры позволяют указывать путь с вложенностью, например:
Нет. Ты делаешь классы под сущности. Если в JSON описан Пост и Комменты к нему, то ты делаешь только эти 2 класса, даже если там еще много всего наверчено, что тебе не нужно.
>>2634278 Нет, я-то не против, это не сложно. Просто это костыль. Как будто бы уже должно быть готовое решение под такие нужды. Собственно, ниже уже ты или не ты это решение и предложил. Надо короче доку сериалайзера читать, ещё не дошли руки до неё.
>>2634287 >Нет, я-то не против, это не сложно. Просто это костыль. Как будто бы уже должно быть готовое решение под такие нужды. Разумеется есть. Только нахуй это тебе если ты ничему не научился в итоге? Ты не вник в суть проблемы, ты не понимаешь решение, ты ничего не добавил в свое портфолио.
Даже я, с десятилетним опытом, написав тебе свой пример столкнулся в нем с парой неизвестных мне вещей и придумал пару решений новых для меня проблем. Какой смысл вместо получения опыта делать бессмысленную валидацию хуй пойми кем написанной библиотекой?
>>2634294 Не хочу с тобой спорить, конечно, я понимаю, к чему ты клонишь, но мне кажется, компании ищут человека, который умеет работать с инструментом, который у них в ходу, а не того кто будет писать свои костыли и трепать всем нервы.
Куда в коде пихать сообщения, которые отправляет контроллер? Я просто сую их в константы вроде SUCCESS_MESSAGE = "Molodec", но мне кажется, это не самое чистое решение, ведь это почти хардкод и когда этих сообщений много, это говно сильно мылит глаза. Создать отдельную папку Constants и сделать что-то типа контейнера сообщений? В одном месте их все хранить тоже вроде как громоздко, да и в разных местах константы с одинаковым названием могут иметь разное значение. Ну а создавать параллельную иерархию классов констант - это вообще пиздец, как по мне. Передавать их через контейнер - тоже не очень решение, т.к. конфиг контейнера засрётся текстом. Мимо тот же анон, который спрашивал про валидацию жсона.
>>2634077 Не увидел этот пост, кстати. Если бы сначала его заметил, реализовал бы простой вариант, но уже взялся за сериализатор, добью его. Заодно научусь пользоваться.
>>2634511 >компании ищут человека, который умеет работать с инструментом, который у них в ходу А человека, который умеет писоть и какоть они ищут? Пульс щупают?
Умение взять в руки и начать пользоваться любым инструментом это как требование чтобы кандидат дышал. А для того чтобы выбрать инструмент нужно как минимум варианты оценить. А хули ты можешь оценить, если двух строчек не можешь написать и банально боишься кода? От этой боязни и возникает "костыль" "не костыль". Эту либу на гитхабе писал обычный работяга, такой же каким и ты хочешь стать. Зачем ты обесцениваешь свой труд? Какое-то странное самовнушение.
Можешь обижаться, но мое впечатление такое: Ты вместо того чтобы писать код и решать проблему мнешь писю. Все эти оправдания про то что когда-то в будущем тебе будут запрещать писать код (просто блядь вдумайся, нанять программиста чтобы запрещать ему писать код) это просто оправдания.
Вся эта болтовня "а не много будет классов?", "а это не дрочь?" никуда не ведет. Напиши блядь как умеешь сейчас, потом найдешь повторяющиеся паттерны, создашь обобщения и все красиво сократишь. А на третий раз будешь сразу писать коротко. Но первый шаг ты все равно не пропустишь.
Так что завязывай мять писю и пиши код, прямо сейчас. Если будет какой-то идейный тупик - поможем. Но код блядь тебе все равно придется написать.
А зачем их вообще класть в константы? Почему нельзя просто использовать строку в коде (если ты отдаешь JSON) Или в шаблоне (если ты выводишь страницу)?
>>2634801 На константу ты можешь нажать ctrl и легко найти все места где она используется, к константе есть комментарий и используя константу не будет опечатки.
>>2634735 Не, это у тебя уже какие-то проекции пошли. Я как раз и пишу сейчас проект на портфолио, который уже почти готов. Да, по сравнению с дедом с 10 годами опыта это хуйня, но для меня это уже прорыв и я за его написанием изучил больше, чем за три месяца стажировки. Параллельно с изучением инструмента, пытаюсь разобраться в лучших практиках. А можно плюнуть и просто свой фреймворк написать. А можно и свой компилятор. И даже свою операционку. Полезно? Полезно. Но до вакансии ты так и не дойдёшь, отвлекаясь на фундаментальные штуки. Знаем, плавали. Да и задачек а-ля литкод easy я уже нарешался. Какой смысл изобретать велосипеды, если они никогда даже код ревью не пройдут? Это как если бы ты пришёл на языковые курсы, и тебе бы там сказали: размахивай руками, корчи рожи и издавай звуки, кое-как тебя всё равно поймут, а язык потом выучишь, как научишься доносить мысль.
>>2634894 >Я как раз и пишу сейчас проект на портфолио, который уже почти готов. Да, по сравнению с дедом с 10 годами опыта это хуйня, но для меня это уже прорыв До тебя самого не доходит что небольшая либа, которая решает конкретную проблему твоего работодателя, полезнее чем очередной туду блог по перекатыванию хуя по столу туда сюда? Писать меньше, а пользы больше.
>А можно плюнуть и просто свой фреймворк написать. А можно и свой компилятор. И даже свою операционку. А можно поменьше пиздеть и оправдываться и перестать сравнивать микроскопическую либу с операционкой. А можно просто блядь написать код за день, а потом за пол дня его оптимизировать и сделать красиво.
>Какой смысл изобретать велосипеды, если они никогда даже код ревью не пройдут? Если кто-то нашел объективную ошибку в твоем коде - исправь её. Бля, ты реально в каком-то мире фантазий пребываешь. Версии ПО по твоему от нехуй делать придумали? Нахуя создатели симфони позорились и высирали первую версию? Могли бы ведь сразу пятую выдать и срывать овации и награды.
>Это как если бы ты пришёл на языковые курсы, и тебе бы там сказали: размахивай руками, корчи рожи и издавай звуки, кое-как тебя всё равно поймут, а язык потом выучишь, как научишься доносить мысль. Я хуею как же насрано в башке. А что в твоем понимании "не велосипед"? Бойлерплейт к фрефмворку? Прокидывание сервисов в конструктор? То что можно сделать командами make:controller и make:entity?
>>2634922 Так я сейчас конкретно учу фреймворк и его возможности. Я-то могу написать свой костыль, но понимание фреймворка от этого у меня не возрастёт. У тебя подход прагматика, которому надо здесь и сейчас что-то сделать и отправить в прод, а я просто хочу освоиться, понять чё да как и как делать лучше. О некоторых концепциях вроде того же сериализатора я в принципе узнал только читая доку фреймворка. Ну и собственно если бы я писал как бог на душу положит, не интересуясь практиками, я бы просто оставил джейсоны на массивах и всё бы работало, а тут за пару дней двачевания вон сколько нового узнал.
>>2634955 > но понимание фреймворка Да ебаный по голове, какое понимание нахуй? Дока симфони это книжечка 100 страниц, которая читается за вечер, а типичные задачи давно покрыты генерацией кода, какое нахуй понимание, чего блядь понимание?
Ты столкнулся с проблемой, ты попробовал её решить, ты посмотрел как проблема решается в фреймворке. Ах вооот оно что, а вот это я не учел, а тут я лучше придумал, а это вообще лишнее. Вот это блядь ПОНИМАНИЕ. Я уже заебался скидывать в тред это видео https://www.youtube.com/watch?v=pz6VdH4_BSg
Вот оно идеально для обучения. Человек объясняет проблему, потом решает её прямо на сцене, на следующем этапе оптимизирует и углубляет решение, и так до тех пор пока его код не превращается в код симфони. Вот это способ ПОНЯТЬ, а не копирование бойлерплейта себе в проект.
Вообще непонятно откуда взялась эта идея что все проблемы в вебе давно решены и нужно только нагуглить нужную библиотеку. Где ты эту хуйню вычитал вообще?
>>2635001 Дока читается за вечер, если у тебя уже есть опыт работы с другими фреймворками или просто опыт разработки. Читается за вечер, если ты понимаешь архитектуру веб приложения, знаешь какие в вебе задачи и какие у них есть способы решения, а не когда ты до этого три года писал хелоу ворлды в универе. У тебя просто за 10 лет исказилось представление о том, как люди учатся и сколько всё это учится с нуля. То, что тебе очевидно, большинством учится годами.
>>2635135 >знаешь какие в вебе задачи и какие у них есть способы решения Да ебаный рот этого казино. Я че блядь с луны прилетел со знанием веб задач? На твоих блядь глазах это произошло. Я засучил рукава и решил веб задачу. А когда предложил тебе решить ту же задачу с уже данными подсказками, но в формате ооп ты просто слился. Как будто речь идет не о двух сотнях сток кода, а каком-то невероятно сложном проекте.
Ну и конечно умиляет ментальная гимнастика. Вместо того чтобы послушать совета человека с опытом нужно ни в коем случае не слушать совета человека с опытом, потому что у него есть опыт а у тебя нет. От такой диалектики гегель в гробу переворачивается.
Короче дело твое "учи фреймворки" чтобы не быть баттхертом, я что мог сделал.
>>2636080 Ну так чел пишет про дорвеи и развод лохов на бабос. При чем тут разработка вообще? Если ты пробивной кабанчик, да еще и без моральных ограничений, то тебе и такое говно как пхп прибыль принесет.
>>2636080 >PHP создаёт у человека адекватное восприятие веб-разработки Хуета собачья. PHP максимум позволяет писать сайты быстро. И это все его преимущества.
>PHP ты можешь добавить на свой сайт админку, просто вставив <? if isset($_COOKIE['ADMIN']) { ?> и <? } ?> вокруг блока HTML кода Шаблонизаторы? Не, не слышал.
>PHP освобождает тебя от головной боли от размышлений о типах, зависимостях, областях видимости, ивент-залупах, паттернах и прочей задротской хуйне Проще говоря код может написать любая макака.
>Благодаря PHP ты можешь за 2 минуты реализовать микросервис Если бы это уёбище осознавало семантику написанного, то никогда бы такую хуету не написало бы. Микросервисы пишутся и на ГОше и на питоне и на решетках и на расте.
>И самостоятельно задеплоить этот микросервис можно на ВООБЩЕ любой хостинг Как и проект на любом стеке, главное, чтобы был докер иначе секс, что там, что там.
Сап, пхпач. При установке Slim через композер столкнулся с такой проблемой (пик 1). После добавления обработчика ошибок, браузер кидает 404 (пик 2). Полный листинг кода (пик 3). Как фиксить ? Гугол не помогает. И такой вопрос, если это не воконцове не пофикситься, можно ли прыгнуть сразу ну 3-ю задачу из шапки с тестами ?
>>2642268 Это стандартный 404, у тебя нету зарегистрированного обработчика для твоего url который ты вводишь в браузере, ты обращаешься к папке а у тебя он на /
Как суметь понять как решать задачу "Числа прописью"? Какие темы надо понять, чтоб мозг додумался что и как? Я просто сижу и ощущение как будто тужусь в голове, но нихуя не происходит.
Начал вот читать "Грокаем алгоритмы", пока не понимаю, поможет книга мне или нет. Но по крайней мере я уже узнал что-то новое. Что такое бинарный поиск. Я честно охуел, насколько это круто и интересно.
Изредка залетаю в ваш тред. Объясните мне, почему тут часто обливают помоями пыху, аргументируя это тем, что в ней многое написано на костылях, и это калечный язык. Мимо пхп-бэк стажёр. Мне пыха с точки зрения крудошлёпа нравится куда больше, чем те же питон или ЖС, при этом в ней нет столько бойлерплейта, как в джаве. Чё там на сисярпе не знаю. Мне не хватает компетенции, чтобы сравнить кишки пыхи с другими языками. Она вроде не сказать что медленная, уж точно не медленнее ЖС, особенно с тех пор как JIT добавили.
>>2644428 1) Жс это дно говна, ты бы еще с брейнфаком сравнил. 2) Питон просто не ооп язык, а ты уже надрочен на ооп. 3) Пхп это джава для бедных, все что будет в пхп было в джаве десять лет назад. 4) Бойлерплейта в пхп тонна, тащи сюда модуль из пяти классов, я тебе 90% кода оттуда выкину как бойлерплейт. 5) Медленный = однопоточный. Однопоточный = медленный. Пока в пхп нет неблокируемого io по скорости он в будет в жопе.
>>2644444 Ну это всё специфика языка. Это я и так +-понимаю. Мне хотелось бы про костыли услышать. Что-то такое я тут много раз видел. А питон с ЖС никто не срёт, либо срёт, но это воспринимается скорее как мем. Питон-разработчик или ЖС-разработчик - это уважаемый наносек, пусть он и такой же крудошлёп, а ПХП-разработчик в глазах большинства - это какая-то непонятная фриланс-макака с вордпресса, и если спросить почему, то тебе начнут объяснять, что пыха - это мёртвый недоязык, но более адекватных аргументов обычно не приводят. Да, я в курсе про обилие низкоквалифицированных фрилансеров, но всё же интересно узнать, за что хейтят именно пыху как язык, а не как сообщество.
>>2644473 >Мне хотелось бы про костыли услышать Ну вот тебе загадка: что произойдет если ты попытаешься обратиться к несуществующей переменной или свойству объекта? Чем это плохо? И, наконец, почему в пхп так?
>>2644480 Я знаю, что объекты на хэш-мапе реализованы в пыхе, но не знаю, почему это плохо. Типа хэш-функция вызывается каждый раз при доступе к свойству объекта? А вообще да, последняя версия ругается, теперь только мэджик методы юзать.
>>2644554 >Я знаю, что объекты на хэш-мапе реализованы в пыхе, но не знаю, почему это плохо. Типа хэш-функция вызывается каждый раз при доступе к свойству объекта? Какие нахуй хеш функции. Причем здесь это вообще?
>А вообще да, последняя версия ругается, теперь только мэджик методы юзать. Что блядь значит ругается? Какие нахуй мэджик методы?
Вы прямо блядь сейчас показываетете почему "ПХП-разработчик в глазах большинства - это какая-то непонятная фриланс-макака с вордпресса".
Любому адекватному человеку очевидно что ситуация когда пропала переменная или свойство это пиздец нахуй. Это блядь бага стопроцентная. Здесь должно бросаться исключение. Что делает пхп? Нотис, варнинг. Ты как эти варнинги ебаные обрабатывать будешь? Начнешь ебашить костыли set_error_handler() restore_error_handler(). Ой бля а кто-то тут про костыли спрашивал?
А почему пхп не бросает исключение? Да потому же почему тебе нужно в начале каждого файла как еблану писать declare(strict_types=1); - легаси говно. Со всеми теми тоннами говнокода написанного раньше нужно поддерживать обратную совместимость. К восьмой версии подняли до варнинга, лет через десять и исключение будут кидать. А к 2050 начнут ошибку как значение возвращать.
>>2644582 >Причем здесь это вообще? При том, что под капотом у объекта в пыхе хранится хэш-мапа со всеми свойствами и их именами. Я думал, ты про это. Про strict_types согласен. Но у того же питона, например, нет настоящих приватных свойств, и там тоже можно создать новую переменную. У ЖС хз как с этим, но вроде так же.
>>2644605 >Но у того же питона, например, нет настоящих приватных свойств Я тебе сразу написал что питону нахуй не нужна твоя ооп парадигма. В питоне есть иммутабельность и туплы, для целей в которых используется питон этого более чем достаточно.
>У ЖС хз как с этим, но вроде так же Я тебе сразу написал что жс кал говна. Сравнивай с TypeScript.
Эта задача решается путем разбиения ее на более простые и маленькие задачи.
Если ты возьмешь большое число вроде 123 456 789 и попробуешь его записать текстом, то ты увидишь, что в записи числа есть определенная структура:
сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять рублей
или, если выделить основные части:
(число) миллиона (число) тысячи (число) рублей
То есть, мы можем разбить большое число на группы по 3 цифры от 0 до 999 и добавить к ним слова "миллионы", "тысячи" и "рубли". Тут, правда есть подвохи:
- слова могут иметь разную форму, например: 1 миллион, 2 миллиона - числительные зависят от рода: один миллион, но одна тысяча - группа может отсутствовать, например для числа 1 000 001 мы не пишем "ноль тысяч", а просто пропускаем группу с тысячами
Тем не менее, это позволяет нам упростить задачу: теперь нам нужно преобразовывать в строку только числа от 0 до 999. Если мы теперь запишем какое-то число вроде 444, то мы тоже увидим закономерность:
четыреста сорок четыре
Несмотря на то, что цифры одинаковые, они пишутся разными словами для сотен, десятков и единиц. То есть, мы можем просто сделать 3 списка: список слов для сотен (сто, двести, триста итд), для десятков (десять, двадцать), и единиц (один/одна, два/две, три...). Затем мы разбиваем число на разряды и для каждого разряда берем слово из списка.
Правда и тут есть подвохи:
- если разряд равен нулю, то мы пропускаем слово в нем: в числе 404 нет десятков - для чисел от 11 до 19 эта схема не работает и нужен отдельный список для таких чисел. 11 это "одиннадцать", а не "десять один".
То есть, нужно сесть, выписывать разные числа, и искать закономерности, правила.
Про алгоритмы тоже, думаю, полезно будет почитать.
У тебя не очень удачно настроен проект. Ты поместил проект не в корень сервера, а в парпку /examples/uppuru. Соответственно, когда ты открываешь его в браузере, то браузер шлет запрос с URL /examples/uppuru/. Тебе нужно либо
Переходить к следующей задаче совершенно неправильно, если ты с этой проблемой не можешь разобраться, то ты ни одну реальную задачу решить не сможешь и тебя уволят.
Во-первых, оно есть уже давно, во-вторых, оно никому не нужно, так как в бизнес-логике сайта по продаже каких-нибудь услуг оно только мешается. Синхронный код проще писать и проще читать, а распараллеливание часто не нужно.
В Симфони выбросит исключение. А теперь встречный вопрос: что будет, если в JS ты опечатаешься в названии свойства объекта:
obj.invalid = 3
И почему так?
А если ты в JS поделишь на ноль, то отоже ошибки не будет. Почему так?
А вот в Питоне, кстати, с этим проблем нет, но есть другая проблема: Питон наглухо игнорирует тайп-хинты и можно передать в функцию любой мусор и она не падает с ошибкой. Почему так?
Это не костыль, а вполне станлартный способ, всего 3 или 4 строки и ошибки начинают превращаться в исключения. Почему не сделать так по умолчанию? Потому что тогда сломается легаси-код, а никому это не понравится. Надеюсь, со временем все же включат выброс исключений.
> Со всеми теми тоннами говнокода написанного раньше нужно поддерживать обратную совместимость.
Это очень важно для бизнеса. Язык, в котором постоянно все ломают и переделывают (как в линуксе постоянно все переделыывают) означает большое количество затрат труда. Лучше пусть такие, как ты, поноют на форуме, чем реальный бизнес будет тратить деньги на обновление.
И, кстати, не только PHP заботится о совместимости, и в JS легаси тащат, и в Си, и в Яве.
>>2644718 >если в JS Жс кал говна. Сравнивай с TypeScript.
>Питон наглухо игнорирует тайп-хинты Легко решается вне кода, ни строчки писать для этого не надо.
>Почему так? Потому что питон создавался как язык для написания коротеньких скриптов и небольшой автоматизации работы с линух.
>>2644729 >Ну в JS например Жс кал говна. Сравнивай с TypeScript.
>Это не костыль, а вполне станлартный способ Стандартный способ это try catch. А это хуита. Я уверен что ты названия этих функций впервые в моем посте прочитал.
>Это очень важно для бизнеса. Ясен хуй важно. Только пока разрабы на джаве ждут изменений в виде кальяна и телок, сидя на диване в гостиной, пхп разрабы стоят по колено в говне и ждут когда к ним ассенизатор подъедет.
>Лучше пусть такие, как ты, поноют на форуме, чем реальный бизнес будет тратить деньги на обновление. Где ты увидел что я ною? Чел спросил почему к пхп так плохо относятся, я привел пример. Ты эти доводы только подтверждаешь. Да пхп отсталый, да в нем много легаси говна. Какая разница почему? До тех пор пока все это легаси говно не отомрет будет говноязык с костылями.
Надо ли разбираться в структурах данных? В гайде ОПа есть какие-то объяснения или ссылки? В каком вообще порядке это всё изучается? Я так понимаю, структуры данных и алгоритмы изучаются в отрыве от определенного языка? Пока читаю "Грокаем алгоритмы". Впервые узнал про связанные списки. Так и не понял, есть они в PHP или нет.
>>2644701 Спасибо. Вроде выглядит уже не так сложно. Но я всё-таки дочитаю книгу для новичков по алгоритмам, потом вновь попробую прорешать все задачи с ОП-гайда. А то на этой задаче прям сильно застопорился, накалякал говнокод какой-то, который вызывает у меня отторжение.
Память компьютера состоит из ячеек. У каждой ячейки есть номер от 0 до N (в зависимости от того, сколько у тебя установлено памяти), и в каждую ячейку можно записать целое число от 0 до 255 (один байт). Соответственно, все, что ты хочешь хранить: числа, строки, массивы, картинки, аудио - все должно быть в итоге представлено в виде байтов в ячейках памяти.
Структуры данных - это способы размещать информацию в памяти. Мы можем разместить данные разными способами, и в одном случае, например мы сможем быстро искать данные, но обновление будет долгим, а в другом случае мы можем быстро обновлять данные, но поиск будет не таким быстрым. А если не заморачиваться, то может получиться так, что и поиск и обновление окажутся медленными на больших объемах данных.
Поэтому полезно разбираться в структурах данных и понимать их сильные и слабые стороны.
Например, массивы в PHP построены на основе хеш-таблиц. Если ты изучишь эти таблицы, то ты будешь лучше понимать, какие есть слабые стороны у массивов PHP.
Также, чтение книги научит тебя оценивать сложность того или иного алгоритма: сколько операций надо сделать для решения задачи и как это число будет меняться при увеличении объема данных: пропорционально объему данных, пропорционально объему в квадрате или как-то еще.
Некоторые языки низкоуровневые (вроде Си) и дают возможность прямого доступа к ячейкам памяти. В них легко реализовать любую структуру. Язык PHP не дает прямого доступа к памяти, но и в нем есть способы реализовать ту или иную структуру данных:
- во-первых, у PHP может быть расширение, которое предоставляет нужные структуры данных - во-вторых, некоторые структуры данных (вроде связанных списков или деревьев) можно реализовать без прямого доступа к памяти - в-третьих, если первые 2 способа не помогают, ты можешь сам написать библиотеку на Си, которая реализует нужную структуру, и подключить к PHP с помощью FFI
По поводу второго: ты сам можешь сделать связанный список, используя объекты. Вот класс, который представляет один узел в списке. Он содержит полезные данные (строка $s) и ссылку на следующий узел ($next):
В качестве домашнего задания, допиши класс списка и добавь в него методы для задания и получения строки, связи узлов и разрыва связей, чтобы можно было написать такой код:
// Создаем список $list = new ListNode('a')->add( new ListNode('b')->add( new ListNode('c') ));
// Получаем длину echo count($list) . "\n"; // Обходим список foreach ($list as $s) { echo "Value: $s\n"; // выводит a b c }
Чтобы реализовать это, тебе нужно изучить ООП, в учебнике из шапки есть глава про ООП и там есть вся нужная информация. Чтобы список можно было перебирать с помощью foreach, тебе нужно изучить интерфейс IteratorAggregate и Interator. Чтобы получить длину списка с помощью count(), тебе нужно изучить интерфейс Countable.
Если ты пока не знаешь ООП, то можешь читать про алгоритмы, а потом изучить ООП и вернуться к этой задаче.
>> Питон наглухо игнорирует тайп-хинты > Легко решается вне кода, ни строчки писать для этого не надо.
Сразу видно человека, который с статическим анализом сталкивался только в теории. Я использовал mypy и он генерирует ложные предупреждения. Необходимо либо ставить руками комментарии для их отключения, либо как-то отключать некоторые классы ошибок глобально.
Пример:
def false_positive(a: int): b = a if a > 10: b = None
return b
В строке b = None mypy выдаст ошибку:
> mypy: error > assignment - Incompatible types in assignment (expression has type "None", variable has type "int")
Если же поменять b = None на a = None, то и pyright начнет выдавать ошибку.
Это видимо и есть в твоем понимании "легко решается".
> Надо ли разбираться в структурах данных? Полезно, но если ты действительно разберешься, а не будешь пытаться заучивать не понимая толком материал.
> В гайде ОПа есть какие-то объяснения или ссылки? По структурам данных и алгоритмам - нету
> Я так понимаю, структуры данных и алгоритмы изучаются в отрыве от определенного языка? Да, ни не привязаны к языку. Но в разных языках одну и ту же структуру придется реализовать по-своему.
> Так и не понял, есть они в PHP или нет. Есть, SplDoublyLinkedList
Sup, сделал проект на ларавел (а точнее телеграм бот на winter cms), там сделал систему сообщений ( в виде классов ), которые должны инстанцироваться через new $msgClass . Локально (OpenServer) всё хорошо работает, но на сервере почему-то PHP ругается что не может найти такие классы (путь в них полный, может разве что не начинается с /)
$msg = new $msgClass;
Естественно в файле где инстанцируются эти классы сообщений сами сообщения не импортированы, но как я сказал локально всё работало
>>2646055 >Зачем мне указывать тип каждой переменной? Чтобы работал статистический анализ. Чтобы баги отлавливать до попадания в продакшен. Чтобы говнокод не писать.
Бля, я в ахуе. Ты еще тут >>2644473 ? Смотри на этих ебаных животных в естественной среде. Вот это чучело залупоголовое причина почему все угарают над пхп и теми кто на нем пишет.
>>2643901 НЕ ПОЛУЧИЛОСЬ >>2644709 БЛЯ Я РЕАЛЬНО УЖЕ ВСЮ ГОЛОВУ СЕБЕ НАХУЙ СЛОМАЛ С ЭТИМ СЛИМОМ, У МЕНЯ КСАМП СТОИТ И В КОРНЕВОМ КАТОЛОГЕ УЖЕ ЕСТЬ СВОЙ INDEX.PHP, ЛАДНО ПОХУЙ, СОЗДАЛ ПРОЕКТ НЕ В /HTDOCS/EXAMPLES/UPPURU, А СРАЗУ В /HTDOCS/UPPURU, СДЕЛАЛ ВСЕ ТАКЖЕ И НИХУЯ. ВСЕ ТАКЖЕ 404 С 76 СТРОЧКОЙ КАК НА ПИКАХ ВЫШЕ.
>>2646073 На месте. Возвращаясь к твоему доёбу о том, что свойства появляются и пропадают, технически ты можешь сделать мэджик геттер и сеттер, которые будут выдавать ошибку. Да, это бойлерплейт, но всё же решает твою проблему.
>>2646640 >почему тут часто обливают помоями пыху, аргументируя это тем, что в ней многое написано на костылях >Мне хотелось бы про костыли услышать >технически ты можешь сделать мэджик геттер и сеттер, которые будут выдавать ошибку Попробуй у себя на стажировке так сделать. Интересно, леща тебе въебут или пинка.
Ты сам-то понимаешь вообще почему даже ебанутая конструкция set_error_handler() restore_error_handler() лучше магических геттеров? Да и вообще ты типа собрался эту поебень в каждый класс проекта вставлять? Ладно, это вопросы риторические, спросишь их там где стажируешься.
Вот тебе следующий костыль: есть в природе такая хуйня как солид, и там под буквой O находится open-closed principle. Вот тут парень >>2634138 правильно написал что в пхп есть конструкция final , которая по солиду закрывает класс от изменений. Ты у нас хороший мальчик, солид уважаешь, и пометил классы своего домена как final. А теперь внимание, вопрос: каким хуем теперь сохранять сущности домена доктриной и мокать эти объекты в юнит тестах?
>>2646740 >почему даже ебанутая конструкция set_error_handler() restore_error_handler() лучше магических геттеров? Пиздеть не буду, не понимаю. Я вообще не понимаю, в каких кейсах есть проблема пропадающих/появляющихся полей, если везде тайпхинты и интерфейсы. Ну да, я понимаю, что вставлять геттер и сеттер в каждый класс, это пиздец, но опять же, я не представляю, где это вообще может быть проблемой. >каким хуем теперь сохранять сущности домена доктриной и мокать эти объекты в юнит тестах? Нихуя не понял тут. Доктрина сейвит объекты, а не классы. Каким хуем тут вообще final? А мокать можно с помощью декораторов, например, нахуя тебе вообще наследоваться от сущностей? Если чё, мне реально интересно, я не пытаюсь с тобой спорить.
>>2647101 Бля, по-моему ты просто каких-то рандомных терминов нагородил. Все, которые знаешь. Final плохо, потому что в моках мы должны наследоваться, а это плохо, потому что приватные свойства в доктрине.
>>2647126 >Final плохо final не "плохо" final просто не работает с доктриной и phpunit.
Я тебе предложил это проверить, выяснить почему, придумать костыль чтобы это хоть как-то исправить и записать еще один пункт почему пхп говноязык с костылями.
С phpunit ты вроде понял почему не работает: все Test Doubles наследуются. Осталось написать твой вариант костыля. Там есть очень смешные и ебанутые варианты.
С доктриной вопрос по прежнему стоит: почему доктрина не работает с final? Вариантов костыля я знаю только один, и он уже не смешной, а грустный.
>>технически ты можешь сделать мэджик геттер и сеттер, которые будут выдавать ошибку > Попробуй у себя на стажировке так сделать.
Хватит демонтрировать неграмотность. Во-первых, чтение несуществующего поля выдает ошибку всегда. Во-вторых, создание несуществующего свойства пока работает, но уже выдает deprecation warning, и в будущем будет отключено. В третьих, если ты сделаешь магический сеттер для выброса исключений в такой ситуации, никто тебе ничего плохого не скажет, а наоборот поблагодарят.
> Ты у нас хороший мальчик, солид уважаешь, и пометил классы своего домена как final. > А теперь внимание, вопрос: каким хуем теперь сохранять сущности домена доктриной и мокать эти объекты в юнит тестах?
Ответ очевидный, не использовать final. Я его вообще никогда не использую, так как он никаких плюсов не дает.
И кстати моки на сущности я тоже бы делать не стал. Бессмысленное усложнение кода. Видимо, тебе нужна еще помощь по тестированию?
Тебе надо разобраться с настройкой xampp (а точнее Apache в нем). В Apache есть "виртуальные хосты", то есть ты можешь поднять у себя локально несколько разных сайтов.
Сейчас у тебя поднят единственный вирт. хост и ты кладешь каждый сайт в свою папку на нем. Это не будет нормально работать с реальными проектами. Тебе надо вместо этого создать для каждого сайта свой виртуальный хост. Тебе все равно придется учиться это делать, лучше научиться сейчас.
Гугли по словам "как добавить виртуальный хост в xampp в Windows".
В качестве домена я советую выбирать названия, заканчивающиеся на .localhost, например http://uppuru.localhost. Такие имена автоматически преобразуются в 127.0.0.1 (адрес твоего компьютера) и тебе не надо лезть в файл hosts и что-то менять (даже если в инструкции будет написано, что надо).
То есть, тебе надо:
1) создать папку для нового хоста, например c:\xampp\htdocs\uppuru.localhost\
2) в ней создать папку public и подложить туда index.php
3) добавить новый виртуальный хост в конфиг Апача, указав домен (ServerName) uppuru.localhost и корень сайта (DocumentRoot) c:/xampp/htdocs/uppuru.localhost/public/ (в конфиге Апача слеши должны быть прямые)
4) перезапустить Апач
5) менять что-то в файле hosts не надо, все должно работать и так
Это делается за 2 минуты при наличии опыта.
В папку public ты кладешь файлы, к которым можно обращаться из браузера, а все остальное, например, PHP-код, конфиги, кладешь за ее пределами. Это повышает безопасность, а то сейчас у тебя все файлы доступны через браузер и это плохо. Любой сможет выполнить или скачать любой файл с твоего севрера.
> С доктриной вопрос по прежнему стоит: почему доктрина не работает с final?
Ты сюда пришел разобраться в устройстве Доктрины? Доктрина использует прокси-классы для ленивой загрузки и они должны наследоваться от сущностей, потому сущности не могут быть final. Я тут проблемы не вижу вообще. Ты сам себе придумал зачем-то что надо ставить везде final и жалуешься, что это не работает с Доктриной. Либо убирай final, либо бери другую библиотеку.
>>2647754 Козел ебаный, нахуй ты влез в разговор, который даже не прочитал? >>2647126 Вот смотри, это какое уже по счету подтверждение что пхп макаки тупорылые животные.
>>2648160 На связи >>2647126 Могу сказать, что я нихуя не понял всё равно, т.к. с доктриной работал хуй да нихуя, пару атрибутов написал и всё, а из тестов писал только простые юниты, не ебу чё там с моками. Так что было бы интересно послушать твой ответ на ответ мимокрока. А вообще как бешеная собака, брызжащая слюной, пока что ведёшь себя в осноном ты.
>>2647742 А как выйти из корневого каталога public в href ? Допустим есть файл index.php, который лежит в корневом каталоге public, а там есть ссылка на скрипт вне этого каталога. Прописывать что-то типо <a href="/../test.php">ссылка</a> ? Только что затестил и не получилось, апач просто не видит этот файл (я про test.php)
>>2648307 Ты не понимаешь как работает интернет. И не понимаешь как работает веб сервер.
Веб сервер дает публичный доступ к файлам на жестком диске. Вот эта строчка в конфиге: (DocumentRoot) c:/xampp/htdocs/uppuru.localhost/public/ означает что все ссылки в интернете с определенным доменным именем (например uppuru.com) будут обращаться к файлам в этой папке. А уже в настройках апача уточняется что не просто к папке, а именно к файлу index.php в этой папке.
Если сервер доступен в интернете, то его адрес и маршрут до него формируется с помощью DNS серверов. То есть когда кто-то вводит в браузере uppuru.com сначала идет запрос на получение адреса нашего сервера, а потом через длинный маршрут запрос таки доходит до нашей папки и файла index.php
Но локальный веб сервер работает не так. Он получает только локальные запросы, т.е. запросы к адресу localhost или 127.0.0.1. Чтобы вместо ничего не говорящего localhost можно было в браузере вводить uppuru.com и браузер не лез в интернет в поисках того чего там нет, можно винду заставить все запросы к uppuru.com перенаправлять на 127.0.0.1. Как? Правильно отредактировав файл hosts. Но вот этот анон >>2647742 подсказал тебе более простой способ, вместо uppuru.com использовать uppuru.localhost . Таким образом и название будет понятное и переадресация на 127.0.0.1 будет работать сама.
Допустим ты все сделал как тебе написали >>2647742
Что в итоге? Твой веб сервер просто получает запрос из браузера и если в запросе доменное имя uppuru.localhost запускает index.php в папке, которую ты указал как (DocumentRoot) для этого домена. Это работает для любых ссылок: uppuru.localhost/../test.php uppuru.localhost/хуйс uppuru.localhost/пук.среньк А вот интерпретацией этих ссылок и роутингом должен заниматься твой php код, который в index.php и находится, там включается автозагрузка, там ты запускаешь свое приложение и обрабатываешь запрос.
>>2648344 Мне не нужно выполнять скрипт из директории снаружи корневой, мне нужно, чтобы пользователь нажал на кнопку и его ссылкой перенаправило на этот скрипт как на пике.
>>2648374 Я тебя понял, твоя информация супер полезная без иронии говорю, но вопрос остается открытым, как из индекса которая находится в корневой директории попасть через ссылку на скрипт находящийся вне . Пример на пиках не работает, так что надо сделать чтобы заработало, анончик ?
>>2648401 >А как вы атрибуте href к нему обращаться то ? Я вообще не вдупляю. ВСЕ ССЫЛКИ ВЕДУТ НА INDEX.PHP Вообще все. А в index.php код который читает ссылку и решает что с ней делать
>>2648404 >ПЕРЕЙТИ НА ДРУГУЮ СТРАНИЦУ Чтобы отобразить пользователю ЛЮБУЮ страницу нужно выполнить скрипт index.php ПЕРЕЙТИ НА СТРАНИЦУ = выполнить Index.php
Давай по русски тогда. У тебя ссылка uppuru.localhost/СДЕЛАЙ-БОЧКУ. Веб сервер эту ссылку приносит в Index.php У тебя в index.php условие: если в ссылке есть "СДЕЛАЙ БОЧКУ" выполнить функцию "НОВАЯ БОЧКА"
>>2648411 >>2648408 Аноны, есть ссылка на репозиторий где вся эта лабуда с пабликами хуябликами нормально для понимания настроена и можно чисто по коду понять как это работает, потому что я вас абсолютно не выкупаю, тут 2 варианта, либо я пиздец какой тупой, чего за собой раньше не замечал и вы открыли мне глаза, либо пхп явно не моя стезя.
В коде ошибки нету. Код работает корректно. Анализатор выдает ложное срабатывание, так как в отсутствие тайп-хинтов он попытался определить тип переменной из выражения b = a и сделал это неправильно.
Ты не можешь в браузере выйти за пределы public, в этом и смысл. То есть, если ты хочешь открыть браузером test.php, то ты должен положить его в public.
А вот если ты хочешь просто подключить файл за пределами public через require, то это сделать можно.
Тебе надо переложить файлы, к которым пользователь может обращаться через браузер, в папку public.
То есть если у тебя пользователь может перейти по ссылке viewFile.php (или отправить форму по такой ссылке), то этот файл нужно положить в public. Но только его, а не вообще все файлы. В public должен быть минимум файлов, только то, что нужно, а не все подряд.
Также, если ты используешь Slim, а не пишешь код с нуля, то у тебя из PHP-файлов в public будет только index.php. Остальные файлы ты будешь подключать за счет роутинга.
Если ты не используешь фреймворк, а пишешь все сам, то у тебя может быть в public несколько файлов-контроллеров вроде index.php, upload.php, viewFile.php и так далее. В этом случае роутером у тебя будет по сути Апач.
перенаправляются на index.php (за счет конфига Апача), index.php подключает Слим, а Слим смотрит на URL и вызывает нужный контроллер. Вызов нужного контроллера в зависимости от URL это и есть роутинг.
То есть, при использовании Slim ты не используешь URL вроде /file.php?id=123, и не обращаешься к скриптам напрямую, а используешь нормальные URL вроде /file/123.
Когда ты у себя в index.php пишешь
$app->get('/upload', function (..) { .... });
то это читается как "если браузер запросит страницу /upload методом GET, то вызвать эту функцию. А эта функция может отдать какой-то текст или вызвать контроллер, или подключить шаблон или что-то еще.
>>2649128 Хватит срать в штаны. Ты инициализировал b как int. В строгой системе типов переменной типа int нельзя присвоить None, о чем тебе и написал анализатор.
То что в твоем ебанутом мире пхп можно творить хуйню, означает не что все остальное сломано, а что пхп кал говна и ему до нормального языка как до луны раком.
>Так будет в C# Впервые слышишь про nullable? https://onlinegdb.com/lOWZtwFpQg А не будешь переносить скобки на новые строки приедет дядя Билл и купит тебя в рабство.
>То что в твоем ебанутом мире пхп можно творить хуйню В любом языке можно творить неистовую хуйню и всё тут зависит от прокладки между клавиатурой и креслом.
> ему до нормального языка как до луны раком Добавить асинхронность, автозагрузчик классов и пакетный манагер из коробки? Действительно как до луны.
>>2649615 >>2649617 Нахуй вы мне это пишете? Пишите это >>2649128 дегенерату. Это его пример. Это он придумал инициализировать переменную через присваивание, это он придумал что потом её за каким-то хуем нужно менять на нулл, это он на серьезном ебале заявил что нормальное поведение стат анализатора хавать это говно, потому что в пхп можно на все хуй забить.
Зачем ты выставляешь глупость напоказ? Ситуация, когда в переменной может лежать что-то или None, встречается очень часто.
Например, у тебя в переменной может быть лучший вариант доставки товара или None, если его не удалось определить.
Тип переменной не определяется присвоенным ей в первый раз значением. Если бы я сначала написал b =None, а потом b =a, то это значит что тип переменной b это None?
Это именно ошибка статического анализатра, который почему-то решил, что тип переменной определяется первым присвоенным ей значением.
Твои примеры кода не эквивалентны моему. У тебя в Си явно указано, что b это int. У меня в коде это не указано, статический анализатор это сам откуда-то придумал.
>>2649827 >Ситуация, когда в переменной может лежать что-то или None, встречается очень часто В такой ситуации и нужно указывать что в переменной будет лежать что-то и none, тупорылый ты хуесос. Это ты ебанько хочешь нихуя не указывать и чтобы ошибок никаких не было. В пхп никаких ошибок нет не потому что он охуенно умный, а потому что ему похуй. А во всех нормальных языках, в которые кстати входит питон, тебе пишут что ты, собака сутулая, попутал типы и либо укажи правильные типы, либо меняй присваиваемый тип.
>>2649830 В C и С++ всегда нужно указывать тип объявляемой переменной. Там твое ебланское "нихачу" не прокатит. За остальные примеры есть че пернуть?
Юзается ли на практике SplFixedArray? Или все просто используют "обычные" массивы php? Судя по тестам SPL побыстрее при бОльшем размере - тратит память меньше, операции вставки быстрее.
Сам я понял так, что до сотен тысяч элементов обычный массив - хеш-таблица - лучше подойдет, всё что выше - лучше использовать spl.
>>2650905 Вся Spl билиотека это наебка и карго культ. Никто её не использует. Потому что эти структуры написаны не на C, а на самом пхп. Ты, например можешь как хочешь изъебываться, но стандартная функция сортировки пхп будет быстрее твоей, потому что написана на C и выполняется на C, а твоя на пхп и у неё есть оверхед. Почему тогда не сделают структуры на C? А хуй его знает, походу для формошлепства они не очень нужны.
SplFixedArray работает немного лучше не потому что он fixed, а потому что SplFixedArray это на самом деле не массив, а объект. Добро пожаловать в мир пхп - здесь все наебка.
>>2651087 Правильно, все как я и описал. Нормальный fixed size массив аллоцируется в стеке и ДО выполнения функции и за счет этого работает быстрее. В пхп ебала пикрелейтед. Которая представляет собой обертку над специальным пхп объектом zend_object, который ясный хуй лежит в куче. А оперируем мы им через виртуальную машину пхп. Все возможные профиты от fixed array в этой ситуации теряются, остается только название.
>>2650994 Так это не моё мнение, как видишь, а человека разбирающегося в этом. Ты можешь сам проверить, прочитав этот отрывок, и понять, что эта книга не идеальна. Но дело твоё, раз тебе хочется ворчать, ныть, плакаться, задавать глупые вопросы, ок.
>>2651116 >Нормальный fixed size массив аллоцируется в стеке >Все возможные профиты от fixed array в этой ситуации теряются Мне просто интересно, где ты эту хуйню вычитал? FixedArray полезен тем что не требует доп.аллокаций, и это не хеш карта с доп.памятью, без ключей, FixedArray используются в С/C++ часто с выделением памяти, потому что стек ограничен в пару МБ, и много ты там не разместишь, а ведь там еще должны находится адреса возврата и локальные переменные интерпретатора. То что там поверх Zend это вообще никак не влияет на производительность.
>>2652133 >Мне просто интересно, где ты эту хуйню вычитал? Это общеизвестный факт. Массив на стеке будет быстрее обычного массива. Ты типа сомневаешься что это так? Или просто больше нечего пернуть?
>FixedArray используются в С/C++ часто с выделением памяти, потому что стек ограничен в пару МБ Это какого размера должен быть массив чтобы не влезть на стек? 1кк? Нахуя тебе фиксированный массив на 1кк? Ты понимаешь что весь выигрыш в скорости будет схаван тем фактом что тебе сначала нужно эту ебалу в памяти создать, а потом его заполнить. И ты типа знаешь что данных ровно столько и переполнения не будет. Никто такой хуйней не занимается, а просто использует обычный массив. А в пхп так вообще в принципе нет задач для таких объемов данных, что бы ты не делал это будут порции по паре тысяч элементов. Нет никакого смысла держать в памяти даже массив на один миллион, тебе тупо нечего с ним делать.
>То что там поверх Zend это вообще никак не влияет на производительность А если еще немного стекломоя наебнуть, то он и выигрыш в производительности даст. Даже самому нулевому вкатуну очевидно что работа через посредника будет медленнее.
Ты настолько изошелся желчью, что не видишь сути проблемы. Суть в том, что статический анализатор делает неправильные предположения о типах переменных и из-за этого происходят ложные срабатывания. Если я не указал тип переменной, это не значит, что можно его придумывать за меня.
Статический анализатор не пишет, что я должен указать тип переменной. Он пишет, что в коде ошибка, хотя код абсолютно корректный и работает. Это называется "ложное срабатывание", когда анализатор сообщает о якобы ошибке, которой на самом деле нет.
В PHP по-другому. PHP не додумывает типы за тебя, и корректно провеяет их во время выполнения, когда они указаны.
Попробуй успокоиться и спокойно разобраться в сути проблемы.
Обычные массивы в PHP ассоциативные, то есть у них индексы могут быть числами, могут быть строками, если числа, то они могут идти в произвольном порядке или с пропусками.
В SplFixedArray индексы всегда идут строго по порядку от 0 до N. Это дает два преимущества:
- можно экономить память при хранении больших объемов данных - можно таким образом показать, что функции нужен именно набор данных с ключами от 0 до N по возрастанию. Другой набор данных передать не получится.
Я вижу, анон, ты умный, раз ты решил эту задачу. Может быть ты тогда можешь посчитать, какова вероятность выпадения двух даблов? То есть, два дабла выпадают в одном из скольки случаев?
Ты пишешь ерунду. В современных ОС размер стека сильно ограничен (легко может быть в районе 384 Кб, например), и ты там много не разместишь.
Преимущества SplFixedArray в том, что он хранит данные по-другому, не как хеш-таблицу, и за счет этого экономит память (не нужны ведра, списки ключей и тд).
Ты только демонстрируешь свое незнание. Впрочем, что ждать от человека, который подумал, что SplFixedArray написан на PHP.
> Которая представляет собой обертку над специальным пхп объектом zend_object, который ясный хуй лежит в куче
Ну ты и глупый. zend_object в структуре со ссылки это сам объект SplFixedArray, а не содержащиеся в нем элементы (они хранятся в spl_fixedarray array). Перечитай исходный код, чтобы не позориться больше.
>>2652190 >Массив на стеке будет быстрее обычного массива Бред который ты где то услышал, и скорее всего текст то был правильный, но ты из за того что только на PHP писал, ничего не понял и выдумал свою шизу.
>Это какого размера должен быть массив чтобы не влезть на стек? У тебя только один массив в приложении?
>Ты понимаешь что весь выигрыш в скорости будет схаван тем фактом что тебе сначала нужно эту ебалу в памяти создать, а потом его заполнить. Выделение памяти очень быстрый процесс, к тому же зачем выделять массив что бы сразу его освободить? Он долгоживущий будет.
>А в пхп так вообще в принципе нет задач для таких объемов данных Конешн.
>Даже самому нулевому вкатуну очевидно что работа через посредника будет медленнее. Скажи потерю производительности в процентах, с округлением в меньшую сторону. это будет 0% на современном железе где запускается php
>>2652225 Ну я тебе привел примеры как это работает в нормальных языках. Везде работает как в питоне. Получается что в C#, Java и Go ложное срабатывание, а в C и С++ вообще нельзя сразу тип не указать, во ебанутые. Такие детские ошибки, не то что в пхп.
>>2652245 >Ну ты и глупый. zend_object в структуре со ссылки это сам объект SplFixedArray, а не содержащиеся в нем элементы (они хранятся в spl_fixedarray array). Бля, что же быстрее: просто array или пхп ебала + array. Никак не могу выяснить, загадка прям.
>>2652281 >Бред который ты где то услышал, и скорее всего текст то был правильный Так будет или не будет? Почему ты не напишешь прямо, а вертишь сракой?
>У тебя только один массив в приложении? Бля, ебанько, давай перефразирую для твоего маленького пхп мозга: fixed array имеет хоть какой-то смысл если этот массив описан в коде. Если тебе нужно хранить в массиве большие данные полученные снаружи, то используется обычный динамический массив. Банально потому что для фиксированного нужно знать точный размер, а в реальной жизни так просто не бывает.
Бля, я хуй знаю как пхп макаке еще объяснить. Ты понимаешь, что массив на стеке это часть программы, как функция, в которой он используется, он уже скомпилирован. А на получение данных из другого места ты выполнишь дополнительные действия, которые полностью перекрывают любой возможный профит от способа объявления массива?
>>2652376 >Так будет или не будет? Почему ты не напишешь прямо, а вертишь сракой? Поучу тупого, массив на стеке и в распределенный через malloc это просто кусок памяти, один кусок памяти может быть быстрее другого из за разного способа выделения на уровне ОС.
>что массив на стеке это часть программы >он уже скомпилирован Покажи мне скомпилированный лол массив тут https://godbolt.org/z/G5ezcWfr3
>C++ быстрее пхп в 5 раз Клоун, я тебе задал конкретный вопрос, и он не связан с общей производительностью PHP vs C++. То что ты кидаешь какие то ссылочки, и пишешь про доверие, четко подтверждает мои догадки - ты начитался того что слишком велико для твоего уровня, и выдумал свои манятеории о том что Spl написан на PHP, что стеки дают 100500 буст производительности.
> что же быстрее: просто array или пхп ебала + array
Хватит демонстрировать глупость. Изначально ты заявлял, что SplFixedArray написан на PHP и не дает никакого выигрыша, тебе объяснили что он написан на Си и выигрыш есть (в объеме занимаемой памяти в сравнении с обычным массивом), но ты все никак успокоиться не можешь.
Что касается скорости, то во-первых, SplFixedArray дает выгирыш по использованию памяти, а не по скорости, голова дубовая, во-вторых, для подавляющего числа приложений скорость работы PHP достаточна. Можно было бы писать сайты на Си, но почему-то так никто не делает, а используют PHP, как думаешь, почему?
>>2655257 Показывай свой вариант. Бля, как я устал. Каждый раз оно и то же из треда в тред.
Один раз за пол года кто-то реально пишет код. Тут же какой-то выпердышь с серьезным ебалом начинает какие-то пространные рассуждения про то как на самом деле надо, про бест практики, хуйню малафью. А когда этого критика-хуитика просишь чтобы он написал хоть ебаную строчку он виляет сракой сто постов, а потом сливается.
Это фишка пхп треда, нигде в /pr такого больше нет. Пиздежа - море разливное, но написать код просто невозможно. В любом другом треде анон с кайфом напишет что угодно лишь бы разъебать по фактам. А пхп треде только пук.
>>2655421 >Показывай свой вариант Сколько ты мне за это заплатишь?
>Один раз за пол года кто-то реально пишет код Не пизди.
>про бест практики, хуйню малафью >Нинужна Что отличает погремиста от макаки?
>лишь бы разъебать по фактам Наваливает базы как надо писать по бест практис и переиспользованию участков кода?
Ты пишешь array, не пользуешься типизацией и делаешь интерполяцию строк через {}, зачем мне тебе устраивать код ревью бесплатно, чтобы сделать из макаки которая пишет код из PHP 5.6 человека?
>Нинужна Ты просто пернул "говно". Ни примера, ни разбора. Вместо конструктива и помощи бесполезное мнение дегенерата, который и строчки не в состоянии высрать.
>Ты пишешь array, не пользуешься типизацией То есть ты по моему посту не понял что этот код не я писал? Ну ты в натуре пенек осиновый. Все эти "ошибки" про array и прочую неважную хуйню типа разметки фиксятся одной комбинацией клавиш в phpstorm ctrl+alt+l.
Не удивительно что код никто не постит. Мало кому хочется дело иметь с такими бездарными хуесосами как ты, от которых помощи 0, зато вони дохуя.
>>2655451 Сейчас уже можно просто переменную вставлять между двойными.
>>2655495 >А сколько заплатили >>2655244 челу? Зачем платить долбаёбу который напишет бесплатно?
>Ни примера, ни разбора Нахуй ты мне нужен сидеть разбирать твой высер? Ты мне за это не заплатишь.
>что этот код не я писал? >Меня уже берут на работу? А дефаешь этот высер так как будто писал его ты, лул.
>Ну ты в натуре пенек осиновый Ну ты внатуре подпивас колхозный который решил в погремирование, дабы не хуярить на заводе. Если тебе тайпхинты показать ты снова вернёшься на ленту, мне вот интересно!?
>комбинацией клавиш в phpstorm ctrl+alt+l Ну так нахуя ты несёшь сюда код за который я бы тебя уволил нахуй? Почему ты не нажал эту чудесную комбинацию клавиш?
>Не удивительно что код никто не постит Во первых никто не хочет палить свои гиты, а во вторых зачем? Ведь есть же макаки с кода которых можно покекать.
>с такими бездарными хуесосами как ты Обиделась моя маленькая шавка? Ну погавкай погавкай, а как перейдёшь на человеческую речь тогда и поговорим. Адио.
>>2655560 да вроде всегда было можно, там же разница немного в другом $array[key] и {$array['key']} и методы вызывать можно только в скобках {$foo->bar()}
>>2655560 >Клуб изучающих PHP >Тут мы изучаем язык PHP >Это тред для начинающих >Зачем платить долбаёбу который напишет бесплатно? >Нахуй ты мне нужен сидеть разбирать твой высер? Ты мне за это не заплатишь. >Ну так нахуя ты несёшь сюда код за который я бы тебя уволил нахуй? >никто не хочет палить свои гиты >Ведь есть же макаки с кода которых можно покекать. Ебать, какой же пидарас всплыл. Давно таких мразей не видел. И эта фиксация на "платить" "заплатишь" эта боль безработного вкатуна.
>>2655576 Да не слушай этого дебила. Он ни дня в жизни программистом не работал. Как изначально договорено так и будете писать. Где-то используют sprintf, где-то implode, где-то конкатенацию, где-то интерполяцию. Это по большей части дело вкуса, как и любое форматирование в принципе. Я уже лет пять как просто загружаю очередной стайлгайд в шторм и ставлю автоформатирование при коммите.
Все действительно важные правила проверяются в phpcs и/или sonarqube. Так что твой мердж реквест просто не пройдет пайплайн и будет висеть как фуфел красный, а пока он красный никто его ревьюить и аппрувать не будет, пушо это физически невозможно. И тогда твой тимлид тебе скажет что хватит хуи пинать, пиздуй фиксить. Ты зайдешь в jenkins откроешь пайплайн, прочитаешь какие скобки не там и поставишь как надо. И то как предпочитаешь их расставлять ты или какой-то еблан на двачах никого не ебет, просто потому что чтобы поменять правила надо нехуйно поебаться, сначала согласуя, а потом переписывая их.
>>2655630 >эта боль безработного вкатуна >>2655650 >программистом не работал Эти колхозные маняфантазии... Эти потужные колхозные рассказы про мерж реквесты =)
Судя по твоему коду не работал ни дня именно ты т.к тебя хотя бы научили хорошим практикам кода.
>>2655664 >потужные >колхозные >=) Ты хохол что-ли? То-то я смотрю происходит какая-то истерика на грани шизофрении. Вы держитесь там, переживаю за вас как за родных.
>>2655430 >>2655495 В этом же треде мне писали, что "ВИДНО СРАЗУ - ВКАТУН, БЫЛ БЫ ТЫ РАЗРАБОТЧИК, ТО НЕ ИСПОЛЬЗОВАЛ БЫ ИНТЕРПОЛЯЦИЮ!". Сейчас наоборот.
Надо было сразу погуглить, почему-то я решил, что ее нельзя использовать, вот просто щелкнуло в голове и всё. Теперь я запомнил, что можно.
>>2655430 array() было в примере кода, я не исправлял ничего, т.к. вроде можно и так. А что в этом плохого? Надо обязательно [] использовать?
>>2655825 Дело не в том можно или нельзя. Просто будь готов к тому что тебя попросят сделать по другому, не цепляйся за эту хуйню. Тебе должно быть похуй как писать, хоть задом наперед. Главное что не руками.
Поставь phpstorm. В code style выбери схему psr, это стандарт, это база. Одно нажатие кнопки и весь код в файле будет отформатирован машиной по стандарту. Если в конторе другой стайлгайд, ты просто заменишь в code style схему на ту которую они используют. 99% что ты даже знать их ебанутые правила не будешь.
Потом поставь плагин https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended- и исправляй косяки пока инспектор не покажет зеленую галочку. Почему надо именно так он тебе напишет и даст ссылку на развернутое объяснение. Делов на пару минут, а вопрос с форматированием закрыт полностью и навсегда.
думаю, тут лучше было написать условие в стиле "x ≥ 11 и x ≤ 19", чем перечислять 9 чисел.
Когда тебе надо собрать строку из слов, то удобно сделать массив и класть в него отдельные слова, в стиле:
если (в числе есть сотни) { положить в массив число сотен; }
А в конце склеить слова с помощью implode(). У тебя же код дублируется, например в функции numberToText несколько раз скопирован код получения числа тысяч.
В общем, сделано неплохо и аккуратно, если не считать дублирования кода.
array там в одном месте - в списке названий чисел, потому что этот список был написан для заголовки задачи во времена PHP5. В других местах везде квадратные скобки.
> не пользуешься типизацией
Потому что в учебнике в этой задаче еще не упоминается типизация. Невозможно изучить все одновременно.
> и делаешь интерполяцию строк через {}
И в чем тут проблема? Это исключает неоднозначность, если например после переменной идет кавычка: "«$a»" - ты знал, что здесь кавычка станет частью имени переменной? Не знал наверно.
> зачем мне тебе устраивать код ревью бесплатно
Либо пиши что в коде не так, либо не пиши ничего.
> Ни PSR
Судя по тому, что ты не написал номер PSR, ты сам не знаешь о каком PSR идет речь.
Есть неоднозначность, если после переменной идут скобки, стрелка или кавычки:
echo "$x[$a]" - не заглядывая в мануал, как это интерепретируется? Ты же судя по комментариям опытный специалист и легко ответишь, правда? echo "$x->a()" - а это? echo "«$x»" - не заглядывая в мануал, как это интерпретируется?
Не использовать {} можно, если переменная отделена пробелами или другими безопасными символами от остальной строки.
>>2645120 >Структуры данных - это способы размещать информацию в памяти. Не согласен. Структуры данных предназначены для разработчиков, а не для компьютеров, чтобы им удобно было хранить. Как они под капотом хранят данные, никого особо не интересует. Структуры данных - это не способ хранения, это скорее способ представления данных, абстракция. И способ манипуляции этими данными. Любые структуры данных можно смоделировать с помощью функций. Способ хранения не важен. Важно как они будут представлены и важен интерфейс для манипуляции этими данными.
>>2656699 >btree индексы Ты путаешь причину и следствие. Почему деревья эффективны? Не потому, что они на железе лучше лежат. А потому, что они эффективны по асимптотической сложности. Эффективность структур данных определяет не способ их хранения на низком уровне, а их алгоритмическая эффективность. Эффективность с точки зрения математического уровня абстракции. Самого верхнего уровня, а не уровня компилятора или железа.
Цитата из википедии: B-дерево может применяться для структурирования (индексирования) информации на жёстком диске (как правило, метаданных). Время доступа к произвольному блоку на жёстком диске очень велико (порядка миллисекунд), поскольку оно определяется скоростью вращения диска и перемещения головок. Поэтому важно уменьшить количество узлов, просматриваемых при каждой операции. Использование поиска по списку каждый раз для нахождения случайного блока могло бы привести к чрезмерному количеству обращений к диску вследствие необходимости последовательного прохода по всем его элементам, предшествующим заданному, тогда как поиск в B-дереве, благодаря свойствам сбалансированности и высокой ветвистости, позволяет значительно сократить количество таких операций.
В этом примере ничего не сказано про низкоуровневое представление данных. Они могут представляться (храниться) сколько угодно неэффективно, это зависит от реализации. B-дерево выигрывает потому, что требует меньшее количество операций обращения к узлам. Причина в математических свойствах этой структуры, а не в эффективности реализации на низком уровне. Реализовать такое дерево можно очень по разному. И даже очень не эффективно.
Этот пример наглядно показывает, что на первый план выходит абстракция, а не ее реализация. Если бы алгоритмически было выгоднее хранить индексы не в b-tree, а в другой структуре данных, то b-tree бы не использовали.
Для структуры данных важен верхний уровень абстракции, как представлена эта структура для разработчика, в каком виде. Дерево это или список, или что то еще. А также важен интерфейс манипулирования этой структурой. Тогда разработчик сможет эффективно использовать структуру с точки зрения асимптотической сложности. Ведь искать в древовидной структуре проще чем в линейной. Потому что они математически устроены по разному. Не потому, что одна или другая эффективней реализованы.
Асимптотическая сложность вообще не подразумевает оценки скорости выполнения операций для вычислителя. Она определяет как быстро можно проводить операции с точки зрения математики. Вычислителем может выступать просто человек с листком бумаги и ручкой.
>>2656773 Но то, как на железе данные лежат, тоже ведь влияет. Обойти таблицу по индексу дороже, чем прочитать саму таблицу последовательно, хотя алгоритмическая сложность одна и та же. Да и, например, одну и ту же структуру данных можно реализовать по-разному: например, стек через вектор и стек через связный список, и будет разница по крайней мере в потребляемой памяти. Можно думать о структурах данных, как об абстракциях при решении каких-то прикладных задач, но вообще внутренняя реализация тоже играет роль.
>Она определяет как быстро можно проводить операции с точки зрения математики. Нет, всё же, по-моему, асимптотическая сложность больше про то, как время выполнения растёт с увеличением количества входных данных, а это необязательно означает, что один алгоритм всегда быстрее другого. Сортировка пузырьком на небольших массивах может работать быстрее, чем квиксорт, например. Но, если мы увеличим объём входных данных в тысячу раз, то сортировка пузырьком станет работать условно в миллион раз дольше, а квик сорт условно только в десять тысяч раз дольше.
>>2656773 Ты бы хоть из приличия почитал как в постгресе btree реализованы, про пейджинг и прочие оптимизации.
Да и вообще твоя шизотеория ломается прямо на старте, на самых базовых примерах структур типа стека и кучи. Именно структура и расположение стека в памяти делает работу с ним быстрее. Стек работает LIFO не потому что программистам так удобно, а потому что процессор может добавлять в такую структуру данные за одну инструкцию.
>>2656941 Само собой реализация имеет значение. Никто в здравом уме не реализует структуры данных намерено не оптимально. Но разработчик не может повлиять на внутреннюю реализацию. Его задача выбрать правильную структуру с точки зрения алгоритмической сложности. В этом его задача. А задача разработчиков языка эффективно реализовывать структуры.
>>2657003 Ты бы матчасть подучил сначала. Стек является LIFO не потому, что процессор как то там устроен. Процессор может быть троичным и каким угодно еще, от этого стек не изменится. Стек это АТД, математическая абстракция. Он вообще не зависит от процессора. Его можно реализовать различными способами. Детали его реализации не волнуют тех кто его использует. Им дан только интерфейс. Не путай стек со стеком вызовов. Стек является LIFO потому что первый зашел - последний вышел, последний зашел - первый вышел. Очередь работает наоборот.
>>2656941 >по-моему, асимптотическая сложность больше про то, как время выполнения растёт с увеличением количества входных данных Входных данных по отношению к алгоритму. Для одного алгоритма рост меньше, для другого больше. Это же функция. А функция что делает, она отображает. Зависимость одного от другого. То есть говорит об отношении. Это абстрактные измерения эффективности самого алгоритма, его математические свойства, а не измерение скорости выполнения данного алгоритма каким либо процессором.
Некоторая аналогия. Один шаг сделанный человеком - это 1 выполненное действие. 2 шага - соответственно 2 действия. Разные исполнители, то есть люди, могут по с разной скоростью выполнять шаги. Но если считать по количеству действий, 1 шаг всегда быстрее чем 2 или более. Не зависимо от того кто делает шаги.
Когда работают на конвейере такие измерения тоже могут быть полезны. Человек будет тем более эффективно выполнять работу, чем меньше действий он будет производить. Чем меньше действий - тем проще получается работа. Меньше времени, меньше усилий, меньше отвлекающих факторов. Любой исполнитель будет +- одинакового выполнять эти действия. Даже если кто то может быстрее других, важно чтобы он выполнял как можно меньше действий. В идеале всего одно. Одно и то же действие на протяжении всей работы. Тогда будет наибольшая эффективность.
>Но разработчик не может повлиять на внутреннюю реализацию >А задача разработчиков эффективно реализовывать структуры Похоже с шизотеорией я в точку попал. Шиз эталонный из палаты мер и весов.
>>2657248 >Не путай стек со стеком >Стек является LIFO потому что он LIFO Ты под солями?
>>2657300 >Стек - это АТД >Стек вызовов - абстракция >реализуемая в виде АТД стек Бля, я уже заебался проигрывать с того как ты по кругу ходишь противореча себе самому.
Ты походу просто угашенный в хлам. Но я все таки заскриню и кину плюсоебам в загон, чтобы знали каких вершин мы тут в пхп тренде достигли на почве структурирования данных.
>>2657339 Что тебе не ясно, неуч? Конкретные противоречия напиши. Или на хуй пошёл. Стек - абстрактный тип данных (АТД), лишь контакт. Стек вызовов - абстракция реализованная в процессорах, стековых виртуальных машинах и т.д. Используется только для хранения данных вызываемых функций. Реализуется на основе абстрактного типа данных - стека.
>заскриню и кину плюсоебам в загон Можешь еще в спортлото написать.
>>2657454 >Стек - лишь контакт >Стек вызовов - абстракция реализованная в процессорах >в процессорах >Реализуется на основе - стека Бля, биокарлик, пощади не добивай. Я от смеха лопну нахуй ща.
>>2657508 Дура тупая, одно и то же понятие может иметь разные значения. Одно и то же понятие может рассматриваться с разных сторон, на разных уровнях абстракции. Просто у тебя вместо мозгов говно.
>>2657521 >Одно и то же понятие на разных уровнях абстракции Оно понятие, разные значения. Одно понятие, разные стороны. Одно понятие, разные уровни абстракции. Наконец-то сумрачный пхп гений вывел истинную структуру данных. Фрактальный стек. Просто блядь ебнутый шизоид под солями.
Аноны-погроммисты, требуется хелпа по сайту на Symphony.
Вводные: Есть Один Сайт на симфони с твигом, мне нужно установить на нем форму обратной связи. Самую простейшую, главное, чтобы текст на почту приходил.
Проблема в том, что я нихуя не понимаю, как это делается. В данный момент у меня есть форма на HTML и небольшой обработчик на чистом ПХП, который в обычном случае отправляет данные, но на этом сайте при нажатии на кнопку выдается ошибка "Method not allowed. Must be one of: GET".
Как я понимаю, мне надо либо писать какой то другой код, либо где то включить разрешение на отправку данных пост методом, но где - не понятно. Структура папок вообще не дефолтная и нет yml конфига, которые есть во всех примерах в интернете.
>>2658567 Тебе добра, анон, я зеленый пиздец, только на жопакрипте скрипты писал до этого. Без тебя за год бы не допер, что сайт на слиме, а не на симфони ебаном. Спасибо ещё раз!
>>2660563 Я понимаю что сложно, инструкция то не для пхп треда писалась >1. add -javaagent:/path/to/ja-netfilter.jar=jetbrains to your vmoptions >/path/to/ja-netfilter.jar >ja-netfilter.jar
>>2660815 Уже нет. У самого такая лицензия в марте закончилась. Думал еще раз сделаю, а всё. И надо было не курс проходить, а решить 4 задачи в определенных курсах.
>>2660937 >Думал еще раз сделаю, а всё. Типо второй раз не даст активировать, а предложит купить? >а решить 4 задачи в определенных курсах Ну или так, я просто забыл уже, но помню, что сам получал такую 2 раза.
mysql по умолчанию пытается подсоединиться к БД через unix-сокет по адресу /run/mysqld/... Докер не предоставляет такой сокет, потому ты должен коннектиться через TCP-порт 3306: