Здесь мы изучаем язык PHP (а также JS/CSS/HTML/SQL) и учимся делать сайты. Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1958281 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, можно искать решения и обсуждения задач).
С чего начать
Наши уроки по 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? — Да, однозначно. Посмотри любую вакансию.
Код нужно писать аккуратно и оформлять, как принято. Потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Если он будет неряшливым, это будет большой минус.
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть рекомендации PSR-1 и PSR-12. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults() - Название функции начинается с глагола, в стиле «сделайЧтоТо» - не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там - в именах классов используется CamelCase, первая буква большая, «_» может использоваться - мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек - мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела) - ставим тайп-хинты на аргументы функций, результат функций и поля классов
Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:
Вопрос, вытекающий из последних постов прошлого треда. Давно не касался авторизации и вот этого всего, знаю, что сейчас есть стандарты и тд. Но может кто подскажет в паре слов, насколько старый вариант с md5 хэшем сейчас безопасен?
>>1998480 Какой старый вариант? Тебе сложно вместо md5() вызвать password_hash()? Если использовать нормальную соль то md5 сложно взломать злоумышленику с ресурсами меньшими государственных. Но нет смысла ебаться с md5 когда у тебя из каропки password_hash и password_verify тупо всю хуйню делают за тебя.
>>1999047 Скорее всего ты чего-то недогнал в процессе обучения. Тут не работает как в школе\шараге и надо честно позадрачивать с недельку. На чём всрался?
>>1999073 >>1999079 Да че я не догнал... Все задачи решил предыдущие, но если попросить здесь помощи по бонусным мне в сотый раз льют в уши кучу помоев, которые никак не помогают решить задачу.
Вот тут например, спросил как пофиксить задачу, сказали вместо ничего выводить пробел)0 Да я как бы и так знаю в чем проблема, а как это сделать нахуй?))) Очень информативно.
Про банкомат задачу тоже как не знал как решать, так и не знаю. Высрали про какой-то последовательный перебор, но я отказываюсь понимать это.
Я в центре на пикрелейтеде, inb4 я долбоеб неблагодарный и не ценю помощь, нахуй из треда
>>1999575 Передай извне фабрику. Практически любой современный контейнер инверсии зависимостей умеет это делать. Хотя это зависит от контекста конечно - иногда проще напрямую делать. Так же лучше не городить лишнего в небольших скриптах.
Есть ряд вопросов. Очень хочу вкатиться в пыху, потому что нацелен развиваться в бэке (пока для себя, а дальше как будет).
Так вот:
1. Вкатываться в 26 такое себе, да? Полно школьников 18 летних, на которых работодатель обратит больше внимания, чем на меня.
2. Как первый язык ПХП говно, правильно? (когда-то в вузе учили с++, с#, но я оттуда только базу вывез, типа строгую типизацию понимаю и т.д., помню даже тернарный оператор и пузырьковую сортировку
3. По какой книжке лучше всего начать учить?
4. Какую версию начинать учить? 7? 8? Нужно ли ставить апач и нгинх? Или достаточно поставить xampp/openserver и начать кодить?
5. Куда смотреть дальше? Laravel/Yii2/Zend/Symphony?
Ты ничего не переспросил в ответ на совет выводить пробел, вот тебе ничего больше и не посоветовали.
У тебя есть переменная $i, которая указывает, какую по счету букву надо взять из строки $value. Но некоторые строки слишком короткие и в них нет $i-й буквы. Надо проверять, что $i меньше чем длина $value (mb_strlen). Если это так, то берем одну букву из $value и добавляем в $letter. Если это не так ($i >= длины строки), то надо в $letter добавлять пробел.
Если с этим все стало понятно, то вот еще совет: у тебя используется рекурсия (функция abc вызывает саму себя). Можно заменить ее на цикл for, где $i меняется от 0 до максимальной длины строки стихотворения. Сейчас эта макс. длина у тебя вписана как 33, но лучше вычислять ее: разбить стих на строки, затем преобразовать массив строк в массив длин с помощью array_map, затем взять максимальную длину с помощью max().
> последовательный перебор
Это у многих вызывает сложность. Почему бы не попробовать начать с более простой подзадачи. Допустим, у нас есть всего 2 вида купюр - по 500 и по 100. Допустим, у тебя есть функция next(), и ей дается на вход 2 массива:
- первый массив - это общее количество купюр в банкомате вида [5, 2]. Это значит, что есть 5 купюр по 500 и 2 по 100. - второй массив - это какая-то произвольная комбинация купюр, например [2, 1] то есть 2x500 + 1x100.
Функция должна вернуть следующую за данной комбинацию (в виде массива). Если ей дали 2x500 + 1x100, она должна вернуть 2x500 + 2x100 (то есть массив [2, 2]). Если ей дали 2x500 + 2x100, она должна вернуть 3x500 + 0x100 (так как 3 купюры по 100 быть не может).
То есть, функция получает информацию о запасе купюр и одну комбинацию, и должна вернуть следующую за ней комбинацию (которая дает чуть-чуть большую сумму).
>>1999625 > 1. Вкатываться в 26 такое себе, да? Полно школьников 18 летних, на которых работодатель обратит больше внимания, чем на меня. Зависит от тебя. Школьники тупые. Для успеха помимо непосредственно кодирования нужно иметь ещё кучу скиллов.
> 2. Как первый язык ПХП говно, правильно? (когда-то в вузе учили с++, с#, но я оттуда только базу вывез, типа строгую типизацию понимаю и т.д., помню даже тернарный оператор и пузырьковую сортировку Да, в качестве первого языка PHP слишком ограничен и позволяет слишком много свободы.
> 4. Какую версию начинать учить? 7? 8? Нужно ли ставить апач и нгинх? Или достаточно поставить xampp/openserver и начать кодить? 7-8. А под капотом у xampp/openserver будет тот же самый апач.
> 5. Куда смотреть дальше? Laravel/Yii2/Zend/Symphony? Да.
1. Почему так многие в больших корпах перекатываются с РНР на Go? Цель ясна -- экономия ресурсов. Почему не на что-нибудь с нормальной инфраструктурой для разработки и отладки (Java, C#)? Почему именно Go? Похожесть синтаксиса? Лёгкость изучения? Новый быдлоязык? (хехе)
2. Что с производительностью самого РНР? Я так понимаю, новый компилятор пока не оправдал больших надежд? Насколько недавний взлом инфраструктуры разработки самого языка ( https://www.opennet.ru/opennews/art.shtml?num=54920 ) повлияет на перспективы его развития и доверие пользователей?
3. Symfony раздулась до сложности, сравнимой с Java Spring? Так ли это, или РНР-шники в очередной раз себе льстят? И если да, то в чём прелесть начинать новые проекты на симфони, кроме поддержки виртуальных хостингов?
4. Какие профиты от симфони по быстродействию? Если навключать всех кешей на всех уровнях -- можно ли говорить о вменяемом времени отклика по сравнению с быстрыми языками? Про остальное "фреймворки" говорить особого смысла нет: Zend подзагнулся, а остальные явно недотягивают до промышленной разработки.
>>1999703 хочу дописать 5. Вечный вопрос (ТМ) человека, который ежедневно работает с языком: Почему мы продолжаем любить и использовать РНР, если его свобода с одной стороны обходится так дорого (по быстродействию), а с другой, самые продвинутые фреймворки -- это бесконечные попытки зарегулировать эту самую свободу, ведущую к бесконечным ошибкам?
И ради чего мы должны мериться с backend-only языком программирования, в котором нет асинхронности "из коробки" (это не реверанс в сторону JS, там тоже куча проблем), у которого большие проблемы с маркетингом, у которого самая чудовищная степень прощения любых человеческих ошибок?
Раньше я уверенно декларировал ответ: "скорость разработки, быстрый и дешёвый старт любого проекта, невозможность "зависания"". Но сейчас, глядя на достаточно сложные в освоении и запуске Symfony-приложения, состоящие из многих пакетов и зависимостей, я начинаю сомневаться: до сих пор ли это так?
>>1999716 >ради чего мы должны мериться Я неебу ради чего ты должен мериться. Я вот нихуя не должен - пилю приложухи и не несу пафосной хуиты. Надо будет го - подтяну го, надо ноду - подтяну ноду. Это просто работа.
>>1999753 Ну не мирись тогда. Мирись-мирись и больше не дерись. По моему опыту бекенд это дай-то бох 50% - язык программирование, который не суть щас бы крудошлёпство великим делом считать. Остальное - смежные технологии и знание как делать хайлоад не всрав разработку.
>>1999703 >>1999716 Почему мы дальше работаем с Симфони? Отвечу за себя, может спасу жизнь какого-то ньюфага, который решил вкатиться в пых. Потому что это болото уже засосало. Можно, конечно, пойти пол годика работать каким-то охранником, учить параллельно джаву и вкатиться на позицию джуна, но зачем? Сидишь себе не рыпаешься, деньги получаешь. Да, меньшие чем джависты за ту же работу. Да, неприятно, но что поделать? Только по этой причине на симфони остается работа, разве нет? Еще есть надежда что по работе когда-то придется столкнуться с го/нодой. А там уже имея коммерческий опыт сделать перекат будет намного проще. Хотя языки эти и их подходы мне не нравятся, с php общего там очень мало, но это единственный вариант быстрого переката для пыхера. Зачем? Да, пока что корабль еще не тонет, но крысы уже всё чувствуют и понимают.
>>1999762 Ну, для фуллстек-приложений на Symfony уже характерно наличие ноды (encore / webpack). Только вот нода не сильно лучше на этом фоне и больше, чем за пых, за неё особо не платят.
Ну и почему охранником? После Symfony сложность Java не должна так уж испугать.
>>1999762 > го/нодой > единственный вариант быстрого переката чому единственный?
Не драматизируй. Синтаксис РНР весьма похож на С++ (только вот столько мозгов по управлению памяти не требует). Symfony по сложности уже сравнима с Java, а там близко C#.
>>1999762 Ну и сколько симфонисты нынче получают? У меня в компании бывшей был интернет-магазин. Крупный. Прямой конкурент эльдорадо, днс. Выручка лярд за год. Так вот там битрикс, вью и чистый пхп. Пыхеры получали там 180к+. 60% задач были такие: редиректы настроить, подключить апишку банка. Лютая хуета, я не знаю, нахуй вам эти ларавели, симфони и др.
>>1999775 Ну вашей конторе повезло с бизнес-процессами || программистами битрикс || распределением данных между системами, раз оно пока хорошо работает.
Регулярно появляются вакансии, где тот же битрикс в больших екоммерс-компаниях выпиливают в пользу симфони целыми командами, с зарплатами 200-250 тысяч рублей в РФ.
>>1999775 >я не знаю, нахуй вам эти ларавели, симфони и др. Потому, что код лучше чем на битрикс, быстродействие, масштабируемость и качество самих программистов в средем выше именно на современных фреймворках, чем у мартышек на битриксе. А на чистом пхп пишут сегодня разве что только вкатывальщики.
>>1999765 >>1999767 Тут не в сложности джавы дело, вы чего. Просто нужно освоить много информации, для этого нужно много времени. И, как никак, ты в джаву закатываешься как бы с нуля. Изучать всё это будешь после работы. Когда наступит черед идти к работодателю, ему почти что всё равно будет на твой опыт разработки на пхп. Слово "Symfony" там тоже никому ничего не скажет, все уверенны что это очередная CMS, а в PHP еще неймспейсы не завезли и пыхеры всё еще называют классы App_Http_Controllers_IndexController. Читаю на днях требования к джуну на джаве. "Опыт с Java не менее двух лет. Опыт в разработке больших веб-приложений от трех лет очень желателен. Если это Java - отлично. Если это Python, C#, Ruby - хорошо. Если это PHP, все равно будет плюсом" А с го/нодой можно начинать практиковаться прямо на пыхоработе, а из требований к джуну на go я даже часто встречал знание синтаксиса и годик-два опыта на пыхе.
>>1999765 >нода не сильно лучше на этом фоне и больше, чем за пых, за неё особо не платят. Во тут совсем мимо, открой хотя бы hh. Весь смысл переката как раз в том, что за ноду, в часности нест сейчас готовы платить, иногда даже больше, чем за нормальные языки. По крайней мере в ДС так.
У меня вопрос ещё актуален. На него никто не отвечает, к сожалению.
Как известно, уже 8-ая версия пхп вышла. Как мне учить этот язык? Если начну изучать php 7 от Котерова, нормально вкачусь в изучение или нет? Может, есть что-то лучше? И выучу если с 7 версии, как на 8 перекатываться?
Начал изучать это ваше PHP и конечно чтоб сразу вкотиться, я же не даун в 256 раз читать про примитивные типы данных. Решил запилить скриптик типа гостевая книга, ну а хули нет, разумеется для этого мне понадобился ORM я же не в 2004 чтоб просто данные выбирать и парсить, прочитал что doctrine популярен, ну стал читать, вроде все понятно, но! там предлагают в определении класса явно задавать геттеры и сеттеры. Че реально? Для каждого свойства. И разумеется если в модели что-то поменяется надо будет их добавлять/удалять. Они конечно все одинаковые абсолютно. Это как в джаве до какой-то 8 версии. И почему-то ваши __get() и __set() не работают: определяю их, все по сигнатуре, а пых говорит call to undefined method при попытке вызова. Нельзя было дефолтные методы что ли сделать?
>>2000267 лучше иши php7 zend Certification guide(но она на англ) каждую тему обязательно гугли дополнительно для лучшего понимания. php.net чтобы быть в курсе всех возможностей.К примеру тема строки и все функции для него
Аноны, я просто любитель и у меня вопрос, есть массив с массивами в которых хранятся логи типа айпи, юзерагент и т.п., хочу его отсортировать и вырезать только массивы с нужным мне айпи, как это сделать? Пропустить всё это через цикл и поместить в новый массив или для этого уже есть нужная функция которой я бы мог просто передать айпи и чтобы она вырезала только массивы с этим айпи и поместила их в новый массив который я выведу?
Есть массив $arr = [ [ip => "146. 228. 14. 88", name => "Vasyan", age => "13"], [ip => "127. 0. 0. 1", name => "Abu", age => "Petuh"], [ip => "146. 228. 14. 88", name => "Valera", age => "54"], [ip => "192. 168. 1. 1", name => "Vladimir", age => "68"], ]
Как сделать так чтобы в нём остались только массивы с айпи 146. 228. 14. 88? Только через цикл копируя в новый массив или есть какая-то готовая функция?
>>2000583 Есть array_filter, но положняк таков, что он сохраняет ключи, в итоге по твоему примеру у тебя останется дырявый массив с ключаемя 0 и 2. Чтобы переиндексировать его, нужно обернуть в array_values. В пхп 7.4 можно использовать стрелочные функции и спред, в итоге получится что-то вроде [...array_filter($arr, fn($item) => $item['ip'] === '1')]; но я бы так не стал писать
Аноны а такой вопрос, если мне нужно вывести значение из переменной которой ещё нет в начале страницы, как это сделать? С помощью функции? Вверху страницы пишем вызов функции, а снизу в ней определяем значение которое нужно будет вернуть?
>>2000762 Сперва всегда данные подготавливаются и только потом выводятся. В крайнем случае можно так: <?php $pizdapidor = $db->select('WHERE blablabla '); ?> <html> <head> ... </head> <body> <p><?= $pizdapidor ?></p> </body> </html>
>>2000279 Ничего, через пять лет никич возможно свойства добавит, вот тогда-то заживем! А вообще, в пыхошторме в три кнопки создаются все отсутствующие геттеры и сеттеры. Сначала alt+Insert, дальше сам.
>>1999639 >Ты ничего не переспросил в ответ на совет выводить пробел, вот тебе ничего больше и не посоветовали. У меня взорвалось очко от того что на более сложные задачи мне дают такие неинформативные ответы. Наверное, я не прав, что так грубо выражаюсь, спасибо за помощь.
Блджад посоны, столкнулся с тем что при сортировке по названию происходит такая хуйня, смотрите пик, что внезапно число 107 оказывается меньше чем 37 и выводится выше так как оно внезапно меньше, сортирую я это говно с помощью такого способа https://www.php.net/manual/ru/function.usort.php#example-5491 Пример #2 Как его отсортировать по человеческой сортировке где сперва будет 37, а потом 107? Вчера ещё натыкался на это но теперь не могу найти, всё это берётся из многомерного массива, так что сортировка просто по ключу или значению не вариант
>>1999625 1. Вкатился в 24. Вполне норм. Коллеги в среднем 30+ Для школоты пхп нимодна, они больше по жаваскриптам, да петухонам 2. Как первый - да, лучше взять что-то более строгое, классическое 3. Начинал тупо пролистав php.net и по ларакастам 4. 7ую бери, она сейчас везде на проде. Пока можешь xampp/openserver 5. Larave/Symphony - норм начало Yii2 - устаревший кал Zend - монструозный устаревший кал
>>2001260 Как будто тебя кто-то заставляет пользоваться этой легаси-хуйней из 90-х. Пхп конечно набит таким детским говном под завязку, но умные люди приводят к каким-то стандартам, развивают фреймворки. Примерно то же происходит с жс, но намного быстрее в силу важности языка.
>>2001383 Но вообще технически код отделен от разметки. От того что ты вынесешь шаблон в отдельный файл - не дохуя изменится. Архитектурно ниче не поменяется.
А вот то что логика представления у него не отделена от условной бизнес логики - это есть.
Но конечно ты прав - ньюфагу нужно сказать что так в один файл все пилить - очень не стоит, потому что что то большее чем хеловорд будет на вкус как земля.
>>2001410 Лол блядь, ты вообще в курсе что js это сахар над C/С++ (V8, Nitro и т.д.)? Пиздец, с кем я в одном треде сижу...
>>2001412 Тут не средней руки разраб, а начинающий - пускай хотя бы так запилит, подготовив данные для вывода, а не прямо в шаблоне свои функции пердолит, как народ часто делает. Потом уже научится разделять шаблон и код на базе моего примера.
>>2001421 >Тут не средней руки разраб, а начинающий - пускай хотя бы так запилит, подготовив данные для вывода, а не прямо в шаблоне свои функции пердолит, как народ часто делает. Потом уже научится разделять шаблон и код на базе моего примера. Многие как запомнили начальные примеры, так потом и на продакшене срут. А там, не факт, что сидят люди умнее их или готовые это всё править. Так и остается нуфаг с бед практисом. Отсюда и пошли все эти толстые контроллеры, потому что в документации так пишут.
Ну и мы пишем код в первую очередь для людей, для текущих и будущих коллег и для завтрашнего себя. Никому не хочется копаться в велосипедах, особенно в чужих
>>2001427 >Многие как запомнили начальные примеры, так потом и на продакшене срут. Если у вас такие на проде работают, то соболезную. Может повыкидывать этих трейни на мороз, а? Сейчас от джуна знание хотя бы одного фреймворка требуют.
>Отсюда и пошли все эти толстые контроллеры, потому что в документации так пишут. Всему не научишь в рамках туториала или поста на дваче.
>Никому не хочется копаться в велосипедах, особенно в чужих Это не совсем велосипед - это старый стиль разработки на пхп, когда веб был проще. Хуёво, что ты такого не знаешь и считаешь велосипедом.
>>2001421 А C это сахар над ассемблером. Сказать то что хотел? Существует стандарт ES, который поддерживают браузеры. TS полностью зависит от этого стандарта. Завтра откатят ES к 2010 году и привет твоему тайпскрипту.
>>2001445 А у тебя проблемы с тем, что ты себя считаешь молотком, а остальных гвоздями. Даже тут единицы тех кто будет с тобою вести праздный полудиалог-полусрач. Всем похуй на твои попытки самоутвердиться.
>>2001433 >Если у вас такие на проде работают, то соболезную. Может повыкидывать этих трейни на мороз, а? Таким грешат даже синьоры. В любом проекте, где был, контроллеры были засраны. Ну и других откуда наберешь легаси поддерживать?
>Это не совсем велосипед - это старый стиль разработки на пхп, когда веб был проще. Хуёво, что ты такого не знаешь и считаешь велосипедом. Деды так делали и нам велели. Только сейчас за такое по рукам надают. Ну а если не надают, то лучше сменить место работы
>>2001461 >Деды так делали и нам велели. Я ж говорю - сразу на фреймворки ни у кого не получится. В любом случае придётся проходить эволюционный путь самого языка, в том или ином виде, чтобы понимать что как и зачем было придумано. А не как местные мартышки - вызубрили "бест практис", а зачем он нужен понятия не имеют.
Есть официальная спецификация и для XLS (бинарный формат), и для XLSX (это zip-архив с XML-файлами). Ты можешь нагуглить их и попробовать сделать свой читатель/писатель этих файлов. Но должен предупредить, спецификация там в сотни страниц.
>>1999765 >Ну, для фуллстек-приложений на Symfony уже характерно наличие ноды (encore / webpack). Хмм, может я чего-то не знаю, но каким образом сборка фронтенда связана с работой на ноде? Тем более, там же вроде нода лишь под капотом.
А я поясню, почему 107 меньше, чем 37. Дело в том, что тут сравниваются не числа 107 и 37, а строки "107" и "37". Строки сравниваются так:
- берутся первые символы и сравнивается, у какого символа код (например, по таблице Юникода) больше. - если они равны, то сравниваются вторые символы - и так далее
Символ "3" считается "больше", чем символ "1", потому строка "37" больше чем "107".
>>2001413 >Как писать сайты в ООП стиле? Зачем тебе ооп стиль? Все зависит от задачи. Если твоя задача сделать только три статические странички - нет смысла ставить туда симфони. А тому мудаку, который оскорбил уи я скажу - иди ты нахуй мудак оскорбивший уи
>>2001896 Да откуда вы все блядь повылезали в последнее время? То у вас запросы к БД в шаблонах нормальная практика, то йии и процедурщину защищаете, то CMSки и прочее. Вас действительно много по весне оттаяло или ты один человек? Да, никто не спорит, для всего есть своя ниша. Но у нас тут тред разработчиков, а не макакенов. Макакены вроде как в /wrk/ сидят, по крайней мере года два назад сидели. А эта доска называется "Программирование", если кто-то не обратил внимания. Где в ваших Yii и CMSках программирование, скажите? Какое отношение >сделать только три статические странички имеет к программированию? Съебались нахуй отсюда, Господа.
>>2001925 >Где в ваших Yii и CMSках программирование, скажите? Мартыха, ты понятия не имеешь - что такое программирование, если написал такое. Сиди лучше молча.
>>2001925 > То у вас запросы к БД в шаблонах нормальная практика, то йии и процедурщину защищаете, то CMSки и прочее. Запросы в шаблонах охуенно же. Можно намакакать пять страничек, пока господин программист пишет контроллер для одной.
>>1999639 >Функция должна вернуть следующую за данной комбинацию (в виде массива). Если ей дали 2x500 + 1x100, она должна вернуть 2x500 + 2x100 (то есть массив [2, 2]). Если ей дали 2x500 + 2x100, она должна вернуть 3x500 + 0x100 (так как 3 купюры по 100 быть не может).
Хорошо, для 2 номиналов задача решена. Теперь надо переделать функцию, чтобы она работала не с 2 номиналами, а с произвольным количеством номиналов. То есть, массивы могут быть произвольного размера.
Так как количество номиналов неизвестно заранее, мы не можем просто вписать нужное количество блоков if. Нам придется сделать цикл, в котором мы идем от конца массива (самой маленькой купюры) к началу (самой большой купюре). На каждом шаге мы увеличиваем текущий элемент на 1. Если он получился меньше, чем запас данной купюры, то цикл заканчивается. Иначе, мы обнуляем текущий элемент и продолжаем цикл.
Аноны, есть файл в котором хранятся логи, и там уже несколько тысяч строк, выводить их все на странице неочень, по этому хочу сделать постраничный вывод, например по 100 штук, можете пояснить концепцию как мы делаем выборку из массива?
В моём понимании так - мы берём количество записей, делим на 100 и получаем количество страниц, пагинацию пока опустим, далее мы берём номер страницы из гет запроса и делаем следующее - умножаем номер страницы на 100 и вычитаем 100, так мы получаем начальный индекс с которого нужно вырезать массив, например 3 страница, $cut = 3 100 - 100 или $cut = (3-1) 100 получаем array_slice($arr, $cut, 100)? Или как ещё по номеру страницы из гета определить с какого ключа и по какой нужно вырезать 100 записей?
>>2002857 Ну а концепция пагинации такая что если 1 страница, то выводим ссылки на 2 страницу, предпоследнюю и последнюю, а если допустим 100 страниц и мы на 10, то выводим 1, 2 страницы, предпоследнюю, последнюю и две влево и вправо от текущей страницы, то есть 8, 9 и 11, 12?
Столкнулся с какой-то очень странной фигней. Импортирую стили прямо в scss: >@import '~select2/dist/css/select2.min.css'; >@import '~select2-theme-bootstrap4/dist/select2-bootstrap.min.css'; Всё работает. Но хотелось бы импортировать их в джаваскрипте, вот так: >import 'select2/dist/css/select2.min.css'; >import 'select2-theme-bootstrap4/dist/select2-bootstrap.min.css'; Ошибок никаких нету, вебпак нормально собирается, но стили не импортируются( При том что такой код у меня работал на другом проекте, на ларе, где над вебпаком Mix. Сейчас же проблема эта на проекте с Симфони, может это какая-то специфика Encore?
Возможно я просто сонный и чего не догоняю но вот проблема, из бд мне возвращается ничего, а в ошибке пишет просто "Ошибка". Таблица точно есть, и данные в ней тоже, регистрацию то запилил а тут что не так может быть?
Аноны, по вашему совету сделал сохранение топа в файл путём сохранения топа в временный файл и потом его переименование в нужный файл чтобы не было коллизий когда файлы затирают друг-друга, и столкнулся с тем что рандомно в течении дня проихсодит такая фигня что временный файл не удаляется, он в основном с рандомным именем и весит 0 килобайт, но есть и файлы размером в половину или весь файл топа в пол мегабайта, почему это может быть что временный до переименования файл не удаляется и остаётся? Приходится писать скрипт и удалять эти файлы им, потому что у них стоят права -600, и руками по фтп они не удаляются
Здесь у тебя цикл по сути не используется. Так как у тебя в if/else стоит в обоих ветках break и у цикла всегда выполняется только один шаг. Из-за этого ты проверяешь максимум 3 последние цифры в массиве, а не все.
Если взять, например, запас [5, 5, 5, 5] и комбинацию [1, 5, 5, 5], то программа выдает неправильный результат: https://ideone.com/cflqKZ
Цикл должен работать по-другому:
- увеличиваем текущую цифру, если текущая цифра меньше чем запас, выходим из цикла - иначе (если текущая цифра >= запаса) записываем вместо нее ноль и продолжаем цикл. На следующем шаге цикл увеличит следующую цифру. Не надо делать это с помощью обращения к элементу [$key-1].
То есть, мы выходим из цикла только если текущая цифра меньше чем запас.
И еще одно улучшение. Чтобы не сортировать массив до и после цикла, можно вместо цикла foreach использовать цикл for с значениями от N - 1 до 0 (где N это количество элементов в массиве).
После этих доработок функция будет готова для использования в программе.
Функция mysqli_fetch_assoc может вернуть false, null или массив.
При ошибке на стороне БД фукнция вернет false. Надо проверять именно это условие (что вернулось false) и тогда выводить ошибку. А ты выдаешь ошибку даже если функция вернула null, хотя это значит, что данные в таблице не найдены. Это не ошибка базы данных, если например, логин введен неправильно.
Здесь плохо то, что весь код написан внутри одной функции. Лучше разделить код на несколько функций:
- одна функция генерирует следующую комбинацию (и ничем другим не занимается) - другая считает сумму купюр в комбинации
И наконец, отдельно можно написать код, который в цикле перебирает комбинации:
- сначала берем комбинацию из всех нулей - далее делаем цикл - если теущая комбинация дает нужную сумму, то решение найдено, выходим из цикла - иначе, берем следующую комбинацию (вызывая функцию nextCombination) - продолжаем цикл
После этой задачи, если ты ее сделаешь, я советую попросить у меня дополнительные задачи на массивы и рекурсию.
> проихсодит такая фигня что временный файл не удаляется,
Значит, скрипт падает между моментом, когда он создает файл и моментом, когда файл переименовывается. Возможно из-за ошибки в самом скрипте, возможно из-за превышения времени выполнения или ограничения на объем памяти или по каким-то другим причинам. Я не знаю, какие там ограничения на хостинге.
Смотри логи (на время, совпадающее со временем создания файла).
> почему это может быть что временный до переименования файл не удаляется и остаётся?
Такого не может быть. Проблема в падении твоего скрипта.
> потому что у них стоят права -600
Для удаления файла не надо иметь доступ к нему, надо иметь доступ на запись к директории, в которой он находится.
>>2003297 >возможно из-за превышения времени выполнения или ограничения на объем памяти Точно, скорее всего проблема в ограничении памяти, то сть на сайт заходит много человек и идёт превышение памяти от чего скрипт просто дропается, ошибки быть не может так как запись идёт в самом конце файла, логи к сожалению посмотреть не могу, хостинг не даёт, но скорее всего из-за перегруза оперативки, на деректории стоят права -755, но я всё равно не могу руками удалить эти временные файлы -600, только скриптом явно указав их имена
Анончики, вопрос от залетного нуба: понятное, что в дс и в рф джуну вкатиться сложно (почти невозможно), а есть ли у кого-то опыт или знания ситуации вката в Европе? Сам живу и работаю в Чехии, но на должности бизнес-аналитика (но сам из дс). Хотел бы вкатиться, вакансии вроде бы есть, но нет знакомых и пруфов, реально ли вкатиться. Не обязательно Чехия, просто ситуация в Гейропке
>>1998470 (OP) Пиздец, сел за одну легаси-часть проекта которая была написана на похапэ, раньше к ней не притрагивался, сразу же ахуел Там как-то эти сраные темплейты рендерятся пыхой через хуй-пизду, прямиком в темплейтах сидит жс (жкьюри) код, чтобы сделать элементарную операцию вроде захода посетителя на новую страницу проходит несколько php-запросов, которые высирают эти ебучие tpl... И вот это считалось считается нормой. Просто пиздец. Нахуя вы это делаете?
Здравствуйте, работяги. Я начинающий недо-ученик, в своей методичке дошёл до задания, цитирую: «с помощью двух циклов создайте двумерный массив такого типа: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]»
Прошу: покажите пожалуйста пример выполнения этой задачи, оформленный в виде правильного кода с правильным синтаксисом. Вся беда заключается в том, что по какой-то причине в методичке, по которой я учусь - не было разбора создания двумерного массива через цикл, а в интернете, что забавно - нет инфы по этой теме. В общем - у меня сейчас неиллюзорно начинает гореть срака. Редко обращаюсь за помощью, но сейчас она мне нужна.
Просто напишите с правильным синтаксисом решение этой задачи. Буду благодарен.
>>2003567 Просто открыл документацию и взял пример / Пример 4: многомерные массивы / $a = array(); $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z";
foreach ($a as $v1) { foreach ($v1 as $v2) { echo "$v2\n"; } }
>>2003601 Так, а зачем проверка на false если в data - null, значит проблема в бд или в логине, но я вроде не совсем аутист, в бд есть записи, и логин передается
>>1998470 (OP) вопрос тупой очень мда но я спрошу я ваще конкретный чайник пока в этой сфере и мне хотелось бы узнать как мне сделать так чтоб я мог дать тегу <img> например собственное имя и в CSS управлять условными <img1> и <img2> по отдельности надеюсб ясно изъяснил
>>2003801 >>2003841 Бля засирать код чужими костылями которые делают миллион бочек прежде чем выдать результат, да мой сервер загнётся пока проделает это 100000 раз чтобы их все разшифровать
> на деректории стоят права -755, Ну так если ты не владелец директории, то для тебя права будут 5, то есть r-x, без права на запись (и удаление файлов).
Непонятно, в чем претензия? Шаблоны использовать плохо? Использовать JS код в шаблонах плохо?
Ну в том же реакте, например, в одном файле пишут и JS-код и похожую на HTML разметку. А вместо одного удобного шаблона там куча мелких компонентов - сиди разбирайся.
>>2004108 >Бля засирать код чужими костылями Лучше засрать своими, от этого ничего не загнется. Ну вон юзай встроенную функцию. Вряд ли что-то шустрее найдешь
Ну и необязательно сразу все строчки разбирать. Разбей по чанкам, сохраняй промежуточный результаты. Мб очередь прикрутить, хорошо подходит под эту задачу
Я имел в виду, что мы можем сделать несколько функций, и основной код (либо вне функции, либо в отдельной функции), который их вызывает.
Сейчас у тебя функция nextCombination кроме своей основной задачи (получить следующую комбинацию) делает еще и проверку, подходит эта комбинация или нет. А надо бы сделать, чтобы она только генерировала следующую комбинацию, возвращала ее через return и больше ничего не делала.
Аналогично, вместо функции checkSum, которая и сумму считает, и проверяет, равна ли она требуемой, хорошо бы сделать функцию, которая только считает и возвращает сумму.
То есть, хорошо бы, чтобы каждая функция делала только что-то одно.
А затем написать основной код (либо вне функций, либо в еще одной функции), который и решает задачу, вызывая первые две функции.
-----
Также, после этой задачи советую попробовать решить такие задачи:
1) Дан массив, состоящий из чисел или строк, например: [1, 2, 3]. Сгенерируй и выведи все возможные перестановки значений этого массива. То есть, все возможные способы расставить эти числа или строки без повторов. Для массива выше будет 6 перестановок:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
Кстати, перестановки изучает наука комбинаторика.
2) Есть список названий программ. У программ есть зависимости от других программ. Например, чтобы установить программу A, надо сначала установить программы B и C. Список программ дан в массиве такого вида:
$programs = [ // A зависит от B и C 'A' => ['B', 'C'], // У B нет зависимостей 'B' => [], // С зависит от D 'C' => ['D'], 'D' => [] ]
Также, дано название программы, которую хочет установить пользователь:
$install = 'A';
Выведи, в каком порядке надо устанавливать программы. В данном примере мы должны сначала установить D, тогда мы сможем установить C, потом B, и только потом A.
Дополнительно: сделай обнаружение случаев, когда решить задачу невозможно. Например, если A зависит от B, а B зависит от A, то установить их не получится.
Если захочется погуглить, то это называется задача топологической сортировки.
>>2004121 Что вообще делать с пользовательским юзер-агентом? Какие-то тонкие настройки браузер специфик цссов? Для статистики я бы пихнул третьи метрик сервисы
Вот еще некоторые улучшения, которые можно сделать:
> for($N; $N>=0; $N--){ Здесь стоит либо написать в первом выражении for ($N = count....), либо ничего не писать: for ( ; $N >= 0...). Просто писать $N не имеет никакого смысла.
Также, переменные принято писать с маленькой буквы, потому $n, а не $N.
> } > else{ Правильно писать в одну строку как } else {
> $result = []; > array_push($result, $sum, $str); > return $result; это можно записать короче как return [$x, $y].
У тебя функция checkSum делает две вещи: считает сумму купюр и генерирует строчку для вывода. Но строчка для вывода нам нужна только, если мы нашли правильную комбинацию, в остальных случаях ее генерировать незачем. Можно сделать вместо checkSum 2 отдельных функции. И вызывать функцию генерации строки только когда мы нашли правильную комбинацию.
У тебя в Main используется рекурсия (вызов самой себя). Ее можно заменить на цикл for или while:
Пока (мы не дошли до конца) { проверить текущую комбинацию; взять следующую комбинацию; }
>Использовать JS код в шаблонах плохо Пиздец как плохо
>там куча мелких компонентов Компонент это атомарная единица, известно как он себя поведет, с темплейтами идет постоянный выеб мозга
>Ну в том же реакте, например, в одном файле пишут и JS-код и похожую на HTML разметку Там своя хуйня, ничего не скажу за реакт, я с ангуляром работал (в реакте особый язык JSX вроде или как-то так)
>>2004441 Вротпресс тоже долго учить. В гло академии в марте стрим был - там челик спросил у Артема Исламова - можно ли до начала лета успеть вротпресс освоить, если каждый день дрочиься не вылезая из компа. А Исламов сказал, что очко ставит, что нельзя вротпресс с марта до лета задрочить
>>2004276 >А вместо одного удобного шаблона Сваленная в кучу верстка, стили, жс на несколько тысяч строк - удобный шаблон? В таком шаблоне невозможно понять, где заканчивается один компонент и начинается другой. Можно с тем же успехом код не разбивать по файлам
Как думаете есть шанс вкатиться стажером с одним выполненным проектом? Я пилю CRUD с регистрацией/авторизацией используя MVC подход. Подключение к базе сделал при помощи PDO, сейчас пытаюсь вкурить ActiveRecord, чтобы и его еще внедрить. + планирую добавить пагинацию с AJAX.
Есть еще куча сверстанных оригинальных макетов, но врядли они в этом случае что-то значат.
>>2004276 >Использовать JS код в шаблонах плохо? >Ну в том же реакте, например, в одном файле пишут и JS-код и похожую на HTML разметку. А вместо одного удобного шаблона там куча мелких компонентов - сиди разбирайся. Ну ты ебанутый...
Блин, да что сделать с Симфони формами, чтобы я мог в ChoiceType добавить с помощью js какой-то кастомный <option>, и он у меня в результате не отсеялся и прошел валидацию? На стаковерфлоу нагуглил какие-то полтора наркоманских совета, которые на практике не работают. Не верю что в таком продуманном большом фреймворке могут быть настолько анальные ограничения.
>>2004480 MVC сейчас уже почти нигде не нужен, по крайней мере, где платят жирно, лучше осваивай DDD, событийную модель и бэкендовый бэкграунд. Шансов вкатится в нормальную контору будет поболе.
>>2005087 Неа, но в реальном мире у тебя V отваливается как минимум, а как дефолт ты начинаешь мыслить другими критериями и вопрос отделения контроллера от модели уже не встает.
Аноны, есть вот такая функция которая смотрит какая сортировка включена и передаёт гет в функцию strnatcmp, в один момент может быть только 1 из сортировок, или sort или rsort, чтобы не городить код с проверкой какая сортировка пришла я сделал их вывод через точку как на скрине, и у меня ВСТАЛ вопрос, а как можно сделать правильно без проверок? Пытался сделать типа $_GET['sort'] || $_GET['rsort']] но это не работает, как передать в $_GET 2 названия которые нужно проверять и чтобы он выводил то что из двух имеется? Или вариант который я сделал самый короткий?
Здравствуйте. От безысходности откликался на всё подряд, даже не читая вакансий. Ответили с компании в моей Мухосрани. Тащемта раньше интересовался программированием, но меня не хватало, есть ли сейчас смысл с помощью гугла решать эти задачи и идти на собеседование. Программирование - тема интересная, но времени на её изучение крайне мало. Смогу ли в процессе разобраться, параллельно изучая всё и вся, что связано с пхп
Аноны, есть один апи, он лежит на сайте по адресу site.ru/api/hui, я прописал в robots.txt запрет на индексацию раздела Disallow:/api, могут ли поисковые системы из-за этого перестать грузить этот апи? Просто я сохраняю в логи всех кто загружал апи чтобы отслеживать плохие запросы, а тут заметил что от туда просто пропали все боты яндекса и гугла, блокировку раздела /api в robots.txt я уже удалил, но уже 2 день ботов в логах так и нет, они могут грузить станицу но резать запрос на апи потому что он был запрещён в robots.txt? Или это ебучий хостер что-то делает что в логах не сохраняются запросы от ботов? Или после разблокировки раздела в robots нужно ещё подождать?
>>2005256 Найс подрыв) Интересно что же ты понимаешь под похапэ мидлом?) Он умеет что? У него опыт в крудошлепстве какой? Что кроме пыха умеет? Как у него с фронтом? Как с nosql? Как с очередями? как с кешированием? Как с написанием микросервисров? Мидл в конторе на одном конце дс = некомпетентное чмо для конторы на другом. И у каждой блядской конторы свои требования и свои понятия лол кто пхп мидл, а кто черт ебаный. И зп у так называемого мидла могут быть 30/60/100/150 к. Пиздуй смотреть ххашечку / гикжопы / хаброкарьеру
>>2005394 Я к чему вообще спросил, у меня знакомый один, он устроился на мясокомбинат, вообще нихуя не нужно было для этого, никаких знаний, корок. Зп 40-45. И также в моем мухосранске на хх висят объявы "пхп-разработчик", требования, на мой взгляд, там выше чем к джуну. Зарплата написана 45-60. Это что означает, те кто разместил эти объявы пидарасы которые хотят изъебнуться и найти за лоу прайс дурачков? Нахуй вообще нужно дрочиться и че-то изучать и практиковать годами, если ты можешь просто пойти хуярить быдлорабочим на производстве. Мое мнение, у чела с опытом в несколько лет на пыхе должна быть зп 75к в провинциальном городе.
>>2005422 >И также в моем мухосранске на хх висят объявы "пхп-разработчик", требования, на мой взгляд, там выше чем к джуну. Зарплата написана 45-60. К сожалению не самый плохой варик для мухосрани >те кто разместил эти объявы пидарасы которые хотят изъебнуться и найти за лоу прайс дурачков да, провинциальная разработка как она есть >Нахуй вообще нужно дрочиться и че-то изучать и практиковать годами, Перспективы и то, что жопа в теплом офисе/в квартире. Если человек немного способен в программирование, у него есть усердие, сила воли и интерес, то можно вполне себе зарабатывать нормальные деньги и даже на пхп и не надрывать жопу. >если ты можешь просто пойти хуярить быдлорабочим на производстве Ну, если для тебя в ойти больше гемороя, чем на быдлоработе, то думаю тогда лучше выбрать второе.
>>2005467 >Перспективы и то, что жопа в теплом офисе/в квартире. Если человек немного способен в программирование, у него есть усердие, сила воли и интерес, то можно вполне себе зарабатывать нормальные деньги и даже на пхп и не надрывать жопу.
>Ну, если для тебя в ойти больше гемороя, чем на быдлоработе, то думаю тогда лучше выбрать второе.
Для профессий с высоким порого вхождения должна быть на голову более высокая оплата, а не просто "офис, тепло, не надо махать киркой".
>>2005467 Два чая. В совсем уж мухосрани только развиваться собственными силами, потом релокейт/удаленка, хотя бы в крупный миллионник. Там уже можно найти +- адекватные конторы, готовые платить адекватную зп (100-150) именно за мидловый бэкенд на пыхе. Но, как анон выше писал - с одним знанием php и какой нибудь лары ты там нахуй не нужен, так что придется запотеть.
>>2005422 >Мое мнение, у чела с опытом в несколько лет на пыхе должна быть зп 75к в провинциальном городе. Рынку на твоё мнение глубоко поебать. Если в провинции пхп макаке платят 40к, значит на это соглашаются и этого хватает для жизни.
Хочешь норм зп - не работай на регионы. Благо есть удаленка.
В моем миллионнике есть несколько контор с приличными зп, но за ними стоят достаточно крупные неместные (дсы/запад) клиенты. На одну из таких работаю
>>2005513 >должна быть Во первых никто тебе ничего не должен кроме тебя самого >с высоким порого вхождения в пхп до безобразия низкий порог вхождения. даже в тот же голенг сложнее вкатиться, несмотря на то, что его позиционируют как язык для пупсиков. Поэтому зарплаты ниже в целом по вебу. если больше 60к получать на адекватной удаленке, живя в мухосрани, да еще и с гибким графиком, то считай хорошо устроился Сколько смотрел не войти професесии доступные большенству по своей мухосрани - зп средние 30к если не гос и не газпромы. А многие из этих вакансий адовые шо пизда. Так что твои претензии выглядят смешно
Блять аноны, подскажите, я уже изъебался нахуй с этого говна, есть вот такая проверка массива в цикле foreach ( $array as $key => $value )
if ( stristr( $array[$key]['title'], $_GET['search'] ) )
Условие проверяет есть ли то что написано в GET в значении в многомерном массиве, если я ввожу слово с большой буквы - то всё находит, но если с маленькой, то блять пиздец 0 совпадений, ну как нахуй так а? Я же использую stristr(), а она регистронезависимая, у меня уже мозг взрывает нахуй
Я уже и пытался привести всё в нижний регистр через mb_strtolower(), и удалить лишние символы с помощью trim(), и использовать stripos(), и preg_match(), нихуя, этот пидорас находит только те слова что совпадают с написанием в массиве, а если я меняю регистр одной из букв - то уже 0 совпадений нахуй, я блять уже горю нахуй что этому пидорасу от меня нужно, какого хуя, простоphp5.2
Аноны, много лет у нас в задачнике висит задача про Банкомат (есть банкомат, в нем есть ограниченное количество купюр нескольких номиналов, как выдать сумму K?). Но все это время я сам не знал оптимального решения, и предлагал решать ее полным перебором. То есть, берем все возможные комбинации всех банкнот, пока не получим нужную сумму.
Однако, если банкнот много, перебор будет очень долгим. Например, если у нас 1000 банкнот 4 видов, и надо выдать очень большую сумму, то придется перебирать 1000 x 1000 x 1000 x 1000 = 10004 = 1 триллион комбинаций. Даже на современном компьютере это долго. Как же тогда банкоматы справляются с проблемой?
Я даже думал, не поменять ли условия задачи, а то, может быть, я даю нерешаемую задачу людям. А в интернете находятся задачи про банкомат с неограниченным количеством купюр. Однако сегодня, я прочел, что такая задача сводится к задаче о рюкзаке и решаема за более быстрое время за счет динамического программирования.
Кажется, я нашел способ решить задачу быстрее. Например, в примере выше нам потребуется лишь 40002 = 16 миллионов шагов.
>>2006071 Если купюры конкретные, естественных номиналов, то задача конечно простая.
Это когда тебе надо работать с заранее неизвестными купюрами, например в 16, 17, 983 и 3751 рубль (заранее неизвестными), вот тогда уже сложно становится.
Я могу ошибаться, но простой "жадный" алгоритм работает только при таких наборах купюр, когда любую большую купюру можно заменить целым числом более мелких.
Например, 1000, 500, 100: 1000 = 2x500, 500 = 5x100, потому алгоритм работает.
Если же взять купюры 500, 200 и 100 то 500 нельзя набрать купюрами по 200 и алгоритм не сработает.
>>2006075 То есть весь этот пиздец потому что я ищу русское слово? То есть stristr не может правильно привести слово из массива в нижний регистр чтобы сравнить?
Выход это прописать mb_internal_encoding('utf-8') и использовать mb_stristr?
Кстати, наша задача про банкомат эквивалентна задаче про грабителя (вот видите, наши задачи полезны и в реальной жизни):
Грабитель проник в банк и нашел там N золотых слитков весом w1, w2 .. WN. В его рюкзак может поместиться не более K килограмм. Какие слитки он должен выбрать, чтобы унести как можно больше золота.
---
Если заменить "золотой слиток весом x" на "1 купюра номиналом X", то получается задача про банкомат.
>>2006110 Всё верно, но всё равно алгоритм элементарно "хардкодится".
Тебе надо только отдельно рассматривать случаи набора некоторых сумм.
Для варианта в 100, 200 и 500 рублей вполне подойдёт обычная жадная схема 500 = 500 600 = 500+100 (проще, чем 200+200+200) 700 = 500+200
Если бы была схема, где купюры 50, 300, 500 рублей, то чуть хитрее было бы, скажем 600 = 300+300, что лучше, чем 500+50+50 Но обычно можно придумать решение частное, прописав некоторые исключения.
Когда рандомные номиналы, вот тогда уже надо ДП подключать.
К слову не уверен, что реальные банкоматы такую задачу умеют решать, скорее они могут тупо заменить большой номинал на мелкие. Скорее всего реальный банкомат просто скажет, что выдать сумму не может. Хотя на самом деле может.
В любом случае под конкретные купюры задача сильно упрощается, даже с перебором, перебор будет проще.
>>2006121 >Если заменить "золотой слиток весом x" на "1 купюра номиналом X", то получается задача про банкомат. Очевидно нет. Банкомат должен конкретную сумму выдать, а грабитель должен взять сумму не больше K. Но можно чуть меньше.
>>2006075 Пиздец анон спасибо, а то я уже с ума чуть не сошёл нахуй, не до конца тогда понимаю почему с большой буквы он всё таки находил, типа потому что при приведении строк в 1 битовые буквы в нижнем регистре они тупо просто совпадали я так понимаю, или даже потому что большая и маленькая буква имеют разные биты, точно
Нет, жадный алгоритм тут не сработает. Посмотри внимательно на ситуацию в >>2006112 . Там нет 100-рублевых купюр и жадный алгоритм не сможет выдать 600 рублей.
Грабитель пытается взять как можно больше (но не более K). Мы можем запустить алгоритм грабителя, а в конце просто посмотреть, сколько он набрал. Если это число меньше, чем требуемая сумма K, то выдать ее невозможно (иначе бы грабитель смог её собрать). Если набранное количество золота равно требуемой сумме K, то возможно.
Аноны поднимаю вопрос, как перечислять то что может прилететь в гете в 1 строку, чтобы не писать условие для проверки наличия каждого, объясняю, мне может прилететь 1 из 5 видов гета, мне надо записать его в переменную, как это можно сократить? Просто типа
И типа тот который прилетит и запишется в переменную, а остальные просто дадут пустоту? Как правильно сделать? Этот способ работает, но мне кажется есть более правильный и такой же короткий
>>2006180 Я сижу в других тредах, где к программированию на PHP принято относиться поплёвывая свысока.
Посмотрел, что за задачка здесь обсуждается. Там конкретные купюры: есть банкомат, в нём фиксированный набор купюр в 100, 500, 1000, 5000 рублей. Нужно проверить, можно ли выдать нужную сумму, и если можно, то выдать её наименьшим количеством купюр.
Это, всё-таки, другая задача, чем задача о сборке рюкзака. И в данном частном случае сильно более простая, потому что любую купюру старшего номинала можно выдать купюрами меньших номиналов. Нет даже истории о купюрах в 200 и 500 рублей. Тут ДП даже и не нужно.
На сервере должны храниться все маки когда либо подключенных устройств. Как заранее загрузить с файла в оперативку до этого полученные маки, чтобы с ними сравнивать и не плодить копии, один раз. Это же бред для каждого подключения грузить файл с диска, а потом еще и если сохранять могут проблемы возникнуть при параллельном чтении/запси
>>2006305 >Это же бред для каждого подключения грузить файл с диска, а потом еще и если сохранять могут проблемы возникнуть при параллельном чтении/запси Почитай книжки о технологиях баз данных. Как они эти вопросы решают. Потом сам напишешь свою собственную СУБД.
Почему бы тебе просто не создать таблицу для маков в БД не спрашиваю. Видимо нельзя по ТЗ, иначе бы ты сам догадался.
Каким образом твой скрип узнает мак адрес подключённого устройства я тоже не спрашиваю. Хотя узнать нельзя, по tcp/ip вне сегмента локальной сети эта информация не высылается, на уровне JS получить мак адрес тоже нельзя.
>>2006382 > Почему бы тебе просто не создать таблицу для маков в БД не спрашиваю. Видимо нельзя по ТЗ, иначе бы ты сам догадался. Ну если средствами mysql это сделать быстрее и проще, то ок. Я думал на php такое быстрее написать. > Каким образом твой скрип узнает мак адрес подключённого устройства я тоже не спрашиваю. Хотя узнать нельзя, по tcp/ip вне сегмента локальной сети эта информация не высылается, на уровне JS получить мак адрес тоже нельзя. Клиент не через браузер подключается. Собственная c++ прога, которая мак узнает
>>2006496 На серваке пхп 5 версии, не вариант, кстати вот такой вариант тоже работает if ($_GET['a'].$_GET['b'].$_GET['c'].$_GET['d'].$_GET['e']) как только одно из значений есть то условие срабатывает, но всё равно хочется что-то более правильное и без циклов
Привет, анонасы, хелпание, помогите разобраться. При устройстве на мидла нужно иметь какие-то свои проекты? Вот проработал джуном годик, чувствуешь, что можешь на мидла, но нет никаких своих проектов или это уже не нужно? Нужно было только при устройстве на джуна, чтобы хоть как-то показать свои умения?
>>2007076 Привет, анонас. На мой взгляд не нужно. При найме людей там где я работал никогда не было обязательно, если что-то есть на гитхабе, то хорошо что можно посмотреть стиль, как человек пишет, нет, да и хуй с ним, так пообщаемся. У меня своих проектов вообще никогда не было.
>>2007076 >чувствуешь, что можешь на мидла Связанный список напишешь? Сложность алгоритма посредством математической индукции сможешь доказать? Нет == не миддл.
>>2007251 Ах, какбы я хотел, чтобы это так и работало. К сожалению сегодня средний мидл на бэке - это прост чувак который знает стек и просто умеет в ооп и смежную инфраструктуру. Ебал бы каждого за алгоритмы на собесах, если бы решал я.
ChoiceType - это не внешнее представление (селект). Это виджет, в котором есть выбор из набора разрешенных вариантов и другой передать нельзя. (хотя, конечно ты можешь создать свой виджет наследованием от него и там отменить это ограничение, но это будет неправильно).
То, что тебе нужно - это TextType - виджет, который принимает любой текст. Просто при выводе надо выводить его не в виде инпута, а в виде селекта. Для этого ты наследуешься от него (в серверной логике менять ничего не надо) и делаешь свой тип ComboboxType. Для него делаешь свой twig шаблон, в котором делаешь вывод селекта + возможность ввести произвольное значение с помощью скрипта.
Так ты получишь виджет, который можно потом добавить в любую форму.
Может быть, ты просто не разобрался как следует? По идее ты можешь создавать любые кастомные виджеты, а также менять представление для любых встроенных виджетов. Формы Симфони очень кастомизируемы.
>>2007570 На сколько я помню у меня всегда были трудности сделать динамическое поведение. В этих шаблонах макросы пишешь, как этот блок спрятать, как тот блок после редиректа показать. То бля блоки жаваскриптом прячешь, то шаблонах условия прописываешь. И все это еще в контроллер просачивается, разные флаги, чтобы управлять поведением формы. Все время дебажишь какая фигня из формы прилетела в листенеры. Коллекции колекций в коллекциях. Сами формы отвечают за все. За валидацию, за рендеринг шаблонов, за заполнение из запроса модели со всеми связями. По разумному там что-то совсем простое можно сделать.
Убежал в разделение на фронтенд и api и восстановил свое душевное равновесие.
Сейчас будет паста аля флорентина. Незнаю, нахуя я это вам пишу, но видимо просто не с кем поделиться, кроме родителей просто, а я поднакидался. Вообщем может хотя бы мотивирует вкатунов. Собственно стори. Года три назад я дропнул универ по юриспруденции на четвертом курсе, потом после года нихуянеделания, работал слесарем на стройке, вместе со знакомыми парнями. Мы неплохо подучали (40-60), вцелом было весело, даже очень, но мы очень уебывались и иногда это было опасно. Например я распахал себе живот болгаркой, хорошо хотябы неглубоко и все обошлось просто швами. Как то раз, когда произошел очедной зимной застой, а у таких как мы это случается каждую зиму почти, когда работы почти нет, я начал думать как бы подзаработать, ну или просто найти работку без грязи и опасностей, я начал швыряться в вакансиях, нашел какую то помойную контору которой нужен был ученик-верстала за 20к, прошел html-акадению, повестал всякую хуйню несколько дней и пошел на собес. Контора была - просто лютый пиздец из мемасов, делала сайтики для бомжей на заказ за копейки, ну вообщем типикал мухосранская вебстудия. Вообщем как то отпиздился на собесе, благо бэкграунд минимальный даже был. Меня взяли, я начал работать верстать какие то бложики, меню для пиццерий и прочее говно. Быстро понял, что я на ебаном дне, а скоро лето и опять появится работка с норм зп и я уйду. Я почти сразу начал читать и осваивать всякое в it, искать куда податься, где платят и тд. Учил жс, пых и джаву понемножку, начинал вливаться и осознавать что и зачем в вебе. Подвернулось пару проектов со знакомств и авито(лол) на маленькие сайтики. Тут я начал примерять пых уже в проде, мне зашло, я начал понимать, что мне готовы платить. Началь копать этот ваш мир, фрэймворки, вот это все. Потом отправил резюме в пяток компаний в своем городе - два отклика, два тестовых. Одно было - аля напишите фэйсбук на ларе и я заленился, другое - написать пагинатор с фильтрацией на чистом php7.2 - я вроде справился. Взяли на работу в первую более менее норм контору. И вот тут я понял, что попал куда нужно. Топовый офис, плюшки, зп в 50к (уже здорово очень казалось). Вокруг были разрабы, даже не всегда с большим опытом, но с горящими глазами и желанием пилить что то крутое и современное, реально добрый и дружный молодой коллектив. Я очень долго привыкал, не мог поверить, что так бывает, после своей прошлой вебстудии, синдром самозванца во все поля прост. Потом понял, что я такой не один, были люди из разных сфер и с разным опытом - стоматолог, бывший манагер, девочка-препод из педа. Было тяжко немного, иногда ночами таски закрывал, но мне начало нравится все это. Окружение, общение, сам процесс работы - я втянулся. За годик я вырос до +- мидла, освоил всякое, что было в конторе и вслед за другим парнем, который позвал с собой, ушел в другую контору, уже уверенный в своих навыках. Там уже были микросервисы, симфони, нормальное кодревью и оче крепкий воркфлоу. Я бысто понял, что раньше я творил просто лютую хуйню, здесь я обучился нормальному чистому коду, архитектуре и всякому нужному в скоупе бэкенда (особенно по работе с бд и контейнерами). Вообщем в этой конторе я жил полтора гола и мне оче нравилось, дали зп, сначал в 70, потом доросла джо 120 чистыми, вообщем каеф. Параллельно работе я учил го и спринг все это время, даже по мелочи писал сервисы на го для конторы, но в релиз ничего не попало, к сожалению. И вот я понял, что уже могу больше и начал искать варианты, рассылать резюмехи, завел linkedin, кстати гитхаб даже сейчас пустой, лол. Начали писать хрюши, предлагать всякое, я прошел пару техсобесов на удаленку даже. И в начале апреля, тоже после недельного почти собеса, мне прилетел оффер из здоровой конторы в моей мухосрани с зп 200 и топ условиями. Чистый бэк - симфони, немного ноды, никакого девопса и плюс входной бонус в размере зп.
Собственно чому я это пишу, естевственно я согласился, и уже неделю вливаюсь в их процессы, пока на удаленке. Но в пятницу как раз мне пришли мои вступительные 200к и я второй день в некой прострации, не могу поверить, что у меня правда все получилось и я получается справился и я сам себе сделал себе профессию и жизнь. Купил винища за 3к, заказал жратвы из топ - рестика и сижу сейчас пишу это вам, хз зачем даже.
Главное, хочу сказать спасибо опу, чьи уроки мне очень помогли вкатываться в пых. Я желаю тебе всего самого хорошего, чел - ты красавчик, спасибо за твои уроки, они делают чью то жизнь лучше.
Сейчас будет паста аля флорентина. Незнаю, нахуя я это вам пишу, но видимо просто не с кем поделиться, кроме родителей просто, а я поднакидался. Вообщем может хотя бы мотивирует вкатунов. Собственно стори. Года три назад я дропнул универ по юриспруденции на четвертом курсе, потом после года нихуянеделания, работал слесарем на стройке, вместе со знакомыми парнями. Мы неплохо подучали (40-60), вцелом было весело, даже очень, но мы очень уебывались и иногда это было опасно. Например я распахал себе живот болгаркой, хорошо хотябы неглубоко и все обошлось просто швами. Как то раз, когда произошел очедной зимной застой, а у таких как мы это случается каждую зиму почти, когда работы почти нет, я начал думать как бы подзаработать, ну или просто найти работку без грязи и опасностей, я начал швыряться в вакансиях, нашел какую то помойную контору которой нужен был ученик-верстала за 20к, прошел html-акадению, повестал всякую хуйню несколько дней и пошел на собес. Контора была - просто лютый пиздец из мемасов, делала сайтики для бомжей на заказ за копейки, ну вообщем типикал мухосранская вебстудия. Вообщем как то отпиздился на собесе, благо бэкграунд минимальный даже был. Меня взяли, я начал работать верстать какие то бложики, меню для пиццерий и прочее говно. Быстро понял, что я на ебаном дне, а скоро лето и опять появится работка с норм зп и я уйду. Я почти сразу начал читать и осваивать всякое в it, искать куда податься, где платят и тд. Учил жс, пых и джаву понемножку, начинал вливаться и осознавать что и зачем в вебе. Подвернулось пару проектов со знакомств и авито(лол) на маленькие сайтики. Тут я начал примерять пых уже в проде, мне зашло, я начал понимать, что мне готовы платить. Началь копать этот ваш мир, фрэймворки, вот это все. Потом отправил резюме в пяток компаний в своем городе - два отклика, два тестовых. Одно было - аля напишите фэйсбук на ларе и я заленился, другое - написать пагинатор с фильтрацией на чистом php7.2 - я вроде справился. Взяли на работу в первую более менее норм контору. И вот тут я понял, что попал куда нужно. Топовый офис, плюшки, зп в 50к (уже здорово очень казалось). Вокруг были разрабы, даже не всегда с большим опытом, но с горящими глазами и желанием пилить что то крутое и современное, реально добрый и дружный молодой коллектив. Я очень долго привыкал, не мог поверить, что так бывает, после своей прошлой вебстудии, синдром самозванца во все поля прост. Потом понял, что я такой не один, были люди из разных сфер и с разным опытом - стоматолог, бывший манагер, девочка-препод из педа. Было тяжко немного, иногда ночами таски закрывал, но мне начало нравится все это. Окружение, общение, сам процесс работы - я втянулся. За годик я вырос до +- мидла, освоил всякое, что было в конторе и вслед за другим парнем, который позвал с собой, ушел в другую контору, уже уверенный в своих навыках. Там уже были микросервисы, симфони, нормальное кодревью и оче крепкий воркфлоу. Я бысто понял, что раньше я творил просто лютую хуйню, здесь я обучился нормальному чистому коду, архитектуре и всякому нужному в скоупе бэкенда (особенно по работе с бд и контейнерами). Вообщем в этой конторе я жил полтора гола и мне оче нравилось, дали зп, сначал в 70, потом доросла джо 120 чистыми, вообщем каеф. Параллельно работе я учил го и спринг все это время, даже по мелочи писал сервисы на го для конторы, но в релиз ничего не попало, к сожалению. И вот я понял, что уже могу больше и начал искать варианты, рассылать резюмехи, завел linkedin, кстати гитхаб даже сейчас пустой, лол. Начали писать хрюши, предлагать всякое, я прошел пару техсобесов на удаленку даже. И в начале апреля, тоже после недельного почти собеса, мне прилетел оффер из здоровой конторы в моей мухосрани с зп 200 и топ условиями. Чистый бэк - симфони, немного ноды, никакого девопса и плюс входной бонус в размере зп.
Собственно чому я это пишу, естевственно я согласился, и уже неделю вливаюсь в их процессы, пока на удаленке. Но в пятницу как раз мне пришли мои вступительные 200к и я второй день в некой прострации, не могу поверить, что у меня правда все получилось и я получается справился и я сам себе сделал себе профессию и жизнь. Купил винища за 3к, заказал жратвы из топ - рестика и сижу сейчас пишу это вам, хз зачем даже.
Главное, хочу сказать спасибо опу, чьи уроки мне очень помогли вкатываться в пых. Я желаю тебе всего самого хорошего, чел - ты красавчик, спасибо за твои уроки, они делают чью то жизнь лучше.
>>2007638 Поздравляю, аноний. Правда зп твоя все еще в два раза меньше, чем у посудомойщицы в любой нормальной стране, но по нашим меркам ты почти как сын депутата > Там уже были микросервисы, симфони, нормальное кодревью и оче крепкий воркфлоу. Я бысто понял, что раньше я творил просто лютую хуйню, здесь я обучился нормальному чистому коду, архитектуре и всякому нужному в скоупе бэкенда (особенно по работе с бд и контейнерами) Эх, сколько уже времени пытаюсь миновать твои первые два этапа и сразу вкатиться сюда. А вакух то нет)
Аноны, вопрос немного не в тему, я тот анон что юзерагенты собирает, заметил переходы с info.ertelecom.ru, может кто знает что это? Провайдер перед посещением сайта показывает свою заглушку? Есть такое у кого?
За сколько минимум по времени можно выучить достаточно, чтобы откликаться на вакансии джуна? За 3 месяца реально задрочить php, ларку и уже идти искать работу?
>>2009853 Самый быстрый вкат, который я видел - 7 месяцев. Весьма одаренный малый был. За три месяца с нуля - яхз какая компания на лару возьмет такого джуна.
> echo $cipher = strtr($text, $code) Здесь $cipher = можно было не писать, а писать сразу echo strtr(..). А так верно.
> На словах ты Лев Толстой
> $wordArr[0][array_rand($wordArr[0]) Тут короче было написать $words1 вместо $wordArr[0]. А если ты создал массив $wordArr с вариантами слов, то можно было и цикл по нему добавить. Единственное, в этом случае надо будет в массив добавить слова вроде "Я" и переносы строк.
> Маяковский попытка Здесь то же самое. Раз ты создал массив $words, можно было сделать и цикл по нему, чтобы не писать эти $words[0], $words[1] и так далее.
> Палиндром Здесь вместо переменной $d можно просто писать $i + 1. Также, если мы обнаружили различие в буквах, то можно выйти из цикла, а не продолжать сравнение.
> [А,В,Е,К,М,Н,О,Р,С,Т,У,Х] В символьных классах буквы не надо разделять запятой, надо писать просто [АВЕКМН....]. А то твоя регулярка принимает и буквы, и символ запятой.
> Телефоны В общем-то верно, но вместо \\W лучше было бы явно перечислить конкретные символы: пробелы, скобки, минус. А то \\W принимает и запятые, и двоеточия, и еще кучу других символов.
> Телефоны с исправлениями То же замечание, что и в предыдущей задаче, в остальном верно.
>>2009853 За 3 месяца можно многое успеть, особенно если ты в месяц занимаешься этим 300+ часов (10 часов в день уделяешь работе). Как вот этот чел - https://www.youtube.com/watch?v=uGrBHohIgQY&ab_channel=WilliamLin - он каждый день вставал, мылся и садился решать задачи, с перерывом на обед. Если спросишь про меня, то я смотрю на вакансии и что они требуют в основных навыках, пока я это не знаю - не пойду, ибо не примут. Соответственно смотри по своим предпочтениям обязательно, ибо если неинтересно то зачем тебе тратить на это время, ведь потом это будет казуальным мучением. А еще - если ты куда то торопишься, забей. Твои ресурсы тебе же не позволят ничего быстро сделать, ну к примеру адаптировать новые знания, тебе нужно отдыхать, мозг это тоже орган и он должен отдыхать, закреплять нейронные связи (Или как то так я не нейробиолог). Надеюсь помог, просто сталкивался с этой проблемой времени когда изучал свой первый язык программирования, если что еще спрашивай может я что-то знаю полезное для тебя.
>>2010050 >>2010059 Спасибо ОПчик! После регулярок я уже пикрил, буду повторять. Я вот еще решил: https://ideone.com/PfG2bB - Дураки человеки https://ideone.com/LoKWGR - Гацисты (Пока без исправлений) Почту и гацистов доделаю после того как пройду PCRE в мануале, а еще нужно попрактиковать функции с массивами с строками.
>>2010057 А может ты? Списком перечисли, что успел сделать, что предстоит сделать, что в прогрессе и примерное время потраченное на сделанное и в прогрессе
>>2010060 >За 3 месяца можно многое успеть, особенно если ты в месяц занимаешься этим 300+ часов (10 часов в день уделяешь работе). Такими темпами только в гроб/дурку. Лайтовый вариант вката часов 20-30 в неделю. Хардкорный 40-50. Дальше идут адовые переработки и выгорание
>>2010075 Я в пример взял вот этого чела - https://www.youtube.com/watch?v=DPxnJn3W2Es&ab_channel=AnasNuurAli - Вдохновляет. Честно я так не могу, сидеть и решать задачи весь день. Один раз попробовал написать в TIS-100 одну задачу где нужно было угадывать последовательность цифр, типа если 3 раза прошло одно и то же число то посылаешь TRUE. И я выгорел на неделю после этого, не стоило того. >>2010083 Почему ты так боишься показать на чем ты остановился? В этом нет ничего постыдного, все мы дауны, просто мало кто это признает (А зря).
>>2010083 Сам запинался и запинаюсь на многих вещах в разработке. Только если в начале это были проблемы уровня 10 строк кода, то сейчас проблемы помасштабнее вроде "как уложиться в срок", "какую архитектуру тут использовать", "как обуздать этот ебучий легаси", "что из готового функционала взять, а что лучше с нуля написать"
>>2010085 >Почему ты так боишься показать на чем ты остановился? В этом нет ничего постыдного, все мы дауны, просто мало кто это признает (А зря). Не люблю хамов, мне неприятно с тобой разговаривать.
Есть подход, когда PHP-код не помещается в докер-образ, а просто из образа монтируется папка с ним. То есть, в докер-образе будет PHP с расширениями, а PHP-кода в нем нету.
То есть, в Dockerfile ты пишешь только команды установки PHP и нужных расширений, и команду монтирования папки с кодом.
>>1998470 (OP) Привет, ребята. За сколько по времени примерно учится PHP, если уже знаешь JS (фронт и совсем чуть-чуть ноду)? Здесь есть вкатуны из JS?
>>2010191 Если ты основательно выучил JS (и особенно TS), шаришь в алгоритмах и структурах данных, знаком с паттернами проектирования, то ты в принципе ты уже знаешь PHP. Ознакомься с бэкендом, поковыряй фреймворки и уже получишь представление об этом всем. JS в том виде, в котором он существует и требуется сейчас гораздо сложнее PHP.
>>2010390 >Если ты основательно выучил JS (и особенно TS), шаришь в алгоритмах и структурах данных, знаком с паттернами проектирования, то ты в принципе ты уже знаешь PHP Если б так было, он бы уже работал мидлом. По ощущениям - вкатун, который написал тудушку на жсе и возомнил себя кодером
>>2004314 >1) Дан массив, состоящий из чисел или строк, например: [1, 2, 3]. Сгенерируй и выведи все возможные перестановки значений этого массива. То есть, все возможные способы расставить эти числа или строки без повторов. Для массива выше будет 6 перестановок:
Че-то тяжко, осилил (если вообще осилил) только на 3 элемента:
>>2011746 Заходишь в офис, выбираешь самого слабого с виду мидла и атакуешь его. Если не уверен в себе, то можно напасть со спины, но это не приветствуется
>>2007076 Если чувствуешь, что можешь на мидла, у тебя и зарплата ужэе должна быть мидлорвая очевидно. Проекты - это неплохо, особенно если в них есть что нибудь примечательное для конторы, но в результате все покажет собес+испытательный. И да, год опыта на мидла - это в 99% случаев маняфантазии.
У этой задачи есть еще второй, более сложный вариант:
---
Есть массив из N разных чисел (например: [1, 2, 3, 4]), из которых можно генерировать перестановки. Мы можем сравнить, какая из перестановок больше или меньше, таким образом: сравниваем первые цифры, если они равны, сравниваем следующие и так далее, пока не найдем отличающиеся (это называется лексикографический порядок - порядок, который используется в словарях). Например, 3124 < 3142, так как первые 2 цифры у них совпадают, а третья отличается.
Допустим, мы сгенерировали все возможные перестановки и записали их в список по возрастанию.
Вам дается определенная перестановка, найдите следующую за ней, не строя этот список. Например, вам дана перестановка 1342, функция должна вернуть перестановку 1423 (так как 1423 > 1342 и между ними нет других перестановок).
---
Соответственно, есть два способа решения: простое, которое только генерирует список перестановок, и сложное, которое по перестановке находит следующую за ней (используя его, мы можем сгенерировать полный список). Начнем с простого.
Простое решение можно написать, используя рекурсию (когда функция вызывает саму себя). Пусть у нас есть функция getCombinations. На вход она получает массив элементов, на выходе возвращает массив всех возможных перестановок из этих элементов.
Если эта функция получила на вход один элемент [x], то она может сгенерировать и вернуть единственную перестановку: [х]
Если же эта функция получила на вход несколько элементов: [x, y, z], то происходит следующее:
- берем за основу какой-то элемент, например x, и "вынимаем" его из массива, остается [y, z] - вызываем функцию getCombinations с этим массивом и получаем все возможные перестановки (например: yz и zy) - приписываем в их начало "вынутый" элемент x, получаем xyz, xzy.
Мы выполняем эти действия для каждого элемента в массиве. То есть, сначала получаем все перестановки, начинающиеся с x, потом с y, потом c z. Так мы получим все возможные перестановки.
То есть наша функция выбирает какой-то один элемент из массива, и вызывает сама себя, но с массивом меньшего размера. Мы сводим задачу "построить перестановки из 3 элементов" к задаче "построить перестановки из 2 элементов" и далее к задаче "построить перестановки из 1 элемента".
Если все понятно, попробуй написать код, если нет, то уточняй.
Теперь мы можем перейти к более сложной задаче: как, имея перестановку, получить следующую за ней в словарном порядке?
Чтобы это понять, мне пришлось выписать несколько примеров перестановок и внимательно их изучить. Рассмотрим пары соседних перестановок, я запишу их вертикально для удобства сравнения:
12345 12354
12354 12435
13542 14235
15243 15324
25431 31245
Если сложно рассматривать примеры из 5 цифр, ты можешь выписать в список по возрастанию все перестановки из 4 цифр - их немного.
Что общего мы видим в этих примерах? Во всех (кроме последнего примера) цифры можно разделить на 2 части: левую часть, которая не меняется, и правая, которая меняется:
123|45 123|54
15|243 15|324
В последнем примере мы поставим черту перед числом, так как там поменялись все цифры:
|25431 |31245
Попробуй подумать над такими вопросами:
- по какому принципу определяется, где поставить черту? Например, где будет черта в комбинации 31542? (подсказка: попробуй сравнивать цифры, идя справа налево) - после того, как мы поставили черту, по какому принципу меняется цифра справа от черты? - по какому принципу ставятся цифры справа от черты, кроме первой?
Это наверно сложно, но ты попробуй подумать, а если что, попроси подсказку.
сап анчоусы, кто нибудь что-то знает про московску. галеру postuf ? ссылку на хх сами найдете у всех разрабов вакансии с вилкой 300-400к + всякие бонусы, на собесе говорят что будет работа в каких то своих проектах. вопросы на тех собесе были обычные мидловские. зазывают очень усердно и настойчиво. из требований которые я выяснил на собесе: не пить не курить,отсутствие татуировок, не носить длинную бороду, не носить длинные волосы. сам про контору накопал что занимается типо white hat хакингом, но типо не на заказ, а делает контент на основе этого статьи на хабре, тик токи, видосы в инсте + то что там большая текучка и мало кто долго прорабатывает т.е. не больше года-полтора. из за чего становится непонятно откуда у них бабки чтобы платить разрабам такие бабосы. аноны, вы что нибудь знаете о ней, стоит ли туда соваться ?
>>2012927 Собесился с ними. Там какие-то поехавшие черти сидят. Удаленку нельзя. Сидишь в офисе под трекером и тотальной толерастией. Т.е. коллегами будут различного рода муслимы.
Можно ли иммитировать юзера на php?
Аноним29/04/21 Чтв 18:21:11№2012970353
Я хочу, чтобы мой скрипт переходил на сайт, а сайт думал что это пользователь. Можно ли это как-то реализовать на PHP?
>>2012978 >Удаленку нельзя. Точнее удаленка только на время пандемии, потом в офис.
>что еще можешь рассказать Да ничего. Общался только с их эйчаром. Сказал ему, что не пойду дальше на тех собес ибо ебал в рот работать с бабахами и под трекером.
Анон, помоги с докером. В девопс треде тишина. Допустим, я клонирую репу с каким-нибудь проектом. На компе пхп не установлен, то есть мне нужно все зависимости установить компосером в контейнере и скопировать vendor на хост, чтоб не ругался шторм. composer install в докерфайле отрабатывает без ошибок, но вендор на хосте не появляется. Но если запустить composer install из контейнера вручную через docker exec, то все срабатывает. Вот мои конфиги:
>>2013217 Помню, ебался с этим кейсом. Суть в том, что на момент сборки образа вольюмы не монтируются в хост или монтируются, но исчезают, не суть. Т.е. композер зависимости ставит, но ты их на хосте не увидишь. Тут варианта 2: 1. Намертво зашивать вендор в докер образ 2. Ставить зависимости внешним инструментом после конца сборки, например мейком как я и сделал
Обычно при использовании Докера внутрь контейнера устанавливают только исполняемые файлы, то есть только PHP или только PHP + Composer. А папку проекта монтируют (она не копируется внутрь контейнера, а просто видна из него). Соответственно, Докер используется просто как "обертка" над PHP или Composer, чтобы спрятать их внутри контейнера (этакие костыли для линукса, в котором трудно сделать портабельные приложения).
Судя по коду, ты при вызове Докера должен явно примонтировать свою папку проекта с помощью опции --mount. Эта опция "прокинет" папку с хоста внутрь контейнера. Посмотри на опцию volumes в docker-compose. А если не указать опцию --mount, то композер ставит файлы внутрь образа контейнера.
Эта опция передается, если ты запускаешь не docker, а docker-compose. Наверно, предполагается что ты должен использовать его, а не вручную запускать контейнеры. И тогда папка подмонтируется и композер поставит пакеты куда надо.
Этот докерфайл вообще, по моему, кривой. Например, зачем там COPY, который копирует файл composer.json в то же самое место? Зачем там вписана команда composer install? Как тогда там делать composer update и другие команды? Разве не логичнее сделать два образа, один для php-fpm, а другой для композера? Как просматривать логи php-fpm и php? Умный анон, объясни.
Зачем там нужен nginx, если можно просто использовать dev-сервер в PHP? И при этом логи будут идти в консоли, а не неизвестно где. И почему нет базы данных?
И кстати, умный анон, раз ты тут, поясни, зачем Докер на каждую строчку Dockerfile создает новый образ, а не пишет все в один образ? И почему люди пишут кучу команд через &&, а не пишут RUN несколько раз? Разве это удобно?
Ну и поганая же вещь этот Докер. Еще и требует запускать огромный потенциально бажный демон из-под рута. И жрет кучу места под огромные образы. И память жрет. Лучше руками поставить нужные версии PHP. Или сделать простую контейнерную систему без огромного демона и миллиона опций.
----
Кстати, я почитал справку по Докеру, и там советуют использовать вместо монтирования какие-то "volumes". В чем плюсы, я плохо понял, такое ощущение, что у них только минусы:
- данные volumes хранятся где-то в /var/lib, а не в папке проекта и не синхронизируются с папкой проекта
То есть, для PHP кода volumes не подходят, это скорее для хранения данных какой-нибудь mysql, хотя опять же непонятно, почему бы не использовать для этого папку проекта? Может быть, тут есть кто-то, кто разбирается в этом дьявольском отродье и получше сможет объяснить.
И кстати, умный анон, раз ты тут, поясни, зачем Докер на каждую строчку Dockerfile создает новый образ, а не пишет все в один образ? И почему люди пишут кучу команд через &&, а не пишут RUN несколько раз? Разве это удобно?
- RUN как раз создает каждый раз новый слой. Сделано это на тот случай, если в Dockerfile если команды, которые могут работать по условиям, ну и всякое такое.
Кстати, я почитал справку по Докеру, и там советуют использовать вместо монтирования какие-то "volumes". В чем плюсы, я плохо понял, такое ощущение, что у них только минусы.
- можно пробросить папку с машины в контейнер простым телодвижением. Например берешь docker-compose, пишешь там volumes: - /var/www:/opt и на выходе получаешь в запущенном контейнере в папке /opt/ все файлы, которые хранятся на машине в папке /var/www
Зачем там нужен nginx, если можно просто использовать dev-сервер в PHP? И при этом логи будут идти в консоли, а не неизвестно где.
- версионирование окружения. nginx сам по себе, php сам по себе. и когда тебе внезапно захочется протестировать работу приложение на другой версии php - всего лишь пересобираешь php, а не весь огромный зоопарк
> Volumes are the preferred mechanism for persisting data > Volumes have several advantages over bind mounts
Зачем это, если ты просто хочешь развернуть php-проект в dev-среде?
> - версионирование окружения. nginx сам по себе, php сам по себе. и когда тебе внезапно захочется протестировать работу приложение на другой версии php - всего лишь пересобираешь php, а не весь огромный зоопарк
Я имел в виду, что можно обойтись без nginx и php-fpm. Просто запускать встроенный в PHP веб-сервер. Это ведь проще и удобнее. Почему для разработки все используют nginx и php-fpm, а не встроенный в PHP сервер?
Насчет RUN, по моему эти слои какое-то бессмысленное усложнение, можно было писать все в один образ и не париться, и тогда не пришлось бы писать команды через &&.
>>2013254 >Этот докерфайл вообще, по моему, кривой. Вполне вероятно. Я с докером работаю второй день
>Например, зачем там COPY, который копирует файл composer.json в то же самое место? Не в то же самое, а из корня проекта в WORKDIR (см. опцию context)
>Зачем там вписана команда composer install? Как тогда там делать composer update и другие команды? Через docker exec
>Зачем там нужен nginx, если можно просто использовать dev-сервер в PHP? И при этом логи будут идти в консоли, а не неизвестно где. И почему нет базы данных?
Логи и так видны в консоли, если запускать docker-compose up без опции -d. База данных мне пока не нужна. А к nginxу я привык
Короче, я уже заебался по самое не могу. Всегда ненавидел колупание конфигов
>>2013217 Убрал composer install из докерфайла и пока сделал установку зависимостей командой docker exec -it $(docker ps -aqf "name=php") /bin/bash -c "composer install"
>>2013838 Наверно, если показать, с каким кодом я работаю, тут большая часть новичков отвалится. Кому интересно колупать километры легаси 5+ летней выдержки
>>2013876 У меня на работе есть проект на симфони, в директории веб (которая в новых версиях симфы называется паблик) которого живет отдельная ебанина из второй половины нулевых. Вот там просто пиздец из месива пхп, жопаскрипа, верстки и sql
Пробовал через сервисы типа code to img. В одном он обрезал код пополам, в другом выдал картинку на 20мб. Пастбин боюсь, что индексироваться будет и мне потом в тык дадут
>>2014115 >Как в таком коде вообще ориентируешься? Буквально голову ломаю. После рабочего дня уже ничего не хочется кроме как спать. Сильно помогает xdebug. Так же не брезгую читать исходники фреймворка
>>2014109 Увидел хтмл теги и дальше не смотрел. Но на первый взгляд ничего сложного, просто очень громоздко Yiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
Микросервисы не упрощают код, это миф. Вот допустим, для работы бизнеса нужно 1 000 000 строк кода. Ты можешь поместить их в монолит, можешь поместить в монолит и разбить на модули по 100 000 строк, можешь сделать 10 микросервисов по 100 000 строк. В любом случае это будет миллион строк, и в случае с микросервисами даже больше, так как добавляются расходы на взаимодействие.
Зачем же используют микросервисы? На мой взгляд, тут есть 2 случая: когда они приносят пользу и когда не приносят.
Возьмем, например, Яндекс. У них куча приложений, и бывает такое, что нескольким приложениям нужен одинаковый функционал. Например, и картам, и такси, и лавке нужно уметь строить маршруты по городу. Логично, что можно сделать сервис "построитель маршрутов" и использовать его из нескольких приложений. Это правильное применение микросервисов.
Или возьмем Вконтакте. У них такие нагрузки, что обычные решения не справляются. Потому они пишут свои хранилища на Си: отдельное хранилище для списков друзей, отдельное для сообщений, отдельное для новостей и тд. Это тоже пример правильного применения микросервисов.
Бывает спорный случай, на мой взгляд, ближе к неправильному. Например, когда людей много, их разбивают на команды и каждая пишет свой сервис. На мой взгляд, они бы могли вместо этого писать модули одного большого монолита и это было бы лучше. Удобнее изучать код, удобнее делать поиск по коду.
А бывают совсем неправильные применения. Например, некоторые утверждают, что микросервисы позволяют использовать разные фреймворки или даже языки программирования. Но это как раз глупость: получается, теперь разработчик не может заглянуть в соседний микросервис и поправить что-то в нем, так как не знает используемого там фреймворка и языка. Также, если команда сервиса A написала полезную библиотеку, команда сервиса B не сможет использовать ее, так как они пишут на другом языке, и будет изобретать свою библиотеку.
Мне кажется, эти аргументы - что можно писать на разных языках - это плохие аргументы. Выгоднее, когда в компании используется монокультура и код пишется единообразно.
Или бывают примеры, когда проект небольшой (меньше миллиона строк) и команда небольшая, а зачем-то делают микросервисы. Только зря тратят время, на мой взгляд. И вдобавок приходится использовать поганый Докер, и все это жрет и диски и память.
Если тут есть умный анон, который может описать реальные плюсы от использования микросервисов, было бы интересно почитать.
>>2014471 В микросервисе мало кода, поэтому о нем легко рассуждать и соответственно добавлять фичи. По крайней мере программистам, у девопсов может быть иное мнение. У микросервисов меньшее зацепление кода. Сервис можно выбростить и переписать с нуля, с монолитом такое не сделаешь. В монолит не пустишь джуна, в монолит даже сеньер будет въезжать долго. Соответственно текучка кадров очень болезненна, старые работники, что писали это монолит становятся незаменимыми.
>>2014471 Ты просто привык писать в одно рыло, поэтому хочешь во всем коде разбираться и править там где тебя не просят? Ну сиди в одной конторе по 10 лет разбирайся.
>>2014529 В плане разработки микросервис ничем не проще обычного модуля или библиотеки.
В микросервисе ты завязываешься на API, и вот хрен ты его изменишь. И в библиотеке ты точно так же завязываешься на API, а как там внутри переделано не важно.
Разница главная в продакшене, что намного легче поднимать что-то. Можно использовать разные платформы, разные языки программирования, разные конфигурации используемых библиотек и модулей и т.п.
>>2014471 >Мне кажется, эти аргументы - что можно писать на разных языках - это плохие аргументы. Выгоднее, когда в компании используется монокультура и код пишется единообразно. Тебе зря так кажется. Например что-то может быть относительно простым, но требовать большой производительности, и это пишут на каком-нибудь Go. А что-то требует сложной логики обработки данных, и это пишут на других языках, более удобных.
Ты можешь использовать сервисы, которые делают вообще не связанные с твоей компанией люди, что-то из открытого кода. Например сервисы авторизации.
Даже контейнеры с БД, MQ, кешами и другим это самые что ни на есть микросервисы.
>>2014543 Есть масса монолит проектов, в которых кодовая база в миллионы строк, где работают десятки-сотни человек.
Я хочу сказать, что микросервис в плане разработки ничем не отличается от просто модуля или библиотеки. Вот одна команда может делать какую-нибудь библиотеку, другие команды её пользуются.
У библиотеки есть интерфейс, функции, которые что-то делают. Это поведение задокумендировано и называется API.
Ты точно так же можешь выкинуть библиотеку и заменить её на другую. Главное, чтобы API был таким же.
Здесь работает принцип модульности, большие задачи надо разбивать на маленькие, максимально независимые друг от друга в плане разработки.
А микросервис это лишь технический нюанс реализации. Смысл в то, что так ты общаешься с задачей по сети.
Проблемы тоже общие, нехватка гибкости. Ты завязан на API, и если хочешь его как-то сильно изменить, например перенести часть функционала из одного модуля или микросервиса в другой, то у тебя будут большие проблемы.
И чем сильнее ты дробишь, тем чаще у тебя будут такие проблемы возникать.
Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. Я правильно понимаю что верстальщиком быть-это ахуеть как нужно стараться что бы кодить и рисовать страницы, а разработчику ПХП-только писать скрипты?
>>2014471 Микросервисы ради микросервисов -- просто религия и мода, очевидно же.
Зумеры и вкатывальщики не задумываясь тащат эту идеологию просто потому что им так сказали.
Можно хоть каждую функцию или класс вынести в отдельный сервис и воткнуть в сеть -- но зачем? Это гигантские накладные расходы.
Уже видел примеры, когда компании не подумав выносили функции в сервисы, а потом в ужасе от расходов впиливали их обратно в монолит.
ИМХО, надо действовать от обратного: я, например, выпиливаю из PHP-монолита на Symfony только действительно тормозные куски и переписываю их на более быстром языке (в моём случае Java). Также пишу микросервисы на Java там, где PHP просто не предназначен (в моём случае, конвертация видео, обработка больших данных или некоторые системные процессы).
Такой подход решает проблемы и при этом не создаёт ненужной работы.
>>2014709 >Зумеры и вкатывальщики не задумываясь тащат эту идеологию просто потому что им так сказали. В последнее время стал натыкаться на статьи о том, что монолиты это заебись, а микросервисы говно.
> В микросервисе мало кода, поэтому о нем легко рассуждать и соответственно добавлять фичи.
Допустим, у нас есть монолит, в котором код разбит на модули - папки. В одной папке мало кода, потому о нем легко рассуждать. Чем это хуже?
> В монолит не пустишь джуна, в монолит даже сеньер будет въезжать долго.
Это либо какой-то плохой монолит, либо какой-то плохой сеньор. В той же Симфони все логично, вот контроллеры, вот сервисы, вот сущности. Во что там въезжать? Тебе не требуется изучать весь код, а только ту часть, с которой ты сейчас работаешь.
В монолите все написано в едином стиле. А в микросервисах каждый микросервис может быть написан по-своему.
Да, ты не можешь прочесть весь код монолита, если в нем миллион строк. Но если у тебя 20 микросервисов по 50 000 строк, ты ведь тоже их всех не сможешь прочесть. Да даже один микросервис не прочтешь.
Ты так говоришь, как будто это плохо. Естественно, я хочу во всем разбираться. Чтобы при наличии бага я мог его качественно исправить, и сделать любую доработку.
А что хорошего, когда я не могу разбираться во всем? Надо просить другую команду, а они скажут "извини, у нас в этом 2-недельном спринте времени нет, может быть в следующий спринт добавим задачу, но не обещаем". И исправление простого бага затягивается минимум на 2 недели, а то и дольше, если окажется, что проблема не у них.
Или еще хуже: микросервис, в котором баг, никто не поддерживает вообще (так как у нас 20 микросервисов и всего 5 человек). Что делать?
Я здесь веду речь о более-менее обычных веб-приложениях (например: для автоматизации бизнеса). Я понимаю, что в условном Яндексе действительно во всем, что они понаписали, одному человеку не разобраться (тем более что там используются сложные алгоритмы). Но большинство компаний это не яндексы и у них ничего сложного нет.
> Можно использовать разные платформы, разные языки программирования, разные конфигурации используемых библиотек и модулей и т.п.
Так это же недостаток. Так у тебя получится 20 микросервисов, каждый на своем языке и фреймворке, написанный в своем стиле. А в команде всего 5 человек. Как ты думаешь, удобно им будет их поддерживать?
То ли дело монолит: все написано в едином стиле, на одном языке. Никаких API, все можно поменять. Захотел - перменял любую функцию (только не забудь найти места, где она вызывается).
Это же сплошные плюсы у монолита.
> Разница главная в продакшене, что намного легче поднимать что-то
Админу ничига не легче. Ему удобнее управлять одним сервисом, чем разбираться в куче микросервисов.
Вообще, у меня ощущение, что компании среднего размера и их разработчики просто вообразили себе что они Яндекс и Гугл и им нужны кластеры, балансировка и прочие ужасы. В итоге они просто тратят большое количество денег, которые бы могли сэкономить при использовании монолита.
> Даже контейнеры с БД, MQ, кешами и другим это самые что ни на есть микросервисы.
Нет. В концепции микросервисов у каждого микросервиса свое хранилище данных. То есть БД это не микросервис, а часть какого-то микросервиса.
> Например что-то может быть относительно простым, но требовать большой производительности, и это пишут на каком-нибудь Go.
Это правда для приложений вроде Вконтакте. Там очень высокая нагрузка и делаются сервисы на Си для отдельных задач вроде хранения списков друзей и сообщений (и кстати, они используют бинарные протоколы, а не HTTP с JSON). Но для обычных бизнес-приложений, мне кажется, это неактуально. Там могут быть высокие нагрузки, но на все подряд, а не на отдельные места.
Offline first
Аноним01/05/21 Суб 17:54:44№2015297425
Привет, ОП! Мне интересно как делать offline-first приложения. Допустим, я хочу сделать список рецептов, который будет работать с телефона даже при отсутствии интернета. Правильно понимаю, что мне нужно на фронте использовать какую-то базу данных, чтобы при отсутствии интернета сохранять новые рецепты и не потерять их при выходе с сайта? Ещё нужно отслеживать offline/online статус и при появлении интернета выгружать все статьи из очереди? Так как это приложение рецептов, то там будет много картинок - предлагаю все кешировать через service worker. Ещё нужно сделать так, чтобы сайт предлагать "установить" его как приложения. Там вроде бы нужно в какой-то JSON конфиг что-то прописать.
>>2014742 до тех пор пока проект не разрастется и там черт ногу сломает, рефакторить код невозможно, не знаешь че он за собой потянет, менять что то страшно, там все по 10 раз переиспользуется и накидываешь на эту кучу с лопаты сверху
>>2014948 >Чем это хуже? то что этот кусок кода может переиспользоватся где то там/что то на него ссыдается/результаты где то еще используются и неизвестно что он за собой может потянуть, ты еще не видел некоторого говна.
>>2014742 Главная проблема монолитов - зацепление помноженное на огромную кодовую базу. Разбираться и пытаться распутать этот клубок крайне сложно. Не так страшны эти вещи по отдельности: Сильное зацепление, но кодовая база маленькая - можно без сверхусилий разобраться и поправить код. Один из не очень хороших вариантов микросервисов Слабое зацепление, но большая кодовая база - так же нет особой сложности для внесения изменений
>>2014948 >Да, ты не можешь прочесть весь код монолита, если в нем миллион строк. Но если у тебя 20 микросервисов по 50 000 строк, ты ведь тоже их всех не сможешь прочесть. Да даже один микросервис не прочтешь. Так их и не надо читать все эти строки кода. Ни один разраб не сможет осилить такую огромную кодовую базу, будь он хоть трижды гением. Микросервисы при удачном распиле можно отдать разным командам и играть в корпоративный пинг понг
>Надо просить другую команду, а они скажут "извини, у нас в этом 2-недельном спринте времени нет, может быть в следующий спринт добавим задачу, но не обещаем" Не такой уж плохой исход. Да, крупные системы неповоротливы, но что поделать. Тут хотя бы ясно, какая команда за что отвечает
>Но большинство компаний это не яндексы и у них ничего сложного нет Помимо яндексов достаточно компаний, где крупная кодовая база, которой не хватает какого-то разбиения
Да, у приложения должна быть своя локальная БД. Самый сложный тут момент - это синхронизация локальной БД с сервером. Тут есть такие проблемы:
- мы (скорее всего) не можем выкачать всю серверную БД из-за большого объема, значит локальная БД всегда будет не полная и это не должно вызывать ошибок. Самый простой вариант - скачивать локально те рецепты, которые смотрит пользователь - если мы будем бесконтрольно скачивать все подряд, мы можем превысить какие-нибудь лимиты (они жесткие на моб. устройствах). Как решение, можно удалять старые записи, которые пользователь дольше всего не смотрел. - хорошо, если записи на сервере иммутабельны (можно добавлять новые, но нельзя редактировать или удалять старые). Тогда все просто. Если же это не так, надо продумывать, как обнаруживать и загружать изменения. Один из вариантов: при заходе на страницу показывать ее из локальной БД и одновременно посылать запрос на проверку актуальности данных на сервер. При этом можно ограничить частоту этих запросов (если мы проверяли минуту назад, то второй раз можно не проверять). - если пользователь может как-то взаимодействовать со страницей: ставить лайки, писать комменты, то придется делать еще синхронизацию с клиента на сервер. То есть, добавлять лайк в локальную базу и в очередь на выгрузку на сервер. А при отображении страниц мы объединяем информацию о лайках с сервера с локальной. - еще сложнее, если два пользователя могут редактировать один и тот же контент, будучи в оффлайне. Тогда на сервер придет 2 набора изменений, и какой он должен принять? Чьи-то правки могут потеряться. Это напоминает конфликты в гите и сплошная боль при реализации.
Я могу ошибаться, но готового рецепта тут нет и каждый изобретает свою систему синхронизации.
> Ещё нужно отслеживать offline/online статус и при появлении интернета выгружать все статьи из очереди?
А зачем? Если пользователь зашел в рецепт A, потом в B, потом в C и потом появился интернет, то достаточно скачать C. A и B уже пользователю неинтересны.
> предлагаю все кешировать через service worker По моему, так это дублирование баз данных. У тебя есть Бд в приложении, и будет еще одна в сервис воркере? А зачем?
Ну и я давно когда-то смотрел описание кеширования через воркеры и мне это показалось очень уродливым концептом.
> Ещё нужно сделать так, чтобы сайт предлагать "установить" его как приложения.
Так, мне кажется, в микросервисах это "зацепление" будет, только в гораздо более тяжелой форме.
Вот у нас есть в монолите функция. Она используется в 20 местах. Мы хотим ее поменять. Да, тяжко, но реально пройти эти 20 мест, поменять, вручную оттестировать (так как тестами это естественно никто не покрыл).
А вот у нас есть метод API в микросервисе. И мы хотим что-то в нем поменять. И это такой объем изменений, что лучше сразу оставить эту идею и оставить кривое, плохо спроектированное твоим предшественником (который и предложил внедрить микросервисы и успешно свалил) API. Разве я не прав?
> Микросервисы при удачном распиле можно отдать разным командам
Это если у тебя неограниченное число разработчиков. А если у тебя 5 человек и 20 микросервисов. И как они будут их всех поддерживать? Никак. А монолит абсолютно реально впятером потихонечку поддерживать и развивать.
То есть, получается, микросервисы требуют больше людей и больше денег. Они невыгодны бизнесу.
Отдельно меня поражают высказывания типа "можно выбросить и переписать заново". То есть ты серьезно предлагаешь бизнесу выбросить работу нескольких человек за месяц? Я бы лучше выбросил на мороз такого "предлагальщика".
Да, программа работает для массива из 4, 3 или 2 элементов. Но она не работает для массива из 5 элементов: она выдает лишь 40, а не 120 комбинаций.
Это из-за того, что ты не используешь рекурсию. Ты можешь в Main() вызывать не getCombinations, а саму же Main(). То есть, тебе пришел массив из 4 элементов, ты вынимаешь один элемент и вызываешь Main() уже с массивом из трех элементов. Только надо чуть доработать функцию Main(). А функция getCombinations тогда будет не нужна вообще.
И еще, я не очень понял принцип работы getCombinations, а именно это место:
Ты можешь объяснить, почему мы сортируем половину перестановок, а другую половину - не сортируем?
Вот тебе еще идеи по улучшению:
Вывод лучше делать через echo implode(), через пробел, в формате 1 2 3 4. Так читать будет легче.
Ты добавляешь $cutElement в конец массива, и из-за этого у тебя сначала идут все комбинации с 1 на конце, потом с 2 на конце и так далее. Но лучше бы добавлять $cutElement в начало массива.
Цикл foreach внутри getCombinations, как я понял, сдвигает массив (превращая [x, y, z] в [y, z, x]). Этот сдвиг можно было бы сделать через функции array_slice + array_unshift, получилось бы короче и понятнее. Или я что-то не учел?
>>2015689 >А вот у нас есть метод API в микросервисе. И мы хотим что-то в нем поменять. И это такой объем изменений, что лучше сразу оставить эту идею и оставить кривое, плохо спроектированное твоим предшественником (который и предложил внедрить микросервисы и успешно свалил) API. Разве я не прав? Ты рассматриваешь будто один человек будет отвечать за пачку микросервисов. Это как раз плохой пример микросервиса, когда накладные расходы растут, а профита нет.
Ок, допустим мы хотим поменять метод микросервиса. Если апи(контракт) не меняется, то никаких проблем (аналогично в монолите). Меняется апи(контракт) - выпускаем новую версию апи. Кому нужно - переключатся на новое апи. В случае микросервисов эти изменения выглядят более прозрачно. В монолитах не видел удачного примера версионности апи модулей
>А если у тебя 5 человек и 20 микросервисов Тут ясен пень, что микросервисы ради микросервисов. С другой стороны можно каждому отдать по 4 штуки
>То есть, получается, микросервисы требуют больше людей и больше денег. Они невыгодны бизнесу. Это плата за масштаб проекта. Монолитные легаси системы в какой-то момент становится невозможно поддерживать. Фикс 1 бага порождает 3 новых. О вводе фич можно забыть.
>можно выбросить и переписать заново Это хреновый подход в 99% случаев, т.к. системы во время разработки накапливают в себе знания, которых больше нигде нет. >То есть ты серьезно предлагаешь бизнесу выбросить работу нескольких человек за месяц? А это иногда приходится делать, если фича оказалась ненужна или принесла много накладных расходов. На этой неделе занимался выпилом части функционала.
>Монолит - вот подход здорового человека До тех пор, пока этот монолит способна поддерживать команда из 5-7 разрабов. Дальше только разделять на сервисы.
>>2015815 >До тех пор, пока этот монолит способна поддерживать команда из 5-7 разрабов. Дальше только разделять на сервисы. Всё-таки не совсем. Разделение не обязательно по сервисам, разделение может идти на разработчиков модулей-библиотек, каких-то частей проекта. Совершенно нормальная история.
Есть огромная масса проектов, не веб, на которых работают многие сотни людей. Там разделение на команды разработчиков, каждая команда делает свою какую-то часть.
Есть универсальный подход в любом сложном проектировании, даже не только в программировании и ИТ, в промышленности та же история. Модульная разработка, каждая команда делает свою какую-то часть по спецификациям интерфейсов. Условно ты занимаешься разработкой тормозов для автомобилей, у тебя есть спецификации, какие параметры у тормозов должны быть, интерфейс управления и датчики, ты эти параметры согласуешь с другими. API выкладываешь ты, но разработку согласуешь с другими.
https://ideone.com/BKPwZB Как верно оформить регулярку, чтобы шел учет того, что знак препинания может повторяться? И обрезалось уже после последнего. И какая-то шляпа с кодировкой, вроде бы поставил всё как надо, но слетает в makeFirstLetterUppercase первый символ, если кириллица, а значит лажанул. Хелпуйте(
>>2015849 парень ты странный какой то, тебе уже несколько человек сказало, здоровые легаси монолиты тяжело поддерживать, ты чинишь одну функцию, ломается где то еще другая и начинается замкнутый круг ты чинишь баги, порождая новые баги.
>>2015663 Теперь вижу. Серега, помимо мантр про low coupling и high cohesion, обязательно бы задвинул телегу о том, что не нужно использовать ОРМ для чтения.
Вообще, в монолите тоже можно организовать версионность: сделать функции func1, func2, func3 итд. Но это, по моему, плохая идея, когда есть две функции, делающие одно и то же. Так можно делать только временно, на период пока ты меняешь старую функцию на новую.
> Меняется апи(контракт) - выпускаем новую версию апи. Кому нужно - переключатся на новое апи.
Это значит, что будут одновременно две версии АПИ: старая и новая. В то время как в монолите мы поменяли все места, где вызывается функция и старая версия удаляется. То есть, в монолите делать такие обновления проще и удобнее. В микросервисах делать изменения API тяжело и неудобно.
> Монолитные легаси системы в какой-то момент становится невозможно поддерживать. Фикс 1 бага порождает 3 новых.
Ну это какое-то совсем плохое легаси. И, кстати, непонятно, почему при замене на микросервисы должен получиться более качественный код. Если их будут писать такие же разработчики, будет такая же лапша.
В том же монолите можно сделать разделение на модули. И будет как с микросервисами, но без кучи присущих им недостатков.
Вот еще преимущество монолита: у него единая БД. Если тебе надо сделать какой-то сложный запрос руками, ты просто пишешь и все работает. А в микросервисах все данные раскиданы по нескольким БД и выборку получить не удастся.
Мне кажется, микросервисы используют по таким причинам:
- хочется поиграться в большую компанию и посоздавать кластеры (в убыток работодателю) - слабым программистам легче писать новый код с нуля, чем разобраться в существующем. Писать новый код всегда легче, можно косячить как угодно, на раннем этапе это проблем не вызывает. Потому они и проталкивают эту идею "распилить" монолит. Потому что не осилили.
Есть примеры, где сервисы (не микросервисы, а большие сервисы) нужны - это компании вроде Яндекс (выносить сервисы, которыми могут пользоваться несколько приложений) или Вконтакте (из-за высокой нагрузки приходится писать микросервисы на Си).
> Одно из преимуществ микросервисной архитектуры в том, что части приложения можно разрабатывать и обновлять независимо — например, обновить только один блок, а остальные не менять. В монолите же каждый раз требуется пересборка с решениями возникающих конфликтов, ведь приложение, можно сказать, образует единое целое.
Врут же. Какая еще пересборка? На PHP ничего не требуется пересобирать.
> Adidas — перенесли весь интернет-магазин на Kubernetes за полгода. Время загрузки сайта сократилось вдвое. Обновления стали развертывать 3-4 раза в день вместо раза в 4-6 недель.
Ну и чушь. Во-первых, интернет-магазину не нужны микросервисы, во-вторых, с чего бы время загрузки улучшилось? Микросервисы медленнее монолита из-за накладных расходов на передачу данных. Ну и непонятно, почему они раньше тратили по 6 недель на развертывание. У них там, наверно, ручное тестирование было. А потом просто решили не тестировать. От этого и снизилась задержка. Потому что ручное тестирование не позволяет делать 3-4 развертывания в день.
> Tinder. Из-за большого объема трафика инженерная команда Tinder столкнулась с проблемами увеличения мощностей и стабильности работы. Kubernetes стал выходом из ситуации: на него перенесли 200 сервисов — это 48 000 работающих контейнеров.
Оверинжиниринг во всей красе. Как можно в простом приложении для знакомств сделать 200 сервисов? Они что, на каждый экран по микросервису делают?
>>2016321 Заебал уже своей философией. Можно нанять одного разработчика который сделает красиво, но трудно нанять десять таких. Проще когда Васе нужно знать всего пару апи, он даже будет способен и зам задачу в жире накатать по хотелкам заказчика. Сейчас текучка во всех проектах. Сервисы это данность на больших проектах
Как же меня затрахал этот ларавель блять... Особенно его DB-библиотека. Такой конченой хуйни в жизни не видел, оно состоит из костылей чуть менее, чем полностью.
Вот еще примерчик: ларавель ПРОСТ))0 взял и поменял таймзону на хуй знает какую при конвертации столбца времени в unix timestamp. То есть, умудрился похерить АБСОЛЮТНОЕ значение времени и высрать левый таймстамп. Разумеется, таймзона на сервере пхп, mysql и в конфиге ларавеля идентична.
А все из-за того, что этот высер в самом своем нутре НЕ ИСПОЛЬЗУЕТ таймстамп блять, а выполняет овердохуя переконвертаций строковых значений времени. Библиотека карборн - вообще высер умалишенного блять
>>2016321 Там статья не про микросервисную архитектуру, а про кубернетис и контейнеры.
Контернеры и кубернетес радикально упрощают возможности по развёртыванию сайтов и приложений, кубернетес радикально упрощает возможности по добавлению мощностей, частичному обновлению сервисов и т.п.
Без этого очень сложно что-то в работающем проекте изменить.
Может это все же ты накосячил, а? UNIX_TIMESTAMP это абсолютное время (в UTC), а вот \DateTime - это местное время + таймзона. И если у тебя \DateTime, например, хранит Московское время, то оно сконвертируется в UTC при преобразовании в UNIX_TIMESTAMP. И наоборот, при преобразовании TIMESTAMP в Datetime будет учтена текущая таймзона.
К примеру, твой таймстамп 1619011200 это:
- 21 апреля, 13:20 в UTC - 21 апреля, 16:20 по Москве
Мы еще не выяснили, в чем причина проблемы, а ты уже бежишь предъявлять претентзии к PHP. Возможно, PHP тут не причем, а также возможно что твой язык в 10 раз хуже, чем PHP.
>>2016311 >слабым программистам легче писать новый код с нуля, чем разобраться в существующем. Писать новый код всегда легче, можно косячить как угодно, на раннем этапе это проблем не вызывает. Потому они и проталкивают эту идею "распилить" монолит. Потому что не осилили. Еще не видел, чтобы кто-то так восхищался тем, что занимается легаси говном.
> ([^,])\\s(а|но) Здесь регулярка сработает на любое слово, начинающееся с "а" или "но". Также, выражение [^,] срабатывает на любой символ, включая пробел. То есть в этой ситуации регулярка вставит лишнюю запятую:
,(2 пробела)a
> Поиск опечаток
Здесь недостаток в том, что регулярка сработает на любое английское слово с буквами вроде a, o (даже если в нем нет русских букв вообще), а должна срабатывать только на слова из смеси русских и латинских букв.
> Поиск опечаток с исправлением
Здесь та же проблема, программа в английских словах начнет заменять латинские буквы на русские.
Думал взять Слим 4 для своего пета и охуел - они говно какое-то лютое делать начали. Взяли и размазали весь микрофрейм по всему гитхабу - на каждый пук изволь поставить библиотеку, а в результате постоянные проблемы с версиями. Как эталон ебанутости - на этот фреймворк появились свои фреймворки, которые они называют скелетами. Прикиньте только - фреймворки для фреймворка. Охуеть. Джва часа пытался собрать рабочее приложение, а в результате выяснилось, что мне ещё дописывать всё это дело самому нужно. ОП, в учебных материалах лучше убери Слим из советов, или огранич 3 версией которая ещё целая потому, что вкатывальщикам ебаться со всем этим не варик вообще. А я укатываюсь на Люмен.
>>2018709 Люмен тоже говно на самом деле, мне кажется что просто symfony/httpfoundation с Доктриной надо ставить, если нужно без комбайна обойтись. Еще может у Laminas API Tools ничего, но не пробовал.
>>2018726 Да понятно, что тоже говно. Мне почему Слим и нравился, что можно самому папочки накидать как удобно, прописать по своему вкусу где что, а у Люмен всё гвоздями прибито. Так и не понял зачем Слимовцы эту ересь начали творить - превращать микрофреймвор в, фактически, обычный маршрутизатор с пачкой внешних зависимостей, которые должен ставить конечный разработчик.
>>2018750 Чего тебе не хватило изкаропки то? это же микрофрэймворк для res/rec по сути. Они просто подогнали под psr по сути свои интерфейсы, как я понял.
Не могу настроить совместную работу докера, дебаггера и пхпшторма. Какого-то хера брейкпойнты работают только в фронт контроллере симфони. Поделись рабочим конфигом, анон
>>2020360 Шлюха ты дырявая, ебать тебя в рот хуесоса плешивого, пидораса сутулого, опущенца ебанутого. Данному багу миллион лет, один ты особенный солнечный ребенок не в состоянии пофиксить. Пиздец ты скудомыслящий. Как ты ебанько такое нерадивое харкач только нашло? Проблядь ты рождённая от спидозного пидора-транса папаши и зарыганной лошади. Хуета из под кота ты доморощенная.
>>2020380 Ты еще и глазницы долбишься, петух, или читать не умеешь. Я спрашивал, почему шторм закрывается, а не тормозит. Как ты ебанько такое нерадивое харкач только нашло?
>>2020783 Так же и отупеть можно. Потом вообще хер куда устроишься. Я так сидел пару лет и в хуй не дул, ненапряжно крудоебствовал сутками, пока не понял, что реально деградирую
>>2020794 Пытаюсь иногда петик попиливать на говне посвежее, чтобы если выгнали, было куда податься. С другой стороны этого несвежего говна столько, что без хлеба с икрой не останусь
>>2015743 >Ты можешь объяснить, почему мы сортируем половину перестановок, а другую половину - не сортируем?
Комбинации будут повторяться, если не сортировать.
>Это из-за того, что ты не используешь рекурсию. Ты можешь в Main() вызывать не getCombinations, а саму же Main(). То есть, тебе пришел массив из 4 элементов, ты вынимаешь один элемент и вызываешь Main() уже с массивом из трех элементов. Только надо чуть доработать функцию Main(). А функция getCombinations тогда будет не нужна вообще.
Не могу понять принцип работы, запутался окончательно с этим. Мой алгоритм со сдвигом вообще будет работать с более чем тремя элементами? Ведь при рекурсии он просто начнет повторять уже имеющиеся комбинации, или нет?
Есть кусок кода пик 1. Моя плюсовая прога получает пик 2. Можно ли избавиться от хуйни что вверху и оставить только строчку helloworld и тд. Или это обязательные данные, которые всегда будут присутствовать?
Я думаю, сложности из-за того, что я тебе дал непростую задачу. Рекурсию (когда функция вызывает сама себя) вообще довольно трудно представить в голове. Но некоторые задачи с ней решаются гораздо проще, чем без нее, потому желательно уметь ей пользоваться.
Тебе надо решать больше задач на алгоритмы, и тогда ты сможешь привыкнуть и к работе с массивами, и к рекурсии.
> Мой алгоритм со сдвигом вообще будет работать с более чем тремя элементами?
Не будет. Если у нас 3 элемента [x, y, z], то сдвигами мы получаем 3 комбинации: xyz, yzx, zxy. Затем за счет сортировки мы получаем из них еще 3 комбинации, всего 6. Тут все верно. Но если у нас 4 элемента, то сдвигами мы получаем 4 комбинации, с учетом сортировки получается всего 8 комбинаций. А должно быть 24 комбинации для 4 элементов. Поэтому твоя функция getCombinations работает корректно только с 3 или менее элементами.
Получение комбинаций через сдвиг не работает, если у нас больше 3 элементов.
> Ведь при рекурсии он просто начнет повторять уже имеющиеся комбинации, или нет?
Если использовать рекурсивный алгоритм (не на основе сдвига), то повторов быть не должно. Давай рассмотрим, как работает рекурсивный алгоритм при разном количестве элементов на входе. Вот общий принцип, по которому генерируются перестановки:
Допустим, нам дано 4 элемента [x, y, z, w]. На первое место в перестановке мы можем поставить любой из 4 элементов. Допустим, это x. Далее, на второе место мы можем поставить любой из 3 оставшихся элементов. Допустим, это y. На третье место мы можем поставить один из двух оставшихся элементов: z или w. Пусть это будет z. И на последнее место мы ставим тот элемент, который остался: w. Получилась перестановка xyzw. Выбирая другие элементы, мы получим другие перестановки.
А вот сам алгоритм, работающий по этому принципу:
Функция getCombinations(list): .... пусть дан массив элементов list .... если в list один элемент, то вернем единственную комбинацию из этого элемента .... создаем пустой список комбинаций result .... берем по очереди элементы list, выбранный элемент помещаем в переменную first: ........ вызываем getCombinations(), передавая ей список list с вырезанным элементом first. Эта функция вернет нам список возможных комбинаций. ........ к каждой из полученных комбинаций в начало приписываем first и добавляем в result .... конец цикла .... возвращаем result
Это весь алгоритм. Эта функция может сгенерировать все перестановки из любого числа символов.
Теперь рассмотрим, как будет работать этот алгоритм, если у нас дано 4 элемента: x, y, z, w
- функция вынет из массива x и вызовет себя, чтобы получить все комбинации из элементов y, z, w (их будет 6 штук: yzw, ywz, zyw, zwy, wyz, wzy). К ним в начало она припишет x. - затем функция вынет из массива y и вызовет себя со списком x, z, w (еще 6 штук) - затем вынет z и вызовет себя со списком x, y, w - затем вынет w и вызовет себя со списком x, y, z
Каждый раз мы передаем себе разные наборы букв и потому получаем разные комбинации. И также, каждый раз мы приписываем в начало комбинаций разную букву: первый раз x, второй раз y, в третий z, в четвертый w. Таким образом, все 24 комбинации будут разные.
Попробуй написать эту функцию в виде кода и можешь убедиться, что она будет работать корректно.
Псалм на приватном проекте просто упал. phpstan работает хорошо, но выдает кучу предупреждений (не всегда по делу), потому вызываю его только для измененных файлов.
> Исправил исправления, хочу спросить, а правилен ли этот подход с массивами регулярок и заменой? Или можно сделать получше?
Если массивы будут больше, то трудно сопоставить между собой регулярку и соответствующее выражение для замены (надо отсчитывать, под каким номером они идут). Лучше было сделать один массив вида [регулярка => замена], а из него уже получать отдельные массивы.
> а|но)\\s+ Здесь лучше использовать \\b, так как после "но" может идти еще одна запятая.
> ([а-яА-Я])([aceopx])([а-яА-Я]) Эта регулярка не сработает, если латинская буква идет первой или последней в слове. Также, ё не входит в диапазон а-я и её надо указывать отдельно.
> $word = strtr($word, $replace); Этим ты сохраняешь слово в переменную $word, но массив $text остается неизменным. $word это лишь копия слова из массива и ты меняешь копию, а не оригинал в массиве.
Обычно DTO используют для передачи данных из одного компонента в другой. И необходимости что-то менять в них нету.
Я, кстати, не особо люблю DTO, так как они добавляют преобразования. Сначала ты должен преобразовать данные в DTO, а потом это DTO в какую-нибудь модель. Добавляется лишний код для этих преобразований. Если можно без них обойтись, то наверно лучше обойтись.
> $text[0] Ошибка здесь. Ты берешь не первую букву, а первый байт строки, а одна буква может состоять из нескольких байт и в этом случае ты лишь откусываешь от нее кусочек. Надо использовать mb_substr. Урок: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
Насчет регулярки. Ты использовал утверждение: разрезать строку в том месте, перед которым идет знак препинания. Надо добавить второе условие: разрезать строку в месте, перед которым идет знак препинания и после которого нет знака препинания.
>>2021288 Перекатываться однозначно стоит. На РНР если только формы шлепать. Гостевые/форумы нахуй никому не нужны. А больше и не видно сферы применения. Шучу конечно. CRM и прочие корпоративные порталы всё ещё котируются. Интернет магазины ещё кому-то нужны.
>>2021946 Я сам не разраб вовсе, а сетевой инженер. Так как опыт большой работы в разных компаниях, то повидал я разного. Даже в повседневной работе на виртуалочках у нас крутятся проекты на java/c#. Понятно, что есть zabbix и всякие прочие вещи на php, но это не разрабатываемые с 0 проекты. Это уже поддерживаемые продукты. Взять, например, продукты атлассина jira/confluence — java. Корпоративные порталы битрикс+1с повсеместно, есть какие-то самописные вещи на РНР, но это редкость. Я не говорю, что работы для РНР нет, она есть, но её сфера, как по мне, не стоит потраченного времени. Ява и с# более универсальные, работы в люьой сфере много. Как то так.
>>2021976 # сразу, можешь влиться в ряды QA automation ( selenium webdriver). А там подтянишь скиллы и куда кривая выведет: разрабы, девопсы, мытьё туалетов. Самое главное работа в команде, если будешь постоянно: а вот я думаю, а вот я решил — твое я и твое мнение мало кому нужно. Вот коллективный разум и умение работать в коллективе это 50% успеха.
>>2022005 >Корпоративные порталы битрикс+1с повсеместно, есть какие-то самописные вещи на РНР, но это редкость. Выборка по пыхе маловата. Так-то полно всякого продуктового на ларе/симфе
Вы бы лучше проанализировали вакансии на hh. Java неплохой язык, но на нем просто может не быть вакансий в вашем городе. А на PHP доступно много вакансий, включая удаленку.
C# неплохой язык, но работа на нем может оказаться связанной с созданием кривых уродливых форм под Windows или придется работать с MS SQL и сервером под виндой.
>>2022075 Про шарпы люто, бешено удваиваю кстати. Поэтому, если конечно не фанат винды - лучше предпочесть джаву, раз уж ооп хочется и всего вот этого. Но там конечно тоже свое дерьмо - легко можно нарваться на мрачнейшее корпоративное легаси и утонуть в нем. Тут вопрос вкуса наверное, из какой бочки хлебать приятнее.
А про пых - вакансий море, да, но 90% - отбитый наглухо пиздец, где нахватаешься таких практик, что потом не отмоешься, да еще и зарплаты на таких мизерные. То же и к js относится вцелом.
Еще есть прекрасный рубио конечно, но он ксожалению сдувается и вакансии - сплошь легаси ебаное.
>>2021819 А не надо ручками дто создавать. В дто очень удобно описывать правила валидации модели, которая из него создается. Сплошные плюсы, код модели чище и она не может быть невалидна, так как создается из няшной валидной дтошки. И это только один пример
>>2022005 Насчёт нахуй никому не нужного мнения согласен. Ну я хз как поступить, не охота изначально обосраться. И минимизировать это, ну и нужно в любом случае куда-то вкатиться. Лютый пиздец...
>>2022237 Оптимально, чтобы быстро заработать на хлеб с водой - пых/js/пистон (пистон с натяжкой, на джанге мало работы сейчас), хотя и js на бэке сейчас положнее пыха обычно. Хочешь как тру бэкендер - любой популярный строгий язык (шарп, жава, го). Хочешь быть тру погромистом - раст/кресты, но учиться будешь года три, и то если не тупой.
>>2022171 Не ссы, обсираются все и везде. Боязнь обосраться тебя будет демотивировать всю жизнь. Подумай наоборот. Вот тебе пример: есть тулза с номером билда 1.х.х которую пилили 5-10 лет, а потом хуяк и выкатили билд 2.х.х и в чейнджлоге читаешь: произведён рефакторинг кода. Производительность тулзы увеличена на 50%. Понимаешь? Даже такие матёрые разрабы как Линус Торвальдс пиля своё ядро писали такой код, что потом переписывали десятки других разрабов.
Лично я не вижу проблем с вкатом если: имеешь нормальную алгоритмическую подготовку, дружишь с алгеброй/геометрией/физикой, знаешь хотя бы 1 язык выше среднего. Т.е. для тебя нет проблем в плане самой разработки. Читай код на гитхабе, смотри, что ближе тебе.
>>2022304 Нет. Сфера РНР продукты для веба. Он этим и ограничится. Не взирая на попытки сделать язык более общего назначения. И то всякие ноды и питоны уже существенно наступают на пятки. Даже нахуй никому не нужный раби со своим одним единственным фрэймворком ROR местами имеет заявить.
>>2022171 >Ну я хз как поступить, не охота изначально обосраться С таким будет тяжело в программировании. Сам тоже борюсь с этой херней. Никак не приучу себя сначала быстро выдавать едва работающий говнокод, а потом фиксить в узких местах. Пытаюсь заранее продумать, чтоб хорошо было. В итоге это сжирает кучу ресурсов у мозга, а кода как не было, так и не появилось.
>>2022524 >Но тебя туда не возьмут Это самое обидное. Пробовался пару раз на подобные ваки, на собесе завернули. Хз как набрать нужный бекграунд, если на текущей работе сплошное говнолегаси
>>2022521 Не сказал бы что это можно называть строго. Обычные правила читабельного кода. У меня и psalm и stan вместе лабают, отключена только ересь, вроде комментов в закрывающих конструкциях и phpdoc. И при этом говнокодить на коленке они не особо мешают (например писать какие нибудь разовые скрипты).
>>2023060 Нахуй ты родился? Все таки не зря похапешников долбоебами считают, если они даже не в состоянии определить основное назначение инструмента. И ты тому лишнее подтверждение. Возможность запилить дженерики и енамы в языке без дженериков и енамов, юнион типы (в старых версиях пхп), описание массивов - это про типы или про читаемость?
>>2023275 Могу предположить что из-за того, что приватный метод вызывается внутри базового класса и под капотом происходит какая-то херь с именами классов. Если поместить метод newSubclass в другой класс, то должен выбивать ошибку.
В целом очень странный кейс: создать потомка внутри родителя и вызывать от потомка метод родителя
помогите друзья программисты, учу ларавел и не получается справиться с одной проблемой, нужно в карусель вывести несколько штук, но они залазят друг на друга, пробовал делать это через for и не получается, как мне это сделать?
private методы доступны в пределах класса, где они объявлены, от открывающей скобки { до закрывающей }.
Например, такой код допустим:
class A { // field виден начиная отсюда
private $field;
public function f(A $other) { $x = $other->field; }
} // до сюда
Все корректно: обращение к field идет внутри класса A. При этом мы можем передать в f() вместо A его наследника B и все будет работать корректно.
Твой пример, конечно, очень странный. Странно, что ты создаешь объект потомка, но вызываешь на нем приватный метод предка. Обычно предок не знает о потомках. Но если рассматривать с точки зрения логики, ты обращаешься к приватному методу внутри класса, где он объявлен, так что все ок.
В этом примере >>2023294 все интереснее. Когда мы объявляем класс Foo, мы переопределяем (заменяем) метод testPublic и добавляем второй метод с именем testPrivate. Хотя метод называется так же, как и метод в Bar, это 2 разных метода, каждый виден только в пределах своего класса. Потому они никак не конфликтуют друг с другом. Но это 2 разных метода, хоть и с одинаковым именем.
> Почему подкласс может вызывать приватный метод базового класса?
Но разве подкласс вызывает метод callPrivate? Нет, место вызова находится в BaseClass. Он вызывает метод BaseClass#callPrivate у объекта класса SubClass.
>>2022524 А вот с этого места поподробнее. >где обмазываются DDD, CQRS и всякими сагами с евент сорсингом Это какие-то практики, использование которых делает тебя крутым вне зависимости от выбранного языка?
Я поддерживаю: натыкать на на каком-нибудь ларавеле "с нуля" приложение по гайдам с ютуба неизмеримо проще, чем поддерживать софт с многолетней историей. Соответственно, и платят меньше.
>>2023560 Я понимаю как работает доступ к private. Не понятно только почему подкласс может через -> обращаться к приватному свойству/методу базового класса. Даже если подкласс и в скобках { } базового, он, по моей логике, должен попытаться обратиться к своему свойству field.
>Функция getCombinations(list): >.... пусть дан массив элементов list >.... если в list один элемент, то вернем единственную >комбинацию из этого элемента >.... создаем пустой список комбинаций result >.... берем по очереди элементы list, выбранный элемент >помещаем в переменную first: >........ вызываем getCombinations(), передавая ей список list с >вырезанным элементом first. Эта функция вернет нам список >возможных комбинаций. >........ к каждой из полученных комбинаций в начало >приписываем first и добавляем в result >.... конец цикла >.... возвращаем result
Ничего не работает. Я посмотрел простой пример работы рекурсии в нахождении факториала, там более-менее понятно, а что происходит здесь, и почему мы вызываем функцию внутри цикла, которая затем возвращает все имеющиеся комбинации (каким образом?) - мне непонятно. Функция неполная и мне нужно ее как-то переделать или я не могу понять ее принцип?
>>2023629 >делает тебя крутым Как минимум расширяет кругозор
>вне зависимости от выбранного языка Да, но если есть выбор, то ебаться со всякими басами лучше на шарпе
А вообще проекты, на которых эти практики применяются, как правило намного интереснее и сложнее стандартного крудоебесия. И лучше оплачиваются. Уот такое мое мнение
> Не понятно только почему подкласс может через -> обращаться к приватному свойству/методу базового класса.
Код в подклассе не может обратиться к приватному методу родителя. Это может сделать только код в родителе.
В случае с private/protected неважно, какого класса объект перед нами: BaseClass или SubClass (который создан на основе BaseClass). Важно только место, где происходит обращение. Если это место находится внутри скобок { } класса BaseClass, то подразумевается обращение к приватному методу из класса BaseClass. Если бы обращение было внутри класса SubClass, то приватный метод или свойство искались бы в нем.
Допустим, $object это объект класса C, который унаследован от B, который унаследован от A. Когда PHP видит запись вида:
$object->method();
то он ищет method сначала в C, потом в B, потом в A. При этом, если метод приватный, то проверяется, что он виден из текущего класса. То есть, при поиске еще учитывается контекст - место (класс), из которого мы делаем обращение. Например, если эта строчка написана внутри класса B, то поиск идет в таком порядке:
- сначала ищется public/protected метод в C - если его нет в C, то ищется public/protected/private метод в B - если его нет в B, то ищется public/protected метод в A
Если бы эта строчка была написана в классе A или C, то поиск работал бы немного по-другому в отношении приватных методов.
В твоем примере, при вызове callPrivate поиск идет так:
- ищется public/protected метод callPrivate в SubClass. Там его нет. - ищется любой метод callPrivate в BaseClass
И поиск находит именно приватный метод в BaseClass.
Ты пишешь: "подкласс обращается". Но место, где происходит вызов callPrivate, находится в BaseClass, и это BaseClass обращается, а не подкласс. Строчка $sub->callPrivate() находится внутри BaseClass, а не внутри SubClass.
Хотя ты вызываешь $b->newSubclass(), но в реальности-то этот метод находится в BaseClass и именно из BaseClass он обращается к приватному методу.
Мне кажется, ты запутываешь людей. Вещи вроде CQRS сильно усложняют код и в простом проекте могут только ухудшить его (будет больше классов). Это не всегда хорошо. А ты подаешь это так, как будто код без CQRS априори плохой. Хотя по факту он проще и читабельнее.
Шины с событиями это вообще мрак. Код из-за событий становится менее понятным. Одно дело - ты вызываешь функцию x() и переходишь к ней в один клик в IDE. Другое дело - ты отправляешь событие в очередь и неизвестно, что с ним дальше произойдет. А если у тебя в системе 200 событий? А если у тебя 200 микросервисов к этой шине подсоединены? Разобраться в этом очень сложно.
И выглядит такая система, кстати, хлипко. Если я вызову функцию с неправильным именем, интерпретатор выдаст ошибку (в идеале, еще в тестах). Если же я отправлю событие с неправильным именем или отсутствием нужных параметром в очередь - все пройдет успешно. Тут конечно можно попробовать за счет ООП запретить создавать событие без нужных параметров, но все равно мрак.
Ты пишешь, как будто события это такая хорошая вещь, которая улучшает код. Но по факту это плохая вещь, к которой приходится прибегать, потому что по другому не работает.
Насчет DDD особо в нем не разбираюсь, прокомментировать не могу.
Мы решили, что функция возвращает список комбинаций. Одна комбинация - это массив: [1, 2, 3], список комбинаций - это массив массивов [[1, 2, 3], [3, 2, 1]], даже если там всего один элемент. Надо возвращать тут массив массивов.
> foreach($combination as $el){ > array_unshift($el, $first); Здесь ты добавляешь элемент в $el. Но $el это не комбинация из $combination, а копия этой комбинации. Ты меняешь копию в $el, а оригинал в $combination остается неизменным.
> $result[] = $combination; Здесь тоже ошибка. $result это список комбинаций: [k1, k2, k3] (где k1..3 - это одна комбинация в виде массива). $combination это тоже список комбинаций. Надо либо объединять эти списки, либо добавлять в result кобминации по одной, а не все сразу. Ты же вкладываешь список внутрь списка и из-за этого у тебя получился массив сложной формы.
Также, некоторые переменные названы неудачно, и это затрудняет чтение программы:
- $list лучше назвать $elements (да, я в алгоритме написал list, но это неудачное название) - $value тогда станет $element - $combination это не одна комбинация, а список потому надо добавить s в конце - а вот $el переименовать в $combination
Если все это исправить, программа должна заработать. Пиши, если еще есть какие-то вопросы.
Мы используем цикл, чтобы по очереди вынуть каждый элемент из списка. Если нам дан список x, y, z, w, то мы сначала вынимаем x, потом y, и так далее. Потому мы используем цикл, чтобы обойти все элементы по очереди.
Мы вызываем функцию (саму себя), чтобы получить список всех комбинаций из меньшего числа элементов. Если нам дали 4 элемента, то мы вынимаем один и вызываем функцию с 3 элементами. Если нам дали, например, 2 элемента, то мы вынимаем один и вызвываем функцию с одним элементом.
> которая затем возвращает все имеющиеся комбинации (каким образом?)
Попробуй рассмотреть, как функция работает, если ей дать 1 элемент. Затем, как она работает с 2 элементами. Затем с тремя. И так далее.
Если нам дали один элемент, то мы возвращаем единственную комбинацию из него.
Далее, допустим, у нас 2 элемента x и y. Функция работает так:
- вынимаем элемент x, вызываем саму себя с элементом y. Добавляем x в начало, получаем комбинацию xy - вынимаем элемент y, вызываем саму себя с элементом x. Получаем комбинацию yx.
Для 2 элементов, как видно, все комбинации найдены. Рассмотрим ситуацию с 3 элементами x, y, z.
- вынимаем элемент x, остаются y, z. Вызываем себя, и получаем 2 комбинации из элементов y, z: yz и zy. Приписываем к ним в начало x, получаем xyz и xzy. - вынимаем элемент y и делаем те же шаги. Получим комбинации yxz и yzx. - вынимаем элемент z и получаем комбинации zxy и zyx
Для трех элементов функция смогла найти все 6 комбинаций.
Дальше можешь рассмотреть, как функция будет работать с 4 элементами.
>>2024099 А где я утверждал, что эти практики применимы к любому проекту? Если там обычное формошлепство, то естественно там не нужны саги и проч.
>как будто код без CQRS априори плохой. Хотя по факту он проще и читабельнее А еще проще хуярить всю логику прямо в экшенах контроллеров. По факту оверхед от cqrs и тактического ддд совсем небольшой и он совсем не ухудшает читабельность, а наоборот облегчает в том числе навигацию по проекту и разграничение фич. Пара лишних классов ни на что не влияет
>Шины с событиями это вообще мрак. Код из-за событий становится менее понятным. Одно дело - ты вызываешь функцию x() и переходишь к ней в один клик в IDE. Другое дело - ты отправляешь событие в очередь и неизвестно, что с ним дальше произойдет. А если у тебя в системе 200 событий? А если у тебя 200 микросервисов к этой шине подсоединены? Разобраться в этом очень сложно. А кто сказал, что будет легко? За рост гибкости нужно платить сложностью. Залогом успешной разработки таких систем является грамотное проектирование
>Если же я отправлю событие с неправильным именем или отсутствием нужных параметром в очередь - все пройдет успешно. Ну это вообще смешно. У нормальных людей обычно лежит класс с константами, в которых хранятся различные евенты. А скоро енамы в похапе завезут - будет еще лучше
>Ты пишешь, как будто события это такая хорошая вещь, которая улучшает код. Но по факту это плохая вещь, к которой приходится прибегать, потому что по другому не работает. Я нигде этого не пишу, всему свое место. Бложикам и лендингам действительно эти подходы к разработке и нахер не нужны. Но никогда и никому не завредит познакомиться с этими практиками хотя бы для общего развития. Не стоит замыкаться в мирке тупых толстых контроллеров. Всем денег, посоны!
>>2024068 Я слышал, что можно гуглить ключевые слова и находить статьи и видео по интересующей тематике. Сам не пробовал, так что не могу утверждать, что это сработает
анончики, докеризирую свой ларавель апп, и встрял на моменте подключения ноды и npm в проект. делаю по гайдику с digital ocean. но там было только подключение пыхи нгингс и бд. нужна еще нода. сам yml файл https://ideone.com/sAh4tM все оки работает и пашет кроме контейнера с нодой - когда смотрю через docker-compose ps у него нет портов и статус постоянно restarting. как фиксить ? нода и нпм нужна для того чтобы ставить какие то зависимости и пересобирать app.js. никакого фреймворка фронтендовского на проекте нет, все на блейдах. в гугле тоже нихуя нет =/
А ты ноду запускаешь только иногда чтобы что-то установить или пересобрать, или же хочешь, чтобы она была постоянно запущена и мониторила файлы?
В первом случае ты вообще не должен добавлять ноду в docker-compose. Зачем ей быть постоянно запущенной, если ты будешь ее запускать вручную.
Во втором случае тебе надо запускать не образ, а конкретную команду. Это та же команда, которую ты до докера запускал в консоли вручную. Она указывается в docker-compose с помощью command: https://docs.docker.com/compose/compose-file/compose-file-v3/#command . Или, может быть, с помощью entrypoint, не знаю.
Посмотрите, сколько он лишнего мусора добавляет в образ! Там и gcc, и python, и curl, и tar! А если у тебя несколько разных образов, то скорее всего в каждом будут эти лишние зависимости.
А как уродливо смотрятся длинные цепочки команд, написанные через &&! Почему нельзя писать просто команды без &&? А, потому что тогда Докер насоздает тысячу промежуточных образов.
А еще у Докера какие-то свои костыли для организации сети между контейнерами, там по моему у них свой демон написан для этого. Разве не уродливо?
Под виндой Докер запускает виртуальную машину вместо того, чтобы ставить windows-версии php, nodejs и так далее. Разве это не уродливо, тащить целую машину с линуксом, с ядром, с демонами, туда, где это не нужно? Еще наверно и тормозит неслабо.
И все это из-за того, что под линуксом пути хардкодятся в программу при сборке и нет портабельных программ. Или нет системы вроде nix, которая позволяет ставить рядом разные версии программ.
Вот что мне не нравится в Докере. Что вместо решения исходной проблемы (как дать возможность разработчику легко развернуть проект) они добавляют слои поверх существующих решений. Усложняя все.
Например, в Линуксе есть такие проблемы, мешающие разработчикам:
- часто нельзя ставить несколько версий программы, например нельзя поставить пакетным менеджером ноду 10 и ноду 11 одновременно
- нельзя поставить программу или библиотеку не глобально, а в папку с проектом (как это умеет делать Композер)
- разные дистрибутивы линукса используют разные пакетные менеджеры. В одном есть нода версии 10, в другом нету. В одном библиотека назввается libx, а в другом liby, причем liby. В одном есть библиотека libz, в другом ее нет, в третьем она есть, но пропатчена и не работает.
- нет какого-то единого формата файла, чтобы дать файл разработчику, он запустил команду и ему поставились все нужные зависимости
Как видно, Линукс плохо ориентирован на разработку в принципе. Это вполне реальные проблемы.
И что делает Докер? Он исправляет пакетные менеджеры? Улучшает линукс? Нет, он берет и создает контейнер с виртуальным Линуксом и внутри ставит нужное приложение и все его зависимости. Причем не просто ставит, а компилирует и собирает. Причем собирает не какой-то единой для всех приложений командой, а каждый раз по-разному, качает какие-то архивы tar.gz откуда-то, а не из универсального репозитория. Костыли на костылях (то есть сборка программ в линукс это костыли и тут мы еще костыль в виде контейнера добавляем).
Или другая проблема. Нельзя как-то универсально описать список зависимостей, чтобы это работало под любым дистрибутивом Линукса, Windows и мака. И что делает Докер? Может быть, он исправляет Windows и MacOS? Нет, он просто запускает тяжелую виртуальную машину с линуксом внутри. Разве это не уродливо?
Ну это же бред. Так мы дойдем до того, что каждую программу будем запускать в своей виртуальной машине с ядром, кучей демонов и эмуляцией аппаратного обеспечения.
А как должно быть? Пишешь в файлике нужные зависимости. Запускаешь команду в любой ОС и они устанавливаются из универсального репозитория.
Вы конечно можете сказать, что Докер вообще-то не для разработчиков написан, и не для того, чтобы улучшать линукс, а он для того, чтобы подсадить богатые компании на использование контейнеров и кластеров, чтобы они платили заоблачные тарифы в "облаках" и покупали дорогие сервисы от Докера. Тут конечно возразить трудно, но от этого он менее уродливым не становится.
Это обычно достигается за счет сторонних репозиториев, где на каждую версию создается свой пакет. Соответственно, это работает для PHP, но не будет работать, например, для библиотеки вроде openssl и других программ.
Нормально ли иметь слушатель событий для исключения, чтобы в нем преобразовать это исключение в другое (для которого уже есть другой слушатель событий)?
>>2024926 >только иногда чтобы что-то установить или пересобрать this так как мне в итоге только свой докер файл модить чтоли и туда уже тянуть ноду с нпмом ? пытался так, но из за того что делаю с образа php7.4-fpm там нету тупа образа ноды запускаю из под макоси биг сюр если чо
Аноны, чет я запутался с авторизацией в ларавел 7. Дефолтный вариант по доке - это установить пакет laravel/ui и развернуть его php artisan ui vue --auth. И лара создасть набор роутов и twig-шаблонов. Проблема - я хочу запилить на Vue spa. Простенькое spa я могу сделать, api бекенд на ларе - тоже могу. Не понимаю как должна быть сделана авторизация в данном случае , как вообще spa - авторизируется? Подскажите где почитать ? Лара предоставляет аж три пакета: Socialite, Passport, Sanctum - на какой стул мне сесть? И какая между ними разница? Все они используют JWT?
Почему все говорят, что язык умирает? я только начал вкатываться и все, все, блять, поголовно говорят, что пхп учить как первый яп это пиздец хуево блять. Потом все говорят, что выучив пыху, я буду работать только на поддержке старых проектов. Лол, их щас хуева гора. Лет 10 ещё на пыхе точно будет хуева гора работы. Тот же битрикс будет в топе ещё дохуя лет (минимум пять, как по мне). А вордпресс? Там вообще ебанись какое коммьюнити. На битриксе и вордпрессе онли со стороны бэка вполне изично можно получать 120к+. Для меня это большие деньги. А потом можно подучить Laravel и спокойно пиздовать бэкендером в 200к+. При необходимости потом, если нужно будет, можно будет перекатиться в НОВОМОДНЫЙ околоГОУЛЕНГ язык и получать там дохуя бабок. Можете меня обоссать, но я прав. Пыха будет минимум до 2030 года в топах, а за это время можно дохуища бабла на пыхе заработать.
>>2027231 Нужно окунуться в историю откуда пошла фраза "PHP это мертвый язык". Ты видимо её плохо знаешь, так же как и те кто эту фразу наверняка говорит. Дело в том, что PHP создавался от безысходности, потому как в те времена не было языка для бэкенда и все пользовались CGI, соответственно код писался на C, а ты понимаешь, что такое писать код на C для сайта, трудное занятие. Именно из-за этого и создался PHP, другой альтернативы никто даже не предлагал, даже Ruby или Pearl который так критикует PHP. Создатель PHP создал этот язык как временную панацею от этой проблемы, все говорили, что этот язык не нужен, но в то же время множество компаний спрашивало как им пользоваться, парадокс, правда? Поэтому была создана документация и в неё добавлялся весь нужный функционал, математические функций например, или строковые. Создатель PHP говорил с выходом новой версий, что когда появится альтернатива, PHP умрёт и даже он им не будет пользоваться. Давал срок в полгода. Но её так и не появилось и таким образом, каждые полгода выходила новая версия. И это продолжается по сей день.
>>2027231 >Почему все говорят, что язык умирает? Умирает после каждого запроса
>выучив пыху, я буду работать только на поддержке старых проектов А вот это скорее всего правда. На пыхе очень много легаси, сам на легаси сижу, хотя и в активной стадии разработки
>потом можно подучить Laravel Лучше начинать с лары или симфони. Оставь битрикс и вордпресс голодным васаянам, которым норм в говне цмс ковыряться
>можно будет перекатиться в НОВОМОДНЫЙ околоГОУЛЕНГ язык А вот с этим будут проблемы, т.к. там нужны немного другие фундаментальные языка. Пыхакультура не способствует их освоению
>Пыха будет минимум до 2030 года в топах Не факт, что в топах, но на наш век работы хватит, а может и нашим детям достанется
>>2027590 Может ты неправильно вкатывешься? По собеседованиям ходишь? Что знаешь? На чем валишься? Изучить синтаксис не проблема, а вот задрочить всю сопутствующую экосистему может быть сложновато
>>2027440 >>А вот с этим будут проблемы, т.к. там нужны немного другие фундаментальные языка. Пыхакультура не способствует их освоению Ща пыха культура уже другая, я до того как зндстру прочел - чувстовал себя пидорашкой.
Кстаит в похопе скора выкатят файберы, маня асинхронность. Дохоронят пхп до того что лет через пять она ноду начнет выгонять из ниши быстрых-асинхронных приложений, лол.
>>2027606 На работе нужен уровень крудоклепателя. Большинство тасок программируется иф елсами, там много ума не надо. Архитектурные таски разбирают синьоры, инфраструктурные - девопсы
А объективные плюсы: -- Прощает ошибки и не зависает -- Можно программировать в любом стиле, на любом уровне абстракции, значит легко учить постепенно -- 30-40К пока ещё хорошая зарплатка для некоторых регионов -- Огромное количество обучающих материалов и готового кода -- До сих пор 80% сайтов на РНР, куча работы
>>2028071 >-- Прощает ошибки и не зависает Прибавь докер и xdebug и будет зависать, а без них хуй отладишь >-- 30-40К пока ещё хорошая зарплатка для некоторых регионов Лет 5 назад с этого начинал, на чипсеки и бургеры хватало >-- Огромное количество обучающих материалов и готового кода Много мусора, но есть толковые
>>2028097 Писал раза два уже. Сначала с использованием mysqli, потом с использованием PDO.
Могу синглтон реализовать, правда не до конца понимаю, нахуя он нужен. Фасад могу ебануть (как я понял, он нужен для того, чтобы скрыть как работает система), остальное не помню
>>2028137 Когда я устраивался в первый раз, то показывал два свои проекта - сокращатель ссылок на симфони и парсер новостей на тогда еще живом сайлексе
>>2027877 А зачем? Чем оно отличается, например, от https://github.com/symfony/config ? Особо не вчитывался, но заметил, что нарушаешь psr 2 (12) и консистентность объявления сигнатур методов, в одних местах возвращаемые типы есть, в других - хер. Рекомендую натравить статический анализатор и охуеть.
>>2028129 Ларакасты - основы пыхи, ооп и ларавел Елисеев - практика на yii/laravel/symfony Отус - более обзорно как в вузе, есть по языку и по фреймворкам ищи на торентах
>>2028137 Форум неплохой проект для пета. Содержит многие фичи крудов. Там можно много всего нахерачить: аутентификация, разграничение прав, менеджмент файлов, поиск, сервисы рассылок, кеш и т.д. на сколько сил хватит.
>>2028363 Как избежать mixed, если, например, json_decode() его возвращает?
> пср 1, 2 мастхэв если кто-то будет пользоваться твоим кодом Пользоваться и дорабатывать - разные вещи. Для использования кода достаточно создать один инстанс, для доработки - перечитать весь существующий код.
>>2028373 >Как избежать mixed, если, например, json_decode() его возвращает? Ты же знаешь, что хочешь из json_decode получить? Или тупо проксируешь вызов? Так то можно типы проверить в методе, сделав интерфейс твоей либы чище
>Пользоваться и дорабатывать - разные вещи. Для использования кода достаточно создать один инстанс, для доработки - перечитать весь существующий код. По работе частенько смотрю в кишочки фреймворков и либ. И гораздо проще и быстрее это делать, если код написан в едином стиле от кишочков yii1 плююсь, т.к. их писали до создания пср
>>2028373 >Как избежать mixed, если, например, json_decode() его возвращает? Ну по хорошему он должен возвращать объект или массив, но какие-то сверхразумы подумали что хорошо бы еще парсить 'true' в true без топ-левел жсон объектов или массивов
>>2028383 > Ты же знаешь, что хочешь из json_decode() получить? Нет, в этом и суть. Была идея представить все значения в виде какого-нибудь ConfigValue, который знает о типе, но это тупость какая-то.
>>2028215 Я работал тестером в огромной компании, у которой сайт был на Битриксе. Зп миддла пхп разраба бали 180-220к. ООП как такового не было в принципе. Задачи были простейшие: вывести товары на экран, обработать фильтры и прочая поебистика. Где там нахуй нужен синглтон, м? Если у меня будет выбор: стать супер-профессионалом в шкодинге или быть быдло-говнокодером и получать 200к, то я выберу 2 и даже, сука, глазом не моргну
>>2028409 >быть быдло-говнокодером и получать 200к, то я выберу 2 и даже, сука, глазом не моргну И через пару лет охуеешь и пойдешь плотничеством заниматься
>>2028393 Попробуй хотя бы через интерфейс определить возращаемый тип, а то рили хуйня какая-то. Не понятно, что ждать, современными тайпчеками пыхи не обмажешься. Ладно json_decode, когда он писался у пыхи про типы не думали. Но мы то solid-ные разрабы
>>2028447 Перепиливать типы данных пыхи под классы звучит ну сверх тупостью. Знаю, что у Себастиана Бергмана есть такой пакет, с типами данных который, но чёт даже хз. Имхо, непрактично со стороны пользователя либы.
>>2028488 >Перепиливать типы данных пыхи под классы звучит ну сверх тупостью Имел в виду либо вернуть 1 тип данных, либо обернуть несколько типов за интерфейсом
В чем проблема возвращать 1 тип данных? Так и разрабу понятнее и ide нормально автокоплитит. Нет, мы вернем тебе строку, или инт, или аррей, или нахуй иди
>>2028099 > Прибавь докер и xdebug и будет зависать, а без них хуй отладишь ни разу не видел зависший xDebug; живу без докера, с другими виртуалками, все живы, на бекенде ничего никогда не висло
>>2028621 Это происходит так. Есть тормознутый легаси проект. Ставлю иде в режим дебага, расставляю точки, делаю запрос. Запрос вместо ожидаемых секунд 15 идет больше минуты. Внутри докер контейнера что-то подвисает и приходится перезапускать, чтобы поймать дебагером запрос
А почему в мануале пишут, что функция mt_rand() небезопасна? (сорри, я нуб если что). Как я понял, она генерирует сид на основе таймстампа, pid и каких-то других внутренних параметров. Разве есть рабочие методы предугадать число, или подразумевается, что она небезопасна только теоретически?
Помогите советом, а то я уже утратил любую надежду и впал в депру. Когда-то думал мол вкачусь вон в разработку через PHP быстро, вакансий же море. Вот уже прошел год, успел всякое попробовать, выяснил что единственный приемлемый вариант для меня - это Симфони. С ларавелом уяснил что он мне совсем не нравится, срань типа всяких CMS никогда даже не рассматривал. Вот только выяснилось, что джуны на Симфони никому не нужны. По крайней мере в моем городе. За этот год вообще таких вакансий не появлялось, хрен знает на что я, дурак, совсем надеялся. Переезжать по некоторым причинам сейчас никуда не могу. Руки совсем упали, дальше пилить проекты на Симфе кажется лишенным смысла, так вообще вечным ждуном можно стать. В ларавел не хочу, там сапоги защищать надо. Может по каким-то другим языкам двигаться? Вообще хочется в golang, но это в будущем. Джуны там не больше нужны чем на симфони. Куда с моими входными податься? Вроде кандидат я не самый хреновый. Молодой, вышка там, знания широкие по IT в целом, не одним пыхом деланный. Или может есть какие-то варианты таки в Симфони попасть? Может писать всем компаниям, которые ищут миддлов и сеньйоров, что я такой-то класный-прикольный, готов вылизывать эйчарше ноги и работать за еду? Поделитесь опытом, короче.
>>2028864 Ты за пых спрашиваешь или за другие языки? Если за пых, то стандартные вещи, которые должен уметь джун, ну еще линуксы. Из того, с чем еще не сталкивался: докер, нереляционные БД, всякие кролики, а так же всё что связано с деплоем. Но такое у джунов никто и не требует. >>2028938 >Так откликайся на мыдловакансии, если ты такой не самый хреновый. >Что-то мне кажется, что здесь попахивает эффектом Даннинга-Крюгера Да что ты сразу унижать меня принялся. Я просто с иронией написал что я не совсем вкатывальщик с улицы и с программированием и смежными вещами знаком много лет. А эти универские "широкие знания" мне разве что на собесе помогут, я это за особое достоинство не считаю, т.к. понимаю что никому на практике широкие знания не нужны, нужны узкие и глубокие.
>>2028840 Так откликайся на мидло ваки. Наври про опыт в резюме. Потрай собесы, собери платину из вопросов, вызубри и по новой. И не брезгуй удаленкой. За год уже мог бы вкатиться
>>2028840 >я такой-то класный-прикольный, готов вылизывать эйчарше ноги и работать за еду? В тебе задетектят неуверенного в себе вкатуна и укажут на дверь. Проси рыночную зп, чтобы сойти за своего
>>2028958 >>2028959 Да ну, я вообще не верю в такие истории кабанячие. Отсутствие реального коммерческого опыта детектится за минуту, к чему тут платиновые вопросы? >>2028962 >А толку то? Работу ведь не нашел Так и нету работы, 3 года коммерческого минимум просят, и знания соответствующие
>>2029007 >Отсутствие реального коммерческого опыта детектится за минуту Оно не детектится, если: 1. Ты писал код 2. Ты знаешь ответы на платину 3. Можешь наврать про то, чем занимался на работе и про процессы Сойдешь за мидла
> Is not cryptographically secure, unless the CryptMT variant (discussed below) is used. The reason is that observing a sufficient number of iterations (624 in the case of MT19937, since this is the size of the state vector from which future iterations are produced) allows one to predict all future iterations.
Генератор "случайных" чисел на самом деле выдает не случайные числа, а определенную последовательность, определяемую начальным значением (сидом). Если ты получил несколько чисел из этой последовательности, то в теории ты можешь определить, в каком месте последовательности ты находишься, и после этого предыдущие и будущие случайные числа. Или если ты получил сид, ты можешь предсказать все значения.
То есть, у тебя два пути: или попытаться угадать сид (перебором), или по нескольким сгенерированным числам попытаться найти, в каком месте в последовательности ты находишься.
Например, есть сайт и при логине он тебе выдает случайно сгенерированный токен. Его можно использовать, чтобы восстановить состояние генератора случайных чисел и получить предыдущие и будущие числа (и токены).
Или другой пример: если сид генерируется из времени запуска PHP, и мы предполагаем, что PHP запущен где-то в течение последних полугода, то нетрудно перебрать все значения времени за эти полгода, для каждого сгенерировать цепочку значений и сравнить с полученной от сайта.
Правда, mt_rand() использует вихрь Мерсенна, который имеет довольно большое пространство состояний, а длина последовательности там равна 2 в 19337 степени, что затрудняет восстановление чисел.
Однако, прикручен этот генератор не очень правильно. Хотя размер состояния генератора 2 в 19337 степени (очень много), размер сида в PHP всего 32 бита (4 млрд вариантов) и начальное состояние, все 19337 битов генерируются из этих 32 бит. То есть, вместо мощного генератора с огромной последовательностью мы получаем всего 4 млрд возможных последовательностей.
Таким образом, генератор становится более чем предсказуемый.
Если ты хочешь конкретный эксплойт, то боюсь, что тебе придется написать его самому. Начать с изучения того, как именно в PHP прикручен этот генератор, как генерируется сид и заполняется начальное состояние.
>>2028953 Сорян, унижать не собирался. Ты на собесы-то ходил? Во первых, не стесняйся откликаться на вакансии для мидлов. Ты даже не можешь представить, какие чудовищные долбоебы иногда иногда откликаются даже на синьерские вакансии, и они не терзаются сомнениями, а берут и приходят работы, правда, не получают. Во вторых, напизди про коммерческий опыт я так сделал когда-то, брат жив
>>2029724 Делал одно приложение, куда воткнули ребит. Парсер выдачи гугла. Скармливаешь приложению кучу запросов (список строк). Каждый запрос кладешь в очередь. Соответственно достаешь из очереди и делаешь запрос в гугл, результат кладешь в базу (или куда хз). Цель была в том, чтобы отслежить позиции определенных сайтов в выдаче гугла по запросам.
Не лучше ли тут использовать очередь на основе таблицы в БД? Тогда для каждого запроса можно отслеживать статус, кол-во неудачных попыток. А то в Rabbit закинул задачи и непонятно, на сколько процентов задача выполнена и сколько еще ждать.
>>2029745 >Тогда для каждого запроса можно отслеживать статус, кол-во неудачных попыток. А то в Rabbit закинул задачи и непонятно, на сколько процентов задача выполнена и сколько еще ждать. В ребите есть средства мониторинга
>>2028409 >на Битриксе >ООП как такового не было Там его некуда вкорячивать, если только в /local замутить композер и писать классы по psr, но работа с самим битриксом сведёт на нет все старания с ооп, поскольку большинство логики придется писать в шаблонах в файлах result_modifier, либо писать с нуля компоненты и уже можно чуть чуть в ооп
>Где там нахуй нужен синглтон, м? Там в ядре он повсеместно используется, но где в твоём коде его писать это уже по задачам. Я с этим говном полгода работал и не разу не довелось писать синглтон.
>или быть быдло-говнокодером Если тебе нравиться колупаться в говне, то почему бы и нет. Работу с ним я сравнил бы работу в автосервисе для тазов, открываешь капот девятки, а там пиздейшн, канистры, шланги, хаотично расположенная проводка, что-то замотано изолентой, хуй до чего доберешься пока полмашины не разберешь и все в слое масла и говна.
Аноны, такой вот вопрос - нихуя не разбираюсь в том сколько мне брать за работу. Я не имею большого опыта в коммерческой разработке, и а периодически из круга знакомых приходят предложения о том что бы написать небольшую приложуху. А я не знаю сколько брать денег. Как пример - один человек просит что бы я реализовал ему приложение по аналогии с примерно таким приложением: авторизация/регистрация, в систему в можно внести клиента, и в календаре (датапикер) с выбором дат можно для этого клиента выбрать пару услуг на какой либо день. Соответственно в самом календаре отмечаются дни в которые назначены услуги. В общем все довольно просто. Как пример он мне показал подобное приложение написанное для его знакомого. Оно сделано на пхп 5.3, на клиенте джейквери, на сервере никаких фреймворков, роутинга нет (естественно всего остального тоже нет), сделано относительно архаично - url - тупо отражает физические каталоги сервера. Приложение написано спецом из одной бедной перефирийной республики юга России - и стоило со слов моего знакомого который хочет аналогичное -16 тыс рублей. Это адекватная цена? Мне кажется реально низкой. Но я территориально в более богатом регионе . И я естественно так примитивно не хочу его реализовывать - вообще хочу spa на vue и на бэке slim. А то и ларавел (понимаю что избыточно) И если такое делать spa + slim или laravel - какие адекватные границы стоимости такого приложения?
>>2030201 олсо, заказчику как правило чуть более чем похуй
если он не собирается растить их этого поделия какую-то супер-систему, а рассматривает проект как небольшую утилитку, то нафиг эти SPA никому не упёрлись, цена важнее
>>2028840 Я чуть с другой стороны скажу тебе. О том что меня последнее время стало аж глушить. Мне за 30 децл, ойти-вышка в вузе прогинг был, админил, последние 3 года я обратно-вкатываюсь. Уже чето могу. И вот что скажу - меня последние время аж от самого себя корячит, а именно от инертности и неспособности активно дергаться и суетиться, потому что за годы нихуя не делания эта овощность реально вьелась глубоко в шкуру. Особенно стремно потому что у меня не мало кабанчиков в окружении есть, и я смотрю как они подскакивают с переменным успехом - но они подскакивают, и по итогу в плюс. От этой овощеватости хочется самому себе по ебалу надавать. Дико бесит. Но выученная беспомощность - это лютое говно говна. Дико сложно себя переделать. Поэтому оч советую - не скатись в эту парашу. Забей хуй но то что ты чего то не знаешь - активно скачи по интернету, проходи собесы, ищи заказы как угодно, пили как можешь. Короче я понимаю что я со свой стороны деформации говорю - но я искренне считаю что психика - важнее навыка. И что по жизни гораздо лучще быть подскакивающим кабанчиком со средними знаниями, чем овощным , но высокоуровневым спецом Навык технический он придет, а вот если ты свою психику загонишь в болото "инертного говна" - вылезти будет так тяжело что ты охуеешь. И не факт что сможешь.
>>2030210 >> обязательно объясни и покажи заказчику отличия Это я сделал. >посчитай трудозатраты в часах, и умножь на согласованный с заказчиком рейт
Вот тут не понимаю как посчитать трудозатраты И какой рейт - я вообще не шарю в ценах. то что я выше описал - стоит 16 тыс? Где инфы взять?
>>2030213 >>если он не собирается растить их этого поделия какую-то супер-систему потенциально собирается. А если нет - ради опыта я реализую на ларе и вью - за среднюю цену подобного приложения. Вопрос в средней цене.
>>2030224 >не понимаю как посчитать трудозатраты Берёшь и считаешь количество часов, которое тебе реально понадобится, умножаешь на согласованный с заказчиком рейт, к примеру, 1-2 тыс. рублей за час да, в Рашке программер дешевле шлюхи. Получается цена.
Если у заказчика денег нет -- затягиваешь ремень и отталкиваешься от его бюджета только зачем.
Аноны сап. Интересует ваш опыт в поиске галеры. Многие сейчас используют таймтрекерв? и был ли у вас позитивный лол опыт работы с такими конторами. Если кто то из деревенской галеры успешно перекатился в нормальную контору, поделитесь своими историями. И в целом про стеки интересно. Что умели чему научились. Всем добра.
>>2030244 >Многие сейчас используют таймтрекерв? Наличие таймтрекера - недоверие к тебе как к специалисту. Норм разраб будет и без таймтрекера таски закрывать, а проебщик найдет как обмануть трекер. С конторами использующими трекер не сложилось. Работаю без трекера, потраченное время постфактум списываю в жиру
>Если кто то из деревенской галеры успешно перекатился в нормальную контору Начинал с конторы в миллионнике, затем по удаленкам прыгал
>И в целом про стеки интересно Что про стеки? Symfony>Laravel>Yii CMS говно не рассматриваю
Ну например с чем работал на старой работе и на что перекатился на новой галере
>>2030250 > > деревенской > Тут непонятно, почему "деревенской"? Если взять какой нить полу-миллионник, то обычно ищут кабанчика на зп 35, который умеет и в девопс и в spa, должен иметь опыт работы со всеми фреймворками, цмс готов работать по 12 часов в сутки без выходных. Ну и пилить в одного проект, на который нужно ещё минимум человека 2-3. Без внятного тз и/или макета, с кучей мелких правок, которые ломают весь написанный код. Я конечно утрировал, но суть думаю ясна.
>>2030271 >Ну например с чем работал на старой работе и на что перекатился на новой галере Работал с Yii и Laravel попеременно
>ищут кабанчика на зп 35, который умеет и в девопс и в spa, должен иметь опыт работы со всеми фреймворками, цмс готов работать по 12 часов в сутки без выходных Ищут обычного разраба на 8 часов. Да, в мелких фирмах придется выходить за специализацию. Например бекендер будет частично заниматься фронтендом и девопсом, но на достаточно примитивном уровне. Т.е. от тебя не будут ждать сверхрезультата, лишь бы работало хоть как-то
>Ну и пилить в одного проект, на который нужно ещё минимум человека 2-3 Откуда ты знаешь, сколько человек нужно на проект? Это решать менеджменту. Если бизнес не устраивает скорость поставки фич, он будет думать, что делать: расширить команду, нанять более опытного разраба или снижать качество работы.
>Без внятного тз и/или макета Опять же проблема бизнеса. Нет тз - проси тз. Неточное тз - уточняй, задавай вопросы, требуй макет. Без тз - результат хз
>с кучей мелких правок, которые ломают весь написанный код А это уже твоя прямая компетенция писать код, который несложно менять. Естественно в рамках сроков. Если сроки занижены - код будет крайне хрупкий
>>2030293 >>Ищут обычного разраба на 8 часов. У меня есть знакомые кабанчики - они все максимально режут углы по ЗП для сотрудников, по офисам - короче экономят по максимуму. Когда речь идет о том что бы бэху новую себе взять - о экономии и слова нет.
Это я к тому что ухо востро нужно держать, а нос по ветру.
>>2030293 Ты зелень? Или куколд, который яростно дефает бизнес? Ты точно пишешь про галеры из мухосраней? Или это галеры из твоего манямирка? В регионах, чем дальше от ДСов, тем больше этот самый бизнес пиздодельный и хочет экономить на всем.
>Ищут обычного разраба на 8 часов Да, в вакансиях все радужно и с понями и печеньки лол в офисе. Я так пытался перекатиться в другую галеру, в которой и зп побольше и задачи типа поинтересней. А потом узнал что у нас работает чувак который оттуда еле свалил. Да, говорит, задачки там были повеселей, но если ты внезапно решил свалить после 8 часов работы, то на тебя все косятся, а потом тимлид начинает тебя подгонять по срокам и с улыбкой на лице говорить, что мы семья и у нас коллективная ответственность. Со некоторыми местными конторами я обсобеседовался. В одной даже оффер прислали. Но там работал знакомый пару лет назад он успешно перекатился в дс2. Который рассказал про таймтрекеры / штрафы которые как бы внезапно противозаконны В третью меня чуть ли не упрашивали пройти собеседование. Вежливо слился ибо контора слишком мутная и зп серая 20/80. >Нет тз - проси тз. Неточное тз - уточняй, задавай вопросы, требуй макет Кейс "ты чо тупой тут все понятно и без тз" / "нет времени пока что ответить займись чем нить другим" никогда не встречал? Тогда поздравляю.
>Откуда ты знаешь, сколько человек нужно на проект? Это решать менеджменту Oh boi. Риторика из разряда "нас ебут а мы крепчаем" / "бизнесу видней"?
>А это уже твоя прямая компетенция писать код, который несложно менять По твоему код это абстрактная хуета, которую достаточно просто написать по всем паттернам и все? Вот тебе пример: пишешь ты йоба круд по макету, а потом хуякс прилетает задача "Ой у нас там в макете не точности, мы вот это перенесли в другой раздел, вот это убрали а здесь поменяли. Там немного правок, сроки не сдвигаем" и в итоге нужно переделывать базу данных, логику контроллеров, вьюшки, шаблоны.
>>2030391 Хз, где ты такие галеры нашел. Работал в региональной конторе, уходил отработав 8 часов, никто косо не смотрел. На удаленке с этим еще проще.
>Который рассказал про таймтрекеры / штрафы Узнаешь про подобную хрень на собесе. Если херка напиздела "у нас нет трекеров и штрафов", а при выходе на работу тебя просят ставить трекер, увольняешься сразу же. (или откат договора, как получится)
>Кейс "ты чо тупой тут все понятно и без тз" Очевидные неадекваты, с которыми не стоит работать
>Oh boi. Риторика из разряда "нас ебут а мы крепчаем" / "бизнесу видней"? Тебе то какая разница, сколько работает над проектом людей? Главное - таски закрывать
>По твоему код это абстрактная хуета, которую достаточно просто написать по всем паттернам и все? Вот тебе пример: пишешь ты йоба круд по макету, а потом хуякс прилетает задача "Ой у нас там в макете не точности, мы вот это перенесли в другой раздел, вот это убрали а здесь поменяли. Там немного правок, сроки не сдвигаем" и в итоге нужно переделывать базу данных, логику контроллеров, вьюшки, шаблоны. Оформляешь отдельной таской с отдельным эстимейтом. У исходной таски был свой эстимейт, который завязан на требования, описанные в ней. Меняются требования - меняется эстимейт
>>2030426 В той или иной форме - все кабанчики такие. Исключения - полусемейные небольшие фирмочки, где народ уже лет 7-8 вместе работает. И где твой "начальник" твой друган с детства, и ты его за кофе можешь нахуй послать. Кабанчик на которого ты работаешь - отлично понимает что тебя эксплуатирует, и что ты время своей жизни размениваешь на его доход. Степень кривизны этого мышления меняется от личных качеств кабанчика, но присутствует у каждого. Нельзя быть бойцом - не будучи агресивным, упорным и жестоким. Нельзя быть кабанчиком - и быть человечным к своим сотрудникам. Так или иначе сотрудник - ресурс. Я видел совершеннейших мразей, которые эксплуатировали своих сотрудников по максимуму, засирая мозги хуитой про "семью", подавляя психологически и взращивая комплекс неполноценности как специалиста - и платил минималку. При этом личный его доход вылился в двухуровневый пентхаус, и тачку за 6 лямов. Это не ДС, и не ДС2. Региональная столица.
Так что лучше личную кабанчиковость развивать постоянно.
>>2030931 А кроме шуток, епта? Мне в свое время понравилась валидация через реквесты (теперь и в симфони так делаю) и миддлвари (в симфе по ходу только через евент листенеры можно сделать).
>>2030939 А я без шуток говорю. Зависит от уровня проекта. На самом дне вротпресс и прочие CMSки лучше всего, на не самом дне ларавел. На среднего уровня проектах Симфони, если еще выше - лучше не пхп.
Бля, заебался тупить. Пил спа на вью + лара. Для аутентификации поставил пакет санктум - вроде все это работает. Но я чето торможу в понимании как. по паре туториалов сделал регистрацию + логин. Лара - у меня седьмая, пакет laravel/ui поставил, развернул php artisan ui vue --auth
Получил кучу дефолтных роутов аутентификации, по гайдам эти роуты разворачиваются в файле роутов web.php.
Может мне эти роуты аутентификаци развернуть в файле api.php?
И соответственно от spa клиента при логине обрабатывается маршрут login ( register , logout ) из блока web.php - это правильно?
И согласно туториалам все осталдьные запросы от spa уже идут на роуты из блока api - так и должно быть?
Опять же по доке мидлвэйр auth:sanctum - устанавливается в блоке api. Почему не в web блоке роутов?
Короче чет я нихуя не пойму. Хотя вроде кое как все рабоатет.
И еще вопрос по клиенту - в спа я получаю объект пользователя в момент логина, но если я перегружу страницу - то JS перегружается и все объекты становятся пусты, как фиксисть? Если юзер авторизован то в каком нибудь событии отправлять запрас на его получение? Или в браузере должна быть какая то база которая между f5 перезагрузки страницы сохранит данные.
Я недавно погрузился в ларавел и vue+vue router_vuex - и все это в свовокупности не слабо ебет меня в мозг.
>>2031407 >И еще вопрос по клиенту - в спа я получаю объект пользователя в момент логина, но если я перегружу страницу - то JS перегружается и все объекты становятся пусты, как фиксисть?
Обычно делают какой-то рут, который возвращает объект текущего пользователя по токену/куке. То есть при перезагрузке страницы ты пытаешься первым делом получить текущего юзера.
>>2031407 Еще у тебя может быть такая логика, что например если текущий юзер = null, то происходит редирект на страницу логина. При перезагрузке страницы у тебя текущий юзер в любом случае какое-то время будет null, тут можно даже что-то такое попробовать сделать: authService.tryLoginCurrentUser().then(() => { new Vue({ // }) })
Смотри только чтобы из условного tryLoginCurrentUser никакие ошибки не вылетали. Если у тебя не получилось зафетчить текущего юзера, то тут уже наверняка что-то с токеном, можно например смело инитить приложение и редиректить на страницу логина
> intval($number) Для округления правильнее использовать что-нибудь из набора floor, ceil, round.
> if ($number > 99) { > $number %= 100; > } Короче и понятнее будет тут написать return $number % 100
Функцию getlastDigit надо вызывать из функции inclineWord. inclineWord принимает не любое число, а только обработанное функцией getLastDigit. Но откуда я это узнаю? Я просто передам число в функцию, и она вернет неправильную форму слова. Чтобы этого избежать, надо встроить вызов getLastDigit внутрь inclineWord. А может быть, вообще объединить эти функции.
Также, код генерирует лишние пробелы. Чтобы этого избежать, можно сделать массив слов и добавлять в него отдельные слова и части фраз, а в конце склеить его через implode().
- зачем конфиги сделаны иммутабельными? Если мы создаем конфиг и добавляем ключи по одному, это приведет к созданию множества промежуточных объектов. В чем тут выгода от иммутабельности?
- зачем в ImporterInterface целых три функции, почему нельзя использовать одну функцию import(string $filename)? По моему, так и проще и логичнее. К тому же исключается ситуация, когда мы имя файла не задали и пытаемся что-то импортировать. И сразу видно, что надо передать имя файла.
- для какой цели сделан интерфейс ConfigException?
- почему форматирование не по PSR? Зачем проявлять свою оригинальность и писать код не как все? Мне удобнее читать код, написанный в одинаковом стиле, а не подстраиваться под личные особенности каждого писателя.
> foreach ($this->importerMap as $f => $importer) { > if ($f == $format) { Цикл тут бессмысленный (так как не может быть двух одинаковых ключей) и заменяется на array_key_exists.
> return clone $importer; Почему каждый раз создается новый импортер?
- мне кажется, жирновато на каждую опцию создавать по классу. Если мы так будем делать в больших реальных приложениях, там будет слишком много классов. Не лучше ли убрать весь FeatureManager? Также, судя по интерфейсу FeatureInterface, все объекты-фичи одинаковые (это просто переменная bool, обернутая в класс, никакой другой реализации там быть не может). Какой смысл создавать множество одинаковых классов?
- непонятно, зачем в ConfigInterface методы get/setImporter/Exporter. Чище было бы сделать отдельно объект конфига (отвечающий только за хранение данных), отдельно объект для импорта/экспорта конфига. А так получается, мы должны создать конфиг, передать внутрь него экспортер. и только после этого можем сохранять. Нелогично. Если убрать отсюда шаг "передать внутрь экспортер", то по моему будет и проще и логичнее.
И тогда можно будет избавиться от такого сомнительного кода:
> if (!empty($this->importer->getFilename())) { > $this->config = $this->importer->import(); > }
Более того, у тебя вообще нельзя создать объект конфига без привязки к импорту/экспорту. А было бы красивее, если бы можно было просто создать объект конфига и куда-то передать. На мой взгляд, тут нарушение разделения ответственности (хранение и импорт/экспорт).
На первый взгляд выглядит переусложненно. Но может, для этого есть причина.
"Слушатели" исключений предназначены для единственной цели - показать страницу ошибки и записать исключение в лог. Не надо туда пихать лишний функционал. Если ты хочешь при ошибке HTTP-запроса повторить его, тебе нужен не слушатель исключений и события, а обычный try/catch. Не надо усложнять вещи.
>>1998470 (OP) Есть get-запрос на некий пхп-эндпоинт, мне надо с фронта закинуть туда некоторые данные из localStorage чтобы пхп-бэк их обработал. Как это сделать? Только через query-параметры?
>>2031658 Вот про показ страницы ошибки (точнее про возвращение текста с ошибками в виде json) и идет речь. Второй слушатель нужен для перехвата исключений, которые бросает фреймворк, и для преобразовывания их в JsonException Нормальный ли это подход?
>>2033896 Зачем аплаишься на гроши? Никто в айти не получает такие копейки. Даже приходящая в офис уборщица будет смеяться. Насчет задачи - задача адекватна для мидла за 100к, но никак не для стажера за 15к
>>2034386 Не ебу что отвечать когда спрашивают про ДОСТИЖЕНИЯ или просто интересные проекты. У меня интересных проектов 0, обычные магазы, новостные сайты и парсеры
>>2034418 Любую задачу можно приукрасить и подвести к достижениям. Например парсер, мб ты там удачно применил какой-то инструмент (очереди, кеш, что-то еще), увеличив производительность в десятки раз. Или в новостном сайте прикрутил хитрий алгоритм рекомендаций. Общий рецепт - ищем в другом проекте классную фичу, думаем, как бы реализовали, на собесе говорим, что реализовали и как.
>>2034623 Я залип на скрин пару минут потому что мне показалось что if ((false === $ex) instanceof JsonException), ну ты понял
>if (false === $person->isGay()) { ... } Тут хуй знает что хуже, использовать такую йобда нотацию, или не использовать простое отрицание. Вроде уже давно все присваивания в ифах подсвечиваются, не пойму к чему это всё
Чето на убунте настройка опача ебет меня в голову. Не могу новыйх виртуальный хост добавить. Создаю новый файл, прописываю в него необходимый минимум. Добавляю в конфигурацию апача sudo a2ensite my-example
Он пишет что конфигурация изменена, рестартните. Я перезапускаю и получаю хуй. Полдня дрочусь, заебло.
решил отключить ранее настроенный виртуальный хост, хз когда то сделал и получилось. Отключил командой sudo a2dissite old-site.conf И что вы думаете? Браузер при обращени к этому старому сайту перестал его показывать, но блядь теперь он мне просто структуру корневого каталога этого сайта показывает. Вот мразь
Это какой-то платиновый вопрос. В каждом треде приходит кто-то, спрашивает "а как у вас с асинхронностью" и жалуется, что лучше использовать ноду. Ну так сразу бы и использовал, чего споры разводить.
Обычно идеи появляются сами. Например, понадобилось тебе валидировать ИНН, ты погуглил, не нашел ни одной нормальной бибилиотеки и решил написать свою и выложить. Или понадобилась точная работа с дробями, поискал класс Rational, не нашел, сделал свой. Или понадобилось искать в ФИАС введенный в произвольной форме адрес, не нашел, сделал что-то свое.
Во-первых, любые исключения нельзя преобразовывать в JSON ответ. Представь, что у тебя ошибка в SQL запросе, из-за этого происходит исключение и ты раскрываешь всем желающим информацию о твоей базе данных. Или ошибка в соединении с базой данных и в ответе отдаются параметры соединения.
Во-вторых, такой способ отлова исключений не очевиден при анализе кода. Когда ты смотришь на место, где выбрасывается исключение, не очевидно, что оно будет преобразовано в JSON-ответ.
Понятнее всего, как мне кажется, будет явная обработка ошибок по типу:
если (сущность не найдена) { отдать ответ с ошибкой 404; }
Чуть похуже, но приемлемо будет явно выкидывать JSONException, по его названию понятно, что оно будет преобразовано в JSON ответ:
если (сущность не найдена) { выкинуть исключение JSONEXception; }
>>2035048 Да, дружок, ты уже заебал если у меня детектор не сломался, тебе ничего не нужно на твоих древних микропроектах в зассаной галере. Ни асинхронности, ни микросервисов, ни разделения бэка и фронта. Но зачем всем об этом знать?
>>2035012 Думаю файберы будут почти на 100 процентов. Всратая асинхронность из коробки закроет еще какой то определенный диапазон тасков. пихипи собственно так и развивается - разползаясь по чужим нишам потихоньку.
>>2035611 Если на фронте и без фреймворков, то да. Можно взять какой-нибудь input mask и описать правила валидации для каждого поля ввода. Там наверняка из коробки будут все типовые случаи и можно будет обойтись без регулярок, чтобы не дать ввести то, что не нужно. Но это все не отменяет необходимости делать валидацию на бэке
>>2035644 Ну можешь уделить час на теорию и пару часов на практику. А так не вижу смысла их ковырять, пока таска по ним не пришла. Достаточно знать, что есть вот такой кроссплатформенный инструмент работы со строками
А как можно защитить статические файлы - картинки, файлы с js кодом, css и т. д.? Вот допустим такая ситуация: есть админка в ее шаблоне подключается через тег script js файл, который лежит на сервере, но ведь кто-то другой, допустим, начнет брутфорсить и сможет его найти, а там по коду фронтенда админки можно лучше понять как работает сайт, что плохо для безопасности. То есть надо это как-то на уровне апача/нжикса блокировать?
>>2035799 >но ведь кто-то другой, допустим, начнет брутфорсить и сможет его найти Не сильно понял что ты имеешь ввиду под брутфорсить, но если жс подключается только для залогиненных пользователей, то никто его не увидит. Другое дело что много ума не нужно написать в урле /assets/admin.js или что-то подобное
>а там по коду фронтенда админки можно лучше понять как работает сайт, что плохо для безопасности Это заблуждение. Если у тебя не проходной двор на сервере, то ничего не произойдет.
>То есть надо это как-то на уровне апача/нжикса блокировать? Опять же, если у тебя весь сайт как какой-то вордпресс валяется в публичной папке, то да, нужно денаить папку .git, папки vendor и т.д.
Заканчиваю универ немного по другой специальности. Нашел вакансию стажера на пхп. Пишут, что обучают полностью с нуля. Из требований - только основы php, js, MySQL. Мб кто подскажет, что могут вообще спрашивать и что надо знать в таких случаях? В универе прогал немного, но в целом основы знаю какие-никакие
>>2035840 >не нужно написать в урле /assets/admin.js или что-то подобное Да, я это и подразумевал, что кто-то просто будет перебирать названия файлов по адресу /assets/
Если тебе хочется максимальной безопасности, можно весь раздел админки закрыть HTTP-авторизацией и никакие файлы оттуда не будут выдаваться. Но придется два раза логиниться.
>>2035945 > можно весь раздел админки закрыть HTTP-авторизацией и никакие файлы оттуда не будут выдаваться. Но придется два раза логиниться. поподробнее
>>2037608 Нескурно их отдельно проверять. Проверяй их вместе(грубо говоря делать запрос в базу на наличие логина с паролем) и выдавай общую ошибку вида "не верный логин или пароль"
>>2037636 а если валидность? допустим логин,имя или пароль не правильно записаны,там меньше 6 символов или есть ненужные символы? Сделать убийство скрипта и выбросить сообщение?
>>2037649 В общем случае для формы задается список правил валидации (встроенные в фреймворк, либо кастомные функции) вида [параметр => правила] или кастомный валидатор. Потом проходимся по этому списку, возникшие ошибки заносим в массив $errors и отдаем (по апи или рендерим в шаблон)
> В случае, если первым символом описания класса является '^', логика работы инвертируется: класс соответствует одиночному символу, который не содержится в наборе, определяемым классом [^@]-то есть этот символ отвергается как допустимый?
>>2037906 PHP Fatal error: Uncaught Error: Call to undefined function checking_login() in /workspace/Main.php:32 Stack trace: #0 {main} thrown in /workspace/Main.php on line 32
Это зависит от того, как символы алфавита расположены в таблице Юникода. Выражение вида [a-z] значит "все символы, которые в таблице Юникода расположены между a и z".
Юникод - это такая большая таблица, где есть куча символов разных алфавитов и каждому присвоен уникальный код. Посмотреть на нее можно тут: https://unicode-table.com/ru/
Например, для русского алфавита буквы от а до я идут подряд, а буква ё стоит отдельно. Потому, чтобы указать "любой символ русского алфавита", мы пишем [а-яё].
Или, например, для белорусского алфавита придется добавить символы i, ў к диапазону а-я.
Соответственно, если буквы какого-то алфавита идут вместе, то можно перечислить диапазон от первой буквы до последней. Если нет - то придется указать все символы или все поддиапазоны, в которых они находятся.
Сложнее ситуация с диакритическими знаками. Букву вроде ê можно записать как один символ Юникода, а можно как комбинацию буквы e и специального символа крышечки. Тут придется либо усложнять регулярку, разрешая диакритические символы, либо предварительно нормализовать текст.
Если же тебе надо указать "любая буква из любого алфавита" или "любой знак препинания" - то все намного проще. В регулярках для этого есть специальные коды, которые перечислены тут: https://www.php.net/manual/ru/regexp.reference.unicode.php
Если логин в принципе неправильный (содержит недопустимые символы), то пишем соответствующее сообщение.
Если же логин соответствует шаблону, но такого логина нет в БД, то тут есть два варианта:
- написать "неправильный логин" - написать "неправильный логин или пароль"
Во втором случае мы не позволяет атакующему подбирать логины, но доставляем неудобство пользователям, так как при опечатке им непонятно, где она - в логине или пароле.
Первый вариант чуть менее безопасен, но более удобен для пользователей. Так как они сразу видят, где ошибка - в логине или пароле.
Ну и, надеюсь, ты знаешь, что пароли в базе надо солить и хешировать, а не хранить в открытом виде.
Я выше написал, что конструкция try .. catch была бы нагляднее, так как сразу видно, что как обрабатывается. А в случае с твоими обработчиками - как догадаться, что они вообще есть и что они преобразовывают исключения? Это неочевидно.
На практике, конечно, многие не думают об очевидности кода, а просто лепят как проще.
HTTP-авторизация - это когда при попытке открыть сайт (или определенную страницу на нем) выскакивает окно от браузера с запросом логина и пароля. Оно показывается в ответ на код 401 от сервера. Почитай про этот HTTP-код и про HTTP-авторизацию.
Это обычно настраивается не в PHP коде, а на уровне веб-сервера, например, в Апаче или Нгинксе.
Отрицание ^ в квадратных скобках, RegExp
Аноним22/05/21 Суб 12:03:03№2038391820
Имею такую, казалось бы, простенькую задачу. По краям две буквы 'a', а между ними - какой угодно символ, кроме 'e'/'x'. Результат виден на пикриле. Почему код не сработал, как следует, что на самом деле произошло?
В твоей регулярке есть недостаток: она ищет последовательности из 3 букв, по краям которых стоят буквы a, а между ними - любой символ, кроме e и x. Но "любой символ" включает и пробел, потому твоя регулярка может найти последовательность вида "a a", то есть кусок между двумя соседними словами.
Возможно, надо исключить пробел из числа разрешенных символов?
Например, под Линукс установка сводится к набору команды вроде sudo apt-get install php.
Правда, под виндоуз там в основном советы по настройке PHP вместе с IIS (то есть, конфигурация для сервера под Windows, а не для домашнего компьютера).
Видимо, считается, что установка под винду настолько проста, что не требует инструкций.
Потому под Windows проще установить все вручную. Скачать нужную сборку с https://windows.php.net/download/ (желательно 64-битную версию, если система это поддерживает), распаковать в папку, добавить эту папку в PATH.Также, скачать и установить с сайта Майкрософт Visual C++ Redistributable for Visual Studio 2015-2019 (это не Visual Studio, а лишь небольшая библиотека). Ссылка на VC Redist есть на том же сайте слева.
>>2038712 > Но "любой символ" включает и пробел, потому твоя регулярка может найти последовательность вида "a a", то есть кусок между двумя соседними словами. > Возможно, надо исключить пробел из числа разрешенных символов? А ведь и вправду. Большое спасибо за помощь, впредь буду внимательнее.
Зависит от того, как он используется. Если ты, допустим, запускаешь в командной строке скрипт, то одно. Или если у тебя веб-сервер и один пользователь загружает одну страницу, то тоже одно.
Чтобы использовать несколько ядер, можно запустить несколько процессов PHP. Например, php-fpm запускает множество рабочих процессов PHP и если на сайт заходит одновременно несколько человек, то каждый запрос обрабатывается отдельным процессом на своем ядре.
Аналогично, если тебе надо в консоли задействовать несколько ядер, ты можешь написать скрипт, который разобьет входные данные на части и запустит несколько процессов PHP.
Также, ты можешь поэкспериментировать с многопоточностью и создать несколько потоков внутри одного процесса. Тогда тоже можно будет использовать несколько ядер, но могут быть сложности с обменом данными между потоками.
Эта ошибка не из-за твоих действий, а скорее всего, какая-то проблема в Ларавеле (или слишком новый PHP). Тебе надо загуглить текст ошибки:
Laravel ReflectionParameter::getClass is deprecated
Поиск показывает, что в PHP8 произошли изменения, к которым Ларавель оказался не готов (а именно: удалена функция getClass). Вот ошибка в их багтрекере: https://github.com/laravel/framework/issues/33387
Тебе надо либо откатить PHP на более старую версию 7.4 (не полезно), либо обновить Ларавель на более новую версию (полезно), в которой есть нужные исправления для работы в PHP8. Например, гугление показывает, что уже доступен Ларавель 8, а у тебя почему-то стоит 7-я версия.
Чтобы обновить Ларавель, есть такие варианты:
- либо снести установленный фреймворк и как-нибудь установить 8-ю версию - либо исправить версию фреймворка и библиотек в composer.json и сделать composer update. Это полезно для лучшего изучения композера. Сравни свой composer.json с конфигом от Ларвеля 8: https://github.com/laravel/laravel/blob/8.x/composer.json и внеси себе нужные изменения.
>>2030434 Разговоры из разряда "нет хлеба - ешьте пирожные". Нужно быть достаточно прошаренным чтобы выкупить на собесе что тебе пиздят. И нужно быть достаточно богатым, чтобы тут же на изичах уволиться и сидеть без зарплаты условные пол месяца, пока ищешь другой вариант. Да и в целом, если ты можешь себе позволить выбирать работодателя, то для тебя как минимум весь российский рынок открыт.
Я сам именно потому и съебал в свое время из региона, что даже с охуенным опытом у тебя на выбор пять контор. А там уже как фартанет, может будет норм, а может душка. Любой якорек типа ипотеки или личинуса и ты уже хуй куда денешься оттуда.
Вкатился я в ваше айти, аноны. Вкат занял ~5.5 месяцев практически с нуля. Перед поиском работы потыкал ларку около месяца и по ней же начал что-то искать. На поиск работы ушло пару недель от силы, при условии, что я сам не особо охотно откликался на вакансии и живу далеко не в дс1, дс2. В итоге за неделю получил сразу 4 оффера: два на удаленку, два в офис. К собесам никак не готовился. По факту из 4 собесов более-менее неплохой оказался один, хотя вопросы плюс-минус везде были похожие. Удачи тем, кто пытается вкатиться, если есть вопросы, спрашивайте.
Аноны, чет не могу найти = как в пхп читать напрямую из потока http запроса? В ноде я понимаю как это делать, а с пхп чет затупил. Хочу разобраться как из потока в файл например, или в другой поток писать - что бы не загружать все тело post запроса сразу в память, а по кускам.
>>2040601 С чего ? Если аноны годами не могут вкатиться - это я уже хз, как надо так стараться. У меня заняло это столько времени, с учетом того, что я прогал 6-7/7 по 8 часов стабильно. Так что этот срок я еще считаю долгим.
>>2040609 Да нет, битрикс никогда в жизни не курил и даже не рассматривал вакансии по нему. Проект на ларке, пару месяцев уже работаю, но думаю в ближайшее время искать что-то другое, ибо скиллы никак не апаются, ничего нового я не узнаю, поэтому смысла торчать в этой кампании кроме как на зп сидеть - нет. По поводу вилки, то на всех четырех давали 45-55 на руки (позиция джуна). Тут я уже не могу судить, много это или нет для мухосрани, но точно куда выше средней зп по региону.
PHP начинал с курсов от Игоря Борисова там несколько модулей. Очень годные курсы, особенно если начинать с нуля. Все очень понятно и доступно объясняет. Все вещи, которые нужны - там есть. Хоть курсы и довольно старые, но с того времени ничего кардинального в языке не поменялось. Чтобы понять и разобраться в основах - достаточно, к тому же затрагивается ООП. Некоторые моменты просто гуглил, если вдруг хотелось во что-то получше углубиться или что-то было непонятно. Есть еще годный сайт, если вдруг видео не особо заходят http://code.mu/, но я его особо не курил, ибо после курсов от Борисова, там ничего нового нет, но учебник годный.
Потом почекал учебник от ОПа, но с нуля по нему изучать такая себе идея, имхо. Ничего нового оттуда не вытянул, поэтому просто порешал задачки до главы с бонусными задачками, дальше особо смысла не увидел задрачивать их. После решил задачку про список студентов от того же ОПа, чтобы на практике подтянуть ООП непосредственно.
После списка студентов уже начал курить ларку. У Елисеева есть годный курс по ларе, но они очень долгие и не каждый осилит, но знаний там можно вытянуть достаточно + если смотреть на скорости х1,3-1,4, то вполне неплохо. Без знаний ООП и параллельного курения самой документации лары особого смысла нет смотреть. Параллельно с изучением лары начал читать Зандстру.
Да и все в принципе, git учил по первому сайту гугла, js иногда курил по learn.javascript, но жс просто для общих знаний, практики на нем особо нет. Для основ sql неплохой сайт https://sql-academy.org/ и на метаните вроде видел. Докер почитывал по оф доке.
Из вопросов на собесах ничего необычного. В основном банальные вопросы про ООП. Что такое классы, объекты, принципы ООП, как они работают и т.д. Чем интерфейс от абстрактного класса отличается, чем абстрактный от обычного - это можно тоже отнести к банальным вопросам про ООП. Про http протокол вопросы были, а-ля как он работает, какие методы есть, их отличие, коды ответов и подобная лажа. Вроде были еще вопросы про сами нюансы PHP, как происходит преобразование типов, как этого избежать, можно ли добиться строгой типизации и тому подобное. Про SOLID спрашивали, в основном просили объяснить как каждый принцип работает и для чего нужен вообще. Про SOLID понравились вопросы только на одном собесе, там прям знатно душили, но как сказал техлид, джунов обычно так не душат с солидом, но я сам попросил, чтобы знания проверить и узнать что-то новое. По SQL вопросы тоже дефолтные, что такое индексы, составные индексы, внешние ключи, отличие джойнов, про нормализацию еще были вопросы вроде. Но по SQL не так много вопросов, в основном была задачка и нужно было написать запрос. На одном собесе парочка вопросов про линь было и несколько про гит. Ну и самые дефолтные вопросы на каждом собесе: чем занимался, что делал, что за прокеты и т.д. Как-то так.
>>2040849 Забыл добавить, про паттерны были вопросы на двух собесах вроде. На одном простые вопросы, какие виды есть, какие знаешь. На другом, где душили про солид, там уже намного глубже в эту тему углубились, но опять же со слов техлида - джунов у них с этим не дрочат, но я сам попросил х2.
>>2041011 Может тебе еще скрины диалогов из слака, скрины проекта и до кучи фотку договора скинуть ? Или ты думаешь, что мне заняться больше нечем, как доказывать что-то какому-то анону ? Живи просто дальше в свое мирке, в котором тебя все хотят наебать.
>>2040473 >Вкат занял ~5.5 месяцев практически с нуля Вполне адекватный срок. Не понимаю, с чего здешние неосиляторы бугуртят. Сидели бы учили фреймворк и код писали, глядишь тоже вкатились бы
TS это с поддержкой многопоточности. NTS без (но, возможно, чуть быстрее). На винде, если ты будешь использовать Апач или что-то похожее, нужна поддержка многопоточности, потому выбираем TS.
Это инструкция на случай, если ты захочешь сам компилировать PHP из исходников. Если же ты используешь Линукс, то ставишь библиотеку командой вроде apt-get install. Если винду, то скорее всего это расширение идет в архиве вместе с PHP и достаточно разрешить его в php.ini.
>>2041170 Тоже в недоумении, с чего срок вката такой бугурт вызвал. Ибо я до этого считал, что это даже долго, с учетом того, что я по 8-10 часов практически каждый день сидел. Мб здешние вкатуны просто бояться по собесам ходить, может у них знаний уже вполне достаточно для вката, но они об этом не знают. По собесам можно и нужно ходить чтобы хотя бы проверить свои знания и получить экспириенс. Не пройдешь собес и что ? Зато будешь знать, что тебе подтянуть, имхо. По крайней мере я проходя собесы не ставил на первое место цель вкатиться.
Давай не будем винить линукс в том, что он не поддерживает не поддерживаемое железо, ок? Если ты хочешь использовать линукс с вай-фай и блютус, то перед покупкой проверь покупаемое на совместимость.
Это создаст лишние неудобства, например надо будет как-то закачивать отредактированные файлы в виртуалку, или подключать сетевой диск (что вызовет проблемы с производительностью). И обо всем этом ты умолчал, не пояснил, как это делать, и пытаешься нас ввести в заблуждение, что это просто и достаточно лишь "поставить виртуалку с линуксом" и все само заработает. Если бы ты действительно хотел помочь, ты бы об этом упомянул и дал бы ссылку, как все настроить.
В то время как в Windows все работает из коробки. Запускаешь встроенный в PHP сервер и не надо ни нгинкс, ни апач настраивать.
В PHP есть php://input, но фактически он будет читать данные из памяти (PHP сначала загружает весь запрос в память, а только после запускает твой скрипт).
Если у тебя гигабайтные запросы и хочется их читать потоком, то тебе надо не использовать встроенный в PHP сервер, а написать свой веб-сервер (например, на ReactPHP, amphp или чем-нибудь подобном) и тогда все будет работать аналогично ноде.
А я против вопросов про паттерны. Джуны выучат какой-нибудь синглтон, который на практике лучше вообще не применять, и какую-нибудь фабрику, притом объяснить, зачем она нужна, не могут. Ну и опять же, на практике скорее всего этот паттерн применять не будут. Или паттерн "стратегия" вспомнит, но не скажет, чем он лучше простого switch (еще хуже: придет и начнет в проекте свитчи на стратегии заменять).
И собеседующий тоже кроме определений этих паттернов сам ничего не знает.
Если уж обсуждать паттерны, давайте обсуждать реально применяемые паттерны и зачем реально они нужны. Как написать синглтон любой дурак может прочесть.
>>2041205 >Мб здешние вкатуны просто бояться по собесам ходить, может у них знаний уже вполне достаточно для вката, но они об этом не знают По ощущениям здешние вкатуны либо тратят недостаточно времени на вкат, либо прикладывают усилия не туда. Они учатся программировать с самых азов, когда нужно быстро херачить круды на фреймворках. А программировать можно учиться в процессе работы по мере усложнения задач
>>2041205 Не представляю каким надо быть терминатором чтобы по 8-10 часов сидеть пыхтеть, я уже через полчаса хочу расслабится и посомтреть аниме\чекнуть социалки и т.д.
>>2041239 В PHP есть php://input, но фактически он будет читать данные из памяти (PHP сначала загружает весь запрос в память, а только после запускает твой скрипт). >>В PHP есть php://input, но фактически он будет читать данные из памяти >>PHP сначала загружает весь запрос в память, а только после запускает твой скрипт Точно? Я не встроенный использую - а апач, но логика такая же? То есть по дефолту я как в ноде не могу читать объект потока по кускам, сразу pipe-ая его в другой какой нибудь поток? Про php://input и обертки читал. Но вот с файлами к примеру, или вводом/выводом в системные потоки по идее все обстоит обычно, можно открыть два дискриптора потока, и по кускам из файла например пайпить в консольный вывод, как я понимаю. И в response так же есть возможность по кусочкам заливать данные, опять же в psr7 , есть какие то stream интерфейсы.
>>А я против вопросов про паттерны. Вот двачую, ооп нужно как то прочувствовать что ли, невозмонжо "ага тут коммандный класс, тут абстрактная фабрика", это приходит как то от общего к частному , чтоли.
>>2041241 У того же Зандстры синглтоон превращается в реестр, который со совими статическими методами плавно превращается в сервис локатор.
>>2040573 LДа я больше из интереса, так то на ларе пишу, там это не особо нужно. Но даже в ларе помнится можно потоком отдавать данные.
>>2041664 Тут уже зависит от самих анонов, я думаю. От целей и умения выходить из зоны комфорта. У меня с этим особых проблем нет, да и интересно программирование как таковое. Под конец конечно немного тяжко было, в плане того, что время идет, а кушать что-то надо, поэтому еще решил попробовать походить по собесам.
>>2041667 На счет подфортило или нет - тут я не скажу, ибо было только 4 собеса, с каждого в итоге дали оффер. Как буду перекатываться в другую компанию, там будет видно.
>>2041686 >У того же Зандстры синглтоон превращается в реестр, который со совими статическими методами плавно превращается в сервис локатор. И что? Если Зандстра использует эти антипаттерны, то они внезапно перестали быть подобием глобальных переменных?
>>2041664 >Не представляю каким надо быть терминатором чтобы по 8-10 часов сидеть пыхтеть Я пыхтел по 4-6 часов, т.к. на большее не хватало. Соответственно вкатывался подольше. Ща на работе когда тасок срочных нет, можно знатно поебланить
>>2041695 >4 собеса, с каждого в итоге дали оффер Очевидный успех. Трудно только первый оффер получить, потом полегче, выбора больше, отношение не как к залетышу
Перепощу свой вопрос из БД треда. Тут поживее. Мож кто знает.
Аноны, помогите вэб-макаке кое что понять. Мне нужно помененять в базе данных даты со сдвигом по времени назад на 5 минут. Я использую такую команду: ... date = date - INTERVAL 5 minute проблема в том что значение интревала - не статичные 5 минут, со сдвигом в 5 минут. Тоесть первая запись приема с 08:00 до 08:20, вторая 08:20 до 08:40, потом третья 08:40 до 9.00 и так до 12 часов. Тоесть сдвиг в 5 минту. Мне нужно уже существующие записи перекроить на 15 минутный интервал. первый с 08:00 до 08:15, второй с 08:15 ( тут минус 5 минут относительно прошлого значнеия 08:20 ) до 08.30 , третий с 08.30 ( а тут уже минус 10 минут относительно прошлого значения в ) до 08.45, и т.д. тоесть шаг изменения времени растет , и просто у каждой даты отнять 5 минут - не вариант В принципе в рамках чистого sql можно ткое реализовать? Нужно что то типа переменной меняющейся после обновления каждой строки.
Это проще сделать скриптом на PHP (или, к примеру, на Питоне, если тебе не нравится простой и удобный PHP).
Также, ты можешь вычислить сдвиг. Для начала первой записи он будет 0 минут (было 08:00 - стало 08:00), для второй - минус 5 минут (было 08:20 - стало 08:15), для третьей - минус 10 минут (08:40 -> 08:30) и так далее. То есть 5 минут умножить на номер записи. Номер записи можно вычислить как время начала минус 08:00 поделить на 20 минут.
>>2040849 Читаю про собесы и прям грустно становится. Надо тоже начать откликаться, но понимаю, что завалюсь на первом же вопросе. Хоть и пишу всякие проектики, но не знаю вообще нихуя.
Похаписты, не заебывает ли вас эта работа? Можно ли рассматривать пых как стартовый вариант с последующим переходом на другие смежные технологии, стеки? Вообщем каков карьерный путь пхп-разраба?
>>2043804 Меня не заебывает. Пишу апи для мобильных казуалок и приложений, все достаточно просто и без всякой там верстки. Вот подумываю го выучить и съебывать.
>>2043804 >не заебывает ли вас эта работа? Заебывает легаси ковырять. Но оно везде, это легаси
>Можно ли рассматривать пых как стартовый вариант с последующим переходом на другие смежные технологии, стеки? Можно, но лучше сразу идти туда, куда хочешь, чтобы лишние года не терять.
>Вообщем каков карьерный путь пхп-разраба? Как и у любого другого бекендера. Чисто технический джун-мидл-синьор, а дальше можешь в руководство податся: лид, техдир, сто, и т.д.
>>2043851 Не совсем корректно вопрос сформулировал я. Я рассматривал фронтенд, но без опыта сложно пробиться. А вот в пых проще. Думаю с опытом пыха, поболее шансов будет. Или я не прав?
>>2043857 >Я рассматривал фронтенд, но без опыта сложно пробиться Мне кажется наоборот, спрос выше, а большинство соискателей такие же вкатыши после курсов. >>2043860 Меньше.
>>2043857 Щас на пыхе много легаси. Кабанитые разрабы ливают на модные стеки. А легаси кому-то надо поддерживать, так что активно набирают джуномидлов, пох даже если наврешь об опыте. Всё равно придется разбираться в древнем говне, пока не начнешь таски закрывать
>>2043809 Вкатился в ГОвно в дополнение к похапе весной 19-го года. Не выдержал даже двух месяцев, выкатился и больше этот гной даже близко видеть не могу и никому не советую.
>>2043916 Даже не знаю. Некоторым и го нормально заходит. Лично я продолжаю спокойно пилить всякие црмки на симфе и не думаю никуда выкатываться. Кроме пыхи и го пробовал писать бэкенды на ноде и питоне - не понравилось хотя и бешенства не испытывал, как в случае с го. На досуге пилю пет проект на спринге, но пока без цели переката В плане синтаксиса очень нравится шарп, но мне кажется, что с количеством вакансий на нем все печально
>>2043910 Ты наверное попал к бывшим пехапешникам, которые большие приложения с кучей бизнес логики на го пытались писать. го не для этого создан, суки Тоже попал в подобное, поработал немного, разосрался с лидом и ушел обратно на пых
Был сегодня на очередном собеседование в оптовой торговой конторе в промзоне, 7 км за МКАД-ом (хотя офис приличный). Такие активно автоматизируются сейчас (с довольно нормальными окладами).
Профессионалы в торговле и складском учёте, в ИТ они достаточно осторожны и, видимо, привыкли к потоку вкатывальщиков. Достаточно простые задачи преподносят как инновации и ждут серьёзного или восторженного отношения к ним.
Вряд ли договоримся, хотя кто знает. На следующем собесе буду посерьёзнее, раз народ этого ждёт. И надо больше рассказывать самому, т.к. они походу не знают, что спрашивать.
>>2045263 Этот еблан даже ссылку на гитхаб не дал. Код с виду хуевый. Подробнее не ознакомиться. Зачем-то через одну строку пропускает - нет, чтобы в иде настроить междустрочный интервал. А судя по длинне видосов, он там тугодумит. Ну и нужно тебе такое? Лучше Елисеева навернуть, он там хоть много кода пишет и по ходу поясняет все решения
>>2045432 бло я б прост спросил чем человек занимался на проекте конкретно, разрабатывал ли архитектуру, почему такую выбрал и т.д. Это гонево по справочнику пыха и да, кишков фреймворков ЧТО ТАКОЕ СЕРВИС-КОНТЕЙНЕР? вымораживает, я уже хотел просто всю эту хуйню распечатать и сидеть тупо вычитывать, но слава богу уже нашёл где вкалывать за гроши.
>>1998470 (OP) Аноны, мне нужно научиться делать простейшие веб-страницы с формами для обновления и редактирования таблиц в БД (либо мускуль, либо какой-нибудь из таймсириес движков), возможно с авторизацией. Для себя, для внутреннего пользования в небольшой конторе. Посоветуйте актуально руководство для наиболее быстрого вката в это дело. Опыта с пхп не было, но думаю, что это самый подходящий инструмент для написания такой логики.
>>2045703 Задачки в 99.9% случаев это просто задачки на знание управляющих конструкций. Их я себе представляю. Мне нужно сразу чтоб практика была Что-то типа пика, но я не знаю, норм это книженция или нет
>>2045782 Короче,ты должен знать базу-это 100% Дальше просто гуглишь каждую задачу,можешь здесь уточнять. А так начни с клепания формочки и отправки запроса к БД,получения ответа.Ну узучи SQL Потом сделать форму и систему регистрации(с валидацией) и тд
>>2046091 >Возьми какой-нибудь вордпресс 1. Это полнейший оверинжениринг для задачи "создать форму для обновления записи в бд". Надеюсь, ты не программист. 2. Требует изучения классов и методов самого WP, что, разумеется, совершенно избыточно и не нужно для моих задач. Спойлер не открывал, там ничего умного все равно не будет. И пожалуй еще раз, если с первого не дошло: пошел нахуй.
>>2045791 >Короче,ты должен знать базу-это 100% Это есть >Дальше просто гуглишь каждую задачу,можешь здесь уточнять. Вангую, что будет проблема как раз из-за отсутствия общего повествования. Хотя надрать кусков из разных мест это, конечно, классика
Прошел я учебник из ОП поста, поповторял за ютубом пару проектов и возомнив нифига-себе экспертом, начал слать резюме на всякие стажировки.
В итогу у меня один собес сегодня, 2 на следующей неделе и одно тестовое.
Начал готовиться к собесу, открыл известный многим список "250 вопросов для пхп собеса" и теперь сижу в полном ужасе. Не смог толком ни на что ответить, от паники капец как трясет.
Видимо идея слать резюме была не самой лучшей. Облажаюсь сегодня просто жестко(
>>2046187 >В итогу у меня один собес сегодня, 2 на следующей неделе и одно тестовое. Для начала неплохо. Главное вопросы с собесов и задачи записывай, потом пройдешь, если офер не дадут
>Начал готовиться к собесу, открыл известный многим список "250 вопросов для пхп собеса" и теперь сижу в полном ужасе. Не смог толком ни на что ответить, от паники капец как трясет. Да и похуй. Никогда не знаешь, что тебя спросят на собесе. Могут дать то, чего нет в этих 250 вопросах - и что ты будешь делать?
>Видимо идея слать резюме была не самой лучшей. Облажаюсь сегодня просто жестко( Ты правильно сделал. Нужно ходить на собесы, проваливаться, доучивать и снова на собесы
>>2046136 >Это полнейший оверинжениринг для задачи "создать форму для обновления записи в бд".
Поставь какой-то phpmyadmin, и пусть редактируют базу. Можешь еще разных юзеров создать, дать права на чтение и запись определенных таблиц. Я так понимаю что вам для какого-то внутреннего учёта какого-то говна. В будущем сможешь к бд прилепить какой-то свой интерфейс если захочешь
>>2046136 Wordpress примитивнейшая хуйня, сделанная так, чтобы даже такой умственно отсталый как ты, смог начать клепать говно через пару десятков минут после вката. Ты все равно лучше и проще не сделаешь.
Я тебя нахуй не посылал, но раз ты так хочешь, то пошел нахуй.
>>2046305 Что душнила? Я прошел собесов 50 валился на низких софтах Каждый раз по-разному проходит. Где-то могут по душам поговорить, где-то дрючить по теории. Никогда не угадаешь к кому попадешь на собес
>>2046300 >Wordpress примитивнейшая хуйня, сделанная так, чтобы даже такой умственно отсталый как ты, смог начать клепать говно через пару десятков минут после вката. Ты все равно лучше и проще не сделаешь. Слишком толсто. У меня несколько сайтов на WP и я прекрасно знаю, как он работает. Чтобы что-то писать с интеграцией в сам WP, надо понимать именно обвязку WP; ну это очевидно любому, кроме тебя с твоим-то двухзначным IQ. >Я тебя нахуй не посылал Держи в курсе. А лично я и в третий раз не поленюсь
>>2046292 Это все понятно, но хочется красиво и без лишнего говна, буквально в несколько полей. Так-то и навикатом каким-нибудь подключаться можно. Ну в общем я понял, почитаю какую-нибудь хуйню с пика или с >>2045782 Судя по содержанию, там раскрыто то, что мне нужно - ААА и связка с базой
>>2046127 >Причем тут /pr/ - ума не приложу. Пыхомакака должна быть и девопсом, и фронтом, и бэком, и дизайнером, и нодистом, и гофером, и охуенным кабанчиком. И это всё за зарплату, меньшую в два раза чем у любого из перечисленных.
>>2046645 Естессно совет про вп был мимо. А сразу в симфони можно вкатиться или там нужно глубокое понимание ООП™? Если что, писать что-то еще на пэхэпэ не планирую
>>2046751 >А сразу в симфони можно вкатиться или там нужно глубокое понимание ООП™? Можно. Насобираешь тонну подводных. Если выживешь - человеком станешь
аноны, хелп, пожалуйста. есть арай, раньше был через обычную базу с SELECT итд, где можно было прописать все нужные критерии до селекта. но сейчас все идет кучей и джейсоном.
суть. есть арай в котором есть id_name, email, region. и вот в email есть не уникальные записи, а мне надо вытянуть данные чтобы не было повторов. как сделать?
я пытался пропустить через 2 foreach и in_array, неуникальных становиться меньше, но все равно не 1. есть какой-то метод в пхп для этого? без js.
>>2046776 Всё это делается православным foreach-ем. Вопрос в том, что ты понимаешь под уникальностью. Какое поле должно быть уникально. Как вариант, можешь проиндексировать список по имейл. При добавлении в результирующий список проверять, занят ли такой имейл - если занят, то не добавлять строку.
>>2046800 что-то не так с моим православным форечем, на тестовых, где мало даных, все ок, но как подлючаю сервис, то не работает. но количество уменьшаеться, в некоторых мейла с 200+ до 30. хотя все 200 одинаковы.
>>2045249 Я офис выбрал. Хоть и удаленка казалась куда ближе в плане своих плюшек и т.д. Со слов других людей - джунам на удаленке намного сложнее, нежели в офисе. Тут скорее уже зависит от того, какие конкретно у тебя приоритеты, анон. В офисе на начальном этапе намного больше плюшек в плане развития. Тут и софт скиллы прокачиваешь и намного проще заебывать людей разными вопросами, узнавать что-то новое от них и прочее.
Думаю, что начиная с миддла уже можно перекатываться спокойно на удаленку, если она ближе. Тут уже дело вкуса, имхо.
Аноны, я вот задумался - все хотя вкатиться, вкатиться. Но ведь в этом никакого полета мысли, унылая работать на дядю. Что гречневый на заводе, что мы - суть одинакова. У нас ток кормушка красивее. Я вдруг понял это как то кристально. У меня есть навыки, как я могу их применить что бы хоть херня - но лично мне падала? Это не банальное "где заработать денех в интернете", это более емкое - я владею инструментом и навыками, благодаря котором я могу создавать удивительные вещи. Но сдаю это в аренду другим. Завел себе блокнот, в который мысли какие то пишу. Пока не написал нихуя толкового, но буду педалировать эту тему жестко. Кто то в моем ракурсе рассуждает?
>>2047225 >Пока не написал нихуя толкового, но буду педалировать эту тему жестко. На этом всё обычно и заканчивается. А создают что-то ушлые манагеры руками других людей
>>2047225 Ну понятное дело что прогер это такая же работа как сантехник или пожарный с медсестрой, это сейчас из-за хайпа что там "сидишь целый день за кампухтером и получаешь триста тыщ" из них начали делать какую-то отдельную социальную прослойку и элиту.
>>1998470 (OP) Встретил интересную задачу в тесте, не могу разобраться, как можно вызвать не именнованный метод класса, если бы просили создать ф-ию, то понятно, но в задании просят сделать класс.
Вот такой код приводит к ошибке "Fatal error: Uncaught Error: Function name must be a string in C:\work\SimpleClass.php:8":
class SimpleClass { function stdout($string) { print($string); } } $obj = new SimpleClass; $obj()->stdout('Hello');
>>2047689 >Блять, что можно спрашивать три часа? На собесы походи, узнаешь. Зависит от количества спецов, которые тебя собеседуют. Если собес коллективный - то быстрее все проходит, разумеется. + на хрюшу некоторое время тратится
>>2047373 >>На этом всё обычно и заканчивается. У меня не закончится, я дисциплинированный дохуя. Ща думаю в своем городе как то начать шляться по всяким бизнес тусовкам. Буду отслеживать. Потому что сидя дома на жопе - явно никаких мыслей не придет в голову никаких. Нужен какой то контекст.
>>2047746 Тут есть ограничение в том, что в константах могут быть значения разных групп. У тебя тут только ивенты. Соотв если добавить другую группу констант, то их придется фильтровать. А так прикольный способ.
>>2047697 Гугли про __invoke() и fluent interface >>2047749 Добавление других групп констант не планируется, другие события будут жить в отдельных классах
Нужно ли полностью читать и практиковаться по этому учебнику или стоит уже переходить к основам HTML/CSS/ООП/PDO и делать приложение про список студентов?
>>2048146 Учитывая что тут кто-то за 5 месяцев на ларавел уже на работу вкатился, а я за эти 5 месяцев только до этого дошел, слово мозг можно зачеркивать.
>>2048297 короче за ~5 месяцев погромирования из которых я минимум месяц занимался ничем я решил: учебник опа без бонусных задач (2 бонусные решил и все); прочитал про хттп, шаблонизацию на пыхе, решил все задачи, которые нужны для того чтобы можно было решать задачу про список студентов (непонятно как решать по замыслу автора если там требуется ООП), перешёл на подробное изучение sql (около недели потратил на выгеперечисленное); То есть большую часть времени я просрал на решение неинтересных задач, а ещё нужно начинать вкатываться в ООП, поднатаскать CSS, кучу других трудновыговариваемых вещей и писать пет проекты.
Короче я еблан тупой раз тут некоторые личности за полгода уже работу нашли (это при условии что я путягу закончил по этой специальности).
>>2048403 Я не знаю как тебе помочь, поэтому поделюсь способом приготовления доширака, может быть кому-то понадобится: 1. Распаковать "Доширак", высыпать маленькие пакетики с овощами и суповой основой в контейнер ; 2. Скипятить чайник, затем налить кипяток в контейнер до отметки; 3. Закрыть крышкой и подождать 5 минут.
>>2048328 >То есть большую часть времени я просрал на решение неинтересных задач Готов к реальной работе. Километры багов и однообразных формочек ждут тебя
>>2048357 Нет. Голый php может выступать в роли шаблонизатора. Т.е. ты в одном файле может мешать php, html, css, js но так делать в продакшене не надо, такое только для учебных целей
>>2048328 А чем ты недоволен-то? Сделай простейший CRUD для студентов, покрась кнопки -- и уже можешь идти поражать воображение провинциалов ОЙТИ-магией
>>2048425 И что же ты такого понаписал, чтобы УТОНУТЬ в инклюдах на этапе изучения?
Сначала разложи всё по папкам, потом сделай простой роутинг типа ?page=boo.php , потом двигайся в сторону MVC
>>2048457 Так вкатуны время тратят на всякую херь, которая в работе им не поможет на первых порах. Отсюда и замечания про 5 месяцев. Понятно, что это вкатуны, они не понимают, что от них ждут на галере. Вкатуны всё какие-то внутрянки пхп дрочат, ооп, мвц изобретают. А надо круды ебашить +- как старшие коллеги по цеху.
Недавно вкатившиеся, не желаете о выборе пыхи? Если бы выбирали сейчас, то выбрали бы пыху или с опытом сделали другие выводы? Я заебался от того что определиться не могу. Или пых или вронтенд. Ну фронт такая петушня, но и его требуют всем. Спасибо, сильно не хуесосте.
>>2048457 >за 5 месяцев ... я все до ООП не дошёл.
Хули там доходить-то? Ты овердохуя потратил времени на какую-то хуйню. А если думаешь, что 2-3 часа в день для вката это норм, то это нихуя не норм. И да, веди конспект. Прям как в школе. Только в электронном виде — очень сильно помогает. Не дрочи функции наизусть, для этого справочник есть. Код сниппеты полезная вещь. За 5 месяцев пиздец как реально выучить язык, PSR-* , уверенно плавать в ООП, познавать азы алгоритмов, композер с гитом использовать. Подумай дважды: либо бросай и займись чемто другим, либо заканчивай прокрастинировать.
>>2047746 >Бьют ли ногами за подобное Если ты имеешь ввиду энтерпрайз разработку, то бьют в кадык с пыра.
>Пока енамы не подвезли И "енамы" и рефлексия используются очень ограниченно и в строго отведенных для этого местах. Могу подробнее расписать если интересно.
>>2048912 Нет. Часто берут пыхача и он ещё и фронт пишет за копейки. А вот если есть отдельный фронтендер, значит что контора не скупится на персонал/зп и все своим делом заняты.
>>2048858 >За що? Есть технический аспект - слишком медленно работает, слишком запутанный код получается. Читать эту хуйню потом очень тяжело.
Есть семантический - слишком много углов срезается, слишком большие возможности там где минимум ответственности. Код пишется не от пизды, а сос мыслом. Например список констант, в твоем случае, это не список возможных событий.
>Интересно, как ты используешь енамы в языке без енамов? Я и написал в кавычках. В коде приложения вообще никаких "енамов" и не должно быть. Все это используется в обвязке, чтобы создать объекты с нормальными типами.
>Кроме псалма или возни с рефлексией ничего в голову не приходит. https://3v4l.org/lOC2h
>>2048698 Хз даже. С одной стороны особо выбора не было тогда в городе: либо 1ass, либо верстка, либо битрикс/вордпресс. Кое-как попал туда, где на фреймворках пишут. Так бы хотел, конечно, на шарпы закатиться бекенд писать
>>2048934 >https://3v4l.org/lOC2h Именно для того, чтобы избавиться от этой хуйни (ручного дублирования констант в методе или массиве, возвращающем их список) я и родил свою хуйню. Я еще и дальше пошел и сделал через __callStatic, чтобы можно было вызывать UserEvents::userCreated() лол. В итоге удалил все к ебени матери и оставил только список констант.
>Например список констант, в твоем случае, это не список возможных событий. Почему?
На работе лишь однажды пришлось использовать рефлексию, когда было нужно протестировать приватный метод. На мой вопрос, нахуя его тестировать, сказали что так у них заведено
Касательно скорости работы с рефлексией, не думаю, что падение производительности будет заметным даже на фоне рядового чтения из бд
Аноны, что за хуйня, у каждого долбаеба в вакансии "Хорошее знание и понимание математики: аналитической геометрии, алгоритмов на графах, численных методов, математического анализа." Причем даже если вакансия не связана с геом. моделирование, анализом и т.д. Если там есть с++ то там 100% будет это
>>2049045 >ручного дублирования констант в методе или массиве, возвращающем их список Это не дублирование. Ты не дублируешь определение констант, а определяешь новую со списком возможных вариантов. В твоем же коде с рефлексией множество констант со значениями перечисления это подмножество всех констант класса. А работаешь ты с какого-то хуя именно со всеми константами класса, а не с конкретным подмножеством. Но это все технические детали твоего конкретного решения.
В целом речь о том зачем тебе вообще использовать список всех возможных вариантов. Я вижу только одну причину: у тебя есть строка с названием события 'user.created' и тебе нужно создать объект UserCreatedEvent. А для этого вообще не нужен концепт перечисления. Создание будет происходить в одном единственном месте. В каком-то условном сервисе CreateUserEvent или UserEventFactory и нет никакой нужды создавать для этого какой-то специальный класс перечисления.
>__callStatic Та же история что и с рефлексией. Все это метапрограммирование снижает предсказуемость и понятность кода. У такого класса просто нет внятного интерфейса, и пока в него не залезешь хуй поймешь что у него можно вызвать, а что нельзя. Ниче, пару раз порасковыриваешь кал из магических методов или поищешь косяк вызванный рефлексией и сразу перейдешь от "нихуя как могу" к "надо попроще".
>Касательно скорости работы с рефлексией, не думаю, что падение производительности будет заметным даже на фоне рядового чтения из бд В доктрине, например, для скорости используются прокси, а не рефлексия. А тут https://github.com/myclabs/php-enum используется кэш.
>>2049099 Нахуя? Ты на РНР «программируешь», зачем тебе что-то сложнее основных математических операторов? Когда ты последний раз что-то серьёзнее псевдослучайного генератора писал?
>>2049270 А кто блядь?! 6-8 месяцев это с учетом освоения фреймворков js/php, выполнением учебных заданий.
Чисто язык, ООП, шаблоны, проектирование, git, composer как раз в 5 месяцев уложишься. Потому что погружение в лаву/симфони может занять ещё ровно столько же. Опять же, джун на то и джун, что в начале своего пути и знает что-то из основ.
>>2049496 А есть где нибудь задания практические, типа дана верстка, к ней надо круды написать? Гугл ничего не дает(( Или самому все придумывать и исполнять?
>>2049226 Например потому, что в тех местах, где я соглашусь работать, вопросы про алгоритмы на собесах встречаются почти всегда. Во вторых, похапе всего лишь один из языков, на которых я пишу. В третьих, тот, кто не умеет посчитать сложность алгоритма, не знаком с наиболее распространенными структурами данных, булевой алгеброй, хотя бы зачатками комбинаторики и теории графов итд., не программист, а макака ебаная. Если ты не занимался ничем, кроме крудобесия, то не нужно проецировать свой "опыт" на всех остальных.
>>2049581 Тут собрались формошлепы, а ты за теорию графов и булеву алгебру какая сложность ебана в рот, кого ты удивить то решил?, лол.
Вообще, вот его высер надо перекатить в следующий тред, эталонный дебил. Пишешь свою бд в рамках курса университета? Ну пиши далее, про реляционную алгебру не забудь.
>>2049581 >Клуб изучающих PHP >тот, кто не умеет >не программист, а макака ебаная Ты попал по адресу. Милости прошу к нашему шалашу.
Ну вот допустим если отбросить подъебки. Какой алгоритм ты реализовывал, чтобы пришлось считать его сложность? Какие структуры данных создавал и с какой целью? Понятно что на пхп это бред. Но помимо пхп, на любом из тебе известных языков.
>>2049310 >Чисто язык, ООП, шаблоны, проектирование, git, composer как раз в 5 месяцев уложишься Ну если в твоем супер-режиме когда ты без перерыва 8 часов хуячишь и остаешься сконцентрированным все это время, то может быть.
>>2049620 А что собственно сложного? Ты же 8 часов не думаешь над реализацией , читай как придумывание, ты занимаешься пониманием написаного и повторения изученого.
>>2049717 Ты не занимайся подменой понятий. Я писал про другое. Понятное дело, что решение задач из учебника может занять достаточно времени. Тут уж вовсе индивидуально. Помню несколько тредов назад чувак потратил на решение одной задачи около двух недель. Когда она решалась буквально за 2-3 часа.
И опять же повторю, прочитай мои комментарии выше ещё раз. Я писал не про решение задач, а про изучение основ.
А задача про студентов из ОП-поста чем не CRUD? Только она с кучей комментариев и советов. А еще у нас есть задача про TestHub, там есть админка с кучей страниц, там круда предостаточно.
Абстрактный класс - это класс, предназначенный для наследования от него других классов. например, ты прикручиваешь оплату через разные платежные системы. И можешь, используя абстрактный класс, реализовать основу, а далее уже используя конкретные классы, реализовать взаимодействие с разными платежными системами. И если завтра понадобится подключить еще одну платежную систему, то (при правильном проектировании) достаточно будет лишь дописать еще один класс, и существующий код сможет с ним работать.
Интерфейсы. Допустим, что у тебя есть разные сущности, пользователи могут их создавать, а модератор может просматривать их список и "публиковать" сущности на сайте. Ты можешь сделать общий интерфейс для модерируемых сущностей, и тогда один и тот же код позволит публиковать их, несмотря на то, что каждая сущность представлена своим классом. И опять же, если завтра понадобится добавить еще одну сущность, то достаточно будет сделать, чтобы она реализовывала интерфейс. Из интерфейса будет видно, какие методы необходимо реализовать.
Аноны, подскаите куда копать - почему то не добавляется новый виртуальныхь хост апач в убунте. Причем ранее я удачно добавил виртуальный хост на порт 5001 <VirtualHost :5001> ... </VirtualHost>
сейчас пробую добавить новый сайт на порт 8000
<VirtualHost :8000> ... </VirtualHost>
команда -
и в браузере получаю тупо "попытка соединения не удалась" В ufw пишет что порт 8000 открыт. Если пишу кооманду netstat -tulpn то среде вывод нет моего 8000 порта. Где косяк можете предположить? Сломался апач? Или я навасянил с настройками iptables. Я не помню уже, с этой виртуалкой чето делал полгода назад, бляд И еще - я попробовал отключить по умолчанию установленный вируал хост - сайт перестал работать, но апач2 в браузере начал открывать каталог этого сайта.
>>2050106 Если ты задаешь этот вопрос только на пятый месяц, то у меня для тебя плохие новости - ты скорее всего не будешь делать нихуя полезного остаток времени.
>>2050188 >по сетям почитать теорию Неактуально и бесполезно. Первое - потому что сетевики уже нахуй не нужны и их зарплаты неуклонно падают, а для других областей глубоко знать сети не нужно, максимум L2+L3. Второе - потому что теория без практики ничего не даст и он без лаб уже забудешь все, что прочитал через пару дней. А разумеется, в армии нет нормального сетевого оборудования.
>>2050188 >Подучить английский Тут соглашусь, норм совет. Только если есть стабильный интернет и возможность заниматься с нейтивами или хотя бы индусами с italki. Если никто не будет тебя проверять - эффект будет стремиться к нулю.
>>2050311 Единственное, что могу порекомендовать быть максимально подготовленным (готовься, как в последний раз), и как можно больше денег брать. На своем опыте говорю, неудачно приехал в дс, работаю курьером и теперь крайне сложно вкатиться.
>>2050322 Я уже ни в какие дсы не планирую. Работаю пыхарем на удаленке >На своем опыте говорю, неудачно приехал в дс, работаю курьером и теперь крайне сложно вкатиться Соболезную. У замкадышей не много шансов на нормальный вкат в дс. Только если он гениус, либо родители деньгами подсобят
>>2050114 Челик, чо ты такой токсичный-то ебана в рот? Ну сиди изучай на практике вывод и форматирование строк, реверсно печатай их и играйся с их регистром. Задачи навроде булевой алгеброй, массивы, циклы действительно стоят внимания ну никак не дольше пары-тройки дней. На что ты так уповаешь я откровенно говоря понять не могу.
ООП действительно сложная тема, но я и написал, что в него за 5 месяцев можно окунуться до уровня понимания основ.
Чет вы нежные какие-то, натуральные жуки-плавунцы. В обучение не можете. Хули вы там резину тяните-то? У вас либо проблема с абстрактным мышлением, а это говорит о хуевой мат подготовке, либо вы прокрастинируете попутно думая нахуй оно это мне надо и хули мне девки не дают.
>>2050168 Документацию не читай @ Комментарий оставляй
Ты xampp поди юзаешь?
Короче, в httpd.conf добавь строку
Listen номер порта
Номер порта понятное дело такой же как у виртуального хоста. Ясен хуй не забудь проверить что ты там нахуевертил в iptables. Лучше всего очищай сразу все правила в нем.
>>2050513 Да как тебя забудешь-то? Впервые таких необучаемых увидел. Я же тебе тогда писал оставь программирование это не твоё. Отучись пока не поздно на электрика или газосварщика. И деньги всегда будут и ума особо не надо.
>>2050554 Но ты то ведь бездарь, который до сих пор не смог вкатиться. Умение работать руками тебе всегда поможет честным трудом заработать на хлеб с молоком.
>>2050581 >Но ты то ведь бездарь, который до сих пор не смог вкатиться. А ты настолько счастливый вкатун, что серишь в треде на дваче на невкатившихся. Глазки болят наверное, анальник?
>>2050596 Я счастлив, а ты так и не смог стать счастливым разработчиком. Я тебе даю ценные, дельные советы, а ты подобно макаке своими фекалиями в окружающих кидаешься.
Котаны, подскажите, как можно реализовать такую хрень:
Вот есть у меня сервис на PHP. И допустим, он парсит некий сторонний сайт, берет оттуда данные. Проблема, что тот сайт быстро меня забанит, так как все юзеры моего сайта по сути будут действовать от IP моего сайта.
Как реализовать эту схему таким образом, чтобы юзеры заходили на мой сайт, но далее парсинг стороннего сайта производился бы от имени ихних IP?
если, вообще, это возможно. Мне кажется на JavaScript что ли?
>>2050936 братик ебатик, как ты не поймёшь, что ты сваркой в месяц можешь иметь больше, чем вкатывальщик в офисе. Никто не говорит ебашить на заводе/стройке. Первое время, конечно, стоило бы на заводе ума да опыту набраться, за год повысил бы квалификацию, а далее по авито/хуито раскидываешь объявы частный сварщик. В дачный сезон, с апреля по октябрь, у тебя отбоя не будет от сварки ворот до заборов. И постепенно набиваешь клиентскую базу с помощью визиток. Ах да, если освоишь электромонтаж — ты в среднем 200к/месяц будешь чистыми иметь. Это я про кручение кабанчиком имел ввиду. Нет заказов по сварке ебашишь электриком. А есть ещё сантехника. Ремонт вообще дело такое. Так что анон, оставь программирование и работай на себя. Главное побольше профессий освой. И не бужет нужды унижаться на собеседованиях, учить каждый день 2 новых фреймворка.
>>2050983 Ой да, щас бы с пидорахами иметь дела в плане предложения услуг-их оплаты, уж лучше в офисе работать за опыт, чем с пробитой головой лежать в дачной канаве, потому что отказался принять в качестве оплаты пузырь и перетерть с ним за жизнь на полянке.
>>2051055 Лол, ты ещё не имел опыта наеба в офисе. Кстати, систему предоплаты и договоры никто не отменял. Ну смотри, ананас, как хочешь. Поверь, вкат не стоит того как ты себе его представляешь.
Если вкатываться в проганье, то только ради своих проектов, которые если выстрелят - унесут тебя в топ, к недосягаемым горизонтам, недостижимым на обычной работе по найму. Считаю, что усираться учить кодить, чтобы потом пойти работать на кого-то - не самая лучшая идея. Спасибо, но у меня, уже есть обычная работа. Менять шило на мыло нет смысла. Надо пилить свои проекты!
Как там, классическая схема: сперва найди какую-то проблему, недоработку. Затем придумай как это исправить или улучшить. И наконец - заработай на этом! Справедливости ради, скажу, что еще не придумал, что конкретно буду пилить, но думаю найду в процессе, погружаясь в разные области. Это может быть новый платный плагин, скрипт, или вообще сервис.
Даже, если ничего не выгорит, то максимум чего я лишаюсь это несколько десятков баксов на домены и хостинг. И мое время. Но какая разница куда тратить время, просматривая очередную ненужную ленту какого-нибудь хвастограма, или писать свои формочки с запросиками. Главное, знать меру, не перенапрягаться, отдыхать, чтобы не перегореть. Всем успешного пути!
Успешный java middle с з/п 250к вкатился итт. Ну, привет, «погромисты». Как там успехи на галерах? Всё пишите высонагруженный бэкэнд с 10.000 запросов в секунду? Ну, успехов. А, кстати, я слышал 100к для вас серьезные деньги. Спешите видеть пикрил, случайно в инсте увидел, решил вам оставить, вдруг пригодиться.
>>2051902 Существенно. У джависта область куда шире, чем у нас. Миддл РНР будет 120 в среднем иметь, часто слышу, что это пиздешь и все получают больше, но пруфов ни у кого нет. 120 это ещё прилично. В основном 100. Джава разраб спокойно 200-250 будет иметь. Особенно те, кто в банках работает. У меня знакомый в оракл работает, пилит какие-то части их базы данных. На руки получает 250. Он как раз мидл. Как по навыкам, так и по знаниям. И рост, с его слов, у него едва ли не безграничный. Опять же с его слов нач их отдела получает 600к, сам он джава разраб со стажем 15 лет, куча сертов, успел поработать на Западе, куча связей, регулярно выступает на конференциях, может в архитектуру с 0 до 100% проект выполнить.
>>2051981 >Миддл РНР будет 120 в среднем иметь,... 120 это ещё прилично Это значит, что мне еще повезло, что по медиане получаю? А мог бы как тот кадр 6 лет опыта и 90к
>>2052058 Выходит повезло. Опять же, галера галере рознь и может где-то правда платят 150-200 РНР мидлам, но я откровенно говоря сомневаюсь. Вот фулл стэк сеньорам да, тут соглашусь. У этих з/п приличная по меркам РНР разрабов там и 250 как нехуй делать можно иметь в месяц. Чистый бэкэнд если только тимлид/архитектор будет получать прилично. В основном это жалкая 100. Увы, рыночек порешал.
>>2052211 Ну, в принципе, если тебе 20 и ты не обрамлён тяготами семейной жизни, то 100 это норм. Сычевать на окраине ДС, в клоповнике за 30к, 20к на пожарть и 50к откладывать на будущее. За год можно скопить 600к, а за 10 лет 6кк. Но потом надо будет что-то думать. Либо перекат в с#/java, либо обратно в деревню с 6кк.
>>2052247 Кому в пидорахе нужны профессионалы облачные? Ты совсе ебобо что ли? Ты ещё azure/aws подтяни, лол. Пиздуй в безопасность, а там из банков будут звать к ним за 200-300к.
>>2052253 Когда мне было 25, получал 30к и жил с мамкой это казалось неплохими деньгами. Сейчас сотыга воспринимает как обычная рабочая зп, которая должна быть у веб макаки. С голоду не дохнешь, но и не пошикуешь особо не дс
>>2052262 >Кому в пидорахе нужны профессионалы облачные? Моей прошлой конторе были нужны, ну тем более, что они сами заплатили за обучение и сертификацию (хуавеевскую). А циску я получал сам, по приколу, много лет назад.
>Ты совсе ебобо что ли? Где ты оставил аргументы? Вернись и подыми
>Ты ещё azure/aws подтяни, лол. Если мне оплатят это дело - легко. Но я не занимаюсь ни ажурой, ни aws, так что шансы невысоки.
>Пиздуй в безопасность, а там из банков будут звать к ним за 200-300к. Неинтересно, спасибо.
Всем привет. Прохожу сейчас уроки, что в шапке и в разделе Бонусные задачки(http://phpbook.ga/l1/mou-ikkai.html) последняя, что про поиск пути, вызвала у меня на редкость много трудностей. Плюс, не смотря на то, что я её решил, в результате вышел совсем уж страшный быдлокод. Может кто заценить и сказать, в чём заключаются совсем уж конченые моменты в моём коде? https://ideone.com/i6y0lf
>>2052375 Ты что-нибудь знаешь про алгоритмы, ИИ, теорию графов? Задачу ты хоть и решил, но это пиздец. Посчитай сложность алгоритма, у тебя же код медленно работает пздц.
>>2052472 Про графы и всякие алгоритмы их обхода в универе учил. Кстати, всегда очень неплохо получалось решать всякие штуки с ними. Поэтому и крайне неприятно удивился себе и тому, сколько трудностей задача вызвала.
>>2052720 >250 >а для РНР это обычная зарплатка сейчас
Ох какой жир. На hh.ru правда есть пара вакансий middle php 300-400к, но я со своим опытом в 10 лет даже не стану туда кидать резюме. А ты дерзай, будешь успешным.
Джавистом хуй найдёшь. На ней пишут какое-нибудь ультра-секурное говно в 3 конторах. В это время пыхари могут спокойно харкаться в ебало лидам и не трястись за место.
у меня тут спросили недавно: вот у тебя класс животные, от него ты унаследовал класс птицы и хочешь сделать класс пингвин, но он же не летает, как быть?
>>2052772 Ну ты же понимаешь, что приведённые тобою ссылки скорее исключение из правил? Ну, действительно есть конторы, которые платят мало. Тоже самое справедливо и для галер. Сколько раз итт постили вакансии чуть ли не сеньоров, а предлагали за это 50к. И опять же, выше речь шла за ДС, а не за провинцию.
>>2052844 Как раз выше задавали вопрос про абстрактные классы и интерфейсы. Через них это всё реализуется. Наследуешь класс, добавляешь ему поля и радуешься жизни.
Прикрепляю код многостраничного каталога. Каталог по категориям в отдельном файле, пока не начинал все в один файл запихивать. Насколько все хуево? Вкатываюсь ну как, уже работаю администратором пары сайтов в небольшой фирме по продаже всякой промышленной хуйни 3 год. http://pastie.org/p/78bwFnG64jV0zngJ9YHkEF
>>2053553 Такой код может быть достаточен для какого-то лендинга или простого многостраничника. Только вот объем кода, с которым работает средней руки макака раз в 1000 больше для справки текущий мой проект 500к строк, плюс этот код прикручен к фреймворку, плюс там ооп и мвц. Так что лучше напиши какой-нибудь CRUD из шапки на симфони/ларавел - с этим уже можно на собес идти
- логика получения данных и отображение данных перемешано в одном файле. Правильно было бы разделить получение данных (один файл) и их вывод с помощью шаблона (другой файл). Также, плохая идея выводить HTML с помощью echo. Ты можешь почитать про шаблонизацию, чтобы это исправить: https://github.com/codedokode/pasta/blob/master/php/templates.md .
- делать много запросов (на каждую категорию) в цикле неэффективно. Эффективнее выбрать массив всех категорий одним запросом.
- код написан стеной без разделения на части. Лучше было бы вынести получение данных в отдельные функции с понятными именами вроде getСategoriesList(). эти функции могли бы пригодиться и на других страницах.
Если ты хочешь научиться сделать свой код лучше, я советую посмотреть нашу задачу про студентов (в шапке треда). В ней много полезных советов, и ты бы мог их использовать для улучшения своего кода.
Ананасы, допустим есть приложение, в котором используются задачи в фоне (компонент симфони мессенджер и кролик). Куда принято складывать проебанные задачи - в другую очередь или в базу данных? Как чаще делают?
Вот хочу допустим интернет магазин сделать для гитхаба, ну или что-то другое более-менее реальное, а не сферические тестхабы в вакууме. Как в нем вообще реализовать платежную систему? Это сильно сложно?
Чтобы подключить платежную систему, надо заключать с ними договор. Без договора ты можешь только поискать какую-то платежную систему, которая предоставляет демо-доступ к тестовому API.
То есть ты обычно сам не принимаешь платежи, а используешь, например, робокассу, яндекс-кассу, stripe и другие подобные сервисы. С ними идет взаимодействие через API: они отправляют тебе HTTP-запрос в случае успешной или неуспешной оплаты.
А вообще, тестхаб по сложности приближается к реальным приложениям (реальные приложения отличаются от учебных в основном огромным объемом, принципы там те же). Так что если ты хочешь что-то близкое к реальности, то это должно быть что-то сложное с кучей возможностей. Например, в магазине какой-то сложный каталог, система скидок, много способов доставки и оплаты, аналитика по продажам итд.
>>2058488 Берешь какой-нибудь один мастеркласс (они оч длинные). Например как он клон авито делал на ларавеле. Смотришь, пытаешься повторить такой же функционал. Как осилишь такой же проект без видео сделать - считай мидол
>>2058805 На работе код писать тоже за тебя будут? Задача про студентов - пример того, что могут дать в виде тестового или в виде задач на работе. Не справляешься с этим - идешь нахер
>>2059040 Я так понял, что лучше вначале глянуть его курс по ООП, а потом лару? И норм смотреть его видосы со знаниями приблизительно из нашего шапкогайда?
Можете чекнуть, указать на ошибки? Пока дописываю потихонечку. Алсо не смертельно будет если я не решил сложные задачки, но пытаюсь решить? Застрял на калькуляторе, пока двигаюсь по учебнику.
>>2059100 >Алсо не смертельно будет если я не решил сложные задачки Значит не можешь в математический склад ума и не станешь программистом, sad but true
Аноны, а в чем сакральный смысл прятать в докер базу данных, притом что файлы в которых хранятся собственно данные - торчат в файловой системе хоста? Я понимаю что на продакшене само приложение удобно спрятать в контейнер, что бы от сревера к серверу не настраивать окружение. В разработке удобно тестировать в работе с разными окружениями, ну и удобно передавать в команде вместе с готовым окружением. А вот смысла бд в докер-контейнере чето не уловлю. Один хрен хвост наружу торчит
>>2060380 Я тут внутри пыхи на симфони спрыгнуть не могу. Никаких сил моральных нет уже. Во время работы выматываюсь так, что ни вечером, ни на выходных не могу собраться и за пет сесть
Добрые люди, помогите, пожалуйста, недалекой девушке написать диплом по базам данных. Делаю сайт в Wordpress, осталось 10 дней, а мозгов не хватает понять как вообще создать бд и взаимодействовать с ней. Если у тебя много свободного времени и совсем нечем заняться, напиши мне, я на грани опустить руки и отчислиться.
>>2059134 Математика и программирование никак не связаны друг с другом, абсолютно разные дисциплины. Ты бы еще сказал, что не можешь в физический склад ума. Идиот.
Аноны, подскажите, плес. Как лучше сделать, ajax'ом вызывать отдельные файлы(как на пик1) или все в один файл и там по функциями распихать? Мимо вкатышь в js. Хотю немного бека.
Экранирование сделано правильно, но к коду есть замечания:
- название функции scr непонятное, и сбивает с толку при чтении кода - непонятно, зачем ты парсишь только что созданную ссылку с помощью parse_str, если можно просто взять текст из переменной $output. parse_str тут лишний. - внутри тега <pre> нельзя использовать <p>. Вот что написано в спецификации HTML: https://www.w3.org/TR/html52/grouping-content.html#the-pre-element
> 4.4.4. The pre element > Content model: Phrasing content.
"Phrasing content" не включает тег <p>. Вкладывать <pre> внутрь <p> тоже нельзя. Однако, ты можешь вложить pre внутрь div.
Во-первых, не надо бояться больших шаблонов. В реальных проектах встречаются шаблоны и по 1000 строк.
Есть пара способов сделать код в шаблонах более читабельным:
- используй шаблонизатор вроде twig вместо шаблона на PHP - в нем все выглядит компактнее и читабельнее - ты можешь выносить отдельные блоки в подшаблоны (особенно удобно это делать в twig с помощью макросов).
Что касается алгоритма, то главный недостаток рекурсивного алгоритма в том, что он не очень эффективен. Допустим, из точки A можно пойти в B и С. Алгоритм сначала пойдет в B, изучит все пути из нее (например: в D, E, F), потом пойдет в C, и, если она соединена с D, E, F, то обойдет те же самые пути по второму разу.
Алгоритм Дейкстры в этом плане эффективнее и он избегает повторного обхода пути за счет того, что он запоминает расстояние от каждой точки до конечной цели. Я бы советовал почитать про него для расширения кругозора.
Что касается кода, то на его "страшность" влияет в основном выбор названий переменных, организация кода. Вот, что можно улучшить:
Функция findPaths могла бы возвращать не массив, в котором перемешаны пути и время, а массив из массивов вида ['path' => ..., 'time' => ...] и тогда преобразование этого массива в функции findBestPath не требовалось бы.
Функция findPaths() может вызвать сама себя и получить массив результатов. Она могла бы сразу отобрать один лучший путь и вернуть только его (вызвав вспомогательную функцию для отбора лучшего пути), а не возвращать весь массив возможных путей. Из-за того, что ты возвращаешь все пути, у тебя может образоваться (после многократных рекурсивных вызовов) большой список путей. Ну то есть, функция findPaths() вызывает сама себя, вызванная функция вызывает сама себя и так еще 2 раза (то есть, делается 4 шага). Если на каждом шаге возможен выбор из 5 путей, то в итоге за 4 вызова соберется 54 ~ 600 возможных путей.
Странно, что функция findPaths() может вернуть массив двух разных видов: либо с ключами path и time, либо с перемешанными наборами path и time с числовыми ключами. Должно быть единообразие возвращаемых значений. То есть лучше, если функция findPaths будет выбирать лучший путь и всегда возвращать единственный результат (либо null, если путь построить невозможно).
Я не люблю эти примеры с животными, потому что они довольно глупые и никогда не встретятся в реальном коде. Потому в моем учебнике нет и не будет примеров с наследованием животных.
В твоем случае можно сделать базовый класс Птица (наследующий Животное), от нее наследовать ЛетающаяПтица и Пингвин.
Боюсь, что именно к этой задаче нету. К задаче про студентов идет много комментариев и примечаний. Ты не мог бы написать, что именно тебе непонятно, как делать? Возможно, тогда я бы смог дописать потом дополнительные комментарии.
Лучше SalesDepartment, но вообще, я не уверен, что тут надо применять наследование. Разве у Департамента продаж есть какие-то свойства или методы, которых нет у обычного Департамента? Разве не логичнее сделать один класс Департамент и из него сделать объекты, соответствующие разным департаментам?
Как будет время, обновлю. Согласен, что некоторые примеры кода устарели. Пока учебник не обновлен, советую погуглить статьи вроде "что нового в PHP7" и "что нового в PHP8" и подчерпнуть знания оттуда.
Очень странное наследование департаментов. Например: ты объявил метод addEmployees абстрактным. То есть, это значит, что в каждом классе-наследнике будет свой алгоритм добавления работников? Я думаю, что добавление работников происходит абсолютно одинаково в любом департаменте и значит, этот метод надо реализовать в классе Department.
То же касается методов вроде totalCoffee(). Я думаю, эта цифра будет считаться по одинаковому алгоритму в любом департаменте. Или я что-то не учел?
Абстрактные методы используются тогда, когда классы-наследники будут реализовывать их по-разному. Иначе это не имеет смысла.
Далее, я не уверен, что на каждый департамент надо делать свой класс. Это имело бы смысл, если бы у разных департаментов были отличающиеся свойства или методы (например: если бы у Департамента Продаж был бы метод посчитатьСуммуПродаж, которого не было бы у других департаментов, или было бы какое-то свойство, которого нет у других). Но в этой задаче департаменты различаются только названиями, потому не имеет смысл делать под каждый департамент свой класс. Мне кажется, все департаменты однотипные и достаточно одного класса, чтобы их описать.
Далее, имена методов принято начинать с глагола. Не totalCoffee, а countTotalCoffee.
Далее, я думаю, что свойство $totalEmployees не нужно. Ты все равно считаешь число работников каждый раз заново при вызове totalEmployees(), так зачем сохранять это количество в свойстве?
Более того, эти свойства усложняют тебе работу. Получается, что когда ты добавляешь нового работника, ты должен пересчитать все эти total... свойства (чтобы они отражали актуальные значения). А если их удалить, то ничего пересчитывать не придется.
Далее, функция addEmployees написана (или названа) не очень хорошо. Она не добавляет, а заменяет работников, удаляя старых. Лучше было бы именно добавлять, не удаляя старых работников.
Далее, в Employee абстрактный конструктор. Первый раз с таким сталкиваюсь. Думаю, что не надо требовать от наследников реализовать конструктор.
В наследниках класса Employee у тебя много копипасты. Метод countSalary() выглядит одинаково. Не логичнее ли его перенести в базовый класс Employee? То же касается конструкторов.
Имена классов начинают с большой буквы (marketingExpert).
И еще, у тебя предполагается, что класс-наследник Employee должен заполнить поля вроде baseRate. Но если я хочу написать класс-наследник, как я об этом узнаю? Это требование нигде не описано. Чтобы это исправить, я советую сделать абстрактный метод getBaseRate(). Это позволит записать требование, что наследник должен определить базовую ставку.
В PHP можно указывать тип для: аргументов функции, результата функции и (в PHP >= 7.4) для свойств класса. Я советую расставить типы, это сделает код понятнее и защитит от ошибок, если ты попытаешься передать не то значение в функцию.
Наверно идея в том, что тебе не надо устанавливать на хост базу данных нужной версии с нужными плагинами, а достаточно запустить docker-compose up и все скачается и запустится само. И данные от БД не хранятся в /var/lib/mysql, а где-то в другом месте.
В докере контейнеры обычно неизменные и данные внутри контейнера не хранят, а монтируют папку с данными, которая находится на хосте.
Но по мне, так это неэффективно. Каждый проект будет выкачивать свой огромный образ с СУБД и захламлять тебе диск кучей образов. Дрянь этот докер.
Можно писать вопросы тут, может кто-нибудь и захочет помочь. Но вначале стоит самостоятельно погуглить вопрос, чтобы не спрашивать то, что можно найти на первой странице гугла.
Пока у тебя немного файлов, ты можешь делать каждый контроллер отдельным файлом. Но дальше ты заметишь, что ты делаешь в начале каждого файла одни и те же действия и эффективнее сделать единую точку входа - чтобы сервер при любом URL (вроде /ajax/users/) вызывал index.php, а этот файл анализировал бы URL и вызывал нужный обработчик.
Вообще, по мере роста проекта лучше перейти на микрофреймворк вроде Slim. В нем уже есть роутер для разбора URL.
Работаю третью неделю недо-джуном. Постоянно чувствую себя не то что тупым, а прям полным кретином. Бывает сижу и думаю "Бляяяя. Что я тут делаю? Я же нихера не знаю"
В начале недели еще норм, за выходные отхожу, а вот к четвергу вообще расплющивает. Сегодня утром еле собрался с силами. Ни есть не хотелось, ни жить, ничего.
>>2071477 Да это в любой области так. Не вешай нос. Шутки про программирование на стэковерфлоу наверняка слышал? Они ведь не на пустом месте родились.
Я тебе дам совет, заведи себе заметки, в которые закидывай сниппеты кода, терминологию ООП, принципы, концепции. Нахуй это всё держать в голове? Один хуй после недели ковыряния в условном легаси все улетучится, а так открыл заметки, полистал — бам, что-то вспомнил, бам, на что-то знакомое посмотрел по новому.